NTRU_IoT/infidel-code/test/test_common.c
2022-02-01 23:45:47 +07:00

135 lines
2.4 KiB
C

#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
#include "ntru_crypto.h"
#include "ntru_crypto_drbg.h"
#include "test_common.h"
uint32_t randombytes(uint8_t *x, uint32_t xlen)
{
static int fd = -1;
int i;
if (fd == -1) {
for (;;) {
fd = open("/dev/urandom",O_RDONLY);
if (fd != -1) break;
sleep(1);
}
}
while (xlen > 0) {
if (xlen < 1048576) i = xlen; else i = 1048576;
i = read(fd,x,i);
if (i < 1) {
sleep(1);
continue;
}
x += i;
xlen -= i;
}
DRBG_RET(DRBG_OK);
}
uint8_t
drbg_sha256_hmac_get_entropy(
ENTROPY_CMD cmd,
uint8_t *out)
{
/* 48 bytes of entropy are needed to instantiate a DRBG with a
* security strength of 256 bits.
*/
static uint8_t seed[48];
static size_t index;
if (cmd == INIT)
{
/* Any initialization for a real entropy source goes here. */
index = 0;
randombytes(seed, sizeof(seed));
return 1;
}
if (out == NULL)
return 0;
if (cmd == GET_NUM_BYTES_PER_BYTE_OF_ENTROPY)
{
/* Here we return the number of bytes needed from the entropy
* source to obtain 8 bits of entropy. Maximum is 8.
*/
*out = 1; /* treat this as a perfectly random source */
return 1;
}
if (cmd == GET_BYTE_OF_ENTROPY)
{
if (index >= sizeof(seed))
{
index = 0;
randombytes(seed, sizeof(seed));
}
*out = seed[index++]; /* deliver an entropy byte */
return 1;
}
return 0;
}
uint8_t
drbg_sha256_hmac_get_entropy_err_init(
ENTROPY_CMD cmd,
uint8_t *out)
{
if (cmd == INIT)
{
return 0;
}
return drbg_sha256_hmac_get_entropy(cmd, out);
}
uint8_t
drbg_sha256_hmac_get_entropy_err_get_num(
ENTROPY_CMD cmd,
uint8_t *out)
{
if (cmd == GET_BYTE_OF_ENTROPY)
{
return 0;
}
return drbg_sha256_hmac_get_entropy(cmd, out);
}
uint8_t
drbg_sha256_hmac_get_entropy_err_num_eq_zero(
ENTROPY_CMD cmd,
uint8_t *out)
{
if (cmd == GET_NUM_BYTES_PER_BYTE_OF_ENTROPY)
{
*out = 0;
return 1;
}
return drbg_sha256_hmac_get_entropy(cmd, out);
}
uint8_t
drbg_sha256_hmac_get_entropy_err_get_byte(
ENTROPY_CMD cmd,
uint8_t *out)
{
if (cmd == GET_NUM_BYTES_PER_BYTE_OF_ENTROPY)
{
return 0;
}
return drbg_sha256_hmac_get_entropy(cmd, out);
}