diff options
Diffstat (limited to 'src/lib/libtls/tls.c')
| -rw-r--r-- | src/lib/libtls/tls.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/lib/libtls/tls.c b/src/lib/libtls/tls.c index f64f6d7632..ed857272c4 100644 --- a/src/lib/libtls/tls.c +++ b/src/lib/libtls/tls.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls.c,v 1.67 2017/06/22 18:03:57 jsing Exp $ */ | 1 | /* $OpenBSD: tls.c,v 1.68 2017/07/06 17:12:22 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -26,6 +26,8 @@ | |||
| 26 | #include <openssl/err.h> | 26 | #include <openssl/err.h> |
| 27 | #include <openssl/evp.h> | 27 | #include <openssl/evp.h> |
| 28 | #include <openssl/pem.h> | 28 | #include <openssl/pem.h> |
| 29 | #include <openssl/safestack.h> | ||
| 30 | #include <openssl/ssl.h> | ||
| 29 | #include <openssl/x509.h> | 31 | #include <openssl/x509.h> |
| 30 | 32 | ||
| 31 | #include <tls.h> | 33 | #include <tls.h> |
| @@ -464,8 +466,15 @@ tls_configure_ssl_verify(struct tls *ctx, SSL_CTX *ssl_ctx, int verify) | |||
| 464 | { | 466 | { |
| 465 | size_t ca_len = ctx->config->ca_len; | 467 | size_t ca_len = ctx->config->ca_len; |
| 466 | char *ca_mem = ctx->config->ca_mem; | 468 | char *ca_mem = ctx->config->ca_mem; |
| 469 | char *crl_mem = ctx->config->crl_mem; | ||
| 470 | size_t crl_len = ctx->config->crl_len; | ||
| 467 | char *ca_free = NULL; | 471 | char *ca_free = NULL; |
| 472 | STACK_OF(X509_INFO) *xis = NULL; | ||
| 473 | X509_STORE *store; | ||
| 474 | X509_INFO *xi; | ||
| 475 | BIO *bio = NULL; | ||
| 468 | int rv = -1; | 476 | int rv = -1; |
| 477 | int i; | ||
| 469 | 478 | ||
| 470 | SSL_CTX_set_verify(ssl_ctx, verify, NULL); | 479 | SSL_CTX_set_verify(ssl_ctx, verify, NULL); |
| 471 | SSL_CTX_set_cert_verify_callback(ssl_ctx, tls_ssl_cert_verify_cb, ctx); | 480 | SSL_CTX_set_cert_verify_callback(ssl_ctx, tls_ssl_cert_verify_cb, ctx); |
| @@ -499,10 +508,41 @@ tls_configure_ssl_verify(struct tls *ctx, SSL_CTX *ssl_ctx, int verify) | |||
| 499 | goto err; | 508 | goto err; |
| 500 | } | 509 | } |
| 501 | 510 | ||
| 511 | if (crl_mem != NULL) { | ||
| 512 | if (crl_len > INT_MAX) { | ||
| 513 | tls_set_errorx(ctx, "crl too long"); | ||
| 514 | goto err; | ||
| 515 | } | ||
| 516 | if ((bio = BIO_new_mem_buf(crl_mem, crl_len)) == NULL) { | ||
| 517 | tls_set_errorx(ctx, "failed to create buffer"); | ||
| 518 | goto err; | ||
| 519 | } | ||
| 520 | if ((xis = PEM_X509_INFO_read_bio(bio, NULL, tls_password_cb, | ||
| 521 | NULL)) == NULL) { | ||
| 522 | tls_set_errorx(ctx, "failed to parse crl"); | ||
| 523 | goto err; | ||
| 524 | } | ||
| 525 | store = SSL_CTX_get_cert_store(ssl_ctx); | ||
| 526 | for (i = 0; i < sk_X509_INFO_num(xis); i++) { | ||
| 527 | xi = sk_X509_INFO_value(xis, i); | ||
| 528 | if (xi->crl == NULL) | ||
| 529 | continue; | ||
| 530 | if (!X509_STORE_add_crl(store, xi->crl)) { | ||
| 531 | tls_set_error(ctx, "failed to add crl"); | ||
| 532 | goto err; | ||
| 533 | } | ||
| 534 | xi->crl = NULL; | ||
| 535 | } | ||
| 536 | X509_VERIFY_PARAM_set_flags(store->param, | ||
| 537 | X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL); | ||
| 538 | } | ||
| 539 | |||
| 502 | done: | 540 | done: |
| 503 | rv = 0; | 541 | rv = 0; |
| 504 | 542 | ||
| 505 | err: | 543 | err: |
| 544 | sk_X509_INFO_pop_free(xis, X509_INFO_free); | ||
| 545 | BIO_free(bio); | ||
| 506 | free(ca_free); | 546 | free(ca_free); |
| 507 | 547 | ||
| 508 | return (rv); | 548 | return (rv); |
