diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/d2i_pr.c')
-rw-r--r-- | src/lib/libcrypto/asn1/d2i_pr.c | 59 |
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 | } |