summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_cert.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/ssl_cert.c')
-rw-r--r--src/lib/libssl/ssl_cert.c164
1 files changed, 83 insertions, 81 deletions
diff --git a/src/lib/libssl/ssl_cert.c b/src/lib/libssl/ssl_cert.c
index f2335d5650..c26df62c20 100644
--- a/src/lib/libssl/ssl_cert.c
+++ b/src/lib/libssl/ssl_cert.c
@@ -143,7 +143,7 @@ CERT *ssl_cert_new(void)
143 { 143 {
144 CERT *ret; 144 CERT *ret;
145 145
146 ret=(CERT *)Malloc(sizeof(CERT)); 146 ret=(CERT *)OPENSSL_malloc(sizeof(CERT));
147 if (ret == NULL) 147 if (ret == NULL)
148 { 148 {
149 SSLerr(SSL_F_SSL_CERT_NEW,ERR_R_MALLOC_FAILURE); 149 SSLerr(SSL_F_SSL_CERT_NEW,ERR_R_MALLOC_FAILURE);
@@ -162,7 +162,7 @@ CERT *ssl_cert_dup(CERT *cert)
162 CERT *ret; 162 CERT *ret;
163 int i; 163 int i;
164 164
165 ret = (CERT *)Malloc(sizeof(CERT)); 165 ret = (CERT *)OPENSSL_malloc(sizeof(CERT));
166 if (ret == NULL) 166 if (ret == NULL)
167 { 167 {
168 SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE); 168 SSLerr(SSL_F_SSL_CERT_DUP, ERR_R_MALLOC_FAILURE);
@@ -331,7 +331,7 @@ void ssl_cert_free(CERT *c)
331 EVP_PKEY_free(c->pkeys[i].publickey); 331 EVP_PKEY_free(c->pkeys[i].publickey);
332#endif 332#endif
333 } 333 }
334 Free(c); 334 OPENSSL_free(c);
335 } 335 }
336 336
337int ssl_cert_inst(CERT **o) 337int ssl_cert_inst(CERT **o)
@@ -367,7 +367,7 @@ SESS_CERT *ssl_sess_cert_new(void)
367 { 367 {
368 SESS_CERT *ret; 368 SESS_CERT *ret;
369 369
370 ret = Malloc(sizeof *ret); 370 ret = OPENSSL_malloc(sizeof *ret);
371 if (ret == NULL) 371 if (ret == NULL)
372 { 372 {
373 SSLerr(SSL_F_SSL_SESS_CERT_NEW, ERR_R_MALLOC_FAILURE); 373 SSLerr(SSL_F_SSL_SESS_CERT_NEW, ERR_R_MALLOC_FAILURE);
@@ -426,7 +426,7 @@ void ssl_sess_cert_free(SESS_CERT *sc)
426 DH_free(sc->peer_dh_tmp); 426 DH_free(sc->peer_dh_tmp);
427#endif 427#endif
428 428
429 Free(sc); 429 OPENSSL_free(sc);
430 } 430 }
431 431
432int ssl_set_peer_cert_type(SESS_CERT *sc,int type) 432int ssl_set_peer_cert_type(SESS_CERT *sc,int type)
@@ -568,7 +568,7 @@ int SSL_CTX_add_client_CA(SSL_CTX *ctx,X509 *x)
568 return(add_client_CA(&(ctx->client_CA),x)); 568 return(add_client_CA(&(ctx->client_CA),x));
569 } 569 }
570 570
571static int xname_cmp(X509_NAME **a,X509_NAME **b) 571static int xname_cmp(const X509_NAME * const *a, const X509_NAME * const *b)
572 { 572 {
573 return(X509_NAME_cmp(*a,*b)); 573 return(X509_NAME_cmp(*a,*b));
574 } 574 }
@@ -589,7 +589,7 @@ STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file)
589 X509_NAME *xn=NULL; 589 X509_NAME *xn=NULL;
590 STACK_OF(X509_NAME) *ret,*sk; 590 STACK_OF(X509_NAME) *ret,*sk;
591 591
592 ret=sk_X509_NAME_new(NULL); 592 ret=sk_X509_NAME_new_null();
593 sk=sk_X509_NAME_new(xname_cmp); 593 sk=sk_X509_NAME_new(xname_cmp);
594 594
595 in=BIO_new(BIO_s_file_internal()); 595 in=BIO_new(BIO_s_file_internal());
@@ -644,53 +644,53 @@ err:
644 644
645int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack, 645int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
646 const char *file) 646 const char *file)
647 {
648 BIO *in;
649 X509 *x=NULL;
650 X509_NAME *xn=NULL;
651 int ret=1;
652 int (*oldcmp)(X509_NAME **a, X509_NAME **b);
653
654 oldcmp=sk_X509_NAME_set_cmp_func(stack,xname_cmp);
655
656 in=BIO_new(BIO_s_file_internal());
657
658 if (in == NULL)
659 { 647 {
660 SSLerr(SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK,ERR_R_MALLOC_FAILURE); 648 BIO *in;
661 goto err; 649 X509 *x=NULL;
662 } 650 X509_NAME *xn=NULL;
651 int ret=1;
652 int (*oldcmp)(const X509_NAME * const *a, const X509_NAME * const *b);
663 653
664 if (!BIO_read_filename(in,file)) 654 oldcmp=sk_X509_NAME_set_cmp_func(stack,xname_cmp);
665 goto err; 655
666 656 in=BIO_new(BIO_s_file_internal());
667 for (;;) 657
668 { 658 if (in == NULL)
669 if (PEM_read_bio_X509(in,&x,NULL,NULL) == NULL) 659 {
670 break; 660 SSLerr(SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK,ERR_R_MALLOC_FAILURE);
671 if ((xn=X509_get_subject_name(x)) == NULL) goto err; 661 goto err;
672 xn=X509_NAME_dup(xn); 662 }
673 if (xn == NULL) goto err; 663
674 if (sk_X509_NAME_find(stack,xn) >= 0) 664 if (!BIO_read_filename(in,file))
675 X509_NAME_free(xn); 665 goto err;
676 else 666
677 sk_X509_NAME_push(stack,xn); 667 for (;;)
678 } 668 {
669 if (PEM_read_bio_X509(in,&x,NULL,NULL) == NULL)
670 break;
671 if ((xn=X509_get_subject_name(x)) == NULL) goto err;
672 xn=X509_NAME_dup(xn);
673 if (xn == NULL) goto err;
674 if (sk_X509_NAME_find(stack,xn) >= 0)
675 X509_NAME_free(xn);
676 else
677 sk_X509_NAME_push(stack,xn);
678 }
679 679
680 if (0) 680 if (0)
681 { 681 {
682err: 682err:
683 ret=0; 683 ret=0;
684 } 684 }
685 if(in != NULL) 685 if(in != NULL)
686 BIO_free(in); 686 BIO_free(in);
687 if(x != NULL) 687 if(x != NULL)
688 X509_free(x); 688 X509_free(x);
689 689
690 sk_X509_NAME_set_cmp_func(stack,oldcmp); 690 sk_X509_NAME_set_cmp_func(stack,oldcmp);
691 691
692 return ret; 692 return ret;
693 } 693 }
694 694
695/*! 695/*!
696 * Add a directory of certs to a stack. 696 * Add a directory of certs to a stack.
@@ -709,44 +709,46 @@ err:
709 709
710int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack, 710int SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stack,
711 const char *dir) 711 const char *dir)
712 {
713 DIR *d;
714 struct dirent *dstruct;
715 int ret = 0;
716
717 CRYPTO_w_lock(CRYPTO_LOCK_READDIR);
718 d = opendir(dir);
719
720 /* Note that a side effect is that the CAs will be sorted by name */
721 if(!d)
722 { 712 {
723 SYSerr(SYS_F_OPENDIR, get_last_sys_error()); 713 DIR *d;
724 ERR_add_error_data(3, "opendir('", dir, "')"); 714 struct dirent *dstruct;
725 SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB); 715 int ret = 0;
726 goto err;
727 }
728 716
729 while((dstruct=readdir(d))) 717 CRYPTO_w_lock(CRYPTO_LOCK_READDIR);
730 { 718 d = opendir(dir);
731 char buf[1024];
732 719
733 if(strlen(dir)+strlen(dstruct->d_name)+2 > sizeof buf) 720 /* Note that a side effect is that the CAs will be sorted by name */
734 { 721 if(!d)
735 SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,SSL_R_PATH_TOO_LONG); 722 {
736 goto err; 723 SYSerr(SYS_F_OPENDIR, get_last_sys_error());
737 } 724 ERR_add_error_data(3, "opendir('", dir, "')");
725 SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK, ERR_R_SYS_LIB);
726 goto err;
727 }
738 728
739 sprintf(buf,"%s/%s",dir,dstruct->d_name); 729 while((dstruct=readdir(d)))
740 if(!SSL_add_file_cert_subjects_to_stack(stack,buf)) 730 {
741 goto err; 731 char buf[1024];
742 } 732 int r;
743 ret = 1; 733
734 if(strlen(dir)+strlen(dstruct->d_name)+2 > sizeof buf)
735 {
736 SSLerr(SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK,SSL_R_PATH_TOO_LONG);
737 goto err;
738 }
739
740 r = BIO_snprintf(buf,sizeof buf,"%s/%s",dir,dstruct->d_name);
741 if (r <= 0 || r >= sizeof buf)
742 goto err;
743 if(!SSL_add_file_cert_subjects_to_stack(stack,buf))
744 goto err;
745 }
746 ret = 1;
744 747
745err: 748err:
746 closedir(d); 749 CRYPTO_w_unlock(CRYPTO_LOCK_READDIR);
747 CRYPTO_w_unlock(CRYPTO_LOCK_READDIR); 750 return ret;
748 return ret; 751 }
749 }
750 752
751#endif 753#endif
752#endif 754#endif