summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/d2i_pr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/d2i_pr.c')
-rw-r--r--src/lib/libcrypto/asn1/d2i_pr.c59
1 files changed, 24 insertions, 35 deletions
diff --git a/src/lib/libcrypto/asn1/d2i_pr.c b/src/lib/libcrypto/asn1/d2i_pr.c
index cbbcdae7df..5e6003ca5b 100644
--- a/src/lib/libcrypto/asn1/d2i_pr.c
+++ b/src/lib/libcrypto/asn1/d2i_pr.c
@@ -73,37 +73,29 @@ EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp,
73{ 73{
74 EVP_PKEY *ret; 74 EVP_PKEY *ret;
75 75
76 if ((a == NULL) || (*a == NULL)) 76 if ((a == NULL) || (*a == NULL)) {
77 { 77 if ((ret=EVP_PKEY_new()) == NULL) {
78 if ((ret=EVP_PKEY_new()) == NULL)
79 {
80 ASN1err(ASN1_F_D2I_PRIVATEKEY,ERR_R_EVP_LIB); 78 ASN1err(ASN1_F_D2I_PRIVATEKEY,ERR_R_EVP_LIB);
81 return(NULL); 79 return(NULL);
82 } 80 }
83 } 81 } else {
84 else
85 {
86 ret= *a; 82 ret= *a;
87#ifndef OPENSSL_NO_ENGINE 83#ifndef OPENSSL_NO_ENGINE
88 if (ret->engine) 84 if (ret->engine) {
89 {
90 ENGINE_finish(ret->engine); 85 ENGINE_finish(ret->engine);
91 ret->engine = NULL; 86 ret->engine = NULL;
92 } 87 }
93#endif 88#endif
94 } 89 }
95 90
96 if (!EVP_PKEY_set_type(ret, type)) 91 if (!EVP_PKEY_set_type(ret, type)) {
97 {
98 ASN1err(ASN1_F_D2I_PRIVATEKEY,ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE); 92 ASN1err(ASN1_F_D2I_PRIVATEKEY,ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE);
99 goto err; 93 goto err;
100 } 94 }
101 95
102 if (!ret->ameth->old_priv_decode || 96 if (!ret->ameth->old_priv_decode ||
103 !ret->ameth->old_priv_decode(ret, pp, length)) 97 !ret->ameth->old_priv_decode(ret, pp, length)) {
104 { 98 if (ret->ameth->priv_decode) {
105 if (ret->ameth->priv_decode)
106 {
107 PKCS8_PRIV_KEY_INFO *p8=NULL; 99 PKCS8_PRIV_KEY_INFO *p8=NULL;
108 p8=d2i_PKCS8_PRIV_KEY_INFO(NULL,pp,length); 100 p8=d2i_PKCS8_PRIV_KEY_INFO(NULL,pp,length);
109 if (!p8) goto err; 101 if (!p8) goto err;
@@ -111,9 +103,7 @@ EVP_PKEY *d2i_PrivateKey(int type, EVP_PKEY **a, const unsigned char **pp,
111 ret = EVP_PKCS82PKEY(p8); 103 ret = EVP_PKCS82PKEY(p8);
112 PKCS8_PRIV_KEY_INFO_free(p8); 104 PKCS8_PRIV_KEY_INFO_free(p8);
113 105
114 } 106 } else {
115 else
116 {
117 ASN1err(ASN1_F_D2I_PRIVATEKEY,ERR_R_ASN1_LIB); 107 ASN1err(ASN1_F_D2I_PRIVATEKEY,ERR_R_ASN1_LIB);
118 goto err; 108 goto err;
119 } 109 }
@@ -146,25 +136,24 @@ EVP_PKEY *d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp,
146 keytype = EVP_PKEY_DSA; 136 keytype = EVP_PKEY_DSA;
147 else if (sk_ASN1_TYPE_num(inkey) == 4) 137 else if (sk_ASN1_TYPE_num(inkey) == 4)
148 keytype = EVP_PKEY_EC; 138 keytype = EVP_PKEY_EC;
149 else if (sk_ASN1_TYPE_num(inkey) == 3) 139 else if (sk_ASN1_TYPE_num(inkey) == 3) {
150 { /* This seems to be PKCS8, not traditional format */ 140 /* This seems to be PKCS8, not traditional format */
151 PKCS8_PRIV_KEY_INFO *p8 = d2i_PKCS8_PRIV_KEY_INFO(NULL,pp,length); 141 PKCS8_PRIV_KEY_INFO *p8 = d2i_PKCS8_PRIV_KEY_INFO(NULL,pp,length);
152 EVP_PKEY *ret; 142 EVP_PKEY *ret;
153 143
154 sk_ASN1_TYPE_pop_free(inkey, ASN1_TYPE_free); 144 sk_ASN1_TYPE_pop_free(inkey, ASN1_TYPE_free);
155 if (!p8) 145 if (!p8) {
156 { 146 ASN1err(ASN1_F_D2I_AUTOPRIVATEKEY,ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE);
157 ASN1err(ASN1_F_D2I_AUTOPRIVATEKEY,ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE); 147 return NULL;
158 return NULL; 148 }
159 } 149 ret = EVP_PKCS82PKEY(p8);
160 ret = EVP_PKCS82PKEY(p8); 150 PKCS8_PRIV_KEY_INFO_free(p8);
161 PKCS8_PRIV_KEY_INFO_free(p8); 151 if (a) {
162 if (a) { 152 *a = ret;
163 *a = ret;
164 } 153 }
165 return ret; 154 return ret;
166 } 155 } else
167 else keytype = EVP_PKEY_RSA; 156 keytype = EVP_PKEY_RSA;
168 sk_ASN1_TYPE_pop_free(inkey, ASN1_TYPE_free); 157 sk_ASN1_TYPE_pop_free(inkey, ASN1_TYPE_free);
169 return d2i_PrivateKey(keytype, a, pp, length); 158 return d2i_PrivateKey(keytype, a, pp, length);
170} 159}