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