From: Richard Levitte Date: Sun, 13 May 2001 10:34:18 +0000 (+0000) Subject: A randomizer for OpenVMS, using the statistics that are easily X-Git-Tag: OpenSSL_0_9_6c~182^2~174 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=739862384c31b325c54b0c8154a9e00c722219da;p=oweals%2Fopenssl.git A randomizer for OpenVMS, using the statistics that are easily reachable. It's completely untested for now. To be done in the next few days. --- diff --git a/crypto/rand/rand_vms.c b/crypto/rand/rand_vms.c index 5e2e2b157b..924ef1ba89 100644 --- a/crypto/rand/rand_vms.c +++ b/crypto/rand/rand_vms.c @@ -1,4 +1,4 @@ -/* crypto/rand/rand_vms.c */ +/* crypto/rand/rand_vms.c -*- mode:C; c-file-style: "eay" -*- */ /* Written by Richard Levitte for the OpenSSL * project 2000. */ @@ -61,12 +61,70 @@ #if defined(OPENSSL_SYS_VMS) -/* For now, this does nothing. I'm searching for a good random device, - then we'll see. */ +#include +#include +#include +#include +static struct items_data_st + { + short length, code; /* length is amount of bytes */ + } items_data[] = + { { 4, JPI$_BUFIO }, + { 4, JPI$_CPUTIM }, + { 4, JPI$_DIRIO }, + { 8, JPI$_LOGINTIM }, + { 4, JPI$_PAGEFLTS }, + { 4, JPI$_PID }, + { 4, JPI$_WSSIZE }, + { 0, 0 } + }; + int RAND_poll(void) -{ - return 0; + { + long pid, iosb[2]; + int status = 0; + struct + { + short length, code; + long *buffer; + int *retlen; + } item[32], *pitem; + unsigned char data_buffer[256]; + short total_length = 0; + struct items_data_st *pitems_data; + + pitems_data = items_data; + pitem = item; + + /* Setup */ + while (pitems_data->length) + { + pitem->length = pitems_data->length; + pitem->code = pitems_data->code; + pitem->buffer = (long *)data_buffer[total_length]; + pitem->retlen = 0; + total_length += pitems_data->length; + } + pitem->length = pitem->code = 0; + + /* + * Scan through all the processes in the system and add entropy with + * results from the processes that were possible to look at. + * However, view the information as only half trustable. + */ + pid = -1; /* search context */ + while ((status = SYS$GETJPIW(8, &pid, 0, item, iosb, 0, 0)) + != SS$_NOMOREPROC) + { + if (status == SS$_NORMAL) + { + RAND_add(data_buffer, total_length, total_length/2); + } + } + SYS$GETTIM(iosb); + RAND_add((unsigned char *)iosb, sizeof(iosb), sizeof(iosb)/2); + return 1; } #endif