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/spinlock.h>
253#include <linux/percpu.h>
254#include <linux/cryptohash.h>
255#include <linux/fips.h>
256#include <linux/ptrace.h>
257#include <linux/kmemcheck.h>
258
259#ifdef CONFIG_GENERIC_HARDIRQS
260# include <linux/irq.h>
261#endif
262
263#include <asm/processor.h>
264#include <asm/uaccess.h>
265#include <asm/irq.h>
266#include <asm/irq_regs.h>
267#include <asm/io.h>
268
269#define CREATE_TRACE_POINTS
270#include <trace/events/random.h>
271
272
273
274
275#define INPUT_POOL_WORDS 128
276#define OUTPUT_POOL_WORDS 32
277#define SEC_XFER_SIZE 512
278#define EXTRACT_SIZE 10
279
280#define LONGS(x) (((x) + sizeof(unsigned long) - 1)/sizeof(unsigned long))
281
282
283
284
285
286static int random_read_wakeup_thresh = 64;
287
288
289
290
291
292
293static int random_write_wakeup_thresh = 128;
294
295
296
297
298
299
300static int trickle_thresh __read_mostly = INPUT_POOL_WORDS * 28;
301
302static DEFINE_PER_CPU(int, trickle_count);
303
304
305
306
307
308
309
310
311
312static struct poolinfo {
313 int poolwords;
314 int tap1, tap2, tap3, tap4, tap5;
315} poolinfo_table[] = {
316
317 { 128, 103, 76, 51, 25, 1 },
318
319 { 32, 26, 20, 14, 7, 1 },
320#if 0
321
322 { 2048, 1638, 1231, 819, 411, 1 },
323
324
325 { 1024, 817, 615, 412, 204, 1 },
326
327
328 { 1024, 819, 616, 410, 207, 2 },
329
330
331 { 512, 411, 308, 208, 104, 1 },
332
333
334 { 512, 409, 307, 206, 102, 2 },
335
336 { 512, 409, 309, 205, 103, 2 },
337
338
339 { 256, 205, 155, 101, 52, 1 },
340
341
342 { 128, 103, 78, 51, 27, 2 },
343
344
345 { 64, 52, 39, 26, 14, 1 },
346#endif
347};
348
349#define POOLBITS poolwords*32
350#define POOLBYTES poolwords*4
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398static DECLARE_WAIT_QUEUE_HEAD(random_read_wait);
399static DECLARE_WAIT_QUEUE_HEAD(random_write_wait);
400static struct fasync_struct *fasync;
401
402#if 0
403static bool debug;
404module_param(debug, bool, 0644);
405#define DEBUG_ENT(fmt, arg...) do { \
406 if (debug) \
407 printk(KERN_DEBUG "random %04d %04d %04d: " \
408 fmt,\
409 input_pool.entropy_count,\
410 blocking_pool.entropy_count,\
411 nonblocking_pool.entropy_count,\
412 ## arg); } while (0)
413#else
414#define DEBUG_ENT(fmt, arg...) do {} while (0)
415#endif
416
417
418
419
420
421
422
423
424struct entropy_store;
425struct entropy_store {
426
427 struct poolinfo *poolinfo;
428 __u32 *pool;
429 const char *name;
430 struct entropy_store *pull;
431 int limit;
432
433
434 spinlock_t lock;
435 unsigned add_ptr;
436 unsigned input_rotate;
437 int entropy_count;
438 int entropy_total;
439 unsigned int initialized:1;
440 __u8 last_data[EXTRACT_SIZE];
441};
442
443static __u32 input_pool_data[INPUT_POOL_WORDS];
444static __u32 blocking_pool_data[OUTPUT_POOL_WORDS];
445static __u32 nonblocking_pool_data[OUTPUT_POOL_WORDS];
446
447static struct entropy_store input_pool = {
448 .poolinfo = &poolinfo_table[0],
449 .name = "input",
450 .limit = 1,
451 .lock = __SPIN_LOCK_UNLOCKED(&input_pool.lock),
452 .pool = input_pool_data
453};
454
455static struct entropy_store blocking_pool = {
456 .poolinfo = &poolinfo_table[1],
457 .name = "blocking",
458 .limit = 1,
459 .pull = &input_pool,
460 .lock = __SPIN_LOCK_UNLOCKED(&blocking_pool.lock),
461 .pool = blocking_pool_data
462};
463
464static struct entropy_store nonblocking_pool = {
465 .poolinfo = &poolinfo_table[1],
466 .name = "nonblocking",
467 .pull = &input_pool,
468 .lock = __SPIN_LOCK_UNLOCKED(&nonblocking_pool.lock),
469 .pool = nonblocking_pool_data
470};
471
472static __u32 const twist_table[8] = {
473 0x00000000, 0x3b6e20c8, 0x76dc4190, 0x4db26158,
474 0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 };
475
476
477
478
479
480
481
482
483
484
485
486static void _mix_pool_bytes(struct entropy_store *r, const void *in,
487 int nbytes, __u8 out[64])
488{
489 unsigned long i, j, tap1, tap2, tap3, tap4, tap5;
490 int input_rotate;
491 int wordmask = r->poolinfo->poolwords - 1;
492 const char *bytes = in;
493 __u32 w;
494
495 tap1 = r->poolinfo->tap1;
496 tap2 = r->poolinfo->tap2;
497 tap3 = r->poolinfo->tap3;
498 tap4 = r->poolinfo->tap4;
499 tap5 = r->poolinfo->tap5;
500
501 smp_rmb();
502 input_rotate = ACCESS_ONCE(r->input_rotate);
503 i = ACCESS_ONCE(r->add_ptr);
504
505
506 while (nbytes--) {
507 w = rol32(*bytes++, input_rotate & 31);
508 i = (i - 1) & wordmask;
509
510
511 w ^= r->pool[i];
512 w ^= r->pool[(i + tap1) & wordmask];
513 w ^= r->pool[(i + tap2) & wordmask];
514 w ^= r->pool[(i + tap3) & wordmask];
515 w ^= r->pool[(i + tap4) & wordmask];
516 w ^= r->pool[(i + tap5) & wordmask];
517
518
519 r->pool[i] = (w >> 3) ^ twist_table[w & 7];
520
521
522
523
524
525
526
527 input_rotate += i ? 7 : 14;
528 }
529
530 ACCESS_ONCE(r->input_rotate) = input_rotate;
531 ACCESS_ONCE(r->add_ptr) = i;
532 smp_wmb();
533
534 if (out)
535 for (j = 0; j < 16; j++)
536 ((__u32 *)out)[j] = r->pool[(i - j) & wordmask];
537}
538
539static void __mix_pool_bytes(struct entropy_store *r, const void *in,
540 int nbytes, __u8 out[64])
541{
542 trace_mix_pool_bytes_nolock(r->name, nbytes, _RET_IP_);
543 _mix_pool_bytes(r, in, nbytes, out);
544}
545
546static void mix_pool_bytes(struct entropy_store *r, const void *in,
547 int nbytes, __u8 out[64])
548{
549 unsigned long flags;
550
551 trace_mix_pool_bytes(r->name, nbytes, _RET_IP_);
552 spin_lock_irqsave(&r->lock, flags);
553 _mix_pool_bytes(r, in, nbytes, out);
554 spin_unlock_irqrestore(&r->lock, flags);
555}
556
557struct fast_pool {
558 __u32 pool[4];
559 unsigned long last;
560 unsigned short count;
561 unsigned char rotate;
562 unsigned char last_timer_intr;
563};
564
565
566
567
568
569
570static void fast_mix(struct fast_pool *f, const void *in, int nbytes)
571{
572 const char *bytes = in;
573 __u32 w;
574 unsigned i = f->count;
575 unsigned input_rotate = f->rotate;
576
577 while (nbytes--) {
578 w = rol32(*bytes++, input_rotate & 31) ^ f->pool[i & 3] ^
579 f->pool[(i + 1) & 3];
580 f->pool[i & 3] = (w >> 3) ^ twist_table[w & 7];
581 input_rotate += (i++ & 3) ? 7 : 14;
582 }
583 f->count = i;
584 f->rotate = input_rotate;
585}
586
587
588
589
590static void credit_entropy_bits(struct entropy_store *r, int nbits)
591{
592 int entropy_count, orig;
593
594 if (!nbits)
595 return;
596
597 DEBUG_ENT("added %d entropy credits to %s\n", nbits, r->name);
598retry:
599 entropy_count = orig = ACCESS_ONCE(r->entropy_count);
600 entropy_count += nbits;
601
602 if (entropy_count < 0) {
603 DEBUG_ENT("negative entropy/overflow\n");
604 entropy_count = 0;
605 } else if (entropy_count > r->poolinfo->POOLBITS)
606 entropy_count = r->poolinfo->POOLBITS;
607 if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
608 goto retry;
609
610 if (!r->initialized && nbits > 0) {
611 r->entropy_total += nbits;
612 if (r->entropy_total > 128)
613 r->initialized = 1;
614 }
615
616 trace_credit_entropy_bits(r->name, nbits, entropy_count,
617 r->entropy_total, _RET_IP_);
618
619
620 if (r == &input_pool && entropy_count >= random_read_wakeup_thresh) {
621 wake_up_interruptible(&random_read_wait);
622 kill_fasync(&fasync, SIGIO, POLL_IN);
623 }
624}
625
626
627
628
629
630
631
632
633struct timer_rand_state {
634 cycles_t last_time;
635 long last_delta, last_delta2;
636 unsigned dont_count_entropy:1;
637};
638
639
640
641
642
643
644
645
646
647void add_device_randomness(const void *buf, unsigned int size)
648{
649 unsigned long time = get_cycles() ^ jiffies;
650
651 mix_pool_bytes(&input_pool, buf, size, NULL);
652 mix_pool_bytes(&input_pool, &time, sizeof(time), NULL);
653 mix_pool_bytes(&nonblocking_pool, buf, size, NULL);
654 mix_pool_bytes(&nonblocking_pool, &time, sizeof(time), NULL);
655}
656EXPORT_SYMBOL(add_device_randomness);
657
658static struct timer_rand_state input_timer_state;
659
660
661
662
663
664
665
666
667
668
669
670static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
671{
672 struct {
673 long jiffies;
674 unsigned cycles;
675 unsigned num;
676 } sample;
677 long delta, delta2, delta3;
678
679 preempt_disable();
680
681 if (input_pool.entropy_count > trickle_thresh &&
682 ((__this_cpu_inc_return(trickle_count) - 1) & 0xfff))
683 goto out;
684
685 sample.jiffies = jiffies;
686 sample.cycles = get_cycles();
687 sample.num = num;
688 mix_pool_bytes(&input_pool, &sample, sizeof(sample), NULL);
689
690
691
692
693
694
695
696 if (!state->dont_count_entropy) {
697 delta = sample.jiffies - state->last_time;
698 state->last_time = sample.jiffies;
699
700 delta2 = delta - state->last_delta;
701 state->last_delta = delta;
702
703 delta3 = delta2 - state->last_delta2;
704 state->last_delta2 = delta2;
705
706 if (delta < 0)
707 delta = -delta;
708 if (delta2 < 0)
709 delta2 = -delta2;
710 if (delta3 < 0)
711 delta3 = -delta3;
712 if (delta > delta2)
713 delta = delta2;
714 if (delta > delta3)
715 delta = delta3;
716
717
718
719
720
721
722 credit_entropy_bits(&input_pool,
723 min_t(int, fls(delta>>1), 11));
724 }
725out:
726 preempt_enable();
727}
728
729void add_input_randomness(unsigned int type, unsigned int code,
730 unsigned int value)
731{
732 static unsigned char last_value;
733
734
735 if (value == last_value)
736 return;
737
738 DEBUG_ENT("input event\n");
739 last_value = value;
740 add_timer_randomness(&input_timer_state,
741 (type << 4) ^ code ^ (code >> 4) ^ value);
742}
743EXPORT_SYMBOL_GPL(add_input_randomness);
744
745static DEFINE_PER_CPU(struct fast_pool, irq_randomness);
746
747void add_interrupt_randomness(int irq, int irq_flags)
748{
749 struct entropy_store *r;
750 struct fast_pool *fast_pool = &__get_cpu_var(irq_randomness);
751 struct pt_regs *regs = get_irq_regs();
752 unsigned long now = jiffies;
753 __u32 input[4], cycles = get_cycles();
754
755 input[0] = cycles ^ jiffies;
756 input[1] = irq;
757 if (regs) {
758 __u64 ip = instruction_pointer(regs);
759 input[2] = ip;
760 input[3] = ip >> 32;
761 }
762
763 fast_mix(fast_pool, input, sizeof(input));
764
765 if ((fast_pool->count & 1023) &&
766 !time_after(now, fast_pool->last + HZ))
767 return;
768
769 fast_pool->last = now;
770
771 r = nonblocking_pool.initialized ? &input_pool : &nonblocking_pool;
772 __mix_pool_bytes(r, &fast_pool->pool, sizeof(fast_pool->pool), NULL);
773
774
775
776
777
778 if (cycles == 0) {
779 if (irq_flags & __IRQF_TIMER) {
780 if (fast_pool->last_timer_intr)
781 return;
782 fast_pool->last_timer_intr = 1;
783 } else
784 fast_pool->last_timer_intr = 0;
785 }
786 credit_entropy_bits(r, 1);
787}
788
789#ifdef CONFIG_BLOCK
790void add_disk_randomness(struct gendisk *disk)
791{
792 if (!disk || !disk->random)
793 return;
794
795 DEBUG_ENT("disk event %d:%d\n",
796 MAJOR(disk_devt(disk)), MINOR(disk_devt(disk)));
797
798 add_timer_randomness(disk->random, 0x100 + disk_devt(disk));
799}
800#endif
801
802
803
804
805
806
807
808static ssize_t extract_entropy(struct entropy_store *r, void *buf,
809 size_t nbytes, int min, int rsvd);
810
811
812
813
814
815
816static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
817{
818 __u32 tmp[OUTPUT_POOL_WORDS];
819
820 if (r->pull && r->entropy_count < nbytes * 8 &&
821 r->entropy_count < r->poolinfo->POOLBITS) {
822
823 int rsvd = r->limit ? 0 : random_read_wakeup_thresh/4;
824 int bytes = nbytes;
825
826
827 bytes = max_t(int, bytes, random_read_wakeup_thresh / 8);
828
829 bytes = min_t(int, bytes, sizeof(tmp));
830
831 DEBUG_ENT("going to reseed %s with %d bits "
832 "(%d of %d requested)\n",
833 r->name, bytes * 8, nbytes * 8, r->entropy_count);
834
835 bytes = extract_entropy(r->pull, tmp, bytes,
836 random_read_wakeup_thresh / 8, rsvd);
837 mix_pool_bytes(r, tmp, bytes, NULL);
838 credit_entropy_bits(r, bytes*8);
839 }
840}
841
842
843
844
845
846
847
848
849
850
851
852
853
854static size_t account(struct entropy_store *r, size_t nbytes, int min,
855 int reserved)
856{
857 unsigned long flags;
858
859
860 spin_lock_irqsave(&r->lock, flags);
861
862 BUG_ON(r->entropy_count > r->poolinfo->POOLBITS);
863 DEBUG_ENT("trying to extract %d bits from %s\n",
864 nbytes * 8, r->name);
865
866
867 if (r->entropy_count / 8 < min + reserved) {
868 nbytes = 0;
869 } else {
870
871 if (r->limit && nbytes + reserved >= r->entropy_count / 8)
872 nbytes = r->entropy_count/8 - reserved;
873
874 if (r->entropy_count / 8 >= nbytes + reserved)
875 r->entropy_count -= nbytes*8;
876 else
877 r->entropy_count = reserved;
878
879 if (r->entropy_count < random_write_wakeup_thresh) {
880 wake_up_interruptible(&random_write_wait);
881 kill_fasync(&fasync, SIGIO, POLL_OUT);
882 }
883 }
884
885 DEBUG_ENT("debiting %d entropy credits from %s%s\n",
886 nbytes * 8, r->name, r->limit ? "" : " (unlimited)");
887
888 spin_unlock_irqrestore(&r->lock, flags);
889
890 return nbytes;
891}
892
893static void extract_buf(struct entropy_store *r, __u8 *out)
894{
895 int i;
896 union {
897 __u32 w[5];
898 unsigned long l[LONGS(EXTRACT_SIZE)];
899 } hash;
900 __u32 workspace[SHA_WORKSPACE_WORDS];
901 __u8 extract[64];
902 unsigned long flags;
903
904
905 sha_init(hash.w);
906 spin_lock_irqsave(&r->lock, flags);
907 for (i = 0; i < r->poolinfo->poolwords; i += 16)
908 sha_transform(hash.w, (__u8 *)(r->pool + i), workspace);
909
910
911
912
913
914
915
916
917
918
919 __mix_pool_bytes(r, hash.w, sizeof(hash.w), extract);
920 spin_unlock_irqrestore(&r->lock, flags);
921
922
923
924
925
926 sha_transform(hash.w, extract, workspace);
927 memset(extract, 0, sizeof(extract));
928 memset(workspace, 0, sizeof(workspace));
929
930
931
932
933
934
935 hash.w[0] ^= hash.w[3];
936 hash.w[1] ^= hash.w[4];
937 hash.w[2] ^= rol32(hash.w[2], 16);
938
939
940
941
942
943 for (i = 0; i < LONGS(EXTRACT_SIZE); i++) {
944 unsigned long v;
945 if (!arch_get_random_long(&v))
946 break;
947 hash.l[i] ^= v;
948 }
949
950 memcpy(out, &hash, EXTRACT_SIZE);
951 memset(&hash, 0, sizeof(hash));
952}
953
954static ssize_t extract_entropy(struct entropy_store *r, void *buf,
955 size_t nbytes, int min, int reserved)
956{
957 ssize_t ret = 0, i;
958 __u8 tmp[EXTRACT_SIZE];
959
960 trace_extract_entropy(r->name, nbytes, r->entropy_count, _RET_IP_);
961 xfer_secondary_pool(r, nbytes);
962 nbytes = account(r, nbytes, min, reserved);
963
964 while (nbytes) {
965 extract_buf(r, tmp);
966
967 if (fips_enabled) {
968 unsigned long flags;
969
970 spin_lock_irqsave(&r->lock, flags);
971 if (!memcmp(tmp, r->last_data, EXTRACT_SIZE))
972 panic("Hardware RNG duplicated output!\n");
973 memcpy(r->last_data, tmp, EXTRACT_SIZE);
974 spin_unlock_irqrestore(&r->lock, flags);
975 }
976 i = min_t(int, nbytes, EXTRACT_SIZE);
977 memcpy(buf, tmp, i);
978 nbytes -= i;
979 buf += i;
980 ret += i;
981 }
982
983
984 memset(tmp, 0, sizeof(tmp));
985
986 return ret;
987}
988
989static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf,
990 size_t nbytes)
991{
992 ssize_t ret = 0, i;
993 __u8 tmp[EXTRACT_SIZE];
994
995 trace_extract_entropy_user(r->name, nbytes, r->entropy_count, _RET_IP_);
996 xfer_secondary_pool(r, nbytes);
997 nbytes = account(r, nbytes, 0, 0);
998
999 while (nbytes) {
1000 if (need_resched()) {
1001 if (signal_pending(current)) {
1002 if (ret == 0)
1003 ret = -ERESTARTSYS;
1004 break;
1005 }
1006 schedule();
1007 }
1008
1009 extract_buf(r, tmp);
1010 i = min_t(int, nbytes, EXTRACT_SIZE);
1011 if (copy_to_user(buf, tmp, i)) {
1012 ret = -EFAULT;
1013 break;
1014 }
1015
1016 nbytes -= i;
1017 buf += i;
1018 ret += i;
1019 }
1020
1021
1022 memset(tmp, 0, sizeof(tmp));
1023
1024 return ret;
1025}
1026
1027
1028
1029
1030
1031
1032
1033void get_random_bytes(void *buf, int nbytes)
1034{
1035 extract_entropy(&nonblocking_pool, buf, nbytes, 0, 0);
1036}
1037EXPORT_SYMBOL(get_random_bytes);
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049void get_random_bytes_arch(void *buf, int nbytes)
1050{
1051 char *p = buf;
1052
1053 trace_get_random_bytes(nbytes, _RET_IP_);
1054 while (nbytes) {
1055 unsigned long v;
1056 int chunk = min(nbytes, (int)sizeof(unsigned long));
1057
1058 if (!arch_get_random_long(&v))
1059 break;
1060
1061 memcpy(p, &v, chunk);
1062 p += chunk;
1063 nbytes -= chunk;
1064 }
1065
1066 if (nbytes)
1067 extract_entropy(&nonblocking_pool, p, nbytes, 0, 0);
1068}
1069EXPORT_SYMBOL(get_random_bytes_arch);
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081static void init_std_data(struct entropy_store *r)
1082{
1083 int i;
1084 ktime_t now = ktime_get_real();
1085 unsigned long rv;
1086
1087 r->entropy_count = 0;
1088 r->entropy_total = 0;
1089 mix_pool_bytes(r, &now, sizeof(now), NULL);
1090 for (i = r->poolinfo->POOLBYTES; i > 0; i -= sizeof(rv)) {
1091 if (!arch_get_random_long(&rv))
1092 break;
1093 mix_pool_bytes(r, &rv, sizeof(rv), NULL);
1094 }
1095 mix_pool_bytes(r, utsname(), sizeof(*(utsname())), NULL);
1096}
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108static int rand_initialize(void)
1109{
1110 init_std_data(&input_pool);
1111 init_std_data(&blocking_pool);
1112 init_std_data(&nonblocking_pool);
1113 return 0;
1114}
1115module_init(rand_initialize);
1116
1117#ifdef CONFIG_BLOCK
1118void rand_initialize_disk(struct gendisk *disk)
1119{
1120 struct timer_rand_state *state;
1121
1122
1123
1124
1125
1126 state = kzalloc(sizeof(struct timer_rand_state), GFP_KERNEL);
1127 if (state)
1128 disk->random = state;
1129}
1130#endif
1131
1132static ssize_t
1133random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
1134{
1135 ssize_t n, retval = 0, count = 0;
1136
1137 if (nbytes == 0)
1138 return 0;
1139
1140 while (nbytes > 0) {
1141 n = nbytes;
1142 if (n > SEC_XFER_SIZE)
1143 n = SEC_XFER_SIZE;
1144
1145 DEBUG_ENT("reading %d bits\n", n*8);
1146
1147 n = extract_entropy_user(&blocking_pool, buf, n);
1148
1149 DEBUG_ENT("read got %d bits (%d still needed)\n",
1150 n*8, (nbytes-n)*8);
1151
1152 if (n == 0) {
1153 if (file->f_flags & O_NONBLOCK) {
1154 retval = -EAGAIN;
1155 break;
1156 }
1157
1158 DEBUG_ENT("sleeping?\n");
1159
1160 wait_event_interruptible(random_read_wait,
1161 input_pool.entropy_count >=
1162 random_read_wakeup_thresh);
1163
1164 DEBUG_ENT("awake\n");
1165
1166 if (signal_pending(current)) {
1167 retval = -ERESTARTSYS;
1168 break;
1169 }
1170
1171 continue;
1172 }
1173
1174 if (n < 0) {
1175 retval = n;
1176 break;
1177 }
1178 count += n;
1179 buf += n;
1180 nbytes -= n;
1181 break;
1182
1183 }
1184
1185 return (count ? count : retval);
1186}
1187
1188static ssize_t
1189urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
1190{
1191 return extract_entropy_user(&nonblocking_pool, buf, nbytes);
1192}
1193
1194static unsigned int
1195random_poll(struct file *file, poll_table * wait)
1196{
1197 unsigned int mask;
1198
1199 poll_wait(file, &random_read_wait, wait);
1200 poll_wait(file, &random_write_wait, wait);
1201 mask = 0;
1202 if (input_pool.entropy_count >= random_read_wakeup_thresh)
1203 mask |= POLLIN | POLLRDNORM;
1204 if (input_pool.entropy_count < random_write_wakeup_thresh)
1205 mask |= POLLOUT | POLLWRNORM;
1206 return mask;
1207}
1208
1209static int
1210write_pool(struct entropy_store *r, const char __user *buffer, size_t count)
1211{
1212 size_t bytes;
1213 __u32 buf[16];
1214 const char __user *p = buffer;
1215
1216 while (count > 0) {
1217 bytes = min(count, sizeof(buf));
1218 if (copy_from_user(&buf, p, bytes))
1219 return -EFAULT;
1220
1221 count -= bytes;
1222 p += bytes;
1223
1224 mix_pool_bytes(r, buf, bytes, NULL);
1225 cond_resched();
1226 }
1227
1228 return 0;
1229}
1230
1231static ssize_t random_write(struct file *file, const char __user *buffer,
1232 size_t count, loff_t *ppos)
1233{
1234 size_t ret;
1235
1236 ret = write_pool(&blocking_pool, buffer, count);
1237 if (ret)
1238 return ret;
1239 ret = write_pool(&nonblocking_pool, buffer, count);
1240 if (ret)
1241 return ret;
1242
1243 return (ssize_t)count;
1244}
1245
1246static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
1247{
1248 int size, ent_count;
1249 int __user *p = (int __user *)arg;
1250 int retval;
1251
1252 switch (cmd) {
1253 case RNDGETENTCNT:
1254
1255 if (put_user(input_pool.entropy_count, p))
1256 return -EFAULT;
1257 return 0;
1258 case RNDADDTOENTCNT:
1259 if (!capable(CAP_SYS_ADMIN))
1260 return -EPERM;
1261 if (get_user(ent_count, p))
1262 return -EFAULT;
1263 credit_entropy_bits(&input_pool, ent_count);
1264 return 0;
1265 case RNDADDENTROPY:
1266 if (!capable(CAP_SYS_ADMIN))
1267 return -EPERM;
1268 if (get_user(ent_count, p++))
1269 return -EFAULT;
1270 if (ent_count < 0)
1271 return -EINVAL;
1272 if (get_user(size, p++))
1273 return -EFAULT;
1274 retval = write_pool(&input_pool, (const char __user *)p,
1275 size);
1276 if (retval < 0)
1277 return retval;
1278 credit_entropy_bits(&input_pool, ent_count);
1279 return 0;
1280 case RNDZAPENTCNT:
1281 case RNDCLEARPOOL:
1282
1283 if (!capable(CAP_SYS_ADMIN))
1284 return -EPERM;
1285 rand_initialize();
1286 return 0;
1287 default:
1288 return -EINVAL;
1289 }
1290}
1291
1292static int random_fasync(int fd, struct file *filp, int on)
1293{
1294 return fasync_helper(fd, filp, on, &fasync);
1295}
1296
1297const struct file_operations random_fops = {
1298 .read = random_read,
1299 .write = random_write,
1300 .poll = random_poll,
1301 .unlocked_ioctl = random_ioctl,
1302 .fasync = random_fasync,
1303 .llseek = noop_llseek,
1304};
1305
1306const struct file_operations urandom_fops = {
1307 .read = urandom_read,
1308 .write = random_write,
1309 .unlocked_ioctl = random_ioctl,
1310 .fasync = random_fasync,
1311 .llseek = noop_llseek,
1312};
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324void generate_random_uuid(unsigned char uuid_out[16])
1325{
1326 get_random_bytes(uuid_out, 16);
1327
1328 uuid_out[6] = (uuid_out[6] & 0x0F) | 0x40;
1329
1330 uuid_out[8] = (uuid_out[8] & 0x3F) | 0x80;
1331}
1332EXPORT_SYMBOL(generate_random_uuid);
1333
1334
1335
1336
1337
1338
1339
1340#ifdef CONFIG_SYSCTL
1341
1342#include <linux/sysctl.h>
1343
1344static int min_read_thresh = 8, min_write_thresh;
1345static int max_read_thresh = INPUT_POOL_WORDS * 32;
1346static int max_write_thresh = INPUT_POOL_WORDS * 32;
1347static char sysctl_bootid[16];
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358static int proc_do_uuid(ctl_table *table, int write,
1359 void __user *buffer, size_t *lenp, loff_t *ppos)
1360{
1361 ctl_table fake_table;
1362 unsigned char buf[64], tmp_uuid[16], *uuid;
1363
1364 uuid = table->data;
1365 if (!uuid) {
1366 uuid = tmp_uuid;
1367 generate_random_uuid(uuid);
1368 } else {
1369 static DEFINE_SPINLOCK(bootid_spinlock);
1370
1371 spin_lock(&bootid_spinlock);
1372 if (!uuid[8])
1373 generate_random_uuid(uuid);
1374 spin_unlock(&bootid_spinlock);
1375 }
1376
1377 sprintf(buf, "%pU", uuid);
1378
1379 fake_table.data = buf;
1380 fake_table.maxlen = sizeof(buf);
1381
1382 return proc_dostring(&fake_table, write, buffer, lenp, ppos);
1383}
1384
1385static int sysctl_poolsize = INPUT_POOL_WORDS * 32;
1386extern ctl_table random_table[];
1387ctl_table random_table[] = {
1388 {
1389 .procname = "poolsize",
1390 .data = &sysctl_poolsize,
1391 .maxlen = sizeof(int),
1392 .mode = 0444,
1393 .proc_handler = proc_dointvec,
1394 },
1395 {
1396 .procname = "entropy_avail",
1397 .maxlen = sizeof(int),
1398 .mode = 0444,
1399 .proc_handler = proc_dointvec,
1400 .data = &input_pool.entropy_count,
1401 },
1402 {
1403 .procname = "read_wakeup_threshold",
1404 .data = &random_read_wakeup_thresh,
1405 .maxlen = sizeof(int),
1406 .mode = 0644,
1407 .proc_handler = proc_dointvec_minmax,
1408 .extra1 = &min_read_thresh,
1409 .extra2 = &max_read_thresh,
1410 },
1411 {
1412 .procname = "write_wakeup_threshold",
1413 .data = &random_write_wakeup_thresh,
1414 .maxlen = sizeof(int),
1415 .mode = 0644,
1416 .proc_handler = proc_dointvec_minmax,
1417 .extra1 = &min_write_thresh,
1418 .extra2 = &max_write_thresh,
1419 },
1420 {
1421 .procname = "boot_id",
1422 .data = &sysctl_bootid,
1423 .maxlen = 16,
1424 .mode = 0444,
1425 .proc_handler = proc_do_uuid,
1426 },
1427 {
1428 .procname = "uuid",
1429 .maxlen = 16,
1430 .mode = 0444,
1431 .proc_handler = proc_do_uuid,
1432 },
1433 { }
1434};
1435#endif
1436
1437static u32 random_int_secret[MD5_MESSAGE_BYTES / 4] ____cacheline_aligned;
1438
1439static int __init random_int_secret_init(void)
1440{
1441 get_random_bytes(random_int_secret, sizeof(random_int_secret));
1442 return 0;
1443}
1444late_initcall(random_int_secret_init);
1445
1446
1447
1448
1449
1450
1451
1452static DEFINE_PER_CPU(__u32 [MD5_DIGEST_WORDS], get_random_int_hash);
1453unsigned int get_random_int(void)
1454{
1455 __u32 *hash;
1456 unsigned int ret;
1457
1458 if (arch_get_random_int(&ret))
1459 return ret;
1460
1461 hash = get_cpu_var(get_random_int_hash);
1462
1463 hash[0] += current->pid + jiffies + get_cycles();
1464 md5_transform(hash, random_int_secret);
1465 ret = hash[0];
1466 put_cpu_var(get_random_int_hash);
1467
1468 return ret;
1469}
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480unsigned long
1481randomize_range(unsigned long start, unsigned long end, unsigned long len)
1482{
1483 unsigned long range = end - len - start;
1484
1485 if (end <= start + len)
1486 return 0;
1487 return PAGE_ALIGN(get_random_int() % range + start);
1488}
1489