Release 2.1.2.
[u/mdw/catacomb] / bbs-rand.c
index 3d2563a..20d9c7a 100644 (file)
@@ -1,13 +1,13 @@
 /* -*-c-*-
  *
- * $Id: bbs-rand.c,v 1.5 2004/04/08 01:36:15 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,
@@ -236,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: {
@@ -271,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;
@@ -301,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.
  */