Merge pull request #78 from libtom/idea/ltc_rng
add ltc_rng function pointer
This commit is contained in:
		
						commit
						fd1e351316
					
				| @ -1097,6 +1097,10 @@ | |||||||
| 					RelativePath="src\misc\crypt\crypt_prng_is_valid.c" | 					RelativePath="src\misc\crypt\crypt_prng_is_valid.c" | ||||||
| 					> | 					> | ||||||
| 				</File> | 				</File> | ||||||
|  | 				<File | ||||||
|  | 					RelativePath="src\misc\crypt\crypt_prng_rng_descriptor.c" | ||||||
|  | 					> | ||||||
|  | 				</File> | ||||||
| 				<File | 				<File | ||||||
| 					RelativePath="src\misc\crypt\crypt_register_cipher.c" | 					RelativePath="src\misc\crypt\crypt_register_cipher.c" | ||||||
| 					> | 					> | ||||||
|  | |||||||
| @ -1099,6 +1099,10 @@ | |||||||
| 					RelativePath="src\misc\crypt\crypt_prng_is_valid.c" | 					RelativePath="src\misc\crypt\crypt_prng_is_valid.c" | ||||||
| 					> | 					> | ||||||
| 				</File> | 				</File> | ||||||
|  | 				<File | ||||||
|  | 					RelativePath="src\misc\crypt\crypt_prng_rng_descriptor.c" | ||||||
|  | 					> | ||||||
|  | 				</File> | ||||||
| 				<File | 				<File | ||||||
| 					RelativePath="src\misc\crypt\crypt_register_cipher.c" | 					RelativePath="src\misc\crypt\crypt_register_cipher.c" | ||||||
| 					> | 					> | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								makefile
									
									
									
									
									
								
							| @ -95,8 +95,8 @@ src/misc/crypt/crypt_find_hash_oid.o src/misc/crypt/crypt_find_prng.o src/misc/c | |||||||
| src/misc/crypt/crypt_hash_descriptor.o src/misc/crypt/crypt_hash_is_valid.o \ | src/misc/crypt/crypt_hash_descriptor.o src/misc/crypt/crypt_hash_is_valid.o \ | ||||||
| src/misc/crypt/crypt_inits.o src/misc/crypt/crypt_ltc_mp_descriptor.o \ | src/misc/crypt/crypt_inits.o src/misc/crypt/crypt_ltc_mp_descriptor.o \ | ||||||
| src/misc/crypt/crypt_prng_descriptor.o src/misc/crypt/crypt_prng_is_valid.o \ | src/misc/crypt/crypt_prng_descriptor.o src/misc/crypt/crypt_prng_is_valid.o \ | ||||||
| src/misc/crypt/crypt_register_cipher.o src/misc/crypt/crypt_register_hash.o \ | src/misc/crypt/crypt_prng_rng_descriptor.o src/misc/crypt/crypt_register_cipher.o \ | ||||||
| src/misc/crypt/crypt_register_prng.o src/misc/crypt/crypt_sizes.o \ | src/misc/crypt/crypt_register_hash.o src/misc/crypt/crypt_register_prng.o src/misc/crypt/crypt_sizes.o \ | ||||||
| src/misc/crypt/crypt_unregister_cipher.o src/misc/crypt/crypt_unregister_hash.o \ | src/misc/crypt/crypt_unregister_cipher.o src/misc/crypt/crypt_unregister_hash.o \ | ||||||
| src/misc/crypt/crypt_unregister_prng.o src/misc/error_to_string.o src/misc/hkdf/hkdf.o \ | src/misc/crypt/crypt_unregister_prng.o src/misc/error_to_string.o src/misc/hkdf/hkdf.o \ | ||||||
| src/misc/hkdf/hkdf_test.o src/misc/mem_neq.o src/misc/pk_get_oid.o src/misc/pkcs5/pkcs_5_1.o \ | src/misc/hkdf/hkdf_test.o src/misc/mem_neq.o src/misc/pk_get_oid.o src/misc/pkcs5/pkcs_5_1.o \ | ||||||
|  | |||||||
| @ -152,8 +152,8 @@ src/misc/crypt/crypt_find_hash_oid.o src/misc/crypt/crypt_find_prng.o src/misc/c | |||||||
| src/misc/crypt/crypt_hash_descriptor.o src/misc/crypt/crypt_hash_is_valid.o \ | src/misc/crypt/crypt_hash_descriptor.o src/misc/crypt/crypt_hash_is_valid.o \ | ||||||
| src/misc/crypt/crypt_inits.o src/misc/crypt/crypt_ltc_mp_descriptor.o \ | src/misc/crypt/crypt_inits.o src/misc/crypt/crypt_ltc_mp_descriptor.o \ | ||||||
| src/misc/crypt/crypt_prng_descriptor.o src/misc/crypt/crypt_prng_is_valid.o \ | src/misc/crypt/crypt_prng_descriptor.o src/misc/crypt/crypt_prng_is_valid.o \ | ||||||
| src/misc/crypt/crypt_register_cipher.o src/misc/crypt/crypt_register_hash.o \ | src/misc/crypt/crypt_prng_rng_descriptor.o src/misc/crypt/crypt_register_cipher.o \ | ||||||
| src/misc/crypt/crypt_register_prng.o src/misc/crypt/crypt_sizes.o \ | src/misc/crypt/crypt_register_hash.o src/misc/crypt/crypt_register_prng.o src/misc/crypt/crypt_sizes.o \ | ||||||
| src/misc/crypt/crypt_unregister_cipher.o src/misc/crypt/crypt_unregister_hash.o \ | src/misc/crypt/crypt_unregister_cipher.o src/misc/crypt/crypt_unregister_hash.o \ | ||||||
| src/misc/crypt/crypt_unregister_prng.o src/misc/error_to_string.o src/misc/hkdf/hkdf.o \ | src/misc/crypt/crypt_unregister_prng.o src/misc/error_to_string.o src/misc/hkdf/hkdf.o \ | ||||||
| src/misc/hkdf/hkdf_test.o src/misc/mem_neq.o src/misc/pk_get_oid.o src/misc/pkcs5/pkcs_5_1.o \ | src/misc/hkdf/hkdf_test.o src/misc/mem_neq.o src/misc/pk_get_oid.o src/misc/pkcs5/pkcs_5_1.o \ | ||||||
|  | |||||||
| @ -99,8 +99,8 @@ src/misc/crypt/crypt_find_hash_oid.o src/misc/crypt/crypt_find_prng.o src/misc/c | |||||||
| src/misc/crypt/crypt_hash_descriptor.o src/misc/crypt/crypt_hash_is_valid.o \ | src/misc/crypt/crypt_hash_descriptor.o src/misc/crypt/crypt_hash_is_valid.o \ | ||||||
| src/misc/crypt/crypt_inits.o src/misc/crypt/crypt_ltc_mp_descriptor.o \ | src/misc/crypt/crypt_inits.o src/misc/crypt/crypt_ltc_mp_descriptor.o \ | ||||||
| src/misc/crypt/crypt_prng_descriptor.o src/misc/crypt/crypt_prng_is_valid.o \ | src/misc/crypt/crypt_prng_descriptor.o src/misc/crypt/crypt_prng_is_valid.o \ | ||||||
| src/misc/crypt/crypt_register_cipher.o src/misc/crypt/crypt_register_hash.o \ | src/misc/crypt/crypt_prng_rng_descriptor.o src/misc/crypt/crypt_register_cipher.o \ | ||||||
| src/misc/crypt/crypt_register_prng.o src/misc/crypt/crypt_sizes.o \ | src/misc/crypt/crypt_register_hash.o src/misc/crypt/crypt_register_prng.o src/misc/crypt/crypt_sizes.o \ | ||||||
| src/misc/crypt/crypt_unregister_cipher.o src/misc/crypt/crypt_unregister_hash.o \ | src/misc/crypt/crypt_unregister_cipher.o src/misc/crypt/crypt_unregister_hash.o \ | ||||||
| src/misc/crypt/crypt_unregister_prng.o src/misc/error_to_string.o src/misc/hkdf/hkdf.o \ | src/misc/crypt/crypt_unregister_prng.o src/misc/error_to_string.o src/misc/hkdf/hkdf.o \ | ||||||
| src/misc/hkdf/hkdf_test.o src/misc/mem_neq.o src/misc/pk_get_oid.o src/misc/pkcs5/pkcs_5_1.o \ | src/misc/hkdf/hkdf_test.o src/misc/mem_neq.o src/misc/pk_get_oid.o src/misc/pkcs5/pkcs_5_1.o \ | ||||||
|  | |||||||
| @ -57,8 +57,8 @@ src/misc/crypt/crypt_find_hash_oid.obj src/misc/crypt/crypt_find_prng.obj src/mi | |||||||
| src/misc/crypt/crypt_hash_descriptor.obj src/misc/crypt/crypt_hash_is_valid.obj \ | src/misc/crypt/crypt_hash_descriptor.obj src/misc/crypt/crypt_hash_is_valid.obj \ | ||||||
| src/misc/crypt/crypt_inits.obj src/misc/crypt/crypt_ltc_mp_descriptor.obj \ | src/misc/crypt/crypt_inits.obj src/misc/crypt/crypt_ltc_mp_descriptor.obj \ | ||||||
| src/misc/crypt/crypt_prng_descriptor.obj src/misc/crypt/crypt_prng_is_valid.obj \ | src/misc/crypt/crypt_prng_descriptor.obj src/misc/crypt/crypt_prng_is_valid.obj \ | ||||||
| src/misc/crypt/crypt_register_cipher.obj src/misc/crypt/crypt_register_hash.obj \ | src/misc/crypt/crypt_prng_rng_descriptor.obj src/misc/crypt/crypt_register_cipher.obj \ | ||||||
| src/misc/crypt/crypt_register_prng.obj src/misc/crypt/crypt_sizes.obj \ | src/misc/crypt/crypt_register_hash.obj src/misc/crypt/crypt_register_prng.obj src/misc/crypt/crypt_sizes.obj \ | ||||||
| src/misc/crypt/crypt_unregister_cipher.obj src/misc/crypt/crypt_unregister_hash.obj \ | src/misc/crypt/crypt_unregister_cipher.obj src/misc/crypt/crypt_unregister_hash.obj \ | ||||||
| src/misc/crypt/crypt_unregister_prng.obj src/misc/error_to_string.obj src/misc/hkdf/hkdf.obj \ | src/misc/crypt/crypt_unregister_prng.obj src/misc/error_to_string.obj src/misc/hkdf/hkdf.obj \ | ||||||
| src/misc/hkdf/hkdf_test.obj src/misc/mem_neq.obj src/misc/pk_get_oid.obj src/misc/pkcs5/pkcs_5_1.obj \ | src/misc/hkdf/hkdf_test.obj src/misc/mem_neq.obj src/misc/pk_get_oid.obj src/misc/pkcs5/pkcs_5_1.obj \ | ||||||
|  | |||||||
| @ -85,8 +85,8 @@ src/misc/crypt/crypt_find_hash_oid.o src/misc/crypt/crypt_find_prng.o src/misc/c | |||||||
| src/misc/crypt/crypt_hash_descriptor.o src/misc/crypt/crypt_hash_is_valid.o \ | src/misc/crypt/crypt_hash_descriptor.o src/misc/crypt/crypt_hash_is_valid.o \ | ||||||
| src/misc/crypt/crypt_inits.o src/misc/crypt/crypt_ltc_mp_descriptor.o \ | src/misc/crypt/crypt_inits.o src/misc/crypt/crypt_ltc_mp_descriptor.o \ | ||||||
| src/misc/crypt/crypt_prng_descriptor.o src/misc/crypt/crypt_prng_is_valid.o \ | src/misc/crypt/crypt_prng_descriptor.o src/misc/crypt/crypt_prng_is_valid.o \ | ||||||
| src/misc/crypt/crypt_register_cipher.o src/misc/crypt/crypt_register_hash.o \ | src/misc/crypt/crypt_prng_rng_descriptor.o src/misc/crypt/crypt_register_cipher.o \ | ||||||
| src/misc/crypt/crypt_register_prng.o src/misc/crypt/crypt_sizes.o \ | src/misc/crypt/crypt_register_hash.o src/misc/crypt/crypt_register_prng.o src/misc/crypt/crypt_sizes.o \ | ||||||
| src/misc/crypt/crypt_unregister_cipher.o src/misc/crypt/crypt_unregister_hash.o \ | src/misc/crypt/crypt_unregister_cipher.o src/misc/crypt/crypt_unregister_hash.o \ | ||||||
| src/misc/crypt/crypt_unregister_prng.o src/misc/error_to_string.o src/misc/hkdf/hkdf.o \ | src/misc/crypt/crypt_unregister_prng.o src/misc/error_to_string.o src/misc/hkdf/hkdf.o \ | ||||||
| src/misc/hkdf/hkdf_test.o src/misc/mem_neq.o src/misc/pk_get_oid.o src/misc/pkcs5/pkcs_5_1.o \ | src/misc/hkdf/hkdf_test.o src/misc/mem_neq.o src/misc/pk_get_oid.o src/misc/pkcs5/pkcs_5_1.o \ | ||||||
|  | |||||||
| @ -93,8 +93,8 @@ src/misc/crypt/crypt_find_hash_oid.o src/misc/crypt/crypt_find_prng.o src/misc/c | |||||||
| src/misc/crypt/crypt_hash_descriptor.o src/misc/crypt/crypt_hash_is_valid.o \ | src/misc/crypt/crypt_hash_descriptor.o src/misc/crypt/crypt_hash_is_valid.o \ | ||||||
| src/misc/crypt/crypt_inits.o src/misc/crypt/crypt_ltc_mp_descriptor.o \ | src/misc/crypt/crypt_inits.o src/misc/crypt/crypt_ltc_mp_descriptor.o \ | ||||||
| src/misc/crypt/crypt_prng_descriptor.o src/misc/crypt/crypt_prng_is_valid.o \ | src/misc/crypt/crypt_prng_descriptor.o src/misc/crypt/crypt_prng_is_valid.o \ | ||||||
| src/misc/crypt/crypt_register_cipher.o src/misc/crypt/crypt_register_hash.o \ | src/misc/crypt/crypt_prng_rng_descriptor.o src/misc/crypt/crypt_register_cipher.o \ | ||||||
| src/misc/crypt/crypt_register_prng.o src/misc/crypt/crypt_sizes.o \ | src/misc/crypt/crypt_register_hash.o src/misc/crypt/crypt_register_prng.o src/misc/crypt/crypt_sizes.o \ | ||||||
| src/misc/crypt/crypt_unregister_cipher.o src/misc/crypt/crypt_unregister_hash.o \ | src/misc/crypt/crypt_unregister_cipher.o src/misc/crypt/crypt_unregister_hash.o \ | ||||||
| src/misc/crypt/crypt_unregister_prng.o src/misc/error_to_string.o src/misc/hkdf/hkdf.o \ | src/misc/crypt/crypt_unregister_prng.o src/misc/error_to_string.o src/misc/hkdf/hkdf.o \ | ||||||
| src/misc/hkdf/hkdf_test.o src/misc/mem_neq.o src/misc/pk_get_oid.o src/misc/pkcs5/pkcs_5_1.o \ | src/misc/hkdf/hkdf_test.o src/misc/mem_neq.o src/misc/pk_get_oid.o src/misc/pkcs5/pkcs_5_1.o \ | ||||||
|  | |||||||
| @ -304,6 +304,9 @@ | |||||||
| /* rng_make_prng() */ | /* rng_make_prng() */ | ||||||
| #define LTC_RNG_MAKE_PRNG | #define LTC_RNG_MAKE_PRNG | ||||||
| 
 | 
 | ||||||
|  | /* enable the ltc_rng hook to integrate e.g. embedded hardware RNG's easily */ | ||||||
|  | /* #define LTC_PRNG_ENABLE_LTC_RNG */ | ||||||
|  | 
 | ||||||
| #endif /* LTC_NO_PRNGS */ | #endif /* LTC_NO_PRNGS */ | ||||||
| 
 | 
 | ||||||
| #ifdef LTC_YARROW | #ifdef LTC_YARROW | ||||||
|  | |||||||
| @ -193,6 +193,11 @@ unsigned long rng_get_bytes(unsigned char *out, | |||||||
| 
 | 
 | ||||||
| int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void)); | int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void)); | ||||||
| 
 | 
 | ||||||
|  | #ifdef LTC_PRNG_ENABLE_LTC_RNG | ||||||
|  | extern unsigned long (*ltc_rng)(unsigned char *out, unsigned long outlen, | ||||||
|  |       void (*callback)(void)); | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| /* $Source$ */ | /* $Source$ */ | ||||||
| /* $Revision$ */ | /* $Revision$ */ | ||||||
|  | |||||||
| @ -371,6 +371,9 @@ const char *crypt_build_settings = | |||||||
| #if defined(LTC_RNG_MAKE_PRNG) | #if defined(LTC_RNG_MAKE_PRNG) | ||||||
|     " LTC_RNG_MAKE_PRNG " |     " LTC_RNG_MAKE_PRNG " | ||||||
| #endif | #endif | ||||||
|  | #if defined(LTC_PRNG_ENABLE_LTC_RNG) | ||||||
|  |     " LTC_PRNG_ENABLE_LTC_RNG " | ||||||
|  | #endif | ||||||
| #if defined(LTC_HASH_HELPERS) | #if defined(LTC_HASH_HELPERS) | ||||||
|     " LTC_HASH_HELPERS " |     " LTC_HASH_HELPERS " | ||||||
| #endif | #endif | ||||||
|  | |||||||
							
								
								
									
										15
									
								
								src/misc/crypt/crypt_prng_rng_descriptor.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/misc/crypt/crypt_prng_rng_descriptor.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | /* LibTomCrypt, modular cryptographic library -- Tom St Denis
 | ||||||
|  |  * | ||||||
|  |  * LibTomCrypt is a library that provides various cryptographic | ||||||
|  |  * algorithms in a highly modular and flexible manner. | ||||||
|  |  * | ||||||
|  |  * The library is free for all purposes without any express | ||||||
|  |  * guarantee it works. | ||||||
|  |  * | ||||||
|  |  * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
 | ||||||
|  |  */ | ||||||
|  | #include "tomcrypt.h" | ||||||
|  | 
 | ||||||
|  | #ifdef LTC_PRNG_ENABLE_LTC_RNG | ||||||
|  | unsigned long (*ltc_rng)(unsigned char *out, unsigned long outlen, void (*callback)(void)); | ||||||
|  | #endif | ||||||
| @ -135,6 +135,15 @@ unsigned long rng_get_bytes(unsigned char *out, unsigned long outlen, | |||||||
| 
 | 
 | ||||||
|    LTC_ARGCHK(out != NULL); |    LTC_ARGCHK(out != NULL); | ||||||
| 
 | 
 | ||||||
|  | #ifdef LTC_PRNG_ENABLE_LTC_RNG | ||||||
|  |    if (ltc_rng) { | ||||||
|  |       x = ltc_rng(out, outlen, callback); | ||||||
|  |       if (x != 0) { | ||||||
|  |          return x; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if defined(_WIN32) || defined(_WIN32_WCE) | #if defined(_WIN32) || defined(_WIN32_WCE) | ||||||
|    x = rng_win32(out, outlen, callback); if (x != 0) { return x; } |    x = rng_win32(out, outlen, callback); if (x != 0) { return x; } | ||||||
| #elif defined(LTC_DEVRANDOM) | #elif defined(LTC_DEVRANDOM) | ||||||
|  | |||||||
| @ -302,8 +302,29 @@ static void _unregister_all(void) | |||||||
| #endif | #endif | ||||||
| } /* _cleanup() */ | } /* _cleanup() */ | ||||||
| 
 | 
 | ||||||
|  | #ifdef LTC_PRNG_ENABLE_LTC_RNG | ||||||
|  | 
 | ||||||
|  | static unsigned long my_test_rng_read; | ||||||
|  | 
 | ||||||
|  | static unsigned long my_test_rng(unsigned char *buf, unsigned long len, | ||||||
|  |                              void (*callback)(void)) | ||||||
|  | { | ||||||
|  |    unsigned long n; | ||||||
|  |    LTC_UNUSED_PARAM(callback); | ||||||
|  |    for (n = 0; n < len; ++n) { | ||||||
|  |       buf[n] = 4; | ||||||
|  |    } | ||||||
|  |    my_test_rng_read += n; | ||||||
|  |    return n; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| void reg_algs(void) | void reg_algs(void) | ||||||
| { | { | ||||||
|  | #ifdef LTC_PRNG_ENABLE_LTC_RNG | ||||||
|  |   unsigned long before; | ||||||
|  | #endif | ||||||
|   int err; |   int err; | ||||||
| 
 | 
 | ||||||
|   atexit(_unregister_all); |   atexit(_unregister_all); | ||||||
| @ -441,6 +462,23 @@ register_prng(&rc4_desc); | |||||||
| register_prng(&sober128_desc); | register_prng(&sober128_desc); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifdef LTC_PRNG_ENABLE_LTC_RNG | ||||||
|  |    ltc_rng = my_test_rng; | ||||||
|  | 
 | ||||||
|  |    before = my_test_rng_read; | ||||||
|  |    if ((err = rng_make_prng(128, find_prng("yarrow"), &yarrow_prng, NULL)) != CRYPT_OK) { | ||||||
|  |       fprintf(stderr, "rng_make_prng with 'my_test_rng' failed: %s\n", error_to_string(err)); | ||||||
|  |       exit(EXIT_FAILURE); | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    if (before == my_test_rng_read) { | ||||||
|  |       fprintf(stderr, "somehow there was no read from the ltc_rng! %lu == %lu\n", before, my_test_rng_read); | ||||||
|  |       exit(EXIT_FAILURE); | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    ltc_rng = NULL; | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|    if ((err = rng_make_prng(128, find_prng("yarrow"), &yarrow_prng, NULL)) != CRYPT_OK) { |    if ((err = rng_make_prng(128, find_prng("yarrow"), &yarrow_prng, NULL)) != CRYPT_OK) { | ||||||
|       fprintf(stderr, "rng_make_prng failed: %s\n", error_to_string(err)); |       fprintf(stderr, "rng_make_prng failed: %s\n", error_to_string(err)); | ||||||
|       exit(EXIT_FAILURE); |       exit(EXIT_FAILURE); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user