diff options
Diffstat (limited to 'src/lib/libcrypto/evp/evp_pkey.c')
-rw-r--r-- | src/lib/libcrypto/evp/evp_pkey.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/lib/libcrypto/evp/evp_pkey.c b/src/lib/libcrypto/evp/evp_pkey.c index d5e6f5880f..4ab091fa56 100644 --- a/src/lib/libcrypto/evp/evp_pkey.c +++ b/src/lib/libcrypto/evp/evp_pkey.c | |||
@@ -133,7 +133,7 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8) | |||
133 | * SEQUENCE {parameters, priv_key} | 133 | * SEQUENCE {parameters, priv_key} |
134 | * SEQUENCE {pub_key, priv_key} | 134 | * SEQUENCE {pub_key, priv_key} |
135 | */ | 135 | */ |
136 | 136 | ||
137 | t1 = (ASN1_TYPE *)sk_value(ndsa, 0); | 137 | t1 = (ASN1_TYPE *)sk_value(ndsa, 0); |
138 | t2 = (ASN1_TYPE *)sk_value(ndsa, 1); | 138 | t2 = (ASN1_TYPE *)sk_value(ndsa, 1); |
139 | if(t1->type == V_ASN1_SEQUENCE) { | 139 | if(t1->type == V_ASN1_SEQUENCE) { |
@@ -152,7 +152,14 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8) | |||
152 | goto dsaerr; | 152 | goto dsaerr; |
153 | } | 153 | } |
154 | privkey = t2->value.integer; | 154 | privkey = t2->value.integer; |
155 | } else if (!(privkey=d2i_ASN1_INTEGER (NULL, &p, pkeylen))) { | 155 | } else { |
156 | if (!(privkey=d2i_ASN1_INTEGER (NULL, &p, pkeylen))) { | ||
157 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); | ||
158 | goto dsaerr; | ||
159 | } | ||
160 | param = p8->pkeyalg->parameter; | ||
161 | } | ||
162 | if (!param || (param->type != V_ASN1_SEQUENCE)) { | ||
156 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); | 163 | EVPerr(EVP_F_EVP_PKCS82PKEY, EVP_R_DECODE_ERROR); |
157 | goto dsaerr; | 164 | goto dsaerr; |
158 | } | 165 | } |
@@ -186,7 +193,8 @@ EVP_PKEY *EVP_PKCS82PKEY (PKCS8_PRIV_KEY_INFO *p8) | |||
186 | 193 | ||
187 | EVP_PKEY_assign_DSA(pkey, dsa); | 194 | EVP_PKEY_assign_DSA(pkey, dsa); |
188 | BN_CTX_free (ctx); | 195 | BN_CTX_free (ctx); |
189 | sk_pop_free(ndsa, ASN1_TYPE_free); | 196 | if(ndsa) sk_pop_free(ndsa, ASN1_TYPE_free); |
197 | else ASN1_INTEGER_free(privkey); | ||
190 | break; | 198 | break; |
191 | dsaerr: | 199 | dsaerr: |
192 | BN_CTX_free (ctx); | 200 | BN_CTX_free (ctx); |