/* Deterministic randombytes by Daniel J. Bernstein */ /* taken from SUPERCOP (https://bench.cr.yp.to) */ #include "api.h" #include "randombytes.h" #include "hal.h" #include #include #include #define NTESTS 2 // https://stackoverflow.com/a/1489985/1711232 #define PASTER(x, y) x##y #define EVALUATOR(x, y) PASTER(x, y) #define NAMESPACE(fun) EVALUATOR(MUPQ_NAMESPACE, fun) // use different names so we can have empty namespaces #define MUPQ_CRYPTO_BYTES NAMESPACE(CRYPTO_BYTES) #define MUPQ_CRYPTO_PUBLICKEYBYTES NAMESPACE(CRYPTO_PUBLICKEYBYTES) #define MUPQ_CRYPTO_SECRETKEYBYTES NAMESPACE(CRYPTO_SECRETKEYBYTES) #define MUPQ_CRYPTO_CIPHERTEXTBYTES NAMESPACE(CRYPTO_CIPHERTEXTBYTES) #define MUPQ_CRYPTO_ALGNAME NAMESPACE(CRYPTO_ALGNAME) #define MUPQ_crypto_kem_keypair NAMESPACE(crypto_kem_keypair) #define MUPQ_crypto_kem_enc NAMESPACE(crypto_kem_enc) #define MUPQ_crypto_kem_dec NAMESPACE(crypto_kem_dec) typedef uint32_t uint32; static void printbytes(const unsigned char *x, unsigned long long xlen) { char outs[2*xlen+1]; unsigned long long i; for(i=0;i> (32 - (b)))) #define MUSH(i,b) x = t[i] += (((x ^ seed[i]) + sum) ^ ROTATE(x,b)); static void surf(void) { uint32 t[12]; uint32 x; uint32 sum = 0; int r; int i; int loop; for (i = 0;i < 12;++i) t[i] = in[i] ^ seed[12 + i]; for (i = 0;i < 8;++i) out[i] = seed[24 + i]; x = t[11]; for (loop = 0;loop < 2;++loop) { for (r = 0;r < 16;++r) { sum += 0x9e3779b9; MUSH(0,5) MUSH(1,7) MUSH(2,9) MUSH(3,13) MUSH(4,5) MUSH(5,7) MUSH(6,9) MUSH(7,13) MUSH(8,5) MUSH(9,7) MUSH(10,9) MUSH(11,13) } for (i = 0;i < 8;++i) out[i] ^= t[i + 4]; } } int randombytes(uint8_t *x, size_t xlen) { while (xlen > 0) { if (!outleft) { if (!++in[0]) if (!++in[1]) if (!++in[2]) ++in[3]; surf(); outleft = 8; } *x = out[--outleft]; ++x; --xlen; } return 0; } int main(void) { unsigned char key_a[MUPQ_CRYPTO_BYTES], key_b[MUPQ_CRYPTO_BYTES]; unsigned char pk[MUPQ_CRYPTO_PUBLICKEYBYTES]; unsigned char sendb[MUPQ_CRYPTO_CIPHERTEXTBYTES]; unsigned char sk_a[MUPQ_CRYPTO_SECRETKEYBYTES]; int i,j; hal_setup(CLOCK_FAST); hal_send_str("=========================="); for(i=0;i