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#include <linux/utsname.h>
227#include <linux/module.h>
228#include <linux/kernel.h>
229#include <linux/major.h>
230#include <linux/string.h>
231#include <linux/fcntl.h>
232#include <linux/slab.h>
233#include <linux/random.h>
234#include <linux/poll.h>
235#include <linux/init.h>
236#include <linux/fs.h>
237#include <linux/genhd.h>
238#include <linux/interrupt.h>
239#include <linux/mm.h>
240#include <linux/spinlock.h>
241#include <linux/percpu.h>
242#include <linux/cryptohash.h>
243
244#ifdef CONFIG_GENERIC_HARDIRQS
245# include <linux/irq.h>
246#endif
247
248#include <asm/processor.h>
249#include <asm/uaccess.h>
250#include <asm/irq.h>
251#include <asm/io.h>
252
253
254
255
256#define INPUT_POOL_WORDS 128
257#define OUTPUT_POOL_WORDS 32
258#define SEC_XFER_SIZE 512
259
260
261
262
263
264static int random_read_wakeup_thresh = 64;
265
266
267
268
269
270
271static int random_write_wakeup_thresh = 128;
272
273
274
275
276
277
278static int trickle_thresh __read_mostly = INPUT_POOL_WORDS * 28;
279
280static DEFINE_PER_CPU(int, trickle_count);
281
282
283
284
285
286
287
288
289
290static struct poolinfo {
291 int poolwords;
292 int tap1, tap2, tap3, tap4, tap5;
293} poolinfo_table[] = {
294
295 { 128, 103, 76, 51, 25, 1 },
296
297 { 32, 26, 20, 14, 7, 1 },
298#if 0
299
300 { 2048, 1638, 1231, 819, 411, 1 },
301
302
303 { 1024, 817, 615, 412, 204, 1 },
304
305
306 { 1024, 819, 616, 410, 207, 2 },
307
308
309 { 512, 411, 308, 208, 104, 1 },
310
311
312 { 512, 409, 307, 206, 102, 2 },
313
314 { 512, 409, 309, 205, 103, 2 },
315
316
317 { 256, 205, 155, 101, 52, 1 },
318
319
320 { 128, 103, 78, 51, 27, 2 },
321
322
323 { 64, 52, 39, 26, 14, 1 },
324#endif
325};
326
327#define POOLBITS poolwords*32
328#define POOLBYTES poolwords*4
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
367
368
369
370
371
372
373
374
375
376static DECLARE_WAIT_QUEUE_HEAD(random_read_wait);
377static DECLARE_WAIT_QUEUE_HEAD(random_write_wait);
378static struct fasync_struct *fasync;
379
380#if 0
381static int debug;
382module_param(debug, bool, 0644);
383#define DEBUG_ENT(fmt, arg...) do { \
384 if (debug) \
385 printk(KERN_DEBUG "random %04d %04d %04d: " \
386 fmt,\
387 input_pool.entropy_count,\
388 blocking_pool.entropy_count,\
389 nonblocking_pool.entropy_count,\
390 ## arg); } while (0)
391#else
392#define DEBUG_ENT(fmt, arg...) do {} while (0)
393#endif
394
395
396
397
398
399
400
401
402struct entropy_store;
403struct entropy_store {
404
405 struct poolinfo *poolinfo;
406 __u32 *pool;
407 const char *name;
408 int limit;
409 struct entropy_store *pull;
410
411
412 spinlock_t lock;
413 unsigned add_ptr;
414 int entropy_count;
415 int input_rotate;
416};
417
418static __u32 input_pool_data[INPUT_POOL_WORDS];
419static __u32 blocking_pool_data[OUTPUT_POOL_WORDS];
420static __u32 nonblocking_pool_data[OUTPUT_POOL_WORDS];
421
422static struct entropy_store input_pool = {
423 .poolinfo = &poolinfo_table[0],
424 .name = "input",
425 .limit = 1,
426 .lock = __SPIN_LOCK_UNLOCKED(&input_pool.lock),
427 .pool = input_pool_data
428};
429
430static struct entropy_store blocking_pool = {
431 .poolinfo = &poolinfo_table[1],
432 .name = "blocking",
433 .limit = 1,
434 .pull = &input_pool,
435 .lock = __SPIN_LOCK_UNLOCKED(&blocking_pool.lock),
436 .pool = blocking_pool_data
437};
438
439static struct entropy_store nonblocking_pool = {
440 .poolinfo = &poolinfo_table[1],
441 .name = "nonblocking",
442 .pull = &input_pool,
443 .lock = __SPIN_LOCK_UNLOCKED(&nonblocking_pool.lock),
444 .pool = nonblocking_pool_data
445};
446
447
448
449
450
451
452
453
454
455
456
457static void mix_pool_bytes_extract(struct entropy_store *r, const void *in,
458 int nbytes, __u8 out[64])
459{
460 static __u32 const twist_table[8] = {
461 0x00000000, 0x3b6e20c8, 0x76dc4190, 0x4db26158,
462 0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 };
463 unsigned long i, j, tap1, tap2, tap3, tap4, tap5;
464 int input_rotate;
465 int wordmask = r->poolinfo->poolwords - 1;
466 const char *bytes = in;
467 __u32 w;
468 unsigned long flags;
469
470
471 tap1 = r->poolinfo->tap1;
472 tap2 = r->poolinfo->tap2;
473 tap3 = r->poolinfo->tap3;
474 tap4 = r->poolinfo->tap4;
475 tap5 = r->poolinfo->tap5;
476
477 spin_lock_irqsave(&r->lock, flags);
478 input_rotate = r->input_rotate;
479 i = r->add_ptr;
480
481
482 while (nbytes--) {
483 w = rol32(*bytes++, input_rotate & 31);
484 i = (i - 1) & wordmask;
485
486
487 w ^= r->pool[i];
488 w ^= r->pool[(i + tap1) & wordmask];
489 w ^= r->pool[(i + tap2) & wordmask];
490 w ^= r->pool[(i + tap3) & wordmask];
491 w ^= r->pool[(i + tap4) & wordmask];
492 w ^= r->pool[(i + tap5) & wordmask];
493
494
495 r->pool[i] = (w >> 3) ^ twist_table[w & 7];
496
497
498
499
500
501
502
503 input_rotate += i ? 7 : 14;
504 }
505
506 r->input_rotate = input_rotate;
507 r->add_ptr = i;
508
509 if (out)
510 for (j = 0; j < 16; j++)
511 ((__u32 *)out)[j] = r->pool[(i - j) & wordmask];
512
513 spin_unlock_irqrestore(&r->lock, flags);
514}
515
516static void mix_pool_bytes(struct entropy_store *r, const void *in, int bytes)
517{
518 mix_pool_bytes_extract(r, in, bytes, NULL);
519}
520
521
522
523
524static void credit_entropy_bits(struct entropy_store *r, int nbits)
525{
526 unsigned long flags;
527 int entropy_count;
528
529 if (!nbits)
530 return;
531
532 spin_lock_irqsave(&r->lock, flags);
533
534 DEBUG_ENT("added %d entropy credits to %s\n", nbits, r->name);
535 entropy_count = r->entropy_count;
536 entropy_count += nbits;
537 if (entropy_count < 0) {
538 DEBUG_ENT("negative entropy/overflow\n");
539 entropy_count = 0;
540 } else if (entropy_count > r->poolinfo->POOLBITS)
541 entropy_count = r->poolinfo->POOLBITS;
542 r->entropy_count = entropy_count;
543
544
545 if (r == &input_pool && entropy_count >= random_read_wakeup_thresh) {
546 wake_up_interruptible(&random_read_wait);
547 kill_fasync(&fasync, SIGIO, POLL_IN);
548 }
549 spin_unlock_irqrestore(&r->lock, flags);
550}
551
552
553
554
555
556
557
558
559struct timer_rand_state {
560 cycles_t last_time;
561 long last_delta, last_delta2;
562 unsigned dont_count_entropy:1;
563};
564
565#ifndef CONFIG_GENERIC_HARDIRQS
566
567static struct timer_rand_state *irq_timer_state[NR_IRQS];
568
569static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
570{
571 return irq_timer_state[irq];
572}
573
574static void set_timer_rand_state(unsigned int irq,
575 struct timer_rand_state *state)
576{
577 irq_timer_state[irq] = state;
578}
579
580#else
581
582static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
583{
584 struct irq_desc *desc;
585
586 desc = irq_to_desc(irq);
587
588 return desc->timer_rand_state;
589}
590
591static void set_timer_rand_state(unsigned int irq,
592 struct timer_rand_state *state)
593{
594 struct irq_desc *desc;
595
596 desc = irq_to_desc(irq);
597
598 desc->timer_rand_state = state;
599}
600#endif
601
602static struct timer_rand_state input_timer_state;
603
604
605
606
607
608
609
610
611
612
613
614static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
615{
616 struct {
617 cycles_t cycles;
618 long jiffies;
619 unsigned num;
620 } sample;
621 long delta, delta2, delta3;
622
623 preempt_disable();
624
625 if (input_pool.entropy_count > trickle_thresh &&
626 (__get_cpu_var(trickle_count)++ & 0xfff))
627 goto out;
628
629 sample.jiffies = jiffies;
630 sample.cycles = get_cycles();
631 sample.num = num;
632 mix_pool_bytes(&input_pool, &sample, sizeof(sample));
633
634
635
636
637
638
639
640 if (!state->dont_count_entropy) {
641 delta = sample.jiffies - state->last_time;
642 state->last_time = sample.jiffies;
643
644 delta2 = delta - state->last_delta;
645 state->last_delta = delta;
646
647 delta3 = delta2 - state->last_delta2;
648 state->last_delta2 = delta2;
649
650 if (delta < 0)
651 delta = -delta;
652 if (delta2 < 0)
653 delta2 = -delta2;
654 if (delta3 < 0)
655 delta3 = -delta3;
656 if (delta > delta2)
657 delta = delta2;
658 if (delta > delta3)
659 delta = delta3;
660
661
662
663
664
665
666 credit_entropy_bits(&input_pool,
667 min_t(int, fls(delta>>1), 11));
668 }
669out:
670 preempt_enable();
671}
672
673void add_input_randomness(unsigned int type, unsigned int code,
674 unsigned int value)
675{
676 static unsigned char last_value;
677
678
679 if (value == last_value)
680 return;
681
682 DEBUG_ENT("input event\n");
683 last_value = value;
684 add_timer_randomness(&input_timer_state,
685 (type << 4) ^ code ^ (code >> 4) ^ value);
686}
687EXPORT_SYMBOL_GPL(add_input_randomness);
688
689void add_interrupt_randomness(int irq)
690{
691 struct timer_rand_state *state;
692
693 state = get_timer_rand_state(irq);
694
695 if (state == NULL)
696 return;
697
698 DEBUG_ENT("irq event %d\n", irq);
699 add_timer_randomness(state, 0x100 + irq);
700}
701
702#ifdef CONFIG_BLOCK
703void add_disk_randomness(struct gendisk *disk)
704{
705 if (!disk || !disk->random)
706 return;
707
708 DEBUG_ENT("disk event %d:%d\n",
709 MAJOR(disk_devt(disk)), MINOR(disk_devt(disk)));
710
711 add_timer_randomness(disk->random, 0x100 + disk_devt(disk));
712}
713#endif
714
715#define EXTRACT_SIZE 10
716
717
718
719
720
721
722
723static ssize_t extract_entropy(struct entropy_store *r, void *buf,
724 size_t nbytes, int min, int rsvd);
725
726
727
728
729
730
731static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
732{
733 __u32 tmp[OUTPUT_POOL_WORDS];
734
735 if (r->pull && r->entropy_count < nbytes * 8 &&
736 r->entropy_count < r->poolinfo->POOLBITS) {
737
738 int rsvd = r->limit ? 0 : random_read_wakeup_thresh/4;
739 int bytes = nbytes;
740
741
742 bytes = max_t(int, bytes, random_read_wakeup_thresh / 8);
743
744 bytes = min_t(int, bytes, sizeof(tmp));
745
746 DEBUG_ENT("going to reseed %s with %d bits "
747 "(%d of %d requested)\n",
748 r->name, bytes * 8, nbytes * 8, r->entropy_count);
749
750 bytes = extract_entropy(r->pull, tmp, bytes,
751 random_read_wakeup_thresh / 8, rsvd);
752 mix_pool_bytes(r, tmp, bytes);
753 credit_entropy_bits(r, bytes*8);
754 }
755}
756
757
758
759
760
761
762
763
764
765
766
767
768
769static size_t account(struct entropy_store *r, size_t nbytes, int min,
770 int reserved)
771{
772 unsigned long flags;
773
774
775 spin_lock_irqsave(&r->lock, flags);
776
777 BUG_ON(r->entropy_count > r->poolinfo->POOLBITS);
778 DEBUG_ENT("trying to extract %d bits from %s\n",
779 nbytes * 8, r->name);
780
781
782 if (r->entropy_count / 8 < min + reserved) {
783 nbytes = 0;
784 } else {
785
786 if (r->limit && nbytes + reserved >= r->entropy_count / 8)
787 nbytes = r->entropy_count/8 - reserved;
788
789 if (r->entropy_count / 8 >= nbytes + reserved)
790 r->entropy_count -= nbytes*8;
791 else
792 r->entropy_count = reserved;
793
794 if (r->entropy_count < random_write_wakeup_thresh) {
795 wake_up_interruptible(&random_write_wait);
796 kill_fasync(&fasync, SIGIO, POLL_OUT);
797 }
798 }
799
800 DEBUG_ENT("debiting %d entropy credits from %s%s\n",
801 nbytes * 8, r->name, r->limit ? "" : " (unlimited)");
802
803 spin_unlock_irqrestore(&r->lock, flags);
804
805 return nbytes;
806}
807
808static void extract_buf(struct entropy_store *r, __u8 *out)
809{
810 int i;
811 __u32 hash[5], workspace[SHA_WORKSPACE_WORDS];
812 __u8 extract[64];
813
814
815 sha_init(hash);
816 for (i = 0; i < r->poolinfo->poolwords; i += 16)
817 sha_transform(hash, (__u8 *)(r->pool + i), workspace);
818
819
820
821
822
823
824
825
826
827
828 mix_pool_bytes_extract(r, hash, sizeof(hash), extract);
829
830
831
832
833
834 sha_transform(hash, extract, workspace);
835 memset(extract, 0, sizeof(extract));
836 memset(workspace, 0, sizeof(workspace));
837
838
839
840
841
842
843 hash[0] ^= hash[3];
844 hash[1] ^= hash[4];
845 hash[2] ^= rol32(hash[2], 16);
846 memcpy(out, hash, EXTRACT_SIZE);
847 memset(hash, 0, sizeof(hash));
848}
849
850static ssize_t extract_entropy(struct entropy_store *r, void *buf,
851 size_t nbytes, int min, int reserved)
852{
853 ssize_t ret = 0, i;
854 __u8 tmp[EXTRACT_SIZE];
855
856 xfer_secondary_pool(r, nbytes);
857 nbytes = account(r, nbytes, min, reserved);
858
859 while (nbytes) {
860 extract_buf(r, tmp);
861 i = min_t(int, nbytes, EXTRACT_SIZE);
862 memcpy(buf, tmp, i);
863 nbytes -= i;
864 buf += i;
865 ret += i;
866 }
867
868
869 memset(tmp, 0, sizeof(tmp));
870
871 return ret;
872}
873
874static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf,
875 size_t nbytes)
876{
877 ssize_t ret = 0, i;
878 __u8 tmp[EXTRACT_SIZE];
879
880 xfer_secondary_pool(r, nbytes);
881 nbytes = account(r, nbytes, 0, 0);
882
883 while (nbytes) {
884 if (need_resched()) {
885 if (signal_pending(current)) {
886 if (ret == 0)
887 ret = -ERESTARTSYS;
888 break;
889 }
890 schedule();
891 }
892
893 extract_buf(r, tmp);
894 i = min_t(int, nbytes, EXTRACT_SIZE);
895 if (copy_to_user(buf, tmp, i)) {
896 ret = -EFAULT;
897 break;
898 }
899
900 nbytes -= i;
901 buf += i;
902 ret += i;
903 }
904
905
906 memset(tmp, 0, sizeof(tmp));
907
908 return ret;
909}
910
911
912
913
914
915
916void get_random_bytes(void *buf, int nbytes)
917{
918 extract_entropy(&nonblocking_pool, buf, nbytes, 0, 0);
919}
920EXPORT_SYMBOL(get_random_bytes);
921
922
923
924
925
926
927
928
929
930
931static void init_std_data(struct entropy_store *r)
932{
933 ktime_t now;
934 unsigned long flags;
935
936 spin_lock_irqsave(&r->lock, flags);
937 r->entropy_count = 0;
938 spin_unlock_irqrestore(&r->lock, flags);
939
940 now = ktime_get_real();
941 mix_pool_bytes(r, &now, sizeof(now));
942 mix_pool_bytes(r, utsname(), sizeof(*(utsname())));
943}
944
945static int rand_initialize(void)
946{
947 init_std_data(&input_pool);
948 init_std_data(&blocking_pool);
949 init_std_data(&nonblocking_pool);
950 return 0;
951}
952module_init(rand_initialize);
953
954void rand_initialize_irq(int irq)
955{
956 struct timer_rand_state *state;
957
958 state = get_timer_rand_state(irq);
959
960 if (state)
961 return;
962
963
964
965
966
967 state = kzalloc(sizeof(struct timer_rand_state), GFP_KERNEL);
968 if (state)
969 set_timer_rand_state(irq, state);
970}
971
972#ifdef CONFIG_BLOCK
973void rand_initialize_disk(struct gendisk *disk)
974{
975 struct timer_rand_state *state;
976
977
978
979
980
981 state = kzalloc(sizeof(struct timer_rand_state), GFP_KERNEL);
982 if (state)
983 disk->random = state;
984}
985#endif
986
987static ssize_t
988random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
989{
990 ssize_t n, retval = 0, count = 0;
991
992 if (nbytes == 0)
993 return 0;
994
995 while (nbytes > 0) {
996 n = nbytes;
997 if (n > SEC_XFER_SIZE)
998 n = SEC_XFER_SIZE;
999
1000 DEBUG_ENT("reading %d bits\n", n*8);
1001
1002 n = extract_entropy_user(&blocking_pool, buf, n);
1003
1004 DEBUG_ENT("read got %d bits (%d still needed)\n",
1005 n*8, (nbytes-n)*8);
1006
1007 if (n == 0) {
1008 if (file->f_flags & O_NONBLOCK) {
1009 retval = -EAGAIN;
1010 break;
1011 }
1012
1013 DEBUG_ENT("sleeping?\n");
1014
1015 wait_event_interruptible(random_read_wait,
1016 input_pool.entropy_count >=
1017 random_read_wakeup_thresh);
1018
1019 DEBUG_ENT("awake\n");
1020
1021 if (signal_pending(current)) {
1022 retval = -ERESTARTSYS;
1023 break;
1024 }
1025
1026 continue;
1027 }
1028
1029 if (n < 0) {
1030 retval = n;
1031 break;
1032 }
1033 count += n;
1034 buf += n;
1035 nbytes -= n;
1036 break;
1037
1038 }
1039
1040
1041
1042
1043 if (count)
1044 file_accessed(file);
1045
1046 return (count ? count : retval);
1047}
1048
1049static ssize_t
1050urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
1051{
1052 return extract_entropy_user(&nonblocking_pool, buf, nbytes);
1053}
1054
1055static unsigned int
1056random_poll(struct file *file, poll_table * wait)
1057{
1058 unsigned int mask;
1059
1060 poll_wait(file, &random_read_wait, wait);
1061 poll_wait(file, &random_write_wait, wait);
1062 mask = 0;
1063 if (input_pool.entropy_count >= random_read_wakeup_thresh)
1064 mask |= POLLIN | POLLRDNORM;
1065 if (input_pool.entropy_count < random_write_wakeup_thresh)
1066 mask |= POLLOUT | POLLWRNORM;
1067 return mask;
1068}
1069
1070static int
1071write_pool(struct entropy_store *r, const char __user *buffer, size_t count)
1072{
1073 size_t bytes;
1074 __u32 buf[16];
1075 const char __user *p = buffer;
1076
1077 while (count > 0) {
1078 bytes = min(count, sizeof(buf));
1079 if (copy_from_user(&buf, p, bytes))
1080 return -EFAULT;
1081
1082 count -= bytes;
1083 p += bytes;
1084
1085 mix_pool_bytes(r, buf, bytes);
1086 cond_resched();
1087 }
1088
1089 return 0;
1090}
1091
1092static ssize_t random_write(struct file *file, const char __user *buffer,
1093 size_t count, loff_t *ppos)
1094{
1095 size_t ret;
1096 struct inode *inode = file->f_path.dentry->d_inode;
1097
1098 ret = write_pool(&blocking_pool, buffer, count);
1099 if (ret)
1100 return ret;
1101 ret = write_pool(&nonblocking_pool, buffer, count);
1102 if (ret)
1103 return ret;
1104
1105 inode->i_mtime = current_fs_time(inode->i_sb);
1106 mark_inode_dirty(inode);
1107 return (ssize_t)count;
1108}
1109
1110static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
1111{
1112 int size, ent_count;
1113 int __user *p = (int __user *)arg;
1114 int retval;
1115
1116 switch (cmd) {
1117 case RNDGETENTCNT:
1118
1119 if (put_user(input_pool.entropy_count, p))
1120 return -EFAULT;
1121 return 0;
1122 case RNDADDTOENTCNT:
1123 if (!capable(CAP_SYS_ADMIN))
1124 return -EPERM;
1125 if (get_user(ent_count, p))
1126 return -EFAULT;
1127 credit_entropy_bits(&input_pool, ent_count);
1128 return 0;
1129 case RNDADDENTROPY:
1130 if (!capable(CAP_SYS_ADMIN))
1131 return -EPERM;
1132 if (get_user(ent_count, p++))
1133 return -EFAULT;
1134 if (ent_count < 0)
1135 return -EINVAL;
1136 if (get_user(size, p++))
1137 return -EFAULT;
1138 retval = write_pool(&input_pool, (const char __user *)p,
1139 size);
1140 if (retval < 0)
1141 return retval;
1142 credit_entropy_bits(&input_pool, ent_count);
1143 return 0;
1144 case RNDZAPENTCNT:
1145 case RNDCLEARPOOL:
1146
1147 if (!capable(CAP_SYS_ADMIN))
1148 return -EPERM;
1149 rand_initialize();
1150 return 0;
1151 default:
1152 return -EINVAL;
1153 }
1154}
1155
1156static int random_fasync(int fd, struct file *filp, int on)
1157{
1158 return fasync_helper(fd, filp, on, &fasync);
1159}
1160
1161const struct file_operations random_fops = {
1162 .read = random_read,
1163 .write = random_write,
1164 .poll = random_poll,
1165 .unlocked_ioctl = random_ioctl,
1166 .fasync = random_fasync,
1167};
1168
1169const struct file_operations urandom_fops = {
1170 .read = urandom_read,
1171 .write = random_write,
1172 .unlocked_ioctl = random_ioctl,
1173 .fasync = random_fasync,
1174};
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186void generate_random_uuid(unsigned char uuid_out[16])
1187{
1188 get_random_bytes(uuid_out, 16);
1189
1190 uuid_out[6] = (uuid_out[6] & 0x0F) | 0x40;
1191
1192 uuid_out[8] = (uuid_out[8] & 0x3F) | 0x80;
1193}
1194EXPORT_SYMBOL(generate_random_uuid);
1195
1196
1197
1198
1199
1200
1201
1202#ifdef CONFIG_SYSCTL
1203
1204#include <linux/sysctl.h>
1205
1206static int min_read_thresh = 8, min_write_thresh;
1207static int max_read_thresh = INPUT_POOL_WORDS * 32;
1208static int max_write_thresh = INPUT_POOL_WORDS * 32;
1209static char sysctl_bootid[16];
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220static int proc_do_uuid(ctl_table *table, int write, struct file *filp,
1221 void __user *buffer, size_t *lenp, loff_t *ppos)
1222{
1223 ctl_table fake_table;
1224 unsigned char buf[64], tmp_uuid[16], *uuid;
1225
1226 uuid = table->data;
1227 if (!uuid) {
1228 uuid = tmp_uuid;
1229 uuid[8] = 0;
1230 }
1231 if (uuid[8] == 0)
1232 generate_random_uuid(uuid);
1233
1234 sprintf(buf, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-"
1235 "%02x%02x%02x%02x%02x%02x",
1236 uuid[0], uuid[1], uuid[2], uuid[3],
1237 uuid[4], uuid[5], uuid[6], uuid[7],
1238 uuid[8], uuid[9], uuid[10], uuid[11],
1239 uuid[12], uuid[13], uuid[14], uuid[15]);
1240 fake_table.data = buf;
1241 fake_table.maxlen = sizeof(buf);
1242
1243 return proc_dostring(&fake_table, write, filp, buffer, lenp, ppos);
1244}
1245
1246static int uuid_strategy(ctl_table *table,
1247 void __user *oldval, size_t __user *oldlenp,
1248 void __user *newval, size_t newlen)
1249{
1250 unsigned char tmp_uuid[16], *uuid;
1251 unsigned int len;
1252
1253 if (!oldval || !oldlenp)
1254 return 1;
1255
1256 uuid = table->data;
1257 if (!uuid) {
1258 uuid = tmp_uuid;
1259 uuid[8] = 0;
1260 }
1261 if (uuid[8] == 0)
1262 generate_random_uuid(uuid);
1263
1264 if (get_user(len, oldlenp))
1265 return -EFAULT;
1266 if (len) {
1267 if (len > 16)
1268 len = 16;
1269 if (copy_to_user(oldval, uuid, len) ||
1270 put_user(len, oldlenp))
1271 return -EFAULT;
1272 }
1273 return 1;
1274}
1275
1276static int sysctl_poolsize = INPUT_POOL_WORDS * 32;
1277ctl_table random_table[] = {
1278 {
1279 .ctl_name = RANDOM_POOLSIZE,
1280 .procname = "poolsize",
1281 .data = &sysctl_poolsize,
1282 .maxlen = sizeof(int),
1283 .mode = 0444,
1284 .proc_handler = &proc_dointvec,
1285 },
1286 {
1287 .ctl_name = RANDOM_ENTROPY_COUNT,
1288 .procname = "entropy_avail",
1289 .maxlen = sizeof(int),
1290 .mode = 0444,
1291 .proc_handler = &proc_dointvec,
1292 .data = &input_pool.entropy_count,
1293 },
1294 {
1295 .ctl_name = RANDOM_READ_THRESH,
1296 .procname = "read_wakeup_threshold",
1297 .data = &random_read_wakeup_thresh,
1298 .maxlen = sizeof(int),
1299 .mode = 0644,
1300 .proc_handler = &proc_dointvec_minmax,
1301 .strategy = &sysctl_intvec,
1302 .extra1 = &min_read_thresh,
1303 .extra2 = &max_read_thresh,
1304 },
1305 {
1306 .ctl_name = RANDOM_WRITE_THRESH,
1307 .procname = "write_wakeup_threshold",
1308 .data = &random_write_wakeup_thresh,
1309 .maxlen = sizeof(int),
1310 .mode = 0644,
1311 .proc_handler = &proc_dointvec_minmax,
1312 .strategy = &sysctl_intvec,
1313 .extra1 = &min_write_thresh,
1314 .extra2 = &max_write_thresh,
1315 },
1316 {
1317 .ctl_name = RANDOM_BOOT_ID,
1318 .procname = "boot_id",
1319 .data = &sysctl_bootid,
1320 .maxlen = 16,
1321 .mode = 0444,
1322 .proc_handler = &proc_do_uuid,
1323 .strategy = &uuid_strategy,
1324 },
1325 {
1326 .ctl_name = RANDOM_UUID,
1327 .procname = "uuid",
1328 .maxlen = 16,
1329 .mode = 0444,
1330 .proc_handler = &proc_do_uuid,
1331 .strategy = &uuid_strategy,
1332 },
1333 { .ctl_name = 0 }
1334};
1335#endif
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
1358#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z)))
1359#define H(x, y, z) ((x) ^ (y) ^ (z))
1360
1361
1362
1363
1364
1365
1366
1367#define ROUND(f, a, b, c, d, x, s) \
1368 (a += f(b, c, d) + x, a = (a << s) | (a >> (32 - s)))
1369#define K1 0
1370#define K2 013240474631UL
1371#define K3 015666365641UL
1372
1373#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1374
1375static __u32 twothirdsMD4Transform(__u32 const buf[4], __u32 const in[12])
1376{
1377 __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3];
1378
1379
1380 ROUND(F, a, b, c, d, in[ 0] + K1, 3);
1381 ROUND(F, d, a, b, c, in[ 1] + K1, 7);
1382 ROUND(F, c, d, a, b, in[ 2] + K1, 11);
1383 ROUND(F, b, c, d, a, in[ 3] + K1, 19);
1384 ROUND(F, a, b, c, d, in[ 4] + K1, 3);
1385 ROUND(F, d, a, b, c, in[ 5] + K1, 7);
1386 ROUND(F, c, d, a, b, in[ 6] + K1, 11);
1387 ROUND(F, b, c, d, a, in[ 7] + K1, 19);
1388 ROUND(F, a, b, c, d, in[ 8] + K1, 3);
1389 ROUND(F, d, a, b, c, in[ 9] + K1, 7);
1390 ROUND(F, c, d, a, b, in[10] + K1, 11);
1391 ROUND(F, b, c, d, a, in[11] + K1, 19);
1392
1393
1394 ROUND(G, a, b, c, d, in[ 1] + K2, 3);
1395 ROUND(G, d, a, b, c, in[ 3] + K2, 5);
1396 ROUND(G, c, d, a, b, in[ 5] + K2, 9);
1397 ROUND(G, b, c, d, a, in[ 7] + K2, 13);
1398 ROUND(G, a, b, c, d, in[ 9] + K2, 3);
1399 ROUND(G, d, a, b, c, in[11] + K2, 5);
1400 ROUND(G, c, d, a, b, in[ 0] + K2, 9);
1401 ROUND(G, b, c, d, a, in[ 2] + K2, 13);
1402 ROUND(G, a, b, c, d, in[ 4] + K2, 3);
1403 ROUND(G, d, a, b, c, in[ 6] + K2, 5);
1404 ROUND(G, c, d, a, b, in[ 8] + K2, 9);
1405 ROUND(G, b, c, d, a, in[10] + K2, 13);
1406
1407
1408 ROUND(H, a, b, c, d, in[ 3] + K3, 3);
1409 ROUND(H, d, a, b, c, in[ 7] + K3, 9);
1410 ROUND(H, c, d, a, b, in[11] + K3, 11);
1411 ROUND(H, b, c, d, a, in[ 2] + K3, 15);
1412 ROUND(H, a, b, c, d, in[ 6] + K3, 3);
1413 ROUND(H, d, a, b, c, in[10] + K3, 9);
1414 ROUND(H, c, d, a, b, in[ 1] + K3, 11);
1415 ROUND(H, b, c, d, a, in[ 5] + K3, 15);
1416 ROUND(H, a, b, c, d, in[ 9] + K3, 3);
1417 ROUND(H, d, a, b, c, in[ 0] + K3, 9);
1418 ROUND(H, c, d, a, b, in[ 4] + K3, 11);
1419 ROUND(H, b, c, d, a, in[ 8] + K3, 15);
1420
1421 return buf[1] + b;
1422
1423}
1424#endif
1425
1426#undef ROUND
1427#undef F
1428#undef G
1429#undef H
1430#undef K1
1431#undef K2
1432#undef K3
1433
1434
1435#define REKEY_INTERVAL (300 * HZ)
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455#define COUNT_BITS 8
1456#define COUNT_MASK ((1 << COUNT_BITS) - 1)
1457#define HASH_BITS 24
1458#define HASH_MASK ((1 << HASH_BITS) - 1)
1459
1460static struct keydata {
1461 __u32 count;
1462 __u32 secret[12];
1463} ____cacheline_aligned ip_keydata[2];
1464
1465static unsigned int ip_cnt;
1466
1467static void rekey_seq_generator(struct work_struct *work);
1468
1469static DECLARE_DELAYED_WORK(rekey_work, rekey_seq_generator);
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483static void rekey_seq_generator(struct work_struct *work)
1484{
1485 struct keydata *keyptr = &ip_keydata[1 ^ (ip_cnt & 1)];
1486
1487 get_random_bytes(keyptr->secret, sizeof(keyptr->secret));
1488 keyptr->count = (ip_cnt & COUNT_MASK) << HASH_BITS;
1489 smp_wmb();
1490 ip_cnt++;
1491 schedule_delayed_work(&rekey_work,
1492 round_jiffies_relative(REKEY_INTERVAL));
1493}
1494
1495static inline struct keydata *get_keyptr(void)
1496{
1497 struct keydata *keyptr = &ip_keydata[ip_cnt & 1];
1498
1499 smp_rmb();
1500
1501 return keyptr;
1502}
1503
1504static __init int seqgen_init(void)
1505{
1506 rekey_seq_generator(NULL);
1507 return 0;
1508}
1509late_initcall(seqgen_init);
1510
1511#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1512__u32 secure_tcpv6_sequence_number(__be32 *saddr, __be32 *daddr,
1513 __be16 sport, __be16 dport)
1514{
1515 __u32 seq;
1516 __u32 hash[12];
1517 struct keydata *keyptr = get_keyptr();
1518
1519
1520
1521
1522
1523 memcpy(hash, saddr, 16);
1524 hash[4] = ((__force u16)sport << 16) + (__force u16)dport;
1525 memcpy(&hash[5], keyptr->secret, sizeof(__u32) * 7);
1526
1527 seq = twothirdsMD4Transform((const __u32 *)daddr, hash) & HASH_MASK;
1528 seq += keyptr->count;
1529
1530 seq += ktime_to_ns(ktime_get_real());
1531
1532 return seq;
1533}
1534EXPORT_SYMBOL(secure_tcpv6_sequence_number);
1535#endif
1536
1537
1538
1539
1540__u32 secure_ip_id(__be32 daddr)
1541{
1542 struct keydata *keyptr;
1543 __u32 hash[4];
1544
1545 keyptr = get_keyptr();
1546
1547
1548
1549
1550
1551
1552 hash[0] = (__force __u32)daddr;
1553 hash[1] = keyptr->secret[9];
1554 hash[2] = keyptr->secret[10];
1555 hash[3] = keyptr->secret[11];
1556
1557 return half_md4_transform(hash, keyptr->secret);
1558}
1559
1560#ifdef CONFIG_INET
1561
1562__u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr,
1563 __be16 sport, __be16 dport)
1564{
1565 __u32 seq;
1566 __u32 hash[4];
1567 struct keydata *keyptr = get_keyptr();
1568
1569
1570
1571
1572
1573
1574
1575 hash[0] = (__force u32)saddr;
1576 hash[1] = (__force u32)daddr;
1577 hash[2] = ((__force u16)sport << 16) + (__force u16)dport;
1578 hash[3] = keyptr->secret[11];
1579
1580 seq = half_md4_transform(hash, keyptr->secret) & HASH_MASK;
1581 seq += keyptr->count;
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592 seq += ktime_to_ns(ktime_get_real()) >> 6;
1593
1594 return seq;
1595}
1596
1597
1598u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport)
1599{
1600 struct keydata *keyptr = get_keyptr();
1601 u32 hash[4];
1602
1603
1604
1605
1606
1607 hash[0] = (__force u32)saddr;
1608 hash[1] = (__force u32)daddr;
1609 hash[2] = (__force u32)dport ^ keyptr->secret[10];
1610 hash[3] = keyptr->secret[11];
1611
1612 return half_md4_transform(hash, keyptr->secret);
1613}
1614EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral);
1615
1616#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
1617u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
1618 __be16 dport)
1619{
1620 struct keydata *keyptr = get_keyptr();
1621 u32 hash[12];
1622
1623 memcpy(hash, saddr, 16);
1624 hash[4] = (__force u32)dport;
1625 memcpy(&hash[5], keyptr->secret, sizeof(__u32) * 7);
1626
1627 return twothirdsMD4Transform((const __u32 *)daddr, hash);
1628}
1629#endif
1630
1631#if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE)
1632
1633
1634
1635
1636u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr,
1637 __be16 sport, __be16 dport)
1638{
1639 u64 seq;
1640 __u32 hash[4];
1641 struct keydata *keyptr = get_keyptr();
1642
1643 hash[0] = (__force u32)saddr;
1644 hash[1] = (__force u32)daddr;
1645 hash[2] = ((__force u16)sport << 16) + (__force u16)dport;
1646 hash[3] = keyptr->secret[11];
1647
1648 seq = half_md4_transform(hash, keyptr->secret);
1649 seq |= ((u64)keyptr->count) << (32 - HASH_BITS);
1650
1651 seq += ktime_to_ns(ktime_get_real());
1652 seq &= (1ull << 48) - 1;
1653
1654 return seq;
1655}
1656EXPORT_SYMBOL(secure_dccp_sequence_number);
1657#endif
1658
1659#endif
1660
1661
1662
1663
1664
1665
1666
1667
1668DEFINE_PER_CPU(__u32 [4], get_random_int_hash);
1669unsigned int get_random_int(void)
1670{
1671 struct keydata *keyptr;
1672 __u32 *hash = get_cpu_var(get_random_int_hash);
1673 int ret;
1674
1675 keyptr = get_keyptr();
1676 hash[0] += current->pid + jiffies + get_cycles();
1677
1678 ret = half_md4_transform(hash, keyptr->secret);
1679 put_cpu_var(get_random_int_hash);
1680
1681 return ret;
1682}
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693unsigned long
1694randomize_range(unsigned long start, unsigned long end, unsigned long len)
1695{
1696 unsigned long range = end - len - start;
1697
1698 if (end <= start + len)
1699 return 0;
1700 return PAGE_ALIGN(get_random_int() % range + start);
1701}
1702