Annotation of embedaddon/hping2/random.c, revision 1.1.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>