|
|
@@ -19,7 +19,7 @@ typedef struct { |
|
|
|
} AES256_CTR_DRBG_struct; |
|
|
|
|
|
|
|
static AES256_CTR_DRBG_struct DRBG_ctx; |
|
|
|
static void AES256_CTR_DRBG_Update(uint8_t *provided_data, uint8_t *Key, uint8_t *V); |
|
|
|
static void AES256_CTR_DRBG_Update(const uint8_t *provided_data, uint8_t *Key, uint8_t *V); |
|
|
|
|
|
|
|
// Use whatever AES implementation you have. This uses AES from openSSL library |
|
|
|
// key - 256-bit AES key |
|
|
@@ -31,23 +31,24 @@ static void AES256_ECB(uint8_t *key, uint8_t *ctr, uint8_t *buffer) { |
|
|
|
aes256_ecb(buffer, ctr, 1, &ctx); |
|
|
|
} |
|
|
|
|
|
|
|
void nist_kat_init(uint8_t *entropy_input, uint8_t *personalization_string, int security_strength); |
|
|
|
void nist_kat_init(uint8_t *entropy_input, uint8_t *personalization_string, int security_strength) { |
|
|
|
void nist_kat_init(uint8_t *entropy_input, const uint8_t *personalization_string, int security_strength); |
|
|
|
void nist_kat_init(uint8_t *entropy_input, const uint8_t *personalization_string, int security_strength) { |
|
|
|
uint8_t seed_material[48]; |
|
|
|
|
|
|
|
assert(security_strength == 256); |
|
|
|
memcpy(seed_material, entropy_input, 48); |
|
|
|
if (personalization_string) |
|
|
|
if (personalization_string) { |
|
|
|
for (int i = 0; i < 48; i++) { |
|
|
|
seed_material[i] ^= personalization_string[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
memset(DRBG_ctx.Key, 0x00, 32); |
|
|
|
memset(DRBG_ctx.V, 0x00, 16); |
|
|
|
AES256_CTR_DRBG_Update(seed_material, DRBG_ctx.Key, DRBG_ctx.V); |
|
|
|
DRBG_ctx.reseed_counter = 1; |
|
|
|
} |
|
|
|
|
|
|
|
int randombytes(uint8_t *x, size_t xlen) { |
|
|
|
int randombytes(uint8_t *buf, size_t xlen) { |
|
|
|
uint8_t block[16]; |
|
|
|
int i = 0; |
|
|
|
|
|
|
@@ -63,11 +64,11 @@ int randombytes(uint8_t *x, size_t xlen) { |
|
|
|
} |
|
|
|
AES256_ECB(DRBG_ctx.Key, DRBG_ctx.V, block); |
|
|
|
if (xlen > 15) { |
|
|
|
memcpy(x + i, block, 16); |
|
|
|
memcpy(buf + i, block, 16); |
|
|
|
i += 16; |
|
|
|
xlen -= 16; |
|
|
|
} else { |
|
|
|
memcpy(x + i, block, xlen); |
|
|
|
memcpy(buf + i, block, xlen); |
|
|
|
xlen = 0; |
|
|
|
} |
|
|
|
} |
|
|
@@ -76,7 +77,7 @@ int randombytes(uint8_t *x, size_t xlen) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static void AES256_CTR_DRBG_Update(uint8_t *provided_data, uint8_t *Key, uint8_t *V) { |
|
|
|
static void AES256_CTR_DRBG_Update(const uint8_t *provided_data, uint8_t *Key, uint8_t *V) { |
|
|
|
uint8_t temp[48]; |
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++) { |
|
|
@@ -92,10 +93,11 @@ static void AES256_CTR_DRBG_Update(uint8_t *provided_data, uint8_t *Key, uint8_t |
|
|
|
|
|
|
|
AES256_ECB(Key, V, temp + 16 * i); |
|
|
|
} |
|
|
|
if (provided_data != NULL) |
|
|
|
if (provided_data != NULL) { |
|
|
|
for (int i = 0; i < 48; i++) { |
|
|
|
temp[i] ^= provided_data[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
memcpy(Key, temp, 32); |
|
|
|
memcpy(V, temp + 32, 16); |
|
|
|
} |