Fix some random generator problems.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@288 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Björn Groenvall
1996-03-08 11:46:54 +00:00
parent 2ac8c61f4a
commit 66db417091
2 changed files with 20 additions and 12 deletions

View File

@@ -69,6 +69,7 @@ int des_key_sched __P((des_cblock *key,des_key_schedule schedule));
int des_string_to_key __P((char *str,des_cblock *key)); int des_string_to_key __P((char *str,des_cblock *key));
int des_string_to_2keys __P((char *str,des_cblock *key1,des_cblock *key2)); int des_string_to_2keys __P((char *str,des_cblock *key1,des_cblock *key2));
void des_rand_data __P((unsigned char *data, int size));
void des_set_random_generator_seed __P((des_cblock *seed)); void des_set_random_generator_seed __P((des_cblock *seed));
int des_new_random_key __P((des_cblock *key)); int des_new_random_key __P((des_cblock *key));
void des_init_random_number_generator __P((des_cblock *seed)); void des_init_random_number_generator __P((des_cblock *seed));

View File

@@ -43,17 +43,23 @@ sigALRM(int sig)
* This is a slooow routine but it's meant to be slow. * This is a slooow routine but it's meant to be slow.
* It's not neccessary to be root to run it. * It's not neccessary to be root to run it.
*/ */
static
void void
des_clock_rand(unsigned char *data, int size) des_rand_data(unsigned char *data, int size)
{ {
struct itimerval tv, otv; struct itimerval tv, otv;
struct sigaction sa, osa; struct sigaction sa, osa;
int i; int i;
/* /*
* First try to open /dev/random. * If there is a /dev/random it's use is preferred.
*/ */
{
int fd = open("/dev/random", O_RDONLY);
if (fd != -1 && read(fd, data, size) == size)
return;
if (fd != -1)
close(fd);
}
gdata = data; gdata = data;
gsize = size; gsize = size;
@@ -73,10 +79,11 @@ des_clock_rand(unsigned char *data, int size)
for(i = 0; i < 4; i++) for(i = 0; i < 4; i++)
{ {
for (igdata = 0; igdata < gsize;) int j;
for (igdata = 0; igdata < size;) /* igdata++ in sigALRM */
counter++; counter++;
for (igdata = 0; igdata < gsize; igdata++) for (j = 0; j < size; j++) /* Only use 2 bits each lap */
gdata[igdata] = (gdata[igdata]>>2) | (gdata[igdata]<<6); gdata[j] = (gdata[j]>>2) | (gdata[j]<<6);
} }
setitimer(ITIMER_REAL, &otv, 0); setitimer(ITIMER_REAL, &otv, 0);
sigaction(SIGALRM, &osa, 0); sigaction(SIGALRM, &osa, 0);
@@ -87,13 +94,13 @@ des_clock_rand(unsigned char *data, int size)
* Generate a "random" DES key. * Generate a "random" DES key.
*/ */
void void
des_clock_rand_key(des_cblock *key) des_rand_data_key(des_cblock *key)
{ {
unsigned char data[8]; unsigned char data[8];
des_key_schedule sched; des_key_schedule sched;
do { do {
des_clock_rand(data, sizeof(data)); des_rand_data(data, sizeof(data));
des_clock_rand((unsigned char*)key, sizeof(des_cblock)); des_rand_data((unsigned char*)key, sizeof(des_cblock));
des_set_odd_parity(key); des_set_odd_parity(key);
des_key_sched(key, sched); des_key_sched(key, sched);
des_ecb_encrypt(&data, key, sched, DES_ENCRYPT); des_ecb_encrypt(&data, key, sched, DES_ENCRYPT);
@@ -126,7 +133,7 @@ do_initialize(void)
{ {
des_cblock default_seed; des_cblock default_seed;
do { do {
des_clock_rand((unsigned char*)&default_seed, sizeof(default_seed)); des_rand_data((unsigned char*)&default_seed, sizeof(default_seed));
des_set_odd_parity(&default_seed); des_set_odd_parity(&default_seed);
} while (des_is_weak_key(&default_seed)); } while (des_is_weak_key(&default_seed));
des_init_random_number_generator(&default_seed); des_init_random_number_generator(&default_seed);
@@ -199,7 +206,7 @@ des_init_random_number_generator(des_cblock *seed)
gettimeofday(&now, (struct timezone *)0); gettimeofday(&now, (struct timezone *)0);
if (uniq[0] == 0 && uniq[1] == 0) if (uniq[0] == 0 && uniq[1] == 0)
des_clock_rand((unsigned char *)uniq, sizeof(uniq)); des_rand_data((unsigned char *)uniq, sizeof(uniq));
/* Pick a unique random key from the shared sequence. */ /* Pick a unique random key from the shared sequence. */
des_set_random_generator_seed(seed); des_set_random_generator_seed(seed);
@@ -231,7 +238,7 @@ main()
while (1) while (1)
{ {
des_clock_rand(data, 8); des_rand_data(data, 8);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
printf("%02x", data[i]); printf("%02x", data[i]);
printf("\n"); printf("\n");