diff options
author | reyk <> | 2014-09-28 14:45:48 +0000 |
---|---|---|
committer | reyk <> | 2014-09-28 14:45:48 +0000 |
commit | 86dd9a4f816c164cfa45e157991a16f15badb4a3 (patch) | |
tree | 2558f6bbdff94c43a1f9a53c84ba5f0ffa3ea8c0 | |
parent | 091f5c3e6dfe57ebde616bd69bdc1866949e19a4 (diff) | |
download | openbsd-86dd9a4f816c164cfa45e157991a16f15badb4a3.tar.gz openbsd-86dd9a4f816c164cfa45e157991a16f15badb4a3.tar.bz2 openbsd-86dd9a4f816c164cfa45e157991a16f15badb4a3.zip |
Add a new API function SSL_CTX_use_certificate_chain() that allows to
read the PEM-encoded certificate chain from memory instead of a file.
This idea is derived from an older implementation in relayd that was
needed to use the function with a privep'ed process in a chroot. Now
it is time to get it into LibreSSL to make the API more privsep-
friendly and to make it available for other programs and the ressl
library.
ok jsing@ miod@
-rw-r--r-- | src/lib/libressl/ressl.c | 21 | ||||
-rw-r--r-- | src/lib/libssl/src/doc/ssl/SSL_CTX_use_certificate.pod | 10 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/ssl.h | 3 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/ssl_rsa.c | 64 | ||||
-rw-r--r-- | src/lib/libssl/ssl.h | 3 | ||||
-rw-r--r-- | src/lib/libssl/ssl_rsa.c | 64 |
6 files changed, 111 insertions, 54 deletions
diff --git a/src/lib/libressl/ressl.c b/src/lib/libressl/ressl.c index 1bf971419b..f01448b8f4 100644 --- a/src/lib/libressl/ressl.c +++ b/src/lib/libressl/ressl.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ressl.c,v 1.13 2014/09/28 06:24:00 tedu Exp $ */ | 1 | /* $OpenBSD: ressl.c,v 1.14 2014/09/28 14:45:48 reyk Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -110,22 +110,11 @@ ressl_configure_keypair(struct ressl *ctx) | |||
110 | BIO *bio = NULL; | 110 | BIO *bio = NULL; |
111 | 111 | ||
112 | if (ctx->config->cert_mem != NULL) { | 112 | if (ctx->config->cert_mem != NULL) { |
113 | if ((bio = BIO_new_mem_buf(ctx->config->cert_mem, | 113 | if (SSL_CTX_use_certificate_chain(ctx->ssl_ctx, |
114 | ctx->config->cert_len)) == NULL) { | 114 | ctx->config->cert_mem, ctx->config->cert_len) != 1) { |
115 | ressl_set_error(ctx, "failed to create buffer"); | ||
116 | goto err; | ||
117 | } | ||
118 | if ((cert = PEM_read_bio_X509(bio, NULL, NULL, NULL)) == NULL) { | ||
119 | ressl_set_error(ctx, "failed to read certificate"); | ||
120 | goto err; | ||
121 | } | ||
122 | if (SSL_CTX_use_certificate(ctx->ssl_ctx, cert) != 1) { | ||
123 | ressl_set_error(ctx, "failed to load certificate"); | 115 | ressl_set_error(ctx, "failed to load certificate"); |
124 | goto err; | 116 | goto err; |
125 | } | 117 | } |
126 | BIO_free(bio); | ||
127 | bio = NULL; | ||
128 | X509_free(cert); | ||
129 | cert = NULL; | 118 | cert = NULL; |
130 | } | 119 | } |
131 | if (ctx->config->key_mem != NULL) { | 120 | if (ctx->config->key_mem != NULL) { |
@@ -150,8 +139,8 @@ ressl_configure_keypair(struct ressl *ctx) | |||
150 | } | 139 | } |
151 | 140 | ||
152 | if (ctx->config->cert_file != NULL) { | 141 | if (ctx->config->cert_file != NULL) { |
153 | if (SSL_CTX_use_certificate_file(ctx->ssl_ctx, | 142 | if (SSL_CTX_use_certificate_chain_file(ctx->ssl_ctx, |
154 | ctx->config->cert_file, SSL_FILETYPE_PEM) != 1) { | 143 | ctx->config->cert_file) != 1) { |
155 | ressl_set_error(ctx, "failed to load certificate file"); | 144 | ressl_set_error(ctx, "failed to load certificate file"); |
156 | goto err; | 145 | goto err; |
157 | } | 146 | } |
diff --git a/src/lib/libssl/src/doc/ssl/SSL_CTX_use_certificate.pod b/src/lib/libssl/src/doc/ssl/SSL_CTX_use_certificate.pod index 8e0d609d05..560e00937f 100644 --- a/src/lib/libssl/src/doc/ssl/SSL_CTX_use_certificate.pod +++ b/src/lib/libssl/src/doc/ssl/SSL_CTX_use_certificate.pod | |||
@@ -3,8 +3,9 @@ | |||
3 | =head1 NAME | 3 | =head1 NAME |
4 | 4 | ||
5 | SSL_CTX_use_certificate, SSL_CTX_use_certificate_ASN1, | 5 | SSL_CTX_use_certificate, SSL_CTX_use_certificate_ASN1, |
6 | SSL_CTX_use_certificate_file, SSL_use_certificate, SSL_use_certificate_ASN1, | 6 | SSL_CTX_use_certificate_file, SSL_use_certificate, |
7 | SSL_use_certificate_file, SSL_CTX_use_certificate_chain_file, | 7 | SSL_use_certificate_ASN1, SSL_use_certificate_file, |
8 | SSL_CTX_use_certificate_chain, SSL_CTX_use_certificate_chain_file, | ||
8 | SSL_CTX_use_PrivateKey, SSL_CTX_use_PrivateKey_ASN1, | 9 | SSL_CTX_use_PrivateKey, SSL_CTX_use_PrivateKey_ASN1, |
9 | SSL_CTX_use_PrivateKey_file, SSL_CTX_use_RSAPrivateKey, | 10 | SSL_CTX_use_PrivateKey_file, SSL_CTX_use_RSAPrivateKey, |
10 | SSL_CTX_use_RSAPrivateKey_ASN1, SSL_CTX_use_RSAPrivateKey_file, | 11 | SSL_CTX_use_RSAPrivateKey_ASN1, SSL_CTX_use_RSAPrivateKey_file, |
@@ -24,6 +25,7 @@ data | |||
24 | int SSL_use_certificate_ASN1(SSL *ssl, unsigned char *d, int len); | 25 | int SSL_use_certificate_ASN1(SSL *ssl, unsigned char *d, int len); |
25 | int SSL_use_certificate_file(SSL *ssl, const char *file, int type); | 26 | int SSL_use_certificate_file(SSL *ssl, const char *file, int type); |
26 | 27 | ||
28 | int SSL_CTX_use_certificate_chain(SSL_CTX *ctx, void *buf, int len); | ||
27 | int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); | 29 | int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); |
28 | 30 | ||
29 | int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); | 31 | int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey); |
@@ -75,8 +77,8 @@ SSL_use_certificate_file() loads the certificate from B<file> into B<ssl>. | |||
75 | See the NOTES section on why SSL_CTX_use_certificate_chain_file() | 77 | See the NOTES section on why SSL_CTX_use_certificate_chain_file() |
76 | should be preferred. | 78 | should be preferred. |
77 | 79 | ||
78 | SSL_CTX_use_certificate_chain_file() loads a certificate chain from | 80 | The SSL_CTX_use_certificate_chain*() functions load a certificate chain |
79 | B<file> into B<ctx>. The certificates must be in PEM format and must | 81 | into B<ctx>. The certificates must be in PEM format and must |
80 | be sorted starting with the subject's certificate (actual client or server | 82 | be sorted starting with the subject's certificate (actual client or server |
81 | certificate), followed by intermediate CA certificates if applicable, and | 83 | certificate), followed by intermediate CA certificates if applicable, and |
82 | ending at the highest level (root) CA. | 84 | ending at the highest level (root) CA. |
diff --git a/src/lib/libssl/src/ssl/ssl.h b/src/lib/libssl/src/ssl/ssl.h index 3b948245f2..c7dd4259cc 100644 --- a/src/lib/libssl/src/ssl/ssl.h +++ b/src/lib/libssl/src/ssl/ssl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl.h,v 1.65 2014/09/27 11:01:06 jsing Exp $ */ | 1 | /* $OpenBSD: ssl.h,v 1.66 2014/09/28 14:45:48 reyk Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -1530,6 +1530,7 @@ int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type); | |||
1530 | int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); | 1530 | int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); |
1531 | int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); | 1531 | int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); |
1532 | int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); /* PEM type */ | 1532 | int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); /* PEM type */ |
1533 | int SSL_CTX_use_certificate_chain(SSL_CTX *ctx, void *buf, int len); | ||
1533 | STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); | 1534 | STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); |
1534 | int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, | 1535 | int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, |
1535 | const char *file); | 1536 | const char *file); |
diff --git a/src/lib/libssl/src/ssl/ssl_rsa.c b/src/lib/libssl/src/ssl/ssl_rsa.c index d4d14bad35..e8b72f016e 100644 --- a/src/lib/libssl/src/ssl/ssl_rsa.c +++ b/src/lib/libssl/src/ssl/ssl_rsa.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_rsa.c,v 1.16 2014/07/12 16:03:37 miod Exp $ */ | 1 | /* $OpenBSD: ssl_rsa.c,v 1.17 2014/09/28 14:45:48 reyk Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -66,6 +66,8 @@ | |||
66 | 66 | ||
67 | static int ssl_set_cert(CERT *c, X509 *x509); | 67 | static int ssl_set_cert(CERT *c, X509 *x509); |
68 | static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey); | 68 | static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey); |
69 | static int ssl_ctx_use_certificate_chain_bio(SSL_CTX *, BIO *); | ||
70 | |||
69 | int | 71 | int |
70 | SSL_use_certificate(SSL *ssl, X509 *x) | 72 | SSL_use_certificate(SSL *ssl, X509 *x) |
71 | { | 73 | { |
@@ -637,30 +639,18 @@ SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, const unsigned char *d, | |||
637 | 639 | ||
638 | 640 | ||
639 | /* | 641 | /* |
640 | * Read a file that contains our certificate in "PEM" format, | 642 | * Read a bio that contains our certificate in "PEM" format, |
641 | * possibly followed by a sequence of CA certificates that should be | 643 | * possibly followed by a sequence of CA certificates that should be |
642 | * sent to the peer in the Certificate message. | 644 | * sent to the peer in the Certificate message. |
643 | */ | 645 | */ |
644 | int | 646 | static int |
645 | SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file) | 647 | ssl_ctx_use_certificate_chain_bio(SSL_CTX *ctx, BIO *in) |
646 | { | 648 | { |
647 | BIO *in; | ||
648 | int ret = 0; | 649 | int ret = 0; |
649 | X509 *x = NULL; | 650 | X509 *x = NULL; |
650 | 651 | ||
651 | ERR_clear_error(); /* clear error stack for SSL_CTX_use_certificate() */ | 652 | ERR_clear_error(); /* clear error stack for SSL_CTX_use_certificate() */ |
652 | 653 | ||
653 | in = BIO_new(BIO_s_file_internal()); | ||
654 | if (in == NULL) { | ||
655 | SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_BUF_LIB); | ||
656 | goto end; | ||
657 | } | ||
658 | |||
659 | if (BIO_read_filename(in, file) <= 0) { | ||
660 | SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_SYS_LIB); | ||
661 | goto end; | ||
662 | } | ||
663 | |||
664 | x = PEM_read_bio_X509_AUX(in, NULL, ctx->default_passwd_callback, | 654 | x = PEM_read_bio_X509_AUX(in, NULL, ctx->default_passwd_callback, |
665 | ctx->default_passwd_callback_userdata); | 655 | ctx->default_passwd_callback_userdata); |
666 | if (x == NULL) { | 656 | if (x == NULL) { |
@@ -716,6 +706,48 @@ SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file) | |||
716 | end: | 706 | end: |
717 | if (x != NULL) | 707 | if (x != NULL) |
718 | X509_free(x); | 708 | X509_free(x); |
709 | return (ret); | ||
710 | } | ||
711 | |||
712 | int | ||
713 | SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file) | ||
714 | { | ||
715 | BIO *in; | ||
716 | int ret = 0; | ||
717 | |||
718 | in = BIO_new(BIO_s_file_internal()); | ||
719 | if (in == NULL) { | ||
720 | SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_BUF_LIB); | ||
721 | goto end; | ||
722 | } | ||
723 | |||
724 | if (BIO_read_filename(in, file) <= 0) { | ||
725 | SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_SYS_LIB); | ||
726 | goto end; | ||
727 | } | ||
728 | |||
729 | ret = ssl_ctx_use_certificate_chain_bio(ctx, in); | ||
730 | |||
731 | end: | ||
732 | BIO_free(in); | ||
733 | return (ret); | ||
734 | } | ||
735 | |||
736 | int | ||
737 | SSL_CTX_use_certificate_chain(SSL_CTX *ctx, void *buf, int len) | ||
738 | { | ||
739 | BIO *in; | ||
740 | int ret = 0; | ||
741 | |||
742 | in = BIO_new_mem_buf(buf, len); | ||
743 | if (in == NULL) { | ||
744 | SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_BUF_LIB); | ||
745 | goto end; | ||
746 | } | ||
747 | |||
748 | ret = ssl_ctx_use_certificate_chain_bio(ctx, in); | ||
749 | |||
750 | end: | ||
719 | BIO_free(in); | 751 | BIO_free(in); |
720 | return (ret); | 752 | return (ret); |
721 | } | 753 | } |
diff --git a/src/lib/libssl/ssl.h b/src/lib/libssl/ssl.h index 3b948245f2..c7dd4259cc 100644 --- a/src/lib/libssl/ssl.h +++ b/src/lib/libssl/ssl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl.h,v 1.65 2014/09/27 11:01:06 jsing Exp $ */ | 1 | /* $OpenBSD: ssl.h,v 1.66 2014/09/28 14:45:48 reyk Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -1530,6 +1530,7 @@ int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type); | |||
1530 | int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); | 1530 | int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type); |
1531 | int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); | 1531 | int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type); |
1532 | int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); /* PEM type */ | 1532 | int SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); /* PEM type */ |
1533 | int SSL_CTX_use_certificate_chain(SSL_CTX *ctx, void *buf, int len); | ||
1533 | STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); | 1534 | STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file); |
1534 | int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, | 1535 | int SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs, |
1535 | const char *file); | 1536 | const char *file); |
diff --git a/src/lib/libssl/ssl_rsa.c b/src/lib/libssl/ssl_rsa.c index d4d14bad35..e8b72f016e 100644 --- a/src/lib/libssl/ssl_rsa.c +++ b/src/lib/libssl/ssl_rsa.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_rsa.c,v 1.16 2014/07/12 16:03:37 miod Exp $ */ | 1 | /* $OpenBSD: ssl_rsa.c,v 1.17 2014/09/28 14:45:48 reyk Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -66,6 +66,8 @@ | |||
66 | 66 | ||
67 | static int ssl_set_cert(CERT *c, X509 *x509); | 67 | static int ssl_set_cert(CERT *c, X509 *x509); |
68 | static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey); | 68 | static int ssl_set_pkey(CERT *c, EVP_PKEY *pkey); |
69 | static int ssl_ctx_use_certificate_chain_bio(SSL_CTX *, BIO *); | ||
70 | |||
69 | int | 71 | int |
70 | SSL_use_certificate(SSL *ssl, X509 *x) | 72 | SSL_use_certificate(SSL *ssl, X509 *x) |
71 | { | 73 | { |
@@ -637,30 +639,18 @@ SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, const unsigned char *d, | |||
637 | 639 | ||
638 | 640 | ||
639 | /* | 641 | /* |
640 | * Read a file that contains our certificate in "PEM" format, | 642 | * Read a bio that contains our certificate in "PEM" format, |
641 | * possibly followed by a sequence of CA certificates that should be | 643 | * possibly followed by a sequence of CA certificates that should be |
642 | * sent to the peer in the Certificate message. | 644 | * sent to the peer in the Certificate message. |
643 | */ | 645 | */ |
644 | int | 646 | static int |
645 | SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file) | 647 | ssl_ctx_use_certificate_chain_bio(SSL_CTX *ctx, BIO *in) |
646 | { | 648 | { |
647 | BIO *in; | ||
648 | int ret = 0; | 649 | int ret = 0; |
649 | X509 *x = NULL; | 650 | X509 *x = NULL; |
650 | 651 | ||
651 | ERR_clear_error(); /* clear error stack for SSL_CTX_use_certificate() */ | 652 | ERR_clear_error(); /* clear error stack for SSL_CTX_use_certificate() */ |
652 | 653 | ||
653 | in = BIO_new(BIO_s_file_internal()); | ||
654 | if (in == NULL) { | ||
655 | SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_BUF_LIB); | ||
656 | goto end; | ||
657 | } | ||
658 | |||
659 | if (BIO_read_filename(in, file) <= 0) { | ||
660 | SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_SYS_LIB); | ||
661 | goto end; | ||
662 | } | ||
663 | |||
664 | x = PEM_read_bio_X509_AUX(in, NULL, ctx->default_passwd_callback, | 654 | x = PEM_read_bio_X509_AUX(in, NULL, ctx->default_passwd_callback, |
665 | ctx->default_passwd_callback_userdata); | 655 | ctx->default_passwd_callback_userdata); |
666 | if (x == NULL) { | 656 | if (x == NULL) { |
@@ -716,6 +706,48 @@ SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file) | |||
716 | end: | 706 | end: |
717 | if (x != NULL) | 707 | if (x != NULL) |
718 | X509_free(x); | 708 | X509_free(x); |
709 | return (ret); | ||
710 | } | ||
711 | |||
712 | int | ||
713 | SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file) | ||
714 | { | ||
715 | BIO *in; | ||
716 | int ret = 0; | ||
717 | |||
718 | in = BIO_new(BIO_s_file_internal()); | ||
719 | if (in == NULL) { | ||
720 | SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_BUF_LIB); | ||
721 | goto end; | ||
722 | } | ||
723 | |||
724 | if (BIO_read_filename(in, file) <= 0) { | ||
725 | SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_SYS_LIB); | ||
726 | goto end; | ||
727 | } | ||
728 | |||
729 | ret = ssl_ctx_use_certificate_chain_bio(ctx, in); | ||
730 | |||
731 | end: | ||
732 | BIO_free(in); | ||
733 | return (ret); | ||
734 | } | ||
735 | |||
736 | int | ||
737 | SSL_CTX_use_certificate_chain(SSL_CTX *ctx, void *buf, int len) | ||
738 | { | ||
739 | BIO *in; | ||
740 | int ret = 0; | ||
741 | |||
742 | in = BIO_new_mem_buf(buf, len); | ||
743 | if (in == NULL) { | ||
744 | SSLerr(SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE, ERR_R_BUF_LIB); | ||
745 | goto end; | ||
746 | } | ||
747 | |||
748 | ret = ssl_ctx_use_certificate_chain_bio(ctx, in); | ||
749 | |||
750 | end: | ||
719 | BIO_free(in); | 751 | BIO_free(in); |
720 | return (ret); | 752 | return (ret); |
721 | } | 753 | } |