diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/x_pubkey.c')
| -rw-r--r-- | src/lib/libcrypto/asn1/x_pubkey.c | 73 |
1 files changed, 23 insertions, 50 deletions
diff --git a/src/lib/libcrypto/asn1/x_pubkey.c b/src/lib/libcrypto/asn1/x_pubkey.c index 454d50f24c..1d6ab6580a 100644 --- a/src/lib/libcrypto/asn1/x_pubkey.c +++ b/src/lib/libcrypto/asn1/x_pubkey.c | |||
| @@ -72,8 +72,7 @@ | |||
| 72 | static int pubkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | 72 | static int pubkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, |
| 73 | void *exarg) | 73 | void *exarg) |
| 74 | { | 74 | { |
| 75 | if (operation == ASN1_OP_FREE_POST) | 75 | if (operation == ASN1_OP_FREE_POST) { |
| 76 | { | ||
| 77 | X509_PUBKEY *pubkey = (X509_PUBKEY *)*pval; | 76 | X509_PUBKEY *pubkey = (X509_PUBKEY *)*pval; |
| 78 | EVP_PKEY_free(pubkey->pkey); | 77 | EVP_PKEY_free(pubkey->pkey); |
| 79 | } | 78 | } |
| @@ -95,26 +94,19 @@ int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) | |||
| 95 | 94 | ||
| 96 | if ((pk=X509_PUBKEY_new()) == NULL) goto error; | 95 | if ((pk=X509_PUBKEY_new()) == NULL) goto error; |
| 97 | 96 | ||
| 98 | if (pkey->ameth) | 97 | if (pkey->ameth) { |
| 99 | { | 98 | if (pkey->ameth->pub_encode) { |
| 100 | if (pkey->ameth->pub_encode) | 99 | if (!pkey->ameth->pub_encode(pk, pkey)) { |
| 101 | { | ||
| 102 | if (!pkey->ameth->pub_encode(pk, pkey)) | ||
| 103 | { | ||
| 104 | X509err(X509_F_X509_PUBKEY_SET, | 100 | X509err(X509_F_X509_PUBKEY_SET, |
| 105 | X509_R_PUBLIC_KEY_ENCODE_ERROR); | 101 | X509_R_PUBLIC_KEY_ENCODE_ERROR); |
| 106 | goto error; | 102 | goto error; |
| 107 | } | 103 | } |
| 108 | } | 104 | } else { |
| 109 | else | ||
| 110 | { | ||
| 111 | X509err(X509_F_X509_PUBKEY_SET, | 105 | X509err(X509_F_X509_PUBKEY_SET, |
| 112 | X509_R_METHOD_NOT_SUPPORTED); | 106 | X509_R_METHOD_NOT_SUPPORTED); |
| 113 | goto error; | 107 | goto error; |
| 114 | } | 108 | } |
| 115 | } | 109 | } else { |
| 116 | else | ||
| 117 | { | ||
| 118 | X509err(X509_F_X509_PUBKEY_SET,X509_R_UNSUPPORTED_ALGORITHM); | 110 | X509err(X509_F_X509_PUBKEY_SET,X509_R_UNSUPPORTED_ALGORITHM); |
| 119 | goto error; | 111 | goto error; |
| 120 | } | 112 | } |
| @@ -136,51 +128,41 @@ EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key) | |||
| 136 | 128 | ||
| 137 | if (key == NULL) goto error; | 129 | if (key == NULL) goto error; |
| 138 | 130 | ||
| 139 | if (key->pkey != NULL) | 131 | if (key->pkey != NULL) { |
| 140 | { | ||
| 141 | CRYPTO_add(&key->pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); | 132 | CRYPTO_add(&key->pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); |
| 142 | return key->pkey; | 133 | return key->pkey; |
| 143 | } | 134 | } |
| 144 | 135 | ||
| 145 | if (key->public_key == NULL) goto error; | 136 | if (key->public_key == NULL) goto error; |
| 146 | 137 | ||
| 147 | if ((ret = EVP_PKEY_new()) == NULL) | 138 | if ((ret = EVP_PKEY_new()) == NULL) { |
| 148 | { | ||
| 149 | X509err(X509_F_X509_PUBKEY_GET, ERR_R_MALLOC_FAILURE); | 139 | X509err(X509_F_X509_PUBKEY_GET, ERR_R_MALLOC_FAILURE); |
| 150 | goto error; | 140 | goto error; |
| 151 | } | 141 | } |
| 152 | 142 | ||
| 153 | if (!EVP_PKEY_set_type(ret, OBJ_obj2nid(key->algor->algorithm))) | 143 | if (!EVP_PKEY_set_type(ret, OBJ_obj2nid(key->algor->algorithm))) { |
| 154 | { | ||
| 155 | X509err(X509_F_X509_PUBKEY_GET,X509_R_UNSUPPORTED_ALGORITHM); | 144 | X509err(X509_F_X509_PUBKEY_GET,X509_R_UNSUPPORTED_ALGORITHM); |
| 156 | goto error; | 145 | goto error; |
| 157 | } | 146 | } |
| 158 | 147 | ||
| 159 | if (ret->ameth->pub_decode) | 148 | if (ret->ameth->pub_decode) { |
| 160 | { | 149 | if (!ret->ameth->pub_decode(ret, key)) { |
| 161 | if (!ret->ameth->pub_decode(ret, key)) | ||
| 162 | { | ||
| 163 | X509err(X509_F_X509_PUBKEY_GET, | 150 | X509err(X509_F_X509_PUBKEY_GET, |
| 164 | X509_R_PUBLIC_KEY_DECODE_ERROR); | 151 | X509_R_PUBLIC_KEY_DECODE_ERROR); |
| 165 | goto error; | 152 | goto error; |
| 166 | } | 153 | } |
| 167 | } | 154 | } else { |
| 168 | else | ||
| 169 | { | ||
| 170 | X509err(X509_F_X509_PUBKEY_GET, X509_R_METHOD_NOT_SUPPORTED); | 155 | X509err(X509_F_X509_PUBKEY_GET, X509_R_METHOD_NOT_SUPPORTED); |
| 171 | goto error; | 156 | goto error; |
| 172 | } | 157 | } |
| 173 | 158 | ||
| 174 | /* Check to see if another thread set key->pkey first */ | 159 | /* Check to see if another thread set key->pkey first */ |
| 175 | CRYPTO_w_lock(CRYPTO_LOCK_EVP_PKEY); | 160 | CRYPTO_w_lock(CRYPTO_LOCK_EVP_PKEY); |
| 176 | if (key->pkey) | 161 | if (key->pkey) { |
| 177 | { | ||
| 178 | CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY); | 162 | CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY); |
| 179 | EVP_PKEY_free(ret); | 163 | EVP_PKEY_free(ret); |
| 180 | ret = key->pkey; | 164 | ret = key->pkey; |
| 181 | } | 165 | } else { |
| 182 | else | ||
| 183 | { | ||
| 184 | key->pkey = ret; | 166 | key->pkey = ret; |
| 185 | CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY); | 167 | CRYPTO_w_unlock(CRYPTO_LOCK_EVP_PKEY); |
| 186 | } | 168 | } |
| @@ -208,8 +190,7 @@ EVP_PKEY *d2i_PUBKEY(EVP_PKEY **a, const unsigned char **pp, | |||
| 208 | pktmp = X509_PUBKEY_get(xpk); | 190 | pktmp = X509_PUBKEY_get(xpk); |
| 209 | X509_PUBKEY_free(xpk); | 191 | X509_PUBKEY_free(xpk); |
| 210 | if(!pktmp) return NULL; | 192 | if(!pktmp) return NULL; |
| 211 | if(a) | 193 | if(a) { |
| 212 | { | ||
| 213 | EVP_PKEY_free(*a); | 194 | EVP_PKEY_free(*a); |
| 214 | *a = pktmp; | 195 | *a = pktmp; |
| 215 | } | 196 | } |
| @@ -244,8 +225,7 @@ RSA *d2i_RSA_PUBKEY(RSA **a, const unsigned char **pp, | |||
| 244 | EVP_PKEY_free(pkey); | 225 | EVP_PKEY_free(pkey); |
| 245 | if (!key) return NULL; | 226 | if (!key) return NULL; |
| 246 | *pp = q; | 227 | *pp = q; |
| 247 | if (a) | 228 | if (a) { |
| 248 | { | ||
| 249 | RSA_free(*a); | 229 | RSA_free(*a); |
| 250 | *a = key; | 230 | *a = key; |
| 251 | } | 231 | } |
| @@ -258,8 +238,7 @@ int i2d_RSA_PUBKEY(RSA *a, unsigned char **pp) | |||
| 258 | int ret; | 238 | int ret; |
| 259 | if (!a) return 0; | 239 | if (!a) return 0; |
| 260 | pktmp = EVP_PKEY_new(); | 240 | pktmp = EVP_PKEY_new(); |
| 261 | if (!pktmp) | 241 | if (!pktmp) { |
| 262 | { | ||
| 263 | ASN1err(ASN1_F_I2D_RSA_PUBKEY, ERR_R_MALLOC_FAILURE); | 242 | ASN1err(ASN1_F_I2D_RSA_PUBKEY, ERR_R_MALLOC_FAILURE); |
| 264 | return 0; | 243 | return 0; |
| 265 | } | 244 | } |
| @@ -284,8 +263,7 @@ DSA *d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, | |||
| 284 | EVP_PKEY_free(pkey); | 263 | EVP_PKEY_free(pkey); |
| 285 | if (!key) return NULL; | 264 | if (!key) return NULL; |
| 286 | *pp = q; | 265 | *pp = q; |
| 287 | if (a) | 266 | if (a) { |
| 288 | { | ||
| 289 | DSA_free(*a); | 267 | DSA_free(*a); |
| 290 | *a = key; | 268 | *a = key; |
| 291 | } | 269 | } |
| @@ -298,8 +276,7 @@ int i2d_DSA_PUBKEY(DSA *a, unsigned char **pp) | |||
| 298 | int ret; | 276 | int ret; |
| 299 | if(!a) return 0; | 277 | if(!a) return 0; |
| 300 | pktmp = EVP_PKEY_new(); | 278 | pktmp = EVP_PKEY_new(); |
| 301 | if(!pktmp) | 279 | if(!pktmp) { |
| 302 | { | ||
| 303 | ASN1err(ASN1_F_I2D_DSA_PUBKEY, ERR_R_MALLOC_FAILURE); | 280 | ASN1err(ASN1_F_I2D_DSA_PUBKEY, ERR_R_MALLOC_FAILURE); |
| 304 | return 0; | 281 | return 0; |
| 305 | } | 282 | } |
| @@ -323,8 +300,7 @@ EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, long length) | |||
| 323 | EVP_PKEY_free(pkey); | 300 | EVP_PKEY_free(pkey); |
| 324 | if (!key) return(NULL); | 301 | if (!key) return(NULL); |
| 325 | *pp = q; | 302 | *pp = q; |
| 326 | if (a) | 303 | if (a) { |
| 327 | { | ||
| 328 | EC_KEY_free(*a); | 304 | EC_KEY_free(*a); |
| 329 | *a = key; | 305 | *a = key; |
| 330 | } | 306 | } |
| @@ -336,8 +312,7 @@ int i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp) | |||
| 336 | EVP_PKEY *pktmp; | 312 | EVP_PKEY *pktmp; |
| 337 | int ret; | 313 | int ret; |
| 338 | if (!a) return(0); | 314 | if (!a) return(0); |
| 339 | if ((pktmp = EVP_PKEY_new()) == NULL) | 315 | if ((pktmp = EVP_PKEY_new()) == NULL) { |
| 340 | { | ||
| 341 | ASN1err(ASN1_F_I2D_EC_PUBKEY, ERR_R_MALLOC_FAILURE); | 316 | ASN1err(ASN1_F_I2D_EC_PUBKEY, ERR_R_MALLOC_FAILURE); |
| 342 | return(0); | 317 | return(0); |
| 343 | } | 318 | } |
| @@ -354,8 +329,7 @@ int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj, | |||
| 354 | { | 329 | { |
| 355 | if (!X509_ALGOR_set0(pub->algor, aobj, ptype, pval)) | 330 | if (!X509_ALGOR_set0(pub->algor, aobj, ptype, pval)) |
| 356 | return 0; | 331 | return 0; |
| 357 | if (penc) | 332 | if (penc) { |
| 358 | { | ||
| 359 | if (pub->public_key->data) | 333 | if (pub->public_key->data) |
| 360 | free(pub->public_key->data); | 334 | free(pub->public_key->data); |
| 361 | pub->public_key->data = penc; | 335 | pub->public_key->data = penc; |
| @@ -374,8 +348,7 @@ int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg, | |||
| 374 | { | 348 | { |
| 375 | if (ppkalg) | 349 | if (ppkalg) |
| 376 | *ppkalg = pub->algor->algorithm; | 350 | *ppkalg = pub->algor->algorithm; |
| 377 | if (pk) | 351 | if (pk) { |
| 378 | { | ||
| 379 | *pk = pub->public_key->data; | 352 | *pk = pub->public_key->data; |
| 380 | *ppklen = pub->public_key->length; | 353 | *ppklen = pub->public_key->length; |
| 381 | } | 354 | } |
