summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_rsa.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/ssl_rsa.c')
-rw-r--r--src/lib/libssl/ssl_rsa.c112
1 files changed, 75 insertions, 37 deletions
diff --git a/src/lib/libssl/ssl_rsa.c b/src/lib/libssl/ssl_rsa.c
index 27113eba50..fb0bd4d045 100644
--- a/src/lib/libssl/ssl_rsa.c
+++ b/src/lib/libssl/ssl_rsa.c
@@ -131,7 +131,7 @@ end:
131 } 131 }
132#endif 132#endif
133 133
134int SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len) 134int SSL_use_certificate_ASN1(SSL *ssl, unsigned char *d, int len)
135 { 135 {
136 X509 *x; 136 X509 *x;
137 int ret; 137 int ret;
@@ -181,7 +181,7 @@ int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa)
181 181
182static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey) 182static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey)
183 { 183 {
184 int i; 184 int i,ok=0,bad=0;
185 185
186 i=ssl_cert_type(NULL,pkey); 186 i=ssl_cert_type(NULL,pkey);
187 if (i < 0) 187 if (i < 0)
@@ -202,18 +202,47 @@ static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey)
202 /* Don't check the public/private key, this is mostly 202 /* Don't check the public/private key, this is mostly
203 * for smart cards. */ 203 * for smart cards. */
204 if ((pkey->type == EVP_PKEY_RSA) && 204 if ((pkey->type == EVP_PKEY_RSA) &&
205 (RSA_flags(pkey->pkey.rsa) & RSA_METHOD_FLAG_NO_CHECK)) 205 (RSA_flags(pkey->pkey.rsa) &
206 ; 206 RSA_METHOD_FLAG_NO_CHECK))
207 ok=1;
207 else 208 else
208#endif 209#endif
209 if (!X509_check_private_key(c->pkeys[i].x509,pkey)) 210 if (!X509_check_private_key(c->pkeys[i].x509,pkey))
210 { 211 {
211 X509_free(c->pkeys[i].x509); 212 if ((i == SSL_PKEY_DH_RSA) || (i == SSL_PKEY_DH_DSA))
212 c->pkeys[i].x509 = NULL; 213 {
213 return 0; 214 i=(i == SSL_PKEY_DH_RSA)?
215 SSL_PKEY_DH_DSA:SSL_PKEY_DH_RSA;
216
217 if (c->pkeys[i].x509 == NULL)
218 ok=1;
219 else
220 {
221 if (!X509_check_private_key(
222 c->pkeys[i].x509,pkey))
223 bad=1;
224 else
225 ok=1;
226 }
227 }
228 else
229 bad=1;
214 } 230 }
231 else
232 ok=1;
233 }
234 else
235 ok=1;
236
237 if (bad)
238 {
239 X509_free(c->pkeys[i].x509);
240 c->pkeys[i].x509=NULL;
241 return(0);
215 } 242 }
216 243
244 ERR_clear_error(); /* make sure no error from X509_check_private_key()
245 * is left if we have chosen to ignore it */
217 if (c->pkeys[i].privatekey != NULL) 246 if (c->pkeys[i].privatekey != NULL)
218 EVP_PKEY_free(c->pkeys[i].privatekey); 247 EVP_PKEY_free(c->pkeys[i].privatekey);
219 CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY); 248 CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
@@ -335,11 +364,6 @@ int SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type)
335 pkey=PEM_read_bio_PrivateKey(in,NULL, 364 pkey=PEM_read_bio_PrivateKey(in,NULL,
336 ssl->ctx->default_passwd_callback,ssl->ctx->default_passwd_callback_userdata); 365 ssl->ctx->default_passwd_callback,ssl->ctx->default_passwd_callback_userdata);
337 } 366 }
338 else if (type == SSL_FILETYPE_ASN1)
339 {
340 j = ERR_R_ASN1_LIB;
341 pkey = d2i_PrivateKey_bio(in,NULL);
342 }
343 else 367 else
344 { 368 {
345 SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE,SSL_R_BAD_SSL_FILETYPE); 369 SSLerr(SSL_F_SSL_USE_PRIVATEKEY_FILE,SSL_R_BAD_SSL_FILETYPE);
@@ -358,10 +382,10 @@ end:
358 } 382 }
359#endif 383#endif
360 384
361int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, const unsigned char *d, long len) 385int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, unsigned char *d, long len)
362 { 386 {
363 int ret; 387 int ret;
364 const unsigned char *p; 388 unsigned char *p;
365 EVP_PKEY *pkey; 389 EVP_PKEY *pkey;
366 390
367 p=d; 391 p=d;
@@ -394,7 +418,7 @@ int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x)
394static int ssl_set_cert(CERT *c, X509 *x) 418static int ssl_set_cert(CERT *c, X509 *x)
395 { 419 {
396 EVP_PKEY *pkey; 420 EVP_PKEY *pkey;
397 int i; 421 int i,ok=0,bad=0;
398 422
399 pkey=X509_get_pubkey(x); 423 pkey=X509_get_pubkey(x);
400 if (pkey == NULL) 424 if (pkey == NULL)
@@ -422,23 +446,44 @@ static int ssl_set_cert(CERT *c, X509 *x)
422 if ((c->pkeys[i].privatekey->type == EVP_PKEY_RSA) && 446 if ((c->pkeys[i].privatekey->type == EVP_PKEY_RSA) &&
423 (RSA_flags(c->pkeys[i].privatekey->pkey.rsa) & 447 (RSA_flags(c->pkeys[i].privatekey->pkey.rsa) &
424 RSA_METHOD_FLAG_NO_CHECK)) 448 RSA_METHOD_FLAG_NO_CHECK))
425 ; 449 ok=1;
426 else 450 else
427#endif /* OPENSSL_NO_RSA */ 451#endif
452 {
428 if (!X509_check_private_key(x,c->pkeys[i].privatekey)) 453 if (!X509_check_private_key(x,c->pkeys[i].privatekey))
429 { 454 {
430 /* don't fail for a cert/key mismatch, just free 455 if ((i == SSL_PKEY_DH_RSA) || (i == SSL_PKEY_DH_DSA))
431 * current private key (when switching to a different 456 {
432 * cert & key, first this function should be used, 457 i=(i == SSL_PKEY_DH_RSA)?
433 * then ssl_set_pkey */ 458 SSL_PKEY_DH_DSA:SSL_PKEY_DH_RSA;
434 EVP_PKEY_free(c->pkeys[i].privatekey); 459
435 c->pkeys[i].privatekey=NULL; 460 if (c->pkeys[i].privatekey == NULL)
436 /* clear error queue */ 461 ok=1;
437 ERR_clear_error(); 462 else
463 {
464 if (!X509_check_private_key(x,
465 c->pkeys[i].privatekey))
466 bad=1;
467 else
468 ok=1;
469 }
470 }
471 else
472 bad=1;
438 } 473 }
474 else
475 ok=1;
476 } /* OPENSSL_NO_RSA */
439 } 477 }
478 else
479 ok=1;
440 480
441 EVP_PKEY_free(pkey); 481 EVP_PKEY_free(pkey);
482 if (bad)
483 {
484 EVP_PKEY_free(c->pkeys[i].privatekey);
485 c->pkeys[i].privatekey=NULL;
486 }
442 487
443 if (c->pkeys[i].x509 != NULL) 488 if (c->pkeys[i].x509 != NULL)
444 X509_free(c->pkeys[i].x509); 489 X509_free(c->pkeys[i].x509);
@@ -500,7 +545,7 @@ end:
500 } 545 }
501#endif 546#endif
502 547
503int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, const unsigned char *d) 548int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, unsigned char *d)
504 { 549 {
505 X509 *x; 550 X509 *x;
506 int ret; 551 int ret;
@@ -595,7 +640,7 @@ end:
595 } 640 }
596#endif 641#endif
597 642
598int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, long len) 643int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, unsigned char *d, long len)
599 { 644 {
600 int ret; 645 int ret;
601 const unsigned char *p; 646 const unsigned char *p;
@@ -654,11 +699,6 @@ int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type)
654 pkey=PEM_read_bio_PrivateKey(in,NULL, 699 pkey=PEM_read_bio_PrivateKey(in,NULL,
655 ctx->default_passwd_callback,ctx->default_passwd_callback_userdata); 700 ctx->default_passwd_callback,ctx->default_passwd_callback_userdata);
656 } 701 }
657 else if (type == SSL_FILETYPE_ASN1)
658 {
659 j = ERR_R_ASN1_LIB;
660 pkey = d2i_PrivateKey_bio(in,NULL);
661 }
662 else 702 else
663 { 703 {
664 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE,SSL_R_BAD_SSL_FILETYPE); 704 SSLerr(SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE,SSL_R_BAD_SSL_FILETYPE);
@@ -677,11 +717,11 @@ end:
677 } 717 }
678#endif 718#endif
679 719
680int SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, const unsigned char *d, 720int SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, unsigned char *d,
681 long len) 721 long len)
682 { 722 {
683 int ret; 723 int ret;
684 const unsigned char *p; 724 unsigned char *p;
685 EVP_PKEY *pkey; 725 EVP_PKEY *pkey;
686 726
687 p=d; 727 p=d;
@@ -708,8 +748,6 @@ int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file)
708 int ret=0; 748 int ret=0;
709 X509 *x=NULL; 749 X509 *x=NULL;
710 750
711 ERR_clear_error(); /* clear error stack for SSL_CTX_use_certificate() */
712
713 in=BIO_new(BIO_s_file_internal()); 751 in=BIO_new(BIO_s_file_internal());
714 if (in == NULL) 752 if (in == NULL)
715 { 753 {