Constant time DH [sync with mainstream].
Submitted by: bodo
This commit is contained in:
parent
31def5ae59
commit
6b6f64da2d
@ -145,8 +145,22 @@ static int generate_key(DH *dh)
|
|||||||
l = dh->length ? dh->length : BN_num_bits(dh->p)-1; /* secret exponent length */
|
l = dh->length ? dh->length : BN_num_bits(dh->p)-1; /* secret exponent length */
|
||||||
if (!BN_rand(priv_key, l, 0, 0)) goto err;
|
if (!BN_rand(priv_key, l, 0, 0)) goto err;
|
||||||
}
|
}
|
||||||
if (!dh->meth->bn_mod_exp(dh, pub_key, dh->g, priv_key,dh->p,ctx,mont))
|
|
||||||
goto err;
|
{
|
||||||
|
BIGNUM local_prk;
|
||||||
|
BIGNUM *prk;
|
||||||
|
|
||||||
|
if ((dh->flags & DH_FLAG_NO_EXP_CONSTTIME) == 0)
|
||||||
|
{
|
||||||
|
prk = &local_prk;
|
||||||
|
BN_with_flags(prk, priv_key, BN_FLG_EXP_CONSTTIME);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
prk = priv_key;
|
||||||
|
|
||||||
|
if (!dh->meth->bn_mod_exp(dh, pub_key, dh->g, prk, dh->p, ctx, mont))
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
dh->pub_key=pub_key;
|
dh->pub_key=pub_key;
|
||||||
dh->priv_key=priv_key;
|
dh->priv_key=priv_key;
|
||||||
@ -184,6 +198,11 @@ static int compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh)
|
|||||||
mont = BN_MONT_CTX_set_locked(
|
mont = BN_MONT_CTX_set_locked(
|
||||||
(BN_MONT_CTX **)&dh->method_mont_p,
|
(BN_MONT_CTX **)&dh->method_mont_p,
|
||||||
CRYPTO_LOCK_DH, dh->p, ctx);
|
CRYPTO_LOCK_DH, dh->p, ctx);
|
||||||
|
if ((dh->flags & DH_FLAG_NO_EXP_CONSTTIME) == 0)
|
||||||
|
{
|
||||||
|
/* XXX */
|
||||||
|
BN_set_flags(dh->priv_key, BN_FLG_EXP_CONSTTIME);
|
||||||
|
}
|
||||||
if (!mont)
|
if (!mont)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -206,7 +225,10 @@ static int dh_bn_mod_exp(const DH *dh, BIGNUM *r,
|
|||||||
const BIGNUM *m, BN_CTX *ctx,
|
const BIGNUM *m, BN_CTX *ctx,
|
||||||
BN_MONT_CTX *m_ctx)
|
BN_MONT_CTX *m_ctx)
|
||||||
{
|
{
|
||||||
if (a->top == 1)
|
/* If a is only one word long and constant time is false, use the faster
|
||||||
|
* exponenentiation function.
|
||||||
|
*/
|
||||||
|
if (a->top == 1 && ((dh->flags & DH_FLAG_NO_EXP_CONSTTIME) != 0))
|
||||||
{
|
{
|
||||||
BN_ULONG A = a->d[0];
|
BN_ULONG A = a->d[0];
|
||||||
return BN_mod_exp_mont_word(r,A,p,m,ctx,m_ctx);
|
return BN_mod_exp_mont_word(r,A,p,m,ctx,m_ctx);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user