| 
									
										
										
										
											2017-06-19 15:49:18 +02:00
										 |  |  | /* LibTomCrypt, modular cryptographic library -- Tom St Denis
 | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #include "tomcrypt.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   @file no_prng.c | 
					
						
							|  |  |  |   NO PRNG, Steffen Jaeckel | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef LTC_PKCS_1
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  | typedef struct | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    struct ltc_prng_descriptor desc; | 
					
						
							|  |  |  |    char name[64]; | 
					
						
							|  |  |  |    unsigned char entropy[1024]; | 
					
						
							|  |  |  |    unsigned long len; | 
					
						
							|  |  |  |    unsigned long offset; | 
					
						
							|  |  |  | } no_prng_desc_t; | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   Start the PRNG | 
					
						
							|  |  |  |   @param prng     [out] The PRNG state to initialize | 
					
						
							|  |  |  |   @return CRYPT_OK if successful | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int no_prng_start(prng_state *prng) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  |    no_prng_desc_t *no_prng = (no_prng_desc_t*) prng; | 
					
						
							|  |  |  |    LTC_ARGCHK(no_prng != NULL); | 
					
						
							|  |  |  |    LTC_ARGCHK(no_prng->name == (char*)no_prng + offsetof(no_prng_desc_t, name)); | 
					
						
							|  |  |  |    no_prng->len = 0; | 
					
						
							|  |  |  |    no_prng->offset = 0; | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  |    return CRYPT_OK; | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   Add entropy to the PRNG state | 
					
						
							|  |  |  |   @param in       The data to add | 
					
						
							|  |  |  |   @param inlen    Length of the data to add | 
					
						
							|  |  |  |   @param prng     PRNG state to update | 
					
						
							|  |  |  |   @return CRYPT_OK if successful | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int no_prng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  |    no_prng_desc_t *no_prng = (no_prng_desc_t*) prng; | 
					
						
							|  |  |  |    LTC_ARGCHK(no_prng != NULL); | 
					
						
							|  |  |  |    LTC_ARGCHK(no_prng->name == (char*)no_prng + offsetof(no_prng_desc_t, name)); | 
					
						
							|  |  |  |    LTC_ARGCHK(in != NULL); | 
					
						
							|  |  |  |    LTC_ARGCHK(inlen <= sizeof(no_prng->entropy)); | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  |    no_prng->len = MIN(inlen, sizeof(no_prng->entropy)); | 
					
						
							|  |  |  |    memcpy(no_prng->entropy, in, no_prng->len); | 
					
						
							|  |  |  |    no_prng->offset = 0; | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  |    return CRYPT_OK; | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   Make the PRNG ready to read from | 
					
						
							|  |  |  |   @param prng   The PRNG to make active | 
					
						
							|  |  |  |   @return CRYPT_OK if successful | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int no_prng_ready(prng_state *prng) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     LTC_ARGCHK(prng != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return CRYPT_OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   Read from the PRNG | 
					
						
							|  |  |  |   @param out      Destination | 
					
						
							|  |  |  |   @param outlen   Length of output | 
					
						
							|  |  |  |   @param prng     The active PRNG to read from | 
					
						
							|  |  |  |   @return Number of octets read | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | unsigned long no_prng_read(unsigned char *out, unsigned long outlen, prng_state *prng) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  |    no_prng_desc_t *no_prng = (no_prng_desc_t*) prng; | 
					
						
							|  |  |  |    LTC_ARGCHK(no_prng != NULL); | 
					
						
							|  |  |  |    LTC_ARGCHK(no_prng->name == (char*)no_prng + offsetof(no_prng_desc_t, name)); | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  |    LTC_ARGCHK(out != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  |    outlen = MIN(outlen, no_prng->len - no_prng->offset); | 
					
						
							|  |  |  |    memcpy(out, &no_prng->entropy[no_prng->offset], outlen); | 
					
						
							|  |  |  |    no_prng->offset += outlen; | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    return outlen; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   Terminate the PRNG | 
					
						
							|  |  |  |   @param prng   The PRNG to terminate | 
					
						
							|  |  |  |   @return CRYPT_OK if successful | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int no_prng_done(prng_state *prng) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-08-28 13:53:51 +02:00
										 |  |  |    LTC_UNUSED_PARAM(prng); | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  |    return CRYPT_OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   Export the PRNG state | 
					
						
							|  |  |  |   @param out       [out] Destination | 
					
						
							|  |  |  |   @param outlen    [in/out] Max size and resulting size of the state | 
					
						
							|  |  |  |   @param prng      The PRNG to export | 
					
						
							|  |  |  |   @return CRYPT_OK if successful | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int no_prng_export(unsigned char *out, unsigned long *outlen, prng_state *prng) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-08-28 13:53:51 +02:00
										 |  |  |    LTC_UNUSED_PARAM(out); | 
					
						
							|  |  |  |    LTC_UNUSED_PARAM(outlen); | 
					
						
							|  |  |  |    LTC_UNUSED_PARAM(prng); | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  |    return CRYPT_OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   Import a PRNG state | 
					
						
							|  |  |  |   @param in       The PRNG state | 
					
						
							|  |  |  |   @param inlen    Size of the state | 
					
						
							|  |  |  |   @param prng     The PRNG to import | 
					
						
							|  |  |  |   @return CRYPT_OK if successful | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int no_prng_import(const unsigned char *in, unsigned long inlen, prng_state *prng) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-08-28 13:53:51 +02:00
										 |  |  |    LTC_UNUSED_PARAM(in); | 
					
						
							|  |  |  |    LTC_UNUSED_PARAM(inlen); | 
					
						
							|  |  |  |    LTC_UNUSED_PARAM(prng); | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  |    return CRYPT_OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |   PRNG self-test | 
					
						
							|  |  |  |   @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | int no_prng_test(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    return CRYPT_OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  | static const struct ltc_prng_descriptor no_prng_desc = | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  |     NULL, 0, | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  |     &no_prng_start, | 
					
						
							|  |  |  |     &no_prng_add_entropy, | 
					
						
							|  |  |  |     &no_prng_ready, | 
					
						
							|  |  |  |     &no_prng_read, | 
					
						
							|  |  |  |     &no_prng_done, | 
					
						
							|  |  |  |     &no_prng_export, | 
					
						
							|  |  |  |     &no_prng_import, | 
					
						
							|  |  |  |     &no_prng_test | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 15:04:46 +02:00
										 |  |  | struct ltc_prng_descriptor* no_prng_desc_get(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    no_prng_desc_t* no_prng = XMALLOC(sizeof(*no_prng)); | 
					
						
							|  |  |  |    LTC_ARGCHK(no_prng != NULL); | 
					
						
							|  |  |  |    XMEMCPY(&no_prng->desc, &no_prng_desc, sizeof(no_prng_desc)); | 
					
						
							|  |  |  |    LTC_ARGCHK(snprintf(no_prng->name, sizeof(no_prng->name), "no_prng@%p", no_prng) < (int)sizeof(no_prng->name)); | 
					
						
							|  |  |  |    no_prng->desc.name = no_prng->name; | 
					
						
							|  |  |  |    return &no_prng->desc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void no_prng_desc_free(struct ltc_prng_descriptor* prng) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    no_prng_desc_t *no_prng = (no_prng_desc_t*) prng; | 
					
						
							|  |  |  |    LTC_ARGCHK(no_prng != NULL); | 
					
						
							|  |  |  |    LTC_ARGCHK(no_prng->name == (char*)no_prng + offsetof(no_prng_desc_t, name)); | 
					
						
							|  |  |  |    XFREE(no_prng); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-05 17:19:17 +02:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-19 13:43:49 +02:00
										 |  |  | /* ref:         $Format:%D$ */ | 
					
						
							|  |  |  | /* git commit:  $Format:%H$ */ | 
					
						
							|  |  |  | /* commit time: $Format:%ai$ */ |