pub/dh-kcdsa.c: Make the cleanup flow less crazy.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 23 Oct 2019 03:09:05 +0000 (04:09 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 9 May 2020 19:57:33 +0000 (20:57 +0100)
I'm pretty sure I've fixed bugs in here.

pub/dh-kcdsa.c

index 4de00c6..6bd3e19 100644 (file)
@@ -66,12 +66,12 @@ int dh_kcdsagen(dh_param *dp, unsigned ql, unsigned pl,
   rabin rb;
   int rc = PGEN_ABORT;
   int i;
   rabin rb;
   int rc = PGEN_ABORT;
   int i;
-  mp *x;
+  mp *x = MP_NEW;
 
   /* --- 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);
@@ -82,16 +82,16 @@ int dh_kcdsagen(dh_param *dp, unsigned ql, unsigned pl,
 
   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);
+  dp->p = sp[1].u.x;
   if (!dp->q)
     goto fail_1;
   if (!dp->q)
     goto fail_1;
-  dp->p = sp[1].u.x;
 
   /* --- Third trick: find a generator --- */
 
 
   /* --- Third trick: find a generator --- */
 
@@ -104,16 +104,16 @@ int dh_kcdsagen(dh_param *dp, unsigned ql, unsigned pl,
               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)
-    goto fail_2;
+    goto fail_1;
 
   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);
 fail_1:
 fail_1:
+  mp_drop(dp->p);
+  mp_drop(dp->q);
 fail_0:
 done:
   mp_drop(x);
 fail_0:
 done:
   mp_drop(x);