From 87de7c732a539c73dfbd8fcfca8be95473817c30 Mon Sep 17 00:00:00 2001 From: mdw Date: Wed, 22 Dec 1999 15:59:51 +0000 Subject: [PATCH] New prime-search system. Read BBS keys from key files. --- rspit.c | 105 +++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 65 insertions(+), 40 deletions(-) diff --git a/rspit.c b/rspit.c index 2da0089..3c14ab4 100644 --- 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 #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 }, }; -- 2.11.0