From 1cfc45835f39588f5d6f9170aee93efb13544040 Mon Sep 17 00:00:00 2001 From: Paul Bakker Date: Wed, 9 Apr 2014 15:25:13 +0200 Subject: [PATCH] Add option 'use_dev_random' to gen_key application --- ChangeLog | 1 + programs/pkey/gen_key.c | 75 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/ChangeLog b/ChangeLog index 36532ba64..7df0e7c69 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,7 @@ ABI Alert: ALPN changes the ABI for the next release. Features * Support for the ALPN SSL extension + * Add option 'use_dev_random' to gen_key application Changes * x509_crt_info() now prints information about parsed extensions as well diff --git a/programs/pkey/gen_key.c b/programs/pkey/gen_key.c index 2a332577a..9f060b7c2 100644 --- a/programs/pkey/gen_key.c +++ b/programs/pkey/gen_key.c @@ -29,6 +29,10 @@ #include #include +#if !defined(_WIN32) && defined(POLARSSL_FS_IO) +#include +#endif /* !_WIN32 && POLARSSL_FS_IO */ + #include "polarssl/error.h" #include "polarssl/pk.h" #include "polarssl/ecdsa.h" @@ -59,6 +63,7 @@ int main( int argc, char *argv[] ) #define DFL_EC_CURVE ecp_curve_list()->grp_id #define DFL_FILENAME "keyfile.key" #define DFL_FORMAT FORMAT_PEM +#define DFL_USE_DEV_RANDOM 0 /* * global options @@ -70,8 +75,48 @@ struct options int ec_curve; /* curve identifier for EC keys */ const char *filename; /* filename of the key file */ int format; /* the output format to use */ + int use_dev_random; /* use /dev/random as entropy source */ } opt; +#if !defined(_WIN32) && defined(POLARSSL_FS_IO) + +#define DEV_RANDOM_THRESHOLD 32 + +int dev_random_entropy_poll( void *data, unsigned char *output, + size_t len, size_t *olen ) +{ + FILE *file; + size_t ret, left = len; + unsigned char *p = output; + ((void) data); + + *olen = 0; + + file = fopen( "/dev/random", "rb" ); + if( file == NULL ) + return( POLARSSL_ERR_ENTROPY_SOURCE_FAILED ); + + while( left > 0 ) + { + /* /dev/random can return much less than requested. If so, try again */ + ret = fread( p, 1, left, file ); + if( ret == 0 && ferror( file ) ) + { + fclose( file ); + return( POLARSSL_ERR_ENTROPY_SOURCE_FAILED ); + } + + p += ret; + left -= ret; + sleep( 1 ); + } + fclose( file ); + *olen = len; + + return( 0 ); +} +#endif /* !_WIN32 && POLARSSL_FS_IO */ + static int write_private_key( pk_context *key, const char *output_file ) { int ret; @@ -108,6 +153,13 @@ static int write_private_key( pk_context *key, const char *output_file ) return( 0 ); } +#if !defined(_WIN32) && defined(POLARSSL_FS_IO) +#define USAGE_DEV_RANDOM \ + " use_dev_random=0|1 default: 0\n" +#else +#define USAGE_DEV_RANDOM "" +#endif /* !_WIN32 && POLARSSL_FS_IO */ + #define USAGE \ "\n usage: gen_key param=<>...\n" \ "\n acceptable parameters:\n" \ @@ -116,6 +168,7 @@ static int write_private_key( pk_context *key, const char *output_file ) " ec_curve=%%s see below\n" \ " filename=%%s default: keyfile.key\n" \ " format=pem|der default: pem\n" \ + USAGE_DEV_RANDOM \ "\n" int main( int argc, char *argv[] ) @@ -158,6 +211,7 @@ int main( int argc, char *argv[] ) opt.ec_curve = DFL_EC_CURVE; opt.filename = DFL_FILENAME; opt.format = DFL_FORMAT; + opt.use_dev_random = DFL_USE_DEV_RANDOM; for( i = 1; i < argc; i++ ) { @@ -198,6 +252,12 @@ int main( int argc, char *argv[] ) } else if( strcmp( p, "filename" ) == 0 ) opt.filename = q; + else if( strcmp( p, "use_dev_random" ) == 0 ) + { + opt.use_dev_random = atoi( q ); + if( opt.use_dev_random < 0 || opt.use_dev_random > 1 ) + goto usage; + } else goto usage; } @@ -206,6 +266,21 @@ int main( int argc, char *argv[] ) fflush( stdout ); entropy_init( &entropy ); +#if !defined(_WIN32) && defined(POLARSSL_FS_IO) + if( opt.use_dev_random ) + { + if( ( ret = entropy_add_source( &entropy, dev_random_entropy_poll, + NULL, DEV_RANDOM_THRESHOLD ) ) != 0 ) + { + printf( " failed\n ! entropy_add_source returned -0x%04x\n", -ret ); + goto exit; + } + + printf("\n Using /dev/random, so can take a long time! " ); + fflush( stdout ); + } +#endif /* !_WIN32 && POLARSSL_FS_IO */ + if( ( ret = ctr_drbg_init( &ctr_drbg, entropy_func, &entropy, (const unsigned char *) pers, strlen( pers ) ) ) != 0 )