diff options
Diffstat (limited to 'drivers/char/random.c')
-rw-r--r-- | drivers/char/random.c | 80 |
1 files changed, 35 insertions, 45 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c index f43c89f7c449..32118598a71b 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -272,7 +272,7 @@ static int random_write_wakeup_thresh = 128; | |||
272 | 272 | ||
273 | static int trickle_thresh __read_mostly = INPUT_POOL_WORDS * 28; | 273 | static int trickle_thresh __read_mostly = INPUT_POOL_WORDS * 28; |
274 | 274 | ||
275 | static DEFINE_PER_CPU(int, trickle_count) = 0; | 275 | static DEFINE_PER_CPU(int, trickle_count); |
276 | 276 | ||
277 | /* | 277 | /* |
278 | * A pool of size .poolwords is stirred with a primitive polynomial | 278 | * A pool of size .poolwords is stirred with a primitive polynomial |
@@ -372,15 +372,16 @@ static DECLARE_WAIT_QUEUE_HEAD(random_read_wait); | |||
372 | static DECLARE_WAIT_QUEUE_HEAD(random_write_wait); | 372 | static DECLARE_WAIT_QUEUE_HEAD(random_write_wait); |
373 | 373 | ||
374 | #if 0 | 374 | #if 0 |
375 | static int debug = 0; | 375 | static int debug; |
376 | module_param(debug, bool, 0644); | 376 | module_param(debug, bool, 0644); |
377 | #define DEBUG_ENT(fmt, arg...) do { if (debug) \ | 377 | #define DEBUG_ENT(fmt, arg...) do { \ |
378 | printk(KERN_DEBUG "random %04d %04d %04d: " \ | 378 | if (debug) \ |
379 | fmt,\ | 379 | printk(KERN_DEBUG "random %04d %04d %04d: " \ |
380 | input_pool.entropy_count,\ | 380 | fmt,\ |
381 | blocking_pool.entropy_count,\ | 381 | input_pool.entropy_count,\ |
382 | nonblocking_pool.entropy_count,\ | 382 | blocking_pool.entropy_count,\ |
383 | ## arg); } while (0) | 383 | nonblocking_pool.entropy_count,\ |
384 | ## arg); } while (0) | ||
384 | #else | 385 | #else |
385 | #define DEBUG_ENT(fmt, arg...) do {} while (0) | 386 | #define DEBUG_ENT(fmt, arg...) do {} while (0) |
386 | #endif | 387 | #endif |
@@ -551,7 +552,7 @@ static void credit_entropy_store(struct entropy_store *r, int nbits) | |||
551 | /* There is one of these per entropy source */ | 552 | /* There is one of these per entropy source */ |
552 | struct timer_rand_state { | 553 | struct timer_rand_state { |
553 | cycles_t last_time; | 554 | cycles_t last_time; |
554 | long last_delta,last_delta2; | 555 | long last_delta, last_delta2; |
555 | unsigned dont_count_entropy:1; | 556 | unsigned dont_count_entropy:1; |
556 | }; | 557 | }; |
557 | 558 | ||
@@ -624,7 +625,7 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num) | |||
624 | min_t(int, fls(delta>>1), 11)); | 625 | min_t(int, fls(delta>>1), 11)); |
625 | } | 626 | } |
626 | 627 | ||
627 | if(input_pool.entropy_count >= random_read_wakeup_thresh) | 628 | if (input_pool.entropy_count >= random_read_wakeup_thresh) |
628 | wake_up_interruptible(&random_read_wait); | 629 | wake_up_interruptible(&random_read_wait); |
629 | 630 | ||
630 | out: | 631 | out: |
@@ -677,7 +678,7 @@ void add_disk_randomness(struct gendisk *disk) | |||
677 | * | 678 | * |
678 | *********************************************************************/ | 679 | *********************************************************************/ |
679 | 680 | ||
680 | static ssize_t extract_entropy(struct entropy_store *r, void * buf, | 681 | static ssize_t extract_entropy(struct entropy_store *r, void *buf, |
681 | size_t nbytes, int min, int rsvd); | 682 | size_t nbytes, int min, int rsvd); |
682 | 683 | ||
683 | /* | 684 | /* |
@@ -704,8 +705,8 @@ static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes) | |||
704 | "(%d of %d requested)\n", | 705 | "(%d of %d requested)\n", |
705 | r->name, bytes * 8, nbytes * 8, r->entropy_count); | 706 | r->name, bytes * 8, nbytes * 8, r->entropy_count); |
706 | 707 | ||
707 | bytes=extract_entropy(r->pull, tmp, bytes, | 708 | bytes = extract_entropy(r->pull, tmp, bytes, |
708 | random_read_wakeup_thresh / 8, rsvd); | 709 | random_read_wakeup_thresh / 8, rsvd); |
709 | add_entropy_words(r, tmp, (bytes + 3) / 4); | 710 | add_entropy_words(r, tmp, (bytes + 3) / 4); |
710 | credit_entropy_store(r, bytes*8); | 711 | credit_entropy_store(r, bytes*8); |
711 | } | 712 | } |
@@ -744,7 +745,7 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min, | |||
744 | if (r->limit && nbytes + reserved >= r->entropy_count / 8) | 745 | if (r->limit && nbytes + reserved >= r->entropy_count / 8) |
745 | nbytes = r->entropy_count/8 - reserved; | 746 | nbytes = r->entropy_count/8 - reserved; |
746 | 747 | ||
747 | if(r->entropy_count / 8 >= nbytes + reserved) | 748 | if (r->entropy_count / 8 >= nbytes + reserved) |
748 | r->entropy_count -= nbytes*8; | 749 | r->entropy_count -= nbytes*8; |
749 | else | 750 | else |
750 | r->entropy_count = reserved; | 751 | r->entropy_count = reserved; |
@@ -802,7 +803,7 @@ static void extract_buf(struct entropy_store *r, __u8 *out) | |||
802 | memset(buf, 0, sizeof(buf)); | 803 | memset(buf, 0, sizeof(buf)); |
803 | } | 804 | } |
804 | 805 | ||
805 | static ssize_t extract_entropy(struct entropy_store *r, void * buf, | 806 | static ssize_t extract_entropy(struct entropy_store *r, void *buf, |
806 | size_t nbytes, int min, int reserved) | 807 | size_t nbytes, int min, int reserved) |
807 | { | 808 | { |
808 | ssize_t ret = 0, i; | 809 | ssize_t ret = 0, i; |
@@ -872,7 +873,6 @@ void get_random_bytes(void *buf, int nbytes) | |||
872 | { | 873 | { |
873 | extract_entropy(&nonblocking_pool, buf, nbytes, 0, 0); | 874 | extract_entropy(&nonblocking_pool, buf, nbytes, 0, 0); |
874 | } | 875 | } |
875 | |||
876 | EXPORT_SYMBOL(get_random_bytes); | 876 | EXPORT_SYMBOL(get_random_bytes); |
877 | 877 | ||
878 | /* | 878 | /* |
@@ -940,7 +940,7 @@ void rand_initialize_disk(struct gendisk *disk) | |||
940 | #endif | 940 | #endif |
941 | 941 | ||
942 | static ssize_t | 942 | static ssize_t |
943 | random_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos) | 943 | random_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) |
944 | { | 944 | { |
945 | ssize_t n, retval = 0, count = 0; | 945 | ssize_t n, retval = 0, count = 0; |
946 | 946 | ||
@@ -1002,8 +1002,7 @@ random_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos) | |||
1002 | } | 1002 | } |
1003 | 1003 | ||
1004 | static ssize_t | 1004 | static ssize_t |
1005 | urandom_read(struct file * file, char __user * buf, | 1005 | urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) |
1006 | size_t nbytes, loff_t *ppos) | ||
1007 | { | 1006 | { |
1008 | return extract_entropy_user(&nonblocking_pool, buf, nbytes); | 1007 | return extract_entropy_user(&nonblocking_pool, buf, nbytes); |
1009 | } | 1008 | } |
@@ -1045,9 +1044,8 @@ write_pool(struct entropy_store *r, const char __user *buffer, size_t count) | |||
1045 | return 0; | 1044 | return 0; |
1046 | } | 1045 | } |
1047 | 1046 | ||
1048 | static ssize_t | 1047 | static ssize_t random_write(struct file *file, const char __user *buffer, |
1049 | random_write(struct file * file, const char __user * buffer, | 1048 | size_t count, loff_t *ppos) |
1050 | size_t count, loff_t *ppos) | ||
1051 | { | 1049 | { |
1052 | size_t ret; | 1050 | size_t ret; |
1053 | struct inode *inode = file->f_path.dentry->d_inode; | 1051 | struct inode *inode = file->f_path.dentry->d_inode; |
@@ -1064,9 +1062,8 @@ random_write(struct file * file, const char __user * buffer, | |||
1064 | return (ssize_t)count; | 1062 | return (ssize_t)count; |
1065 | } | 1063 | } |
1066 | 1064 | ||
1067 | static int | 1065 | static int random_ioctl(struct inode *inode, struct file *file, |
1068 | random_ioctl(struct inode * inode, struct file * file, | 1066 | unsigned int cmd, unsigned long arg) |
1069 | unsigned int cmd, unsigned long arg) | ||
1070 | { | 1067 | { |
1071 | int size, ent_count; | 1068 | int size, ent_count; |
1072 | int __user *p = (int __user *)arg; | 1069 | int __user *p = (int __user *)arg; |
@@ -1157,7 +1154,6 @@ void generate_random_uuid(unsigned char uuid_out[16]) | |||
1157 | /* Set the UUID variant to DCE */ | 1154 | /* Set the UUID variant to DCE */ |
1158 | uuid_out[8] = (uuid_out[8] & 0x3F) | 0x80; | 1155 | uuid_out[8] = (uuid_out[8] & 0x3F) | 0x80; |
1159 | } | 1156 | } |
1160 | |||
1161 | EXPORT_SYMBOL(generate_random_uuid); | 1157 | EXPORT_SYMBOL(generate_random_uuid); |
1162 | 1158 | ||
1163 | /******************************************************************** | 1159 | /******************************************************************** |
@@ -1339,7 +1335,7 @@ ctl_table random_table[] = { | |||
1339 | 1335 | ||
1340 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 1336 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
1341 | 1337 | ||
1342 | static __u32 twothirdsMD4Transform (__u32 const buf[4], __u32 const in[12]) | 1338 | static __u32 twothirdsMD4Transform(__u32 const buf[4], __u32 const in[12]) |
1343 | { | 1339 | { |
1344 | __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; | 1340 | __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; |
1345 | 1341 | ||
@@ -1487,8 +1483,8 @@ __u32 secure_tcpv6_sequence_number(__be32 *saddr, __be32 *daddr, | |||
1487 | */ | 1483 | */ |
1488 | 1484 | ||
1489 | memcpy(hash, saddr, 16); | 1485 | memcpy(hash, saddr, 16); |
1490 | hash[4]=((__force u16)sport << 16) + (__force u16)dport; | 1486 | hash[4] = ((__force u16)sport << 16) + (__force u16)dport; |
1491 | memcpy(&hash[5],keyptr->secret,sizeof(__u32) * 7); | 1487 | memcpy(&hash[5], keyptr->secret, sizeof(__u32) * 7); |
1492 | 1488 | ||
1493 | seq = twothirdsMD4Transform((const __u32 *)daddr, hash) & HASH_MASK; | 1489 | seq = twothirdsMD4Transform((const __u32 *)daddr, hash) & HASH_MASK; |
1494 | seq += keyptr->count; | 1490 | seq += keyptr->count; |
@@ -1538,10 +1534,10 @@ __u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr, | |||
1538 | * Note that the words are placed into the starting vector, which is | 1534 | * Note that the words are placed into the starting vector, which is |
1539 | * then mixed with a partial MD4 over random data. | 1535 | * then mixed with a partial MD4 over random data. |
1540 | */ | 1536 | */ |
1541 | hash[0]=(__force u32)saddr; | 1537 | hash[0] = (__force u32)saddr; |
1542 | hash[1]=(__force u32)daddr; | 1538 | hash[1] = (__force u32)daddr; |
1543 | hash[2]=((__force u16)sport << 16) + (__force u16)dport; | 1539 | hash[2] = ((__force u16)sport << 16) + (__force u16)dport; |
1544 | hash[3]=keyptr->secret[11]; | 1540 | hash[3] = keyptr->secret[11]; |
1545 | 1541 | ||
1546 | seq = half_md4_transform(hash, keyptr->secret) & HASH_MASK; | 1542 | seq = half_md4_transform(hash, keyptr->secret) & HASH_MASK; |
1547 | seq += keyptr->count; | 1543 | seq += keyptr->count; |
@@ -1556,10 +1552,7 @@ __u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr, | |||
1556 | * Choosing a clock of 64 ns period is OK. (period of 274 s) | 1552 | * Choosing a clock of 64 ns period is OK. (period of 274 s) |
1557 | */ | 1553 | */ |
1558 | seq += ktime_to_ns(ktime_get_real()) >> 6; | 1554 | seq += ktime_to_ns(ktime_get_real()) >> 6; |
1559 | #if 0 | 1555 | |
1560 | printk("init_seq(%lx, %lx, %d, %d) = %d\n", | ||
1561 | saddr, daddr, sport, dport, seq); | ||
1562 | #endif | ||
1563 | return seq; | 1556 | return seq; |
1564 | } | 1557 | } |
1565 | 1558 | ||
@@ -1582,14 +1575,15 @@ u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport) | |||
1582 | } | 1575 | } |
1583 | 1576 | ||
1584 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 1577 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
1585 | u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, __be16 dport) | 1578 | u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, |
1579 | __be16 dport) | ||
1586 | { | 1580 | { |
1587 | struct keydata *keyptr = get_keyptr(); | 1581 | struct keydata *keyptr = get_keyptr(); |
1588 | u32 hash[12]; | 1582 | u32 hash[12]; |
1589 | 1583 | ||
1590 | memcpy(hash, saddr, 16); | 1584 | memcpy(hash, saddr, 16); |
1591 | hash[4] = (__force u32)dport; | 1585 | hash[4] = (__force u32)dport; |
1592 | memcpy(&hash[5],keyptr->secret,sizeof(__u32) * 7); | 1586 | memcpy(&hash[5], keyptr->secret, sizeof(__u32) * 7); |
1593 | 1587 | ||
1594 | return twothirdsMD4Transform((const __u32 *)daddr, hash); | 1588 | return twothirdsMD4Transform((const __u32 *)daddr, hash); |
1595 | } | 1589 | } |
@@ -1617,13 +1611,9 @@ u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr, | |||
1617 | 1611 | ||
1618 | seq += ktime_to_ns(ktime_get_real()); | 1612 | seq += ktime_to_ns(ktime_get_real()); |
1619 | seq &= (1ull << 48) - 1; | 1613 | seq &= (1ull << 48) - 1; |
1620 | #if 0 | 1614 | |
1621 | printk("dccp init_seq(%lx, %lx, %d, %d) = %d\n", | ||
1622 | saddr, daddr, sport, dport, seq); | ||
1623 | #endif | ||
1624 | return seq; | 1615 | return seq; |
1625 | } | 1616 | } |
1626 | |||
1627 | EXPORT_SYMBOL(secure_dccp_sequence_number); | 1617 | EXPORT_SYMBOL(secure_dccp_sequence_number); |
1628 | #endif | 1618 | #endif |
1629 | 1619 | ||