Commit 73986238 authored by Richard Levitte's avatar Richard Levitte
Browse files

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.
parent 0a647c2b
Loading
Loading
Loading
Loading
+63 −5
Original line number Diff line number Diff line
/* crypto/rand/rand_vms.c */
/* crypto/rand/rand_vms.c -*- mode:C; c-file-style: "eay" -*- */
/* Written by Richard Levitte <richard@levitte.org> 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 <descrip.h>
#include <jpidef.h>
#include <ssdef.h>
#include <starlet.h>

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