I'm pretty sure I've fixed bugs in here.
rabin rb;
int rc = PGEN_ABORT;
int i;
rabin rb;
int rc = PGEN_ABORT;
int i;
/* --- First trick: find %$v$% --- */
pf.step = 2;
/* --- First trick: find %$v$% --- */
pf.step = 2;
- x = mprand(MP_NEW, pl - ql, r, 1);
+ x = mprand(x, pl - ql, r, 1);
x = pgen("v", x, x, ev, ec,
steps, pgen_filter, &pf,
rabin_iters(pl - ql), pgen_test, &rb);
x = pgen("v", x, x, ev, ec,
steps, pgen_filter, &pf,
rabin_iters(pl - ql), pgen_test, &rb);
x = mp_lsl(x, x, 1);
sp[0].add = MP_ZERO; sp[0].mul = MP_ONE; sp[0].f = 0;
x = mp_lsl(x, x, 1);
sp[0].add = MP_ZERO; sp[0].mul = MP_ONE; sp[0].f = 0;
- sp[1].add = MP_ONE; sp[1].mul = x; sp[1].f = PGENF_KEEP;
+ sp[1].add = MP_ONE; sp[1].mul = x; sp[1].f = PGENF_KEEP; x = MP_NEW;
ss.step = MP_TWO; ss.v = sp; ss.n = N(sp);
ss.step = MP_TWO; ss.v = sp; ss.n = N(sp);
- x = mprand(MP_NEW, ql, r, 1);
+ x = mprand(x, ql, r, 1);
dp->q = pgen("p", MP_NEW, x, ev, ec,
steps, pgen_simulstep, &ss,
rabin_iters(ql), pgen_simultest, &ss);
mp_drop(sp[1].mul);
dp->q = pgen("p", MP_NEW, x, ev, ec,
steps, pgen_simulstep, &ss,
rabin_iters(ql), pgen_simultest, &ss);
mp_drop(sp[1].mul);
/* --- Third trick: find a generator --- */
/* --- Third trick: find a generator --- */
0, prim_step, &i, 1, prim_test, &pc);
mpmont_destroy(&pc.mm);
if (!dp->g)
0, prim_step, &i, 1, prim_test, &pc);
mpmont_destroy(&pc.mm);
if (!dp->g)
rc = PGEN_DONE;
goto done;
/* --- Tidying up and going home --- */
rc = PGEN_DONE;
goto done;
/* --- Tidying up and going home --- */
-fail_2:
- mp_drop(dp->p);
+ mp_drop(dp->p);
+ mp_drop(dp->q);
fail_0:
done:
mp_drop(x);
fail_0:
done:
mp_drop(x);