Go to the documentation of this file.
32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
40 #if (CTR_DRBG_SUPPORT == ENABLED)
72 if(context == NULL || cipherAlgo == NULL)
85 #if (DES3_SUPPORT == ENABLED)
98 #if (AES_SUPPORT == ENABLED)
103 if(keyLen != 128 && keyLen != 192 && keyLen != 256)
118 if(ctrLen < 4 || ctrLen > (cipherAlgo->
blockSize * 8))
122 if((ctrLen % 8) != 0)
127 context->
keyLen = keyLen / 8;
128 context->
ctrLen = ctrLen / 8;
170 size_t entropyInputLen,
const uint8_t *
nonce,
size_t nonceLen,
171 const uint8_t *personalizationString,
size_t personalizationStringLen)
178 if(context == NULL || entropyInput == NULL)
182 if(
nonce == NULL && nonceLen != 0)
186 if(personalizationString == NULL && personalizationStringLen != 0)
198 if(entropyInputLen < context->securityStrength)
210 if(entropyInputLen != context->
seedLen)
214 if(personalizationStringLen > context->
seedLen)
230 inputFrags[0].
buffer = entropyInput;
231 inputFrags[0].
length = entropyInputLen;
233 inputFrags[1].
length = nonceLen;
234 inputFrags[2].
buffer = personalizationString;
235 inputFrags[2].
length = personalizationStringLen;
239 seedMaterial, context->
seedLen);
247 for(i = 0; i < personalizationStringLen; i++)
249 seedMaterial[i] ^= personalizationString[i];
308 size_t entropyInputLen,
const uint8_t *additionalInput,
309 size_t additionalInputLen)
316 if(context == NULL || entropyInput == NULL)
320 if(additionalInput == NULL && additionalInputLen != 0)
336 if(entropyInputLen < context->securityStrength)
342 if(entropyInputLen != context->
seedLen)
346 if(additionalInputLen > context->
seedLen)
362 inputFrags[0].
buffer = entropyInput;
363 inputFrags[0].
length = entropyInputLen;
364 inputFrags[1].
buffer = additionalInput;
365 inputFrags[1].
length = additionalInputLen;
369 seedMaterial, context->
seedLen);
377 for(i = 0; i < additionalInputLen; i++)
379 seedMaterial[i] ^= additionalInput[i];
433 const uint8_t *additionalInput,
size_t additionalInputLen, uint8_t *output,
447 if(additionalInput == NULL && additionalInputLen != 0)
467 if(additionalInputLen > context->
seedLen)
478 if(additionalInputLen > 0)
486 inputFrags[0].
buffer = additionalInput;
487 inputFrags[0].
length = additionalInputLen;
498 osMemcpy(temp, additionalInput, additionalInputLen);
604 uint_t inputNumFrags, uint8_t *output,
size_t outputLen)
610 size_t totalInputLen;
629 if((inputNumFrags + 5) >
arraysize(sFrags))
636 for(totalInputLen = 0, i = 0; i < inputNumFrags; i++)
638 totalInputLen += inputFrags[i].
length;
663 for(i = 0; i < inputNumFrags; i++)
669 sFrags[3 + i].
buffer = &separator;
670 sFrags[3 + i].
length =
sizeof(separator);
673 paddingLen = (totalInputLen + 9) % cipherAlgo->
blockSize;
678 paddingLen = cipherAlgo->
blockSize - paddingLen;
682 sFrags[4 + i].
buffer = padding;
683 sFrags[4 + i].
length = paddingLen;
686 for(i = 0; i < context->
keyLen; i++)
695 for(j = 0; j < context->
seedLen; j +=
m)
779 for(
n = 0, i = 0; i < dataNumFrags; i++)
801 for(i = 0; i < dataNumFrags; i++)
803 for(j = 0; j < dataFrags[i].
length; j +=
n)
809 osMemcpy(
block + blockLen, (uint8_t *) dataFrags[i].buffer + j,
n);
849 size_t providedDataLen)
859 if(providedDataLen != context->
seedLen)
872 for(i = 0; i < context->
seedLen; i +=
n)
889 for(i = 0; i < context->
seedLen; i++)
891 temp[i] ^= providedData[i];
922 #if (DES3_SUPPORT == ENABLED)
962 for(temp = 1, i = 1; i <= ctrLen; i++)
965 temp += ctr[blockLen - i];
966 ctr[blockLen - i] = temp & 0xFF;
985 for(i = 0; i <
n; i++)
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 ctrDrbgBcc(CtrDrbgContext *context, const uint8_t *key, const DataFrag *dataFrags, uint_t dataNumFrags, uint8_t *output)
BCC function.
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.
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.
Data fragment descriptor.
@ 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 blockCipherDf(CtrDrbgContext *context, const DataFrag *inputFrags, uint_t inputNumFrags, uint8_t *output, size_t outputLen)
Block cipher derivation function.
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.
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)
error_t ctrDrbgInit(CtrDrbgContext *context, const CipherAlgo *cipherAlgo, size_t keyLen, uint_t ctrLen, bool_t df)
Initialize PRNG context.
uint8_t v[MAX_CIPHER_BLOCK_SIZE]
Value V.
error_t(* PrngAlgoInit)(void *context)
#define CTR_DRBG_MAX_RESEED_INTERVAL