Go to the documentation of this file.
32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
40 #if (CTR_DRBG_SUPPORT == ENABLED)
71 if(context == NULL || cipherAlgo == NULL)
84 #if (DES3_SUPPORT == ENABLED)
97 #if (AES_SUPPORT == ENABLED)
102 if(keyLen != 128 && keyLen != 192 && keyLen != 256)
118 context->
keyLen = keyLen / 8;
161 size_t entropyInputLen,
const uint8_t *
nonce,
size_t nonceLen,
162 const uint8_t *personalizationString,
size_t personalizationStringLen)
169 if(context == NULL || entropyInput == NULL)
173 if(
nonce == NULL && nonceLen != 0)
177 if(personalizationString == NULL && personalizationStringLen != 0)
189 if(entropyInputLen < context->securityStrength)
201 if(entropyInputLen != context->
seedLen)
205 if(personalizationStringLen > context->
seedLen)
221 input[0].
buffer = entropyInput;
222 input[0].
length = entropyInputLen;
224 input[1].
length = nonceLen;
225 input[2].
buffer = personalizationString;
226 input[2].
length = personalizationStringLen;
238 for(i = 0; i < personalizationStringLen; i++)
240 seedMaterial[i] ^= personalizationString[i];
299 size_t entropyInputLen,
const uint8_t *additionalInput,
300 size_t additionalInputLen)
307 if(context == NULL || entropyInput == NULL)
311 if(additionalInput == NULL && additionalInputLen != 0)
327 if(entropyInputLen < context->securityStrength)
333 if(entropyInputLen != context->
seedLen)
337 if(additionalInputLen > context->
seedLen)
353 input[0].
buffer = entropyInput;
354 input[0].
length = entropyInputLen;
355 input[1].
buffer = additionalInput;
356 input[1].
length = additionalInputLen;
368 for(i = 0; i < additionalInputLen; i++)
370 seedMaterial[i] ^= additionalInput[i];
424 const uint8_t *additionalInput,
size_t additionalInputLen, uint8_t *output,
438 if(additionalInput == NULL && additionalInputLen != 0)
458 if(additionalInputLen > context->
seedLen)
469 if(additionalInputLen > 0)
477 input[0].
buffer = additionalInput;
478 input[0].
length = additionalInputLen;
489 osMemcpy(temp, additionalInput, additionalInputLen);
595 uint_t inputLen, uint8_t *output,
size_t outputLen)
601 size_t totalInputLen;
627 for(totalInputLen = 0, i = 0; i < inputLen; i++)
629 totalInputLen += input[i].
length;
650 s[1].length =
sizeof(
l);
652 s[2].length =
sizeof(
n);
654 for(i = 0; i < inputLen; i++)
656 s[3 + i].buffer = input[i].
buffer;
657 s[3 + i].length = input[i].
length;
660 s[3 + i].buffer = &separator;
661 s[3 + i].length =
sizeof(separator);
664 paddingLen = (totalInputLen + 9) % cipherAlgo->
blockSize;
669 paddingLen = cipherAlgo->
blockSize - paddingLen;
673 s[4 + i].buffer = padding;
674 s[4 + i].length = paddingLen;
677 for(i = 0; i < context->
keyLen; i++)
686 for(j = 0; j < context->
seedLen; j +=
m)
794 for(j = 0; j <
data[i].length; j +=
n)
840 size_t providedDataLen)
850 if(providedDataLen != context->
seedLen)
863 for(i = 0; i < context->
seedLen; i +=
n)
880 for(i = 0; i < context->
seedLen; i++)
882 temp[i] ^= providedData[i];
913 #if (DES3_SUPPORT == ENABLED)
953 for(temp = 1, i = 1; i <= ctrLen; i++)
956 temp += ctr[blockLen - i];
957 ctr[blockLen - i] = temp & 0xFF;
976 for(i = 0; i <
n; i++)
error_t ctrDrbgInit(CtrDrbgContext *context, const CipherAlgo *cipherAlgo, size_t keyLen, bool_t df)
Initialize PRNG context.
bool_t osCreateMutex(OsMutex *mutex)
Create a mutex object.
const PrngAlgo ctrDrbgPrngAlgo
error_t(* PrngAlgoSeed)(void *context, const uint8_t *seed, size_t length)
error_t(* PrngAlgoReseed)(void *context, const uint8_t *seed, size_t length)
CipherAlgoEncryptBlock encryptBlock
void desComputeKeyParity(const uint8_t *input, uint8_t *output)
Convert a 56-bit key to a 64-bit key (with odd parity)
#define MAX_CIPHER_BLOCK_SIZE
error_t ctrDrbgGenerate(CtrDrbgContext *context, uint8_t *output, size_t length)
Generate pseudorandom data.
@ ERROR_INVALID_PARAMETER
Invalid parameter.
#define osMemcpy(dest, src, length)
#define CTR_DRBG_MAX_KEY_LEN
size_t securityStrength
Security strength.
CipherContext cipherContext
Cipher context.
size_t ctrLen
Counter length.
error_t ctrDrbgBcc(CtrDrbgContext *context, const uint8_t *key, const DataChunk *data, uint_t dataLen, uint8_t *output)
BCC function.
void ctrDrbgXorBlock(uint8_t *x, const uint8_t *a, const uint8_t *b, size_t n)
XOR operation.
uint64_t reseedCounter
Reseed counter.
OsMutex mutex
Mutex preventing simultaneous access to the PRNG state.
const CipherAlgo * cipherAlgo
Cipher function.
@ ERROR_INVALID_KEY_LENGTH
General definitions for cryptographic algorithms.
void ctrDrbgIncBlock(uint8_t *ctr, size_t blockLen, size_t ctrLen)
Increment counter block.
error_t ctrDrbgLoadKey(CtrDrbgContext *context, const uint8_t *key)
Load encryption key.
bool_t df
Use key derivation function.
error_t ctrDrbgUpdate(CtrDrbgContext *context, const uint8_t *providedData, size_t providedDataLen)
Update internal state.
error_t blockCipherDf(CtrDrbgContext *context, const DataChunk *input, uint_t inputLen, uint8_t *output, size_t outputLen)
Block cipher derivation function.
void(* PrngAlgoDeinit)(void *context)
void osDeleteMutex(OsMutex *mutex)
Delete a mutex object.
uint8_t k[CTR_DRBG_MAX_KEY_LEN]
Key.
@ ERROR_UNSUPPORTED_CIPHER_ALGO
void ctrDrbgDeinit(CtrDrbgContext *context)
Release PRNG context.
error_t ctrDrbgGenerateEx(CtrDrbgContext *context, const uint8_t *additionalInput, size_t additionalInputLen, uint8_t *output, size_t outputLen)
Generate pseudorandom data (with additional input)
void osAcquireMutex(OsMutex *mutex)
Acquire ownership of the specified mutex object.
void osReleaseMutex(OsMutex *mutex)
Release ownership of the specified mutex object.
error_t(* PrngAlgoGenerate)(void *context, uint8_t *output, size_t length)
Common interface for encryption algorithms.
error_t ctrDrbgReseed(CtrDrbgContext *context, const uint8_t *seed, size_t length)
Reseed the PRNG state.
#define CTR_DRBG_MAX_SEED_LEN
CTR_DRBG pseudorandom number generator.
error_t ctrDrbgSeedEx(CtrDrbgContext *context, const uint8_t *entropyInput, size_t entropyInputLen, const uint8_t *nonce, size_t nonceLen, const uint8_t *personalizationString, size_t personalizationStringLen)
Seed the PRNG state (with nonce and personalization string)
size_t seedLen
Seed length.
error_t ctrDrbgReseedEx(CtrDrbgContext *context, const uint8_t *entropyInput, size_t entropyInputLen, const uint8_t *additionalInput, size_t additionalInputLen)
Reseed the PRNG state (with additional input)
error_t ctrDrbgSeed(CtrDrbgContext *context, const uint8_t *seed, size_t length)
Seed the PRNG state.
#define osMemset(p, value, length)
uint8_t v[MAX_CIPHER_BLOCK_SIZE]
Value V.
error_t(* PrngAlgoInit)(void *context)
#define CTR_DRBG_MAX_RESEED_INTERVAL