/* -*-c-*-
*
- * $Id: rspit.c,v 1.1 1999/12/10 23:29:13 mdw Exp $
+ * $Id: rspit.c,v 1.3 2000/02/12 18:21:03 mdw Exp $
*
* Spit out random numbers
*
/*----- Revision history --------------------------------------------------*
*
* $Log: rspit.c,v $
+ * Revision 1.3 2000/02/12 18:21:03 mdw
+ * Overhaul of key management (again).
+ *
+ * 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.
*
#include <mLib/sub.h>
#include "grand.h"
+#include "key.h"
#include "lcrand.h"
#include "fibrand.h"
/* --- 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 --- *
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 --- */
{ "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();
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);
}
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;
-
- if ((err = bbs_gen(&bp, p, q, 0,
- (flags & f_progress) ? bbsev : 0, 0)) != 0)
- die(EXIT_FAILURE, "modulus generation failed (reason = %i)", err);
+ bbs_param bp;
+
+ if (bbs_gen(&bp, bits, &rand_global, 0,
+ (flags & f_progress) ? pgen_ev : 0, 0))
+ die(EXIT_FAILURE, "modulus generation failed");
m = bp.n;
if (show) {
fputc('\n', stderr);
}
- mp_drop(p);
- mp_drop(q);
mp_drop(bp.p);
mp_drop(bp.q);
}
{ "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 },
};