X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/aaf296c8b4ac5515bc09fe7ec3c98f5e5f311e12..5f0438e6324f770ec8e1f53eadceea0857e4792d:/rand/rand.c diff --git a/rand/rand.c b/rand/rand.c index 29b180d8..01e6422a 100644 --- a/rand/rand.c +++ b/rand/rand.c @@ -165,17 +165,13 @@ static int trivial_quick(rand_pool *r) { return (-1); } static int rdrand_quick(rand_pool *r) { unsigned long rr; - unsigned char w; - int i; - - for (i = 0; i < 16; i++) { - __asm__ ("rdrand %0; setc %1" : "=r" (rr), "=g" (w) : : "cc"); - if (w) { - rand_add(r, &rr, sizeof(rr), 8*sizeof(rr)); - return (0); - } - } - return (-1); + 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 @@ -327,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); @@ -345,7 +342,7 @@ void rand_gate(rand_pool *r) r->o = RAND_SECSZ; r->obits += r->ibits; if (r->obits > RAND_OBITS) { - r->ibits = r->obits - r->ibits; + r->ibits = r->obits - RAND_OBITS; r->obits = RAND_OBITS; } else r->ibits = 0; @@ -377,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); @@ -484,11 +482,15 @@ void rand_getgood(rand_pool *r, void *p, size_t sz) chunk = r->obits / 8; } - if (chunk + r->o > RAND_BUFSZ) + if (chunk + r->o <= RAND_BUFSZ) { + memcpy(o, r->buf + r->o, chunk); + r->o += chunk; + } else { chunk = RAND_BUFSZ - r->o; + memcpy(o, r->buf + r->o, chunk); + rand_stretch(r); + } - memcpy(o, r->buf + r->o, chunk); - r->o += chunk; r->obits -= chunk * 8; o += chunk; sz -= chunk;