1*de0e0e4dSAntonio Huete Jimenez /* $OpenBSD: tls13_server.c,v 1.103 2022/09/17 17:14:06 jsing Exp $ */
2cca6fc52SDaniel Fojt /*
3cca6fc52SDaniel Fojt * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org>
4cca6fc52SDaniel Fojt * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
5cca6fc52SDaniel Fojt *
6cca6fc52SDaniel Fojt * Permission to use, copy, modify, and distribute this software for any
7cca6fc52SDaniel Fojt * purpose with or without fee is hereby granted, provided that the above
8cca6fc52SDaniel Fojt * copyright notice and this permission notice appear in all copies.
9cca6fc52SDaniel Fojt *
10cca6fc52SDaniel Fojt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11cca6fc52SDaniel Fojt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12cca6fc52SDaniel Fojt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13cca6fc52SDaniel Fojt * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14cca6fc52SDaniel Fojt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15cca6fc52SDaniel Fojt * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16cca6fc52SDaniel Fojt * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17cca6fc52SDaniel Fojt */
18cca6fc52SDaniel Fojt
198edacedfSDaniel Fojt #include <openssl/x509v3.h>
208edacedfSDaniel Fojt
21cca6fc52SDaniel Fojt #include "ssl_locl.h"
22*de0e0e4dSAntonio Huete Jimenez #include "ssl_sigalgs.h"
23cca6fc52SDaniel Fojt #include "ssl_tlsext.h"
24cca6fc52SDaniel Fojt #include "tls13_handshake.h"
25cca6fc52SDaniel Fojt #include "tls13_internal.h"
26cca6fc52SDaniel Fojt
27cca6fc52SDaniel Fojt int
tls13_server_init(struct tls13_ctx * ctx)28cca6fc52SDaniel Fojt tls13_server_init(struct tls13_ctx *ctx)
29cca6fc52SDaniel Fojt {
30cca6fc52SDaniel Fojt SSL *s = ctx->ssl;
31cca6fc52SDaniel Fojt
32*de0e0e4dSAntonio Huete Jimenez if (!ssl_supported_tls_version_range(s, &ctx->hs->our_min_tls_version,
33*de0e0e4dSAntonio Huete Jimenez &ctx->hs->our_max_tls_version)) {
34cca6fc52SDaniel Fojt SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE);
35cca6fc52SDaniel Fojt return 0;
36cca6fc52SDaniel Fojt }
37*de0e0e4dSAntonio Huete Jimenez s->version = ctx->hs->our_max_tls_version;
38cca6fc52SDaniel Fojt
398edacedfSDaniel Fojt tls13_record_layer_set_retry_after_phh(ctx->rl,
408edacedfSDaniel Fojt (s->internal->mode & SSL_MODE_AUTO_RETRY) != 0);
418edacedfSDaniel Fojt
428edacedfSDaniel Fojt if (!ssl_get_new_session(s, 0)) /* XXX */
43cca6fc52SDaniel Fojt return 0;
44cca6fc52SDaniel Fojt
458edacedfSDaniel Fojt tls13_record_layer_set_legacy_version(ctx->rl, TLS1_VERSION);
468edacedfSDaniel Fojt
478edacedfSDaniel Fojt if (!tls1_transcript_init(s))
48cca6fc52SDaniel Fojt return 0;
49cca6fc52SDaniel Fojt
50cca6fc52SDaniel Fojt arc4random_buf(s->s3->server_random, SSL3_RANDOM_SIZE);
51cca6fc52SDaniel Fojt
52cca6fc52SDaniel Fojt return 1;
53cca6fc52SDaniel Fojt }
54cca6fc52SDaniel Fojt
55cca6fc52SDaniel Fojt int
tls13_server_accept(struct tls13_ctx * ctx)56cca6fc52SDaniel Fojt tls13_server_accept(struct tls13_ctx *ctx)
57cca6fc52SDaniel Fojt {
58cca6fc52SDaniel Fojt if (ctx->mode != TLS13_HS_SERVER)
59cca6fc52SDaniel Fojt return TLS13_IO_FAILURE;
60cca6fc52SDaniel Fojt
61cca6fc52SDaniel Fojt return tls13_handshake_perform(ctx);
62cca6fc52SDaniel Fojt }
63cca6fc52SDaniel Fojt
64cca6fc52SDaniel Fojt static int
tls13_client_hello_is_legacy(CBS * cbs)65cca6fc52SDaniel Fojt tls13_client_hello_is_legacy(CBS *cbs)
66cca6fc52SDaniel Fojt {
67cca6fc52SDaniel Fojt CBS extensions_block, extensions, extension_data, versions;
68cca6fc52SDaniel Fojt uint16_t version, max_version = 0;
69cca6fc52SDaniel Fojt uint16_t type;
70cca6fc52SDaniel Fojt
71cca6fc52SDaniel Fojt CBS_dup(cbs, &extensions_block);
72cca6fc52SDaniel Fojt
73cca6fc52SDaniel Fojt if (!CBS_get_u16_length_prefixed(&extensions_block, &extensions))
74cca6fc52SDaniel Fojt return 1;
75cca6fc52SDaniel Fojt
76cca6fc52SDaniel Fojt while (CBS_len(&extensions) > 0) {
77cca6fc52SDaniel Fojt if (!CBS_get_u16(&extensions, &type))
78cca6fc52SDaniel Fojt return 1;
79cca6fc52SDaniel Fojt if (!CBS_get_u16_length_prefixed(&extensions, &extension_data))
80cca6fc52SDaniel Fojt return 1;
81cca6fc52SDaniel Fojt
82cca6fc52SDaniel Fojt if (type != TLSEXT_TYPE_supported_versions)
83cca6fc52SDaniel Fojt continue;
84cca6fc52SDaniel Fojt if (!CBS_get_u8_length_prefixed(&extension_data, &versions))
85cca6fc52SDaniel Fojt return 1;
86cca6fc52SDaniel Fojt while (CBS_len(&versions) > 0) {
87cca6fc52SDaniel Fojt if (!CBS_get_u16(&versions, &version))
88cca6fc52SDaniel Fojt return 1;
89cca6fc52SDaniel Fojt if (version >= max_version)
90cca6fc52SDaniel Fojt max_version = version;
91cca6fc52SDaniel Fojt }
92cca6fc52SDaniel Fojt if (CBS_len(&extension_data) != 0)
93cca6fc52SDaniel Fojt return 1;
94cca6fc52SDaniel Fojt }
95cca6fc52SDaniel Fojt
96cca6fc52SDaniel Fojt return (max_version < TLS1_3_VERSION);
97cca6fc52SDaniel Fojt }
98cca6fc52SDaniel Fojt
998edacedfSDaniel Fojt int
tls13_client_hello_required_extensions(struct tls13_ctx * ctx)1008edacedfSDaniel Fojt tls13_client_hello_required_extensions(struct tls13_ctx *ctx)
1018edacedfSDaniel Fojt {
102*de0e0e4dSAntonio Huete Jimenez SSL *s = ctx->ssl;
1038edacedfSDaniel Fojt
1048edacedfSDaniel Fojt /*
1058edacedfSDaniel Fojt * RFC 8446, section 9.2. If the ClientHello has supported_versions
1068edacedfSDaniel Fojt * containing TLSv1.3, presence or absence of some extensions requires
1078edacedfSDaniel Fojt * presence or absence of others.
1088edacedfSDaniel Fojt */
1098edacedfSDaniel Fojt
1108edacedfSDaniel Fojt /*
111*de0e0e4dSAntonio Huete Jimenez * RFC 8446 section 4.2.9 - if we received a pre_shared_key, then we
112*de0e0e4dSAntonio Huete Jimenez * also need psk_key_exchange_modes. Otherwise, section 9.2 specifies
113*de0e0e4dSAntonio Huete Jimenez * that we need both signature_algorithms and supported_groups.
1148edacedfSDaniel Fojt */
115*de0e0e4dSAntonio Huete Jimenez if (tlsext_extension_seen(s, TLSEXT_TYPE_pre_shared_key)) {
116*de0e0e4dSAntonio Huete Jimenez if (!tlsext_extension_seen(s,
117*de0e0e4dSAntonio Huete Jimenez TLSEXT_TYPE_psk_key_exchange_modes))
1188edacedfSDaniel Fojt return 0;
119*de0e0e4dSAntonio Huete Jimenez } else {
120*de0e0e4dSAntonio Huete Jimenez if (!tlsext_extension_seen(s, TLSEXT_TYPE_signature_algorithms))
121*de0e0e4dSAntonio Huete Jimenez return 0;
122*de0e0e4dSAntonio Huete Jimenez if (!tlsext_extension_seen(s, TLSEXT_TYPE_supported_groups))
1238edacedfSDaniel Fojt return 0;
1248edacedfSDaniel Fojt }
1258edacedfSDaniel Fojt
1268edacedfSDaniel Fojt /*
1278edacedfSDaniel Fojt * supported_groups and key_share must either both be present or
1288edacedfSDaniel Fojt * both be absent.
1298edacedfSDaniel Fojt */
130*de0e0e4dSAntonio Huete Jimenez if (tlsext_extension_seen(s, TLSEXT_TYPE_supported_groups) !=
131*de0e0e4dSAntonio Huete Jimenez tlsext_extension_seen(s, TLSEXT_TYPE_key_share))
1328edacedfSDaniel Fojt return 0;
1338edacedfSDaniel Fojt
1348edacedfSDaniel Fojt /*
1358edacedfSDaniel Fojt * XXX - Require server_name from client? If so, we SHOULD enforce
1368edacedfSDaniel Fojt * this here - RFC 8446, 9.2.
1378edacedfSDaniel Fojt */
1388edacedfSDaniel Fojt
1398edacedfSDaniel Fojt return 1;
1408edacedfSDaniel Fojt }
1418edacedfSDaniel Fojt
1428edacedfSDaniel Fojt static const uint8_t tls13_compression_null_only[] = { 0 };
1438edacedfSDaniel Fojt
144cca6fc52SDaniel Fojt static int
tls13_client_hello_process(struct tls13_ctx * ctx,CBS * cbs)145cca6fc52SDaniel Fojt tls13_client_hello_process(struct tls13_ctx *ctx, CBS *cbs)
146cca6fc52SDaniel Fojt {
147cca6fc52SDaniel Fojt CBS cipher_suites, client_random, compression_methods, session_id;
148cca6fc52SDaniel Fojt STACK_OF(SSL_CIPHER) *ciphers = NULL;
149cca6fc52SDaniel Fojt const SSL_CIPHER *cipher;
150cca6fc52SDaniel Fojt uint16_t legacy_version;
1518edacedfSDaniel Fojt int alert_desc;
152cca6fc52SDaniel Fojt SSL *s = ctx->ssl;
153cca6fc52SDaniel Fojt int ret = 0;
154cca6fc52SDaniel Fojt
155cca6fc52SDaniel Fojt if (!CBS_get_u16(cbs, &legacy_version))
156cca6fc52SDaniel Fojt goto err;
157cca6fc52SDaniel Fojt if (!CBS_get_bytes(cbs, &client_random, SSL3_RANDOM_SIZE))
158cca6fc52SDaniel Fojt goto err;
159cca6fc52SDaniel Fojt if (!CBS_get_u8_length_prefixed(cbs, &session_id))
160cca6fc52SDaniel Fojt goto err;
161cca6fc52SDaniel Fojt if (!CBS_get_u16_length_prefixed(cbs, &cipher_suites))
162cca6fc52SDaniel Fojt goto err;
163cca6fc52SDaniel Fojt if (!CBS_get_u8_length_prefixed(cbs, &compression_methods))
164cca6fc52SDaniel Fojt goto err;
165cca6fc52SDaniel Fojt
1668edacedfSDaniel Fojt if (tls13_client_hello_is_legacy(cbs) || s->version < TLS1_3_VERSION) {
167cca6fc52SDaniel Fojt if (!CBS_skip(cbs, CBS_len(cbs)))
168cca6fc52SDaniel Fojt goto err;
169cca6fc52SDaniel Fojt return tls13_use_legacy_server(ctx);
170cca6fc52SDaniel Fojt }
171*de0e0e4dSAntonio Huete Jimenez ctx->hs->negotiated_tls_version = TLS1_3_VERSION;
172*de0e0e4dSAntonio Huete Jimenez ctx->hs->peer_legacy_version = legacy_version;
173*de0e0e4dSAntonio Huete Jimenez
174*de0e0e4dSAntonio Huete Jimenez /* Ensure we send subsequent alerts with the correct record version. */
175*de0e0e4dSAntonio Huete Jimenez tls13_record_layer_set_legacy_version(ctx->rl, TLS1_2_VERSION);
176*de0e0e4dSAntonio Huete Jimenez
177*de0e0e4dSAntonio Huete Jimenez /*
178*de0e0e4dSAntonio Huete Jimenez * Ensure that the client has not requested middlebox compatibility mode
179*de0e0e4dSAntonio Huete Jimenez * if it is prohibited from doing so.
180*de0e0e4dSAntonio Huete Jimenez */
181*de0e0e4dSAntonio Huete Jimenez if (!ctx->middlebox_compat && CBS_len(&session_id) != 0) {
182*de0e0e4dSAntonio Huete Jimenez ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
183*de0e0e4dSAntonio Huete Jimenez goto err;
184*de0e0e4dSAntonio Huete Jimenez }
185cca6fc52SDaniel Fojt
1868edacedfSDaniel Fojt /* Add decoded values to the current ClientHello hash */
1878edacedfSDaniel Fojt if (!tls13_clienthello_hash_init(ctx)) {
1888edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
1898edacedfSDaniel Fojt goto err;
1908edacedfSDaniel Fojt }
1918edacedfSDaniel Fojt if (!tls13_clienthello_hash_update_bytes(ctx, (void *)&legacy_version,
1928edacedfSDaniel Fojt sizeof(legacy_version))) {
1938edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
1948edacedfSDaniel Fojt goto err;
1958edacedfSDaniel Fojt }
1968edacedfSDaniel Fojt if (!tls13_clienthello_hash_update(ctx, &client_random)) {
1978edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
1988edacedfSDaniel Fojt goto err;
1998edacedfSDaniel Fojt }
2008edacedfSDaniel Fojt if (!tls13_clienthello_hash_update(ctx, &session_id)) {
2018edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
2028edacedfSDaniel Fojt goto err;
2038edacedfSDaniel Fojt }
2048edacedfSDaniel Fojt if (!tls13_clienthello_hash_update(ctx, &cipher_suites)) {
2058edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
2068edacedfSDaniel Fojt goto err;
2078edacedfSDaniel Fojt }
2088edacedfSDaniel Fojt if (!tls13_clienthello_hash_update(ctx, &compression_methods)) {
2098edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
2108edacedfSDaniel Fojt goto err;
2118edacedfSDaniel Fojt }
2128edacedfSDaniel Fojt
2138edacedfSDaniel Fojt if (!tlsext_server_parse(s, SSL_TLSEXT_MSG_CH, cbs, &alert_desc)) {
214cca6fc52SDaniel Fojt ctx->alert = alert_desc;
215cca6fc52SDaniel Fojt goto err;
216cca6fc52SDaniel Fojt }
217cca6fc52SDaniel Fojt
2188edacedfSDaniel Fojt /* Finalize first ClientHello hash, or validate against it */
219*de0e0e4dSAntonio Huete Jimenez if (!ctx->hs->tls13.hrr) {
2208edacedfSDaniel Fojt if (!tls13_clienthello_hash_finalize(ctx)) {
2218edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
2228edacedfSDaniel Fojt goto err;
2238edacedfSDaniel Fojt }
2248edacedfSDaniel Fojt } else {
2258edacedfSDaniel Fojt if (!tls13_clienthello_hash_validate(ctx)) {
2268edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
2278edacedfSDaniel Fojt goto err;
2288edacedfSDaniel Fojt }
229*de0e0e4dSAntonio Huete Jimenez tls13_clienthello_hash_clear(&ctx->hs->tls13);
2308edacedfSDaniel Fojt }
2318edacedfSDaniel Fojt
2328edacedfSDaniel Fojt if (!tls13_client_hello_required_extensions(ctx)) {
2338edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_MISSING_EXTENSION;
2348edacedfSDaniel Fojt goto err;
2358edacedfSDaniel Fojt }
2368edacedfSDaniel Fojt
237cca6fc52SDaniel Fojt /*
238cca6fc52SDaniel Fojt * If we got this far we have a supported versions extension that offers
239cca6fc52SDaniel Fojt * TLS 1.3 or later. This requires the legacy version be set to 0x0303.
240cca6fc52SDaniel Fojt */
241cca6fc52SDaniel Fojt if (legacy_version != TLS1_2_VERSION) {
2428edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_PROTOCOL_VERSION;
243cca6fc52SDaniel Fojt goto err;
244cca6fc52SDaniel Fojt }
245cca6fc52SDaniel Fojt
246*de0e0e4dSAntonio Huete Jimenez /*
247*de0e0e4dSAntonio Huete Jimenez * The legacy session identifier must either be zero length or a 32 byte
248*de0e0e4dSAntonio Huete Jimenez * value (in which case the client is requesting middlebox compatibility
249*de0e0e4dSAntonio Huete Jimenez * mode), as per RFC 8446 section 4.1.2. If it is valid, store the value
250*de0e0e4dSAntonio Huete Jimenez * so that we can echo it back to the client.
251*de0e0e4dSAntonio Huete Jimenez */
252*de0e0e4dSAntonio Huete Jimenez if (CBS_len(&session_id) != 0 &&
253*de0e0e4dSAntonio Huete Jimenez CBS_len(&session_id) != sizeof(ctx->hs->tls13.legacy_session_id)) {
2548edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
255cca6fc52SDaniel Fojt goto err;
256cca6fc52SDaniel Fojt }
257*de0e0e4dSAntonio Huete Jimenez if (!CBS_write_bytes(&session_id, ctx->hs->tls13.legacy_session_id,
258*de0e0e4dSAntonio Huete Jimenez sizeof(ctx->hs->tls13.legacy_session_id),
259*de0e0e4dSAntonio Huete Jimenez &ctx->hs->tls13.legacy_session_id_len)) {
2608edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
261cca6fc52SDaniel Fojt goto err;
2628edacedfSDaniel Fojt }
263cca6fc52SDaniel Fojt
264cca6fc52SDaniel Fojt /* Parse cipher suites list and select preferred cipher. */
265cca6fc52SDaniel Fojt if ((ciphers = ssl_bytes_to_cipher_list(s, &cipher_suites)) == NULL) {
2668edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
267cca6fc52SDaniel Fojt goto err;
268cca6fc52SDaniel Fojt }
269cca6fc52SDaniel Fojt cipher = ssl3_choose_cipher(s, ciphers, SSL_get_ciphers(s));
270cca6fc52SDaniel Fojt if (cipher == NULL) {
271cca6fc52SDaniel Fojt tls13_set_errorx(ctx, TLS13_ERR_NO_SHARED_CIPHER, 0,
272cca6fc52SDaniel Fojt "no shared cipher found", NULL);
2738edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_HANDSHAKE_FAILURE;
274cca6fc52SDaniel Fojt goto err;
275cca6fc52SDaniel Fojt }
276*de0e0e4dSAntonio Huete Jimenez ctx->hs->cipher = cipher;
277*de0e0e4dSAntonio Huete Jimenez
278*de0e0e4dSAntonio Huete Jimenez sk_SSL_CIPHER_free(s->session->ciphers);
279*de0e0e4dSAntonio Huete Jimenez s->session->ciphers = ciphers;
280*de0e0e4dSAntonio Huete Jimenez ciphers = NULL;
281cca6fc52SDaniel Fojt
2828edacedfSDaniel Fojt /* Ensure only the NULL compression method is advertised. */
2838edacedfSDaniel Fojt if (!CBS_mem_equal(&compression_methods, tls13_compression_null_only,
2848edacedfSDaniel Fojt sizeof(tls13_compression_null_only))) {
2858edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
286cca6fc52SDaniel Fojt goto err;
287cca6fc52SDaniel Fojt }
288cca6fc52SDaniel Fojt
289cca6fc52SDaniel Fojt ret = 1;
290cca6fc52SDaniel Fojt
291cca6fc52SDaniel Fojt err:
292cca6fc52SDaniel Fojt sk_SSL_CIPHER_free(ciphers);
293cca6fc52SDaniel Fojt
294cca6fc52SDaniel Fojt return ret;
295cca6fc52SDaniel Fojt }
296cca6fc52SDaniel Fojt
297cca6fc52SDaniel Fojt int
tls13_client_hello_recv(struct tls13_ctx * ctx,CBS * cbs)298cca6fc52SDaniel Fojt tls13_client_hello_recv(struct tls13_ctx *ctx, CBS *cbs)
299cca6fc52SDaniel Fojt {
300cca6fc52SDaniel Fojt SSL *s = ctx->ssl;
301cca6fc52SDaniel Fojt
302cca6fc52SDaniel Fojt if (!tls13_client_hello_process(ctx, cbs))
303cca6fc52SDaniel Fojt goto err;
304cca6fc52SDaniel Fojt
305cca6fc52SDaniel Fojt /* See if we switched back to the legacy client method. */
306*de0e0e4dSAntonio Huete Jimenez if (s->method->version < TLS1_3_VERSION)
307cca6fc52SDaniel Fojt return 1;
308cca6fc52SDaniel Fojt
309cca6fc52SDaniel Fojt /*
310cca6fc52SDaniel Fojt * If a matching key share was provided, we do not need to send a
311cca6fc52SDaniel Fojt * HelloRetryRequest.
312cca6fc52SDaniel Fojt */
313cca6fc52SDaniel Fojt /*
314cca6fc52SDaniel Fojt * XXX - ideally NEGOTIATED would only be added after record protection
315cca6fc52SDaniel Fojt * has been enabled. This would probably mean using either an
316cca6fc52SDaniel Fojt * INITIAL | WITHOUT_HRR state, or another intermediate state.
317cca6fc52SDaniel Fojt */
318cca6fc52SDaniel Fojt if (ctx->hs->key_share != NULL)
319cca6fc52SDaniel Fojt ctx->handshake_stage.hs_type |= NEGOTIATED | WITHOUT_HRR;
320cca6fc52SDaniel Fojt
321cca6fc52SDaniel Fojt tls13_record_layer_allow_ccs(ctx->rl, 1);
322cca6fc52SDaniel Fojt
323cca6fc52SDaniel Fojt return 1;
324cca6fc52SDaniel Fojt
325cca6fc52SDaniel Fojt err:
326cca6fc52SDaniel Fojt return 0;
327cca6fc52SDaniel Fojt }
328cca6fc52SDaniel Fojt
329cca6fc52SDaniel Fojt static int
tls13_server_hello_build(struct tls13_ctx * ctx,CBB * cbb,int hrr)3308edacedfSDaniel Fojt tls13_server_hello_build(struct tls13_ctx *ctx, CBB *cbb, int hrr)
331cca6fc52SDaniel Fojt {
3328edacedfSDaniel Fojt uint16_t tlsext_msg_type = SSL_TLSEXT_MSG_SH;
3338edacedfSDaniel Fojt const uint8_t *server_random;
334cca6fc52SDaniel Fojt CBB session_id;
335cca6fc52SDaniel Fojt SSL *s = ctx->ssl;
336cca6fc52SDaniel Fojt uint16_t cipher;
337cca6fc52SDaniel Fojt
338*de0e0e4dSAntonio Huete Jimenez cipher = SSL_CIPHER_get_value(ctx->hs->cipher);
3398edacedfSDaniel Fojt server_random = s->s3->server_random;
3408edacedfSDaniel Fojt
3418edacedfSDaniel Fojt if (hrr) {
3428edacedfSDaniel Fojt server_random = tls13_hello_retry_request_hash;
3438edacedfSDaniel Fojt tlsext_msg_type = SSL_TLSEXT_MSG_HRR;
3448edacedfSDaniel Fojt }
345cca6fc52SDaniel Fojt
346cca6fc52SDaniel Fojt if (!CBB_add_u16(cbb, TLS1_2_VERSION))
347cca6fc52SDaniel Fojt goto err;
3488edacedfSDaniel Fojt if (!CBB_add_bytes(cbb, server_random, SSL3_RANDOM_SIZE))
349cca6fc52SDaniel Fojt goto err;
350cca6fc52SDaniel Fojt if (!CBB_add_u8_length_prefixed(cbb, &session_id))
351cca6fc52SDaniel Fojt goto err;
352*de0e0e4dSAntonio Huete Jimenez if (!CBB_add_bytes(&session_id, ctx->hs->tls13.legacy_session_id,
353*de0e0e4dSAntonio Huete Jimenez ctx->hs->tls13.legacy_session_id_len))
354cca6fc52SDaniel Fojt goto err;
355cca6fc52SDaniel Fojt if (!CBB_add_u16(cbb, cipher))
356cca6fc52SDaniel Fojt goto err;
357cca6fc52SDaniel Fojt if (!CBB_add_u8(cbb, 0))
358cca6fc52SDaniel Fojt goto err;
3598edacedfSDaniel Fojt if (!tlsext_server_build(s, tlsext_msg_type, cbb))
360cca6fc52SDaniel Fojt goto err;
361cca6fc52SDaniel Fojt
362cca6fc52SDaniel Fojt if (!CBB_flush(cbb))
363cca6fc52SDaniel Fojt goto err;
364cca6fc52SDaniel Fojt
365cca6fc52SDaniel Fojt return 1;
366cca6fc52SDaniel Fojt err:
367cca6fc52SDaniel Fojt return 0;
368cca6fc52SDaniel Fojt }
369cca6fc52SDaniel Fojt
3708edacedfSDaniel Fojt static int
tls13_server_engage_record_protection(struct tls13_ctx * ctx)3718edacedfSDaniel Fojt tls13_server_engage_record_protection(struct tls13_ctx *ctx)
372cca6fc52SDaniel Fojt {
373cca6fc52SDaniel Fojt struct tls13_secrets *secrets;
374cca6fc52SDaniel Fojt struct tls13_secret context;
375cca6fc52SDaniel Fojt unsigned char buf[EVP_MAX_MD_SIZE];
376cca6fc52SDaniel Fojt uint8_t *shared_key = NULL;
377cca6fc52SDaniel Fojt size_t shared_key_len = 0;
378cca6fc52SDaniel Fojt size_t hash_len;
379cca6fc52SDaniel Fojt SSL *s = ctx->ssl;
380cca6fc52SDaniel Fojt int ret = 0;
381cca6fc52SDaniel Fojt
382*de0e0e4dSAntonio Huete Jimenez if (!tls_key_share_derive(ctx->hs->key_share, &shared_key,
383*de0e0e4dSAntonio Huete Jimenez &shared_key_len))
384cca6fc52SDaniel Fojt goto err;
385cca6fc52SDaniel Fojt
386*de0e0e4dSAntonio Huete Jimenez s->session->cipher = ctx->hs->cipher;
387cca6fc52SDaniel Fojt
388*de0e0e4dSAntonio Huete Jimenez if ((ctx->aead = tls13_cipher_aead(ctx->hs->cipher)) == NULL)
389cca6fc52SDaniel Fojt goto err;
390*de0e0e4dSAntonio Huete Jimenez if ((ctx->hash = tls13_cipher_hash(ctx->hs->cipher)) == NULL)
391cca6fc52SDaniel Fojt goto err;
392cca6fc52SDaniel Fojt
393cca6fc52SDaniel Fojt if ((secrets = tls13_secrets_create(ctx->hash, 0)) == NULL)
394cca6fc52SDaniel Fojt goto err;
395*de0e0e4dSAntonio Huete Jimenez ctx->hs->tls13.secrets = secrets;
396cca6fc52SDaniel Fojt
397cca6fc52SDaniel Fojt /* XXX - pass in hash. */
398cca6fc52SDaniel Fojt if (!tls1_transcript_hash_init(s))
399cca6fc52SDaniel Fojt goto err;
400cca6fc52SDaniel Fojt tls1_transcript_free(s);
401cca6fc52SDaniel Fojt if (!tls1_transcript_hash_value(s, buf, sizeof(buf), &hash_len))
402cca6fc52SDaniel Fojt goto err;
403cca6fc52SDaniel Fojt context.data = buf;
404cca6fc52SDaniel Fojt context.len = hash_len;
405cca6fc52SDaniel Fojt
406cca6fc52SDaniel Fojt /* Early secrets. */
407cca6fc52SDaniel Fojt if (!tls13_derive_early_secrets(secrets, secrets->zeros.data,
408cca6fc52SDaniel Fojt secrets->zeros.len, &context))
409cca6fc52SDaniel Fojt goto err;
410cca6fc52SDaniel Fojt
411cca6fc52SDaniel Fojt /* Handshake secrets. */
412*de0e0e4dSAntonio Huete Jimenez if (!tls13_derive_handshake_secrets(ctx->hs->tls13.secrets, shared_key,
413cca6fc52SDaniel Fojt shared_key_len, &context))
414cca6fc52SDaniel Fojt goto err;
415cca6fc52SDaniel Fojt
416cca6fc52SDaniel Fojt tls13_record_layer_set_aead(ctx->rl, ctx->aead);
417cca6fc52SDaniel Fojt tls13_record_layer_set_hash(ctx->rl, ctx->hash);
418cca6fc52SDaniel Fojt
419cca6fc52SDaniel Fojt if (!tls13_record_layer_set_read_traffic_key(ctx->rl,
420*de0e0e4dSAntonio Huete Jimenez &secrets->client_handshake_traffic, ssl_encryption_handshake))
421cca6fc52SDaniel Fojt goto err;
422cca6fc52SDaniel Fojt if (!tls13_record_layer_set_write_traffic_key(ctx->rl,
423*de0e0e4dSAntonio Huete Jimenez &secrets->server_handshake_traffic, ssl_encryption_handshake))
424cca6fc52SDaniel Fojt goto err;
425cca6fc52SDaniel Fojt
426cca6fc52SDaniel Fojt ctx->handshake_stage.hs_type |= NEGOTIATED;
427cca6fc52SDaniel Fojt if (!(SSL_get_verify_mode(s) & SSL_VERIFY_PEER))
428cca6fc52SDaniel Fojt ctx->handshake_stage.hs_type |= WITHOUT_CR;
429cca6fc52SDaniel Fojt
430cca6fc52SDaniel Fojt ret = 1;
431cca6fc52SDaniel Fojt
432cca6fc52SDaniel Fojt err:
433cca6fc52SDaniel Fojt freezero(shared_key, shared_key_len);
434cca6fc52SDaniel Fojt return ret;
435cca6fc52SDaniel Fojt }
436cca6fc52SDaniel Fojt
437cca6fc52SDaniel Fojt int
tls13_server_hello_retry_request_send(struct tls13_ctx * ctx,CBB * cbb)4388edacedfSDaniel Fojt tls13_server_hello_retry_request_send(struct tls13_ctx *ctx, CBB *cbb)
4398edacedfSDaniel Fojt {
4408edacedfSDaniel Fojt int nid;
4418edacedfSDaniel Fojt
442*de0e0e4dSAntonio Huete Jimenez ctx->hs->tls13.hrr = 1;
4438edacedfSDaniel Fojt
4448edacedfSDaniel Fojt if (!tls13_synthetic_handshake_message(ctx))
4458edacedfSDaniel Fojt return 0;
4468edacedfSDaniel Fojt
4478edacedfSDaniel Fojt if (ctx->hs->key_share != NULL)
4488edacedfSDaniel Fojt return 0;
449*de0e0e4dSAntonio Huete Jimenez if (!tls1_get_supported_group(ctx->ssl, &nid))
4508edacedfSDaniel Fojt return 0;
451*de0e0e4dSAntonio Huete Jimenez if (!tls1_ec_nid2group_id(nid, &ctx->hs->tls13.server_group))
4528edacedfSDaniel Fojt return 0;
4538edacedfSDaniel Fojt
4548edacedfSDaniel Fojt if (!tls13_server_hello_build(ctx, cbb, 1))
4558edacedfSDaniel Fojt return 0;
4568edacedfSDaniel Fojt
4578edacedfSDaniel Fojt return 1;
4588edacedfSDaniel Fojt }
4598edacedfSDaniel Fojt
4608edacedfSDaniel Fojt int
tls13_server_hello_retry_request_sent(struct tls13_ctx * ctx)4618edacedfSDaniel Fojt tls13_server_hello_retry_request_sent(struct tls13_ctx *ctx)
4628edacedfSDaniel Fojt {
4638edacedfSDaniel Fojt /*
4648edacedfSDaniel Fojt * If the client has requested middlebox compatibility mode,
4658edacedfSDaniel Fojt * we MUST send a dummy CCS following our first handshake message.
4668edacedfSDaniel Fojt * See RFC 8446 Appendix D.4.
4678edacedfSDaniel Fojt */
468*de0e0e4dSAntonio Huete Jimenez if (ctx->hs->tls13.legacy_session_id_len > 0)
4698edacedfSDaniel Fojt ctx->send_dummy_ccs_after = 1;
4708edacedfSDaniel Fojt
4718edacedfSDaniel Fojt return 1;
4728edacedfSDaniel Fojt }
4738edacedfSDaniel Fojt
4748edacedfSDaniel Fojt int
tls13_client_hello_retry_recv(struct tls13_ctx * ctx,CBS * cbs)4758edacedfSDaniel Fojt tls13_client_hello_retry_recv(struct tls13_ctx *ctx, CBS *cbs)
4768edacedfSDaniel Fojt {
4778edacedfSDaniel Fojt SSL *s = ctx->ssl;
4788edacedfSDaniel Fojt
4798edacedfSDaniel Fojt if (!tls13_client_hello_process(ctx, cbs))
4808edacedfSDaniel Fojt return 0;
4818edacedfSDaniel Fojt
4828edacedfSDaniel Fojt /* XXX - need further checks. */
483*de0e0e4dSAntonio Huete Jimenez if (s->method->version < TLS1_3_VERSION)
4848edacedfSDaniel Fojt return 0;
4858edacedfSDaniel Fojt
486*de0e0e4dSAntonio Huete Jimenez ctx->hs->tls13.hrr = 0;
4878edacedfSDaniel Fojt
4888edacedfSDaniel Fojt return 1;
4898edacedfSDaniel Fojt }
4908edacedfSDaniel Fojt
4918edacedfSDaniel Fojt static int
tls13_servername_process(struct tls13_ctx * ctx)4928edacedfSDaniel Fojt tls13_servername_process(struct tls13_ctx *ctx)
4938edacedfSDaniel Fojt {
4948edacedfSDaniel Fojt uint8_t alert = TLS13_ALERT_INTERNAL_ERROR;
4958edacedfSDaniel Fojt
4968edacedfSDaniel Fojt if (!tls13_legacy_servername_process(ctx, &alert)) {
4978edacedfSDaniel Fojt ctx->alert = alert;
4988edacedfSDaniel Fojt return 0;
4998edacedfSDaniel Fojt }
5008edacedfSDaniel Fojt
5018edacedfSDaniel Fojt return 1;
5028edacedfSDaniel Fojt }
5038edacedfSDaniel Fojt
5048edacedfSDaniel Fojt int
tls13_server_hello_send(struct tls13_ctx * ctx,CBB * cbb)5058edacedfSDaniel Fojt tls13_server_hello_send(struct tls13_ctx *ctx, CBB *cbb)
5068edacedfSDaniel Fojt {
5078edacedfSDaniel Fojt if (ctx->hs->key_share == NULL)
5088edacedfSDaniel Fojt return 0;
509*de0e0e4dSAntonio Huete Jimenez if (!tls_key_share_generate(ctx->hs->key_share))
5108edacedfSDaniel Fojt return 0;
5118edacedfSDaniel Fojt if (!tls13_servername_process(ctx))
5128edacedfSDaniel Fojt return 0;
5138edacedfSDaniel Fojt
514*de0e0e4dSAntonio Huete Jimenez ctx->hs->tls13.server_group = 0;
5158edacedfSDaniel Fojt
5168edacedfSDaniel Fojt if (!tls13_server_hello_build(ctx, cbb, 0))
5178edacedfSDaniel Fojt return 0;
5188edacedfSDaniel Fojt
5198edacedfSDaniel Fojt return 1;
5208edacedfSDaniel Fojt }
5218edacedfSDaniel Fojt
5228edacedfSDaniel Fojt int
tls13_server_hello_sent(struct tls13_ctx * ctx)5238edacedfSDaniel Fojt tls13_server_hello_sent(struct tls13_ctx *ctx)
5248edacedfSDaniel Fojt {
5258edacedfSDaniel Fojt /*
5268edacedfSDaniel Fojt * If the client has requested middlebox compatibility mode,
5278edacedfSDaniel Fojt * we MUST send a dummy CCS following our first handshake message.
5288edacedfSDaniel Fojt * See RFC 8446 Appendix D.4.
5298edacedfSDaniel Fojt */
5308edacedfSDaniel Fojt if ((ctx->handshake_stage.hs_type & WITHOUT_HRR) &&
531*de0e0e4dSAntonio Huete Jimenez ctx->hs->tls13.legacy_session_id_len > 0)
5328edacedfSDaniel Fojt ctx->send_dummy_ccs_after = 1;
5338edacedfSDaniel Fojt
5348edacedfSDaniel Fojt return tls13_server_engage_record_protection(ctx);
5358edacedfSDaniel Fojt }
5368edacedfSDaniel Fojt
5378edacedfSDaniel Fojt int
tls13_server_encrypted_extensions_send(struct tls13_ctx * ctx,CBB * cbb)538cca6fc52SDaniel Fojt tls13_server_encrypted_extensions_send(struct tls13_ctx *ctx, CBB *cbb)
539cca6fc52SDaniel Fojt {
5408edacedfSDaniel Fojt if (!tlsext_server_build(ctx->ssl, SSL_TLSEXT_MSG_EE, cbb))
541cca6fc52SDaniel Fojt goto err;
542cca6fc52SDaniel Fojt
543cca6fc52SDaniel Fojt return 1;
544cca6fc52SDaniel Fojt err:
545cca6fc52SDaniel Fojt return 0;
546cca6fc52SDaniel Fojt }
547cca6fc52SDaniel Fojt
548cca6fc52SDaniel Fojt int
tls13_server_certificate_request_send(struct tls13_ctx * ctx,CBB * cbb)549cca6fc52SDaniel Fojt tls13_server_certificate_request_send(struct tls13_ctx *ctx, CBB *cbb)
550cca6fc52SDaniel Fojt {
551cca6fc52SDaniel Fojt CBB certificate_request_context;
552cca6fc52SDaniel Fojt
553cca6fc52SDaniel Fojt if (!CBB_add_u8_length_prefixed(cbb, &certificate_request_context))
554cca6fc52SDaniel Fojt goto err;
5558edacedfSDaniel Fojt if (!tlsext_server_build(ctx->ssl, SSL_TLSEXT_MSG_CR, cbb))
556cca6fc52SDaniel Fojt goto err;
557cca6fc52SDaniel Fojt
558cca6fc52SDaniel Fojt if (!CBB_flush(cbb))
559cca6fc52SDaniel Fojt goto err;
560cca6fc52SDaniel Fojt
561cca6fc52SDaniel Fojt return 1;
562cca6fc52SDaniel Fojt err:
563cca6fc52SDaniel Fojt return 0;
564cca6fc52SDaniel Fojt }
565cca6fc52SDaniel Fojt
5668edacedfSDaniel Fojt static int
tls13_server_check_certificate(struct tls13_ctx * ctx,SSL_CERT_PKEY * cpk,int * ok,const struct ssl_sigalg ** out_sigalg)567*de0e0e4dSAntonio Huete Jimenez tls13_server_check_certificate(struct tls13_ctx *ctx, SSL_CERT_PKEY *cpk,
5688edacedfSDaniel Fojt int *ok, const struct ssl_sigalg **out_sigalg)
5698edacedfSDaniel Fojt {
5708edacedfSDaniel Fojt const struct ssl_sigalg *sigalg;
5718edacedfSDaniel Fojt SSL *s = ctx->ssl;
5728edacedfSDaniel Fojt
5738edacedfSDaniel Fojt *ok = 0;
5748edacedfSDaniel Fojt *out_sigalg = NULL;
5758edacedfSDaniel Fojt
5768edacedfSDaniel Fojt if (cpk->x509 == NULL || cpk->privatekey == NULL)
5778edacedfSDaniel Fojt goto done;
5788edacedfSDaniel Fojt
5798edacedfSDaniel Fojt /*
5808edacedfSDaniel Fojt * The digitalSignature bit MUST be set if the Key Usage extension is
5818edacedfSDaniel Fojt * present as per RFC 8446 section 4.4.2.2.
5828edacedfSDaniel Fojt */
583*de0e0e4dSAntonio Huete Jimenez if (!(X509_get_key_usage(cpk->x509) & X509v3_KU_DIGITAL_SIGNATURE))
5848edacedfSDaniel Fojt goto done;
5858edacedfSDaniel Fojt
5868edacedfSDaniel Fojt if ((sigalg = ssl_sigalg_select(s, cpk->privatekey)) == NULL)
5878edacedfSDaniel Fojt goto done;
5888edacedfSDaniel Fojt
5898edacedfSDaniel Fojt *ok = 1;
5908edacedfSDaniel Fojt *out_sigalg = sigalg;
5918edacedfSDaniel Fojt
5928edacedfSDaniel Fojt done:
5938edacedfSDaniel Fojt return 1;
5948edacedfSDaniel Fojt }
5958edacedfSDaniel Fojt
5968edacedfSDaniel Fojt static int
tls13_server_select_certificate(struct tls13_ctx * ctx,SSL_CERT_PKEY ** out_cpk,const struct ssl_sigalg ** out_sigalg)597*de0e0e4dSAntonio Huete Jimenez tls13_server_select_certificate(struct tls13_ctx *ctx, SSL_CERT_PKEY **out_cpk,
5988edacedfSDaniel Fojt const struct ssl_sigalg **out_sigalg)
5998edacedfSDaniel Fojt {
6008edacedfSDaniel Fojt SSL *s = ctx->ssl;
6018edacedfSDaniel Fojt const struct ssl_sigalg *sigalg;
602*de0e0e4dSAntonio Huete Jimenez SSL_CERT_PKEY *cpk;
6038edacedfSDaniel Fojt int cert_ok;
6048edacedfSDaniel Fojt
6058edacedfSDaniel Fojt *out_cpk = NULL;
6068edacedfSDaniel Fojt *out_sigalg = NULL;
6078edacedfSDaniel Fojt
6088edacedfSDaniel Fojt cpk = &s->cert->pkeys[SSL_PKEY_ECC];
6098edacedfSDaniel Fojt if (!tls13_server_check_certificate(ctx, cpk, &cert_ok, &sigalg))
6108edacedfSDaniel Fojt return 0;
6118edacedfSDaniel Fojt if (cert_ok)
6128edacedfSDaniel Fojt goto done;
6138edacedfSDaniel Fojt
6148edacedfSDaniel Fojt cpk = &s->cert->pkeys[SSL_PKEY_RSA];
6158edacedfSDaniel Fojt if (!tls13_server_check_certificate(ctx, cpk, &cert_ok, &sigalg))
6168edacedfSDaniel Fojt return 0;
6178edacedfSDaniel Fojt if (cert_ok)
6188edacedfSDaniel Fojt goto done;
6198edacedfSDaniel Fojt
6208edacedfSDaniel Fojt cpk = NULL;
6218edacedfSDaniel Fojt sigalg = NULL;
6228edacedfSDaniel Fojt
6238edacedfSDaniel Fojt done:
6248edacedfSDaniel Fojt *out_cpk = cpk;
6258edacedfSDaniel Fojt *out_sigalg = sigalg;
6268edacedfSDaniel Fojt
6278edacedfSDaniel Fojt return 1;
6288edacedfSDaniel Fojt }
6298edacedfSDaniel Fojt
630cca6fc52SDaniel Fojt int
tls13_server_certificate_send(struct tls13_ctx * ctx,CBB * cbb)631cca6fc52SDaniel Fojt tls13_server_certificate_send(struct tls13_ctx *ctx, CBB *cbb)
632cca6fc52SDaniel Fojt {
633cca6fc52SDaniel Fojt SSL *s = ctx->ssl;
634cca6fc52SDaniel Fojt CBB cert_request_context, cert_list;
6358edacedfSDaniel Fojt const struct ssl_sigalg *sigalg;
6362eb7d3b8SDaniel Fojt X509_STORE_CTX *xsc = NULL;
637cca6fc52SDaniel Fojt STACK_OF(X509) *chain;
638*de0e0e4dSAntonio Huete Jimenez SSL_CERT_PKEY *cpk;
639cca6fc52SDaniel Fojt X509 *cert;
640cca6fc52SDaniel Fojt int i, ret = 0;
641cca6fc52SDaniel Fojt
6428edacedfSDaniel Fojt if (!tls13_server_select_certificate(ctx, &cpk, &sigalg))
6438edacedfSDaniel Fojt goto err;
6448edacedfSDaniel Fojt
6458edacedfSDaniel Fojt if (cpk == NULL) {
6468edacedfSDaniel Fojt /* A server must always provide a certificate. */
6478edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_HANDSHAKE_FAILURE;
6488edacedfSDaniel Fojt tls13_set_errorx(ctx, TLS13_ERR_NO_CERTIFICATE, 0,
6498edacedfSDaniel Fojt "no server certificate", NULL);
6508edacedfSDaniel Fojt goto err;
6518edacedfSDaniel Fojt }
6528edacedfSDaniel Fojt
653*de0e0e4dSAntonio Huete Jimenez ctx->hs->tls13.cpk = cpk;
654*de0e0e4dSAntonio Huete Jimenez ctx->hs->our_sigalg = sigalg;
655cca6fc52SDaniel Fojt
656cca6fc52SDaniel Fojt if ((chain = cpk->chain) == NULL)
657cca6fc52SDaniel Fojt chain = s->ctx->extra_certs;
658cca6fc52SDaniel Fojt
6592eb7d3b8SDaniel Fojt if (chain == NULL && !(s->internal->mode & SSL_MODE_NO_AUTO_CHAIN)) {
6602eb7d3b8SDaniel Fojt if ((xsc = X509_STORE_CTX_new()) == NULL)
6612eb7d3b8SDaniel Fojt goto err;
6622eb7d3b8SDaniel Fojt if (!X509_STORE_CTX_init(xsc, s->ctx->cert_store, cpk->x509, NULL))
6632eb7d3b8SDaniel Fojt goto err;
6642eb7d3b8SDaniel Fojt X509_VERIFY_PARAM_set_flags(X509_STORE_CTX_get0_param(xsc),
6652eb7d3b8SDaniel Fojt X509_V_FLAG_LEGACY_VERIFY);
6662eb7d3b8SDaniel Fojt X509_verify_cert(xsc);
6672eb7d3b8SDaniel Fojt ERR_clear_error();
668*de0e0e4dSAntonio Huete Jimenez chain = X509_STORE_CTX_get0_chain(xsc);
6692eb7d3b8SDaniel Fojt }
6702eb7d3b8SDaniel Fojt
671cca6fc52SDaniel Fojt if (!CBB_add_u8_length_prefixed(cbb, &cert_request_context))
672cca6fc52SDaniel Fojt goto err;
673cca6fc52SDaniel Fojt if (!CBB_add_u24_length_prefixed(cbb, &cert_list))
674cca6fc52SDaniel Fojt goto err;
675cca6fc52SDaniel Fojt
6768edacedfSDaniel Fojt if (!tls13_cert_add(ctx, &cert_list, cpk->x509, tlsext_server_build))
677cca6fc52SDaniel Fojt goto err;
678cca6fc52SDaniel Fojt
679cca6fc52SDaniel Fojt for (i = 0; i < sk_X509_num(chain); i++) {
680cca6fc52SDaniel Fojt cert = sk_X509_value(chain, i);
6812eb7d3b8SDaniel Fojt
6822eb7d3b8SDaniel Fojt /*
6832eb7d3b8SDaniel Fojt * In the case of auto chain, the leaf certificate will be at
6842eb7d3b8SDaniel Fojt * the top of the chain - skip over it as we've already added
6852eb7d3b8SDaniel Fojt * it earlier.
6862eb7d3b8SDaniel Fojt */
6872eb7d3b8SDaniel Fojt if (i == 0 && cert == cpk->x509)
6882eb7d3b8SDaniel Fojt continue;
6892eb7d3b8SDaniel Fojt
6908edacedfSDaniel Fojt /*
6918edacedfSDaniel Fojt * XXX we don't send extensions with chain certs to avoid sending
692*de0e0e4dSAntonio Huete Jimenez * a leaf ocsp staple with the chain certs. This needs to get
693*de0e0e4dSAntonio Huete Jimenez * fixed.
6948edacedfSDaniel Fojt */
6958edacedfSDaniel Fojt if (!tls13_cert_add(ctx, &cert_list, cert, NULL))
696cca6fc52SDaniel Fojt goto err;
697cca6fc52SDaniel Fojt }
698cca6fc52SDaniel Fojt
699cca6fc52SDaniel Fojt if (!CBB_flush(cbb))
700cca6fc52SDaniel Fojt goto err;
701cca6fc52SDaniel Fojt
702cca6fc52SDaniel Fojt ret = 1;
703cca6fc52SDaniel Fojt
704cca6fc52SDaniel Fojt err:
7052eb7d3b8SDaniel Fojt X509_STORE_CTX_free(xsc);
7062eb7d3b8SDaniel Fojt
707cca6fc52SDaniel Fojt return ret;
708cca6fc52SDaniel Fojt }
709cca6fc52SDaniel Fojt
710cca6fc52SDaniel Fojt int
tls13_server_certificate_verify_send(struct tls13_ctx * ctx,CBB * cbb)711cca6fc52SDaniel Fojt tls13_server_certificate_verify_send(struct tls13_ctx *ctx, CBB *cbb)
712cca6fc52SDaniel Fojt {
7138edacedfSDaniel Fojt const struct ssl_sigalg *sigalg;
714cca6fc52SDaniel Fojt uint8_t *sig = NULL, *sig_content = NULL;
715cca6fc52SDaniel Fojt size_t sig_len, sig_content_len;
716cca6fc52SDaniel Fojt EVP_MD_CTX *mdctx = NULL;
717cca6fc52SDaniel Fojt EVP_PKEY_CTX *pctx;
718cca6fc52SDaniel Fojt EVP_PKEY *pkey;
719*de0e0e4dSAntonio Huete Jimenez const SSL_CERT_PKEY *cpk;
720cca6fc52SDaniel Fojt CBB sig_cbb;
721cca6fc52SDaniel Fojt int ret = 0;
722cca6fc52SDaniel Fojt
723cca6fc52SDaniel Fojt memset(&sig_cbb, 0, sizeof(sig_cbb));
724cca6fc52SDaniel Fojt
725*de0e0e4dSAntonio Huete Jimenez if ((cpk = ctx->hs->tls13.cpk) == NULL)
726cca6fc52SDaniel Fojt goto err;
727*de0e0e4dSAntonio Huete Jimenez if ((sigalg = ctx->hs->our_sigalg) == NULL)
7288edacedfSDaniel Fojt goto err;
7298edacedfSDaniel Fojt pkey = cpk->privatekey;
730cca6fc52SDaniel Fojt
731cca6fc52SDaniel Fojt if (!CBB_init(&sig_cbb, 0))
732cca6fc52SDaniel Fojt goto err;
733cca6fc52SDaniel Fojt if (!CBB_add_bytes(&sig_cbb, tls13_cert_verify_pad,
734cca6fc52SDaniel Fojt sizeof(tls13_cert_verify_pad)))
735cca6fc52SDaniel Fojt goto err;
736cca6fc52SDaniel Fojt if (!CBB_add_bytes(&sig_cbb, tls13_cert_server_verify_context,
737cca6fc52SDaniel Fojt strlen(tls13_cert_server_verify_context)))
738cca6fc52SDaniel Fojt goto err;
739cca6fc52SDaniel Fojt if (!CBB_add_u8(&sig_cbb, 0))
740cca6fc52SDaniel Fojt goto err;
741*de0e0e4dSAntonio Huete Jimenez if (!CBB_add_bytes(&sig_cbb, ctx->hs->tls13.transcript_hash,
742*de0e0e4dSAntonio Huete Jimenez ctx->hs->tls13.transcript_hash_len))
743cca6fc52SDaniel Fojt goto err;
744cca6fc52SDaniel Fojt if (!CBB_finish(&sig_cbb, &sig_content, &sig_content_len))
745cca6fc52SDaniel Fojt goto err;
746cca6fc52SDaniel Fojt
747cca6fc52SDaniel Fojt if ((mdctx = EVP_MD_CTX_new()) == NULL)
748cca6fc52SDaniel Fojt goto err;
749cca6fc52SDaniel Fojt if (!EVP_DigestSignInit(mdctx, &pctx, sigalg->md(), NULL, pkey))
750cca6fc52SDaniel Fojt goto err;
751cca6fc52SDaniel Fojt if (sigalg->flags & SIGALG_FLAG_RSA_PSS) {
752cca6fc52SDaniel Fojt if (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING))
753cca6fc52SDaniel Fojt goto err;
754cca6fc52SDaniel Fojt if (!EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))
755cca6fc52SDaniel Fojt goto err;
756cca6fc52SDaniel Fojt }
757cca6fc52SDaniel Fojt if (!EVP_DigestSignUpdate(mdctx, sig_content, sig_content_len))
758cca6fc52SDaniel Fojt goto err;
759cca6fc52SDaniel Fojt if (EVP_DigestSignFinal(mdctx, NULL, &sig_len) <= 0)
760cca6fc52SDaniel Fojt goto err;
761cca6fc52SDaniel Fojt if ((sig = calloc(1, sig_len)) == NULL)
762cca6fc52SDaniel Fojt goto err;
763cca6fc52SDaniel Fojt if (EVP_DigestSignFinal(mdctx, sig, &sig_len) <= 0)
764cca6fc52SDaniel Fojt goto err;
765cca6fc52SDaniel Fojt
766cca6fc52SDaniel Fojt if (!CBB_add_u16(cbb, sigalg->value))
767cca6fc52SDaniel Fojt goto err;
768cca6fc52SDaniel Fojt if (!CBB_add_u16_length_prefixed(cbb, &sig_cbb))
769cca6fc52SDaniel Fojt goto err;
770cca6fc52SDaniel Fojt if (!CBB_add_bytes(&sig_cbb, sig, sig_len))
771cca6fc52SDaniel Fojt goto err;
772cca6fc52SDaniel Fojt
773cca6fc52SDaniel Fojt if (!CBB_flush(cbb))
774cca6fc52SDaniel Fojt goto err;
775cca6fc52SDaniel Fojt
776cca6fc52SDaniel Fojt ret = 1;
777cca6fc52SDaniel Fojt
778cca6fc52SDaniel Fojt err:
779cca6fc52SDaniel Fojt if (!ret && ctx->alert == 0)
7808edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
781cca6fc52SDaniel Fojt
782cca6fc52SDaniel Fojt CBB_cleanup(&sig_cbb);
783cca6fc52SDaniel Fojt EVP_MD_CTX_free(mdctx);
784cca6fc52SDaniel Fojt free(sig_content);
785cca6fc52SDaniel Fojt free(sig);
786cca6fc52SDaniel Fojt
787cca6fc52SDaniel Fojt return ret;
788cca6fc52SDaniel Fojt }
789cca6fc52SDaniel Fojt
790cca6fc52SDaniel Fojt int
tls13_server_finished_send(struct tls13_ctx * ctx,CBB * cbb)791cca6fc52SDaniel Fojt tls13_server_finished_send(struct tls13_ctx *ctx, CBB *cbb)
792cca6fc52SDaniel Fojt {
793*de0e0e4dSAntonio Huete Jimenez struct tls13_secrets *secrets = ctx->hs->tls13.secrets;
794cca6fc52SDaniel Fojt struct tls13_secret context = { .data = "", .len = 0 };
795*de0e0e4dSAntonio Huete Jimenez struct tls13_secret finished_key = { .data = NULL, .len = 0 } ;
796cca6fc52SDaniel Fojt uint8_t transcript_hash[EVP_MAX_MD_SIZE];
797cca6fc52SDaniel Fojt size_t transcript_hash_len;
798cca6fc52SDaniel Fojt uint8_t *verify_data;
799*de0e0e4dSAntonio Huete Jimenez size_t verify_data_len;
800cca6fc52SDaniel Fojt unsigned int hlen;
801cca6fc52SDaniel Fojt HMAC_CTX *hmac_ctx = NULL;
802*de0e0e4dSAntonio Huete Jimenez CBS cbs;
803cca6fc52SDaniel Fojt int ret = 0;
804cca6fc52SDaniel Fojt
805*de0e0e4dSAntonio Huete Jimenez if (!tls13_secret_init(&finished_key, EVP_MD_size(ctx->hash)))
806*de0e0e4dSAntonio Huete Jimenez goto err;
807cca6fc52SDaniel Fojt
808cca6fc52SDaniel Fojt if (!tls13_hkdf_expand_label(&finished_key, ctx->hash,
809cca6fc52SDaniel Fojt &secrets->server_handshake_traffic, "finished",
810cca6fc52SDaniel Fojt &context))
811cca6fc52SDaniel Fojt goto err;
812cca6fc52SDaniel Fojt
813cca6fc52SDaniel Fojt if (!tls1_transcript_hash_value(ctx->ssl, transcript_hash,
814cca6fc52SDaniel Fojt sizeof(transcript_hash), &transcript_hash_len))
815cca6fc52SDaniel Fojt goto err;
816cca6fc52SDaniel Fojt
817cca6fc52SDaniel Fojt if ((hmac_ctx = HMAC_CTX_new()) == NULL)
818cca6fc52SDaniel Fojt goto err;
819cca6fc52SDaniel Fojt if (!HMAC_Init_ex(hmac_ctx, finished_key.data, finished_key.len,
820cca6fc52SDaniel Fojt ctx->hash, NULL))
821cca6fc52SDaniel Fojt goto err;
822cca6fc52SDaniel Fojt if (!HMAC_Update(hmac_ctx, transcript_hash, transcript_hash_len))
823cca6fc52SDaniel Fojt goto err;
824cca6fc52SDaniel Fojt
825*de0e0e4dSAntonio Huete Jimenez verify_data_len = HMAC_size(hmac_ctx);
826*de0e0e4dSAntonio Huete Jimenez if (!CBB_add_space(cbb, &verify_data, verify_data_len))
827cca6fc52SDaniel Fojt goto err;
828cca6fc52SDaniel Fojt if (!HMAC_Final(hmac_ctx, verify_data, &hlen))
829cca6fc52SDaniel Fojt goto err;
830*de0e0e4dSAntonio Huete Jimenez if (hlen != verify_data_len)
831*de0e0e4dSAntonio Huete Jimenez goto err;
832*de0e0e4dSAntonio Huete Jimenez
833*de0e0e4dSAntonio Huete Jimenez CBS_init(&cbs, verify_data, verify_data_len);
834*de0e0e4dSAntonio Huete Jimenez if (!CBS_write_bytes(&cbs, ctx->hs->finished,
835*de0e0e4dSAntonio Huete Jimenez sizeof(ctx->hs->finished), &ctx->hs->finished_len))
836cca6fc52SDaniel Fojt goto err;
837cca6fc52SDaniel Fojt
838cca6fc52SDaniel Fojt ret = 1;
839cca6fc52SDaniel Fojt
840cca6fc52SDaniel Fojt err:
841*de0e0e4dSAntonio Huete Jimenez tls13_secret_cleanup(&finished_key);
842cca6fc52SDaniel Fojt HMAC_CTX_free(hmac_ctx);
843cca6fc52SDaniel Fojt
844cca6fc52SDaniel Fojt return ret;
845cca6fc52SDaniel Fojt }
846cca6fc52SDaniel Fojt
847cca6fc52SDaniel Fojt int
tls13_server_finished_sent(struct tls13_ctx * ctx)848cca6fc52SDaniel Fojt tls13_server_finished_sent(struct tls13_ctx *ctx)
849cca6fc52SDaniel Fojt {
850*de0e0e4dSAntonio Huete Jimenez struct tls13_secrets *secrets = ctx->hs->tls13.secrets;
851cca6fc52SDaniel Fojt struct tls13_secret context = { .data = "", .len = 0 };
852cca6fc52SDaniel Fojt
853cca6fc52SDaniel Fojt /*
854cca6fc52SDaniel Fojt * Derive application traffic keys.
855cca6fc52SDaniel Fojt */
856*de0e0e4dSAntonio Huete Jimenez context.data = ctx->hs->tls13.transcript_hash;
857*de0e0e4dSAntonio Huete Jimenez context.len = ctx->hs->tls13.transcript_hash_len;
858cca6fc52SDaniel Fojt
859cca6fc52SDaniel Fojt if (!tls13_derive_application_secrets(secrets, &context))
860cca6fc52SDaniel Fojt return 0;
861cca6fc52SDaniel Fojt
862cca6fc52SDaniel Fojt /*
863cca6fc52SDaniel Fojt * Any records following the server finished message must be encrypted
864cca6fc52SDaniel Fojt * using the server application traffic keys.
865cca6fc52SDaniel Fojt */
866cca6fc52SDaniel Fojt return tls13_record_layer_set_write_traffic_key(ctx->rl,
867*de0e0e4dSAntonio Huete Jimenez &secrets->server_application_traffic, ssl_encryption_application);
868cca6fc52SDaniel Fojt }
869cca6fc52SDaniel Fojt
870cca6fc52SDaniel Fojt int
tls13_client_certificate_recv(struct tls13_ctx * ctx,CBS * cbs)871cca6fc52SDaniel Fojt tls13_client_certificate_recv(struct tls13_ctx *ctx, CBS *cbs)
872cca6fc52SDaniel Fojt {
873cca6fc52SDaniel Fojt CBS cert_request_context, cert_list, cert_data, cert_exts;
874cca6fc52SDaniel Fojt struct stack_st_X509 *certs = NULL;
875cca6fc52SDaniel Fojt SSL *s = ctx->ssl;
876cca6fc52SDaniel Fojt X509 *cert = NULL;
877cca6fc52SDaniel Fojt const uint8_t *p;
878cca6fc52SDaniel Fojt int ret = 0;
879cca6fc52SDaniel Fojt
880cca6fc52SDaniel Fojt if (!CBS_get_u8_length_prefixed(cbs, &cert_request_context))
881cca6fc52SDaniel Fojt goto err;
882cca6fc52SDaniel Fojt if (CBS_len(&cert_request_context) != 0)
883cca6fc52SDaniel Fojt goto err;
884cca6fc52SDaniel Fojt if (!CBS_get_u24_length_prefixed(cbs, &cert_list))
885cca6fc52SDaniel Fojt goto err;
8868edacedfSDaniel Fojt if (CBS_len(&cert_list) == 0) {
8878edacedfSDaniel Fojt if (!(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
888cca6fc52SDaniel Fojt return 1;
8898edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_CERTIFICATE_REQUIRED;
8908edacedfSDaniel Fojt tls13_set_errorx(ctx, TLS13_ERR_NO_PEER_CERTIFICATE, 0,
8918edacedfSDaniel Fojt "peer did not provide a certificate", NULL);
8928edacedfSDaniel Fojt goto err;
8938edacedfSDaniel Fojt }
894cca6fc52SDaniel Fojt
895cca6fc52SDaniel Fojt if ((certs = sk_X509_new_null()) == NULL)
896cca6fc52SDaniel Fojt goto err;
897cca6fc52SDaniel Fojt while (CBS_len(&cert_list) > 0) {
898cca6fc52SDaniel Fojt if (!CBS_get_u24_length_prefixed(&cert_list, &cert_data))
899cca6fc52SDaniel Fojt goto err;
900cca6fc52SDaniel Fojt if (!CBS_get_u16_length_prefixed(&cert_list, &cert_exts))
901cca6fc52SDaniel Fojt goto err;
902cca6fc52SDaniel Fojt
903cca6fc52SDaniel Fojt p = CBS_data(&cert_data);
904cca6fc52SDaniel Fojt if ((cert = d2i_X509(NULL, &p, CBS_len(&cert_data))) == NULL)
905cca6fc52SDaniel Fojt goto err;
906cca6fc52SDaniel Fojt if (p != CBS_data(&cert_data) + CBS_len(&cert_data))
907cca6fc52SDaniel Fojt goto err;
908cca6fc52SDaniel Fojt
909cca6fc52SDaniel Fojt if (!sk_X509_push(certs, cert))
910cca6fc52SDaniel Fojt goto err;
911cca6fc52SDaniel Fojt
912cca6fc52SDaniel Fojt cert = NULL;
913cca6fc52SDaniel Fojt }
914cca6fc52SDaniel Fojt
915cca6fc52SDaniel Fojt /*
916cca6fc52SDaniel Fojt * At this stage we still have no proof of possession. As such, it would
917cca6fc52SDaniel Fojt * be preferable to keep the chain and verify once we have successfully
918cca6fc52SDaniel Fojt * processed the CertificateVerify message.
919cca6fc52SDaniel Fojt */
9208edacedfSDaniel Fojt if (ssl_verify_cert_chain(s, certs) <= 0) {
921cca6fc52SDaniel Fojt ctx->alert = ssl_verify_alarm_type(s->verify_result);
922cca6fc52SDaniel Fojt tls13_set_errorx(ctx, TLS13_ERR_VERIFY_FAILED, 0,
923cca6fc52SDaniel Fojt "failed to verify peer certificate", NULL);
924cca6fc52SDaniel Fojt goto err;
925cca6fc52SDaniel Fojt }
926*de0e0e4dSAntonio Huete Jimenez s->session->verify_result = s->verify_result;
927cca6fc52SDaniel Fojt ERR_clear_error();
928cca6fc52SDaniel Fojt
929*de0e0e4dSAntonio Huete Jimenez if (!tls_process_peer_certs(s, certs))
930cca6fc52SDaniel Fojt goto err;
931cca6fc52SDaniel Fojt
932cca6fc52SDaniel Fojt ctx->handshake_stage.hs_type |= WITH_CCV;
933cca6fc52SDaniel Fojt ret = 1;
934cca6fc52SDaniel Fojt
935cca6fc52SDaniel Fojt err:
936cca6fc52SDaniel Fojt sk_X509_pop_free(certs, X509_free);
937cca6fc52SDaniel Fojt X509_free(cert);
938cca6fc52SDaniel Fojt
939cca6fc52SDaniel Fojt return ret;
940cca6fc52SDaniel Fojt }
941cca6fc52SDaniel Fojt
942cca6fc52SDaniel Fojt int
tls13_client_certificate_verify_recv(struct tls13_ctx * ctx,CBS * cbs)943cca6fc52SDaniel Fojt tls13_client_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs)
944cca6fc52SDaniel Fojt {
945cca6fc52SDaniel Fojt const struct ssl_sigalg *sigalg;
946cca6fc52SDaniel Fojt uint16_t signature_scheme;
947cca6fc52SDaniel Fojt uint8_t *sig_content = NULL;
948cca6fc52SDaniel Fojt size_t sig_content_len;
949cca6fc52SDaniel Fojt EVP_MD_CTX *mdctx = NULL;
950cca6fc52SDaniel Fojt EVP_PKEY_CTX *pctx;
951cca6fc52SDaniel Fojt EVP_PKEY *pkey;
952cca6fc52SDaniel Fojt X509 *cert;
953cca6fc52SDaniel Fojt CBS signature;
954cca6fc52SDaniel Fojt CBB cbb;
955cca6fc52SDaniel Fojt int ret = 0;
956cca6fc52SDaniel Fojt
957cca6fc52SDaniel Fojt memset(&cbb, 0, sizeof(cbb));
958cca6fc52SDaniel Fojt
959cca6fc52SDaniel Fojt if (!CBS_get_u16(cbs, &signature_scheme))
960cca6fc52SDaniel Fojt goto err;
961cca6fc52SDaniel Fojt if (!CBS_get_u16_length_prefixed(cbs, &signature))
962cca6fc52SDaniel Fojt goto err;
963cca6fc52SDaniel Fojt
964cca6fc52SDaniel Fojt if (!CBB_init(&cbb, 0))
965cca6fc52SDaniel Fojt goto err;
966cca6fc52SDaniel Fojt if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad,
967cca6fc52SDaniel Fojt sizeof(tls13_cert_verify_pad)))
968cca6fc52SDaniel Fojt goto err;
969cca6fc52SDaniel Fojt if (!CBB_add_bytes(&cbb, tls13_cert_client_verify_context,
970cca6fc52SDaniel Fojt strlen(tls13_cert_client_verify_context)))
971cca6fc52SDaniel Fojt goto err;
972cca6fc52SDaniel Fojt if (!CBB_add_u8(&cbb, 0))
973cca6fc52SDaniel Fojt goto err;
974*de0e0e4dSAntonio Huete Jimenez if (!CBB_add_bytes(&cbb, ctx->hs->tls13.transcript_hash,
975*de0e0e4dSAntonio Huete Jimenez ctx->hs->tls13.transcript_hash_len))
976cca6fc52SDaniel Fojt goto err;
977cca6fc52SDaniel Fojt if (!CBB_finish(&cbb, &sig_content, &sig_content_len))
978cca6fc52SDaniel Fojt goto err;
979cca6fc52SDaniel Fojt
980*de0e0e4dSAntonio Huete Jimenez if ((cert = ctx->ssl->session->peer_cert) == NULL)
981cca6fc52SDaniel Fojt goto err;
982cca6fc52SDaniel Fojt if ((pkey = X509_get0_pubkey(cert)) == NULL)
983cca6fc52SDaniel Fojt goto err;
984*de0e0e4dSAntonio Huete Jimenez if ((sigalg = ssl_sigalg_for_peer(ctx->ssl, pkey,
985*de0e0e4dSAntonio Huete Jimenez signature_scheme)) == NULL)
986cca6fc52SDaniel Fojt goto err;
987*de0e0e4dSAntonio Huete Jimenez ctx->hs->peer_sigalg = sigalg;
988cca6fc52SDaniel Fojt
989cca6fc52SDaniel Fojt if (CBS_len(&signature) > EVP_PKEY_size(pkey))
990cca6fc52SDaniel Fojt goto err;
991cca6fc52SDaniel Fojt
992cca6fc52SDaniel Fojt if ((mdctx = EVP_MD_CTX_new()) == NULL)
993cca6fc52SDaniel Fojt goto err;
994cca6fc52SDaniel Fojt if (!EVP_DigestVerifyInit(mdctx, &pctx, sigalg->md(), NULL, pkey))
995cca6fc52SDaniel Fojt goto err;
996cca6fc52SDaniel Fojt if (sigalg->flags & SIGALG_FLAG_RSA_PSS) {
997cca6fc52SDaniel Fojt if (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING))
998cca6fc52SDaniel Fojt goto err;
999cca6fc52SDaniel Fojt if (!EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))
1000cca6fc52SDaniel Fojt goto err;
1001cca6fc52SDaniel Fojt }
1002cca6fc52SDaniel Fojt if (!EVP_DigestVerifyUpdate(mdctx, sig_content, sig_content_len)) {
10038edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_DECRYPT_ERROR;
1004cca6fc52SDaniel Fojt goto err;
1005cca6fc52SDaniel Fojt }
1006cca6fc52SDaniel Fojt if (EVP_DigestVerifyFinal(mdctx, CBS_data(&signature),
1007cca6fc52SDaniel Fojt CBS_len(&signature)) <= 0) {
10088edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_DECRYPT_ERROR;
1009cca6fc52SDaniel Fojt goto err;
1010cca6fc52SDaniel Fojt }
1011cca6fc52SDaniel Fojt
1012cca6fc52SDaniel Fojt ret = 1;
1013cca6fc52SDaniel Fojt
1014cca6fc52SDaniel Fojt err:
10158edacedfSDaniel Fojt if (!ret && ctx->alert == 0)
10168edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_DECODE_ERROR;
10178edacedfSDaniel Fojt
1018cca6fc52SDaniel Fojt CBB_cleanup(&cbb);
1019cca6fc52SDaniel Fojt EVP_MD_CTX_free(mdctx);
1020cca6fc52SDaniel Fojt free(sig_content);
1021cca6fc52SDaniel Fojt
1022cca6fc52SDaniel Fojt return ret;
1023cca6fc52SDaniel Fojt }
1024cca6fc52SDaniel Fojt
1025cca6fc52SDaniel Fojt int
tls13_client_end_of_early_data_recv(struct tls13_ctx * ctx,CBS * cbs)1026cca6fc52SDaniel Fojt tls13_client_end_of_early_data_recv(struct tls13_ctx *ctx, CBS *cbs)
1027cca6fc52SDaniel Fojt {
1028cca6fc52SDaniel Fojt return 0;
1029cca6fc52SDaniel Fojt }
1030cca6fc52SDaniel Fojt
1031cca6fc52SDaniel Fojt int
tls13_client_finished_recv(struct tls13_ctx * ctx,CBS * cbs)1032cca6fc52SDaniel Fojt tls13_client_finished_recv(struct tls13_ctx *ctx, CBS *cbs)
1033cca6fc52SDaniel Fojt {
1034*de0e0e4dSAntonio Huete Jimenez struct tls13_secrets *secrets = ctx->hs->tls13.secrets;
1035cca6fc52SDaniel Fojt struct tls13_secret context = { .data = "", .len = 0 };
1036cca6fc52SDaniel Fojt struct tls13_secret finished_key;
1037cca6fc52SDaniel Fojt uint8_t *verify_data = NULL;
1038cca6fc52SDaniel Fojt size_t verify_data_len;
1039cca6fc52SDaniel Fojt uint8_t key[EVP_MAX_MD_SIZE];
1040cca6fc52SDaniel Fojt HMAC_CTX *hmac_ctx = NULL;
1041cca6fc52SDaniel Fojt unsigned int hlen;
1042cca6fc52SDaniel Fojt int ret = 0;
1043cca6fc52SDaniel Fojt
1044cca6fc52SDaniel Fojt /*
1045cca6fc52SDaniel Fojt * Verify client finished.
1046cca6fc52SDaniel Fojt */
1047cca6fc52SDaniel Fojt finished_key.data = key;
1048cca6fc52SDaniel Fojt finished_key.len = EVP_MD_size(ctx->hash);
1049cca6fc52SDaniel Fojt
1050cca6fc52SDaniel Fojt if (!tls13_hkdf_expand_label(&finished_key, ctx->hash,
1051cca6fc52SDaniel Fojt &secrets->client_handshake_traffic, "finished",
1052cca6fc52SDaniel Fojt &context))
1053cca6fc52SDaniel Fojt goto err;
1054cca6fc52SDaniel Fojt
1055cca6fc52SDaniel Fojt if ((hmac_ctx = HMAC_CTX_new()) == NULL)
1056cca6fc52SDaniel Fojt goto err;
1057cca6fc52SDaniel Fojt if (!HMAC_Init_ex(hmac_ctx, finished_key.data, finished_key.len,
1058cca6fc52SDaniel Fojt ctx->hash, NULL))
1059cca6fc52SDaniel Fojt goto err;
1060*de0e0e4dSAntonio Huete Jimenez if (!HMAC_Update(hmac_ctx, ctx->hs->tls13.transcript_hash,
1061*de0e0e4dSAntonio Huete Jimenez ctx->hs->tls13.transcript_hash_len))
1062cca6fc52SDaniel Fojt goto err;
1063cca6fc52SDaniel Fojt verify_data_len = HMAC_size(hmac_ctx);
1064cca6fc52SDaniel Fojt if ((verify_data = calloc(1, verify_data_len)) == NULL)
1065cca6fc52SDaniel Fojt goto err;
1066cca6fc52SDaniel Fojt if (!HMAC_Final(hmac_ctx, verify_data, &hlen))
1067cca6fc52SDaniel Fojt goto err;
1068cca6fc52SDaniel Fojt if (hlen != verify_data_len)
1069cca6fc52SDaniel Fojt goto err;
1070cca6fc52SDaniel Fojt
1071cca6fc52SDaniel Fojt if (!CBS_mem_equal(cbs, verify_data, verify_data_len)) {
10728edacedfSDaniel Fojt ctx->alert = TLS13_ALERT_DECRYPT_ERROR;
1073cca6fc52SDaniel Fojt goto err;
1074cca6fc52SDaniel Fojt }
1075cca6fc52SDaniel Fojt
1076*de0e0e4dSAntonio Huete Jimenez if (!CBS_write_bytes(cbs, ctx->hs->peer_finished,
1077*de0e0e4dSAntonio Huete Jimenez sizeof(ctx->hs->peer_finished),
1078*de0e0e4dSAntonio Huete Jimenez &ctx->hs->peer_finished_len))
1079*de0e0e4dSAntonio Huete Jimenez goto err;
1080*de0e0e4dSAntonio Huete Jimenez
1081cca6fc52SDaniel Fojt if (!CBS_skip(cbs, verify_data_len))
1082cca6fc52SDaniel Fojt goto err;
1083cca6fc52SDaniel Fojt
1084cca6fc52SDaniel Fojt /*
1085cca6fc52SDaniel Fojt * Any records following the client finished message must be encrypted
1086cca6fc52SDaniel Fojt * using the client application traffic keys.
1087cca6fc52SDaniel Fojt */
1088cca6fc52SDaniel Fojt if (!tls13_record_layer_set_read_traffic_key(ctx->rl,
1089*de0e0e4dSAntonio Huete Jimenez &secrets->client_application_traffic, ssl_encryption_application))
1090cca6fc52SDaniel Fojt goto err;
1091cca6fc52SDaniel Fojt
1092cca6fc52SDaniel Fojt tls13_record_layer_allow_ccs(ctx->rl, 0);
1093cca6fc52SDaniel Fojt
1094cca6fc52SDaniel Fojt ret = 1;
1095cca6fc52SDaniel Fojt
1096cca6fc52SDaniel Fojt err:
1097cca6fc52SDaniel Fojt HMAC_CTX_free(hmac_ctx);
1098cca6fc52SDaniel Fojt free(verify_data);
1099cca6fc52SDaniel Fojt
1100cca6fc52SDaniel Fojt return ret;
1101cca6fc52SDaniel Fojt }
1102