Mentre stavo passando attraverso Crypt :: SSLeay , preparandolo per la prossima versione, ho notato il seguente codice, scritto prima del mio tempo,
...
int rand_bytes_read;
static int bNotFirstTime;
char buf[ 1024 ];
...
if(!bNotFirstTime) {
SSLeay_add_all_algorithms();
SSL_load_error_strings();
ERR_load_crypto_strings();
SSL_library_init();
bNotFirstTime = 1;
}
/**** Code from ..., 10/3/2002 ****/
/**** Use /dev/urandom to seed if available ****/
rand_bytes_read = RAND_load_file("/dev/urandom", 1024);
if (rand_bytes_read <= 0) {
/* Couldn't read /dev/urandom, just seed off
* of the stack variable (the old way)
*/
RAND_seed(buf,sizeof buf);
}
In primo luogo, mi sembra che il modo corretto per verificare se RAND_load_file
è riuscito è quello di verificare se i byte letti sono uguali ai byte richiesti.
Lasciando da parte, sono a mia conoscenza che SSL_library_init
semina il PRNG da /dev/urandom
se è disponibile, e da altre fonti su Windows ecc.
-
C'è un motivo per provare a ri-seminare il PRNG ogni volta che viene creato un nuovo contesto (
SSL_library_init
è invocato solo la prima volta)? -
Il contenuto di una variabile stack è accettabile per fornire casualità?
Wiki di OpenSSL afferma:
InitializationOpenSSL will attempt to seed the random number generator automatically upon instantiation by calling
RAND_poll
.RAND_poll
seeds the random number generator using a system-specific entropy source, which is/dev/urandom
on UNIX-like operating systems, and is a combination ofCryptGenRandom
and other sources of entropy on Windows.Be careful when deferring to
RAND_poll
on some Unix systems because it does not seed the generator. See the code guarded withOPENSSL_SYS_VXWORKS
in rand_unix.c. Additionally,RAND_poll
can have negative interactions on newer Windows platforms, so your program could hang or crash depending on the potential issue. See Windows Issues below.
PS: Crypt::SSLeay
fornisce supporto per LWP :: UserAgent di Perl per comunicare su HTTPS. Non è più usato di default , ma è mantenuto in modo da non interrompere le impostazioni precedenti.