math/Makefile.am, symm/Makefile.am: Use `--no-install' on oddball tests.
[catacomb] / rand / rand.c
index 29b180d..6787c11 100644 (file)
@@ -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);
@@ -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);