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