drivers/char/random.c:get_random_long(...) before md4trans:entropycache_shared:e3cfd7f7:d0677364:47014d9d:9995eb5d:7ea55125:55bea2be:a429fcaf:4b744f91:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 before md4trans:entropycache_pcpu:811bf167:b8a0fcf3:c0a0c8a4:1818867a:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 after md4trans:entropycache_shared:e3cfd7f7:d0677364:47014d9d:9995eb5d:7ea55125:55bea2be:a429fcaf:4b744f91:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 after md4trans:entropycache_pcpu:14fcab23:57482a5e:1c73f2b0:a8209604:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 drivers/char/random.c:get_random_long(...) before md4trans:entropycache_shared:e3cfd7f7:d0677364:47014d9d:9995eb5d:7ea55125:55bea2be:a429fcaf:4b744f91:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 before md4trans:entropycache_pcpu:14fcab23:57482a5e:1c73f2b0:a8209604:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 after md4trans:entropycache_shared:e3cfd7f7:d0677364:47014d9d:9995eb5d:7ea55125:55bea2be:a429fcaf:4b744f91:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 after md4trans:entropycache_pcpu:551ae9:efc689b9:272fc534:d356840d:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 drivers/char/random.c:rekey_seq_generator(...) before randomize:entropycache_shared:e3cfd7f7:d0677364:47014d9d:9995eb5d:7ea55125:55bea2be:a429fcaf:4b744f91:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 after randomize:entropycache_shared:d9b39f2e:3cac980:23285652:37cd616f:31884f33:57186a6:3c684084:a3e92485:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 before md4trans:entropycache_pcpu:551ae9:efc689b9:272fc534:d356840d:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 after md4trans:entropycache_pcpu:e5550833:d3dce455:a5f920b:b84f5e72:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 after md4trans:entropycache_shared:d9b39f2e:3cac980:23285652:37cd616f:31884f33:57186a6:3c684084:a3e92485:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 drivers/char/random.c:get_random_long(...) before md4trans:entropycache_shared:d9b39f2e:3cac980:23285652:37cd616f:31884f33:57186a6:3c684084:a3e92485:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 before md4trans:entropycache_pcpu:e5550833:d3dce455:a5f920b:b84f5e72:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 after md4trans:entropycache_shared:d9b39f2e:3cac980:23285652:37cd616f:31884f33:57186a6:3c684084:a3e92485:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 after md4trans:entropycache_pcpu:65963e6b:645032ce:275108fc:445412a5:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 drivers/char/random.c:get_random_long(...) before md4trans:entropycache_shared:d9b39f2e:3cac980:23285652:37cd616f:31884f33:57186a6:3c684084:a3e92485:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 before md4trans:entropycache_pcpu:65963e6b:645032ce:275108fc:445412a5:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 after md4trans:entropycache_shared:d9b39f2e:3cac980:23285652:37cd616f:31884f33:57186a6:3c684084:a3e92485:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 after md4trans:entropycache_pcpu:f5b6b2f6:7279824c:de654c35:8eb4497b:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 drivers/char/random.c:get_random_long(...) before md4trans:entropycache_shared:d9b39f2e:3cac980:23285652:37cd616f:31884f33:57186a6:3c684084:a3e92485:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 before md4trans:entropycache_pcpu:f5b6b2f6:7279824c:de654c35:8eb4497b:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 after md4trans:entropycache_shared:d9b39f2e:3cac980:23285652:37cd616f:31884f33:57186a6:3c684084:a3e92485:1:0:100:80:0:0:0:0:80:0:0:0:0:0:0:0:0:c04fc870:c04fb1c0:0:0:0:0:0 after md4trans:entropycache_pcpu:b7cf271:dca7dff2:546327c7:26997cb8:ffff0665:ffffffff:0:f99b:0:0:0:0:0:0:0:0 static void rekey_seq_generator(struct work_struct *work) { int i; struct keydata *keyptr = &ip_keydata[1 ^ (ip_cnt & 1)]; get_random_bytes(keyptr->secret, sizeof(keyptr->secret)); printk(KERN_INFO "drivers/char/random.c:rekey_seq_generator(...)\n"); printk(KERN_INFO "before randomize:entropycache_shared"); for (i=0; i < sizeof(entropycache_shared); i++) { printk(":%x", entropycache_shared[i]); } printk("\n"); get_random_bytes(entropycache_shared, sizeof(entropycache_shared)); printk(KERN_INFO "after randomize:entropycache_shared"); for (i=0; i < sizeof(entropycache_shared); i++) { printk(":%x", entropycache_shared[i]); } printk("\n"); printk(KERN_INFO "before md4trans:entropycache_pcpu"); for (i=0; i < sizeof(__get_cpu_var(entropycache_pcpu)); i++) { printk(":%lx", __get_cpu_var(entropycache_pcpu)[i]); } printk("\n"); half_md4_transform((u32 *)__get_cpu_var(entropycache_pcpu), entropycache_shared); printk(KERN_INFO "after md4trans:entropycache_pcpu"); for (i=0; i < sizeof(__get_cpu_var(entropycache_pcpu)); i++) { printk(":%lx", __get_cpu_var(entropycache_pcpu)[i]); } printk("\n"); printk(KERN_INFO "after md4trans:entropycache_shared"); for (i=0; i < sizeof(entropycache_shared); i++) { printk(":%x", entropycache_shared[i]); } printk("\n"); keyptr->count = (ip_cnt & COUNT_MASK) << HASH_BITS; smp_wmb(); ip_cnt++; schedule_delayed_work(&rekey_work, REKEY_INTERVAL); } unsigned long get_random_long(void) { int i; printk(KERN_INFO "drivers/char/random.c:get_random_long(...)\n"); printk(KERN_INFO "before md4trans:entropycache_shared"); for (i=0; i < sizeof(entropycache_shared); i++) { printk(":%x", entropycache_shared[i]); } printk("\n"); printk(KERN_INFO "before md4trans:entropycache_pcpu"); for (i=0; i < sizeof(__get_cpu_var(entropycache_pcpu)); i++) { printk(":%lx", __get_cpu_var(entropycache_pcpu)[i]); } printk("\n"); half_md4_transform((u32 *)__get_cpu_var(entropycache_pcpu), entropycache_shared); printk(KERN_INFO "after md4trans:entropycache_shared"); for (i=0; i < sizeof(entropycache_shared); i++) { printk(":%x", entropycache_shared[i]); } printk("\n"); printk(KERN_INFO "after md4trans:entropycache_pcpu"); for (i=0; i < sizeof(__get_cpu_var(entropycache_pcpu)); i++) { printk(":%lx", __get_cpu_var(entropycache_pcpu)[i]); } printk("\n"); return __get_cpu_var(entropycache_pcpu)[0]; } diff -Nru linux-2.6.21.5.ORIG/drivers/char/random.c linux-2.6.21.5/drivers/char/random.c --- linux-2.6.21.5.ORIG/drivers/char/random.c 2007-06-11 20:37:06.000000000 +0200 +++ linux-2.6.21.5/drivers/char/random.c 2007-06-24 16:54:42.000000000 +0200 @@ -437,6 +437,9 @@ .pool = nonblocking_pool_data }; +static u32 entropycache_shared[8] __read_mostly; +static DEFINE_PER_CPU(unsigned long , entropycache_pcpu)[16 / sizeof(unsigned long)]; + /* * This function adds a byte into the entropy "pool". It does not * update the entropy estimate. The caller should call @@ -1449,9 +1452,46 @@ */ static void rekey_seq_generator(struct work_struct *work) { + int i; struct keydata *keyptr = &ip_keydata[1 ^ (ip_cnt & 1)]; - get_random_bytes(keyptr->secret, sizeof(keyptr->secret)); + + printk(KERN_INFO "drivers/char/random.c:rekey_seq_generator(...)\n"); + + printk(KERN_INFO "before randomize:entropycache_shared"); + for (i=0; i < sizeof(entropycache_shared); i++) { + printk(":%x", entropycache_shared[i]); + } + printk("\n"); + + get_random_bytes(entropycache_shared, sizeof(entropycache_shared)); + + printk(KERN_INFO "after randomize:entropycache_shared"); + for (i=0; i < sizeof(entropycache_shared); i++) { + printk(":%x", entropycache_shared[i]); + } + printk("\n"); + + printk(KERN_INFO "before md4trans:entropycache_pcpu"); + for (i=0; i < sizeof(__get_cpu_var(entropycache_pcpu)); i++) { + printk(":%lx", __get_cpu_var(entropycache_pcpu)[i]); + } + printk("\n"); + + half_md4_transform((u32 *)__get_cpu_var(entropycache_pcpu), entropycache_shared); + + printk(KERN_INFO "after md4trans:entropycache_pcpu"); + for (i=0; i < sizeof(__get_cpu_var(entropycache_pcpu)); i++) { + printk(":%lx", __get_cpu_var(entropycache_pcpu)[i]); + } + printk("\n"); + + printk(KERN_INFO "after md4trans:entropycache_shared"); + for (i=0; i < sizeof(entropycache_shared); i++) { + printk(":%x", entropycache_shared[i]); + } + printk("\n"); + keyptr->count = (ip_cnt & COUNT_MASK) << HASH_BITS; smp_wmb(); ip_cnt++; @@ -1653,6 +1693,41 @@ return secure_ip_id((__force __be32)(current->pid + jiffies)); } +unsigned long get_random_long(void) +{ + int i; + + printk(KERN_INFO "drivers/char/random.c:get_random_long(...)\n"); + + printk(KERN_INFO "before md4trans:entropycache_shared"); + for (i=0; i < sizeof(entropycache_shared); i++) { + printk(":%x", entropycache_shared[i]); + } + printk("\n"); + + printk(KERN_INFO "before md4trans:entropycache_pcpu"); + for (i=0; i < sizeof(__get_cpu_var(entropycache_pcpu)); i++) { + printk(":%lx", __get_cpu_var(entropycache_pcpu)[i]); + } + printk("\n"); + + half_md4_transform((u32 *)__get_cpu_var(entropycache_pcpu), entropycache_shared); + + printk(KERN_INFO "after md4trans:entropycache_shared"); + for (i=0; i < sizeof(entropycache_shared); i++) { + printk(":%x", entropycache_shared[i]); + } + printk("\n"); + + printk(KERN_INFO "after md4trans:entropycache_pcpu"); + for (i=0; i < sizeof(__get_cpu_var(entropycache_pcpu)); i++) { + printk(":%lx", __get_cpu_var(entropycache_pcpu)[i]); + } + printk("\n"); + + return __get_cpu_var(entropycache_pcpu)[0]; +} + /* * randomize_range() returns a start address such that * diff -Nru linux-2.6.21.5.ORIG/fs/binfmt_elf.c linux-2.6.21.5/fs/binfmt_elf.c --- linux-2.6.21.5.ORIG/fs/binfmt_elf.c 2007-06-11 20:37:06.000000000 +0200 +++ linux-2.6.21.5/fs/binfmt_elf.c 2007-06-24 14:26:26.000000000 +0200 @@ -201,6 +201,8 @@ NEW_AUX_ENT(AT_GID, tsk->gid); NEW_AUX_ENT(AT_EGID, tsk->egid); NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm)); + NEW_AUX_ENT(AT_ENTRO1, get_random_long()); + NEW_AUX_ENT(AT_ENTRO2, get_random_long()); if (k_platform) { NEW_AUX_ENT(AT_PLATFORM, (elf_addr_t)(unsigned long)u_platform); diff -Nru linux-2.6.21.5.ORIG/fs/binfmt_elf.c linux-2.6.21.5/fs/binfmt_elf.c --- linux-2.6.21.5.ORIG/fs/binfmt_elf.c 2007-06-11 20:37:06.000000000 +0200 +++ linux-2.6.21.5/fs/binfmt_elf.c 2007-06-24 14:26:26.000000000 +0200 @@ -201,6 +201,8 @@ NEW_AUX_ENT(AT_GID, tsk->gid); NEW_AUX_ENT(AT_EGID, tsk->egid); NEW_AUX_ENT(AT_SECURE, security_bprm_secureexec(bprm)); + NEW_AUX_ENT(AT_ENTRO1, get_random_long()); + NEW_AUX_ENT(AT_ENTRO2, get_random_long()); if (k_platform) { NEW_AUX_ENT(AT_PLATFORM, (elf_addr_t)(unsigned long)u_platform); diff -Nru linux-2.6.21.5.ORIG/include/linux/auxvec.h linux-2.6.21.5/include/linux/auxvec.h --- linux-2.6.21.5.ORIG/include/linux/auxvec.h 2007-06-11 20:37:06.000000000 +0200 +++ linux-2.6.21.5/include/linux/auxvec.h 2007-06-24 14:25:52.000000000 +0200 @@ -26,6 +26,9 @@ #define AT_SECURE 23 /* secure mode boolean */ -#define AT_VECTOR_SIZE 44 /* Size of auxiliary table. */ +#define AT_ENTRO1 24 +#define AT_ENTRO2 25 + +#define AT_VECTOR_SIZE 46 /* Size of auxiliary table. */ #endif /* _LINUX_AUXVEC_H */ diff -Nru linux-2.6.21.5.ORIG/include/linux/random.h linux-2.6.21.5/include/linux/random.h --- linux-2.6.21.5.ORIG/include/linux/random.h 2007-06-11 20:37:06.000000000 +0200 +++ linux-2.6.21.5/include/linux/random.h 2007-06-24 14:25:29.000000000 +0200 @@ -67,6 +67,7 @@ #endif unsigned int get_random_int(void); +unsigned long get_random_long(void); unsigned long randomize_range(unsigned long start, unsigned long end, unsigned long len); u32 random32(void);