diff options
author | jsing <> | 2024-03-25 04:02:29 +0000 |
---|---|---|
committer | jsing <> | 2024-03-25 04:02:29 +0000 |
commit | 25f98fdba90cdf11d4f236efa8bebbe491a4a276 (patch) | |
tree | 4d2a0bc49b5186177186bc3b090cba1d5ffeccfe | |
parent | 6c7df18da074bcefc29113218417b2749fca4fc0 (diff) | |
download | openbsd-25f98fdba90cdf11d4f236efa8bebbe491a4a276.tar.gz openbsd-25f98fdba90cdf11d4f236efa8bebbe491a4a276.tar.bz2 openbsd-25f98fdba90cdf11d4f236efa8bebbe491a4a276.zip |
Split TLS extension parsing from processing.
The TLS extension parsing and processing order is currently dependent on
the order of the extensions in the handshake message. This means that the
processing order (and callback order) is not under our control. Split the
parsing from the processing such that the processing (and callbacks) are
run in a defined order.
Convert ALPN to the new model - other extensions will be split into
separate parse/process in following diffs.
ok beck@ tb@
-rw-r--r-- | src/lib/libssl/ssl_tlsext.c | 245 |
1 files changed, 190 insertions, 55 deletions
diff --git a/src/lib/libssl/ssl_tlsext.c b/src/lib/libssl/ssl_tlsext.c index 7b8164352a..f278aca9df 100644 --- a/src/lib/libssl/ssl_tlsext.c +++ b/src/lib/libssl/ssl_tlsext.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_tlsext.c,v 1.138 2024/03/25 03:23:59 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_tlsext.c,v 1.139 2024/03/25 04:02:29 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2016, 2017, 2019 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> | 4 | * Copyright (c) 2017 Doug Hogan <doug@openbsd.org> |
@@ -34,6 +34,22 @@ | |||
34 | 34 | ||
35 | #define TLSEXT_TYPE_alpn TLSEXT_TYPE_application_layer_protocol_negotiation | 35 | #define TLSEXT_TYPE_alpn TLSEXT_TYPE_application_layer_protocol_negotiation |
36 | 36 | ||
37 | struct tlsext_data { | ||
38 | CBS alpn; | ||
39 | }; | ||
40 | |||
41 | static struct tlsext_data * | ||
42 | tlsext_data_new(void) | ||
43 | { | ||
44 | return calloc(1, sizeof(struct tlsext_data)); | ||
45 | } | ||
46 | |||
47 | static void | ||
48 | tlsext_data_free(struct tlsext_data *td) | ||
49 | { | ||
50 | freezero(td, sizeof(*td)); | ||
51 | } | ||
52 | |||
37 | /* | 53 | /* |
38 | * Supported Application-Layer Protocol Negotiation - RFC 7301 | 54 | * Supported Application-Layer Protocol Negotiation - RFC 7301 |
39 | */ | 55 | */ |
@@ -86,19 +102,33 @@ tlsext_alpn_check_format(CBS *cbs) | |||
86 | } | 102 | } |
87 | 103 | ||
88 | static int | 104 | static int |
89 | tlsext_alpn_server_parse(SSL *s, uint16_t msg_types, CBS *cbs, int *alert) | 105 | tlsext_alpn_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_types, |
106 | CBS *cbs, int *alert) | ||
90 | { | 107 | { |
91 | CBS alpn, selected_cbs; | 108 | CBS alpn; |
92 | const unsigned char *selected; | ||
93 | unsigned char selected_len; | ||
94 | int r; | ||
95 | 109 | ||
96 | if (!CBS_get_u16_length_prefixed(cbs, &alpn)) | 110 | if (!CBS_get_u16_length_prefixed(cbs, &alpn)) |
97 | return 0; | 111 | return 0; |
98 | |||
99 | if (!tlsext_alpn_check_format(&alpn)) | 112 | if (!tlsext_alpn_check_format(&alpn)) |
100 | return 0; | 113 | return 0; |
101 | 114 | ||
115 | CBS_dup(&alpn, &td->alpn); | ||
116 | |||
117 | return 1; | ||
118 | } | ||
119 | |||
120 | static int | ||
121 | tlsext_alpn_server_process(SSL *s, struct tlsext_data *td, uint16_t msg_type, | ||
122 | int *alert) | ||
123 | { | ||
124 | CBS selected_cbs; | ||
125 | const unsigned char *selected; | ||
126 | unsigned char selected_len; | ||
127 | int r; | ||
128 | |||
129 | if (CBS_data(&td->alpn) == NULL) | ||
130 | return 0; | ||
131 | |||
102 | if (s->ctx->alpn_select_cb == NULL) | 132 | if (s->ctx->alpn_select_cb == NULL) |
103 | return 1; | 133 | return 1; |
104 | 134 | ||
@@ -109,7 +139,7 @@ tlsext_alpn_server_parse(SSL *s, uint16_t msg_types, CBS *cbs, int *alert) | |||
109 | * 3. TLSv1.2 and earlier: ensure that SNI has already been processed. | 139 | * 3. TLSv1.2 and earlier: ensure that SNI has already been processed. |
110 | */ | 140 | */ |
111 | r = s->ctx->alpn_select_cb(s, &selected, &selected_len, | 141 | r = s->ctx->alpn_select_cb(s, &selected, &selected_len, |
112 | CBS_data(&alpn), CBS_len(&alpn), | 142 | CBS_data(&td->alpn), CBS_len(&td->alpn), |
113 | s->ctx->alpn_select_cb_arg); | 143 | s->ctx->alpn_select_cb_arg); |
114 | 144 | ||
115 | if (r == SSL_TLSEXT_ERR_OK) { | 145 | if (r == SSL_TLSEXT_ERR_OK) { |
@@ -162,7 +192,8 @@ tlsext_alpn_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
162 | } | 192 | } |
163 | 193 | ||
164 | static int | 194 | static int |
165 | tlsext_alpn_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 195 | tlsext_alpn_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
196 | CBS *cbs, int *alert) | ||
166 | { | 197 | { |
167 | CBS list, proto; | 198 | CBS list, proto; |
168 | 199 | ||
@@ -182,7 +213,18 @@ tlsext_alpn_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | |||
182 | if (CBS_len(&proto) == 0) | 213 | if (CBS_len(&proto) == 0) |
183 | return 0; | 214 | return 0; |
184 | 215 | ||
185 | if (!CBS_stow(&proto, &s->s3->alpn_selected, &s->s3->alpn_selected_len)) | 216 | CBS_dup(&proto, &td->alpn); |
217 | |||
218 | return 1; | ||
219 | } | ||
220 | |||
221 | static int | ||
222 | tlsext_alpn_client_process(SSL *s, struct tlsext_data *td, uint16_t msg_type, | ||
223 | int *alert) | ||
224 | { | ||
225 | if (CBS_data(&td->alpn) == NULL) | ||
226 | return 0; | ||
227 | if (!CBS_stow(&td->alpn, &s->s3->alpn_selected, &s->s3->alpn_selected_len)) | ||
186 | return 0; | 228 | return 0; |
187 | 229 | ||
188 | return 1; | 230 | return 1; |
@@ -229,8 +271,8 @@ tlsext_supportedgroups_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
229 | } | 271 | } |
230 | 272 | ||
231 | static int | 273 | static int |
232 | tlsext_supportedgroups_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, | 274 | tlsext_supportedgroups_server_parse(SSL *s, struct tlsext_data *td, |
233 | int *alert) | 275 | uint16_t msg_type, CBS *cbs, int *alert) |
234 | { | 276 | { |
235 | CBS grouplist; | 277 | CBS grouplist; |
236 | uint16_t *groups; | 278 | uint16_t *groups; |
@@ -302,8 +344,8 @@ tlsext_supportedgroups_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
302 | } | 344 | } |
303 | 345 | ||
304 | static int | 346 | static int |
305 | tlsext_supportedgroups_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, | 347 | tlsext_supportedgroups_client_parse(SSL *s, struct tlsext_data *td, |
306 | int *alert) | 348 | uint16_t msg_type, CBS *cbs, int *alert) |
307 | { | 349 | { |
308 | /* | 350 | /* |
309 | * Servers should not send this extension per the RFC. | 351 | * Servers should not send this extension per the RFC. |
@@ -351,7 +393,8 @@ tlsext_ecpf_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
351 | } | 393 | } |
352 | 394 | ||
353 | static int | 395 | static int |
354 | tlsext_ecpf_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 396 | tlsext_ecpf_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, CBS *cbs, |
397 | int *alert) | ||
355 | { | 398 | { |
356 | CBS ecpf; | 399 | CBS ecpf; |
357 | 400 | ||
@@ -391,9 +434,10 @@ tlsext_ecpf_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
391 | } | 434 | } |
392 | 435 | ||
393 | static int | 436 | static int |
394 | tlsext_ecpf_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 437 | tlsext_ecpf_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
438 | CBS *cbs, int *alert) | ||
395 | { | 439 | { |
396 | return tlsext_ecpf_parse(s, msg_type, cbs, alert); | 440 | return tlsext_ecpf_parse(s, td, msg_type, cbs, alert); |
397 | } | 441 | } |
398 | 442 | ||
399 | static int | 443 | static int |
@@ -409,9 +453,10 @@ tlsext_ecpf_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
409 | } | 453 | } |
410 | 454 | ||
411 | static int | 455 | static int |
412 | tlsext_ecpf_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 456 | tlsext_ecpf_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
457 | CBS *cbs, int *alert) | ||
413 | { | 458 | { |
414 | return tlsext_ecpf_parse(s, msg_type, cbs, alert); | 459 | return tlsext_ecpf_parse(s, td, msg_type, cbs, alert); |
415 | } | 460 | } |
416 | 461 | ||
417 | /* | 462 | /* |
@@ -440,7 +485,8 @@ tlsext_ri_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
440 | } | 485 | } |
441 | 486 | ||
442 | static int | 487 | static int |
443 | tlsext_ri_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 488 | tlsext_ri_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
489 | CBS *cbs, int *alert) | ||
444 | { | 490 | { |
445 | CBS reneg; | 491 | CBS reneg; |
446 | 492 | ||
@@ -489,7 +535,8 @@ tlsext_ri_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
489 | } | 535 | } |
490 | 536 | ||
491 | static int | 537 | static int |
492 | tlsext_ri_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 538 | tlsext_ri_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
539 | CBS *cbs, int *alert) | ||
493 | { | 540 | { |
494 | CBS reneg, prev_client, prev_server; | 541 | CBS reneg, prev_client, prev_server; |
495 | 542 | ||
@@ -572,7 +619,8 @@ tlsext_sigalgs_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
572 | } | 619 | } |
573 | 620 | ||
574 | static int | 621 | static int |
575 | tlsext_sigalgs_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 622 | tlsext_sigalgs_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
623 | CBS *cbs, int *alert) | ||
576 | { | 624 | { |
577 | CBS sigalgs; | 625 | CBS sigalgs; |
578 | 626 | ||
@@ -609,7 +657,8 @@ tlsext_sigalgs_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
609 | } | 657 | } |
610 | 658 | ||
611 | static int | 659 | static int |
612 | tlsext_sigalgs_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 660 | tlsext_sigalgs_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
661 | CBS *cbs, int *alert) | ||
613 | { | 662 | { |
614 | CBS sigalgs; | 663 | CBS sigalgs; |
615 | 664 | ||
@@ -736,7 +785,8 @@ tlsext_sni_is_valid_hostname(CBS *cbs, int *is_ip) | |||
736 | } | 785 | } |
737 | 786 | ||
738 | static int | 787 | static int |
739 | tlsext_sni_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 788 | tlsext_sni_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
789 | CBS *cbs, int *alert) | ||
740 | { | 790 | { |
741 | CBS server_name_list, host_name; | 791 | CBS server_name_list, host_name; |
742 | uint8_t name_type; | 792 | uint8_t name_type; |
@@ -832,7 +882,8 @@ tlsext_sni_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
832 | } | 882 | } |
833 | 883 | ||
834 | static int | 884 | static int |
835 | tlsext_sni_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 885 | tlsext_sni_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
886 | CBS *cbs, int *alert) | ||
836 | { | 887 | { |
837 | if (s->tlsext_hostname == NULL || CBS_len(cbs) != 0) { | 888 | if (s->tlsext_hostname == NULL || CBS_len(cbs) != 0) { |
838 | *alert = SSL_AD_UNRECOGNIZED_NAME; | 889 | *alert = SSL_AD_UNRECOGNIZED_NAME; |
@@ -920,7 +971,8 @@ tlsext_ocsp_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
920 | } | 971 | } |
921 | 972 | ||
922 | static int | 973 | static int |
923 | tlsext_ocsp_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 974 | tlsext_ocsp_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
975 | CBS *cbs, int *alert) | ||
924 | { | 976 | { |
925 | int alert_desc = SSL_AD_DECODE_ERROR; | 977 | int alert_desc = SSL_AD_DECODE_ERROR; |
926 | CBS respid_list, respid, exts; | 978 | CBS respid_list, respid, exts; |
@@ -1028,7 +1080,8 @@ tlsext_ocsp_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1028 | } | 1080 | } |
1029 | 1081 | ||
1030 | static int | 1082 | static int |
1031 | tlsext_ocsp_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1083 | tlsext_ocsp_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1084 | CBS *cbs, int *alert) | ||
1032 | { | 1085 | { |
1033 | uint8_t status_type; | 1086 | uint8_t status_type; |
1034 | CBS response; | 1087 | CBS response; |
@@ -1148,8 +1201,8 @@ tlsext_sessionticket_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1148 | } | 1201 | } |
1149 | 1202 | ||
1150 | static int | 1203 | static int |
1151 | tlsext_sessionticket_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, | 1204 | tlsext_sessionticket_server_parse(SSL *s, struct tlsext_data *td, |
1152 | int *alert) | 1205 | uint16_t msg_type, CBS *cbs, int *alert) |
1153 | { | 1206 | { |
1154 | if (s->tls_session_ticket_ext_cb) { | 1207 | if (s->tls_session_ticket_ext_cb) { |
1155 | if (!s->tls_session_ticket_ext_cb(s, CBS_data(cbs), | 1208 | if (!s->tls_session_ticket_ext_cb(s, CBS_data(cbs), |
@@ -1185,8 +1238,8 @@ tlsext_sessionticket_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1185 | } | 1238 | } |
1186 | 1239 | ||
1187 | static int | 1240 | static int |
1188 | tlsext_sessionticket_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, | 1241 | tlsext_sessionticket_client_parse(SSL *s, struct tlsext_data *td, |
1189 | int *alert) | 1242 | uint16_t msg_type, CBS *cbs, int *alert) |
1190 | { | 1243 | { |
1191 | if (s->tls_session_ticket_ext_cb) { | 1244 | if (s->tls_session_ticket_ext_cb) { |
1192 | if (!s->tls_session_ticket_ext_cb(s, CBS_data(cbs), | 1245 | if (!s->tls_session_ticket_ext_cb(s, CBS_data(cbs), |
@@ -1257,7 +1310,8 @@ tlsext_srtp_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1257 | } | 1310 | } |
1258 | 1311 | ||
1259 | static int | 1312 | static int |
1260 | tlsext_srtp_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1313 | tlsext_srtp_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1314 | CBS *cbs, int *alert) | ||
1261 | { | 1315 | { |
1262 | const SRTP_PROTECTION_PROFILE *cprof, *sprof; | 1316 | const SRTP_PROTECTION_PROFILE *cprof, *sprof; |
1263 | STACK_OF(SRTP_PROTECTION_PROFILE) *clnt = NULL, *srvr; | 1317 | STACK_OF(SRTP_PROTECTION_PROFILE) *clnt = NULL, *srvr; |
@@ -1362,7 +1416,8 @@ tlsext_srtp_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1362 | } | 1416 | } |
1363 | 1417 | ||
1364 | static int | 1418 | static int |
1365 | tlsext_srtp_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1419 | tlsext_srtp_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1420 | CBS *cbs, int *alert) | ||
1366 | { | 1421 | { |
1367 | STACK_OF(SRTP_PROTECTION_PROFILE) *clnt; | 1422 | STACK_OF(SRTP_PROTECTION_PROFILE) *clnt; |
1368 | const SRTP_PROTECTION_PROFILE *prof; | 1423 | const SRTP_PROTECTION_PROFILE *prof; |
@@ -1443,7 +1498,8 @@ tlsext_keyshare_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1443 | } | 1498 | } |
1444 | 1499 | ||
1445 | static int | 1500 | static int |
1446 | tlsext_keyshare_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1501 | tlsext_keyshare_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1502 | CBS *cbs, int *alert) | ||
1447 | { | 1503 | { |
1448 | CBS client_shares, key_exchange; | 1504 | CBS client_shares, key_exchange; |
1449 | int decode_error; | 1505 | int decode_error; |
@@ -1530,7 +1586,8 @@ tlsext_keyshare_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1530 | } | 1586 | } |
1531 | 1587 | ||
1532 | static int | 1588 | static int |
1533 | tlsext_keyshare_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1589 | tlsext_keyshare_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1590 | CBS *cbs, int *alert) | ||
1534 | { | 1591 | { |
1535 | CBS key_exchange; | 1592 | CBS key_exchange; |
1536 | int decode_error; | 1593 | int decode_error; |
@@ -1605,7 +1662,8 @@ tlsext_versions_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1605 | } | 1662 | } |
1606 | 1663 | ||
1607 | static int | 1664 | static int |
1608 | tlsext_versions_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1665 | tlsext_versions_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1666 | CBS *cbs, int *alert) | ||
1609 | { | 1667 | { |
1610 | CBS versions; | 1668 | CBS versions; |
1611 | uint16_t version; | 1669 | uint16_t version; |
@@ -1652,7 +1710,8 @@ tlsext_versions_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1652 | } | 1710 | } |
1653 | 1711 | ||
1654 | static int | 1712 | static int |
1655 | tlsext_versions_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1713 | tlsext_versions_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1714 | CBS *cbs, int *alert) | ||
1656 | { | 1715 | { |
1657 | uint16_t selected_version; | 1716 | uint16_t selected_version; |
1658 | 1717 | ||
@@ -1702,7 +1761,8 @@ tlsext_cookie_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1702 | } | 1761 | } |
1703 | 1762 | ||
1704 | static int | 1763 | static int |
1705 | tlsext_cookie_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1764 | tlsext_cookie_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1765 | CBS *cbs, int *alert) | ||
1706 | { | 1766 | { |
1707 | CBS cookie; | 1767 | CBS cookie; |
1708 | 1768 | ||
@@ -1759,7 +1819,8 @@ tlsext_cookie_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1759 | } | 1819 | } |
1760 | 1820 | ||
1761 | static int | 1821 | static int |
1762 | tlsext_cookie_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1822 | tlsext_cookie_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1823 | CBS *cbs, int *alert) | ||
1763 | { | 1824 | { |
1764 | CBS cookie; | 1825 | CBS cookie; |
1765 | 1826 | ||
@@ -1814,8 +1875,8 @@ tlsext_psk_kex_modes_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1814 | } | 1875 | } |
1815 | 1876 | ||
1816 | static int | 1877 | static int |
1817 | tlsext_psk_kex_modes_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, | 1878 | tlsext_psk_kex_modes_server_parse(SSL *s, struct tlsext_data *td, |
1818 | int *alert) | 1879 | uint16_t msg_type, CBS *cbs, int *alert) |
1819 | { | 1880 | { |
1820 | CBS ke_modes; | 1881 | CBS ke_modes; |
1821 | uint8_t ke_mode; | 1882 | uint8_t ke_mode; |
@@ -1848,8 +1909,8 @@ tlsext_psk_kex_modes_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1848 | } | 1909 | } |
1849 | 1910 | ||
1850 | static int | 1911 | static int |
1851 | tlsext_psk_kex_modes_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, | 1912 | tlsext_psk_kex_modes_client_parse(SSL *s, struct tlsext_data *td, |
1852 | int *alert) | 1913 | uint16_t msg_type, CBS *cbs, int *alert) |
1853 | { | 1914 | { |
1854 | return 0; | 1915 | return 0; |
1855 | } | 1916 | } |
@@ -1871,7 +1932,8 @@ tlsext_psk_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1871 | } | 1932 | } |
1872 | 1933 | ||
1873 | static int | 1934 | static int |
1874 | tlsext_psk_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1935 | tlsext_psk_client_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1936 | CBS *cbs, int *alert) | ||
1875 | { | 1937 | { |
1876 | return CBS_skip(cbs, CBS_len(cbs)); | 1938 | return CBS_skip(cbs, CBS_len(cbs)); |
1877 | } | 1939 | } |
@@ -1889,7 +1951,8 @@ tlsext_psk_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
1889 | } | 1951 | } |
1890 | 1952 | ||
1891 | static int | 1953 | static int |
1892 | tlsext_psk_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 1954 | tlsext_psk_server_parse(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
1955 | CBS *cbs, int *alert) | ||
1893 | { | 1956 | { |
1894 | return CBS_skip(cbs, CBS_len(cbs)); | 1957 | return CBS_skip(cbs, CBS_len(cbs)); |
1895 | } | 1958 | } |
@@ -1916,8 +1979,8 @@ tlsext_quic_transport_parameters_client_build(SSL *s, uint16_t msg_type, | |||
1916 | } | 1979 | } |
1917 | 1980 | ||
1918 | static int | 1981 | static int |
1919 | tlsext_quic_transport_parameters_client_parse(SSL *s, uint16_t msg_type, | 1982 | tlsext_quic_transport_parameters_client_parse(SSL *s, struct tlsext_data *td, |
1920 | CBS *cbs, int *alert) | 1983 | uint16_t msg_type, CBS *cbs, int *alert) |
1921 | { | 1984 | { |
1922 | if (!SSL_is_quic(s)) { | 1985 | if (!SSL_is_quic(s)) { |
1923 | *alert = SSL_AD_UNSUPPORTED_EXTENSION; | 1986 | *alert = SSL_AD_UNSUPPORTED_EXTENSION; |
@@ -1951,8 +2014,8 @@ tlsext_quic_transport_parameters_server_build(SSL *s, uint16_t msg_type, | |||
1951 | } | 2014 | } |
1952 | 2015 | ||
1953 | static int | 2016 | static int |
1954 | tlsext_quic_transport_parameters_server_parse(SSL *s, uint16_t msg_type, | 2017 | tlsext_quic_transport_parameters_server_parse(SSL *s, struct tlsext_data *td, |
1955 | CBS *cbs, int *alert) | 2018 | uint16_t msg_type, CBS *cbs, int *alert) |
1956 | { | 2019 | { |
1957 | if (!SSL_is_quic(s)) { | 2020 | if (!SSL_is_quic(s)) { |
1958 | *alert = SSL_AD_UNSUPPORTED_EXTENSION; | 2021 | *alert = SSL_AD_UNSUPPORTED_EXTENSION; |
@@ -1971,7 +2034,10 @@ tlsext_quic_transport_parameters_server_parse(SSL *s, uint16_t msg_type, | |||
1971 | struct tls_extension_funcs { | 2034 | struct tls_extension_funcs { |
1972 | int (*needs)(SSL *s, uint16_t msg_type); | 2035 | int (*needs)(SSL *s, uint16_t msg_type); |
1973 | int (*build)(SSL *s, uint16_t msg_type, CBB *cbb); | 2036 | int (*build)(SSL *s, uint16_t msg_type, CBB *cbb); |
1974 | int (*parse)(SSL *s, uint16_t msg_type, CBS *cbs, int *alert); | 2037 | int (*parse)(SSL *s, struct tlsext_data *td, uint16_t msg_type, |
2038 | CBS *cbs, int *alert); | ||
2039 | int (*process)(SSL *s, struct tlsext_data *td, uint16_t msg_type, | ||
2040 | int *alert); | ||
1975 | }; | 2041 | }; |
1976 | 2042 | ||
1977 | struct tls_extension { | 2043 | struct tls_extension { |
@@ -1981,6 +2047,9 @@ struct tls_extension { | |||
1981 | struct tls_extension_funcs server; | 2047 | struct tls_extension_funcs server; |
1982 | }; | 2048 | }; |
1983 | 2049 | ||
2050 | /* | ||
2051 | * TLS extensions (in processing order). | ||
2052 | */ | ||
1984 | static const struct tls_extension tls_extensions[] = { | 2053 | static const struct tls_extension tls_extensions[] = { |
1985 | { | 2054 | { |
1986 | .type = TLSEXT_TYPE_supported_versions, | 2055 | .type = TLSEXT_TYPE_supported_versions, |
@@ -2118,11 +2187,13 @@ static const struct tls_extension tls_extensions[] = { | |||
2118 | .needs = tlsext_alpn_client_needs, | 2187 | .needs = tlsext_alpn_client_needs, |
2119 | .build = tlsext_alpn_client_build, | 2188 | .build = tlsext_alpn_client_build, |
2120 | .parse = tlsext_alpn_client_parse, | 2189 | .parse = tlsext_alpn_client_parse, |
2190 | .process = tlsext_alpn_client_process, | ||
2121 | }, | 2191 | }, |
2122 | .server = { | 2192 | .server = { |
2123 | .needs = tlsext_alpn_server_needs, | 2193 | .needs = tlsext_alpn_server_needs, |
2124 | .build = tlsext_alpn_server_build, | 2194 | .build = tlsext_alpn_server_build, |
2125 | .parse = tlsext_alpn_server_parse, | 2195 | .parse = tlsext_alpn_server_parse, |
2196 | .process = tlsext_alpn_server_process, | ||
2126 | }, | 2197 | }, |
2127 | }, | 2198 | }, |
2128 | { | 2199 | { |
@@ -2382,7 +2453,7 @@ tlsext_clienthello_hash_extension(SSL *s, uint16_t type, CBS *cbs) | |||
2382 | return 0; | 2453 | return 0; |
2383 | /* | 2454 | /* |
2384 | * key_share data may be changed, and pre_shared_key data may | 2455 | * key_share data may be changed, and pre_shared_key data may |
2385 | * be changed | 2456 | * be changed. |
2386 | */ | 2457 | */ |
2387 | if (type == TLSEXT_TYPE_pre_shared_key || type == TLSEXT_TYPE_key_share) | 2458 | if (type == TLSEXT_TYPE_pre_shared_key || type == TLSEXT_TYPE_key_share) |
2388 | return 1; | 2459 | return 1; |
@@ -2393,7 +2464,8 @@ tlsext_clienthello_hash_extension(SSL *s, uint16_t type, CBS *cbs) | |||
2393 | } | 2464 | } |
2394 | 2465 | ||
2395 | static int | 2466 | static int |
2396 | tlsext_parse(SSL *s, int is_server, uint16_t msg_type, CBS *cbs, int *alert) | 2467 | tlsext_parse(SSL *s, struct tlsext_data *td, int is_server, uint16_t msg_type, |
2468 | CBS *cbs, int *alert) | ||
2397 | { | 2469 | { |
2398 | const struct tls_extension_funcs *ext; | 2470 | const struct tls_extension_funcs *ext; |
2399 | const struct tls_extension *tlsext; | 2471 | const struct tls_extension *tlsext; |
@@ -2452,7 +2524,7 @@ tlsext_parse(SSL *s, int is_server, uint16_t msg_type, CBS *cbs, int *alert) | |||
2452 | s->s3->hs.extensions_seen |= (1 << idx); | 2524 | s->s3->hs.extensions_seen |= (1 << idx); |
2453 | 2525 | ||
2454 | ext = tlsext_funcs(tlsext, is_server); | 2526 | ext = tlsext_funcs(tlsext, is_server); |
2455 | if (!ext->parse(s, msg_type, &extension_data, &alert_desc)) | 2527 | if (!ext->parse(s, td, msg_type, &extension_data, &alert_desc)) |
2456 | goto err; | 2528 | goto err; |
2457 | 2529 | ||
2458 | if (CBS_len(&extension_data) != 0) | 2530 | if (CBS_len(&extension_data) != 0) |
@@ -2467,6 +2539,37 @@ tlsext_parse(SSL *s, int is_server, uint16_t msg_type, CBS *cbs, int *alert) | |||
2467 | return 0; | 2539 | return 0; |
2468 | } | 2540 | } |
2469 | 2541 | ||
2542 | static int | ||
2543 | tlsext_process(SSL *s, struct tlsext_data *td, int is_server, uint16_t msg_type, | ||
2544 | int *alert) | ||
2545 | { | ||
2546 | const struct tls_extension_funcs *ext; | ||
2547 | const struct tls_extension *tlsext; | ||
2548 | int alert_desc; | ||
2549 | size_t idx; | ||
2550 | |||
2551 | alert_desc = SSL_AD_DECODE_ERROR; | ||
2552 | |||
2553 | /* Run processing for present TLS extensions, in a defined order. */ | ||
2554 | for (idx = 0; idx < N_TLS_EXTENSIONS; idx++) { | ||
2555 | tlsext = &tls_extensions[idx]; | ||
2556 | if ((s->s3->hs.extensions_seen & (1 << idx)) == 0) | ||
2557 | continue; | ||
2558 | ext = tlsext_funcs(tlsext, is_server); | ||
2559 | if (ext->process == NULL) | ||
2560 | continue; | ||
2561 | if (!ext->process(s, td, msg_type, &alert_desc)) | ||
2562 | goto err; | ||
2563 | } | ||
2564 | |||
2565 | return 1; | ||
2566 | |||
2567 | err: | ||
2568 | *alert = alert_desc; | ||
2569 | |||
2570 | return 0; | ||
2571 | } | ||
2572 | |||
2470 | static void | 2573 | static void |
2471 | tlsext_server_reset_state(SSL *s) | 2574 | tlsext_server_reset_state(SSL *s) |
2472 | { | 2575 | { |
@@ -2487,11 +2590,27 @@ tlsext_server_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
2487 | int | 2590 | int |
2488 | tlsext_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 2591 | tlsext_server_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) |
2489 | { | 2592 | { |
2593 | struct tlsext_data *td; | ||
2594 | int ret = 0; | ||
2595 | |||
2596 | if ((td = tlsext_data_new()) == NULL) | ||
2597 | goto err; | ||
2598 | |||
2490 | /* XXX - this should be done by the caller... */ | 2599 | /* XXX - this should be done by the caller... */ |
2491 | if (msg_type == SSL_TLSEXT_MSG_CH) | 2600 | if (msg_type == SSL_TLSEXT_MSG_CH) |
2492 | tlsext_server_reset_state(s); | 2601 | tlsext_server_reset_state(s); |
2493 | 2602 | ||
2494 | return tlsext_parse(s, 1, msg_type, cbs, alert); | 2603 | if (!tlsext_parse(s, td, 1, msg_type, cbs, alert)) |
2604 | goto err; | ||
2605 | if (!tlsext_process(s, td, 1, msg_type, alert)) | ||
2606 | goto err; | ||
2607 | |||
2608 | ret = 1; | ||
2609 | |||
2610 | err: | ||
2611 | tlsext_data_free(td); | ||
2612 | |||
2613 | return ret; | ||
2495 | } | 2614 | } |
2496 | 2615 | ||
2497 | static void | 2616 | static void |
@@ -2512,9 +2631,25 @@ tlsext_client_build(SSL *s, uint16_t msg_type, CBB *cbb) | |||
2512 | int | 2631 | int |
2513 | tlsext_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) | 2632 | tlsext_client_parse(SSL *s, uint16_t msg_type, CBS *cbs, int *alert) |
2514 | { | 2633 | { |
2634 | struct tlsext_data *td; | ||
2635 | int ret = 0; | ||
2636 | |||
2637 | if ((td = tlsext_data_new()) == NULL) | ||
2638 | goto err; | ||
2639 | |||
2515 | /* XXX - this should be done by the caller... */ | 2640 | /* XXX - this should be done by the caller... */ |
2516 | if (msg_type == SSL_TLSEXT_MSG_SH) | 2641 | if (msg_type == SSL_TLSEXT_MSG_SH) |
2517 | tlsext_client_reset_state(s); | 2642 | tlsext_client_reset_state(s); |
2518 | 2643 | ||
2519 | return tlsext_parse(s, 0, msg_type, cbs, alert); | 2644 | if (!tlsext_parse(s, td, 0, msg_type, cbs, alert)) |
2645 | goto err; | ||
2646 | if (!tlsext_process(s, td, 0, msg_type, alert)) | ||
2647 | goto err; | ||
2648 | |||
2649 | ret = 1; | ||
2650 | |||
2651 | err: | ||
2652 | tlsext_data_free(td); | ||
2653 | |||
2654 | return ret; | ||
2520 | } | 2655 | } |