1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238#include <linux/utsname.h>
239#include <linux/module.h>
240#include <linux/kernel.h>
241#include <linux/major.h>
242#include <linux/string.h>
243#include <linux/fcntl.h>
244#include <linux/slab.h>
245#include <linux/random.h>
246#include <linux/poll.h>
247#include <linux/init.h>
248#include <linux/fs.h>
249#include <linux/genhd.h>
250#include <linux/interrupt.h>
251#include <linux/mm.h>
252#include <linux/nodemask.h>
253#include <linux/spinlock.h>
254#include <linux/kthread.h>
255#include <linux/percpu.h>
256#include <linux/cryptohash.h>
257#include <linux/fips.h>
258#include <linux/ptrace.h>
259#include <linux/kmemcheck.h>
260#include <linux/workqueue.h>
261#include <linux/irq.h>
262#include <linux/syscalls.h>
263#include <linux/completion.h>
264#include <linux/uuid.h>
265#include <crypto/chacha20.h>
266
267#include <asm/processor.h>
268#include <asm/uaccess.h>
269#include <asm/irq.h>
270#include <asm/irq_regs.h>
271#include <asm/io.h>
272
273#define CREATE_TRACE_POINTS
274#include <trace/events/random.h>
275
276
277
278
279
280
281#define INPUT_POOL_SHIFT 12
282#define INPUT_POOL_WORDS (1 << (INPUT_POOL_SHIFT-5))
283#define OUTPUT_POOL_SHIFT 10
284#define OUTPUT_POOL_WORDS (1 << (OUTPUT_POOL_SHIFT-5))
285#define SEC_XFER_SIZE 512
286#define EXTRACT_SIZE 10
287
288#define DEBUG_RANDOM_BOOT 0
289
290#define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long))
291
292
293
294
295
296
297
298
299#define ENTROPY_SHIFT 3
300#define ENTROPY_BITS(r) ((r)->entropy_count >> ENTROPY_SHIFT)
301
302
303
304
305
306static int random_read_wakeup_bits = 64;
307
308
309
310
311
312
313static int random_write_wakeup_bits = 28 * OUTPUT_POOL_WORDS;
314
315
316
317
318
319
320static int random_min_urandom_seed = 60;
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367static struct poolinfo {
368 int poolbitshift, poolwords, poolbytes, poolbits, poolfracbits;
369#define S(x) ilog2(x)+5, (x), (x)*4, (x)*32, (x) << (ENTROPY_SHIFT+5)
370 int tap1, tap2, tap3, tap4, tap5;
371} poolinfo_table[] = {
372
373
374 { S(128), 104, 76, 51, 25, 1 },
375
376
377 { S(32), 26, 19, 14, 7, 1 },
378#if 0
379
380 { S(2048), 1638, 1231, 819, 411, 1 },
381
382
383 { S(1024), 817, 615, 412, 204, 1 },
384
385
386 { S(1024), 819, 616, 410, 207, 2 },
387
388
389 { S(512), 411, 308, 208, 104, 1 },
390
391
392 { S(512), 409, 307, 206, 102, 2 },
393
394 { S(512), 409, 309, 205, 103, 2 },
395
396
397 { S(256), 205, 155, 101, 52, 1 },
398
399
400 { S(128), 103, 78, 51, 27, 2 },
401
402
403 { S(64), 52, 39, 26, 14, 1 },
404#endif
405};
406
407
408
409
410static DECLARE_WAIT_QUEUE_HEAD(random_read_wait);
411static DECLARE_WAIT_QUEUE_HEAD(random_write_wait);
412static DECLARE_WAIT_QUEUE_HEAD(urandom_init_wait);
413static struct fasync_struct *fasync;
414
415static DEFINE_SPINLOCK(random_ready_list_lock);
416static LIST_HEAD(random_ready_list);
417
418struct crng_state {
419 __u32 state[16];
420 unsigned long init_time;
421 spinlock_t lock;
422};
423
424struct crng_state primary_crng = {
425 .lock = __SPIN_LOCK_UNLOCKED(primary_crng.lock),
426};
427
428
429
430
431
432
433
434
435
436static int crng_init = 0;
437#define crng_ready() (likely(crng_init > 0))
438static int crng_init_cnt = 0;
439#define CRNG_INIT_CNT_THRESH (2*CHACHA20_KEY_SIZE)
440static void _extract_crng(struct crng_state *crng,
441 __u8 out[CHACHA20_BLOCK_SIZE]);
442static void _crng_backtrack_protect(struct crng_state *crng,
443 __u8 tmp[CHACHA20_BLOCK_SIZE], int used);
444static void process_random_ready_list(void);
445
446
447
448
449
450
451
452
453struct entropy_store;
454struct entropy_store {
455
456 const struct poolinfo *poolinfo;
457 __u32 *pool;
458 const char *name;
459 struct entropy_store *pull;
460 struct work_struct push_work;
461
462
463 unsigned long last_pulled;
464 spinlock_t lock;
465 unsigned short add_ptr;
466 unsigned short input_rotate;
467 int entropy_count;
468 int entropy_total;
469 unsigned int initialized:1;
470 unsigned int limit:1;
471 unsigned int last_data_init:1;
472 __u8 last_data[EXTRACT_SIZE];
473};
474
475static ssize_t extract_entropy(struct entropy_store *r, void *buf,
476 size_t nbytes, int min, int rsvd);
477static ssize_t _extract_entropy(struct entropy_store *r, void *buf,
478 size_t nbytes, int fips);
479
480static void crng_reseed(struct crng_state *crng, struct entropy_store *r);
481static void push_to_pool(struct work_struct *work);
482static __u32 input_pool_data[INPUT_POOL_WORDS] __latent_entropy;
483static __u32 blocking_pool_data[OUTPUT_POOL_WORDS] __latent_entropy;
484
485static struct entropy_store input_pool = {
486 .poolinfo = &poolinfo_table[0],
487 .name = "input",
488 .limit = 1,
489 .lock = __SPIN_LOCK_UNLOCKED(input_pool.lock),
490 .pool = input_pool_data
491};
492
493static struct entropy_store blocking_pool = {
494 .poolinfo = &poolinfo_table[1],
495 .name = "blocking",
496 .limit = 1,
497 .pull = &input_pool,
498 .lock = __SPIN_LOCK_UNLOCKED(blocking_pool.lock),
499 .pool = blocking_pool_data,
500 .push_work = __WORK_INITIALIZER(blocking_pool.push_work,
501 push_to_pool),
502};
503
504static __u32 const twist_table[8] = {
505 0x00000000, 0x3b6e20c8, 0x76dc4190, 0x4db26158,
506 0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 };
507
508
509
510
511
512
513
514
515
516
517
518static void _mix_pool_bytes(struct entropy_store *r, const void *in,
519 int nbytes)
520{
521 unsigned long i, tap1, tap2, tap3, tap4, tap5;
522 int input_rotate;
523 int wordmask = r->poolinfo->poolwords - 1;
524 const char *bytes = in;
525 __u32 w;
526
527 tap1 = r->poolinfo->tap1;
528 tap2 = r->poolinfo->tap2;
529 tap3 = r->poolinfo->tap3;
530 tap4 = r->poolinfo->tap4;
531 tap5 = r->poolinfo->tap5;
532
533 input_rotate = r->input_rotate;
534 i = r->add_ptr;
535
536
537 while (nbytes--) {
538 w = rol32(*bytes++, input_rotate);
539 i = (i - 1) & wordmask;
540
541
542 w ^= r->pool[i];
543 w ^= r->pool[(i + tap1) & wordmask];
544 w ^= r->pool[(i + tap2) & wordmask];
545 w ^= r->pool[(i + tap3) & wordmask];
546 w ^= r->pool[(i + tap4) & wordmask];
547 w ^= r->pool[(i + tap5) & wordmask];
548
549
550 r->pool[i] = (w >> 3) ^ twist_table[w & 7];
551
552
553
554
555
556
557
558 input_rotate = (input_rotate + (i ? 7 : 14)) & 31;
559 }
560
561 r->input_rotate = input_rotate;
562 r->add_ptr = i;
563}
564
565static void __mix_pool_bytes(struct entropy_store *r, const void *in,
566 int nbytes)
567{
568 trace_mix_pool_bytes_nolock(r->name, nbytes, _RET_IP_);
569 _mix_pool_bytes(r, in, nbytes);
570}
571
572static void mix_pool_bytes(struct entropy_store *r, const void *in,
573 int nbytes)
574{
575 unsigned long flags;
576
577 trace_mix_pool_bytes(r->name, nbytes, _RET_IP_);
578 spin_lock_irqsave(&r->lock, flags);
579 _mix_pool_bytes(r, in, nbytes);
580 spin_unlock_irqrestore(&r->lock, flags);
581}
582
583struct fast_pool {
584 __u32 pool[4];
585 unsigned long last;
586 unsigned short reg_idx;
587 unsigned char count;
588};
589
590
591
592
593
594
595static void fast_mix(struct fast_pool *f)
596{
597 __u32 a = f->pool[0], b = f->pool[1];
598 __u32 c = f->pool[2], d = f->pool[3];
599
600 a += b; c += d;
601 b = rol32(b, 6); d = rol32(d, 27);
602 d ^= a; b ^= c;
603
604 a += b; c += d;
605 b = rol32(b, 16); d = rol32(d, 14);
606 d ^= a; b ^= c;
607
608 a += b; c += d;
609 b = rol32(b, 6); d = rol32(d, 27);
610 d ^= a; b ^= c;
611
612 a += b; c += d;
613 b = rol32(b, 16); d = rol32(d, 14);
614 d ^= a; b ^= c;
615
616 f->pool[0] = a; f->pool[1] = b;
617 f->pool[2] = c; f->pool[3] = d;
618 f->count++;
619}
620
621static void process_random_ready_list(void)
622{
623 unsigned long flags;
624 struct random_ready_callback *rdy, *tmp;
625
626 spin_lock_irqsave(&random_ready_list_lock, flags);
627 list_for_each_entry_safe(rdy, tmp, &random_ready_list, list) {
628 struct module *owner = rdy->owner;
629
630 list_del_init(&rdy->list);
631 rdy->func(rdy);
632 module_put(owner);
633 }
634 spin_unlock_irqrestore(&random_ready_list_lock, flags);
635}
636
637
638
639
640
641
642static void credit_entropy_bits(struct entropy_store *r, int nbits)
643{
644 int entropy_count, orig;
645 const int pool_size = r->poolinfo->poolfracbits;
646 int nfrac = nbits << ENTROPY_SHIFT;
647
648 if (!nbits)
649 return;
650
651retry:
652 entropy_count = orig = ACCESS_ONCE(r->entropy_count);
653 if (nfrac < 0) {
654
655 entropy_count += nfrac;
656 } else {
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678 int pnfrac = nfrac;
679 const int s = r->poolinfo->poolbitshift + ENTROPY_SHIFT + 2;
680
681
682 do {
683 unsigned int anfrac = min(pnfrac, pool_size/2);
684 unsigned int add =
685 ((pool_size - entropy_count)*anfrac*3) >> s;
686
687 entropy_count += add;
688 pnfrac -= anfrac;
689 } while (unlikely(entropy_count < pool_size-2 && pnfrac));
690 }
691
692 if (unlikely(entropy_count < 0)) {
693 pr_warn("random: negative entropy/overflow: pool %s count %d\n",
694 r->name, entropy_count);
695 WARN_ON(1);
696 entropy_count = 0;
697 } else if (entropy_count > pool_size)
698 entropy_count = pool_size;
699 if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
700 goto retry;
701
702 r->entropy_total += nbits;
703 if (!r->initialized && r->entropy_total > 128) {
704 r->initialized = 1;
705 r->entropy_total = 0;
706 }
707
708 trace_credit_entropy_bits(r->name, nbits,
709 entropy_count >> ENTROPY_SHIFT,
710 r->entropy_total, _RET_IP_);
711
712 if (r == &input_pool) {
713 int entropy_bits = entropy_count >> ENTROPY_SHIFT;
714
715 if (crng_init < 2 && entropy_bits >= 128) {
716 crng_reseed(&primary_crng, r);
717 entropy_bits = r->entropy_count >> ENTROPY_SHIFT;
718 }
719
720
721 if (entropy_bits >= random_read_wakeup_bits) {
722 wake_up_interruptible(&random_read_wait);
723 kill_fasync(&fasync, SIGIO, POLL_IN);
724 }
725
726
727
728 if (entropy_bits > random_write_wakeup_bits &&
729 r->initialized &&
730 r->entropy_total >= 2*random_read_wakeup_bits) {
731 struct entropy_store *other = &blocking_pool;
732
733 if (other->entropy_count <=
734 3 * other->poolinfo->poolfracbits / 4) {
735 schedule_work(&other->push_work);
736 r->entropy_total = 0;
737 }
738 }
739 }
740}
741
742static int credit_entropy_bits_safe(struct entropy_store *r, int nbits)
743{
744 const int nbits_max = (int)(~0U >> (ENTROPY_SHIFT + 1));
745
746 if (nbits < 0)
747 return -EINVAL;
748
749
750 nbits = min(nbits, nbits_max);
751
752 credit_entropy_bits(r, nbits);
753 return 0;
754}
755
756
757
758
759
760
761
762#define CRNG_RESEED_INTERVAL (300*HZ)
763
764static DECLARE_WAIT_QUEUE_HEAD(crng_init_wait);
765
766#ifdef CONFIG_NUMA
767
768
769
770
771
772
773static struct crng_state **crng_node_pool __read_mostly;
774#endif
775
776static void crng_initialize(struct crng_state *crng)
777{
778 int i;
779 unsigned long rv;
780
781 memcpy(&crng->state[0], "expand 32-byte k", 16);
782 if (crng == &primary_crng)
783 _extract_entropy(&input_pool, &crng->state[4],
784 sizeof(__u32) * 12, 0);
785 else
786 get_random_bytes(&crng->state[4], sizeof(__u32) * 12);
787 for (i = 4; i < 16; i++) {
788 if (!arch_get_random_seed_long(&rv) &&
789 !arch_get_random_long(&rv))
790 rv = random_get_entropy();
791 crng->state[i] ^= rv;
792 }
793 crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1;
794}
795
796static int crng_fast_load(const char *cp, size_t len)
797{
798 unsigned long flags;
799 char *p;
800
801 if (!spin_trylock_irqsave(&primary_crng.lock, flags))
802 return 0;
803 if (crng_ready()) {
804 spin_unlock_irqrestore(&primary_crng.lock, flags);
805 return 0;
806 }
807 p = (unsigned char *) &primary_crng.state[4];
808 while (len > 0 && crng_init_cnt < CRNG_INIT_CNT_THRESH) {
809 p[crng_init_cnt % CHACHA20_KEY_SIZE] ^= *cp;
810 cp++; crng_init_cnt++; len--;
811 }
812 if (crng_init_cnt >= CRNG_INIT_CNT_THRESH) {
813 crng_init = 1;
814 wake_up_interruptible(&crng_init_wait);
815 pr_notice("random: fast init done\n");
816 }
817 spin_unlock_irqrestore(&primary_crng.lock, flags);
818 return 1;
819}
820
821static void crng_reseed(struct crng_state *crng, struct entropy_store *r)
822{
823 unsigned long flags;
824 int i, num;
825 union {
826 __u8 block[CHACHA20_BLOCK_SIZE];
827 __u32 key[8];
828 } buf;
829
830 if (r) {
831 num = extract_entropy(r, &buf, 32, 16, 0);
832 if (num == 0)
833 return;
834 } else {
835 _extract_crng(&primary_crng, buf.block);
836 _crng_backtrack_protect(&primary_crng, buf.block,
837 CHACHA20_KEY_SIZE);
838 }
839 spin_lock_irqsave(&primary_crng.lock, flags);
840 for (i = 0; i < 8; i++) {
841 unsigned long rv;
842 if (!arch_get_random_seed_long(&rv) &&
843 !arch_get_random_long(&rv))
844 rv = random_get_entropy();
845 crng->state[i+4] ^= buf.key[i] ^ rv;
846 }
847 memzero_explicit(&buf, sizeof(buf));
848 crng->init_time = jiffies;
849 if (crng == &primary_crng && crng_init < 2) {
850 crng_init = 2;
851 process_random_ready_list();
852 wake_up_interruptible(&crng_init_wait);
853 pr_notice("random: crng init done\n");
854 }
855 spin_unlock_irqrestore(&primary_crng.lock, flags);
856}
857
858static inline void maybe_reseed_primary_crng(void)
859{
860 if (crng_init > 2 &&
861 time_after(jiffies, primary_crng.init_time + CRNG_RESEED_INTERVAL))
862 crng_reseed(&primary_crng, &input_pool);
863}
864
865static inline void crng_wait_ready(void)
866{
867 wait_event_interruptible(crng_init_wait, crng_ready());
868}
869
870static void _extract_crng(struct crng_state *crng,
871 __u8 out[CHACHA20_BLOCK_SIZE])
872{
873 unsigned long v, flags;
874
875 if (crng_init > 1 &&
876 time_after(jiffies, crng->init_time + CRNG_RESEED_INTERVAL))
877 crng_reseed(crng, crng == &primary_crng ? &input_pool : NULL);
878 spin_lock_irqsave(&crng->lock, flags);
879 if (arch_get_random_long(&v))
880 crng->state[14] ^= v;
881 chacha20_block(&crng->state[0], out);
882 if (crng->state[12] == 0)
883 crng->state[13]++;
884 spin_unlock_irqrestore(&crng->lock, flags);
885}
886
887static void extract_crng(__u8 out[CHACHA20_BLOCK_SIZE])
888{
889 struct crng_state *crng = NULL;
890
891#ifdef CONFIG_NUMA
892 if (crng_node_pool)
893 crng = crng_node_pool[numa_node_id()];
894 if (crng == NULL)
895#endif
896 crng = &primary_crng;
897 _extract_crng(crng, out);
898}
899
900
901
902
903
904static void _crng_backtrack_protect(struct crng_state *crng,
905 __u8 tmp[CHACHA20_BLOCK_SIZE], int used)
906{
907 unsigned long flags;
908 __u32 *s, *d;
909 int i;
910
911 used = round_up(used, sizeof(__u32));
912 if (used + CHACHA20_KEY_SIZE > CHACHA20_BLOCK_SIZE) {
913 extract_crng(tmp);
914 used = 0;
915 }
916 spin_lock_irqsave(&crng->lock, flags);
917 s = (__u32 *) &tmp[used];
918 d = &crng->state[4];
919 for (i=0; i < 8; i++)
920 *d++ ^= *s++;
921 spin_unlock_irqrestore(&crng->lock, flags);
922}
923
924static void crng_backtrack_protect(__u8 tmp[CHACHA20_BLOCK_SIZE], int used)
925{
926 struct crng_state *crng = NULL;
927
928#ifdef CONFIG_NUMA
929 if (crng_node_pool)
930 crng = crng_node_pool[numa_node_id()];
931 if (crng == NULL)
932#endif
933 crng = &primary_crng;
934 _crng_backtrack_protect(crng, tmp, used);
935}
936
937static ssize_t extract_crng_user(void __user *buf, size_t nbytes)
938{
939 ssize_t ret = 0, i = CHACHA20_BLOCK_SIZE;
940 __u8 tmp[CHACHA20_BLOCK_SIZE];
941 int large_request = (nbytes > 256);
942
943 while (nbytes) {
944 if (large_request && need_resched()) {
945 if (signal_pending(current)) {
946 if (ret == 0)
947 ret = -ERESTARTSYS;
948 break;
949 }
950 schedule();
951 }
952
953 extract_crng(tmp);
954 i = min_t(int, nbytes, CHACHA20_BLOCK_SIZE);
955 if (copy_to_user(buf, tmp, i)) {
956 ret = -EFAULT;
957 break;
958 }
959
960 nbytes -= i;
961 buf += i;
962 ret += i;
963 }
964 crng_backtrack_protect(tmp, i);
965
966
967 memzero_explicit(tmp, sizeof(tmp));
968
969 return ret;
970}
971
972
973
974
975
976
977
978
979
980struct timer_rand_state {
981 cycles_t last_time;
982 long last_delta, last_delta2;
983 unsigned dont_count_entropy:1;
984};
985
986#define INIT_TIMER_RAND_STATE { INITIAL_JIFFIES, };
987
988
989
990
991
992
993
994
995
996void add_device_randomness(const void *buf, unsigned int size)
997{
998 unsigned long time = random_get_entropy() ^ jiffies;
999 unsigned long flags;
1000
1001 trace_add_device_randomness(size, _RET_IP_);
1002 spin_lock_irqsave(&input_pool.lock, flags);
1003 _mix_pool_bytes(&input_pool, buf, size);
1004 _mix_pool_bytes(&input_pool, &time, sizeof(time));
1005 spin_unlock_irqrestore(&input_pool.lock, flags);
1006}
1007EXPORT_SYMBOL(add_device_randomness);
1008
1009static struct timer_rand_state input_timer_state = INIT_TIMER_RAND_STATE;
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
1022{
1023 struct entropy_store *r;
1024 struct {
1025 long jiffies;
1026 unsigned cycles;
1027 unsigned num;
1028 } sample;
1029 long delta, delta2, delta3;
1030
1031 preempt_disable();
1032
1033 sample.jiffies = jiffies;
1034 sample.cycles = random_get_entropy();
1035 sample.num = num;
1036 r = &input_pool;
1037 mix_pool_bytes(r, &sample, sizeof(sample));
1038
1039
1040
1041
1042
1043
1044
1045 if (!state->dont_count_entropy) {
1046 delta = sample.jiffies - state->last_time;
1047 state->last_time = sample.jiffies;
1048
1049 delta2 = delta - state->last_delta;
1050 state->last_delta = delta;
1051
1052 delta3 = delta2 - state->last_delta2;
1053 state->last_delta2 = delta2;
1054
1055 if (delta < 0)
1056 delta = -delta;
1057 if (delta2 < 0)
1058 delta2 = -delta2;
1059 if (delta3 < 0)
1060 delta3 = -delta3;
1061 if (delta > delta2)
1062 delta = delta2;
1063 if (delta > delta3)
1064 delta = delta3;
1065
1066
1067
1068
1069
1070
1071 credit_entropy_bits(r, min_t(int, fls(delta>>1), 11));
1072 }
1073 preempt_enable();
1074}
1075
1076void add_input_randomness(unsigned int type, unsigned int code,
1077 unsigned int value)
1078{
1079 static unsigned char last_value;
1080
1081
1082 if (value == last_value)
1083 return;
1084
1085 last_value = value;
1086 add_timer_randomness(&input_timer_state,
1087 (type << 4) ^ code ^ (code >> 4) ^ value);
1088 trace_add_input_randomness(ENTROPY_BITS(&input_pool));
1089}
1090EXPORT_SYMBOL_GPL(add_input_randomness);
1091
1092static DEFINE_PER_CPU(struct fast_pool, irq_randomness);
1093
1094#ifdef ADD_INTERRUPT_BENCH
1095static unsigned long avg_cycles, avg_deviation;
1096
1097#define AVG_SHIFT 8
1098#define FIXED_1_2 (1 << (AVG_SHIFT-1))
1099
1100static void add_interrupt_bench(cycles_t start)
1101{
1102 long delta = random_get_entropy() - start;
1103
1104
1105 delta = delta - ((avg_cycles + FIXED_1_2) >> AVG_SHIFT);
1106 avg_cycles += delta;
1107
1108 delta = abs(delta) - ((avg_deviation + FIXED_1_2) >> AVG_SHIFT);
1109 avg_deviation += delta;
1110}
1111#else
1112#define add_interrupt_bench(x)
1113#endif
1114
1115static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs)
1116{
1117 __u32 *ptr = (__u32 *) regs;
1118
1119 if (regs == NULL)
1120 return 0;
1121 if (f->reg_idx >= sizeof(struct pt_regs) / sizeof(__u32))
1122 f->reg_idx = 0;
1123 return *(ptr + f->reg_idx++);
1124}
1125
1126void add_interrupt_randomness(int irq, int irq_flags)
1127{
1128 struct entropy_store *r;
1129 struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness);
1130 struct pt_regs *regs = get_irq_regs();
1131 unsigned long now = jiffies;
1132 cycles_t cycles = random_get_entropy();
1133 __u32 c_high, j_high;
1134 __u64 ip;
1135 unsigned long seed;
1136 int credit = 0;
1137
1138 if (cycles == 0)
1139 cycles = get_reg(fast_pool, regs);
1140 c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0;
1141 j_high = (sizeof(now) > 4) ? now >> 32 : 0;
1142 fast_pool->pool[0] ^= cycles ^ j_high ^ irq;
1143 fast_pool->pool[1] ^= now ^ c_high;
1144 ip = regs ? instruction_pointer(regs) : _RET_IP_;
1145 fast_pool->pool[2] ^= ip;
1146 fast_pool->pool[3] ^= (sizeof(ip) > 4) ? ip >> 32 :
1147 get_reg(fast_pool, regs);
1148
1149 fast_mix(fast_pool);
1150 add_interrupt_bench(cycles);
1151
1152 if (!crng_ready()) {
1153 if ((fast_pool->count >= 64) &&
1154 crng_fast_load((char *) fast_pool->pool,
1155 sizeof(fast_pool->pool))) {
1156 fast_pool->count = 0;
1157 fast_pool->last = now;
1158 }
1159 return;
1160 }
1161
1162 if ((fast_pool->count < 64) &&
1163 !time_after(now, fast_pool->last + HZ))
1164 return;
1165
1166 r = &input_pool;
1167 if (!spin_trylock(&r->lock))
1168 return;
1169
1170 fast_pool->last = now;
1171 __mix_pool_bytes(r, &fast_pool->pool, sizeof(fast_pool->pool));
1172
1173
1174
1175
1176
1177
1178
1179 if (arch_get_random_seed_long(&seed)) {
1180 __mix_pool_bytes(r, &seed, sizeof(seed));
1181 credit = 1;
1182 }
1183 spin_unlock(&r->lock);
1184
1185 fast_pool->count = 0;
1186
1187
1188 credit_entropy_bits(r, credit + 1);
1189}
1190EXPORT_SYMBOL_GPL(add_interrupt_randomness);
1191
1192#ifdef CONFIG_BLOCK
1193void add_disk_randomness(struct gendisk *disk)
1194{
1195 if (!disk || !disk->random)
1196 return;
1197
1198 add_timer_randomness(disk->random, 0x100 + disk_devt(disk));
1199 trace_add_disk_randomness(disk_devt(disk), ENTROPY_BITS(&input_pool));
1200}
1201EXPORT_SYMBOL_GPL(add_disk_randomness);
1202#endif
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes);
1216static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
1217{
1218 if (!r->pull ||
1219 r->entropy_count >= (nbytes << (ENTROPY_SHIFT + 3)) ||
1220 r->entropy_count > r->poolinfo->poolfracbits)
1221 return;
1222
1223 if (r->limit == 0 && random_min_urandom_seed) {
1224 unsigned long now = jiffies;
1225
1226 if (time_before(now,
1227 r->last_pulled + random_min_urandom_seed * HZ))
1228 return;
1229 r->last_pulled = now;
1230 }
1231
1232 _xfer_secondary_pool(r, nbytes);
1233}
1234
1235static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
1236{
1237 __u32 tmp[OUTPUT_POOL_WORDS];
1238
1239
1240 int rsvd_bytes = r->limit ? 0 : random_read_wakeup_bits / 4;
1241 int bytes = nbytes;
1242
1243
1244 bytes = max_t(int, bytes, random_read_wakeup_bits / 8);
1245
1246 bytes = min_t(int, bytes, sizeof(tmp));
1247
1248 trace_xfer_secondary_pool(r->name, bytes * 8, nbytes * 8,
1249 ENTROPY_BITS(r), ENTROPY_BITS(r->pull));
1250 bytes = extract_entropy(r->pull, tmp, bytes,
1251 random_read_wakeup_bits / 8, rsvd_bytes);
1252 mix_pool_bytes(r, tmp, bytes);
1253 credit_entropy_bits(r, bytes*8);
1254}
1255
1256
1257
1258
1259
1260
1261
1262static void push_to_pool(struct work_struct *work)
1263{
1264 struct entropy_store *r = container_of(work, struct entropy_store,
1265 push_work);
1266 BUG_ON(!r);
1267 _xfer_secondary_pool(r, random_read_wakeup_bits/8);
1268 trace_push_to_pool(r->name, r->entropy_count >> ENTROPY_SHIFT,
1269 r->pull->entropy_count >> ENTROPY_SHIFT);
1270}
1271
1272
1273
1274
1275
1276static size_t account(struct entropy_store *r, size_t nbytes, int min,
1277 int reserved)
1278{
1279 int entropy_count, orig;
1280 size_t ibytes, nfrac;
1281
1282 BUG_ON(r->entropy_count > r->poolinfo->poolfracbits);
1283
1284
1285retry:
1286 entropy_count = orig = ACCESS_ONCE(r->entropy_count);
1287 ibytes = nbytes;
1288
1289 if (r->limit) {
1290 int have_bytes = entropy_count >> (ENTROPY_SHIFT + 3);
1291
1292 if ((have_bytes -= reserved) < 0)
1293 have_bytes = 0;
1294 ibytes = min_t(size_t, ibytes, have_bytes);
1295 }
1296 if (ibytes < min)
1297 ibytes = 0;
1298
1299 if (unlikely(entropy_count < 0)) {
1300 pr_warn("random: negative entropy count: pool %s count %d\n",
1301 r->name, entropy_count);
1302 WARN_ON(1);
1303 entropy_count = 0;
1304 }
1305 nfrac = ibytes << (ENTROPY_SHIFT + 3);
1306 if ((size_t) entropy_count > nfrac)
1307 entropy_count -= nfrac;
1308 else
1309 entropy_count = 0;
1310
1311 if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
1312 goto retry;
1313
1314 trace_debit_entropy(r->name, 8 * ibytes);
1315 if (ibytes &&
1316 (r->entropy_count >> ENTROPY_SHIFT) < random_write_wakeup_bits) {
1317 wake_up_interruptible(&random_write_wait);
1318 kill_fasync(&fasync, SIGIO, POLL_OUT);
1319 }
1320
1321 return ibytes;
1322}
1323
1324
1325
1326
1327
1328
1329
1330static void extract_buf(struct entropy_store *r, __u8 *out)
1331{
1332 int i;
1333 union {
1334 __u32 w[5];
1335 unsigned long l[LONGS(20)];
1336 } hash;
1337 __u32 workspace[SHA_WORKSPACE_WORDS];
1338 unsigned long flags;
1339
1340
1341
1342
1343
1344 sha_init(hash.w);
1345 for (i = 0; i < LONGS(20); i++) {
1346 unsigned long v;
1347 if (!arch_get_random_long(&v))
1348 break;
1349 hash.l[i] = v;
1350 }
1351
1352
1353 spin_lock_irqsave(&r->lock, flags);
1354 for (i = 0; i < r->poolinfo->poolwords; i += 16)
1355 sha_transform(hash.w, (__u8 *)(r->pool + i), workspace);
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366 __mix_pool_bytes(r, hash.w, sizeof(hash.w));
1367 spin_unlock_irqrestore(&r->lock, flags);
1368
1369 memzero_explicit(workspace, sizeof(workspace));
1370
1371
1372
1373
1374
1375
1376 hash.w[0] ^= hash.w[3];
1377 hash.w[1] ^= hash.w[4];
1378 hash.w[2] ^= rol32(hash.w[2], 16);
1379
1380 memcpy(out, &hash, EXTRACT_SIZE);
1381 memzero_explicit(&hash, sizeof(hash));
1382}
1383
1384static ssize_t _extract_entropy(struct entropy_store *r, void *buf,
1385 size_t nbytes, int fips)
1386{
1387 ssize_t ret = 0, i;
1388 __u8 tmp[EXTRACT_SIZE];
1389 unsigned long flags;
1390
1391 while (nbytes) {
1392 extract_buf(r, tmp);
1393
1394 if (fips) {
1395 spin_lock_irqsave(&r->lock, flags);
1396 if (!memcmp(tmp, r->last_data, EXTRACT_SIZE))
1397 panic("Hardware RNG duplicated output!\n");
1398 memcpy(r->last_data, tmp, EXTRACT_SIZE);
1399 spin_unlock_irqrestore(&r->lock, flags);
1400 }
1401 i = min_t(int, nbytes, EXTRACT_SIZE);
1402 memcpy(buf, tmp, i);
1403 nbytes -= i;
1404 buf += i;
1405 ret += i;
1406 }
1407
1408
1409 memzero_explicit(tmp, sizeof(tmp));
1410
1411 return ret;
1412}
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423static ssize_t extract_entropy(struct entropy_store *r, void *buf,
1424 size_t nbytes, int min, int reserved)
1425{
1426 __u8 tmp[EXTRACT_SIZE];
1427 unsigned long flags;
1428
1429
1430 if (fips_enabled) {
1431 spin_lock_irqsave(&r->lock, flags);
1432 if (!r->last_data_init) {
1433 r->last_data_init = 1;
1434 spin_unlock_irqrestore(&r->lock, flags);
1435 trace_extract_entropy(r->name, EXTRACT_SIZE,
1436 ENTROPY_BITS(r), _RET_IP_);
1437 xfer_secondary_pool(r, EXTRACT_SIZE);
1438 extract_buf(r, tmp);
1439 spin_lock_irqsave(&r->lock, flags);
1440 memcpy(r->last_data, tmp, EXTRACT_SIZE);
1441 }
1442 spin_unlock_irqrestore(&r->lock, flags);
1443 }
1444
1445 trace_extract_entropy(r->name, nbytes, ENTROPY_BITS(r), _RET_IP_);
1446 xfer_secondary_pool(r, nbytes);
1447 nbytes = account(r, nbytes, min, reserved);
1448
1449 return _extract_entropy(r, buf, nbytes, fips_enabled);
1450}
1451
1452
1453
1454
1455
1456static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf,
1457 size_t nbytes)
1458{
1459 ssize_t ret = 0, i;
1460 __u8 tmp[EXTRACT_SIZE];
1461 int large_request = (nbytes > 256);
1462
1463 trace_extract_entropy_user(r->name, nbytes, ENTROPY_BITS(r), _RET_IP_);
1464 xfer_secondary_pool(r, nbytes);
1465 nbytes = account(r, nbytes, 0, 0);
1466
1467 while (nbytes) {
1468 if (large_request && need_resched()) {
1469 if (signal_pending(current)) {
1470 if (ret == 0)
1471 ret = -ERESTARTSYS;
1472 break;
1473 }
1474 schedule();
1475 }
1476
1477 extract_buf(r, tmp);
1478 i = min_t(int, nbytes, EXTRACT_SIZE);
1479 if (copy_to_user(buf, tmp, i)) {
1480 ret = -EFAULT;
1481 break;
1482 }
1483
1484 nbytes -= i;
1485 buf += i;
1486 ret += i;
1487 }
1488
1489
1490 memzero_explicit(tmp, sizeof(tmp));
1491
1492 return ret;
1493}
1494
1495
1496
1497
1498
1499
1500
1501
1502void get_random_bytes(void *buf, int nbytes)
1503{
1504 __u8 tmp[CHACHA20_BLOCK_SIZE];
1505
1506#if DEBUG_RANDOM_BOOT > 0
1507 if (!crng_ready())
1508 printk(KERN_NOTICE "random: %pF get_random_bytes called "
1509 "with crng_init = %d\n", (void *) _RET_IP_, crng_init);
1510#endif
1511 trace_get_random_bytes(nbytes, _RET_IP_);
1512
1513 while (nbytes >= CHACHA20_BLOCK_SIZE) {
1514 extract_crng(buf);
1515 buf += CHACHA20_BLOCK_SIZE;
1516 nbytes -= CHACHA20_BLOCK_SIZE;
1517 }
1518
1519 if (nbytes > 0) {
1520 extract_crng(tmp);
1521 memcpy(buf, tmp, nbytes);
1522 crng_backtrack_protect(tmp, nbytes);
1523 } else
1524 crng_backtrack_protect(tmp, CHACHA20_BLOCK_SIZE);
1525 memzero_explicit(tmp, sizeof(tmp));
1526}
1527EXPORT_SYMBOL(get_random_bytes);
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537int add_random_ready_callback(struct random_ready_callback *rdy)
1538{
1539 struct module *owner;
1540 unsigned long flags;
1541 int err = -EALREADY;
1542
1543 if (crng_ready())
1544 return err;
1545
1546 owner = rdy->owner;
1547 if (!try_module_get(owner))
1548 return -ENOENT;
1549
1550 spin_lock_irqsave(&random_ready_list_lock, flags);
1551 if (crng_ready())
1552 goto out;
1553
1554 owner = NULL;
1555
1556 list_add(&rdy->list, &random_ready_list);
1557 err = 0;
1558
1559out:
1560 spin_unlock_irqrestore(&random_ready_list_lock, flags);
1561
1562 module_put(owner);
1563
1564 return err;
1565}
1566EXPORT_SYMBOL(add_random_ready_callback);
1567
1568
1569
1570
1571void del_random_ready_callback(struct random_ready_callback *rdy)
1572{
1573 unsigned long flags;
1574 struct module *owner = NULL;
1575
1576 spin_lock_irqsave(&random_ready_list_lock, flags);
1577 if (!list_empty(&rdy->list)) {
1578 list_del_init(&rdy->list);
1579 owner = rdy->owner;
1580 }
1581 spin_unlock_irqrestore(&random_ready_list_lock, flags);
1582
1583 module_put(owner);
1584}
1585EXPORT_SYMBOL(del_random_ready_callback);
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597void get_random_bytes_arch(void *buf, int nbytes)
1598{
1599 char *p = buf;
1600
1601 trace_get_random_bytes_arch(nbytes, _RET_IP_);
1602 while (nbytes) {
1603 unsigned long v;
1604 int chunk = min(nbytes, (int)sizeof(unsigned long));
1605
1606 if (!arch_get_random_long(&v))
1607 break;
1608
1609 memcpy(p, &v, chunk);
1610 p += chunk;
1611 nbytes -= chunk;
1612 }
1613
1614 if (nbytes)
1615 get_random_bytes(p, nbytes);
1616}
1617EXPORT_SYMBOL(get_random_bytes_arch);
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629static void init_std_data(struct entropy_store *r)
1630{
1631 int i;
1632 ktime_t now = ktime_get_real();
1633 unsigned long rv;
1634
1635 r->last_pulled = jiffies;
1636 mix_pool_bytes(r, &now, sizeof(now));
1637 for (i = r->poolinfo->poolbytes; i > 0; i -= sizeof(rv)) {
1638 if (!arch_get_random_seed_long(&rv) &&
1639 !arch_get_random_long(&rv))
1640 rv = random_get_entropy();
1641 mix_pool_bytes(r, &rv, sizeof(rv));
1642 }
1643 mix_pool_bytes(r, utsname(), sizeof(*(utsname())));
1644}
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656static int rand_initialize(void)
1657{
1658#ifdef CONFIG_NUMA
1659 int i;
1660 struct crng_state *crng;
1661 struct crng_state **pool;
1662#endif
1663
1664 init_std_data(&input_pool);
1665 init_std_data(&blocking_pool);
1666 crng_initialize(&primary_crng);
1667
1668#ifdef CONFIG_NUMA
1669 pool = kcalloc(nr_node_ids, sizeof(*pool), GFP_KERNEL|__GFP_NOFAIL);
1670 for_each_online_node(i) {
1671 crng = kmalloc_node(sizeof(struct crng_state),
1672 GFP_KERNEL | __GFP_NOFAIL, i);
1673 spin_lock_init(&crng->lock);
1674 crng_initialize(crng);
1675 pool[i] = crng;
1676 }
1677 mb();
1678 crng_node_pool = pool;
1679#endif
1680 return 0;
1681}
1682early_initcall(rand_initialize);
1683
1684#ifdef CONFIG_BLOCK
1685void rand_initialize_disk(struct gendisk *disk)
1686{
1687 struct timer_rand_state *state;
1688
1689
1690
1691
1692
1693 state = kzalloc(sizeof(struct timer_rand_state), GFP_KERNEL);
1694 if (state) {
1695 state->last_time = INITIAL_JIFFIES;
1696 disk->random = state;
1697 }
1698}
1699#endif
1700
1701static ssize_t
1702_random_read(int nonblock, char __user *buf, size_t nbytes)
1703{
1704 ssize_t n;
1705
1706 if (nbytes == 0)
1707 return 0;
1708
1709 nbytes = min_t(size_t, nbytes, SEC_XFER_SIZE);
1710 while (1) {
1711 n = extract_entropy_user(&blocking_pool, buf, nbytes);
1712 if (n < 0)
1713 return n;
1714 trace_random_read(n*8, (nbytes-n)*8,
1715 ENTROPY_BITS(&blocking_pool),
1716 ENTROPY_BITS(&input_pool));
1717 if (n > 0)
1718 return n;
1719
1720
1721 if (nonblock)
1722 return -EAGAIN;
1723
1724 wait_event_interruptible(random_read_wait,
1725 ENTROPY_BITS(&input_pool) >=
1726 random_read_wakeup_bits);
1727 if (signal_pending(current))
1728 return -ERESTARTSYS;
1729 }
1730}
1731
1732static ssize_t
1733random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
1734{
1735 return _random_read(file->f_flags & O_NONBLOCK, buf, nbytes);
1736}
1737
1738static ssize_t
1739urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
1740{
1741 unsigned long flags;
1742 static int maxwarn = 10;
1743 int ret;
1744
1745 if (!crng_ready() && maxwarn > 0) {
1746 maxwarn--;
1747 printk(KERN_NOTICE "random: %s: uninitialized urandom read "
1748 "(%zd bytes read)\n",
1749 current->comm, nbytes);
1750 spin_lock_irqsave(&primary_crng.lock, flags);
1751 crng_init_cnt = 0;
1752 spin_unlock_irqrestore(&primary_crng.lock, flags);
1753 }
1754 nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3));
1755 ret = extract_crng_user(buf, nbytes);
1756 trace_urandom_read(8 * nbytes, 0, ENTROPY_BITS(&input_pool));
1757 return ret;
1758}
1759
1760static unsigned int
1761random_poll(struct file *file, poll_table * wait)
1762{
1763 unsigned int mask;
1764
1765 poll_wait(file, &random_read_wait, wait);
1766 poll_wait(file, &random_write_wait, wait);
1767 mask = 0;
1768 if (ENTROPY_BITS(&input_pool) >= random_read_wakeup_bits)
1769 mask |= POLLIN | POLLRDNORM;
1770 if (ENTROPY_BITS(&input_pool) < random_write_wakeup_bits)
1771 mask |= POLLOUT | POLLWRNORM;
1772 return mask;
1773}
1774
1775static int
1776write_pool(struct entropy_store *r, const char __user *buffer, size_t count)
1777{
1778 size_t bytes;
1779 __u32 buf[16];
1780 const char __user *p = buffer;
1781
1782 while (count > 0) {
1783 bytes = min(count, sizeof(buf));
1784 if (copy_from_user(&buf, p, bytes))
1785 return -EFAULT;
1786
1787 count -= bytes;
1788 p += bytes;
1789
1790 mix_pool_bytes(r, buf, bytes);
1791 cond_resched();
1792 }
1793
1794 return 0;
1795}
1796
1797static ssize_t random_write(struct file *file, const char __user *buffer,
1798 size_t count, loff_t *ppos)
1799{
1800 size_t ret;
1801
1802 ret = write_pool(&input_pool, buffer, count);
1803 if (ret)
1804 return ret;
1805
1806 return (ssize_t)count;
1807}
1808
1809static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
1810{
1811 int size, ent_count;
1812 int __user *p = (int __user *)arg;
1813 int retval;
1814
1815 switch (cmd) {
1816 case RNDGETENTCNT:
1817
1818 ent_count = ENTROPY_BITS(&input_pool);
1819 if (put_user(ent_count, p))
1820 return -EFAULT;
1821 return 0;
1822 case RNDADDTOENTCNT:
1823 if (!capable(CAP_SYS_ADMIN))
1824 return -EPERM;
1825 if (get_user(ent_count, p))
1826 return -EFAULT;
1827 return credit_entropy_bits_safe(&input_pool, ent_count);
1828 case RNDADDENTROPY:
1829 if (!capable(CAP_SYS_ADMIN))
1830 return -EPERM;
1831 if (get_user(ent_count, p++))
1832 return -EFAULT;
1833 if (ent_count < 0)
1834 return -EINVAL;
1835 if (get_user(size, p++))
1836 return -EFAULT;
1837 retval = write_pool(&input_pool, (const char __user *)p,
1838 size);
1839 if (retval < 0)
1840 return retval;
1841 return credit_entropy_bits_safe(&input_pool, ent_count);
1842 case RNDZAPENTCNT:
1843 case RNDCLEARPOOL:
1844
1845
1846
1847
1848 if (!capable(CAP_SYS_ADMIN))
1849 return -EPERM;
1850 input_pool.entropy_count = 0;
1851 blocking_pool.entropy_count = 0;
1852 return 0;
1853 default:
1854 return -EINVAL;
1855 }
1856}
1857
1858static int random_fasync(int fd, struct file *filp, int on)
1859{
1860 return fasync_helper(fd, filp, on, &fasync);
1861}
1862
1863const struct file_operations random_fops = {
1864 .read = random_read,
1865 .write = random_write,
1866 .poll = random_poll,
1867 .unlocked_ioctl = random_ioctl,
1868 .fasync = random_fasync,
1869 .llseek = noop_llseek,
1870};
1871
1872const struct file_operations urandom_fops = {
1873 .read = urandom_read,
1874 .write = random_write,
1875 .unlocked_ioctl = random_ioctl,
1876 .fasync = random_fasync,
1877 .llseek = noop_llseek,
1878};
1879
1880SYSCALL_DEFINE3(getrandom, char __user *, buf, size_t, count,
1881 unsigned int, flags)
1882{
1883 if (flags & ~(GRND_NONBLOCK|GRND_RANDOM))
1884 return -EINVAL;
1885
1886 if (count > INT_MAX)
1887 count = INT_MAX;
1888
1889 if (flags & GRND_RANDOM)
1890 return _random_read(flags & GRND_NONBLOCK, buf, count);
1891
1892 if (!crng_ready()) {
1893 if (flags & GRND_NONBLOCK)
1894 return -EAGAIN;
1895 crng_wait_ready();
1896 if (signal_pending(current))
1897 return -ERESTARTSYS;
1898 }
1899 return urandom_read(NULL, buf, count, NULL);
1900}
1901
1902
1903
1904
1905
1906
1907
1908#ifdef CONFIG_SYSCTL
1909
1910#include <linux/sysctl.h>
1911
1912static int min_read_thresh = 8, min_write_thresh;
1913static int max_read_thresh = OUTPUT_POOL_WORDS * 32;
1914static int max_write_thresh = INPUT_POOL_WORDS * 32;
1915static char sysctl_bootid[16];
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926static int proc_do_uuid(struct ctl_table *table, int write,
1927 void __user *buffer, size_t *lenp, loff_t *ppos)
1928{
1929 struct ctl_table fake_table;
1930 unsigned char buf[64], tmp_uuid[16], *uuid;
1931
1932 uuid = table->data;
1933 if (!uuid) {
1934 uuid = tmp_uuid;
1935 generate_random_uuid(uuid);
1936 } else {
1937 static DEFINE_SPINLOCK(bootid_spinlock);
1938
1939 spin_lock(&bootid_spinlock);
1940 if (!uuid[8])
1941 generate_random_uuid(uuid);
1942 spin_unlock(&bootid_spinlock);
1943 }
1944
1945 sprintf(buf, "%pU", uuid);
1946
1947 fake_table.data = buf;
1948 fake_table.maxlen = sizeof(buf);
1949
1950 return proc_dostring(&fake_table, write, buffer, lenp, ppos);
1951}
1952
1953
1954
1955
1956static int proc_do_entropy(struct ctl_table *table, int write,
1957 void __user *buffer, size_t *lenp, loff_t *ppos)
1958{
1959 struct ctl_table fake_table;
1960 int entropy_count;
1961
1962 entropy_count = *(int *)table->data >> ENTROPY_SHIFT;
1963
1964 fake_table.data = &entropy_count;
1965 fake_table.maxlen = sizeof(entropy_count);
1966
1967 return proc_dointvec(&fake_table, write, buffer, lenp, ppos);
1968}
1969
1970static int sysctl_poolsize = INPUT_POOL_WORDS * 32;
1971extern struct ctl_table random_table[];
1972struct ctl_table random_table[] = {
1973 {
1974 .procname = "poolsize",
1975 .data = &sysctl_poolsize,
1976 .maxlen = sizeof(int),
1977 .mode = 0444,
1978 .proc_handler = proc_dointvec,
1979 },
1980 {
1981 .procname = "entropy_avail",
1982 .maxlen = sizeof(int),
1983 .mode = 0444,
1984 .proc_handler = proc_do_entropy,
1985 .data = &input_pool.entropy_count,
1986 },
1987 {
1988 .procname = "read_wakeup_threshold",
1989 .data = &random_read_wakeup_bits,
1990 .maxlen = sizeof(int),
1991 .mode = 0644,
1992 .proc_handler = proc_dointvec_minmax,
1993 .extra1 = &min_read_thresh,
1994 .extra2 = &max_read_thresh,
1995 },
1996 {
1997 .procname = "write_wakeup_threshold",
1998 .data = &random_write_wakeup_bits,
1999 .maxlen = sizeof(int),
2000 .mode = 0644,
2001 .proc_handler = proc_dointvec_minmax,
2002 .extra1 = &min_write_thresh,
2003 .extra2 = &max_write_thresh,
2004 },
2005 {
2006 .procname = "urandom_min_reseed_secs",
2007 .data = &random_min_urandom_seed,
2008 .maxlen = sizeof(int),
2009 .mode = 0644,
2010 .proc_handler = proc_dointvec,
2011 },
2012 {
2013 .procname = "boot_id",
2014 .data = &sysctl_bootid,
2015 .maxlen = 16,
2016 .mode = 0444,
2017 .proc_handler = proc_do_uuid,
2018 },
2019 {
2020 .procname = "uuid",
2021 .maxlen = 16,
2022 .mode = 0444,
2023 .proc_handler = proc_do_uuid,
2024 },
2025#ifdef ADD_INTERRUPT_BENCH
2026 {
2027 .procname = "add_interrupt_avg_cycles",
2028 .data = &avg_cycles,
2029 .maxlen = sizeof(avg_cycles),
2030 .mode = 0444,
2031 .proc_handler = proc_doulongvec_minmax,
2032 },
2033 {
2034 .procname = "add_interrupt_avg_deviation",
2035 .data = &avg_deviation,
2036 .maxlen = sizeof(avg_deviation),
2037 .mode = 0444,
2038 .proc_handler = proc_doulongvec_minmax,
2039 },
2040#endif
2041 { }
2042};
2043#endif
2044
2045static u32 random_int_secret[MD5_MESSAGE_BYTES / 4] ____cacheline_aligned;
2046
2047int random_int_secret_init(void)
2048{
2049 get_random_bytes(random_int_secret, sizeof(random_int_secret));
2050 return 0;
2051}
2052
2053static DEFINE_PER_CPU(__u32 [MD5_DIGEST_WORDS], get_random_int_hash)
2054 __aligned(sizeof(unsigned long));
2055
2056
2057
2058
2059
2060
2061
2062unsigned int get_random_int(void)
2063{
2064 __u32 *hash;
2065 unsigned int ret;
2066
2067 if (arch_get_random_int(&ret))
2068 return ret;
2069
2070 hash = get_cpu_var(get_random_int_hash);
2071
2072 hash[0] += current->pid + jiffies + random_get_entropy();
2073 md5_transform(hash, random_int_secret);
2074 ret = hash[0];
2075 put_cpu_var(get_random_int_hash);
2076
2077 return ret;
2078}
2079EXPORT_SYMBOL(get_random_int);
2080
2081
2082
2083
2084unsigned long get_random_long(void)
2085{
2086 __u32 *hash;
2087 unsigned long ret;
2088
2089 if (arch_get_random_long(&ret))
2090 return ret;
2091
2092 hash = get_cpu_var(get_random_int_hash);
2093
2094 hash[0] += current->pid + jiffies + random_get_entropy();
2095 md5_transform(hash, random_int_secret);
2096 ret = *(unsigned long *)hash;
2097 put_cpu_var(get_random_int_hash);
2098
2099 return ret;
2100}
2101EXPORT_SYMBOL(get_random_long);
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117unsigned long
2118randomize_page(unsigned long start, unsigned long range)
2119{
2120 if (!PAGE_ALIGNED(start)) {
2121 range -= PAGE_ALIGN(start) - start;
2122 start = PAGE_ALIGN(start);
2123 }
2124
2125 if (start > ULONG_MAX - range)
2126 range = ULONG_MAX - start;
2127
2128 range >>= PAGE_SHIFT;
2129
2130 if (range == 0)
2131 return start;
2132
2133 return start + (get_random_long() % range << PAGE_SHIFT);
2134}
2135
2136
2137
2138
2139
2140void add_hwgenerator_randomness(const char *buffer, size_t count,
2141 size_t entropy)
2142{
2143 struct entropy_store *poolp = &input_pool;
2144
2145 if (!crng_ready()) {
2146 crng_fast_load(buffer, count);
2147 return;
2148 }
2149
2150
2151
2152
2153
2154 wait_event_interruptible(random_write_wait, kthread_should_stop() ||
2155 ENTROPY_BITS(&input_pool) <= random_write_wakeup_bits);
2156 mix_pool_bytes(poolp, buffer, count);
2157 credit_entropy_bits(poolp, entropy);
2158}
2159EXPORT_SYMBOL_GPL(add_hwgenerator_randomness);
2160