diff options
author | tb <> | 2021-02-03 07:06:14 +0000 |
---|---|---|
committer | tb <> | 2021-02-03 07:06:14 +0000 |
commit | 70029edfad38276befdaee62f4fe7e084070c0cd (patch) | |
tree | 9f524641600313fef6d235a1c7bfeced27fbe075 | |
parent | 7708b34c3988d3cd2e01b8bd5d4f1a64461e6464 (diff) | |
download | openbsd-70029edfad38276befdaee62f4fe7e084070c0cd.tar.gz openbsd-70029edfad38276befdaee62f4fe7e084070c0cd.tar.bz2 openbsd-70029edfad38276befdaee62f4fe7e084070c0cd.zip |
This is errata/6.8/013_libressl.patch.siglibressl-v3.2.4
Various interoperability issues and memory leaks were discovered in
libcrypto and libssl.
The new verifier is not bug compatible with the old verifier and caused
many issues by failing to propagate errors correctly, returning different
error codes than some software was trained to expect and otherwise failing
when it shouldn't. While much of this is fixed in -current, it's still not
perfect, so switching back to the legacy verifier is preferable at this
point.
Other included fixes:
* Unbreak DTLS retransmissions for flights that include a CCS
* Only check BIO_should_read() on read and BIO_should_write() on write
* Implement autochain for the TLSv1.3 server
* Use the legacy verifier for AUTO_CHAIN
* Implement exporter for TLSv1.3
* Free alert_data and phh_data in tls13_record_layer_free()
* Plug leak in x509_verify_chain_dup()
* Free the policy tree in x509_vfy_check_policy()
Original commits by jsing and tb
ok inoguchi jsing
-rw-r--r-- | src/lib/libcrypto/x509/x509_verify.c | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/x509/x509_vfy.c | 7 | ||||
-rw-r--r-- | src/lib/libcrypto/x509/x509_vpm.c | 4 | ||||
-rw-r--r-- | src/lib/libssl/d1_both.c | 15 | ||||
-rw-r--r-- | src/lib/libssl/ssl_both.c | 4 | ||||
-rw-r--r-- | src/lib/libssl/ssl_lib.c | 15 | ||||
-rw-r--r-- | src/lib/libssl/tls13_internal.h | 16 | ||||
-rw-r--r-- | src/lib/libssl/tls13_key_schedule.c | 24 | ||||
-rw-r--r-- | src/lib/libssl/tls13_legacy.c | 6 | ||||
-rw-r--r-- | src/lib/libssl/tls13_lib.c | 74 | ||||
-rw-r--r-- | src/lib/libssl/tls13_record_layer.c | 5 | ||||
-rw-r--r-- | src/lib/libssl/tls13_server.c | 26 |
12 files changed, 172 insertions, 28 deletions
diff --git a/src/lib/libcrypto/x509/x509_verify.c b/src/lib/libcrypto/x509/x509_verify.c index 0c32cd04b7..be70ff8372 100644 --- a/src/lib/libcrypto/x509/x509_verify.c +++ b/src/lib/libcrypto/x509/x509_verify.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509_verify.c,v 1.13 2020/09/26 15:44:06 jsing Exp $ */ | 1 | /* $OpenBSD: x509_verify.c,v 1.13.4.1 2021/02/03 07:06:13 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> |
4 | * | 4 | * |
@@ -81,7 +81,7 @@ x509_verify_chain_dup(struct x509_verify_chain *chain) | |||
81 | { | 81 | { |
82 | struct x509_verify_chain *new_chain; | 82 | struct x509_verify_chain *new_chain; |
83 | 83 | ||
84 | if ((new_chain = x509_verify_chain_new()) == NULL) | 84 | if ((new_chain = calloc(1, sizeof(*chain))) == NULL) |
85 | goto err; | 85 | goto err; |
86 | if ((new_chain->certs = X509_chain_up_ref(chain->certs)) == NULL) | 86 | if ((new_chain->certs = X509_chain_up_ref(chain->certs)) == NULL) |
87 | goto err; | 87 | goto err; |
diff --git a/src/lib/libcrypto/x509/x509_vfy.c b/src/lib/libcrypto/x509/x509_vfy.c index fe1431ce49..931adb84bc 100644 --- a/src/lib/libcrypto/x509/x509_vfy.c +++ b/src/lib/libcrypto/x509/x509_vfy.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509_vfy.c,v 1.81 2020/09/26 02:06:28 deraadt Exp $ */ | 1 | /* $OpenBSD: x509_vfy.c,v 1.81.4.1 2021/02/03 07:06:13 tb 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 | * |
@@ -1794,6 +1794,11 @@ x509_vfy_check_policy(X509_STORE_CTX *ctx) | |||
1794 | 1794 | ||
1795 | if (ctx->parent) | 1795 | if (ctx->parent) |
1796 | return 1; | 1796 | return 1; |
1797 | |||
1798 | /* X509_policy_check always allocates a new tree. */ | ||
1799 | X509_policy_tree_free(ctx->tree); | ||
1800 | ctx->tree = NULL; | ||
1801 | |||
1797 | ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain, | 1802 | ret = X509_policy_check(&ctx->tree, &ctx->explicit_policy, ctx->chain, |
1798 | ctx->param->policies, ctx->param->flags); | 1803 | ctx->param->policies, ctx->param->flags); |
1799 | if (ret == 0) { | 1804 | if (ret == 0) { |
diff --git a/src/lib/libcrypto/x509/x509_vpm.c b/src/lib/libcrypto/x509/x509_vpm.c index 448ee20984..d4715228dc 100644 --- a/src/lib/libcrypto/x509/x509_vpm.c +++ b/src/lib/libcrypto/x509/x509_vpm.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509_vpm.c,v 1.22 2020/09/14 08:10:04 beck Exp $ */ | 1 | /* $OpenBSD: x509_vpm.c,v 1.22.4.1 2021/02/03 07:06:13 tb Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2004. | 3 | * project 2004. |
4 | */ | 4 | */ |
@@ -177,7 +177,7 @@ x509_verify_param_zero(X509_VERIFY_PARAM *param) | |||
177 | param->trust = 0; | 177 | param->trust = 0; |
178 | /*param->inh_flags = X509_VP_FLAG_DEFAULT;*/ | 178 | /*param->inh_flags = X509_VP_FLAG_DEFAULT;*/ |
179 | param->inh_flags = 0; | 179 | param->inh_flags = 0; |
180 | param->flags = 0; | 180 | param->flags = X509_V_FLAG_LEGACY_VERIFY; |
181 | param->depth = -1; | 181 | param->depth = -1; |
182 | if (param->policies) { | 182 | if (param->policies) { |
183 | sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free); | 183 | sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free); |
diff --git a/src/lib/libssl/d1_both.c b/src/lib/libssl/d1_both.c index 3d2516ce41..92d86da679 100644 --- a/src/lib/libssl/d1_both.c +++ b/src/lib/libssl/d1_both.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: d1_both.c,v 1.60 2020/09/26 14:43:17 jsing Exp $ */ | 1 | /* $OpenBSD: d1_both.c,v 1.60.4.1 2021/02/03 07:06:13 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * DTLS implementation written by Nagendra Modadugu | 3 | * DTLS implementation written by Nagendra Modadugu |
4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. | 4 | * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. |
@@ -1060,18 +1060,18 @@ dtls1_retransmit_message(SSL *s, unsigned short seq, unsigned long frag_off, | |||
1060 | frag->msg_header.frag_len); | 1060 | frag->msg_header.frag_len); |
1061 | 1061 | ||
1062 | /* save current state */ | 1062 | /* save current state */ |
1063 | saved_state.enc_write_ctx = s->internal->enc_write_ctx; | ||
1064 | saved_state.write_hash = s->internal->write_hash; | ||
1065 | saved_state.session = s->session; | 1063 | saved_state.session = s->session; |
1066 | saved_state.epoch = D1I(s)->w_epoch; | 1064 | saved_state.epoch = D1I(s)->w_epoch; |
1067 | 1065 | ||
1068 | D1I(s)->retransmitting = 1; | 1066 | D1I(s)->retransmitting = 1; |
1069 | 1067 | ||
1070 | /* restore state in which the message was originally sent */ | 1068 | /* restore state in which the message was originally sent */ |
1071 | s->internal->enc_write_ctx = frag->msg_header.saved_retransmit_state.enc_write_ctx; | ||
1072 | s->internal->write_hash = frag->msg_header.saved_retransmit_state.write_hash; | ||
1073 | s->session = frag->msg_header.saved_retransmit_state.session; | 1069 | s->session = frag->msg_header.saved_retransmit_state.session; |
1074 | D1I(s)->w_epoch = frag->msg_header.saved_retransmit_state.epoch; | 1070 | D1I(s)->w_epoch = frag->msg_header.saved_retransmit_state.epoch; |
1071 | if (!tls12_record_layer_set_write_cipher_hash(s->internal->rl, | ||
1072 | frag->msg_header.saved_retransmit_state.enc_write_ctx, | ||
1073 | frag->msg_header.saved_retransmit_state.write_hash, 0)) | ||
1074 | return 0; | ||
1075 | 1075 | ||
1076 | if (frag->msg_header.saved_retransmit_state.epoch == | 1076 | if (frag->msg_header.saved_retransmit_state.epoch == |
1077 | saved_state.epoch - 1) { | 1077 | saved_state.epoch - 1) { |
@@ -1085,10 +1085,11 @@ dtls1_retransmit_message(SSL *s, unsigned short seq, unsigned long frag_off, | |||
1085 | SSL3_RT_CHANGE_CIPHER_SPEC : SSL3_RT_HANDSHAKE); | 1085 | SSL3_RT_CHANGE_CIPHER_SPEC : SSL3_RT_HANDSHAKE); |
1086 | 1086 | ||
1087 | /* restore current state */ | 1087 | /* restore current state */ |
1088 | s->internal->enc_write_ctx = saved_state.enc_write_ctx; | ||
1089 | s->internal->write_hash = saved_state.write_hash; | ||
1090 | s->session = saved_state.session; | 1088 | s->session = saved_state.session; |
1091 | D1I(s)->w_epoch = saved_state.epoch; | 1089 | D1I(s)->w_epoch = saved_state.epoch; |
1090 | if (!tls12_record_layer_set_write_cipher_hash(s->internal->rl, | ||
1091 | s->internal->enc_write_ctx, s->internal->write_hash, 0)) | ||
1092 | return 0; | ||
1092 | 1093 | ||
1093 | if (frag->msg_header.saved_retransmit_state.epoch == | 1094 | if (frag->msg_header.saved_retransmit_state.epoch == |
1094 | saved_state.epoch - 1) { | 1095 | saved_state.epoch - 1) { |
diff --git a/src/lib/libssl/ssl_both.c b/src/lib/libssl/ssl_both.c index 5da450b5ce..5b64044e22 100644 --- a/src/lib/libssl/ssl_both.c +++ b/src/lib/libssl/ssl_both.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_both.c,v 1.20 2020/09/24 18:12:00 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_both.c,v 1.20.4.1 2021/02/03 07:06:13 tb 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 | * |
@@ -408,6 +408,8 @@ ssl3_output_cert_chain(SSL *s, CBB *cbb, CERT_PKEY *cpk) | |||
408 | SSLerror(s, ERR_R_X509_LIB); | 408 | SSLerror(s, ERR_R_X509_LIB); |
409 | goto err; | 409 | goto err; |
410 | } | 410 | } |
411 | X509_VERIFY_PARAM_set_flags(X509_STORE_CTX_get0_param(xs_ctx), | ||
412 | X509_V_FLAG_LEGACY_VERIFY); | ||
411 | X509_verify_cert(xs_ctx); | 413 | X509_verify_cert(xs_ctx); |
412 | ERR_clear_error(); | 414 | ERR_clear_error(); |
413 | chain = xs_ctx->chain; | 415 | chain = xs_ctx->chain; |
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c index 6e375e1c09..1cf64d1301 100644 --- a/src/lib/libssl/ssl_lib.c +++ b/src/lib/libssl/ssl_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_lib.c,v 1.234 2020/09/24 18:12:00 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_lib.c,v 1.234.4.1 2021/02/03 07:06:13 tb 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 | * |
@@ -1710,8 +1710,17 @@ SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen, | |||
1710 | const char *label, size_t llen, const unsigned char *p, size_t plen, | 1710 | const char *label, size_t llen, const unsigned char *p, size_t plen, |
1711 | int use_context) | 1711 | int use_context) |
1712 | { | 1712 | { |
1713 | return (tls1_export_keying_material(s, out, olen, | 1713 | if (s->internal->tls13 != NULL && s->version == TLS1_3_VERSION) { |
1714 | label, llen, p, plen, use_context)); | 1714 | if (!use_context) { |
1715 | p = NULL; | ||
1716 | plen = 0; | ||
1717 | } | ||
1718 | return tls13_exporter(s->internal->tls13, label, llen, p, plen, | ||
1719 | out, olen); | ||
1720 | } | ||
1721 | |||
1722 | return (tls1_export_keying_material(s, out, olen, label, llen, p, plen, | ||
1723 | use_context)); | ||
1715 | } | 1724 | } |
1716 | 1725 | ||
1717 | static unsigned long | 1726 | static unsigned long |
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h index 03a1a6b4b1..bdb554cbc2 100644 --- a/src/lib/libssl/tls13_internal.h +++ b/src/lib/libssl/tls13_internal.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_internal.h,v 1.86 2020/07/30 16:23:17 tb Exp $ */ | 1 | /* $OpenBSD: tls13_internal.h,v 1.86.4.1 2021/02/03 07:06:14 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018 Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2018 Bob Beck <beck@openbsd.org> |
4 | * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> | 4 | * Copyright (c) 2018 Theo Buehler <tb@openbsd.org> |
@@ -148,6 +148,16 @@ void tls13_secrets_destroy(struct tls13_secrets *secrets); | |||
148 | int tls13_hkdf_expand_label(struct tls13_secret *out, const EVP_MD *digest, | 148 | int tls13_hkdf_expand_label(struct tls13_secret *out, const EVP_MD *digest, |
149 | const struct tls13_secret *secret, const char *label, | 149 | const struct tls13_secret *secret, const char *label, |
150 | const struct tls13_secret *context); | 150 | const struct tls13_secret *context); |
151 | int tls13_hkdf_expand_label_with_length(struct tls13_secret *out, | ||
152 | const EVP_MD *digest, const struct tls13_secret *secret, | ||
153 | const uint8_t *label, size_t label_len, const struct tls13_secret *context); | ||
154 | |||
155 | int tls13_derive_secret(struct tls13_secret *out, const EVP_MD *digest, | ||
156 | const struct tls13_secret *secret, const char *label, | ||
157 | const struct tls13_secret *context); | ||
158 | int tls13_derive_secret_with_label_length(struct tls13_secret *out, | ||
159 | const EVP_MD *digest, const struct tls13_secret *secret, | ||
160 | const uint8_t *label, size_t label_len, const struct tls13_secret *context); | ||
151 | 161 | ||
152 | int tls13_derive_early_secrets(struct tls13_secrets *secrets, uint8_t *psk, | 162 | int tls13_derive_early_secrets(struct tls13_secrets *secrets, uint8_t *psk, |
153 | size_t psk_len, const struct tls13_secret *context); | 163 | size_t psk_len, const struct tls13_secret *context); |
@@ -412,6 +422,10 @@ int tls13_error_setx(struct tls13_error *error, int code, int subcode, | |||
412 | tls13_error_setx(&(ctx)->error, (code), (subcode), __FILE__, __LINE__, \ | 422 | tls13_error_setx(&(ctx)->error, (code), (subcode), __FILE__, __LINE__, \ |
413 | (fmt), __VA_ARGS__) | 423 | (fmt), __VA_ARGS__) |
414 | 424 | ||
425 | int tls13_exporter(struct tls13_ctx *ctx, const uint8_t *label, size_t label_len, | ||
426 | const uint8_t *context_value, size_t context_value_len, uint8_t *out, | ||
427 | size_t out_len); | ||
428 | |||
415 | extern const uint8_t tls13_downgrade_12[8]; | 429 | extern const uint8_t tls13_downgrade_12[8]; |
416 | extern const uint8_t tls13_downgrade_11[8]; | 430 | extern const uint8_t tls13_downgrade_11[8]; |
417 | extern const uint8_t tls13_hello_retry_request_hash[32]; | 431 | extern const uint8_t tls13_hello_retry_request_hash[32]; |
diff --git a/src/lib/libssl/tls13_key_schedule.c b/src/lib/libssl/tls13_key_schedule.c index 91f59e46f9..d112351530 100644 --- a/src/lib/libssl/tls13_key_schedule.c +++ b/src/lib/libssl/tls13_key_schedule.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_key_schedule.c,v 1.8 2019/11/17 21:01:08 beck Exp $ */ | 1 | /* $OpenBSD: tls13_key_schedule.c,v 1.8.6.1 2021/02/03 07:06:14 tb Exp $ */ |
2 | /* Copyright (c) 2018, Bob Beck <beck@openbsd.org> | 2 | /* Copyright (c) 2018, Bob Beck <beck@openbsd.org> |
3 | * | 3 | * |
4 | * Permission to use, copy, modify, and/or distribute this software for any | 4 | * Permission to use, copy, modify, and/or distribute this software for any |
@@ -174,6 +174,15 @@ tls13_hkdf_expand_label(struct tls13_secret *out, const EVP_MD *digest, | |||
174 | const struct tls13_secret *secret, const char *label, | 174 | const struct tls13_secret *secret, const char *label, |
175 | const struct tls13_secret *context) | 175 | const struct tls13_secret *context) |
176 | { | 176 | { |
177 | return tls13_hkdf_expand_label_with_length(out, digest, secret, label, | ||
178 | strlen(label), context); | ||
179 | } | ||
180 | |||
181 | int | ||
182 | tls13_hkdf_expand_label_with_length(struct tls13_secret *out, | ||
183 | const EVP_MD *digest, const struct tls13_secret *secret, | ||
184 | const uint8_t *label, size_t label_len, const struct tls13_secret *context) | ||
185 | { | ||
177 | const char tls13_plabel[] = "tls13 "; | 186 | const char tls13_plabel[] = "tls13 "; |
178 | uint8_t *hkdf_label; | 187 | uint8_t *hkdf_label; |
179 | size_t hkdf_label_len; | 188 | size_t hkdf_label_len; |
@@ -188,7 +197,7 @@ tls13_hkdf_expand_label(struct tls13_secret *out, const EVP_MD *digest, | |||
188 | goto err; | 197 | goto err; |
189 | if (!CBB_add_bytes(&child, tls13_plabel, strlen(tls13_plabel))) | 198 | if (!CBB_add_bytes(&child, tls13_plabel, strlen(tls13_plabel))) |
190 | goto err; | 199 | goto err; |
191 | if (!CBB_add_bytes(&child, label, strlen(label))) | 200 | if (!CBB_add_bytes(&child, label, label_len)) |
192 | goto err; | 201 | goto err; |
193 | if (!CBB_add_u8_length_prefixed(&cbb, &child)) | 202 | if (!CBB_add_u8_length_prefixed(&cbb, &child)) |
194 | goto err; | 203 | goto err; |
@@ -207,7 +216,7 @@ tls13_hkdf_expand_label(struct tls13_secret *out, const EVP_MD *digest, | |||
207 | return(0); | 216 | return(0); |
208 | } | 217 | } |
209 | 218 | ||
210 | static int | 219 | int |
211 | tls13_derive_secret(struct tls13_secret *out, const EVP_MD *digest, | 220 | tls13_derive_secret(struct tls13_secret *out, const EVP_MD *digest, |
212 | const struct tls13_secret *secret, const char *label, | 221 | const struct tls13_secret *secret, const char *label, |
213 | const struct tls13_secret *context) | 222 | const struct tls13_secret *context) |
@@ -216,6 +225,15 @@ tls13_derive_secret(struct tls13_secret *out, const EVP_MD *digest, | |||
216 | } | 225 | } |
217 | 226 | ||
218 | int | 227 | int |
228 | tls13_derive_secret_with_label_length(struct tls13_secret *out, | ||
229 | const EVP_MD *digest, const struct tls13_secret *secret, const uint8_t *label, | ||
230 | size_t label_len, const struct tls13_secret *context) | ||
231 | { | ||
232 | return tls13_hkdf_expand_label_with_length(out, digest, secret, label, | ||
233 | label_len, context); | ||
234 | } | ||
235 | |||
236 | int | ||
219 | tls13_derive_early_secrets(struct tls13_secrets *secrets, | 237 | tls13_derive_early_secrets(struct tls13_secrets *secrets, |
220 | uint8_t *psk, size_t psk_len, const struct tls13_secret *context) | 238 | uint8_t *psk, size_t psk_len, const struct tls13_secret *context) |
221 | { | 239 | { |
diff --git a/src/lib/libssl/tls13_legacy.c b/src/lib/libssl/tls13_legacy.c index 317a1cb0f5..468f4edfc4 100644 --- a/src/lib/libssl/tls13_legacy.c +++ b/src/lib/libssl/tls13_legacy.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_legacy.c,v 1.13 2020/09/13 15:04:35 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_legacy.c,v 1.13.4.1 2021/02/03 07:06:14 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -40,8 +40,6 @@ tls13_legacy_wire_read(SSL *ssl, uint8_t *buf, size_t len) | |||
40 | if ((n = BIO_read(ssl->rbio, buf, len)) <= 0) { | 40 | if ((n = BIO_read(ssl->rbio, buf, len)) <= 0) { |
41 | if (BIO_should_read(ssl->rbio)) | 41 | if (BIO_should_read(ssl->rbio)) |
42 | return TLS13_IO_WANT_POLLIN; | 42 | return TLS13_IO_WANT_POLLIN; |
43 | if (BIO_should_write(ssl->rbio)) | ||
44 | return TLS13_IO_WANT_POLLOUT; | ||
45 | if (n == 0) | 43 | if (n == 0) |
46 | return TLS13_IO_EOF; | 44 | return TLS13_IO_EOF; |
47 | 45 | ||
@@ -79,8 +77,6 @@ tls13_legacy_wire_write(SSL *ssl, const uint8_t *buf, size_t len) | |||
79 | errno = 0; | 77 | errno = 0; |
80 | 78 | ||
81 | if ((n = BIO_write(ssl->wbio, buf, len)) <= 0) { | 79 | if ((n = BIO_write(ssl->wbio, buf, len)) <= 0) { |
82 | if (BIO_should_read(ssl->wbio)) | ||
83 | return TLS13_IO_WANT_POLLIN; | ||
84 | if (BIO_should_write(ssl->wbio)) | 80 | if (BIO_should_write(ssl->wbio)) |
85 | return TLS13_IO_WANT_POLLOUT; | 81 | return TLS13_IO_WANT_POLLOUT; |
86 | 82 | ||
diff --git a/src/lib/libssl/tls13_lib.c b/src/lib/libssl/tls13_lib.c index 590426ad8a..af3de58f93 100644 --- a/src/lib/libssl/tls13_lib.c +++ b/src/lib/libssl/tls13_lib.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_lib.c,v 1.54 2020/09/11 15:03:36 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_lib.c,v 1.54.4.1 2021/02/03 07:06:14 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2019 Bob Beck <beck@openbsd.org> | 4 | * Copyright (c) 2019 Bob Beck <beck@openbsd.org> |
@@ -579,3 +579,75 @@ tls13_clienthello_hash_validate(struct tls13_ctx *ctx) | |||
579 | return 1; | 579 | return 1; |
580 | } | 580 | } |
581 | 581 | ||
582 | int | ||
583 | tls13_exporter(struct tls13_ctx *ctx, const uint8_t *label, size_t label_len, | ||
584 | const uint8_t *context_value, size_t context_value_len, uint8_t *out, | ||
585 | size_t out_len) | ||
586 | { | ||
587 | struct tls13_secret context, export_out, export_secret; | ||
588 | struct tls13_secrets *secrets = ctx->hs->secrets; | ||
589 | EVP_MD_CTX *md_ctx = NULL; | ||
590 | unsigned int md_out_len; | ||
591 | int md_len; | ||
592 | int ret = 0; | ||
593 | |||
594 | /* | ||
595 | * RFC 8446 Section 7.5. | ||
596 | */ | ||
597 | |||
598 | memset(&context, 0, sizeof(context)); | ||
599 | memset(&export_secret, 0, sizeof(export_secret)); | ||
600 | |||
601 | export_out.data = out; | ||
602 | export_out.len = out_len; | ||
603 | |||
604 | if (!ctx->handshake_completed) | ||
605 | return 0; | ||
606 | |||
607 | md_len = EVP_MD_size(secrets->digest); | ||
608 | if (md_len <= 0 || md_len > EVP_MAX_MD_SIZE) | ||
609 | goto err; | ||
610 | |||
611 | if ((export_secret.data = calloc(1, md_len)) == NULL) | ||
612 | goto err; | ||
613 | export_secret.len = md_len; | ||
614 | |||
615 | if ((context.data = calloc(1, md_len)) == NULL) | ||
616 | goto err; | ||
617 | context.len = md_len; | ||
618 | |||
619 | /* In TLSv1.3 no context is equivalent to an empty context. */ | ||
620 | if (context_value == NULL) { | ||
621 | context_value = ""; | ||
622 | context_value_len = 0; | ||
623 | } | ||
624 | |||
625 | if ((md_ctx = EVP_MD_CTX_new()) == NULL) | ||
626 | goto err; | ||
627 | if (!EVP_DigestInit_ex(md_ctx, secrets->digest, NULL)) | ||
628 | goto err; | ||
629 | if (!EVP_DigestUpdate(md_ctx, context_value, context_value_len)) | ||
630 | goto err; | ||
631 | if (!EVP_DigestFinal_ex(md_ctx, context.data, &md_out_len)) | ||
632 | goto err; | ||
633 | if (md_len != md_out_len) | ||
634 | goto err; | ||
635 | |||
636 | if (!tls13_derive_secret_with_label_length(&export_secret, | ||
637 | secrets->digest, &secrets->exporter_master, label, label_len, | ||
638 | &secrets->empty_hash)) | ||
639 | goto err; | ||
640 | |||
641 | if (!tls13_hkdf_expand_label(&export_out, secrets->digest, | ||
642 | &export_secret, "exporter", &context)) | ||
643 | goto err; | ||
644 | |||
645 | ret = 1; | ||
646 | |||
647 | err: | ||
648 | EVP_MD_CTX_free(md_ctx); | ||
649 | freezero(context.data, context.len); | ||
650 | freezero(export_secret.data, export_secret.len); | ||
651 | |||
652 | return ret; | ||
653 | } | ||
diff --git a/src/lib/libssl/tls13_record_layer.c b/src/lib/libssl/tls13_record_layer.c index 1d75d9e5a4..6e1548ea14 100644 --- a/src/lib/libssl/tls13_record_layer.c +++ b/src/lib/libssl/tls13_record_layer.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_record_layer.c,v 1.53 2020/09/11 15:03:36 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_record_layer.c,v 1.53.4.1 2021/02/03 07:06:14 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -135,6 +135,9 @@ tls13_record_layer_free(struct tls13_record_layer *rl) | |||
135 | if (rl == NULL) | 135 | if (rl == NULL) |
136 | return; | 136 | return; |
137 | 137 | ||
138 | freezero(rl->alert_data, rl->alert_len); | ||
139 | freezero(rl->phh_data, rl->phh_len); | ||
140 | |||
138 | tls13_record_layer_rbuf_free(rl); | 141 | tls13_record_layer_rbuf_free(rl); |
139 | 142 | ||
140 | tls13_record_layer_rrec_free(rl); | 143 | tls13_record_layer_rrec_free(rl); |
diff --git a/src/lib/libssl/tls13_server.c b/src/lib/libssl/tls13_server.c index a5c03b610c..f9b557d2ac 100644 --- a/src/lib/libssl/tls13_server.c +++ b/src/lib/libssl/tls13_server.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_server.c,v 1.61 2020/07/03 04:12:51 tb Exp $ */ | 1 | /* $OpenBSD: tls13_server.c,v 1.61.4.1 2021/02/03 07:06:14 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> | 4 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> |
@@ -611,6 +611,7 @@ tls13_server_certificate_send(struct tls13_ctx *ctx, CBB *cbb) | |||
611 | SSL *s = ctx->ssl; | 611 | SSL *s = ctx->ssl; |
612 | CBB cert_request_context, cert_list; | 612 | CBB cert_request_context, cert_list; |
613 | const struct ssl_sigalg *sigalg; | 613 | const struct ssl_sigalg *sigalg; |
614 | X509_STORE_CTX *xsc = NULL; | ||
614 | STACK_OF(X509) *chain; | 615 | STACK_OF(X509) *chain; |
615 | CERT_PKEY *cpk; | 616 | CERT_PKEY *cpk; |
616 | X509 *cert; | 617 | X509 *cert; |
@@ -633,6 +634,18 @@ tls13_server_certificate_send(struct tls13_ctx *ctx, CBB *cbb) | |||
633 | if ((chain = cpk->chain) == NULL) | 634 | if ((chain = cpk->chain) == NULL) |
634 | chain = s->ctx->extra_certs; | 635 | chain = s->ctx->extra_certs; |
635 | 636 | ||
637 | if (chain == NULL && !(s->internal->mode & SSL_MODE_NO_AUTO_CHAIN)) { | ||
638 | if ((xsc = X509_STORE_CTX_new()) == NULL) | ||
639 | goto err; | ||
640 | if (!X509_STORE_CTX_init(xsc, s->ctx->cert_store, cpk->x509, NULL)) | ||
641 | goto err; | ||
642 | X509_VERIFY_PARAM_set_flags(X509_STORE_CTX_get0_param(xsc), | ||
643 | X509_V_FLAG_LEGACY_VERIFY); | ||
644 | X509_verify_cert(xsc); | ||
645 | ERR_clear_error(); | ||
646 | chain = xsc->chain; | ||
647 | } | ||
648 | |||
636 | if (!CBB_add_u8_length_prefixed(cbb, &cert_request_context)) | 649 | if (!CBB_add_u8_length_prefixed(cbb, &cert_request_context)) |
637 | goto err; | 650 | goto err; |
638 | if (!CBB_add_u24_length_prefixed(cbb, &cert_list)) | 651 | if (!CBB_add_u24_length_prefixed(cbb, &cert_list)) |
@@ -643,6 +656,15 @@ tls13_server_certificate_send(struct tls13_ctx *ctx, CBB *cbb) | |||
643 | 656 | ||
644 | for (i = 0; i < sk_X509_num(chain); i++) { | 657 | for (i = 0; i < sk_X509_num(chain); i++) { |
645 | cert = sk_X509_value(chain, i); | 658 | cert = sk_X509_value(chain, i); |
659 | |||
660 | /* | ||
661 | * In the case of auto chain, the leaf certificate will be at | ||
662 | * the top of the chain - skip over it as we've already added | ||
663 | * it earlier. | ||
664 | */ | ||
665 | if (i == 0 && cert == cpk->x509) | ||
666 | continue; | ||
667 | |||
646 | /* | 668 | /* |
647 | * XXX we don't send extensions with chain certs to avoid sending | 669 | * XXX we don't send extensions with chain certs to avoid sending |
648 | * a leaf ocsp stape with the chain certs. This needs to get | 670 | * a leaf ocsp stape with the chain certs. This needs to get |
@@ -658,6 +680,8 @@ tls13_server_certificate_send(struct tls13_ctx *ctx, CBB *cbb) | |||
658 | ret = 1; | 680 | ret = 1; |
659 | 681 | ||
660 | err: | 682 | err: |
683 | X509_STORE_CTX_free(xsc); | ||
684 | |||
661 | return ret; | 685 | return ret; |
662 | } | 686 | } |
663 | 687 | ||