X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/f1da6683c88aa279a6350122d96856185d581925..3f078a9c1d674e911f8c4169930359d603ccd5fb:/rand/rand.c diff --git a/rand/rand.c b/rand/rand.c index aa3fb453..6787c11a 100644 --- a/rand/rand.c +++ b/rand/rand.c @@ -161,8 +161,26 @@ CPU_DISPATCH(static, return, int, quick, (rand_pool *r), (r), static int trivial_quick(rand_pool *r) { return (-1); } +#if __GNUC__ && (CPUFAM_X86 || CPUFAM_AMD64) +static int rdrand_quick(rand_pool *r) +{ + unsigned long rr; + int i = 16; + + __asm__ ("0: rdrand %0; jc 9f; dec %1; jnz 0b; 9:" + : "=r" (rr), "=r" (i) : "1" (i) : "cc"); + if (!i) return (-1); + rand_add(r, &rr, sizeof(rr), 8*sizeof(rr)); + return (0); +} +#endif + static quick__functype *pick_quick(void) { +#if __GNUC__ && (CPUFAM_X86 || CPUFAM_AMD64) + DISPATCH_PICK_COND(rand_quick, rdrand_quick, + cpu_feature_p(CPUFEAT_X86_RDRAND)); +#endif DISPATCH_PICK_FALLBACK(rand_quick, trivial_quick); } @@ -305,6 +323,7 @@ void rand_gate(rand_pool *r) HASH_INIT(&hc); STORE32(g, r->gen); HASH(&hc, g, sizeof(g)); + HASH(&hc, r->k.k, RAND_KEYSZ); HASH(&hc, r->pool, RAND_POOLSZ); HASH(&hc, r->buf, RAND_BUFSZ); HASH_DONE(&hc, h); @@ -355,6 +374,7 @@ void rand_stretch(rand_pool *r) HASH_INIT(&hc); STORE32(g, r->gen); HASH(&hc, g, sizeof(g)); + HASH(&hc, r->k.k, RAND_KEYSZ); HASH(&hc, r->pool, RAND_POOLSZ); HASH(&hc, r->buf, RAND_BUFSZ); HASH_DONE(&hc, h);