diff options
-rw-r--r-- | src/lib/libssl/Makefile | 3 | ||||
-rw-r--r-- | src/lib/libssl/ssl_locl.h | 6 | ||||
-rw-r--r-- | src/lib/libssl/tls13_internal.h | 21 | ||||
-rw-r--r-- | src/lib/libssl/tls13_lib.c | 23 | ||||
-rw-r--r-- | src/lib/libssl/tls13_quic.c | 135 | ||||
-rw-r--r-- | src/lib/libssl/tls13_record_layer.c | 31 | ||||
-rw-r--r-- | src/lib/libssl/tls_internal.h | 14 |
7 files changed, 217 insertions, 16 deletions
diff --git a/src/lib/libssl/Makefile b/src/lib/libssl/Makefile index e6930b0b9f..d0d7bc4e02 100644 --- a/src/lib/libssl/Makefile +++ b/src/lib/libssl/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | # $OpenBSD: Makefile,v 1.75 2022/06/28 20:40:24 tb Exp $ | 1 | # $OpenBSD: Makefile,v 1.76 2022/07/24 14:28:16 jsing Exp $ |
2 | 2 | ||
3 | .include <bsd.own.mk> | 3 | .include <bsd.own.mk> |
4 | .ifndef NOMAN | 4 | .ifndef NOMAN |
@@ -79,6 +79,7 @@ SRCS= \ | |||
79 | tls13_key_schedule.c \ | 79 | tls13_key_schedule.c \ |
80 | tls13_legacy.c \ | 80 | tls13_legacy.c \ |
81 | tls13_lib.c \ | 81 | tls13_lib.c \ |
82 | tls13_quic.c \ | ||
82 | tls13_record.c \ | 83 | tls13_record.c \ |
83 | tls13_record_layer.c \ | 84 | tls13_record_layer.c \ |
84 | tls13_server.c \ | 85 | tls13_server.c \ |
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 7623daccf1..18daf791f0 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_locl.h,v 1.416 2022/07/22 19:54:46 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.417 2022/07/24 14:28:16 jsing 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 | * |
@@ -581,6 +581,10 @@ typedef struct ssl_handshake_tls13_st { | |||
581 | EVP_MD_CTX *clienthello_md_ctx; | 581 | EVP_MD_CTX *clienthello_md_ctx; |
582 | unsigned char *clienthello_hash; | 582 | unsigned char *clienthello_hash; |
583 | unsigned int clienthello_hash_len; | 583 | unsigned int clienthello_hash_len; |
584 | |||
585 | /* QUIC read/write encryption levels. */ | ||
586 | enum ssl_encryption_level_t quic_read_level; | ||
587 | enum ssl_encryption_level_t quic_write_level; | ||
584 | } SSL_HANDSHAKE_TLS13; | 588 | } SSL_HANDSHAKE_TLS13; |
585 | 589 | ||
586 | typedef struct ssl_handshake_st { | 590 | typedef struct ssl_handshake_st { |
diff --git a/src/lib/libssl/tls13_internal.h b/src/lib/libssl/tls13_internal.h index 6382f8b048..f4b17bdf25 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.100 2022/07/24 14:16:29 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_internal.h,v 1.101 2022/07/24 14:28:16 jsing 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> |
@@ -175,9 +175,19 @@ int tls13_update_server_traffic_secret(struct tls13_secrets *secrets); | |||
175 | struct tls13_record_layer; | 175 | struct tls13_record_layer; |
176 | 176 | ||
177 | struct tls13_record_layer_callbacks { | 177 | struct tls13_record_layer_callbacks { |
178 | /* Wire callbacks. */ | ||
178 | tls_read_cb wire_read; | 179 | tls_read_cb wire_read; |
179 | tls_write_cb wire_write; | 180 | tls_write_cb wire_write; |
180 | tls_flush_cb wire_flush; | 181 | tls_flush_cb wire_flush; |
182 | |||
183 | /* Interceptors. */ | ||
184 | tls_handshake_read_cb handshake_read; | ||
185 | tls_handshake_write_cb handshake_write; | ||
186 | tls_traffic_key_cb set_read_traffic_key; | ||
187 | tls_traffic_key_cb set_write_traffic_key; | ||
188 | tls_alert_send_cb alert_send; | ||
189 | |||
190 | /* Notification callbacks. */ | ||
181 | tls13_alert_cb alert_recv; | 191 | tls13_alert_cb alert_recv; |
182 | tls13_alert_cb alert_sent; | 192 | tls13_alert_cb alert_sent; |
183 | tls13_phh_recv_cb phh_recv; | 193 | tls13_phh_recv_cb phh_recv; |
@@ -187,6 +197,8 @@ struct tls13_record_layer_callbacks { | |||
187 | struct tls13_record_layer *tls13_record_layer_new( | 197 | struct tls13_record_layer *tls13_record_layer_new( |
188 | const struct tls13_record_layer_callbacks *callbacks, void *cb_arg); | 198 | const struct tls13_record_layer_callbacks *callbacks, void *cb_arg); |
189 | void tls13_record_layer_free(struct tls13_record_layer *rl); | 199 | void tls13_record_layer_free(struct tls13_record_layer *rl); |
200 | void tls13_record_layer_set_callbacks(struct tls13_record_layer *rl, | ||
201 | const struct tls13_record_layer_callbacks *callbacks, void *cb_arg); | ||
190 | void tls13_record_layer_allow_ccs(struct tls13_record_layer *rl, int allow); | 202 | void tls13_record_layer_allow_ccs(struct tls13_record_layer *rl, int allow); |
191 | void tls13_record_layer_allow_legacy_alerts(struct tls13_record_layer *rl, int allow); | 203 | void tls13_record_layer_allow_legacy_alerts(struct tls13_record_layer *rl, int allow); |
192 | void tls13_record_layer_rcontent(struct tls13_record_layer *rl, CBS *cbs); | 204 | void tls13_record_layer_rcontent(struct tls13_record_layer *rl, CBS *cbs); |
@@ -297,6 +309,13 @@ void tls13_ctx_free(struct tls13_ctx *ctx); | |||
297 | const EVP_AEAD *tls13_cipher_aead(const SSL_CIPHER *cipher); | 309 | const EVP_AEAD *tls13_cipher_aead(const SSL_CIPHER *cipher); |
298 | const EVP_MD *tls13_cipher_hash(const SSL_CIPHER *cipher); | 310 | const EVP_MD *tls13_cipher_hash(const SSL_CIPHER *cipher); |
299 | 311 | ||
312 | void tls13_alert_received_cb(uint8_t alert_desc, void *arg); | ||
313 | void tls13_alert_sent_cb(uint8_t alert_desc, void *arg); | ||
314 | ssize_t tls13_phh_received_cb(void *cb_arg); | ||
315 | void tls13_phh_done_cb(void *cb_arg); | ||
316 | |||
317 | int tls13_quic_init(struct tls13_ctx *ctx); | ||
318 | |||
300 | /* | 319 | /* |
301 | * Legacy interfaces. | 320 | * Legacy interfaces. |
302 | */ | 321 | */ |
diff --git a/src/lib/libssl/tls13_lib.c b/src/lib/libssl/tls13_lib.c index d63951a0ff..57c58a3d30 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.69 2022/07/24 14:19:45 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_lib.c,v 1.70 2022/07/24 14:28:16 jsing 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> |
@@ -103,7 +103,7 @@ tls13_cipher_hash(const SSL_CIPHER *cipher) | |||
103 | return NULL; | 103 | return NULL; |
104 | } | 104 | } |
105 | 105 | ||
106 | static void | 106 | void |
107 | tls13_alert_received_cb(uint8_t alert_desc, void *arg) | 107 | tls13_alert_received_cb(uint8_t alert_desc, void *arg) |
108 | { | 108 | { |
109 | struct tls13_ctx *ctx = arg; | 109 | struct tls13_ctx *ctx = arg; |
@@ -132,7 +132,7 @@ tls13_alert_received_cb(uint8_t alert_desc, void *arg) | |||
132 | SSL_CTX_remove_session(ctx->ssl->ctx, ctx->ssl->session); | 132 | SSL_CTX_remove_session(ctx->ssl->ctx, ctx->ssl->session); |
133 | } | 133 | } |
134 | 134 | ||
135 | static void | 135 | void |
136 | tls13_alert_sent_cb(uint8_t alert_desc, void *arg) | 136 | tls13_alert_sent_cb(uint8_t alert_desc, void *arg) |
137 | { | 137 | { |
138 | struct tls13_ctx *ctx = arg; | 138 | struct tls13_ctx *ctx = arg; |
@@ -328,7 +328,7 @@ tls13_key_update_recv(struct tls13_ctx *ctx, CBS *cbs) | |||
328 | return tls13_send_alert(ctx->rl, alert); | 328 | return tls13_send_alert(ctx->rl, alert); |
329 | } | 329 | } |
330 | 330 | ||
331 | static ssize_t | 331 | ssize_t |
332 | tls13_phh_received_cb(void *cb_arg) | 332 | tls13_phh_received_cb(void *cb_arg) |
333 | { | 333 | { |
334 | ssize_t ret = TLS13_IO_FAILURE; | 334 | ssize_t ret = TLS13_IO_FAILURE; |
@@ -369,7 +369,7 @@ tls13_phh_received_cb(void *cb_arg) | |||
369 | return ret; | 369 | return ret; |
370 | } | 370 | } |
371 | 371 | ||
372 | static void | 372 | void |
373 | tls13_phh_done_cb(void *cb_arg) | 373 | tls13_phh_done_cb(void *cb_arg) |
374 | { | 374 | { |
375 | struct tls13_ctx *ctx = cb_arg; | 375 | struct tls13_ctx *ctx = cb_arg; |
@@ -380,10 +380,11 @@ tls13_phh_done_cb(void *cb_arg) | |||
380 | } | 380 | } |
381 | } | 381 | } |
382 | 382 | ||
383 | static const struct tls13_record_layer_callbacks rl_callbacks = { | 383 | static const struct tls13_record_layer_callbacks tls13_rl_callbacks = { |
384 | .wire_read = tls13_legacy_wire_read_cb, | 384 | .wire_read = tls13_legacy_wire_read_cb, |
385 | .wire_write = tls13_legacy_wire_write_cb, | 385 | .wire_write = tls13_legacy_wire_write_cb, |
386 | .wire_flush = tls13_legacy_wire_flush_cb, | 386 | .wire_flush = tls13_legacy_wire_flush_cb, |
387 | |||
387 | .alert_recv = tls13_alert_received_cb, | 388 | .alert_recv = tls13_alert_received_cb, |
388 | .alert_sent = tls13_alert_sent_cb, | 389 | .alert_sent = tls13_alert_sent_cb, |
389 | .phh_recv = tls13_phh_received_cb, | 390 | .phh_recv = tls13_phh_received_cb, |
@@ -402,7 +403,7 @@ tls13_ctx_new(int mode, SSL *ssl) | |||
402 | ctx->mode = mode; | 403 | ctx->mode = mode; |
403 | ctx->ssl = ssl; | 404 | ctx->ssl = ssl; |
404 | 405 | ||
405 | if ((ctx->rl = tls13_record_layer_new(&rl_callbacks, ctx)) == NULL) | 406 | if ((ctx->rl = tls13_record_layer_new(&tls13_rl_callbacks, ctx)) == NULL) |
406 | goto err; | 407 | goto err; |
407 | 408 | ||
408 | ctx->handshake_message_sent_cb = tls13_legacy_handshake_message_sent_cb; | 409 | ctx->handshake_message_sent_cb = tls13_legacy_handshake_message_sent_cb; |
@@ -410,11 +411,15 @@ tls13_ctx_new(int mode, SSL *ssl) | |||
410 | ctx->info_cb = tls13_legacy_info_cb; | 411 | ctx->info_cb = tls13_legacy_info_cb; |
411 | ctx->ocsp_status_recv_cb = tls13_legacy_ocsp_status_recv_cb; | 412 | ctx->ocsp_status_recv_cb = tls13_legacy_ocsp_status_recv_cb; |
412 | 413 | ||
413 | if (!SSL_is_quic(ssl)) | 414 | ctx->middlebox_compat = 1; |
414 | ctx->middlebox_compat = 1; | ||
415 | 415 | ||
416 | ssl->internal->tls13 = ctx; | 416 | ssl->internal->tls13 = ctx; |
417 | 417 | ||
418 | if (SSL_is_quic(ssl)) { | ||
419 | if (!tls13_quic_init(ctx)) | ||
420 | goto err; | ||
421 | } | ||
422 | |||
418 | return ctx; | 423 | return ctx; |
419 | 424 | ||
420 | err: | 425 | err: |
diff --git a/src/lib/libssl/tls13_quic.c b/src/lib/libssl/tls13_quic.c new file mode 100644 index 0000000000..3f814188a7 --- /dev/null +++ b/src/lib/libssl/tls13_quic.c | |||
@@ -0,0 +1,135 @@ | |||
1 | /* $OpenBSD: tls13_quic.c,v 1.1 2022/07/24 14:28:16 jsing Exp $ */ | ||
2 | /* | ||
3 | * Copyright (c) 2022 Joel Sing <jsing@openbsd.org> | ||
4 | * | ||
5 | * Permission to use, copy, modify, and distribute this software for any | ||
6 | * purpose with or without fee is hereby granted, provided that the above | ||
7 | * copyright notice and this permission notice appear in all copies. | ||
8 | * | ||
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
16 | */ | ||
17 | |||
18 | #include <ssl_locl.h> | ||
19 | |||
20 | #include "tls13_internal.h" | ||
21 | |||
22 | static ssize_t | ||
23 | tls13_quic_wire_read_cb(void *buf, size_t n, void *arg) | ||
24 | { | ||
25 | struct tls13_ctx *ctx = arg; | ||
26 | SSL *ssl = ctx->ssl; | ||
27 | |||
28 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); | ||
29 | return TLS13_IO_FAILURE; | ||
30 | } | ||
31 | |||
32 | static ssize_t | ||
33 | tls13_quic_wire_write_cb(const void *buf, size_t n, void *arg) | ||
34 | { | ||
35 | struct tls13_ctx *ctx = arg; | ||
36 | SSL *ssl = ctx->ssl; | ||
37 | |||
38 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); | ||
39 | return TLS13_IO_FAILURE; | ||
40 | } | ||
41 | |||
42 | static ssize_t | ||
43 | tls13_quic_wire_flush_cb(void *arg) | ||
44 | { | ||
45 | struct tls13_ctx *ctx = arg; | ||
46 | SSL *ssl = ctx->ssl; | ||
47 | |||
48 | /* XXX - call flush_flight. */ | ||
49 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); | ||
50 | return TLS13_IO_FAILURE; | ||
51 | } | ||
52 | |||
53 | static ssize_t | ||
54 | tls13_quic_handshake_read_cb(void *buf, size_t n, void *arg) | ||
55 | { | ||
56 | /* XXX - read handshake data. */ | ||
57 | return TLS13_IO_FAILURE; | ||
58 | } | ||
59 | |||
60 | static ssize_t | ||
61 | tls13_quic_handshake_write_cb(const void *buf, size_t n, void *arg) | ||
62 | { | ||
63 | struct tls13_ctx *ctx = arg; | ||
64 | SSL *ssl = ctx->ssl; | ||
65 | |||
66 | /* XXX - call add_handshake_data. */ | ||
67 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); | ||
68 | return TLS13_IO_FAILURE; | ||
69 | } | ||
70 | |||
71 | static int | ||
72 | tls13_quic_set_read_traffic_key(struct tls13_secret *read_key, | ||
73 | enum ssl_encryption_level_t read_level, void *arg) | ||
74 | { | ||
75 | struct tls13_ctx *ctx = arg; | ||
76 | SSL *ssl = ctx->ssl; | ||
77 | |||
78 | ctx->hs->tls13.quic_read_level = read_level; | ||
79 | |||
80 | /* XXX - call set_read_secret. */ | ||
81 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); | ||
82 | return 0; | ||
83 | } | ||
84 | |||
85 | static int | ||
86 | tls13_quic_set_write_traffic_key(struct tls13_secret *write_key, | ||
87 | enum ssl_encryption_level_t write_level, void *arg) | ||
88 | { | ||
89 | struct tls13_ctx *ctx = arg; | ||
90 | SSL *ssl = ctx->ssl; | ||
91 | |||
92 | ctx->hs->tls13.quic_write_level = write_level; | ||
93 | |||
94 | /* XXX - call set_write_secret. */ | ||
95 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); | ||
96 | return 0; | ||
97 | } | ||
98 | |||
99 | static int | ||
100 | tls13_quic_alert_send_cb(int alert_desc, void *arg) | ||
101 | { | ||
102 | struct tls13_ctx *ctx = arg; | ||
103 | SSL *ssl = ctx->ssl; | ||
104 | |||
105 | /* XXX - call send_alert. */ | ||
106 | SSLerror(ssl, ERR_R_INTERNAL_ERROR); | ||
107 | return TLS13_IO_FAILURE; | ||
108 | } | ||
109 | |||
110 | static const struct tls13_record_layer_callbacks quic_rl_callbacks = { | ||
111 | .wire_read = tls13_quic_wire_read_cb, | ||
112 | .wire_write = tls13_quic_wire_write_cb, | ||
113 | .wire_flush = tls13_quic_wire_flush_cb, | ||
114 | |||
115 | .handshake_read = tls13_quic_handshake_read_cb, | ||
116 | .handshake_write = tls13_quic_handshake_write_cb, | ||
117 | .set_read_traffic_key = tls13_quic_set_read_traffic_key, | ||
118 | .set_write_traffic_key = tls13_quic_set_write_traffic_key, | ||
119 | .alert_send = tls13_quic_alert_send_cb, | ||
120 | |||
121 | .alert_recv = tls13_alert_received_cb, | ||
122 | .alert_sent = tls13_alert_sent_cb, | ||
123 | .phh_recv = tls13_phh_received_cb, | ||
124 | .phh_sent = tls13_phh_done_cb, | ||
125 | }; | ||
126 | |||
127 | int | ||
128 | tls13_quic_init(struct tls13_ctx *ctx) | ||
129 | { | ||
130 | tls13_record_layer_set_callbacks(ctx->rl, &quic_rl_callbacks, ctx); | ||
131 | |||
132 | ctx->middlebox_compat = 0; | ||
133 | |||
134 | return 1; | ||
135 | } | ||
diff --git a/src/lib/libssl/tls13_record_layer.c b/src/lib/libssl/tls13_record_layer.c index c92fd8d193..ac5b83bd34 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.69 2022/07/24 14:16:29 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_record_layer.c,v 1.70 2022/07/24 14:28:16 jsing 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 | * |
@@ -146,8 +146,8 @@ tls13_record_layer_new(const struct tls13_record_layer_callbacks *callbacks, | |||
146 | goto err; | 146 | goto err; |
147 | 147 | ||
148 | rl->legacy_version = TLS1_2_VERSION; | 148 | rl->legacy_version = TLS1_2_VERSION; |
149 | rl->cb = *callbacks; | 149 | |
150 | rl->cb_arg = cb_arg; | 150 | tls13_record_layer_set_callbacks(rl, callbacks, cb_arg); |
151 | 151 | ||
152 | return rl; | 152 | return rl; |
153 | 153 | ||
@@ -178,6 +178,14 @@ tls13_record_layer_free(struct tls13_record_layer *rl) | |||
178 | } | 178 | } |
179 | 179 | ||
180 | void | 180 | void |
181 | tls13_record_layer_set_callbacks(struct tls13_record_layer *rl, | ||
182 | const struct tls13_record_layer_callbacks *callbacks, void *cb_arg) | ||
183 | { | ||
184 | rl->cb = *callbacks; | ||
185 | rl->cb_arg = cb_arg; | ||
186 | } | ||
187 | |||
188 | void | ||
181 | tls13_record_layer_rcontent(struct tls13_record_layer *rl, CBS *cbs) | 189 | tls13_record_layer_rcontent(struct tls13_record_layer *rl, CBS *cbs) |
182 | { | 190 | { |
183 | CBS_dup(tls_content_cbs(rl->rcontent), cbs); | 191 | CBS_dup(tls_content_cbs(rl->rcontent), cbs); |
@@ -489,6 +497,10 @@ int | |||
489 | tls13_record_layer_set_read_traffic_key(struct tls13_record_layer *rl, | 497 | tls13_record_layer_set_read_traffic_key(struct tls13_record_layer *rl, |
490 | struct tls13_secret *read_key, enum ssl_encryption_level_t read_level) | 498 | struct tls13_secret *read_key, enum ssl_encryption_level_t read_level) |
491 | { | 499 | { |
500 | if (rl->cb.set_read_traffic_key != NULL) | ||
501 | return rl->cb.set_read_traffic_key(read_key, read_level, | ||
502 | rl->cb_arg); | ||
503 | |||
492 | return tls13_record_layer_set_traffic_key(rl->aead, rl->hash, | 504 | return tls13_record_layer_set_traffic_key(rl->aead, rl->hash, |
493 | rl->read, read_key); | 505 | rl->read, read_key); |
494 | } | 506 | } |
@@ -497,6 +509,10 @@ int | |||
497 | tls13_record_layer_set_write_traffic_key(struct tls13_record_layer *rl, | 509 | tls13_record_layer_set_write_traffic_key(struct tls13_record_layer *rl, |
498 | struct tls13_secret *write_key, enum ssl_encryption_level_t write_level) | 510 | struct tls13_secret *write_key, enum ssl_encryption_level_t write_level) |
499 | { | 511 | { |
512 | if (rl->cb.set_write_traffic_key != NULL) | ||
513 | return rl->cb.set_write_traffic_key(write_key, write_level, | ||
514 | rl->cb_arg); | ||
515 | |||
500 | return tls13_record_layer_set_traffic_key(rl->aead, rl->hash, | 516 | return tls13_record_layer_set_traffic_key(rl->aead, rl->hash, |
501 | rl->write, write_key); | 517 | rl->write, write_key); |
502 | } | 518 | } |
@@ -1128,6 +1144,9 @@ tls13_send_dummy_ccs(struct tls13_record_layer *rl) | |||
1128 | ssize_t | 1144 | ssize_t |
1129 | tls13_read_handshake_data(struct tls13_record_layer *rl, uint8_t *buf, size_t n) | 1145 | tls13_read_handshake_data(struct tls13_record_layer *rl, uint8_t *buf, size_t n) |
1130 | { | 1146 | { |
1147 | if (rl->cb.handshake_read != NULL) | ||
1148 | return rl->cb.handshake_read(buf, n, rl->cb_arg); | ||
1149 | |||
1131 | return tls13_record_layer_read(rl, SSL3_RT_HANDSHAKE, buf, n); | 1150 | return tls13_record_layer_read(rl, SSL3_RT_HANDSHAKE, buf, n); |
1132 | } | 1151 | } |
1133 | 1152 | ||
@@ -1135,6 +1154,9 @@ ssize_t | |||
1135 | tls13_write_handshake_data(struct tls13_record_layer *rl, const uint8_t *buf, | 1154 | tls13_write_handshake_data(struct tls13_record_layer *rl, const uint8_t *buf, |
1136 | size_t n) | 1155 | size_t n) |
1137 | { | 1156 | { |
1157 | if (rl->cb.handshake_write != NULL) | ||
1158 | return rl->cb.handshake_write(buf, n, rl->cb_arg); | ||
1159 | |||
1138 | return tls13_record_layer_write(rl, SSL3_RT_HANDSHAKE, buf, n); | 1160 | return tls13_record_layer_write(rl, SSL3_RT_HANDSHAKE, buf, n); |
1139 | } | 1161 | } |
1140 | 1162 | ||
@@ -1181,6 +1203,9 @@ tls13_send_alert(struct tls13_record_layer *rl, uint8_t alert_desc) | |||
1181 | uint8_t alert_level = TLS13_ALERT_LEVEL_FATAL; | 1203 | uint8_t alert_level = TLS13_ALERT_LEVEL_FATAL; |
1182 | ssize_t ret; | 1204 | ssize_t ret; |
1183 | 1205 | ||
1206 | if (rl->cb.alert_send != NULL) | ||
1207 | return rl->cb.alert_send(alert_desc, rl->cb_arg); | ||
1208 | |||
1184 | if (alert_desc == TLS13_ALERT_CLOSE_NOTIFY || | 1209 | if (alert_desc == TLS13_ALERT_CLOSE_NOTIFY || |
1185 | alert_desc == TLS13_ALERT_USER_CANCELED) | 1210 | alert_desc == TLS13_ALERT_USER_CANCELED) |
1186 | alert_level = TLS13_ALERT_LEVEL_WARNING; | 1211 | alert_level = TLS13_ALERT_LEVEL_WARNING; |
diff --git a/src/lib/libssl/tls_internal.h b/src/lib/libssl/tls_internal.h index 88dae9e67e..1d3a8133cd 100644 --- a/src/lib/libssl/tls_internal.h +++ b/src/lib/libssl/tls_internal.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls_internal.h,v 1.8 2022/07/22 19:33:53 jsing Exp $ */ | 1 | /* $OpenBSD: tls_internal.h,v 1.9 2022/07/24 14:28:16 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018, 2019, 2021 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019, 2021 Joel Sing <jsing@openbsd.org> |
4 | * | 4 | * |
@@ -33,6 +33,10 @@ __BEGIN_HIDDEN_DECLS | |||
33 | #define TLS_IO_WANT_POLLOUT -4 | 33 | #define TLS_IO_WANT_POLLOUT -4 |
34 | #define TLS_IO_WANT_RETRY -5 /* Retry the previous call immediately. */ | 34 | #define TLS_IO_WANT_RETRY -5 /* Retry the previous call immediately. */ |
35 | 35 | ||
36 | enum ssl_encryption_level_t; | ||
37 | |||
38 | struct tls13_secret; | ||
39 | |||
36 | /* | 40 | /* |
37 | * Callbacks. | 41 | * Callbacks. |
38 | */ | 42 | */ |
@@ -41,6 +45,14 @@ typedef ssize_t (*tls_write_cb)(const void *_buf, size_t _buflen, | |||
41 | void *_cb_arg); | 45 | void *_cb_arg); |
42 | typedef ssize_t (*tls_flush_cb)(void *_cb_arg); | 46 | typedef ssize_t (*tls_flush_cb)(void *_cb_arg); |
43 | 47 | ||
48 | typedef ssize_t (*tls_handshake_read_cb)(void *_buf, size_t _buflen, | ||
49 | void *_cb_arg); | ||
50 | typedef ssize_t (*tls_handshake_write_cb)(const void *_buf, size_t _buflen, | ||
51 | void *_cb_arg); | ||
52 | typedef int (*tls_traffic_key_cb)(struct tls13_secret *key, | ||
53 | enum ssl_encryption_level_t level, void *_cb_arg); | ||
54 | typedef int (*tls_alert_send_cb)(int _alert_desc, void *_cb_arg); | ||
55 | |||
44 | /* | 56 | /* |
45 | * Buffers. | 57 | * Buffers. |
46 | */ | 58 | */ |