00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "polarssl/config.h"
00027
00028 #if defined(POLARSSL_ENTROPY_C)
00029
00030 #include "polarssl/entropy.h"
00031 #include "polarssl/entropy_poll.h"
00032
00033 #if defined(POLARSSL_TIMING_C)
00034 #include "polarssl/timing.h"
00035 #endif
00036 #if defined(POLARSSL_HAVEGE_C)
00037 #include "polarssl/havege.h"
00038 #endif
00039
00040 #if !defined(POLARSSL_NO_PLATFORM_ENTROPY)
00041 #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
00042
00043 #if !defined(_WIN32_WINNT)
00044 #define _WIN32_WINNT 0x0400
00045 #endif
00046 #include <windows.h>
00047 #include <wincrypt.h>
00048
00049 int platform_entropy_poll( void *data, unsigned char *output, size_t len,
00050 size_t *olen )
00051 {
00052 HCRYPTPROV provider;
00053 ((void) data);
00054 *olen = 0;
00055
00056 if( CryptAcquireContext( &provider, NULL, NULL,
00057 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) == FALSE )
00058 {
00059 return POLARSSL_ERR_ENTROPY_SOURCE_FAILED;
00060 }
00061
00062 if( CryptGenRandom( provider, (DWORD) len, output ) == FALSE )
00063 return POLARSSL_ERR_ENTROPY_SOURCE_FAILED;
00064
00065 CryptReleaseContext( provider, 0 );
00066 *olen = len;
00067
00068 return( 0 );
00069 }
00070 #else
00071
00072 #include <stdio.h>
00073
00074 int platform_entropy_poll( void *data,
00075 unsigned char *output, size_t len, size_t *olen )
00076 {
00077 FILE *file;
00078 size_t ret;
00079 ((void) data);
00080
00081 *olen = 0;
00082
00083 file = fopen( "/dev/urandom", "rb" );
00084 if( file == NULL )
00085 return POLARSSL_ERR_ENTROPY_SOURCE_FAILED;
00086
00087 ret = fread( output, 1, len, file );
00088 if( ret != len )
00089 {
00090 fclose( file );
00091 return POLARSSL_ERR_ENTROPY_SOURCE_FAILED;
00092 }
00093
00094 fclose( file );
00095 *olen = len;
00096
00097 return( 0 );
00098 }
00099 #endif
00100 #endif
00101
00102 #if defined(POLARSSL_TIMING_C)
00103 int hardclock_poll( void *data,
00104 unsigned char *output, size_t len, size_t *olen )
00105 {
00106 unsigned long timer = hardclock();
00107 ((void) data);
00108 *olen = 0;
00109
00110 if( len < sizeof(unsigned long) )
00111 return( 0 );
00112
00113 memcpy( output, &timer, sizeof(unsigned long) );
00114 *olen = sizeof(unsigned long);
00115
00116 return( 0 );
00117 }
00118 #endif
00119
00120 #if defined(POLARSSL_HAVEGE_C)
00121 int havege_poll( void *data,
00122 unsigned char *output, size_t len, size_t *olen )
00123 {
00124 havege_state *hs = (havege_state *) data;
00125 *olen = 0;
00126
00127 if( havege_random( hs, output, len ) != 0 )
00128 return POLARSSL_ERR_ENTROPY_SOURCE_FAILED;
00129
00130 *olen = len;
00131
00132 return( 0 );
00133 }
00134 #endif
00135
00136 #endif