Fix the PKCS#8 DSA code so it works again. All the

broken formats worked but the valid didn't :-(
This commit is contained in:
Dr. Stephen Henson 2000-03-07 01:03:33 +00:00
parent 4c4d87f95f
commit 48fe0eec67
2 changed files with 15 additions and 3 deletions

View File

@ -4,6 +4,10 @@
Changes between 0.9.5 and 0.9.5a [XX XXX 2000] Changes between 0.9.5 and 0.9.5a [XX XXX 2000]
*) Fix the PKCS#8 DSA private key code so it decodes keys again
and fix a memory leak.
[Steve Henson]
*) In util/mkerr.pl (which implements 'make errors'), preserve *) In util/mkerr.pl (which implements 'make errors'), preserve
reason strings from the previous version of the .c file, as reason strings from the previous version of the .c file, as
the default to have only downcase letters (and digits) in the default to have only downcase letters (and digits) in

View File

@ -133,7 +133,7 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8)
* SEQUENCE {parameters, priv_key} * SEQUENCE {parameters, priv_key}
* SEQUENCE {pub_key, priv_key} * SEQUENCE {pub_key, priv_key}
*/ */
t1 = (ASN1_TYPE *)sk_value(ndsa, 0); t1 = (ASN1_TYPE *)sk_value(ndsa, 0);
t2 = (ASN1_TYPE *)sk_value(ndsa, 1); t2 = (ASN1_TYPE *)sk_value(ndsa, 1);
if(t1->type == V_ASN1_SEQUENCE) { if(t1->type == V_ASN1_SEQUENCE) {
@ -152,7 +152,14 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8)
goto dsaerr; goto dsaerr;
} }
privkey = t2->value.integer; privkey = t2->value.integer;
} else if (!(privkey=d2i_ASN1_INTEGER (NULL, &p, pkeylen))) { } else {
if (!(privkey=d2i_ASN1_INTEGER (NULL, &p, pkeylen))) {
EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR);
goto dsaerr;
}
param = p8->pkeyalg->parameter;
}
if (!param || (param->type != V_ASN1_SEQUENCE)) {
EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR);
goto dsaerr; goto dsaerr;
} }
@ -186,7 +193,8 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8)
EVP_PKEY_assign_DSA(pkey, dsa); EVP_PKEY_assign_DSA(pkey, dsa);
BN_CTX_free (ctx); BN_CTX_free (ctx);
sk_pop_free(ndsa, ASN1_TYPE_free); if(ndsa) sk_pop_free(ndsa, ASN1_TYPE_free);
else ASN1_INTEGER_free(privkey);
break; break;
dsaerr: dsaerr:
BN_CTX_free (ctx); BN_CTX_free (ctx);