* Returns: A pointer to the challenge block.
*
* Use: Returns a pointer to a new challenge block to fill in.
+ * In particular, the @c@ and @r@ members are left
+ * uninitialized.
*/
static kxchal *kxc_new(keyexch *kx)
/* --- Fill in the new structure --- */
kxc = CREATE(kxchal);
- kxc->c = G_CREATE(kx->kpriv->g);
- kxc->r = G_CREATE(kx->kpriv->g);
kxc->ks = 0;
kxc->kx = kx;
kxc->f = 0;
/* --- Fill in a new challenge block --- */
kxc = kxc_new(kx);
- G_COPY(g, kxc->c, c);
- G_COPY(g, kxc->r, r);
+ kxc->c = c; c = 0;
+ kxc->r = r; r = G_CREATE(g);
h = GH_INIT(algs->h); HASH_STRING(h, "tripe-check-hash");
GH_HASH(h, ck, ixsz);
/* --- Work out the shared key --- */
- G_EXP(g, r, c, kx->alpha);
+ G_EXP(g, r, kxc->c, kx->alpha);
IF_TRACING(T_KEYEXCH, IF_TRACING(T_CRYPTO, {
trace(T_CRYPTO, "crypto: shared secret = %s", gestr(g, r));
}))
kxc->ks = ks_gen(BBASE(&bb), x, y, z, kx->p);
}
- G_DESTROY(g, c);
+ if (c) G_DESTROY(g, c);
G_DESTROY(g, cc);
G_DESTROY(g, r);
mp_drop(cv);
a_warn("KX", "?PEER", kx->p, "bad-expected-reply-log", A_END);
goto bad;
bad:
- G_DESTROY(g, c);
+ if (c) G_DESTROY(g, c);
G_DESTROY(g, cc);
G_DESTROY(g, r);
mp_drop(cv);