diff options
Diffstat (limited to 'drivers/char/random.c')
| -rw-r--r-- | drivers/char/random.c | 1447 | 
1 files changed, 754 insertions, 693 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c index 5a1aa64f4e7..71529e196b8 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -125,20 +125,32 @@   * The current exported interfaces for gathering environmental noise   * from the devices are:   * + *	void add_device_randomness(const void *buf, unsigned int size);   * 	void add_input_randomness(unsigned int type, unsigned int code,   *                                unsigned int value); - * 	void add_interrupt_randomness(int irq); + *	void add_interrupt_randomness(int irq, int irq_flags); + * 	void add_disk_randomness(struct gendisk *disk); + * + * add_device_randomness() is for adding data to the random pool that + * is likely to differ between two devices (or possibly even per boot). + * This would be things like MAC addresses or serial numbers, or the + * read-out of the RTC. This does *not* add any actual entropy to the + * pool, but it initializes the pool to different values for devices + * that might otherwise be identical and have very little entropy + * available to them (particularly common in the embedded world).   *   * add_input_randomness() uses the input layer interrupt timing, as well as   * the event type information from the hardware.   * - * add_interrupt_randomness() uses the inter-interrupt timing as random - * inputs to the entropy pool.  Note that not all interrupts are good - * sources of randomness!  For example, the timer interrupts is not a - * good choice, because the periodicity of the interrupts is too - * regular, and hence predictable to an attacker.  Disk interrupts are - * a better measure, since the timing of the disk interrupts are more - * unpredictable. + * add_interrupt_randomness() uses the interrupt timing as random + * inputs to the entropy pool. Using the cycle counters and the irq source + * as inputs, it feeds the randomness roughly once a second. + * + * add_disk_randomness() uses what amounts to the seek time of block + * layer request events, on a per-disk_devt basis, as input to the + * entropy pool. Note that high-speed solid state drives with very low + * seek times do not make for good sources of entropy, as their seek + * times are usually fairly consistent.   *   * All of these routines try to estimate how many bits of randomness a   * particular randomness source.  They do this by keeping track of the @@ -241,137 +253,149 @@  #include <linux/percpu.h>  #include <linux/cryptohash.h>  #include <linux/fips.h> - -#ifdef CONFIG_GENERIC_HARDIRQS -# include <linux/irq.h> -#endif +#include <linux/ptrace.h> +#include <linux/kmemcheck.h> +#include <linux/workqueue.h> +#include <linux/irq.h>  #include <asm/processor.h>  #include <asm/uaccess.h>  #include <asm/irq.h> +#include <asm/irq_regs.h>  #include <asm/io.h> +#define CREATE_TRACE_POINTS +#include <trace/events/random.h> +  /*   * Configuration information   */ -#define INPUT_POOL_WORDS 128 -#define OUTPUT_POOL_WORDS 32 -#define SEC_XFER_SIZE 512 -#define EXTRACT_SIZE 10 +#define INPUT_POOL_SHIFT	12 +#define INPUT_POOL_WORDS	(1 << (INPUT_POOL_SHIFT-5)) +#define OUTPUT_POOL_SHIFT	10 +#define OUTPUT_POOL_WORDS	(1 << (OUTPUT_POOL_SHIFT-5)) +#define SEC_XFER_SIZE		512 +#define EXTRACT_SIZE		10 + +#define DEBUG_RANDOM_BOOT 0 + +#define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long)) + +/* + * To allow fractional bits to be tracked, the entropy_count field is + * denominated in units of 1/8th bits. + * + * 2*(ENTROPY_SHIFT + log2(poolbits)) must <= 31, or the multiply in + * credit_entropy_bits() needs to be 64 bits wide. + */ +#define ENTROPY_SHIFT 3 +#define ENTROPY_BITS(r) ((r)->entropy_count >> ENTROPY_SHIFT)  /*   * The minimum number of bits of entropy before we wake up a read on   * /dev/random.  Should be enough to do a significant reseed.   */ -static int random_read_wakeup_thresh = 64; +static int random_read_wakeup_bits = 64;  /*   * If the entropy count falls under this number of bits, then we   * should wake up processes which are selecting or polling on write   * access to /dev/random.   */ -static int random_write_wakeup_thresh = 128; +static int random_write_wakeup_bits = 28 * OUTPUT_POOL_WORDS;  /* - * When the input pool goes over trickle_thresh, start dropping most - * samples to avoid wasting CPU time and reduce lock contention. + * The minimum number of seconds between urandom pool reseeding.  We + * do this to limit the amount of entropy that can be drained from the + * input pool even if there are heavy demands on /dev/urandom.   */ - -static int trickle_thresh __read_mostly = INPUT_POOL_WORDS * 28; - -static DEFINE_PER_CPU(int, trickle_count); +static int random_min_urandom_seed = 60;  /* - * A pool of size .poolwords is stirred with a primitive polynomial - * of degree .poolwords over GF(2).  The taps for various sizes are - * defined below.  They are chosen to be evenly spaced (minimum RMS - * distance from evenly spaced; the numbers in the comments are a - * scaled squared error sum) except for the last tap, which is 1 to - * get the twisting happening as fast as possible. + * Originally, we used a primitive polynomial of degree .poolwords + * over GF(2).  The taps for various sizes are defined below.  They + * were chosen to be evenly spaced except for the last tap, which is 1 + * to get the twisting happening as fast as possible. + * + * For the purposes of better mixing, we use the CRC-32 polynomial as + * well to make a (modified) twisted Generalized Feedback Shift + * Register.  (See M. Matsumoto & Y. Kurita, 1992.  Twisted GFSR + * generators.  ACM Transactions on Modeling and Computer Simulation + * 2(3):179-194.  Also see M. Matsumoto & Y. Kurita, 1994.  Twisted + * GFSR generators II.  ACM Transactions on Modeling and Computer + * Simulation 4:254-266) + * + * Thanks to Colin Plumb for suggesting this. + * + * The mixing operation is much less sensitive than the output hash, + * where we use SHA-1.  All that we want of mixing operation is that + * it be a good non-cryptographic hash; i.e. it not produce collisions + * when fed "random" data of the sort we expect to see.  As long as + * the pool state differs for different inputs, we have preserved the + * input entropy and done a good job.  The fact that an intelligent + * attacker can construct inputs that will produce controlled + * alterations to the pool's state is not important because we don't + * consider such inputs to contribute any randomness.  The only + * property we need with respect to them is that the attacker can't + * increase his/her knowledge of the pool's state.  Since all + * additions are reversible (knowing the final state and the input, + * you can reconstruct the initial state), if an attacker has any + * uncertainty about the initial state, he/she can only shuffle that + * uncertainty about, but never cause any collisions (which would + * decrease the uncertainty). + * + * Our mixing functions were analyzed by Lacharme, Roeck, Strubel, and + * Videau in their paper, "The Linux Pseudorandom Number Generator + * Revisited" (see: http://eprint.iacr.org/2012/251.pdf).  In their + * paper, they point out that we are not using a true Twisted GFSR, + * since Matsumoto & Kurita used a trinomial feedback polynomial (that + * is, with only three taps, instead of the six that we are using). + * As a result, the resulting polynomial is neither primitive nor + * irreducible, and hence does not have a maximal period over + * GF(2**32).  They suggest a slight change to the generator + * polynomial which improves the resulting TGFSR polynomial to be + * irreducible, which we have made here.   */  static struct poolinfo { -	int poolwords; +	int poolbitshift, poolwords, poolbytes, poolbits, poolfracbits; +#define S(x) ilog2(x)+5, (x), (x)*4, (x)*32, (x) << (ENTROPY_SHIFT+5)  	int tap1, tap2, tap3, tap4, tap5;  } poolinfo_table[] = { -	/* x^128 + x^103 + x^76 + x^51 +x^25 + x + 1 -- 105 */ -	{ 128,	103,	76,	51,	25,	1 }, -	/* x^32 + x^26 + x^20 + x^14 + x^7 + x + 1 -- 15 */ -	{ 32,	26,	20,	14,	7,	1 }, +	/* was: x^128 + x^103 + x^76 + x^51 +x^25 + x + 1 */ +	/* x^128 + x^104 + x^76 + x^51 +x^25 + x + 1 */ +	{ S(128),	104,	76,	51,	25,	1 }, +	/* was: x^32 + x^26 + x^20 + x^14 + x^7 + x + 1 */ +	/* x^32 + x^26 + x^19 + x^14 + x^7 + x + 1 */ +	{ S(32),	26,	19,	14,	7,	1 },  #if 0  	/* x^2048 + x^1638 + x^1231 + x^819 + x^411 + x + 1  -- 115 */ -	{ 2048,	1638,	1231,	819,	411,	1 }, +	{ S(2048),	1638,	1231,	819,	411,	1 },  	/* x^1024 + x^817 + x^615 + x^412 + x^204 + x + 1 -- 290 */ -	{ 1024,	817,	615,	412,	204,	1 }, +	{ S(1024),	817,	615,	412,	204,	1 },  	/* x^1024 + x^819 + x^616 + x^410 + x^207 + x^2 + 1 -- 115 */ -	{ 1024,	819,	616,	410,	207,	2 }, +	{ S(1024),	819,	616,	410,	207,	2 },  	/* x^512 + x^411 + x^308 + x^208 + x^104 + x + 1 -- 225 */ -	{ 512,	411,	308,	208,	104,	1 }, +	{ S(512),	411,	308,	208,	104,	1 },  	/* x^512 + x^409 + x^307 + x^206 + x^102 + x^2 + 1 -- 95 */ -	{ 512,	409,	307,	206,	102,	2 }, +	{ S(512),	409,	307,	206,	102,	2 },  	/* x^512 + x^409 + x^309 + x^205 + x^103 + x^2 + 1 -- 95 */ -	{ 512,	409,	309,	205,	103,	2 }, +	{ S(512),	409,	309,	205,	103,	2 },  	/* x^256 + x^205 + x^155 + x^101 + x^52 + x + 1 -- 125 */ -	{ 256,	205,	155,	101,	52,	1 }, +	{ S(256),	205,	155,	101,	52,	1 },  	/* x^128 + x^103 + x^78 + x^51 + x^27 + x^2 + 1 -- 70 */ -	{ 128,	103,	78,	51,	27,	2 }, +	{ S(128),	103,	78,	51,	27,	2 },  	/* x^64 + x^52 + x^39 + x^26 + x^14 + x + 1 -- 15 */ -	{ 64,	52,	39,	26,	14,	1 }, +	{ S(64),	52,	39,	26,	14,	1 },  #endif  }; -#define POOLBITS	poolwords*32 -#define POOLBYTES	poolwords*4 - -/* - * For the purposes of better mixing, we use the CRC-32 polynomial as - * well to make a twisted Generalized Feedback Shift Reigster - * - * (See M. Matsumoto & Y. Kurita, 1992.  Twisted GFSR generators.  ACM - * Transactions on Modeling and Computer Simulation 2(3):179-194. - * Also see M. Matsumoto & Y. Kurita, 1994.  Twisted GFSR generators - * II.  ACM Transactions on Mdeling and Computer Simulation 4:254-266) - * - * Thanks to Colin Plumb for suggesting this. - * - * We have not analyzed the resultant polynomial to prove it primitive; - * in fact it almost certainly isn't.  Nonetheless, the irreducible factors - * of a random large-degree polynomial over GF(2) are more than large enough - * that periodicity is not a concern. - * - * The input hash is much less sensitive than the output hash.  All - * that we want of it is that it be a good non-cryptographic hash; - * i.e. it not produce collisions when fed "random" data of the sort - * we expect to see.  As long as the pool state differs for different - * inputs, we have preserved the input entropy and done a good job. - * The fact that an intelligent attacker can construct inputs that - * will produce controlled alterations to the pool's state is not - * important because we don't consider such inputs to contribute any - * randomness.  The only property we need with respect to them is that - * the attacker can't increase his/her knowledge of the pool's state. - * Since all additions are reversible (knowing the final state and the - * input, you can reconstruct the initial state), if an attacker has - * any uncertainty about the initial state, he/she can only shuffle - * that uncertainty about, but never cause any collisions (which would - * decrease the uncertainty). - * - * The chosen system lets the state of the pool be (essentially) the input - * modulo the generator polymnomial.  Now, for random primitive polynomials, - * this is a universal class of hash functions, meaning that the chance - * of a collision is limited by the attacker's knowledge of the generator - * polynomail, so if it is chosen at random, an attacker can never force - * a collision.  Here, we use a fixed polynomial, but we *can* assume that - * ###--> it is unknown to the processes generating the input entropy. <-### - * Because of this important property, this is a good, collision-resistant - * hash; hash collisions will occur no more often than chance. - */ -  /*   * Static global variables   */ @@ -379,21 +403,6 @@ static DECLARE_WAIT_QUEUE_HEAD(random_read_wait);  static DECLARE_WAIT_QUEUE_HEAD(random_write_wait);  static struct fasync_struct *fasync; -#if 0 -static int debug; -module_param(debug, bool, 0644); -#define DEBUG_ENT(fmt, arg...) do { \ -	if (debug) \ -		printk(KERN_DEBUG "random %04d %04d %04d: " \ -		fmt,\ -		input_pool.entropy_count,\ -		blocking_pool.entropy_count,\ -		nonblocking_pool.entropy_count,\ -		## arg); } while (0) -#else -#define DEBUG_ENT(fmt, arg...) do {} while (0) -#endif -  /**********************************************************************   *   * OS independent entropy store.   Here are the functions which handle @@ -404,20 +413,26 @@ module_param(debug, bool, 0644);  struct entropy_store;  struct entropy_store {  	/* read-only data: */ -	struct poolinfo *poolinfo; +	const struct poolinfo *poolinfo;  	__u32 *pool;  	const char *name;  	struct entropy_store *pull; -	int limit; +	struct work_struct push_work;  	/* read-write data: */ +	unsigned long last_pulled;  	spinlock_t lock; -	unsigned add_ptr; +	unsigned short add_ptr; +	unsigned short input_rotate;  	int entropy_count; -	int input_rotate; +	int entropy_total; +	unsigned int initialized:1; +	unsigned int limit:1; +	unsigned int last_data_init:1;  	__u8 last_data[EXTRACT_SIZE];  }; +static void push_to_pool(struct work_struct *work);  static __u32 input_pool_data[INPUT_POOL_WORDS];  static __u32 blocking_pool_data[OUTPUT_POOL_WORDS];  static __u32 nonblocking_pool_data[OUTPUT_POOL_WORDS]; @@ -426,7 +441,7 @@ static struct entropy_store input_pool = {  	.poolinfo = &poolinfo_table[0],  	.name = "input",  	.limit = 1, -	.lock = __SPIN_LOCK_UNLOCKED(&input_pool.lock), +	.lock = __SPIN_LOCK_UNLOCKED(input_pool.lock),  	.pool = input_pool_data  }; @@ -435,18 +450,26 @@ static struct entropy_store blocking_pool = {  	.name = "blocking",  	.limit = 1,  	.pull = &input_pool, -	.lock = __SPIN_LOCK_UNLOCKED(&blocking_pool.lock), -	.pool = blocking_pool_data +	.lock = __SPIN_LOCK_UNLOCKED(blocking_pool.lock), +	.pool = blocking_pool_data, +	.push_work = __WORK_INITIALIZER(blocking_pool.push_work, +					push_to_pool),  };  static struct entropy_store nonblocking_pool = {  	.poolinfo = &poolinfo_table[1],  	.name = "nonblocking",  	.pull = &input_pool, -	.lock = __SPIN_LOCK_UNLOCKED(&nonblocking_pool.lock), -	.pool = nonblocking_pool_data +	.lock = __SPIN_LOCK_UNLOCKED(nonblocking_pool.lock), +	.pool = nonblocking_pool_data, +	.push_work = __WORK_INITIALIZER(nonblocking_pool.push_work, +					push_to_pool),  }; +static __u32 const twist_table[8] = { +	0x00000000, 0x3b6e20c8, 0x76dc4190, 0x4db26158, +	0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 }; +  /*   * This function adds bytes into the entropy "pool".  It does not   * update the entropy estimate.  The caller should call @@ -457,33 +480,28 @@ static struct entropy_store nonblocking_pool = {   * it's cheap to do so and helps slightly in the expected case where   * the entropy is concentrated in the low-order bits.   */ -static void mix_pool_bytes_extract(struct entropy_store *r, const void *in, -				   int nbytes, __u8 out[64]) +static void _mix_pool_bytes(struct entropy_store *r, const void *in, +			    int nbytes, __u8 out[64])  { -	static __u32 const twist_table[8] = { -		0x00000000, 0x3b6e20c8, 0x76dc4190, 0x4db26158, -		0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 };  	unsigned long i, j, tap1, tap2, tap3, tap4, tap5;  	int input_rotate;  	int wordmask = r->poolinfo->poolwords - 1;  	const char *bytes = in;  	__u32 w; -	unsigned long flags; -	/* Taps are constant, so we can load them without holding r->lock.  */  	tap1 = r->poolinfo->tap1;  	tap2 = r->poolinfo->tap2;  	tap3 = r->poolinfo->tap3;  	tap4 = r->poolinfo->tap4;  	tap5 = r->poolinfo->tap5; -	spin_lock_irqsave(&r->lock, flags); -	input_rotate = r->input_rotate; -	i = r->add_ptr; +	smp_rmb(); +	input_rotate = ACCESS_ONCE(r->input_rotate); +	i = ACCESS_ONCE(r->add_ptr);  	/* mix one byte at a time to simplify size handling and churn faster */  	while (nbytes--) { -		w = rol32(*bytes++, input_rotate & 31); +		w = rol32(*bytes++, input_rotate);  		i = (i - 1) & wordmask;  		/* XOR in the various taps */ @@ -503,53 +521,192 @@ static void mix_pool_bytes_extract(struct entropy_store *r, const void *in,  		 * rotation, so that successive passes spread the  		 * input bits across the pool evenly.  		 */ -		input_rotate += i ? 7 : 14; +		input_rotate = (input_rotate + (i ? 7 : 14)) & 31;  	} -	r->input_rotate = input_rotate; -	r->add_ptr = i; +	ACCESS_ONCE(r->input_rotate) = input_rotate; +	ACCESS_ONCE(r->add_ptr) = i; +	smp_wmb();  	if (out)  		for (j = 0; j < 16; j++)  			((__u32 *)out)[j] = r->pool[(i - j) & wordmask]; +} + +static void __mix_pool_bytes(struct entropy_store *r, const void *in, +			     int nbytes, __u8 out[64]) +{ +	trace_mix_pool_bytes_nolock(r->name, nbytes, _RET_IP_); +	_mix_pool_bytes(r, in, nbytes, out); +} +static void mix_pool_bytes(struct entropy_store *r, const void *in, +			   int nbytes, __u8 out[64]) +{ +	unsigned long flags; + +	trace_mix_pool_bytes(r->name, nbytes, _RET_IP_); +	spin_lock_irqsave(&r->lock, flags); +	_mix_pool_bytes(r, in, nbytes, out);  	spin_unlock_irqrestore(&r->lock, flags);  } -static void mix_pool_bytes(struct entropy_store *r, const void *in, int bytes) +struct fast_pool { +	__u32		pool[4]; +	unsigned long	last; +	unsigned short	count; +	unsigned char	rotate; +	unsigned char	last_timer_intr; +}; + +/* + * This is a fast mixing routine used by the interrupt randomness + * collector.  It's hardcoded for an 128 bit pool and assumes that any + * locks that might be needed are taken by the caller. + */ +static void fast_mix(struct fast_pool *f, __u32 input[4])  { -       mix_pool_bytes_extract(r, in, bytes, NULL); +	__u32		w; +	unsigned	input_rotate = f->rotate; + +	w = rol32(input[0], input_rotate) ^ f->pool[0] ^ f->pool[3]; +	f->pool[0] = (w >> 3) ^ twist_table[w & 7]; +	input_rotate = (input_rotate + 14) & 31; +	w = rol32(input[1], input_rotate) ^ f->pool[1] ^ f->pool[0]; +	f->pool[1] = (w >> 3) ^ twist_table[w & 7]; +	input_rotate = (input_rotate + 7) & 31; +	w = rol32(input[2], input_rotate) ^ f->pool[2] ^ f->pool[1]; +	f->pool[2] = (w >> 3) ^ twist_table[w & 7]; +	input_rotate = (input_rotate + 7) & 31; +	w = rol32(input[3], input_rotate) ^ f->pool[3] ^ f->pool[2]; +	f->pool[3] = (w >> 3) ^ twist_table[w & 7]; +	input_rotate = (input_rotate + 7) & 31; + +	f->rotate = input_rotate; +	f->count++;  }  /* - * Credit (or debit) the entropy store with n bits of entropy + * Credit (or debit) the entropy store with n bits of entropy. + * Use credit_entropy_bits_safe() if the value comes from userspace + * or otherwise should be checked for extreme values.   */  static void credit_entropy_bits(struct entropy_store *r, int nbits)  { -	unsigned long flags; -	int entropy_count; +	int entropy_count, orig; +	const int pool_size = r->poolinfo->poolfracbits; +	int nfrac = nbits << ENTROPY_SHIFT;  	if (!nbits)  		return; -	spin_lock_irqsave(&r->lock, flags); +retry: +	entropy_count = orig = ACCESS_ONCE(r->entropy_count); +	if (nfrac < 0) { +		/* Debit */ +		entropy_count += nfrac; +	} else { +		/* +		 * Credit: we have to account for the possibility of +		 * overwriting already present entropy.	 Even in the +		 * ideal case of pure Shannon entropy, new contributions +		 * approach the full value asymptotically: +		 * +		 * entropy <- entropy + (pool_size - entropy) * +		 *	(1 - exp(-add_entropy/pool_size)) +		 * +		 * For add_entropy <= pool_size/2 then +		 * (1 - exp(-add_entropy/pool_size)) >= +		 *    (add_entropy/pool_size)*0.7869... +		 * so we can approximate the exponential with +		 * 3/4*add_entropy/pool_size and still be on the +		 * safe side by adding at most pool_size/2 at a time. +		 * +		 * The use of pool_size-2 in the while statement is to +		 * prevent rounding artifacts from making the loop +		 * arbitrarily long; this limits the loop to log2(pool_size)*2 +		 * turns no matter how large nbits is. +		 */ +		int pnfrac = nfrac; +		const int s = r->poolinfo->poolbitshift + ENTROPY_SHIFT + 2; +		/* The +2 corresponds to the /4 in the denominator */ + +		do { +			unsigned int anfrac = min(pnfrac, pool_size/2); +			unsigned int add = +				((pool_size - entropy_count)*anfrac*3) >> s; + +			entropy_count += add; +			pnfrac -= anfrac; +		} while (unlikely(entropy_count < pool_size-2 && pnfrac)); +	} -	DEBUG_ENT("added %d entropy credits to %s\n", nbits, r->name); -	entropy_count = r->entropy_count; -	entropy_count += nbits; -	if (entropy_count < 0) { -		DEBUG_ENT("negative entropy/overflow\n"); +	if (unlikely(entropy_count < 0)) { +		pr_warn("random: negative entropy/overflow: pool %s count %d\n", +			r->name, entropy_count); +		WARN_ON(1);  		entropy_count = 0; -	} else if (entropy_count > r->poolinfo->POOLBITS) -		entropy_count = r->poolinfo->POOLBITS; -	r->entropy_count = entropy_count; - -	/* should we wake readers? */ -	if (r == &input_pool && entropy_count >= random_read_wakeup_thresh) { -		wake_up_interruptible(&random_read_wait); -		kill_fasync(&fasync, SIGIO, POLL_IN); +	} else if (entropy_count > pool_size) +		entropy_count = pool_size; +	if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) +		goto retry; + +	r->entropy_total += nbits; +	if (!r->initialized && r->entropy_total > 128) { +		r->initialized = 1; +		r->entropy_total = 0; +		if (r == &nonblocking_pool) { +			prandom_reseed_late(); +			pr_notice("random: %s pool is initialized\n", r->name); +		} +	} + +	trace_credit_entropy_bits(r->name, nbits, +				  entropy_count >> ENTROPY_SHIFT, +				  r->entropy_total, _RET_IP_); + +	if (r == &input_pool) { +		int entropy_bits = entropy_count >> ENTROPY_SHIFT; + +		/* should we wake readers? */ +		if (entropy_bits >= random_read_wakeup_bits) { +			wake_up_interruptible(&random_read_wait); +			kill_fasync(&fasync, SIGIO, POLL_IN); +		} +		/* If the input pool is getting full, send some +		 * entropy to the two output pools, flipping back and +		 * forth between them, until the output pools are 75% +		 * full. +		 */ +		if (entropy_bits > random_write_wakeup_bits && +		    r->initialized && +		    r->entropy_total >= 2*random_read_wakeup_bits) { +			static struct entropy_store *last = &blocking_pool; +			struct entropy_store *other = &blocking_pool; + +			if (last == &blocking_pool) +				other = &nonblocking_pool; +			if (other->entropy_count <= +			    3 * other->poolinfo->poolfracbits / 4) +				last = other; +			if (last->entropy_count <= +			    3 * last->poolinfo->poolfracbits / 4) { +				schedule_work(&last->push_work); +				r->entropy_total = 0; +			} +		}  	} -	spin_unlock_irqrestore(&r->lock, flags); +} + +static void credit_entropy_bits_safe(struct entropy_store *r, int nbits) +{ +	const int nbits_max = (int)(~0U >> (ENTROPY_SHIFT + 1)); + +	/* Cap the value to avoid overflows */ +	nbits = min(nbits,  nbits_max); +	nbits = max(nbits, -nbits_max); + +	credit_entropy_bits(r, nbits);  }  /********************************************************************* @@ -565,44 +722,35 @@ struct timer_rand_state {  	unsigned dont_count_entropy:1;  }; -#ifndef CONFIG_GENERIC_HARDIRQS - -static struct timer_rand_state *irq_timer_state[NR_IRQS]; - -static struct timer_rand_state *get_timer_rand_state(unsigned int irq) -{ -	return irq_timer_state[irq]; -} - -static void set_timer_rand_state(unsigned int irq, -				 struct timer_rand_state *state) -{ -	irq_timer_state[irq] = state; -} - -#else - -static struct timer_rand_state *get_timer_rand_state(unsigned int irq) -{ -	struct irq_desc *desc; - -	desc = irq_to_desc(irq); - -	return desc->timer_rand_state; -} +#define INIT_TIMER_RAND_STATE { INITIAL_JIFFIES, }; -static void set_timer_rand_state(unsigned int irq, -				 struct timer_rand_state *state) +/* + * Add device- or boot-specific data to the input and nonblocking + * pools to help initialize them to unique values. + * + * None of this adds any entropy, it is meant to avoid the + * problem of the nonblocking pool having similar initial state + * across largely identical devices. + */ +void add_device_randomness(const void *buf, unsigned int size)  { -	struct irq_desc *desc; +	unsigned long time = random_get_entropy() ^ jiffies; +	unsigned long flags; -	desc = irq_to_desc(irq); +	trace_add_device_randomness(size, _RET_IP_); +	spin_lock_irqsave(&input_pool.lock, flags); +	_mix_pool_bytes(&input_pool, buf, size, NULL); +	_mix_pool_bytes(&input_pool, &time, sizeof(time), NULL); +	spin_unlock_irqrestore(&input_pool.lock, flags); -	desc->timer_rand_state = state; +	spin_lock_irqsave(&nonblocking_pool.lock, flags); +	_mix_pool_bytes(&nonblocking_pool, buf, size, NULL); +	_mix_pool_bytes(&nonblocking_pool, &time, sizeof(time), NULL); +	spin_unlock_irqrestore(&nonblocking_pool.lock, flags);  } -#endif +EXPORT_SYMBOL(add_device_randomness); -static struct timer_rand_state input_timer_state; +static struct timer_rand_state input_timer_state = INIT_TIMER_RAND_STATE;  /*   * This function adds entropy to the entropy "pool" by using timing @@ -616,23 +764,21 @@ static struct timer_rand_state input_timer_state;   */  static void add_timer_randomness(struct timer_rand_state *state, unsigned num)  { +	struct entropy_store	*r;  	struct { -		cycles_t cycles;  		long jiffies; +		unsigned cycles;  		unsigned num;  	} sample;  	long delta, delta2, delta3;  	preempt_disable(); -	/* if over the trickle threshold, use only 1 in 4096 samples */ -	if (input_pool.entropy_count > trickle_thresh && -	    (__get_cpu_var(trickle_count)++ & 0xfff)) -		goto out;  	sample.jiffies = jiffies; -	sample.cycles = get_cycles(); +	sample.cycles = random_get_entropy();  	sample.num = num; -	mix_pool_bytes(&input_pool, &sample, sizeof(sample)); +	r = nonblocking_pool.initialized ? &input_pool : &nonblocking_pool; +	mix_pool_bytes(r, &sample, sizeof(sample), NULL);  	/*  	 * Calculate number of bits of randomness we probably added. @@ -666,10 +812,8 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)  		 * Round down by 1 bit on general principles,  		 * and limit entropy entimate to 12 bits.  		 */ -		credit_entropy_bits(&input_pool, -				    min_t(int, fls(delta>>1), 11)); +		credit_entropy_bits(r, min_t(int, fls(delta>>1), 11));  	} -out:  	preempt_enable();  } @@ -682,24 +826,71 @@ void add_input_randomness(unsigned int type, unsigned int code,  	if (value == last_value)  		return; -	DEBUG_ENT("input event\n");  	last_value = value;  	add_timer_randomness(&input_timer_state,  			     (type << 4) ^ code ^ (code >> 4) ^ value); +	trace_add_input_randomness(ENTROPY_BITS(&input_pool));  }  EXPORT_SYMBOL_GPL(add_input_randomness); -void add_interrupt_randomness(int irq) +static DEFINE_PER_CPU(struct fast_pool, irq_randomness); + +void add_interrupt_randomness(int irq, int irq_flags)  { -	struct timer_rand_state *state; +	struct entropy_store	*r; +	struct fast_pool	*fast_pool = &__get_cpu_var(irq_randomness); +	struct pt_regs		*regs = get_irq_regs(); +	unsigned long		now = jiffies; +	cycles_t		cycles = random_get_entropy(); +	__u32			input[4], c_high, j_high; +	__u64			ip; +	unsigned long		seed; +	int			credit; + +	c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0; +	j_high = (sizeof(now) > 4) ? now >> 32 : 0; +	input[0] = cycles ^ j_high ^ irq; +	input[1] = now ^ c_high; +	ip = regs ? instruction_pointer(regs) : _RET_IP_; +	input[2] = ip; +	input[3] = ip >> 32; + +	fast_mix(fast_pool, input); + +	if ((fast_pool->count & 63) && !time_after(now, fast_pool->last + HZ)) +		return; -	state = get_timer_rand_state(irq); +	fast_pool->last = now; -	if (state == NULL) -		return; +	r = nonblocking_pool.initialized ? &input_pool : &nonblocking_pool; +	__mix_pool_bytes(r, &fast_pool->pool, sizeof(fast_pool->pool), NULL); + +	/* +	 * If we don't have a valid cycle counter, and we see +	 * back-to-back timer interrupts, then skip giving credit for +	 * any entropy, otherwise credit 1 bit. +	 */ +	credit = 1; +	if (cycles == 0) { +		if (irq_flags & __IRQF_TIMER) { +			if (fast_pool->last_timer_intr) +				credit = 0; +			fast_pool->last_timer_intr = 1; +		} else +			fast_pool->last_timer_intr = 0; +	} + +	/* +	 * If we have architectural seed generator, produce a seed and +	 * add it to the pool.  For the sake of paranoia count it as +	 * 50% entropic. +	 */ +	if (arch_get_random_seed_long(&seed)) { +		__mix_pool_bytes(r, &seed, sizeof(seed), NULL); +		credit += sizeof(seed) * 4; +	} -	DEBUG_ENT("irq event %d\n", irq); -	add_timer_randomness(state, 0x100 + irq); +	credit_entropy_bits(r, credit);  }  #ifdef CONFIG_BLOCK @@ -708,11 +899,10 @@ void add_disk_randomness(struct gendisk *disk)  	if (!disk || !disk->random)  		return;  	/* first major is 1, so we get >= 0x200 here */ -	DEBUG_ENT("disk event %d:%d\n", -		  MAJOR(disk_devt(disk)), MINOR(disk_devt(disk))); -  	add_timer_randomness(disk->random, 0x100 + disk_devt(disk)); +	trace_add_disk_randomness(disk_devt(disk), ENTROPY_BITS(&input_pool));  } +EXPORT_SYMBOL_GPL(add_disk_randomness);  #endif  /********************************************************************* @@ -725,97 +915,149 @@ static ssize_t extract_entropy(struct entropy_store *r, void *buf,  			       size_t nbytes, int min, int rsvd);  /* - * This utility inline function is responsible for transfering entropy + * This utility inline function is responsible for transferring entropy   * from the primary pool to the secondary extraction pool. We make   * sure we pull enough for a 'catastrophic reseed'.   */ +static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes);  static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes)  { -	__u32 tmp[OUTPUT_POOL_WORDS]; - -	if (r->pull && r->entropy_count < nbytes * 8 && -	    r->entropy_count < r->poolinfo->POOLBITS) { -		/* If we're limited, always leave two wakeup worth's BITS */ -		int rsvd = r->limit ? 0 : random_read_wakeup_thresh/4; -		int bytes = nbytes; - -		/* pull at least as many as BYTES as wakeup BITS */ -		bytes = max_t(int, bytes, random_read_wakeup_thresh / 8); -		/* but never more than the buffer size */ -		bytes = min_t(int, bytes, sizeof(tmp)); - -		DEBUG_ENT("going to reseed %s with %d bits " -			  "(%d of %d requested)\n", -			  r->name, bytes * 8, nbytes * 8, r->entropy_count); - -		bytes = extract_entropy(r->pull, tmp, bytes, -					random_read_wakeup_thresh / 8, rsvd); -		mix_pool_bytes(r, tmp, bytes); -		credit_entropy_bits(r, bytes*8); +	if (r->limit == 0 && random_min_urandom_seed) { +		unsigned long now = jiffies; + +		if (time_before(now, +				r->last_pulled + random_min_urandom_seed * HZ)) +			return; +		r->last_pulled = now;  	} +	if (r->pull && +	    r->entropy_count < (nbytes << (ENTROPY_SHIFT + 3)) && +	    r->entropy_count < r->poolinfo->poolfracbits) +		_xfer_secondary_pool(r, nbytes); +} + +static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes) +{ +	__u32	tmp[OUTPUT_POOL_WORDS]; + +	/* For /dev/random's pool, always leave two wakeups' worth */ +	int rsvd_bytes = r->limit ? 0 : random_read_wakeup_bits / 4; +	int bytes = nbytes; + +	/* pull at least as much as a wakeup */ +	bytes = max_t(int, bytes, random_read_wakeup_bits / 8); +	/* but never more than the buffer size */ +	bytes = min_t(int, bytes, sizeof(tmp)); + +	trace_xfer_secondary_pool(r->name, bytes * 8, nbytes * 8, +				  ENTROPY_BITS(r), ENTROPY_BITS(r->pull)); +	bytes = extract_entropy(r->pull, tmp, bytes, +				random_read_wakeup_bits / 8, rsvd_bytes); +	mix_pool_bytes(r, tmp, bytes, NULL); +	credit_entropy_bits(r, bytes*8);  }  /* - * These functions extracts randomness from the "entropy pool", and - * returns it in a buffer. - * - * The min parameter specifies the minimum amount we can pull before - * failing to avoid races that defeat catastrophic reseeding while the - * reserved parameter indicates how much entropy we must leave in the - * pool after each pull to avoid starving other readers. - * - * Note: extract_entropy() assumes that .poolwords is a multiple of 16 words. + * Used as a workqueue function so that when the input pool is getting + * full, we can "spill over" some entropy to the output pools.  That + * way the output pools can store some of the excess entropy instead + * of letting it go to waste.   */ +static void push_to_pool(struct work_struct *work) +{ +	struct entropy_store *r = container_of(work, struct entropy_store, +					      push_work); +	BUG_ON(!r); +	_xfer_secondary_pool(r, random_read_wakeup_bits/8); +	trace_push_to_pool(r->name, r->entropy_count >> ENTROPY_SHIFT, +			   r->pull->entropy_count >> ENTROPY_SHIFT); +} +/* + * This function decides how many bytes to actually take from the + * given pool, and also debits the entropy count accordingly. + */  static size_t account(struct entropy_store *r, size_t nbytes, int min,  		      int reserved)  { -	unsigned long flags; - -	/* Hold lock while accounting */ -	spin_lock_irqsave(&r->lock, flags); +	int entropy_count, orig; +	size_t ibytes, nfrac; -	BUG_ON(r->entropy_count > r->poolinfo->POOLBITS); -	DEBUG_ENT("trying to extract %d bits from %s\n", -		  nbytes * 8, r->name); +	BUG_ON(r->entropy_count > r->poolinfo->poolfracbits);  	/* Can we pull enough? */ -	if (r->entropy_count / 8 < min + reserved) { -		nbytes = 0; -	} else { -		/* If limited, never pull more than available */ -		if (r->limit && nbytes + reserved >= r->entropy_count / 8) -			nbytes = r->entropy_count/8 - reserved; - -		if (r->entropy_count / 8 >= nbytes + reserved) -			r->entropy_count -= nbytes*8; -		else -			r->entropy_count = reserved; - -		if (r->entropy_count < random_write_wakeup_thresh) { -			wake_up_interruptible(&random_write_wait); -			kill_fasync(&fasync, SIGIO, POLL_OUT); -		} +retry: +	entropy_count = orig = ACCESS_ONCE(r->entropy_count); +	ibytes = nbytes; +	/* If limited, never pull more than available */ +	if (r->limit) { +		int have_bytes = entropy_count >> (ENTROPY_SHIFT + 3); + +		if ((have_bytes -= reserved) < 0) +			have_bytes = 0; +		ibytes = min_t(size_t, ibytes, have_bytes);  	} +	if (ibytes < min) +		ibytes = 0; -	DEBUG_ENT("debiting %d entropy credits from %s%s\n", -		  nbytes * 8, r->name, r->limit ? "" : " (unlimited)"); +	if (unlikely(entropy_count < 0)) { +		pr_warn("random: negative entropy count: pool %s count %d\n", +			r->name, entropy_count); +		WARN_ON(1); +		entropy_count = 0; +	} +	nfrac = ibytes << (ENTROPY_SHIFT + 3); +	if ((size_t) entropy_count > nfrac) +		entropy_count -= nfrac; +	else +		entropy_count = 0; -	spin_unlock_irqrestore(&r->lock, flags); +	if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) +		goto retry; + +	trace_debit_entropy(r->name, 8 * ibytes); +	if (ibytes && +	    (r->entropy_count >> ENTROPY_SHIFT) < random_write_wakeup_bits) { +		wake_up_interruptible(&random_write_wait); +		kill_fasync(&fasync, SIGIO, POLL_OUT); +	} -	return nbytes; +	return ibytes;  } +/* + * This function does the actual extraction for extract_entropy and + * extract_entropy_user. + * + * Note: we assume that .poolwords is a multiple of 16 words. + */  static void extract_buf(struct entropy_store *r, __u8 *out)  {  	int i; -	__u32 hash[5], workspace[SHA_WORKSPACE_WORDS]; +	union { +		__u32 w[5]; +		unsigned long l[LONGS(20)]; +	} hash; +	__u32 workspace[SHA_WORKSPACE_WORDS];  	__u8 extract[64]; +	unsigned long flags; + +	/* +	 * If we have an architectural hardware random number +	 * generator, use it for SHA's initial vector +	 */ +	sha_init(hash.w); +	for (i = 0; i < LONGS(20); i++) { +		unsigned long v; +		if (!arch_get_random_long(&v)) +			break; +		hash.l[i] = v; +	}  	/* Generate a hash across the pool, 16 words (512 bits) at a time */ -	sha_init(hash); +	spin_lock_irqsave(&r->lock, flags);  	for (i = 0; i < r->poolinfo->poolwords; i += 16) -		sha_transform(hash, (__u8 *)(r->pool + i), workspace); +		sha_transform(hash.w, (__u8 *)(r->pool + i), workspace);  	/*  	 * We mix the hash back into the pool to prevent backtracking @@ -826,13 +1068,14 @@ static void extract_buf(struct entropy_store *r, __u8 *out)  	 * brute-forcing the feedback as hard as brute-forcing the  	 * hash.  	 */ -	mix_pool_bytes_extract(r, hash, sizeof(hash), extract); +	__mix_pool_bytes(r, hash.w, sizeof(hash.w), extract); +	spin_unlock_irqrestore(&r->lock, flags);  	/*  	 * To avoid duplicates, we atomically extract a portion of the  	 * pool while mixing, and hash one final time.  	 */ -	sha_transform(hash, extract, workspace); +	sha_transform(hash.w, extract, workspace);  	memset(extract, 0, sizeof(extract));  	memset(workspace, 0, sizeof(workspace)); @@ -841,20 +1084,47 @@ static void extract_buf(struct entropy_store *r, __u8 *out)  	 * pattern, we fold it in half. Thus, we always feed back  	 * twice as much data as we output.  	 */ -	hash[0] ^= hash[3]; -	hash[1] ^= hash[4]; -	hash[2] ^= rol32(hash[2], 16); -	memcpy(out, hash, EXTRACT_SIZE); -	memset(hash, 0, sizeof(hash)); +	hash.w[0] ^= hash.w[3]; +	hash.w[1] ^= hash.w[4]; +	hash.w[2] ^= rol32(hash.w[2], 16); + +	memcpy(out, &hash, EXTRACT_SIZE); +	memset(&hash, 0, sizeof(hash));  } +/* + * This function extracts randomness from the "entropy pool", and + * returns it in a buffer. + * + * The min parameter specifies the minimum amount we can pull before + * failing to avoid races that defeat catastrophic reseeding while the + * reserved parameter indicates how much entropy we must leave in the + * pool after each pull to avoid starving other readers. + */  static ssize_t extract_entropy(struct entropy_store *r, void *buf, -			       size_t nbytes, int min, int reserved) +				 size_t nbytes, int min, int reserved)  {  	ssize_t ret = 0, i;  	__u8 tmp[EXTRACT_SIZE];  	unsigned long flags; +	/* if last_data isn't primed, we need EXTRACT_SIZE extra bytes */ +	if (fips_enabled) { +		spin_lock_irqsave(&r->lock, flags); +		if (!r->last_data_init) { +			r->last_data_init = 1; +			spin_unlock_irqrestore(&r->lock, flags); +			trace_extract_entropy(r->name, EXTRACT_SIZE, +					      ENTROPY_BITS(r), _RET_IP_); +			xfer_secondary_pool(r, EXTRACT_SIZE); +			extract_buf(r, tmp); +			spin_lock_irqsave(&r->lock, flags); +			memcpy(r->last_data, tmp, EXTRACT_SIZE); +		} +		spin_unlock_irqrestore(&r->lock, flags); +	} + +	trace_extract_entropy(r->name, nbytes, ENTROPY_BITS(r), _RET_IP_);  	xfer_secondary_pool(r, nbytes);  	nbytes = account(r, nbytes, min, reserved); @@ -881,12 +1151,17 @@ static ssize_t extract_entropy(struct entropy_store *r, void *buf,  	return ret;  } +/* + * This function extracts randomness from the "entropy pool", and + * returns it in a userspace buffer. + */  static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf,  				    size_t nbytes)  {  	ssize_t ret = 0, i;  	__u8 tmp[EXTRACT_SIZE]; +	trace_extract_entropy_user(r->name, nbytes, ENTROPY_BITS(r), _RET_IP_);  	xfer_secondary_pool(r, nbytes);  	nbytes = account(r, nbytes, 0, 0); @@ -920,16 +1195,59 @@ static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf,  /*   * This function is the exported kernel interface.  It returns some - * number of good random numbers, suitable for seeding TCP sequence - * numbers, etc. + * number of good random numbers, suitable for key generation, seeding + * TCP sequence numbers, etc.  It does not rely on the hardware random + * number generator.  For random bytes direct from the hardware RNG + * (when available), use get_random_bytes_arch().   */  void get_random_bytes(void *buf, int nbytes)  { +#if DEBUG_RANDOM_BOOT > 0 +	if (unlikely(nonblocking_pool.initialized == 0)) +		printk(KERN_NOTICE "random: %pF get_random_bytes called " +		       "with %d bits of entropy available\n", +		       (void *) _RET_IP_, +		       nonblocking_pool.entropy_total); +#endif +	trace_get_random_bytes(nbytes, _RET_IP_);  	extract_entropy(&nonblocking_pool, buf, nbytes, 0, 0);  }  EXPORT_SYMBOL(get_random_bytes);  /* + * This function will use the architecture-specific hardware random + * number generator if it is available.  The arch-specific hw RNG will + * almost certainly be faster than what we can do in software, but it + * is impossible to verify that it is implemented securely (as + * opposed, to, say, the AES encryption of a sequence number using a + * key known by the NSA).  So it's useful if we need the speed, but + * only if we're willing to trust the hardware manufacturer not to + * have put in a back door. + */ +void get_random_bytes_arch(void *buf, int nbytes) +{ +	char *p = buf; + +	trace_get_random_bytes_arch(nbytes, _RET_IP_); +	while (nbytes) { +		unsigned long v; +		int chunk = min(nbytes, (int)sizeof(unsigned long)); + +		if (!arch_get_random_long(&v)) +			break; +		 +		memcpy(p, &v, chunk); +		p += chunk; +		nbytes -= chunk; +	} + +	if (nbytes) +		extract_entropy(&nonblocking_pool, p, nbytes, 0, 0); +} +EXPORT_SYMBOL(get_random_bytes_arch); + + +/*   * init_std_data - initialize pool with system data   *   * @r: pool to initialize @@ -940,18 +1258,31 @@ EXPORT_SYMBOL(get_random_bytes);   */  static void init_std_data(struct entropy_store *r)  { -	ktime_t now; -	unsigned long flags; - -	spin_lock_irqsave(&r->lock, flags); -	r->entropy_count = 0; -	spin_unlock_irqrestore(&r->lock, flags); - -	now = ktime_get_real(); -	mix_pool_bytes(r, &now, sizeof(now)); -	mix_pool_bytes(r, utsname(), sizeof(*(utsname()))); +	int i; +	ktime_t now = ktime_get_real(); +	unsigned long rv; + +	r->last_pulled = jiffies; +	mix_pool_bytes(r, &now, sizeof(now), NULL); +	for (i = r->poolinfo->poolbytes; i > 0; i -= sizeof(rv)) { +		if (!arch_get_random_seed_long(&rv) && +		    !arch_get_random_long(&rv)) +			rv = random_get_entropy(); +		mix_pool_bytes(r, &rv, sizeof(rv), NULL); +	} +	mix_pool_bytes(r, utsname(), sizeof(*(utsname())), NULL);  } +/* + * Note that setup_arch() may call add_device_randomness() + * long before we get here. This allows seeding of the pools + * with some platform dependent data very early in the boot + * process. But it limits our options here. We must use + * statically allocated structures that already have all + * initializations complete at compile time. We should also + * take care not to overwrite the precious per platform data + * we were given. + */  static int rand_initialize(void)  {  	init_std_data(&input_pool); @@ -959,25 +1290,7 @@ static int rand_initialize(void)  	init_std_data(&nonblocking_pool);  	return 0;  } -module_init(rand_initialize); - -void rand_initialize_irq(int irq) -{ -	struct timer_rand_state *state; - -	state = get_timer_rand_state(irq); - -	if (state) -		return; - -	/* -	 * If kzalloc returns null, we just won't use that entropy -	 * source. -	 */ -	state = kzalloc(sizeof(struct timer_rand_state), GFP_KERNEL); -	if (state) -		set_timer_rand_state(irq, state); -} +early_initcall(rand_initialize);  #ifdef CONFIG_BLOCK  void rand_initialize_disk(struct gendisk *disk) @@ -989,71 +1302,96 @@ void rand_initialize_disk(struct gendisk *disk)  	 * source.  	 */  	state = kzalloc(sizeof(struct timer_rand_state), GFP_KERNEL); -	if (state) +	if (state) { +		state->last_time = INITIAL_JIFFIES;  		disk->random = state; +	}  }  #endif -static ssize_t -random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) +/* + * Attempt an emergency refill using arch_get_random_seed_long(). + * + * As with add_interrupt_randomness() be paranoid and only + * credit the output as 50% entropic. + */ +static int arch_random_refill(void)  { -	ssize_t n, retval = 0, count = 0; +	const unsigned int nlongs = 64;	/* Arbitrary number */ +	unsigned int n = 0; +	unsigned int i; +	unsigned long buf[nlongs]; -	if (nbytes == 0) +	if (!arch_has_random_seed())  		return 0; -	while (nbytes > 0) { -		n = nbytes; -		if (n > SEC_XFER_SIZE) -			n = SEC_XFER_SIZE; - -		DEBUG_ENT("reading %d bits\n", n*8); - -		n = extract_entropy_user(&blocking_pool, buf, n); - -		DEBUG_ENT("read got %d bits (%d still needed)\n", -			  n*8, (nbytes-n)*8); +	for (i = 0; i < nlongs; i++) { +		if (arch_get_random_seed_long(&buf[n])) +			n++; +	} -		if (n == 0) { -			if (file->f_flags & O_NONBLOCK) { -				retval = -EAGAIN; -				break; -			} +	if (n) { +		unsigned int rand_bytes = n * sizeof(unsigned long); -			DEBUG_ENT("sleeping?\n"); +		mix_pool_bytes(&input_pool, buf, rand_bytes, NULL); +		credit_entropy_bits(&input_pool, rand_bytes*4); +	} -			wait_event_interruptible(random_read_wait, -				input_pool.entropy_count >= -						 random_read_wakeup_thresh); +	return n; +} -			DEBUG_ENT("awake\n"); +static ssize_t +random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) +{ +	ssize_t n; -			if (signal_pending(current)) { -				retval = -ERESTARTSYS; -				break; -			} +	if (nbytes == 0) +		return 0; +	nbytes = min_t(size_t, nbytes, SEC_XFER_SIZE); +	while (1) { +		n = extract_entropy_user(&blocking_pool, buf, nbytes); +		if (n < 0) +			return n; +		trace_random_read(n*8, (nbytes-n)*8, +				  ENTROPY_BITS(&blocking_pool), +				  ENTROPY_BITS(&input_pool)); +		if (n > 0) +			return n; + +		/* Pool is (near) empty.  Maybe wait and retry. */ + +		/* First try an emergency refill */ +		if (arch_random_refill())  			continue; -		} -		if (n < 0) { -			retval = n; -			break; -		} -		count += n; -		buf += n; -		nbytes -= n; -		break;		/* This break makes the device work */ -				/* like a named pipe */ -	} +		if (file->f_flags & O_NONBLOCK) +			return -EAGAIN; -	return (count ? count : retval); +		wait_event_interruptible(random_read_wait, +			ENTROPY_BITS(&input_pool) >= +			random_read_wakeup_bits); +		if (signal_pending(current)) +			return -ERESTARTSYS; +	}  }  static ssize_t  urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)  { -	return extract_entropy_user(&nonblocking_pool, buf, nbytes); +	int ret; + +	if (unlikely(nonblocking_pool.initialized == 0)) +		printk_once(KERN_NOTICE "random: %s urandom read " +			    "with %d bits of entropy available\n", +			    current->comm, nonblocking_pool.entropy_total); + +	nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3)); +	ret = extract_entropy_user(&nonblocking_pool, buf, nbytes); + +	trace_urandom_read(8 * nbytes, ENTROPY_BITS(&nonblocking_pool), +			   ENTROPY_BITS(&input_pool)); +	return ret;  }  static unsigned int @@ -1064,9 +1402,9 @@ random_poll(struct file *file, poll_table * wait)  	poll_wait(file, &random_read_wait, wait);  	poll_wait(file, &random_write_wait, wait);  	mask = 0; -	if (input_pool.entropy_count >= random_read_wakeup_thresh) +	if (ENTROPY_BITS(&input_pool) >= random_read_wakeup_bits)  		mask |= POLLIN | POLLRDNORM; -	if (input_pool.entropy_count < random_write_wakeup_thresh) +	if (ENTROPY_BITS(&input_pool) < random_write_wakeup_bits)  		mask |= POLLOUT | POLLWRNORM;  	return mask;  } @@ -1086,7 +1424,7 @@ write_pool(struct entropy_store *r, const char __user *buffer, size_t count)  		count -= bytes;  		p += bytes; -		mix_pool_bytes(r, buf, bytes); +		mix_pool_bytes(r, buf, bytes, NULL);  		cond_resched();  	} @@ -1117,7 +1455,8 @@ static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg)  	switch (cmd) {  	case RNDGETENTCNT:  		/* inherently racy, no point locking */ -		if (put_user(input_pool.entropy_count, p)) +		ent_count = ENTROPY_BITS(&input_pool); +		if (put_user(ent_count, p))  			return -EFAULT;  		return 0;  	case RNDADDTOENTCNT: @@ -1125,7 +1464,7 @@ static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg)  			return -EPERM;  		if (get_user(ent_count, p))  			return -EFAULT; -		credit_entropy_bits(&input_pool, ent_count); +		credit_entropy_bits_safe(&input_pool, ent_count);  		return 0;  	case RNDADDENTROPY:  		if (!capable(CAP_SYS_ADMIN)) @@ -1140,14 +1479,19 @@ static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg)  				    size);  		if (retval < 0)  			return retval; -		credit_entropy_bits(&input_pool, ent_count); +		credit_entropy_bits_safe(&input_pool, ent_count);  		return 0;  	case RNDZAPENTCNT:  	case RNDCLEARPOOL: -		/* Clear the entropy pool counters. */ +		/* +		 * Clear the entropy pool counters. We no longer clear +		 * the entropy pool, as that's silly. +		 */  		if (!capable(CAP_SYS_ADMIN))  			return -EPERM; -		rand_initialize(); +		input_pool.entropy_count = 0; +		nonblocking_pool.entropy_count = 0; +		blocking_pool.entropy_count = 0;  		return 0;  	default:  		return -EINVAL; @@ -1207,32 +1551,37 @@ EXPORT_SYMBOL(generate_random_uuid);  #include <linux/sysctl.h>  static int min_read_thresh = 8, min_write_thresh; -static int max_read_thresh = INPUT_POOL_WORDS * 32; +static int max_read_thresh = OUTPUT_POOL_WORDS * 32;  static int max_write_thresh = INPUT_POOL_WORDS * 32;  static char sysctl_bootid[16];  /* - * These functions is used to return both the bootid UUID, and random + * This function is used to return both the bootid UUID, and random   * UUID.  The difference is in whether table->data is NULL; if it is,   * then a new UUID is generated and returned to the user.   * - * If the user accesses this via the proc interface, it will be returned - * as an ASCII string in the standard UUID format.  If accesses via the - * sysctl system call, it is returned as 16 bytes of binary data. + * If the user accesses this via the proc interface, the UUID will be + * returned as an ASCII string in the standard UUID format; if via the + * sysctl system call, as 16 bytes of binary data.   */ -static int proc_do_uuid(ctl_table *table, int write, +static int proc_do_uuid(struct ctl_table *table, int write,  			void __user *buffer, size_t *lenp, loff_t *ppos)  { -	ctl_table fake_table; +	struct ctl_table fake_table;  	unsigned char buf[64], tmp_uuid[16], *uuid;  	uuid = table->data;  	if (!uuid) {  		uuid = tmp_uuid; -		uuid[8] = 0; -	} -	if (uuid[8] == 0)  		generate_random_uuid(uuid); +	} else { +		static DEFINE_SPINLOCK(bootid_spinlock); + +		spin_lock(&bootid_spinlock); +		if (!uuid[8]) +			generate_random_uuid(uuid); +		spin_unlock(&bootid_spinlock); +	}  	sprintf(buf, "%pU", uuid); @@ -1242,8 +1591,26 @@ static int proc_do_uuid(ctl_table *table, int write,  	return proc_dostring(&fake_table, write, buffer, lenp, ppos);  } +/* + * Return entropy available scaled to integral bits + */ +static int proc_do_entropy(struct ctl_table *table, int write, +			   void __user *buffer, size_t *lenp, loff_t *ppos) +{ +	struct ctl_table fake_table; +	int entropy_count; + +	entropy_count = *(int *)table->data >> ENTROPY_SHIFT; + +	fake_table.data = &entropy_count; +	fake_table.maxlen = sizeof(entropy_count); + +	return proc_dointvec(&fake_table, write, buffer, lenp, ppos); +} +  static int sysctl_poolsize = INPUT_POOL_WORDS * 32; -ctl_table random_table[] = { +extern struct ctl_table random_table[]; +struct ctl_table random_table[] = {  	{  		.procname	= "poolsize",  		.data		= &sysctl_poolsize, @@ -1255,12 +1622,12 @@ ctl_table random_table[] = {  		.procname	= "entropy_avail",  		.maxlen		= sizeof(int),  		.mode		= 0444, -		.proc_handler	= proc_dointvec, +		.proc_handler	= proc_do_entropy,  		.data		= &input_pool.entropy_count,  	},  	{  		.procname	= "read_wakeup_threshold", -		.data		= &random_read_wakeup_thresh, +		.data		= &random_read_wakeup_bits,  		.maxlen		= sizeof(int),  		.mode		= 0644,  		.proc_handler	= proc_dointvec_minmax, @@ -1269,7 +1636,7 @@ ctl_table random_table[] = {  	},  	{  		.procname	= "write_wakeup_threshold", -		.data		= &random_write_wakeup_thresh, +		.data		= &random_write_wakeup_bits,  		.maxlen		= sizeof(int),  		.mode		= 0644,  		.proc_handler	= proc_dointvec_minmax, @@ -1277,6 +1644,13 @@ ctl_table random_table[] = {  		.extra2		= &max_write_thresh,  	},  	{ +		.procname	= "urandom_min_reseed_secs", +		.data		= &random_min_urandom_seed, +		.maxlen		= sizeof(int), +		.mode		= 0644, +		.proc_handler	= proc_dointvec, +	}, +	{  		.procname	= "boot_id",  		.data		= &sysctl_bootid,  		.maxlen		= 16, @@ -1293,330 +1667,13 @@ ctl_table random_table[] = {  };  #endif 	/* CONFIG_SYSCTL */ -/******************************************************************** - * - * Random functions for networking - * - ********************************************************************/ - -/* - * TCP initial sequence number picking.  This uses the random number - * generator to pick an initial secret value.  This value is hashed - * along with the TCP endpoint information to provide a unique - * starting point for each pair of TCP endpoints.  This defeats - * attacks which rely on guessing the initial TCP sequence number. - * This algorithm was suggested by Steve Bellovin. - * - * Using a very strong hash was taking an appreciable amount of the total - * TCP connection establishment time, so this is a weaker hash, - * compensated for by changing the secret periodically. - */ - -/* F, G and H are basic MD4 functions: selection, majority, parity */ -#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) -#define H(x, y, z) ((x) ^ (y) ^ (z)) - -/* - * The generic round function.  The application is so specific that - * we don't bother protecting all the arguments with parens, as is generally - * good macro practice, in favor of extra legibility. - * Rotation is separate from addition to prevent recomputation - */ -#define ROUND(f, a, b, c, d, x, s)	\ -	(a += f(b, c, d) + x, a = (a << s) | (a >> (32 - s))) -#define K1 0 -#define K2 013240474631UL -#define K3 015666365641UL - -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +static u32 random_int_secret[MD5_MESSAGE_BYTES / 4] ____cacheline_aligned; -static __u32 twothirdsMD4Transform(__u32 const buf[4], __u32 const in[12]) +int random_int_secret_init(void)  { -	__u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; - -	/* Round 1 */ -	ROUND(F, a, b, c, d, in[ 0] + K1,  3); -	ROUND(F, d, a, b, c, in[ 1] + K1,  7); -	ROUND(F, c, d, a, b, in[ 2] + K1, 11); -	ROUND(F, b, c, d, a, in[ 3] + K1, 19); -	ROUND(F, a, b, c, d, in[ 4] + K1,  3); -	ROUND(F, d, a, b, c, in[ 5] + K1,  7); -	ROUND(F, c, d, a, b, in[ 6] + K1, 11); -	ROUND(F, b, c, d, a, in[ 7] + K1, 19); -	ROUND(F, a, b, c, d, in[ 8] + K1,  3); -	ROUND(F, d, a, b, c, in[ 9] + K1,  7); -	ROUND(F, c, d, a, b, in[10] + K1, 11); -	ROUND(F, b, c, d, a, in[11] + K1, 19); - -	/* Round 2 */ -	ROUND(G, a, b, c, d, in[ 1] + K2,  3); -	ROUND(G, d, a, b, c, in[ 3] + K2,  5); -	ROUND(G, c, d, a, b, in[ 5] + K2,  9); -	ROUND(G, b, c, d, a, in[ 7] + K2, 13); -	ROUND(G, a, b, c, d, in[ 9] + K2,  3); -	ROUND(G, d, a, b, c, in[11] + K2,  5); -	ROUND(G, c, d, a, b, in[ 0] + K2,  9); -	ROUND(G, b, c, d, a, in[ 2] + K2, 13); -	ROUND(G, a, b, c, d, in[ 4] + K2,  3); -	ROUND(G, d, a, b, c, in[ 6] + K2,  5); -	ROUND(G, c, d, a, b, in[ 8] + K2,  9); -	ROUND(G, b, c, d, a, in[10] + K2, 13); - -	/* Round 3 */ -	ROUND(H, a, b, c, d, in[ 3] + K3,  3); -	ROUND(H, d, a, b, c, in[ 7] + K3,  9); -	ROUND(H, c, d, a, b, in[11] + K3, 11); -	ROUND(H, b, c, d, a, in[ 2] + K3, 15); -	ROUND(H, a, b, c, d, in[ 6] + K3,  3); -	ROUND(H, d, a, b, c, in[10] + K3,  9); -	ROUND(H, c, d, a, b, in[ 1] + K3, 11); -	ROUND(H, b, c, d, a, in[ 5] + K3, 15); -	ROUND(H, a, b, c, d, in[ 9] + K3,  3); -	ROUND(H, d, a, b, c, in[ 0] + K3,  9); -	ROUND(H, c, d, a, b, in[ 4] + K3, 11); -	ROUND(H, b, c, d, a, in[ 8] + K3, 15); - -	return buf[1] + b; /* "most hashed" word */ -	/* Alternative: return sum of all words? */ -} -#endif - -#undef ROUND -#undef F -#undef G -#undef H -#undef K1 -#undef K2 -#undef K3 - -/* This should not be decreased so low that ISNs wrap too fast. */ -#define REKEY_INTERVAL (300 * HZ) -/* - * Bit layout of the tcp sequence numbers (before adding current time): - * bit 24-31: increased after every key exchange - * bit 0-23: hash(source,dest) - * - * The implementation is similar to the algorithm described - * in the Appendix of RFC 1185, except that - * - it uses a 1 MHz clock instead of a 250 kHz clock - * - it performs a rekey every 5 minutes, which is equivalent - * 	to a (source,dest) tulple dependent forward jump of the - * 	clock by 0..2^(HASH_BITS+1) - * - * Thus the average ISN wraparound time is 68 minutes instead of - * 4.55 hours. - * - * SMP cleanup and lock avoidance with poor man's RCU. - * 			Manfred Spraul <manfred@colorfullife.com> - * - */ -#define COUNT_BITS 8 -#define COUNT_MASK ((1 << COUNT_BITS) - 1) -#define HASH_BITS 24 -#define HASH_MASK ((1 << HASH_BITS) - 1) - -static struct keydata { -	__u32 count; /* already shifted to the final position */ -	__u32 secret[12]; -} ____cacheline_aligned ip_keydata[2]; - -static unsigned int ip_cnt; - -static void rekey_seq_generator(struct work_struct *work); - -static DECLARE_DELAYED_WORK(rekey_work, rekey_seq_generator); - -/* - * Lock avoidance: - * The ISN generation runs lockless - it's just a hash over random data. - * State changes happen every 5 minutes when the random key is replaced. - * Synchronization is performed by having two copies of the hash function - * state and rekey_seq_generator always updates the inactive copy. - * The copy is then activated by updating ip_cnt. - * The implementation breaks down if someone blocks the thread - * that processes SYN requests for more than 5 minutes. Should never - * happen, and even if that happens only a not perfectly compliant - * ISN is generated, nothing fatal. - */ -static void rekey_seq_generator(struct work_struct *work) -{ -	struct keydata *keyptr = &ip_keydata[1 ^ (ip_cnt & 1)]; - -	get_random_bytes(keyptr->secret, sizeof(keyptr->secret)); -	keyptr->count = (ip_cnt & COUNT_MASK) << HASH_BITS; -	smp_wmb(); -	ip_cnt++; -	schedule_delayed_work(&rekey_work, -			      round_jiffies_relative(REKEY_INTERVAL)); -} - -static inline struct keydata *get_keyptr(void) -{ -	struct keydata *keyptr = &ip_keydata[ip_cnt & 1]; - -	smp_rmb(); - -	return keyptr; -} - -static __init int seqgen_init(void) -{ -	rekey_seq_generator(NULL); +	get_random_bytes(random_int_secret, sizeof(random_int_secret));  	return 0;  } -late_initcall(seqgen_init); - -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) -__u32 secure_tcpv6_sequence_number(__be32 *saddr, __be32 *daddr, -				   __be16 sport, __be16 dport) -{ -	__u32 seq; -	__u32 hash[12]; -	struct keydata *keyptr = get_keyptr(); - -	/* The procedure is the same as for IPv4, but addresses are longer. -	 * Thus we must use twothirdsMD4Transform. -	 */ - -	memcpy(hash, saddr, 16); -	hash[4] = ((__force u16)sport << 16) + (__force u16)dport; -	memcpy(&hash[5], keyptr->secret, sizeof(__u32) * 7); - -	seq = twothirdsMD4Transform((const __u32 *)daddr, hash) & HASH_MASK; -	seq += keyptr->count; - -	seq += ktime_to_ns(ktime_get_real()); - -	return seq; -} -EXPORT_SYMBOL(secure_tcpv6_sequence_number); -#endif - -/*  The code below is shamelessly stolen from secure_tcp_sequence_number(). - *  All blames to Andrey V. Savochkin <saw@msu.ru>. - */ -__u32 secure_ip_id(__be32 daddr) -{ -	struct keydata *keyptr; -	__u32 hash[4]; - -	keyptr = get_keyptr(); - -	/* -	 *  Pick a unique starting offset for each IP destination. -	 *  The dest ip address is placed in the starting vector, -	 *  which is then hashed with random data. -	 */ -	hash[0] = (__force __u32)daddr; -	hash[1] = keyptr->secret[9]; -	hash[2] = keyptr->secret[10]; -	hash[3] = keyptr->secret[11]; - -	return half_md4_transform(hash, keyptr->secret); -} - -#ifdef CONFIG_INET - -__u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr, -				 __be16 sport, __be16 dport) -{ -	__u32 seq; -	__u32 hash[4]; -	struct keydata *keyptr = get_keyptr(); - -	/* -	 *  Pick a unique starting offset for each TCP connection endpoints -	 *  (saddr, daddr, sport, dport). -	 *  Note that the words are placed into the starting vector, which is -	 *  then mixed with a partial MD4 over random data. -	 */ -	hash[0] = (__force u32)saddr; -	hash[1] = (__force u32)daddr; -	hash[2] = ((__force u16)sport << 16) + (__force u16)dport; -	hash[3] = keyptr->secret[11]; - -	seq = half_md4_transform(hash, keyptr->secret) & HASH_MASK; -	seq += keyptr->count; -	/* -	 *	As close as possible to RFC 793, which -	 *	suggests using a 250 kHz clock. -	 *	Further reading shows this assumes 2 Mb/s networks. -	 *	For 10 Mb/s Ethernet, a 1 MHz clock is appropriate. -	 *	For 10 Gb/s Ethernet, a 1 GHz clock should be ok, but -	 *	we also need to limit the resolution so that the u32 seq -	 *	overlaps less than one time per MSL (2 minutes). -	 *	Choosing a clock of 64 ns period is OK. (period of 274 s) -	 */ -	seq += ktime_to_ns(ktime_get_real()) >> 6; - -	return seq; -} - -/* Generate secure starting point for ephemeral IPV4 transport port search */ -u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport) -{ -	struct keydata *keyptr = get_keyptr(); -	u32 hash[4]; - -	/* -	 *  Pick a unique starting offset for each ephemeral port search -	 *  (saddr, daddr, dport) and 48bits of random data. -	 */ -	hash[0] = (__force u32)saddr; -	hash[1] = (__force u32)daddr; -	hash[2] = (__force u32)dport ^ keyptr->secret[10]; -	hash[3] = keyptr->secret[11]; - -	return half_md4_transform(hash, keyptr->secret); -} -EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral); - -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) -u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, -			       __be16 dport) -{ -	struct keydata *keyptr = get_keyptr(); -	u32 hash[12]; - -	memcpy(hash, saddr, 16); -	hash[4] = (__force u32)dport; -	memcpy(&hash[5], keyptr->secret, sizeof(__u32) * 7); - -	return twothirdsMD4Transform((const __u32 *)daddr, hash); -} -#endif - -#if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE) -/* Similar to secure_tcp_sequence_number but generate a 48 bit value - * bit's 32-47 increase every key exchange - *       0-31  hash(source, dest) - */ -u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr, -				__be16 sport, __be16 dport) -{ -	u64 seq; -	__u32 hash[4]; -	struct keydata *keyptr = get_keyptr(); - -	hash[0] = (__force u32)saddr; -	hash[1] = (__force u32)daddr; -	hash[2] = ((__force u16)sport << 16) + (__force u16)dport; -	hash[3] = keyptr->secret[11]; - -	seq = half_md4_transform(hash, keyptr->secret); -	seq |= ((u64)keyptr->count) << (32 - HASH_BITS); - -	seq += ktime_to_ns(ktime_get_real()); -	seq &= (1ull << 48) - 1; - -	return seq; -} -EXPORT_SYMBOL(secure_dccp_sequence_number); -#endif - -#endif /* CONFIG_INET */ -  /*   * Get a random word for internal kernel use only. Similar to urandom but @@ -1624,21 +1681,25 @@ EXPORT_SYMBOL(secure_dccp_sequence_number);   * value is not cryptographically secure but for several uses the cost of   * depleting entropy is too high   */ -DEFINE_PER_CPU(__u32 [4], get_random_int_hash); +static DEFINE_PER_CPU(__u32 [MD5_DIGEST_WORDS], get_random_int_hash);  unsigned int get_random_int(void)  { -	struct keydata *keyptr; -	__u32 *hash = get_cpu_var(get_random_int_hash); -	int ret; +	__u32 *hash; +	unsigned int ret; + +	if (arch_get_random_int(&ret)) +		return ret; -	keyptr = get_keyptr(); -	hash[0] += current->pid + jiffies + get_cycles(); +	hash = get_cpu_var(get_random_int_hash); -	ret = half_md4_transform(hash, keyptr->secret); +	hash[0] += current->pid + jiffies + random_get_entropy(); +	md5_transform(hash, random_int_secret); +	ret = hash[0];  	put_cpu_var(get_random_int_hash);  	return ret;  } +EXPORT_SYMBOL(get_random_int);  /*   * randomize_range() returns a start address such that  | 
