key-flags.c, key-pack.c, key-pass.c: Don't use the `key.h' machinery.
[u/mdw/catacomb] / bbs-rand.c
index abe1e72..20d9c7a 100644 (file)
@@ -1,13 +1,13 @@
 /* -*-c-*-
  *
- * $Id: bbs-rand.c,v 1.4 2001/02/03 12:00:29 mdw Exp $
+ * $Id$
  *
  * Blum-Blum-Shub secure random number generator
  *
  * (c) 1999 Straylight/Edgeware
  */
 
-/*----- Licensing notice --------------------------------------------------* 
+/*----- Licensing notice --------------------------------------------------*
  *
  * This file is part of Catacomb.
  *
  * it under the terms of the GNU Library General Public License as
  * published by the Free Software Foundation; either version 2 of the
  * License, or (at your option) any later version.
- * 
+ *
  * Catacomb is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Library General Public
  * License along with Catacomb; if not, write to the Free
  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  * MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: bbs-rand.c,v $
- * Revision 1.4  2001/02/03 12:00:29  mdw
- * Now @mp_drop@ checks its argument is non-NULL before attempting to free
- * it.  Note that the macro version @MP_DROP@ doesn't do this.
- *
- * Revision 1.3  2000/06/17 10:45:21  mdw
- * Typesetting fixes.  Advertise random number generator strength.  Use
- * secure arena for memory allocation.
- *
- * 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.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include <stdarg.h>
@@ -255,17 +236,27 @@ static int gmisc(grand *r, unsigned op, ...)
   switch (op) {
     case GRAND_CHECK:
       switch (va_arg(ap, unsigned)) {
-        case GRAND_CHECK:
-        case GRAND_SEEDINT:
-        case GRAND_SEEDUINT32:
-        case GRAND_SEEDMP:
+       case GRAND_CHECK:
+       case GRAND_SEEDINT:
+       case GRAND_SEEDUINT32:
+       case GRAND_SEEDMP:
        case GRAND_SEEDRAND:
        case BBS_SET:
-          rc = 1;
-          break;
-        default:
-          rc = 0;
-          break;
+       case BBS_STEP:
+       case BBS_STEPSZ:
+       case BBS_BITS:
+       case BBS_WRAP:
+       case BBS_FF:
+       case BBS_FFN:
+       case BBS_REW:
+       case BBS_REWN:
+       case BBS_MOD:
+       case BBS_STATE:
+         rc = 1;
+         break;
+       default:
+         rc = 0;
+         break;
       }
       break;
     case GRAND_SEEDINT: {
@@ -290,6 +281,50 @@ static int gmisc(grand *r, unsigned op, ...)
     case BBS_SET:
       bbs_set(&g->b, va_arg(ap, mp *));
       break;
+    case BBS_STEP:
+      bbs_step(&g->b);
+      break;
+    case BBS_STEPSZ:
+      rc = g->b.k;
+      break;
+    case BBS_BITS: {
+      unsigned nb = va_arg(ap, unsigned);
+      uint32 *w = va_arg(ap, uint32 *);
+      *w = bbs_bits(&g->b, nb);
+    } break;
+    case BBS_WRAP:
+      bbs_wrap(&g->b);
+      break;
+    case BBS_FF: {
+      const bbs_priv *bp = va_arg(ap, const bbs_priv *);
+      mp *n = va_arg(ap, mp *);
+      bbs_ff(&g->b, bp, n);
+    } break;
+    case BBS_FFN: {
+      const bbs_priv *bp = va_arg(ap, const bbs_priv *);
+      unsigned long n = va_arg(ap, unsigned long);
+      bbs_ffn(&g->b, bp, n);
+    } break;
+    case BBS_REW: {
+      const bbs_priv *bp = va_arg(ap, const bbs_priv *);
+      mp *n = va_arg(ap, mp *);
+      bbs_rew(&g->b, bp, n);
+    } break;
+    case BBS_REWN: {
+      const bbs_priv *bp = va_arg(ap, const bbs_priv *);
+      unsigned long n = va_arg(ap, unsigned long);
+      bbs_rewn(&g->b, bp, n);
+    } break;
+    case BBS_MOD: {
+      mp **n = va_arg(ap, mp **);
+      if (*n) MP_DROP(*n);
+      *n = MP_COPY(g->b.mb.m);
+    } break;
+    case BBS_STATE: {
+      mp **n = va_arg(ap, mp **);
+      if (*n) MP_DROP(*n);
+      *n = MP_COPY(g->b.x);
+    } break;
     default:
       GRAND_BADOP;
       break;
@@ -320,12 +355,12 @@ static const grand_ops gops = {
 
 /* --- @bbs_rand@ --- *
  *
- * Arguments:   @mp *m@ = modulus
+ * Arguments:  @mp *m@ = modulus
  *             @mp *x@ = initial seed
  *
- * Returns:     Pointer to a generic generator.
+ * Returns:    Pointer to a generic generator.
  *
- * Use:         Constructs a generic generator interface over a
+ * Use:                Constructs a generic generator interface over a
  *             Blum-Blum-Shub generator.
  */