Update to OpenSSL 1.0.2.o
This commit is contained in:
@@ -133,6 +133,7 @@ static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
|
||||
unsigned char *penc = NULL;
|
||||
int penclen;
|
||||
ASN1_STRING *str = NULL;
|
||||
ASN1_OBJECT *aobj;
|
||||
|
||||
dsa = pkey->pkey.dsa;
|
||||
if (pkey->save_parameters && dsa->p && dsa->q && dsa->g) {
|
||||
@@ -159,8 +160,11 @@ static int dsa_pub_encode(X509_PUBKEY *pk, const EVP_PKEY *pkey)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_DSA),
|
||||
ptype, str, penc, penclen))
|
||||
aobj = OBJ_nid2obj(EVP_PKEY_DSA);
|
||||
if (aobj == NULL)
|
||||
goto err;
|
||||
|
||||
if (X509_PUBKEY_set0_param(pk, aobj, ptype, str, penc, penclen))
|
||||
return 1;
|
||||
|
||||
err:
|
||||
@@ -258,6 +262,7 @@ static int dsa_priv_decode(EVP_PKEY *pkey, PKCS8_PRIV_KEY_INFO *p8)
|
||||
goto dsaerr;
|
||||
}
|
||||
|
||||
BN_set_flags(dsa->priv_key, BN_FLG_CONSTTIME);
|
||||
if (!BN_mod_exp(dsa->pub_key, dsa->g, dsa->priv_key, dsa->p, ctx)) {
|
||||
DSAerr(DSA_F_DSA_PRIV_DECODE, DSA_R_BN_ERROR);
|
||||
goto dsaerr;
|
||||
|
||||
@@ -482,6 +482,8 @@ int dsa_builtin_paramgen2(DSA *ret, size_t L, size_t N,
|
||||
} else {
|
||||
p = BN_CTX_get(ctx);
|
||||
q = BN_CTX_get(ctx);
|
||||
if (q == NULL)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!BN_lshift(test, BN_value_one(), L - 1))
|
||||
|
||||
@@ -224,7 +224,9 @@ static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp,
|
||||
{
|
||||
BN_CTX *ctx;
|
||||
BIGNUM k, kq, *K, *kinv = NULL, *r = NULL;
|
||||
BIGNUM l, m;
|
||||
int ret = 0;
|
||||
int q_bits;
|
||||
|
||||
if (!dsa->p || !dsa->q || !dsa->g) {
|
||||
DSAerr(DSA_F_DSA_SIGN_SETUP, DSA_R_MISSING_PARAMETERS);
|
||||
@@ -233,6 +235,8 @@ static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp,
|
||||
|
||||
BN_init(&k);
|
||||
BN_init(&kq);
|
||||
BN_init(&l);
|
||||
BN_init(&m);
|
||||
|
||||
if (ctx_in == NULL) {
|
||||
if ((ctx = BN_CTX_new()) == NULL)
|
||||
@@ -243,6 +247,13 @@ static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp,
|
||||
if ((r = BN_new()) == NULL)
|
||||
goto err;
|
||||
|
||||
/* Preallocate space */
|
||||
q_bits = BN_num_bits(dsa->q);
|
||||
if (!BN_set_bit(&k, q_bits)
|
||||
|| !BN_set_bit(&l, q_bits)
|
||||
|| !BN_set_bit(&m, q_bits))
|
||||
goto err;
|
||||
|
||||
/* Get random k */
|
||||
do
|
||||
if (!BN_rand_range(&k, dsa->q))
|
||||
@@ -263,25 +274,24 @@ static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp,
|
||||
/* Compute r = (g^k mod p) mod q */
|
||||
|
||||
if ((dsa->flags & DSA_FLAG_NO_EXP_CONSTTIME) == 0) {
|
||||
if (!BN_copy(&kq, &k))
|
||||
/*
|
||||
* We do not want timing information to leak the length of k, so we
|
||||
* compute G^k using an equivalent scalar of fixed bit-length.
|
||||
*
|
||||
* We unconditionally perform both of these additions to prevent a
|
||||
* small timing information leakage. We then choose the sum that is
|
||||
* one bit longer than the modulus.
|
||||
*
|
||||
* TODO: revisit the BN_copy aiming for a memory access agnostic
|
||||
* conditional copy.
|
||||
*/
|
||||
if (!BN_add(&l, &k, dsa->q)
|
||||
|| !BN_add(&m, &l, dsa->q)
|
||||
|| !BN_copy(&kq, BN_num_bits(&l) > q_bits ? &l : &m))
|
||||
goto err;
|
||||
|
||||
BN_set_flags(&kq, BN_FLG_CONSTTIME);
|
||||
|
||||
/*
|
||||
* We do not want timing information to leak the length of k, so we
|
||||
* compute g^k using an equivalent exponent of fixed length. (This
|
||||
* is a kludge that we need because the BN_mod_exp_mont() does not
|
||||
* let us specify the desired timing behaviour.)
|
||||
*/
|
||||
|
||||
if (!BN_add(&kq, &kq, dsa->q))
|
||||
goto err;
|
||||
if (BN_num_bits(&kq) <= BN_num_bits(dsa->q)) {
|
||||
if (!BN_add(&kq, &kq, dsa->q))
|
||||
goto err;
|
||||
}
|
||||
|
||||
K = &kq;
|
||||
} else {
|
||||
K = &k;
|
||||
@@ -314,7 +324,9 @@ static int dsa_sign_setup(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp,
|
||||
BN_CTX_free(ctx);
|
||||
BN_clear_free(&k);
|
||||
BN_clear_free(&kq);
|
||||
return (ret);
|
||||
BN_clear_free(&l);
|
||||
BN_clear_free(&m);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int dsa_do_verify(const unsigned char *dgst, int dgst_len,
|
||||
|
||||
@@ -157,7 +157,7 @@ int main(int argc, char **argv)
|
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
|
||||
|
||||
ERR_load_crypto_strings();
|
||||
RAND_seed(rnd_seed, sizeof rnd_seed);
|
||||
RAND_seed(rnd_seed, sizeof(rnd_seed));
|
||||
|
||||
BIO_printf(bio_err, "test generation of DSA parameters\n");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user