Add support for seeding from a generic pseudorandom source.
authormdw <mdw>
Mon, 13 Dec 1999 15:34:01 +0000 (15:34 +0000)
committermdw <mdw>
Mon, 13 Dec 1999 15:34:01 +0000 (15:34 +0000)
bbs-rand.c
lcrand.c
ofb-def.h
rc4.c

index 054a158..006bc07 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: bbs-rand.c,v 1.1 1999/12/10 23:14:59 mdw Exp $
+ * $Id: bbs-rand.c,v 1.2 1999/12/13 15:34:01 mdw Exp $
  *
  * Blum-Blum-Shub secure random number generator
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: bbs-rand.c,v $
+ * Revision 1.2  1999/12/13 15:34:01  mdw
+ * Add support for seeding from a generic pseudorandom source.
+ *
  * Revision 1.1  1999/12/10 23:14:59  mdw
  * Blum-Blum-Shub generator, and Blum-Goldwasser encryption.
  *
@@ -49,6 +52,7 @@
 #include "mp.h"
 #include "mpbarrett.h"
 #include "mpint.h"
+#include "mprand.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
@@ -245,6 +249,7 @@ static int gmisc(grand *r, unsigned op, ...)
         case GRAND_SEEDINT:
         case GRAND_SEEDUINT32:
         case GRAND_SEEDMP:
+       case GRAND_SEEDRAND:
        case BBS_SET:
           rc = 1;
           break;
@@ -266,6 +271,12 @@ static int gmisc(grand *r, unsigned op, ...)
     case GRAND_SEEDMP:
       bbs_seed(&g->b, va_arg(ap, mp *));
       break;
+    case GRAND_SEEDRAND: {
+      grand *rr = va_arg(ap, grand *);
+      mp *m = mprand(MP_NEW, mp_bits(g->b.mb.m) - 1, rr, 0);
+      bbs_seed(&g->b, m);
+      mp_drop(m);
+    } break;
     case BBS_SET:
       bbs_set(&g->b, va_arg(ap, mp *));
       break;
index 3686e17..88e9591 100644 (file)
--- a/lcrand.c
+++ b/lcrand.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: lcrand.c,v 1.1 1999/12/10 23:15:27 mdw Exp $
+ * $Id: lcrand.c,v 1.2 1999/12/13 15:34:01 mdw Exp $
  *
  * Simple linear congruential generator
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: lcrand.c,v $
+ * Revision 1.2  1999/12/13 15:34:01  mdw
+ * Add support for seeding from a generic pseudorandom source.
+ *
  * Revision 1.1  1999/12/10 23:15:27  mdw
  * Noncryptographic random number generator.
  *
@@ -201,6 +204,7 @@ static int gmisc(grand *r, unsigned op, ...)
        case GRAND_CHECK:
        case GRAND_SEEDINT:
        case GRAND_SEEDUINT32:
+       case GRAND_SEEDRAND:
          rc = 1;
          break;
        default:
@@ -214,6 +218,12 @@ static int gmisc(grand *r, unsigned op, ...)
     case GRAND_SEEDUINT32:
       g->x = va_arg(ap, uint32);
       break;
+    case GRAND_SEEDRAND: {
+      grand *rr = va_arg(ap, grand *);
+      uint32 x;
+      do x = rr->ops->word(rr); while (x >= P || x == LCRAND_FIXEDPT);
+      g->x = x;
+    } break;
     default:
       GRAND_BADOP;
       break;
index 2d0fc94..20be645 100644 (file)
--- a/ofb-def.h
+++ b/ofb-def.h
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: ofb-def.h,v 1.1 1999/12/10 23:16:40 mdw Exp $
+ * $Id: ofb-def.h,v 1.2 1999/12/13 15:34:01 mdw Exp $
  *
  * Definitions for output feedback mode
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: ofb-def.h,v $
+ * Revision 1.2  1999/12/13 15:34:01  mdw
+ * Add support for seeding from a generic pseudorandom source.
+ *
  * Revision 1.1  1999/12/10 23:16:40  mdw
  * Split mode macros into interface and implementation.
  *
@@ -344,6 +347,7 @@ static int grmisc(grand *r, unsigned op, ...)                               \
        case GRAND_SEEDINT:                                             \
        case GRAND_SEEDUINT32:                                          \
        case GRAND_SEEDBLOCK:                                           \
+       case GRAND_SEEDRAND:                                            \
          rc = 1;                                                       \
          break;                                                        \
        default:                                                        \
@@ -371,6 +375,14 @@ static int grmisc(grand *r, unsigned op, ...)                              \
       }                                                                        \
       pre##_ofbsetiv(&g->k, p);                                                \
     } break;                                                           \
+    case GRAND_SEEDRAND: {                                             \
+      grand *rr = va_arg(ap, grand *);                                 \
+      rr->ops->fill(rr, buf, sizeof(buf));                             \
+      pre##_ofbsetiv(&g->k, buf);                                      \
+    } break;                                                           \
+    default:                                                           \
+      GRAND_BADOP;                                                     \
+      break;                                                           \
   }                                                                    \
                                                                        \
   va_end(ap);                                                          \
diff --git a/rc4.c b/rc4.c
index b1e9d67..a4e595f 100644 (file)
--- a/rc4.c
+++ b/rc4.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: rc4.c,v 1.2 1999/12/10 23:27:35 mdw Exp $
+ * $Id: rc4.c,v 1.3 1999/12/13 15:34:01 mdw Exp $
  *
  * The alleged RC4 stream cipher
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: rc4.c,v $
+ * Revision 1.3  1999/12/13 15:34:01  mdw
+ * Add support for seeding from a generic pseudorandom source.
+ *
  * Revision 1.2  1999/12/10 23:27:35  mdw
  * Generic cipher and RNG interfaces.
  *
@@ -184,6 +187,7 @@ static int grmisc(grand *r, unsigned op, ...)
        case GRAND_SEEDINT:
        case GRAND_SEEDUINT32:
        case GRAND_SEEDBLOCK:
+       case GRAND_SEEDRAND:
          rc = 1;
          break;
        default:
@@ -204,6 +208,15 @@ static int grmisc(grand *r, unsigned op, ...)
       size_t sz = va_arg(ap, size_t);
       rc4_init(&g->rc4, p, sz);
     } break;
+    case GRAND_SEEDRAND: {
+      grand *rr = va_arg(ap, grand *);
+      octet buf[16];
+      rr->ops->fill(rr, buf, sizeof(buf));
+      rc4_init(&g->rc4, buf, sizeof(buf));
+    } break;
+    default:
+      GRAND_BADOP;
+      break;
   }
 
   va_end(ap);