New prime-search system. Read BBS keys from key files.
authormdw <mdw>
Wed, 22 Dec 1999 15:59:51 +0000 (15:59 +0000)
committermdw <mdw>
Wed, 22 Dec 1999 15:59:51 +0000 (15:59 +0000)
rspit.c

diff --git a/rspit.c b/rspit.c
index 2da0089..3c14ab4 100644 (file)
--- a/rspit.c
+++ b/rspit.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: rspit.c,v 1.1 1999/12/10 23:29:13 mdw Exp $
+ * $Id: rspit.c,v 1.2 1999/12/22 15:59:51 mdw Exp $
  *
  * Spit out random numbers
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: rspit.c,v $
+ * Revision 1.2  1999/12/22 15:59:51  mdw
+ * New prime-search system.  Read BBS keys from key files.
+ *
  * Revision 1.1  1999/12/10 23:29:13  mdw
  * Emit random numbers for statistical tests.
  *
@@ -58,6 +61,7 @@
 #include <mLib/sub.h>
 
 #include "grand.h"
+#include "key.h"
 
 #include "lcrand.h"
 #include "fibrand.h"
@@ -301,36 +305,6 @@ static void unhex(const char *p, char **end, dstr *d)
 
 /* --- Blum-Blum-Shub strong generator --- */
 
-static int bbsev(int ev, mp *m, void *p)
-{
-  switch (ev) {
-    case BBSEV_FINDP:
-      fputs("Searching for p: ", stderr);
-      fflush(stderr);
-      break;
-    case BBSEV_FINDQ:
-      fputs("Searching for q: ", stderr);
-      fflush(stderr);
-      break;
-    case BBSEV_FAILP:
-    case BBSEV_FAILQ:
-      fputc('.', stderr);
-      fflush(stderr);
-      break;
-    case BBSEV_PASSP:
-    case BBSEV_PASSQ:
-      fputc('+', stderr);
-      fflush(stderr);
-      break;
-    case BBSEV_GOODP:
-    case BBSEV_GOODQ:
-      fputc('\n', stderr);
-      fflush(stderr);
-      break;
-  }
-  return (0);
-}
-
 static grand *gen_bbs(unsigned i)
 {
   /* --- Default modulus --- *
@@ -362,9 +336,10 @@ static grand *gen_bbs(unsigned i)
 
   grand *r;
   const char *xt = 0;
-  unsigned bits = 512;
+  unsigned bits = 1024;
   mp *m, *x;
   unsigned show = 0;
+  const char *kfile = 0, *id = 0, *ktype = 0;
 
   /* --- Parse options --- */
 
@@ -374,10 +349,13 @@ static grand *gen_bbs(unsigned i)
     { "seed",          OPTF_ARGREQ,    0,      's' },
     { "bits",          OPTF_ARGREQ,    0,      'b' },
     { "show",          0,              0,      'S' },
+    { "keyring",       OPTF_ARGREQ,    0,      'k' },
+    { "id",            OPTF_ARGREQ,    0,      'i' },
+    { "type",          OPTF_ARGREQ,    0,      't' },
     { 0,               0,              0,      0 }
   };
 
-  addopts("m:gs:b:S", opts);
+  addopts("m:gs:b:Sk:i:t:", opts);
 
   for (;;) {
     int o = opt();
@@ -401,6 +379,18 @@ static grand *gen_bbs(unsigned i)
       case 'S':
        show = 1;
        break;
+      case 'k':
+       kfile = optarg;
+       mt = 0;
+       break;
+      case 'i':
+       id = optarg;
+       mt = 0;
+       break;
+      case 't':
+       ktype = optarg;
+       mt = 0;
+       break;
       default:
        return (0);
     }
@@ -411,18 +401,52 @@ static grand *gen_bbs(unsigned i)
   if (mt) {
     char *p;
     m = mp_readstring(MP_NEW, mt, &p, 0);
-    if (*p)
+    if (!m || *p || (m->v[0] & 3) != 1)
       die(EXIT_FAILURE, "bad modulus `%s'", mt);
     /* Unfortunately I don't know how to test for a Blum integer */
+  } else if (kfile || id || ktype) {
+    key_file kf;
+    key *kk;
+    key_data *kd;
+
+    /* --- Open the key file --- */
+
+    if (!kfile)
+      kfile = "keyring";
+    if (key_open(&kf, kfile, KOPEN_READ, key_moan, 0)) {
+      die(EXIT_FAILURE, "error opening key file `%s': %s",
+         kfile, strerror(errno));
+    }
+
+    /* --- Find the key --- */
+
+    if (id) {
+      if ((kk = key_bytag(&kf, id)) == 0)
+       die(EXIT_FAILURE, "key `%s' not found", id);
+    } else {
+      if (!ktype)
+       ktype = "bbs";
+      if ((kk = key_bytype(&kf, ktype)) == 0)
+       die(EXIT_FAILURE, "no suitable key with type `%s' found", ktype);
+    }
+
+    /* --- Read the key data --- */
+
+    if ((kk->k.e & KF_ENCMASK) != KENC_STRUCT)
+      die(EXIT_FAILURE, "key is not structured");
+    if ((kd = key_structfind(&kk->k, "n")) == 0)
+      die(EXIT_FAILURE, "key has no subkey `n'");
+    if ((kd->e & KF_ENCMASK) != KENC_MP)
+      die(EXIT_FAILURE, "incomatible subkey encoding");
+    m = MP_COPY(kd->u.m);
+    key_close(&kf);
   } else {
     mp *p = mprand(MP_NEW, bits / 2, &rand_global, 3);
     mp *q = mprand(MP_NEW, bits - bits / 2, &rand_global, 3);
-    bbs_params bp;
-    int err;
+    bbs_param bp;
 
-    if ((err = bbs_gen(&bp, p, q, 0,
-                      (flags & f_progress) ? bbsev : 0, 0)) != 0)
-      die(EXIT_FAILURE, "modulus generation failed (reason = %i)", err);
+    if (bbs_gen(&bp, p, q, 0, (flags & f_progress) ? pgen_ev : 0, 0))
+      die(EXIT_FAILURE, "modulus generation failed");
     m = bp.n;
 
     if (show) {
@@ -765,7 +789,8 @@ static gen generators[] = {
   { "rand",            gen_rand,       0,
     "[-n] [-k KEY-PHRASE] [-t TEXT-BLOCK] [-H HEX-BLOCK]" },
   { "bbs",             gen_bbs,        0,
-    "[-gS] [-s SEED] [-m MODULUS] [-b BITS" },
+    "[-gS] [-s SEED] [-m MODULUS] [-b BITS] [-k KEYRING] [-i TAG] [-t TYPE]"
+  },
   { 0,                 0,              0, 0 },
 };