From 234a5f7a3afac51e0e995b329a2b4b91e03a95f3 Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Sat, 14 Sep 1996 21:11:14 +0000 Subject: [PATCH] Hack for systems that lack setitimer (like crays). git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@738 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/des/rnd_keys.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/lib/des/rnd_keys.c b/lib/des/rnd_keys.c index 910ca5d86..f21165e53 100644 --- a/lib/des/rnd_keys.c +++ b/lib/des/rnd_keys.c @@ -112,22 +112,37 @@ sigALRM(int sig) SIGRETURN(0); } -#if !defined(HAVE_SETITIMER) && defined(HAVE_RANDOM) +#ifdef HAVE_RANDOM /* XXX this is a quick hack, should be fixed */ void -des_rand_data(unsigned char *data, int size) +des_not_rand_data(unsigned char *data, int size) { int i; srandom (time (NULL)); for(i = 0; i < size; ++i) - data[i] = random() % 0x100; + data[i] ^= random() % 0x100; } -#else +#endif + +#ifndef HAVE_SETITIMER +void pacemaker(struct timeval *tv) +{ + fd_set fds; + pid_t pid; + pid = getppid(); + while(1){ + FD_ZERO(&fds); + FD_SET(0, &fds); + select(1, &fds, NULL, NULL, tv); + kill(pid, SIGALRM); + } +} +#endif /* * Generate size bytes of "random" data using timed interrupts. @@ -140,6 +155,7 @@ des_rand_data(unsigned char *data, int size) struct itimerval tv, otv; struct sigaction sa, osa; int i, j; + pid_t pid; /* * If there is a /dev/random it's use is preferred. @@ -181,7 +197,17 @@ des_rand_data(unsigned char *data, int size) tv.it_value.tv_sec = 0; tv.it_value.tv_usec = 10 * 1000; /* 10 ms */ tv.it_interval = tv.it_value; +#ifdef HAVE_SETITIMER setitimer(ITIMER_REAL, &tv, &otv); +#else + pid = fork(); + if(pid == -1){ + des_not_rand_data(data, size); + return; + } + if(pid == 0) + pacemaker(&tv.it_interval); +#endif for(i = 0; i < 4; i++) { for (igdata = 0; igdata < size;) /* igdata++ in sigALRM */ @@ -189,10 +215,13 @@ des_rand_data(unsigned char *data, int size) for (j = 0; j < size; j++) /* Only use 2 bits each lap */ gdata[j] = (gdata[j]>>2) | (gdata[j]<<6); } +#ifdef HAVE_SETITIMER setitimer(ITIMER_REAL, &otv, 0); +#else + kill(pid, SIGKILL); +#endif sigaction(SIGALRM, &osa, 0); } -#endif void des_generate_random_block(des_cblock *block)