Annotation of embedaddon/hping2/random.c, revision 1.1
1.1 ! misho 1: /* rc4-based pseudo-random number generator for hping.
! 2: * Copyright (C) 2003 Salvatore Sanfilippo
! 3: * This software is released under the GPL license
! 4: * All rights reserved */
! 5:
! 6: #include <sys/types.h>
! 7: #include <sys/stat.h>
! 8: #include <fcntl.h>
! 9: #include <unistd.h>
! 10: #include <sys/time.h>
! 11: #include <time.h>
! 12:
! 13: u_int32_t hp_rand(void);
! 14:
! 15: /* The rc4 sbox */
! 16: static unsigned char rc4_sbox[256];
! 17: /* This flags is used to initialize the sbox the first time,
! 18: * without an explicit intialization step outside this file. */
! 19: static int rc4_seedflag = 0;
! 20:
! 21: /* Initialize the sbox with pseudo random data */
! 22: static void hp_rand_init(void)
! 23: {
! 24: int i, fd;
! 25:
! 26: /* Strong sbox initialization */
! 27: fd = open("/dev/urandom", O_RDONLY);
! 28: if (fd != -1) {
! 29: read(fd, rc4_sbox, 256);
! 30: close(fd);
! 31: }
! 32: /* Weaker sbox initialization */
! 33: for (i = 0; i < 256; i++) {
! 34: struct timeval tv;
! 35: gettimeofday(&tv, NULL);
! 36: if (i&1)
! 37: rc4_sbox[i] ^= (tv.tv_usec >> (i&0xF)) & 0xFF;
! 38: else
! 39: rc4_sbox[i] ^= (tv.tv_sec >> (i&0xF)) & 0xFF;
! 40: }
! 41: rc4_seedflag = 1;
! 42: }
! 43:
! 44: #if 0
! 45: /* Re-seed the generator with user-provided bytes. Not used for now. */
! 46: static void hp_rand_seed(void *seed, size_t len)
! 47: {
! 48: int i;
! 49:
! 50: if (len > 256) len = 256;
! 51: memcpy(rc4_sbox, seed, len);
! 52: /* discard the first 256 bytes of output after the reseed */
! 53: for (i = 0; i < 32; i++)
! 54: (void) hp_rand();
! 55: }
! 56: #endif
! 57:
! 58: /* Generates a 32bit random number using an RC4-like algorithm */
! 59: u_int32_t hp_rand(void)
! 60: {
! 61: u_int32_t r = 0;
! 62: unsigned char *rc = (unsigned char*) &r;
! 63: static unsigned int i = 0, j = 0;
! 64: unsigned int si, sj, x;
! 65:
! 66: /* initialization, only needed the first time */
! 67: if (!rc4_seedflag)
! 68: hp_rand_init();
! 69: /* generates 4 bytes of pseudo-random data using RC4 */
! 70: for (x = 0; x < 4; x++) {
! 71: i = (i+1) & 0xff;
! 72: si = rc4_sbox[i];
! 73: j = (j + si) & 0xff;
! 74: sj = rc4_sbox[j];
! 75: rc4_sbox[i] = sj;
! 76: rc4_sbox[j] = si;
! 77: *rc++ = rc4_sbox[(si+sj)&0xff];
! 78: }
! 79: return r;
! 80: }
! 81:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>