2 * kern_random.c -- A strong random number generator
4 * $FreeBSD: src/sys/kern/kern_random.c,v 1.36.2.4 2002/09/17 17:11:57 sam Exp $
6 * Version 0.95, last modified 18-Oct-95
8 * Copyright Theodore Ts'o, 1994, 1995. All rights reserved.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, and the entire permission notice in its entirety,
15 * including the disclaimer of warranties.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. The name of the author may not be used to endorse or promote
20 * products derived from this software without specific prior
23 * ALTERNATIVELY, this product may be distributed under the terms of
24 * the GNU Public License, in which case the provisions of the GPL are
25 * required INSTEAD OF the above restrictions. (This clause is
26 * necessary due to a potential bad interaction between the GPL and
27 * the restrictions contained in a BSD-style copyright.)
29 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
30 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
31 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
32 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
33 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39 * OF THE POSSIBILITY OF SUCH DAMAGE.
42 #include <sys/param.h>
43 #include <sys/kernel.h>
46 #include <sys/random.h>
47 #include <sys/select.h>
48 #include <sys/systm.h>
51 #include <i386/isa/icu.h>
55 XXX the below should be used. However there is too much "16"
56 hardcodeing in kern_random.c right now. -- obrien
57 #include <machine/ipl.h>
59 #define ICU_LEN (NHWI)
61 #define ICU_LEN (NSWI)
70 * The pool is stirred with a primitive polynomial of degree 128
71 * over GF(2), namely x^128 + x^99 + x^59 + x^31 + x^9 + x^7 + 1.
72 * For a pool of size 64, try x^64+x^62+x^38+x^10+x^6+x+1.
74 #define POOLWORDS 128 /* Power of 2 - note that this is 32-bit words */
75 #define POOLBITS (POOLWORDS*32)
78 #define TAP1 99 /* The polynomial taps */
84 #define TAP1 62 /* The polynomial taps */
90 #error No primitive polynomial available for chosen POOLWORDS
93 #define WRITEBUFFER 512 /* size in bytes */
95 /* There is actually only one of these, globally. */
96 struct random_bucket {
104 /* There is one of these per entropy source */
105 struct timer_rand_state {
111 static struct random_bucket random_state;
112 static u_int32_t random_pool[POOLWORDS];
113 static struct timer_rand_state keyboard_timer_state;
114 static struct timer_rand_state extract_timer_state;
115 static struct timer_rand_state irq_timer_state[ICU_LEN];
117 static struct timer_rand_state blkdev_timer_state[MAX_BLKDEV];
119 static struct wait_queue *random_wait;
122 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
126 rand_initialize(void)
128 random_state.add_ptr = 0;
129 random_state.entropy_count = 0;
130 random_state.pool = random_pool;
132 random_state.rsel.si_flags = 0;
133 random_state.rsel.si_pid = 0;
137 * This function adds an int into the entropy "pool". It does not
138 * update the entropy estimate. The caller must do this if appropriate.
140 * The pool is stirred with a primitive polynomial of degree 128
141 * over GF(2), namely x^128 + x^99 + x^59 + x^31 + x^9 + x^7 + 1.
142 * For a pool of size 64, try x^64+x^62+x^38+x^10+x^6+x+1.
144 * We rotate the input word by a changing number of bits, to help
145 * assure that all bits in the entropy get toggled. Otherwise, if we
146 * consistently feed the entropy pool small numbers (like ticks and
147 * scancodes, for example), the upper bits of the entropy pool don't
148 * get affected. --- TYT, 10/11/95
151 add_entropy_word(struct random_bucket *r, const u_int32_t input)
156 w = (input << r->input_rotate) | (input >> (32 - r->input_rotate));
157 i = r->add_ptr = (r->add_ptr - 1) & (POOLWORDS-1);
159 r->input_rotate = (r->input_rotate + 7) & 31;
162 * At the beginning of the pool, add an extra 7 bits
163 * rotation, so that successive passes spread the
164 * input bits across the pool evenly.
166 r->input_rotate = (r->input_rotate + 14) & 31;
168 /* XOR in the various taps */
169 w ^= r->pool[(i+TAP1)&(POOLWORDS-1)];
170 w ^= r->pool[(i+TAP2)&(POOLWORDS-1)];
171 w ^= r->pool[(i+TAP3)&(POOLWORDS-1)];
172 w ^= r->pool[(i+TAP4)&(POOLWORDS-1)];
173 w ^= r->pool[(i+TAP5)&(POOLWORDS-1)];
175 /* Rotate w left 1 bit (stolen from SHA) and store */
176 r->pool[i] = (w << 1) | (w >> 31);
180 * This function adds entropy to the entropy "pool" by using timing
181 * delays. It uses the timer_rand_state structure to make an estimate
182 * of how any bits of entropy this call has added to the pool.
184 * The number "num" is also added to the pool - it should somehow describe
185 * the type of event which just happened. This is currently 0-255 for
186 * keyboard scan codes, and 256 upwards for interrupts.
187 * On the i386, this is assumed to be at most 16 bits, and the high bits
188 * are used for a high-resolution timer.
191 add_timer_randomness(struct random_bucket *r, struct timer_rand_state *state,
197 struct timecounter *tc;
200 num ^= tc->tc_get_timecount(tc) << 16;
201 r->entropy_count += 2;
205 add_entropy_word(r, (u_int32_t) num);
206 add_entropy_word(r, time);
209 * Calculate number of bits of randomness we probably
210 * added. We take into account the first and second order
211 * deltas in order to make our estimate.
213 delta = time - state->last_time;
214 state->last_time = time;
216 delta2 = delta - state->last_delta;
217 state->last_delta = delta;
219 if (delta < 0) delta = -delta;
220 if (delta2 < 0) delta2 = -delta2;
221 delta = MIN(delta, delta2) >> 1;
222 for (nbits = 0; delta; nbits++)
225 r->entropy_count += nbits;
227 /* Prevent overflow */
228 if (r->entropy_count > POOLBITS)
229 r->entropy_count = POOLBITS;
231 if (r->entropy_count >= 8)
232 selwakeup(&random_state.rsel);
236 add_keyboard_randomness(u_char scancode)
238 add_timer_randomness(&random_state, &keyboard_timer_state, scancode);
242 add_interrupt_randomness(void *vsc)
245 struct random_softc *sc = vsc;
247 (sc->sc_handler)(sc->sc_arg);
249 add_timer_randomness(&random_state, &irq_timer_state[intr], intr);
254 add_blkdev_randomness(int major)
256 if (major >= MAX_BLKDEV)
259 add_timer_randomness(&random_state, &blkdev_timer_state[major],
265 #error extract_entropy() assumes that POOLWORDS is a multiple of 16 words.
268 * This function extracts randomness from the "entropy pool", and
269 * returns it in a buffer. This function computes how many remaining
270 * bits of entropy are left in the pool, but it does not restrict the
271 * number of bytes that are actually obtained.
274 extract_entropy(struct random_bucket *r, char *buf, int nbytes)
279 add_timer_randomness(r, &extract_timer_state, nbytes);
281 /* Redundant, but just in case... */
282 if (r->entropy_count > POOLBITS)
283 r->entropy_count = POOLBITS;
284 /* Why is this here? Left in from Ted Ts'o. Perhaps to limit time. */
289 if (r->entropy_count / 8 >= nbytes)
290 r->entropy_count -= nbytes*8;
292 r->entropy_count = 0;
295 /* Hash the pool to get the output */
300 for (i = 0; i < POOLWORDS; i += 16)
301 MD5Transform(tmp, (char *)(r->pool+i));
302 /* Modify pool so next hash will produce different results */
303 add_entropy_word(r, tmp[0]);
304 add_entropy_word(r, tmp[1]);
305 add_entropy_word(r, tmp[2]);
306 add_entropy_word(r, tmp[3]);
308 * Run the MD5 Transform one more time, since we want
309 * to add at least minimal obscuring of the inputs to
310 * add_entropy_word(). --- TYT
312 MD5Transform(tmp, (char *)(r->pool));
314 /* Copy data to destination buffer */
321 /* Wipe data from memory */
322 bzero(tmp, sizeof(tmp));
327 #ifdef notused /* XXX NOT the exported kernel interface */
329 * This function is the exported kernel interface. It returns some
330 * number of good random numbers, suitable for seeding TCP sequence
334 get_random_bytes(void *buf, u_int nbytes)
336 extract_entropy(&random_state, (char *) buf, nbytes);
341 read_random(void *buf, u_int nbytes)
343 if ((nbytes * 8) > random_state.entropy_count)
344 nbytes = random_state.entropy_count / 8;
346 return extract_entropy(&random_state, (char *)buf, nbytes);
350 read_random_unlimited(void *buf, u_int nbytes)
352 return extract_entropy(&random_state, (char *)buf, nbytes);
357 write_random(const char *buf, u_int nbytes)
362 for (i = nbytes, p = (u_int32_t *)buf;
363 i >= sizeof(u_int32_t);
364 i-= sizeof(u_int32_t), p++)
365 add_entropy_word(&random_state, *p);
369 add_entropy_word(&random_state, word);
376 add_true_randomness(int val)
378 add_entropy_word(&random_state, val);
379 random_state.entropy_count += 8*sizeof (val);
380 if (random_state.entropy_count > POOLBITS)
381 random_state.entropy_count = POOLBITS;
382 selwakeup(&random_state.rsel);
386 random_poll(dev_t dev, int events, struct proc *p)
392 if (events & (POLLIN | POLLRDNORM)) {
393 if (random_state.entropy_count >= 8)
394 revents |= events & (POLLIN | POLLRDNORM);
396 selrecord(p, &random_state.rsel);
399 if (events & (POLLOUT | POLLWRNORM))
400 revents |= events & (POLLOUT | POLLWRNORM); /* heh */