From 02b1cf937aed3e951e96a955e56a1cc071c332d8 Mon Sep 17 00:00:00 2001 From: mdw Date: Sat, 17 Jun 2000 10:43:57 +0000 Subject: [PATCH] Move GCD filter to separate file. Handle failures from pgen_jump. --- bbs-gen.c | 99 ++++++++++++++++----------------------------------------------- 1 file changed, 24 insertions(+), 75 deletions(-) diff --git a/bbs-gen.c b/bbs-gen.c index 43b6990..1c2d035 100644 --- a/bbs-gen.c +++ b/bbs-gen.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: bbs-gen.c,v 1.3 2000/02/12 18:21:02 mdw Exp $ + * $Id: bbs-gen.c,v 1.4 2000/06/17 10:43:57 mdw Exp $ * * Generate Blum integers * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: bbs-gen.c,v $ + * Revision 1.4 2000/06/17 10:43:57 mdw + * Move GCD filter to separate file. Handle failures from pgen_jump. + * * Revision 1.3 2000/02/12 18:21:02 mdw * Overhaul of key management (again). * @@ -53,74 +56,6 @@ #include "pgen.h" #include "strongprime.h" -/*----- Data structures ---------------------------------------------------*/ - -typedef struct gcdctx { - mp *q, *jq; - pfilt p, jp; - mp *r; -} gcdctx; - -/*----- Custom stepper ----------------------------------------------------*/ - -static int gcdstep(int rq, pgen_event *ev, void *p) -{ - gcdctx *g = p; - int rc = PGEN_ABORT; - mp *z = MP_NEW; - - switch (rq) { - - /* --- Set everything up --- */ - - case PGEN_BEGIN: { - mp *p = ev->m; - if ((p->v[0] & 3) != 3) - p = mp_add(p, p, g->jp.m); - rc = pfilt_create(&g->p, p); - g->q = mp_lsr(MP_NEW, p, 1); - g->jq = MP_COPY(g->jp.m); - pfilt_muladd(&g->jp, &g->jp, 2, 0); - g->jq = mp_lsr(MP_NEW, p, 1); - mp_drop(p); - } break; - - /* --- Grind through another iteration --- */ - - case PGEN_TRY: - mp_drop(ev->m); - rc = pfilt_jump(&g->p, &g->jp); - g->q = mp_add(g->q, g->q, g->jq); - break; - - /* --- Finished --- */ - - case PGEN_DONE: - pfilt_destroy(&g->p); - mp_drop(g->q); - mp_drop(g->jq); - return (PGEN_DONE); - } - - /* --- Step on until everything is OK --- */ - - for (;;) { - if (rc != PGEN_FAIL) { - mp_gcd(&z, 0, 0, g->r, g->q); - if (MP_CMP(z, !=, MP_ONE)) - rc = PGEN_FAIL; - } - if (rc != PGEN_FAIL) - break; - rc = pfilt_jump(&g->p, &g->jp); - g->q = mp_add(g->q, g->q, g->jq); - } - - mp_drop(z); - ev->m = MP_COPY(g->p.m); - return (rc); -} - /*----- Main code ---------------------------------------------------------*/ /* --- @bbs_gen@ --- * @@ -146,32 +81,46 @@ int bbs_gen(bbs_param *bp, unsigned nbits, grand *r, unsigned n, { rabin rb; pgen_safejumpctx j; - gcdctx g; + pgen_gcdstepctx g; unsigned nb = nbits/2; mp *x = MP_NEW; /* --- Generate @p@ --- */ +again: if ((x = strongprime_setup("p", x, &j.jq, nb, r, n, event, ectx)) == 0) goto fail_x; bp->p = pgen("p", MP_NEW, x, event, ectx, n, pgen_safejump, &j, rabin_iters(nb), pgen_test, &rb); pfilt_destroy(&j.jq); - if (!bp->p) - goto fail_p; + if (!bp->p) { + if (n) + goto fail_p; + goto again; + } /* --- Generate @q@ --- */ nb = nbits - nb; if ((x = strongprime_setup("q", x, &g.jp, nb, r, n, event, ectx)) == 0) goto fail_q; + if ((x->v[0] & 3) != 3) + x = mp_add(x, x, g.jp.m); + pfilt_muladd(&g.jp, &g.jp, 2, 0); g.r = mp_lsr(MP_NEW, bp->p, 1); - bp->q = pgen("q", MP_NEW, x, event, ectx, n, gcdstep, &g, + g.g = MP_NEW; + g.max = MP_ONE; + bp->q = pgen("q", MP_NEW, x, event, ectx, n, pgen_gcdstep, &g, rabin_iters(nb), pgen_test, &rb); pfilt_destroy(&g.jp); mp_drop(g.r); - if (!bp->q) - goto fail_q; + mp_drop(g.g); + if (!bp->q) { + if (n) + goto fail_q; + mp_drop(bp->p); + goto again; + } /* --- Compute @n@ --- */ -- 2.11.0