From dc55de007d77011ceba09eb200d5a36b68b9f760 Mon Sep 17 00:00:00 2001 From: toddouska Date: Wed, 20 Mar 2013 15:02:03 -0700 Subject: [PATCH] add mcapi rng with test --- mcapi/crypto.c | 33 +++++++++++++++++++++++++++++ mcapi/crypto.h | 10 +++++++++ mcapi/test.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 99 insertions(+), 1 deletion(-) diff --git a/mcapi/crypto.c b/mcapi/crypto.c index 2926d9b82..6b4d3d29b 100644 --- a/mcapi/crypto.c +++ b/mcapi/crypto.c @@ -32,6 +32,7 @@ #include #include #include +#include /* Initialize MD5 */ @@ -244,3 +245,35 @@ int CRYPT_HUFFMAN_DeCompress(unsigned char* out, unsigned int outSz, } +/* RNG Initialize, < 0 on error */ +int CRYPT_RNG_Initialize(CRYPT_RNG_CTX* rng) +{ + typedef char rng_test[sizeof(CRYPT_RNG_CTX) >= sizeof(RNG) ? 1 : -1]; + (void)sizeof(rng_test); + + return InitRng((RNG*)rng); +} + + +/* RNG Get single bytes, < 0 on error */ +int CRYPT_RNG_Get(CRYPT_RNG_CTX* rng, unsigned char* b) +{ + *b = RNG_GenerateByte((RNG*)rng); + + return 0; +} + + +/* RNG Block Generation of sz bytes, < 0 on error */ +int CRYPT_RNG_BlockGenerate(CRYPT_RNG_CTX* rng, unsigned char* b, + unsigned int sz) +{ + RNG_GenerateBlock((RNG*)rng, b, sz); + + return 0; +} + + + + + diff --git a/mcapi/crypto.h b/mcapi/crypto.h index c748190fa..70a7dd870 100644 --- a/mcapi/crypto.h +++ b/mcapi/crypto.h @@ -130,6 +130,16 @@ enum { }; +/* RNG */ +typedef struct CRYPT_RNG_CTX { + int holder[66]; /* big enough to hold internal, but check on init */ +} CRYPT_RNG_CTX; + +int CRYPT_RNG_Initialize(CRYPT_RNG_CTX*); +int CRYPT_RNG_Get(CRYPT_RNG_CTX*, unsigned char*); +int CRYPT_RNG_BlockGenerate(CRYPT_RNG_CTX*, unsigned char*, unsigned int); + + #ifdef __cplusplus } /* extern "C" */ diff --git a/mcapi/test.c b/mcapi/test.c index cf2bd01a8..26dd20698 100644 --- a/mcapi/test.c +++ b/mcapi/test.c @@ -34,6 +34,7 @@ #include #include #include +#include /* c stdlib headers */ #include @@ -50,6 +51,7 @@ static int check_sha384(void); static int check_sha512(void); static int check_hmac(void); static int check_compress(void); +static int check_rng(void); int main(int argc, char** argv) @@ -108,7 +110,13 @@ int main(int argc, char** argv) ret = check_compress(); if (ret != 0) { - printf("mcapi check_comopress failed\n"); + printf("mcapi check_compress failed\n"); + return -1; + } + + ret = check_rng(); + if (ret != 0) { + printf("mcapi check_rng failed\n"); return -1; } @@ -433,4 +441,51 @@ static int check_compress(void) } +#define RANDOM_BYTE_SZ 32 + +/* check mcapi rng */ +static int check_rng(void) +{ + CRYPT_RNG_CTX rng; + int ret; + int i; + byte in[RANDOM_BYTE_SZ]; + byte out[RANDOM_BYTE_SZ]; + + for (i = 0; i < RANDOM_BYTE_SZ; i++) + in[i] = (byte)i; + + for (i = 0; i < RANDOM_BYTE_SZ; i++) + out[i] = (byte)i; + + ret = CRYPT_RNG_Initialize(&rng); + if (ret != 0) { + printf("mcap rng init failed\n"); + return -1; + } + + ret = CRYPT_RNG_Get(&rng, &out[0]); + if (ret != 0) { + printf("mcap rng get failed\n"); + return -1; + } + + ret = CRYPT_RNG_BlockGenerate(&rng, out, RANDOM_BYTE_SZ); + if (ret != 0) { + printf("mcap rng block gen failed\n"); + return -1; + } + + if (memcmp(in, out, RANDOM_BYTE_SZ) == 0) { + printf("mcap rng block gen output failed\n"); + return -1; + } + + printf("rng mcapi test passed\n"); + + return 0; +} + + +