blob: 44525dd153d5ecfcf1053f6ca1724ff9fbb33117 [file] [log] [blame]
Jerry Yu65dd2cc2021-08-18 16:38:40 +08001/*
2 * TLS 1.3 functionality shared between client and server
3 *
4 * Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +00005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Jerry Yu65dd2cc2021-08-18 16:38:40 +08006 */
7
Harry Ramsey0f6bc412024-10-04 10:36:54 +01008#include "ssl_misc.h"
Jerry Yu65dd2cc2021-08-18 16:38:40 +08009
Jerry Yufb4b6472022-01-27 15:03:26 +080010#if defined(MBEDTLS_SSL_TLS_C) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu65dd2cc2021-08-18 16:38:40 +080011
Jerry Yu30b071c2021-09-12 20:16:03 +080012#include <string.h>
13
Jerry Yuc8a392c2021-08-18 16:46:28 +080014#include "mbedtls/error.h"
Valerio Settib4f50762024-01-17 10:24:52 +010015#include "debug_internal.h"
Jerry Yu30b071c2021-09-12 20:16:03 +080016#include "mbedtls/oid.h"
17#include "mbedtls/platform.h"
Gabor Mezei685472b2021-11-24 11:17:36 +010018#include "mbedtls/constant_time.h"
Jerry Yu141bbe72022-12-01 20:30:41 +080019#include "psa/crypto.h"
Valerio Setti384fbde2024-01-02 13:26:40 +010020#include "mbedtls/psa_util.h"
Jerry Yuc8a392c2021-08-18 16:46:28 +080021
Ronald Crone3dac4a2022-06-10 17:21:51 +020022#include "ssl_tls13_invasive.h"
Jerry Yu30b071c2021-09-12 20:16:03 +080023#include "ssl_tls13_keys.h"
Jerry Yu67eced02022-02-25 13:37:36 +080024#include "ssl_debug_helpers.h"
Jerry Yu65dd2cc2021-08-18 16:38:40 +080025
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050026#include "psa/crypto.h"
Manuel Pégourié-Gonnard2be8c632023-06-07 13:07:21 +020027#include "psa_util_internal.h"
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050028
Valerio Settic9ae8622023-07-25 11:23:50 +020029#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040030/* Define a local translating function to save code size by not using too many
31 * arguments in each translating place. */
32static int local_err_translation(psa_status_t status)
33{
34 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040035 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040036 psa_generic_status_to_mbedtls);
37}
38#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kureka6033ac2023-05-30 15:16:34 -040039#endif
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050040
Jerry Yufbe3e642022-04-25 19:31:51 +080041const uint8_t mbedtls_ssl_tls13_hello_retry_request_magic[
Gilles Peskine449bd832023-01-11 14:50:10 +010042 MBEDTLS_SERVER_HELLO_RANDOM_LEN] =
43{ 0xCF, 0x21, 0xAD, 0x74, 0xE5, 0x9A, 0x61, 0x11,
44 0xBE, 0x1D, 0x8C, 0x02, 0x1E, 0x65, 0xB8, 0x91,
45 0xC2, 0xA2, 0x11, 0x16, 0x7A, 0xBB, 0x8C, 0x5E,
46 0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C };
Jerry Yu93a13f22022-04-11 23:00:01 +080047
Gilles Peskine449bd832023-01-11 14:50:10 +010048int mbedtls_ssl_tls13_fetch_handshake_msg(mbedtls_ssl_context *ssl,
49 unsigned hs_type,
50 unsigned char **buf,
51 size_t *buf_len)
XiaokangQian6b226b02021-09-24 07:51:16 +000052{
53 int ret;
54
Gilles Peskine449bd832023-01-11 14:50:10 +010055 if ((ret = mbedtls_ssl_read_record(ssl, 0)) != 0) {
56 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
XiaokangQian6b226b02021-09-24 07:51:16 +000057 goto cleanup;
58 }
59
Gilles Peskine449bd832023-01-11 14:50:10 +010060 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
61 ssl->in_msg[0] != hs_type) {
62 MBEDTLS_SSL_DEBUG_MSG(1, ("Receive unexpected handshake message."));
63 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
64 MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
XiaokangQian6b226b02021-09-24 07:51:16 +000065 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
66 goto cleanup;
67 }
68
XiaokangQian05420b12021-09-29 08:46:37 +000069 /*
70 * Jump handshake header (4 bytes, see Section 4 of RFC 8446).
71 * ...
72 * HandshakeType msg_type;
73 * uint24 length;
74 * ...
75 */
Xiaofei Baieef15042021-11-18 07:29:56 +000076 *buf = ssl->in_msg + 4;
77 *buf_len = ssl->in_hslen - 4;
XiaokangQian6b226b02021-09-24 07:51:16 +000078
XiaokangQian6b226b02021-09-24 07:51:16 +000079cleanup:
80
Gilles Peskine449bd832023-01-11 14:50:10 +010081 return ret;
XiaokangQian6b226b02021-09-24 07:51:16 +000082}
83
Ronald Cron47dce632023-02-08 17:38:29 +010084int mbedtls_ssl_tls13_is_supported_versions_ext_present_in_exts(
85 mbedtls_ssl_context *ssl,
86 const unsigned char *buf, const unsigned char *end,
Ronald Croneff56732023-04-03 17:36:31 +020087 const unsigned char **supported_versions_data,
88 const unsigned char **supported_versions_data_end)
Ronald Cron47dce632023-02-08 17:38:29 +010089{
90 const unsigned char *p = buf;
91 size_t extensions_len;
92 const unsigned char *extensions_end;
93
Ronald Croneff56732023-04-03 17:36:31 +020094 *supported_versions_data = NULL;
95 *supported_versions_data_end = NULL;
Ronald Cron47dce632023-02-08 17:38:29 +010096
97 /* Case of no extension */
98 if (p == end) {
99 return 0;
100 }
101
102 /* ...
103 * Extension extensions<x..2^16-1>;
104 * ...
105 * struct {
106 * ExtensionType extension_type; (2 bytes)
107 * opaque extension_data<0..2^16-1>;
108 * } Extension;
109 */
110 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
111 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
112 p += 2;
113
114 /* Check extensions do not go beyond the buffer of data. */
115 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
116 extensions_end = p + extensions_len;
117
118 while (p < extensions_end) {
119 unsigned int extension_type;
120 size_t extension_data_len;
121
122 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
123 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
124 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
125 p += 4;
126 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
127
128 if (extension_type == MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS) {
Ronald Croneff56732023-04-03 17:36:31 +0200129 *supported_versions_data = p;
130 *supported_versions_data_end = p + extension_data_len;
Ronald Cron47dce632023-02-08 17:38:29 +0100131 return 1;
132 }
133 p += extension_data_len;
134 }
135
136 return 0;
137}
138
Ronald Cron928cbd32022-10-04 16:14:26 +0200139#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu30b071c2021-09-12 20:16:03 +0800140/*
Jerry Yu30b071c2021-09-12 20:16:03 +0800141 * STATE HANDLING: Read CertificateVerify
142 */
Jerry Yud0fc5852021-10-29 11:09:06 +0800143/* Macro to express the maximum length of the verify structure.
Jerry Yu30b071c2021-09-12 20:16:03 +0800144 *
145 * The structure is computed per TLS 1.3 specification as:
146 * - 64 bytes of octet 32,
147 * - 33 bytes for the context string
148 * (which is either "TLS 1.3, client CertificateVerify"
149 * or "TLS 1.3, server CertificateVerify"),
Jerry Yud0fc5852021-10-29 11:09:06 +0800150 * - 1 byte for the octet 0x0, which serves as a separator,
Jerry Yu30b071c2021-09-12 20:16:03 +0800151 * - 32 or 48 bytes for the Transcript-Hash(Handshake Context, Certificate)
152 * (depending on the size of the transcript_hash)
153 *
154 * This results in a total size of
155 * - 130 bytes for a SHA256-based transcript hash, or
156 * (64 + 33 + 1 + 32 bytes)
157 * - 146 bytes for a SHA384-based transcript hash.
158 * (64 + 33 + 1 + 48 bytes)
159 *
160 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100161#define SSL_VERIFY_STRUCT_MAX_SIZE (64 + \
162 33 + \
163 1 + \
164 MBEDTLS_TLS1_3_MD_MAX_SIZE \
165 )
Jerry Yu30b071c2021-09-12 20:16:03 +0800166
Jerry Yu0b32c502021-10-28 13:41:59 +0800167/*
168 * The ssl_tls13_create_verify_structure() creates the verify structure.
169 * As input, it requires the transcript hash.
170 *
171 * The caller has to ensure that the buffer has size at least
172 * SSL_VERIFY_STRUCT_MAX_SIZE bytes.
173 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100174static void ssl_tls13_create_verify_structure(const unsigned char *transcript_hash,
175 size_t transcript_hash_len,
176 unsigned char *verify_buffer,
177 size_t *verify_buffer_len,
178 int from)
Jerry Yu0b32c502021-10-28 13:41:59 +0800179{
180 size_t idx;
Jerry Yu30b071c2021-09-12 20:16:03 +0800181
Jerry Yu0b32c502021-10-28 13:41:59 +0800182 /* RFC 8446, Section 4.4.3:
183 *
184 * The digital signature [in the CertificateVerify message] is then
185 * computed over the concatenation of:
186 * - A string that consists of octet 32 (0x20) repeated 64 times
187 * - The context string
188 * - A single 0 byte which serves as the separator
189 * - The content to be signed
190 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 memset(verify_buffer, 0x20, 64);
Jerry Yu0b32c502021-10-28 13:41:59 +0800192 idx = 64;
193
Gilles Peskine449bd832023-01-11 14:50:10 +0100194 if (from == MBEDTLS_SSL_IS_CLIENT) {
Tom Cosgrovea2c45dc2024-04-02 14:26:13 +0100195 memcpy(verify_buffer + idx, mbedtls_ssl_tls13_labels.client_cv,
196 MBEDTLS_SSL_TLS1_3_LBL_LEN(client_cv));
Gilles Peskine449bd832023-01-11 14:50:10 +0100197 idx += MBEDTLS_SSL_TLS1_3_LBL_LEN(client_cv);
198 } else { /* from == MBEDTLS_SSL_IS_SERVER */
Tom Cosgrovea2c45dc2024-04-02 14:26:13 +0100199 memcpy(verify_buffer + idx, mbedtls_ssl_tls13_labels.server_cv,
200 MBEDTLS_SSL_TLS1_3_LBL_LEN(server_cv));
Gilles Peskine449bd832023-01-11 14:50:10 +0100201 idx += MBEDTLS_SSL_TLS1_3_LBL_LEN(server_cv);
Jerry Yu0b32c502021-10-28 13:41:59 +0800202 }
203
204 verify_buffer[idx++] = 0x0;
205
Gilles Peskine449bd832023-01-11 14:50:10 +0100206 memcpy(verify_buffer + idx, transcript_hash, transcript_hash_len);
Jerry Yu0b32c502021-10-28 13:41:59 +0800207 idx += transcript_hash_len;
208
209 *verify_buffer_len = idx;
210}
211
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200212MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100213static int ssl_tls13_parse_certificate_verify(mbedtls_ssl_context *ssl,
214 const unsigned char *buf,
215 const unsigned char *end,
216 const unsigned char *verify_buffer,
217 size_t verify_buffer_len)
Jerry Yu30b071c2021-09-12 20:16:03 +0800218{
219 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
pespaceka1378102022-04-26 15:03:11 +0200220 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Jerry Yu30b071c2021-09-12 20:16:03 +0800221 const unsigned char *p = buf;
222 uint16_t algorithm;
Jerry Yu30b071c2021-09-12 20:16:03 +0800223 size_t signature_len;
224 mbedtls_pk_type_t sig_alg;
225 mbedtls_md_type_t md_alg;
pespaceka1378102022-04-26 15:03:11 +0200226 psa_algorithm_t hash_alg = PSA_ALG_NONE;
227 unsigned char verify_hash[PSA_HASH_MAX_SIZE];
Jerry Yu30b071c2021-09-12 20:16:03 +0800228 size_t verify_hash_len;
229
230 /*
231 * struct {
232 * SignatureScheme algorithm;
233 * opaque signature<0..2^16-1>;
234 * } CertificateVerify;
235 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
237 algorithm = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yu30b071c2021-09-12 20:16:03 +0800238 p += 2;
239
240 /* RFC 8446 section 4.4.3
241 *
Xiaokang Qian73437382023-03-29 08:24:12 +0000242 * If the CertificateVerify message is sent by a server, the signature
243 * algorithm MUST be one offered in the client's "signature_algorithms"
244 * extension unless no valid certificate chain can be produced without
245 * unsupported algorithms
Jerry Yu30b071c2021-09-12 20:16:03 +0800246 *
247 * RFC 8446 section 4.4.2.2
248 *
249 * If the client cannot construct an acceptable chain using the provided
Xiaokang Qian73437382023-03-29 08:24:12 +0000250 * certificates and decides to abort the handshake, then it MUST abort the
251 * handshake with an appropriate certificate-related alert
252 * (by default, "unsupported_certificate").
Jerry Yu30b071c2021-09-12 20:16:03 +0800253 *
Jerry Yu6f87f252021-10-29 20:12:51 +0800254 * Check if algorithm is an offered signature algorithm.
Jerry Yu30b071c2021-09-12 20:16:03 +0800255 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100256 if (!mbedtls_ssl_sig_alg_is_offered(ssl, algorithm)) {
Jerry Yu982d9e52021-10-14 15:59:37 +0800257 /* algorithm not in offered signature algorithms list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100258 MBEDTLS_SSL_DEBUG_MSG(1, ("Received signature algorithm(%04x) is not "
259 "offered.",
260 (unsigned int) algorithm));
Jerry Yu6f87f252021-10-29 20:12:51 +0800261 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800262 }
263
Gilles Peskine449bd832023-01-11 14:50:10 +0100264 if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
265 algorithm, &sig_alg, &md_alg) != 0) {
Jerry Yu8c338862022-03-23 13:34:04 +0800266 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800267 }
268
Manuel Pégourié-Gonnard2d6d9932023-03-28 11:38:08 +0200269 hash_alg = mbedtls_md_psa_alg_from_type(md_alg);
Gilles Peskine449bd832023-01-11 14:50:10 +0100270 if (hash_alg == 0) {
pespaceka1378102022-04-26 15:03:11 +0200271 goto error;
272 }
273
Gilles Peskine449bd832023-01-11 14:50:10 +0100274 MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate Verify: Signature algorithm ( %04x )",
275 (unsigned int) algorithm));
Jerry Yu30b071c2021-09-12 20:16:03 +0800276
277 /*
278 * Check the certificate's key type matches the signature alg
279 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100280 if (!mbedtls_pk_can_do(&ssl->session_negotiate->peer_cert->pk, sig_alg)) {
281 MBEDTLS_SSL_DEBUG_MSG(1, ("signature algorithm doesn't match cert key"));
Jerry Yu6f87f252021-10-29 20:12:51 +0800282 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800283 }
284
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
286 signature_len = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yu30b071c2021-09-12 20:16:03 +0800287 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100288 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, signature_len);
Jerry Yu30b071c2021-09-12 20:16:03 +0800289
Gilles Peskine449bd832023-01-11 14:50:10 +0100290 status = psa_hash_compute(hash_alg,
291 verify_buffer,
292 verify_buffer_len,
293 verify_hash,
294 sizeof(verify_hash),
295 &verify_hash_len);
296 if (status != PSA_SUCCESS) {
297 MBEDTLS_SSL_DEBUG_RET(1, "hash computation PSA error", status);
Jerry Yu6f87f252021-10-29 20:12:51 +0800298 goto error;
Jerry Yu133690c2021-10-25 14:01:13 +0800299 }
300
Gilles Peskine449bd832023-01-11 14:50:10 +0100301 MBEDTLS_SSL_DEBUG_BUF(3, "verify hash", verify_hash, verify_hash_len);
Przemek Stekiel6a5e0182022-06-27 11:53:13 +0200302
Valerio Setti7f6f4e62025-04-23 11:29:51 +0200303 if ((ret = mbedtls_pk_verify_ext(sig_alg, NULL,
Gilles Peskine449bd832023-01-11 14:50:10 +0100304 &ssl->session_negotiate->peer_cert->pk,
305 md_alg, verify_hash, verify_hash_len,
306 p, signature_len)) == 0) {
307 return 0;
Jerry Yu30b071c2021-09-12 20:16:03 +0800308 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100309 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify_ext", ret);
Jerry Yu30b071c2021-09-12 20:16:03 +0800310
Jerry Yu6f87f252021-10-29 20:12:51 +0800311error:
312 /* RFC 8446 section 4.4.3
313 *
314 * If the verification fails, the receiver MUST terminate the handshake
315 * with a "decrypt_error" alert.
Gilles Peskine449bd832023-01-11 14:50:10 +0100316 */
317 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
318 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
319 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu6f87f252021-10-29 20:12:51 +0800320
Jerry Yu30b071c2021-09-12 20:16:03 +0800321}
Ronald Cron928cbd32022-10-04 16:14:26 +0200322#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu30b071c2021-09-12 20:16:03 +0800323
Gilles Peskine449bd832023-01-11 14:50:10 +0100324int mbedtls_ssl_tls13_process_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu30b071c2021-09-12 20:16:03 +0800325{
Jerry Yu30b071c2021-09-12 20:16:03 +0800326
Ronald Cron928cbd32022-10-04 16:14:26 +0200327#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yuda8cdf22021-10-25 15:06:49 +0800328 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
329 unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
330 size_t verify_buffer_len;
331 unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
332 size_t transcript_len;
333 unsigned char *buf;
334 size_t buf_len;
335
Gilles Peskine449bd832023-01-11 14:50:10 +0100336 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Jerry Yu30b071c2021-09-12 20:16:03 +0800337
Jerry Yuda8cdf22021-10-25 15:06:49 +0800338 MBEDTLS_SSL_PROC_CHK(
Xiaokang Qian73437382023-03-29 08:24:12 +0000339 mbedtls_ssl_tls13_fetch_handshake_msg(
340 ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, &buf, &buf_len));
Jerry Yu30b071c2021-09-12 20:16:03 +0800341
Jerry Yuda8cdf22021-10-25 15:06:49 +0800342 /* Need to calculate the hash of the transcript first
Jerry Yu0b32c502021-10-28 13:41:59 +0800343 * before reading the message since otherwise it gets
344 * included in the transcript
345 */
Xiaokang Qian73437382023-03-29 08:24:12 +0000346 ret = mbedtls_ssl_get_handshake_transcript(
347 ssl,
Dave Rodgman2eab4622023-10-05 13:30:37 +0100348 (mbedtls_md_type_t) ssl->handshake->ciphersuite_info->mac,
Xiaokang Qian73437382023-03-29 08:24:12 +0000349 transcript, sizeof(transcript),
350 &transcript_len);
Gilles Peskine449bd832023-01-11 14:50:10 +0100351 if (ret != 0) {
Jerry Yuda8cdf22021-10-25 15:06:49 +0800352 MBEDTLS_SSL_PEND_FATAL_ALERT(
353 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
Gilles Peskine449bd832023-01-11 14:50:10 +0100354 MBEDTLS_ERR_SSL_INTERNAL_ERROR);
355 return ret;
Jerry Yu30b071c2021-09-12 20:16:03 +0800356 }
357
Gilles Peskine449bd832023-01-11 14:50:10 +0100358 MBEDTLS_SSL_DEBUG_BUF(3, "handshake hash", transcript, transcript_len);
Jerry Yuda8cdf22021-10-25 15:06:49 +0800359
360 /* Create verify structure */
Gilles Peskine449bd832023-01-11 14:50:10 +0100361 ssl_tls13_create_verify_structure(transcript,
362 transcript_len,
363 verify_buffer,
364 &verify_buffer_len,
365 (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) ?
366 MBEDTLS_SSL_IS_SERVER :
367 MBEDTLS_SSL_IS_CLIENT);
Jerry Yuda8cdf22021-10-25 15:06:49 +0800368
369 /* Process the message contents */
Xiaokang Qian73437382023-03-29 08:24:12 +0000370 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_certificate_verify(
371 ssl, buf, buf + buf_len,
372 verify_buffer, verify_buffer_len));
Jerry Yuda8cdf22021-10-25 15:06:49 +0800373
Xiaokang Qian73437382023-03-29 08:24:12 +0000374 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
375 ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
376 buf, buf_len));
Jerry Yu30b071c2021-09-12 20:16:03 +0800377
378cleanup:
379
Gilles Peskine449bd832023-01-11 14:50:10 +0100380 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
381 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_process_certificate_verify", ret);
382 return ret;
Jerry Yuda8cdf22021-10-25 15:06:49 +0800383#else
384 ((void) ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +0100385 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
386 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Ronald Cron928cbd32022-10-04 16:14:26 +0200387#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu30b071c2021-09-12 20:16:03 +0800388}
389
390/*
Xiaofei Bai947571e2021-09-29 09:12:03 +0000391 *
XiaokangQian6b916b12022-04-25 07:29:34 +0000392 * STATE HANDLING: Incoming Certificate.
Xiaofei Bai947571e2021-09-29 09:12:03 +0000393 *
394 */
395
Ronald Cronde08cf32022-10-04 17:15:35 +0200396#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000397#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
398/*
399 * Structure of Certificate message:
400 *
401 * enum {
402 * X509(0),
403 * RawPublicKey(2),
404 * (255)
405 * } CertificateType;
406 *
407 * struct {
408 * select (certificate_type) {
409 * case RawPublicKey:
410 * * From RFC 7250 ASN.1_subjectPublicKeyInfo *
411 * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
412 * case X509:
413 * opaque cert_data<1..2^24-1>;
414 * };
415 * Extension extensions<0..2^16-1>;
416 * } CertificateEntry;
417 *
418 * struct {
419 * opaque certificate_request_context<0..2^8-1>;
420 * CertificateEntry certificate_list<0..2^24-1>;
421 * } Certificate;
422 *
423 */
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000424
425/* Parse certificate chain send by the server. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200426MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Crone3dac4a2022-06-10 17:21:51 +0200427MBEDTLS_STATIC_TESTABLE
Gilles Peskine449bd832023-01-11 14:50:10 +0100428int mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context *ssl,
429 const unsigned char *buf,
430 const unsigned char *end)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000431{
432 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
433 size_t certificate_request_context_len = 0;
434 size_t certificate_list_len = 0;
435 const unsigned char *p = buf;
436 const unsigned char *certificate_list_end;
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800437 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000438
Gilles Peskine449bd832023-01-11 14:50:10 +0100439 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 4);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000440 certificate_request_context_len = p[0];
Gilles Peskine449bd832023-01-11 14:50:10 +0100441 certificate_list_len = MBEDTLS_GET_UINT24_BE(p, 1);
XiaokangQian63e713e2022-05-15 04:26:57 +0000442 p += 4;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000443
444 /* In theory, the certificate list can be up to 2^24 Bytes, but we don't
445 * support anything beyond 2^16 = 64K.
446 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100447 if ((certificate_request_context_len != 0) ||
448 (certificate_list_len >= 0x10000)) {
449 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
450 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
451 MBEDTLS_ERR_SSL_DECODE_ERROR);
452 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000453 }
454
455 /* In case we tried to reuse a session but it failed */
Gilles Peskine449bd832023-01-11 14:50:10 +0100456 if (ssl->session_negotiate->peer_cert != NULL) {
457 mbedtls_x509_crt_free(ssl->session_negotiate->peer_cert);
458 mbedtls_free(ssl->session_negotiate->peer_cert);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000459 }
460
Manuel Pégourié-Gonnardaefc5932024-08-12 10:36:40 +0200461 /* This is used by ssl_tls13_validate_certificate() */
Gilles Peskine449bd832023-01-11 14:50:10 +0100462 if (certificate_list_len == 0) {
XiaokangQianc3017f62022-05-13 05:55:41 +0000463 ssl->session_negotiate->peer_cert = NULL;
464 ret = 0;
465 goto exit;
466 }
467
Gilles Peskine449bd832023-01-11 14:50:10 +0100468 if ((ssl->session_negotiate->peer_cert =
469 mbedtls_calloc(1, sizeof(mbedtls_x509_crt))) == NULL) {
470 MBEDTLS_SSL_DEBUG_MSG(1, ("alloc( %" MBEDTLS_PRINTF_SIZET " bytes ) failed",
471 sizeof(mbedtls_x509_crt)));
472 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
473 MBEDTLS_ERR_SSL_ALLOC_FAILED);
474 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000475 }
476
Gilles Peskine449bd832023-01-11 14:50:10 +0100477 mbedtls_x509_crt_init(ssl->session_negotiate->peer_cert);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000478
Gilles Peskine449bd832023-01-11 14:50:10 +0100479 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, certificate_list_len);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000480 certificate_list_end = p + certificate_list_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100481 while (p < certificate_list_end) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000482 size_t cert_data_len, extensions_len;
Jerry Yu2eaa7602022-08-04 17:28:15 +0800483 const unsigned char *extensions_end;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000484
Gilles Peskine449bd832023-01-11 14:50:10 +0100485 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, 3);
486 cert_data_len = MBEDTLS_GET_UINT24_BE(p, 0);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000487 p += 3;
488
489 /* In theory, the CRT can be up to 2^24 Bytes, but we don't support
490 * anything beyond 2^16 = 64K. Otherwise as in the TLS 1.2 code,
491 * check that we have a minimum of 128 bytes of data, this is not
492 * clear why we need that though.
493 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100494 if ((cert_data_len < 128) || (cert_data_len >= 0x10000)) {
495 MBEDTLS_SSL_DEBUG_MSG(1, ("bad Certificate message"));
496 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
497 MBEDTLS_ERR_SSL_DECODE_ERROR);
498 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000499 }
500
Gilles Peskine449bd832023-01-11 14:50:10 +0100501 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, cert_data_len);
502 ret = mbedtls_x509_crt_parse_der(ssl->session_negotiate->peer_cert,
503 p, cert_data_len);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000504
Gilles Peskine449bd832023-01-11 14:50:10 +0100505 switch (ret) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000506 case 0: /*ok*/
507 break;
Gilles Peskine4c832212025-05-07 23:05:12 +0200508 case MBEDTLS_ERR_X509_UNKNOWN_OID:
Xiaofei Bai947571e2021-09-29 09:12:03 +0000509 /* Ignore certificate with an unknown algorithm: maybe a
510 prior certificate was already trusted. */
511 break;
512
513 case MBEDTLS_ERR_X509_ALLOC_FAILED:
Gilles Peskine449bd832023-01-11 14:50:10 +0100514 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
515 MBEDTLS_ERR_X509_ALLOC_FAILED);
516 MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
517 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000518
519 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
Gilles Peskine449bd832023-01-11 14:50:10 +0100520 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT,
521 MBEDTLS_ERR_X509_UNKNOWN_VERSION);
522 MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
523 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000524
525 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100526 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_BAD_CERT,
527 ret);
528 MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
529 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000530 }
531
532 p += cert_data_len;
533
534 /* Certificate extensions length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100535 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, 2);
536 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000537 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100538 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, extensions_len);
Jerry Yu2eaa7602022-08-04 17:28:15 +0800539
540 extensions_end = p + extensions_len;
Jerry Yu0d5cfb72022-10-31 14:15:48 +0800541 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu2eaa7602022-08-04 17:28:15 +0800542
Gilles Peskine449bd832023-01-11 14:50:10 +0100543 while (p < extensions_end) {
Jerry Yu2eaa7602022-08-04 17:28:15 +0800544 unsigned int extension_type;
545 size_t extension_data_len;
546
547 /*
Gilles Peskine449bd832023-01-11 14:50:10 +0100548 * struct {
549 * ExtensionType extension_type; (2 bytes)
550 * opaque extension_data<0..2^16-1>;
551 * } Extension;
552 */
553 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
554 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
555 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
Jerry Yu2eaa7602022-08-04 17:28:15 +0800556 p += 4;
557
Gilles Peskine449bd832023-01-11 14:50:10 +0100558 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
Jerry Yu2eaa7602022-08-04 17:28:15 +0800559
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800560 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +0100561 ssl, MBEDTLS_SSL_HS_CERTIFICATE, extension_type,
562 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CT);
563 if (ret != 0) {
564 return ret;
565 }
Jerry Yu0c354a22022-08-29 15:25:36 +0800566
Gilles Peskine449bd832023-01-11 14:50:10 +0100567 switch (extension_type) {
Jerry Yu2eaa7602022-08-04 17:28:15 +0800568 default:
Jerry Yu79aa7212022-11-08 21:30:21 +0800569 MBEDTLS_SSL_PRINT_EXT(
Jerry Yu0d5cfb72022-10-31 14:15:48 +0800570 3, MBEDTLS_SSL_HS_CERTIFICATE,
Gilles Peskine449bd832023-01-11 14:50:10 +0100571 extension_type, "( ignored )");
Jerry Yu2eaa7602022-08-04 17:28:15 +0800572 break;
573 }
574
575 p += extension_data_len;
576 }
577
Gilles Peskine449bd832023-01-11 14:50:10 +0100578 MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_CERTIFICATE,
579 handshake->received_extensions);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000580 }
581
XiaokangQian63e713e2022-05-15 04:26:57 +0000582exit:
Xiaofei Bai947571e2021-09-29 09:12:03 +0000583 /* Check that all the message is consumed. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100584 if (p != end) {
585 MBEDTLS_SSL_DEBUG_MSG(1, ("bad Certificate message"));
586 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
587 MBEDTLS_ERR_SSL_DECODE_ERROR);
588 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000589 }
590
Xiaokang Qian73437382023-03-29 08:24:12 +0000591 MBEDTLS_SSL_DEBUG_CRT(3, "peer certificate",
592 ssl->session_negotiate->peer_cert);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000593
Gilles Peskine449bd832023-01-11 14:50:10 +0100594 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000595}
596#else
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200597MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Crone3dac4a2022-06-10 17:21:51 +0200598MBEDTLS_STATIC_TESTABLE
Gilles Peskine449bd832023-01-11 14:50:10 +0100599int mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context *ssl,
600 const unsigned char *buf,
601 const unsigned char *end)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000602{
603 ((void) ssl);
604 ((void) buf);
605 ((void) end);
Gilles Peskine449bd832023-01-11 14:50:10 +0100606 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000607}
608#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Ronald Cronde08cf32022-10-04 17:15:35 +0200609#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Xiaofei Bai947571e2021-09-29 09:12:03 +0000610
Ronald Cronde08cf32022-10-04 17:15:35 +0200611#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000612#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000613/* Validate certificate chain sent by the server. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200614MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100615static int ssl_tls13_validate_certificate(mbedtls_ssl_context *ssl)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000616{
Manuel Pégourié-Gonnard58ab9ba2024-08-14 09:47:38 +0200617 /* Authmode: precedence order is SNI if used else configuration */
618#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
619 const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET
620 ? ssl->handshake->sni_authmode
621 : ssl->conf->authmode;
622#else
623 const int authmode = ssl->conf->authmode;
XiaokangQian6b916b12022-04-25 07:29:34 +0000624#endif
625
626 /*
XiaokangQian989f06d2022-05-17 01:50:15 +0000627 * If the peer hasn't sent a certificate ( i.e. it sent
XiaokangQian6b916b12022-04-25 07:29:34 +0000628 * an empty certificate chain ), this is reflected in the peer CRT
629 * structure being unset.
630 * Check for that and handle it depending on the
XiaokangQian989f06d2022-05-17 01:50:15 +0000631 * authentication mode.
XiaokangQian6b916b12022-04-25 07:29:34 +0000632 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100633 if (ssl->session_negotiate->peer_cert == NULL) {
634 MBEDTLS_SSL_DEBUG_MSG(1, ("peer has no certificate"));
XiaokangQian989f06d2022-05-17 01:50:15 +0000635
XiaokangQian63e713e2022-05-15 04:26:57 +0000636#if defined(MBEDTLS_SSL_SRV_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100637 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
XiaokangQian63e713e2022-05-15 04:26:57 +0000638 /* The client was asked for a certificate but didn't send
639 * one. The client should know what's going on, so we
640 * don't send an alert.
641 */
642 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
Gilles Peskine449bd832023-01-11 14:50:10 +0100643 if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL) {
644 return 0;
645 } else {
Xiaokang Qian73437382023-03-29 08:24:12 +0000646 MBEDTLS_SSL_PEND_FATAL_ALERT(
647 MBEDTLS_SSL_ALERT_MSG_NO_CERT,
648 MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE);
Gilles Peskine449bd832023-01-11 14:50:10 +0100649 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
XiaokangQian989f06d2022-05-17 01:50:15 +0000650 }
XiaokangQian63e713e2022-05-15 04:26:57 +0000651 }
XiaokangQian6b916b12022-04-25 07:29:34 +0000652#endif /* MBEDTLS_SSL_SRV_C */
653
XiaokangQianc3017f62022-05-13 05:55:41 +0000654#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnardaefc5932024-08-12 10:36:40 +0200655 /* Regardless of authmode, the server is not allowed to send an empty
656 * certificate chain. (Last paragraph before 4.4.2.1 in RFC 8446: "The
657 * server's certificate_list MUST always be non-empty.") With authmode
658 * optional/none, we continue the handshake if we can't validate the
659 * server's cert, but we still break it if no certificate was sent. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100660 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
661 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_NO_CERT,
662 MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE);
663 return MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE;
XiaokangQian63e713e2022-05-15 04:26:57 +0000664 }
XiaokangQianc3017f62022-05-13 05:55:41 +0000665#endif /* MBEDTLS_SSL_CLI_C */
XiaokangQian63e713e2022-05-15 04:26:57 +0000666 }
XiaokangQian6b916b12022-04-25 07:29:34 +0000667
Manuel Pégourié-Gonnard19dd9f52024-08-16 11:03:42 +0200668 return mbedtls_ssl_verify_certificate(ssl, authmode,
669 ssl->session_negotiate->peer_cert,
670 NULL, NULL);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000671}
672#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200673MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100674static int ssl_tls13_validate_certificate(mbedtls_ssl_context *ssl)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000675{
676 ((void) ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000678}
679#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Ronald Cronde08cf32022-10-04 17:15:35 +0200680#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Xiaofei Bai947571e2021-09-29 09:12:03 +0000681
Gilles Peskine449bd832023-01-11 14:50:10 +0100682int mbedtls_ssl_tls13_process_certificate(mbedtls_ssl_context *ssl)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000683{
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000684 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine449bd832023-01-11 14:50:10 +0100685 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate"));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000686
Ronald Cronde08cf32022-10-04 17:15:35 +0200687#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
XiaokangQianc3017f62022-05-13 05:55:41 +0000688 unsigned char *buf;
689 size_t buf_len;
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000690
Gilles Peskine449bd832023-01-11 14:50:10 +0100691 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
692 ssl, MBEDTLS_SSL_HS_CERTIFICATE,
693 &buf, &buf_len));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000694
XiaokangQianc3017f62022-05-13 05:55:41 +0000695 /* Parse the certificate chain sent by the peer. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100696 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_parse_certificate(ssl, buf,
697 buf + buf_len));
XiaokangQianc3017f62022-05-13 05:55:41 +0000698 /* Validate the certificate chain and set the verification results. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100699 MBEDTLS_SSL_PROC_CHK(ssl_tls13_validate_certificate(ssl));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000700
Xiaokang Qian73437382023-03-29 08:24:12 +0000701 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
702 ssl, MBEDTLS_SSL_HS_CERTIFICATE, buf, buf_len));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000703
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000704cleanup:
Gilles Peskineff2558a2023-09-05 21:10:39 +0200705#else /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
706 (void) ssl;
Ronald Cronde08cf32022-10-04 17:15:35 +0200707#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000708
Gilles Peskine449bd832023-01-11 14:50:10 +0100709 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate"));
710 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000711}
Ronald Cron928cbd32022-10-04 16:14:26 +0200712#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu7399d0d2022-01-30 17:54:19 +0800713/*
714 * enum {
715 * X509(0),
716 * RawPublicKey(2),
717 * (255)
718 * } CertificateType;
719 *
720 * struct {
721 * select (certificate_type) {
722 * case RawPublicKey:
723 * // From RFC 7250 ASN.1_subjectPublicKeyInfo
724 * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
725 *
726 * case X509:
727 * opaque cert_data<1..2^24-1>;
728 * };
729 * Extension extensions<0..2^16-1>;
730 * } CertificateEntry;
731 *
732 * struct {
733 * opaque certificate_request_context<0..2^8-1>;
734 * CertificateEntry certificate_list<0..2^24-1>;
735 * } Certificate;
736 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200737MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100738static int ssl_tls13_write_certificate_body(mbedtls_ssl_context *ssl,
739 unsigned char *buf,
740 unsigned char *end,
741 size_t *out_len)
Jerry Yu5cc35062022-01-28 16:16:08 +0800742{
Gilles Peskine449bd832023-01-11 14:50:10 +0100743 const mbedtls_x509_crt *crt = mbedtls_ssl_own_cert(ssl);
Jerry Yu3e536442022-02-15 11:05:59 +0800744 unsigned char *p = buf;
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800745 unsigned char *certificate_request_context =
Gilles Peskine449bd832023-01-11 14:50:10 +0100746 ssl->handshake->certificate_request_context;
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800747 unsigned char certificate_request_context_len =
Gilles Peskine449bd832023-01-11 14:50:10 +0100748 ssl->handshake->certificate_request_context_len;
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800749 unsigned char *p_certificate_list_len;
Jerry Yu5cc35062022-01-28 16:16:08 +0800750
Jerry Yu5cc35062022-01-28 16:16:08 +0800751
Jerry Yu3391ac02022-02-16 11:21:37 +0800752 /* ...
753 * opaque certificate_request_context<0..2^8-1>;
754 * ...
755 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100756 MBEDTLS_SSL_CHK_BUF_PTR(p, end, certificate_request_context_len + 1);
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800757 *p++ = certificate_request_context_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100758 if (certificate_request_context_len > 0) {
759 memcpy(p, certificate_request_context, certificate_request_context_len);
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800760 p += certificate_request_context_len;
Jerry Yu537530d2022-02-15 14:00:57 +0800761 }
762
Jerry Yu3391ac02022-02-16 11:21:37 +0800763 /* ...
764 * CertificateEntry certificate_list<0..2^24-1>;
765 * ...
766 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100767 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 3);
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800768 p_certificate_list_len = p;
Jerry Yu3e536442022-02-15 11:05:59 +0800769 p += 3;
770
Gilles Peskine449bd832023-01-11 14:50:10 +0100771 MBEDTLS_SSL_DEBUG_CRT(3, "own certificate", crt);
Jerry Yu5cc35062022-01-28 16:16:08 +0800772
Gilles Peskine449bd832023-01-11 14:50:10 +0100773 while (crt != NULL) {
Jerry Yu7399d0d2022-01-30 17:54:19 +0800774 size_t cert_data_len = crt->raw.len;
Jerry Yu5cc35062022-01-28 16:16:08 +0800775
Gilles Peskine449bd832023-01-11 14:50:10 +0100776 MBEDTLS_SSL_CHK_BUF_PTR(p, end, cert_data_len + 3 + 2);
777 MBEDTLS_PUT_UINT24_BE(cert_data_len, p, 0);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800778 p += 3;
Jerry Yu5cc35062022-01-28 16:16:08 +0800779
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 memcpy(p, crt->raw.p, cert_data_len);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800781 p += cert_data_len;
782 crt = crt->next;
Jerry Yu5cc35062022-01-28 16:16:08 +0800783
784 /* Currently, we don't have any certificate extensions defined.
785 * Hence, we are sending an empty extension with length zero.
786 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100787 MBEDTLS_PUT_UINT16_BE(0, p, 0);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800788 p += 2;
Jerry Yu5cc35062022-01-28 16:16:08 +0800789 }
Jerry Yu5cc35062022-01-28 16:16:08 +0800790
Gilles Peskine449bd832023-01-11 14:50:10 +0100791 MBEDTLS_PUT_UINT24_BE(p - p_certificate_list_len - 3,
792 p_certificate_list_len, 0);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800793
Jerry Yu3e536442022-02-15 11:05:59 +0800794 *out_len = p - buf;
Jerry Yu5cc35062022-01-28 16:16:08 +0800795
Jerry Yu7de2ff02022-11-08 21:43:46 +0800796 MBEDTLS_SSL_PRINT_EXTS(
Gilles Peskine449bd832023-01-11 14:50:10 +0100797 3, MBEDTLS_SSL_HS_CERTIFICATE, ssl->handshake->sent_extensions);
Jerry Yu4b8f2f72022-10-31 13:31:22 +0800798
Gilles Peskine449bd832023-01-11 14:50:10 +0100799 return 0;
Jerry Yu5cc35062022-01-28 16:16:08 +0800800}
Jerry Yu5cc35062022-01-28 16:16:08 +0800801
Gilles Peskine449bd832023-01-11 14:50:10 +0100802int mbedtls_ssl_tls13_write_certificate(mbedtls_ssl_context *ssl)
Jerry Yu5cc35062022-01-28 16:16:08 +0800803{
804 int ret;
Ronald Cron5bb8fc82022-03-09 07:00:13 +0100805 unsigned char *buf;
806 size_t buf_len, msg_len;
807
Gilles Peskine449bd832023-01-11 14:50:10 +0100808 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate"));
Jerry Yu5cc35062022-01-28 16:16:08 +0800809
Xiaokang Qian73437382023-03-29 08:24:12 +0000810 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
811 ssl, MBEDTLS_SSL_HS_CERTIFICATE, &buf, &buf_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800812
Gilles Peskine449bd832023-01-11 14:50:10 +0100813 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_body(ssl,
814 buf,
815 buf + buf_len,
816 &msg_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800817
Xiaokang Qian73437382023-03-29 08:24:12 +0000818 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
819 ssl, MBEDTLS_SSL_HS_CERTIFICATE, buf, msg_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800820
Gilles Peskine449bd832023-01-11 14:50:10 +0100821 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
822 ssl, buf_len, msg_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800823cleanup:
824
Gilles Peskine449bd832023-01-11 14:50:10 +0100825 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate"));
826 return ret;
Jerry Yu5cc35062022-01-28 16:16:08 +0800827}
828
Jerry Yu3e536442022-02-15 11:05:59 +0800829/*
830 * STATE HANDLING: Output Certificate Verify
831 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100832int mbedtls_ssl_tls13_check_sig_alg_cert_key_match(uint16_t sig_alg,
833 mbedtls_pk_context *key)
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800834{
Dave Rodgman2eab4622023-10-05 13:30:37 +0100835 mbedtls_pk_type_t pk_type = (mbedtls_pk_type_t) mbedtls_ssl_sig_from_pk(key);
Gilles Peskine449bd832023-01-11 14:50:10 +0100836 size_t key_size = mbedtls_pk_get_bitlen(key);
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800837
Gilles Peskine449bd832023-01-11 14:50:10 +0100838 switch (pk_type) {
Jerry Yu67eced02022-02-25 13:37:36 +0800839 case MBEDTLS_SSL_SIG_ECDSA:
Gilles Peskine449bd832023-01-11 14:50:10 +0100840 switch (key_size) {
Jerry Yu67eced02022-02-25 13:37:36 +0800841 case 256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100842 return
843 sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800844
Jerry Yu67eced02022-02-25 13:37:36 +0800845 case 384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100846 return
847 sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800848
Jerry Yu67eced02022-02-25 13:37:36 +0800849 case 521:
Gilles Peskine449bd832023-01-11 14:50:10 +0100850 return
851 sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512;
Jerry Yu67eced02022-02-25 13:37:36 +0800852 default:
Jerry Yu67eced02022-02-25 13:37:36 +0800853 break;
854 }
855 break;
Jerry Yu67eced02022-02-25 13:37:36 +0800856
Jerry Yu67eced02022-02-25 13:37:36 +0800857 case MBEDTLS_SSL_SIG_RSA:
Gilles Peskine449bd832023-01-11 14:50:10 +0100858 switch (sig_alg) {
Ronald Cron38391bf2022-09-16 11:19:27 +0200859 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256: /* Intentional fallthrough */
860 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384: /* Intentional fallthrough */
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800861 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100862 return 1;
Jerry Yuc2e04932022-06-27 22:13:03 +0800863
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800864 default:
865 break;
Jerry Yucef3f332022-03-22 23:00:13 +0800866 }
Jerry Yu67eced02022-02-25 13:37:36 +0800867 break;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800868
Jerry Yu67eced02022-02-25 13:37:36 +0800869 default:
Jerry Yu67eced02022-02-25 13:37:36 +0800870 break;
871 }
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800872
Gilles Peskine449bd832023-01-11 14:50:10 +0100873 return 0;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800874}
875
Ronald Cronce7d76e2022-07-08 18:56:49 +0200876MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100877static int ssl_tls13_write_certificate_verify_body(mbedtls_ssl_context *ssl,
878 unsigned char *buf,
879 unsigned char *end,
880 size_t *out_len)
Jerry Yu8511f122022-01-29 10:01:04 +0800881{
Ronald Cron067a1e72022-09-16 13:44:49 +0200882 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu3e536442022-02-15 11:05:59 +0800883 unsigned char *p = buf;
Jerry Yu8511f122022-01-29 10:01:04 +0800884 mbedtls_pk_context *own_key;
Jerry Yu3e536442022-02-15 11:05:59 +0800885
Gilles Peskine449bd832023-01-11 14:50:10 +0100886 unsigned char handshake_hash[MBEDTLS_TLS1_3_MD_MAX_SIZE];
Jerry Yu8511f122022-01-29 10:01:04 +0800887 size_t handshake_hash_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100888 unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
Jerry Yu3e536442022-02-15 11:05:59 +0800889 size_t verify_buffer_len;
Ronald Cron067a1e72022-09-16 13:44:49 +0200890
891 uint16_t *sig_alg = ssl->handshake->received_sig_algs;
Jerry Yu3e536442022-02-15 11:05:59 +0800892 size_t signature_len = 0;
Jerry Yu8511f122022-01-29 10:01:04 +0800893
Jerry Yu0b7b1012022-02-23 12:23:05 +0800894 *out_len = 0;
895
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 own_key = mbedtls_ssl_own_key(ssl);
897 if (own_key == NULL) {
898 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
899 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu8511f122022-01-29 10:01:04 +0800900 }
901
Xiaokang Qian73437382023-03-29 08:24:12 +0000902 ret = mbedtls_ssl_get_handshake_transcript(
Dave Rodgman2eab4622023-10-05 13:30:37 +0100903 ssl, (mbedtls_md_type_t) ssl->handshake->ciphersuite_info->mac,
Xiaokang Qian73437382023-03-29 08:24:12 +0000904 handshake_hash, sizeof(handshake_hash), &handshake_hash_len);
Gilles Peskine449bd832023-01-11 14:50:10 +0100905 if (ret != 0) {
906 return ret;
907 }
Jerry Yu8511f122022-01-29 10:01:04 +0800908
Gilles Peskine449bd832023-01-11 14:50:10 +0100909 MBEDTLS_SSL_DEBUG_BUF(3, "handshake hash",
910 handshake_hash,
911 handshake_hash_len);
Jerry Yu8511f122022-01-29 10:01:04 +0800912
Gilles Peskine449bd832023-01-11 14:50:10 +0100913 ssl_tls13_create_verify_structure(handshake_hash, handshake_hash_len,
914 verify_buffer, &verify_buffer_len,
915 ssl->conf->endpoint);
Jerry Yu8511f122022-01-29 10:01:04 +0800916
917 /*
918 * struct {
919 * SignatureScheme algorithm;
920 * opaque signature<0..2^16-1>;
921 * } CertificateVerify;
922 */
Ronald Cron067a1e72022-09-16 13:44:49 +0200923 /* Check there is space for the algorithm identifier (2 bytes) and the
924 * signature length (2 bytes).
925 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100926 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
Ronald Cron067a1e72022-09-16 13:44:49 +0200927
Gilles Peskine449bd832023-01-11 14:50:10 +0100928 for (; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++) {
Ronald Cron067a1e72022-09-16 13:44:49 +0200929 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
930 mbedtls_pk_type_t pk_type = MBEDTLS_PK_NONE;
931 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
932 psa_algorithm_t psa_algorithm = PSA_ALG_NONE;
933 unsigned char verify_hash[PSA_HASH_MAX_SIZE];
934 size_t verify_hash_len;
Jerry Yu67eced02022-02-25 13:37:36 +0800935
Gilles Peskine449bd832023-01-11 14:50:10 +0100936 if (!mbedtls_ssl_sig_alg_is_offered(ssl, *sig_alg)) {
Ronald Cron067a1e72022-09-16 13:44:49 +0200937 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +0100938 }
Jerry Yu67eced02022-02-25 13:37:36 +0800939
Gilles Peskine449bd832023-01-11 14:50:10 +0100940 if (!mbedtls_ssl_tls13_sig_alg_for_cert_verify_is_supported(*sig_alg)) {
Ronald Cron067a1e72022-09-16 13:44:49 +0200941 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +0100942 }
Ronald Cron067a1e72022-09-16 13:44:49 +0200943
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 if (!mbedtls_ssl_tls13_check_sig_alg_cert_key_match(*sig_alg, own_key)) {
Ronald Cron067a1e72022-09-16 13:44:49 +0200945 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +0100946 }
Ronald Cron067a1e72022-09-16 13:44:49 +0200947
Gilles Peskine449bd832023-01-11 14:50:10 +0100948 if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
949 *sig_alg, &pk_type, &md_alg) != 0) {
950 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Ronald Cron067a1e72022-09-16 13:44:49 +0200951 }
952
953 /* Hash verify buffer with indicated hash function */
Manuel Pégourié-Gonnard2d6d9932023-03-28 11:38:08 +0200954 psa_algorithm = mbedtls_md_psa_alg_from_type(md_alg);
Gilles Peskine449bd832023-01-11 14:50:10 +0100955 status = psa_hash_compute(psa_algorithm,
956 verify_buffer,
957 verify_buffer_len,
958 verify_hash, sizeof(verify_hash),
959 &verify_hash_len);
960 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -0500961 return PSA_TO_MBEDTLS_ERR(status);
Ronald Cron067a1e72022-09-16 13:44:49 +0200962 }
963
Gilles Peskine449bd832023-01-11 14:50:10 +0100964 MBEDTLS_SSL_DEBUG_BUF(3, "verify hash", verify_hash, verify_hash_len);
965
966 if ((ret = mbedtls_pk_sign_ext(pk_type, own_key,
967 md_alg, verify_hash, verify_hash_len,
Ben Taylor440cb2a2025-03-05 09:40:08 +0000968 p + 4, (size_t) (end - (p + 4)), &signature_len)) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +0100969 MBEDTLS_SSL_DEBUG_MSG(2, ("CertificateVerify signature failed with %s",
970 mbedtls_ssl_sig_alg_to_str(*sig_alg)));
971 MBEDTLS_SSL_DEBUG_RET(2, "mbedtls_pk_sign_ext", ret);
972
973 /* The signature failed. This is possible if the private key
974 * was not suitable for the signature operation as purposely we
975 * did not check its suitability completely. Let's try with
976 * another signature algorithm.
977 */
978 continue;
979 }
980
981 MBEDTLS_SSL_DEBUG_MSG(2, ("CertificateVerify signature with %s",
982 mbedtls_ssl_sig_alg_to_str(*sig_alg)));
Ronald Cron067a1e72022-09-16 13:44:49 +0200983
984 break;
985 }
986
Gilles Peskine449bd832023-01-11 14:50:10 +0100987 if (*sig_alg == MBEDTLS_TLS1_3_SIG_NONE) {
988 MBEDTLS_SSL_DEBUG_MSG(1, ("no suitable signature algorithm"));
989 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
990 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
991 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu8511f122022-01-29 10:01:04 +0800992 }
993
Gilles Peskine449bd832023-01-11 14:50:10 +0100994 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, 0);
995 MBEDTLS_PUT_UINT16_BE(signature_len, p, 2);
Jerry Yuf3b46b52022-06-19 16:52:27 +0800996
Ronald Cron067a1e72022-09-16 13:44:49 +0200997 *out_len = 4 + signature_len;
Jerry Yu8c338862022-03-23 13:34:04 +0800998
Gilles Peskine449bd832023-01-11 14:50:10 +0100999 return 0;
Jerry Yu8511f122022-01-29 10:01:04 +08001000}
Jerry Yu8511f122022-01-29 10:01:04 +08001001
Gilles Peskine449bd832023-01-11 14:50:10 +01001002int mbedtls_ssl_tls13_write_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu8511f122022-01-29 10:01:04 +08001003{
1004 int ret = 0;
Jerry Yuca133a32022-02-15 14:22:05 +08001005 unsigned char *buf;
1006 size_t buf_len, msg_len;
1007
Gilles Peskine449bd832023-01-11 14:50:10 +01001008 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate verify"));
Jerry Yu8511f122022-01-29 10:01:04 +08001009
Xiaokang Qian73437382023-03-29 08:24:12 +00001010 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
1011 ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
1012 &buf, &buf_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001013
Gilles Peskine449bd832023-01-11 14:50:10 +01001014 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_verify_body(
1015 ssl, buf, buf + buf_len, &msg_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001016
Xiaokang Qian73437382023-03-29 08:24:12 +00001017 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
1018 ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
1019 buf, msg_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001020
Gilles Peskine449bd832023-01-11 14:50:10 +01001021 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
1022 ssl, buf_len, msg_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001023
1024cleanup:
1025
Gilles Peskine449bd832023-01-11 14:50:10 +01001026 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate verify"));
1027 return ret;
Jerry Yu8511f122022-01-29 10:01:04 +08001028}
1029
Ronald Cron928cbd32022-10-04 16:14:26 +02001030#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu90f152d2022-01-29 22:12:42 +08001031
Jerry Yu5cc35062022-01-28 16:16:08 +08001032/*
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001033 *
XiaokangQianc5c39d52021-11-09 11:55:10 +00001034 * STATE HANDLING: Incoming Finished message.
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001035 */
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001036/*
1037 * Implementation
1038 */
1039
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001040MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001041static int ssl_tls13_preprocess_finished_message(mbedtls_ssl_context *ssl)
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001042{
1043 int ret;
1044
Xiaokang Qian73437382023-03-29 08:24:12 +00001045 ret = mbedtls_ssl_tls13_calculate_verify_data(
1046 ssl,
1047 ssl->handshake->state_local.finished_in.digest,
1048 sizeof(ssl->handshake->state_local.finished_in.digest),
1049 &ssl->handshake->state_local.finished_in.digest_len,
1050 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ?
1051 MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT);
Gilles Peskine449bd832023-01-11 14:50:10 +01001052 if (ret != 0) {
1053 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_calculate_verify_data", ret);
1054 return ret;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001055 }
1056
Gilles Peskine449bd832023-01-11 14:50:10 +01001057 return 0;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001058}
1059
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001060MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001061static int ssl_tls13_parse_finished_message(mbedtls_ssl_context *ssl,
1062 const unsigned char *buf,
1063 const unsigned char *end)
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001064{
XiaokangQian33062842021-11-11 03:37:45 +00001065 /*
1066 * struct {
XiaokangQianc13f9352021-11-11 06:13:22 +00001067 * opaque verify_data[Hash.length];
XiaokangQian33062842021-11-11 03:37:45 +00001068 * } Finished;
1069 */
1070 const unsigned char *expected_verify_data =
1071 ssl->handshake->state_local.finished_in.digest;
1072 size_t expected_verify_data_len =
1073 ssl->handshake->state_local.finished_in.digest_len;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001074 /* Structural validation */
Gilles Peskine449bd832023-01-11 14:50:10 +01001075 if ((size_t) (end - buf) != expected_verify_data_len) {
1076 MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001077
Gilles Peskine449bd832023-01-11 14:50:10 +01001078 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
1079 MBEDTLS_ERR_SSL_DECODE_ERROR);
1080 return MBEDTLS_ERR_SSL_DECODE_ERROR;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001081 }
1082
Gilles Peskine449bd832023-01-11 14:50:10 +01001083 MBEDTLS_SSL_DEBUG_BUF(4, "verify_data (self-computed):",
1084 expected_verify_data,
1085 expected_verify_data_len);
1086 MBEDTLS_SSL_DEBUG_BUF(4, "verify_data (received message):", buf,
1087 expected_verify_data_len);
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001088
1089 /* Semantic validation */
Gilles Peskine449bd832023-01-11 14:50:10 +01001090 if (mbedtls_ct_memcmp(buf,
1091 expected_verify_data,
1092 expected_verify_data_len) != 0) {
1093 MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001094
Gilles Peskine449bd832023-01-11 14:50:10 +01001095 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
1096 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
1097 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001098 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001099 return 0;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001100}
1101
Gilles Peskine449bd832023-01-11 14:50:10 +01001102int mbedtls_ssl_tls13_process_finished_message(mbedtls_ssl_context *ssl)
XiaokangQianc5c39d52021-11-09 11:55:10 +00001103{
XiaokangQian33062842021-11-11 03:37:45 +00001104 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001105 unsigned char *buf;
Xiaofei Baieef15042021-11-18 07:29:56 +00001106 size_t buf_len;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001107
Gilles Peskine449bd832023-01-11 14:50:10 +01001108 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse finished message"));
XiaokangQianc5c39d52021-11-09 11:55:10 +00001109
Xiaokang Qian73437382023-03-29 08:24:12 +00001110 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
1111 ssl, MBEDTLS_SSL_HS_FINISHED, &buf, &buf_len));
Jerry Yu0a92d6c2022-05-16 16:54:46 +08001112
1113 /* Preprocessing step: Compute handshake digest */
Gilles Peskine449bd832023-01-11 14:50:10 +01001114 MBEDTLS_SSL_PROC_CHK(ssl_tls13_preprocess_finished_message(ssl));
Jerry Yu0a92d6c2022-05-16 16:54:46 +08001115
Xiaokang Qian73437382023-03-29 08:24:12 +00001116 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_finished_message(
1117 ssl, buf, buf + buf_len));
Jerry Yu0a92d6c2022-05-16 16:54:46 +08001118
Xiaokang Qian73437382023-03-29 08:24:12 +00001119 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
1120 ssl, MBEDTLS_SSL_HS_FINISHED, buf, buf_len));
XiaokangQianc5c39d52021-11-09 11:55:10 +00001121
1122cleanup:
1123
Gilles Peskine449bd832023-01-11 14:50:10 +01001124 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse finished message"));
1125 return ret;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001126}
1127
XiaokangQian74af2a82021-09-22 07:40:30 +00001128/*
1129 *
XiaokangQiancc90c942021-11-09 12:30:09 +00001130 * STATE HANDLING: Write and send Finished message.
XiaokangQian74af2a82021-09-22 07:40:30 +00001131 *
1132 */
XiaokangQian74af2a82021-09-22 07:40:30 +00001133/*
XiaokangQian35dc6252021-11-11 08:16:19 +00001134 * Implement
XiaokangQian74af2a82021-09-22 07:40:30 +00001135 */
1136
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001137MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001138static int ssl_tls13_prepare_finished_message(mbedtls_ssl_context *ssl)
XiaokangQian74af2a82021-09-22 07:40:30 +00001139{
1140 int ret;
1141
1142 /* Compute transcript of handshake up to now. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001143 ret = mbedtls_ssl_tls13_calculate_verify_data(ssl,
1144 ssl->handshake->state_local.finished_out.digest,
1145 sizeof(ssl->handshake->state_local.finished_out.
1146 digest),
1147 &ssl->handshake->state_local.finished_out.digest_len,
1148 ssl->conf->endpoint);
XiaokangQian74af2a82021-09-22 07:40:30 +00001149
Gilles Peskine449bd832023-01-11 14:50:10 +01001150 if (ret != 0) {
1151 MBEDTLS_SSL_DEBUG_RET(1, "calculate_verify_data failed", ret);
1152 return ret;
XiaokangQian74af2a82021-09-22 07:40:30 +00001153 }
1154
Gilles Peskine449bd832023-01-11 14:50:10 +01001155 return 0;
XiaokangQian74af2a82021-09-22 07:40:30 +00001156}
1157
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001158MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001159static int ssl_tls13_write_finished_message_body(mbedtls_ssl_context *ssl,
1160 unsigned char *buf,
1161 unsigned char *end,
1162 size_t *out_len)
XiaokangQian74af2a82021-09-22 07:40:30 +00001163{
XiaokangQian8773aa02021-11-10 07:33:09 +00001164 size_t verify_data_len = ssl->handshake->state_local.finished_out.digest_len;
XiaokangQian0fa66432021-11-15 03:33:57 +00001165 /*
1166 * struct {
1167 * opaque verify_data[Hash.length];
1168 * } Finished;
1169 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001170 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, verify_data_len);
XiaokangQian74af2a82021-09-22 07:40:30 +00001171
Gilles Peskine449bd832023-01-11 14:50:10 +01001172 memcpy(buf, ssl->handshake->state_local.finished_out.digest,
1173 verify_data_len);
XiaokangQian74af2a82021-09-22 07:40:30 +00001174
Xiaofei Baid25fab62021-12-02 06:36:27 +00001175 *out_len = verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001176 return 0;
XiaokangQian74af2a82021-09-22 07:40:30 +00001177}
XiaokangQianc5c39d52021-11-09 11:55:10 +00001178
XiaokangQian35dc6252021-11-11 08:16:19 +00001179/* Main entry point: orchestrates the other functions */
Gilles Peskine449bd832023-01-11 14:50:10 +01001180int mbedtls_ssl_tls13_write_finished_message(mbedtls_ssl_context *ssl)
XiaokangQian35dc6252021-11-11 08:16:19 +00001181{
1182 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1183 unsigned char *buf;
1184 size_t buf_len, msg_len;
1185
Gilles Peskine449bd832023-01-11 14:50:10 +01001186 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write finished message"));
XiaokangQian35dc6252021-11-11 08:16:19 +00001187
Gilles Peskine449bd832023-01-11 14:50:10 +01001188 MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_finished_message(ssl));
XiaokangQiandce82242021-11-15 06:01:26 +00001189
Gilles Peskine449bd832023-01-11 14:50:10 +01001190 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
1191 MBEDTLS_SSL_HS_FINISHED, &buf, &buf_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001192
Gilles Peskine449bd832023-01-11 14:50:10 +01001193 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_finished_message_body(
1194 ssl, buf, buf + buf_len, &msg_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001195
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001196 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(ssl,
Manuel Pégourié-Gonnard43cc1272023-02-06 11:48:19 +01001197 MBEDTLS_SSL_HS_FINISHED, buf, msg_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001198
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
1200 ssl, buf_len, msg_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001201cleanup:
1202
Gilles Peskine449bd832023-01-11 14:50:10 +01001203 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write finished message"));
1204 return ret;
XiaokangQian35dc6252021-11-11 08:16:19 +00001205}
1206
Gilles Peskine449bd832023-01-11 14:50:10 +01001207void mbedtls_ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl)
Jerry Yu378254d2021-10-30 21:44:47 +08001208{
1209
Gilles Peskine449bd832023-01-11 14:50:10 +01001210 MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup"));
Jerry Yu378254d2021-10-30 21:44:47 +08001211
Gilles Peskine449bd832023-01-11 14:50:10 +01001212 MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to application keys for inbound traffic"));
1213 mbedtls_ssl_set_inbound_transform(ssl, ssl->transform_application);
Jerry Yue8c1fca2022-05-18 14:48:56 +08001214
Gilles Peskine449bd832023-01-11 14:50:10 +01001215 MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to application keys for outbound traffic"));
1216 mbedtls_ssl_set_outbound_transform(ssl, ssl->transform_application);
Jerry Yue8c1fca2022-05-18 14:48:56 +08001217
Jerry Yu378254d2021-10-30 21:44:47 +08001218 /*
Jerry Yucfe64f02021-11-15 13:54:06 +08001219 * Free the previous session and switch to the current one.
Jerry Yu378254d2021-10-30 21:44:47 +08001220 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001221 if (ssl->session) {
1222 mbedtls_ssl_session_free(ssl->session);
1223 mbedtls_free(ssl->session);
Jerry Yu378254d2021-10-30 21:44:47 +08001224 }
1225 ssl->session = ssl->session_negotiate;
1226 ssl->session_negotiate = NULL;
1227
Gilles Peskine449bd832023-01-11 14:50:10 +01001228 MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup"));
Jerry Yu378254d2021-10-30 21:44:47 +08001229}
1230
Ronald Cron49ad6192021-11-24 16:25:31 +01001231/*
1232 *
1233 * STATE HANDLING: Write ChangeCipherSpec
1234 *
1235 */
1236#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001237MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001238static int ssl_tls13_write_change_cipher_spec_body(mbedtls_ssl_context *ssl,
1239 unsigned char *buf,
1240 unsigned char *end,
1241 size_t *olen)
Ronald Cron49ad6192021-11-24 16:25:31 +01001242{
1243 ((void) ssl);
1244
Gilles Peskine449bd832023-01-11 14:50:10 +01001245 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 1);
Ronald Cron49ad6192021-11-24 16:25:31 +01001246 buf[0] = 1;
1247 *olen = 1;
1248
Gilles Peskine449bd832023-01-11 14:50:10 +01001249 return 0;
Ronald Cron49ad6192021-11-24 16:25:31 +01001250}
1251
Gilles Peskine449bd832023-01-11 14:50:10 +01001252int mbedtls_ssl_tls13_write_change_cipher_spec(mbedtls_ssl_context *ssl)
Ronald Cron49ad6192021-11-24 16:25:31 +01001253{
1254 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1255
Gilles Peskine449bd832023-01-11 14:50:10 +01001256 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write change cipher spec"));
Ronald Cron49ad6192021-11-24 16:25:31 +01001257
Ronald Crone273f722024-02-13 18:22:26 +01001258 /* Only one CCS to send. */
Ronald Cron5fbd2702024-02-14 10:03:36 +01001259 if (ssl->handshake->ccs_sent) {
Ronald Crone273f722024-02-13 18:22:26 +01001260 ret = 0;
1261 goto cleanup;
1262 }
1263
Ronald Cron49ad6192021-11-24 16:25:31 +01001264 /* Write CCS message */
Gilles Peskine449bd832023-01-11 14:50:10 +01001265 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_change_cipher_spec_body(
1266 ssl, ssl->out_msg,
1267 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
1268 &ssl->out_msglen));
Ronald Cron49ad6192021-11-24 16:25:31 +01001269
1270 ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC;
1271
Ronald Cron49ad6192021-11-24 16:25:31 +01001272 /* Dispatch message */
Gilles Peskine449bd832023-01-11 14:50:10 +01001273 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_write_record(ssl, 0));
Ronald Cron49ad6192021-11-24 16:25:31 +01001274
Ronald Cron5fbd2702024-02-14 10:03:36 +01001275 ssl->handshake->ccs_sent = 1;
Ronald Cronfe59ff72024-01-24 14:31:50 +01001276
Ronald Cron49ad6192021-11-24 16:25:31 +01001277cleanup:
1278
Gilles Peskine449bd832023-01-11 14:50:10 +01001279 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write change cipher spec"));
1280 return ret;
Ronald Cron49ad6192021-11-24 16:25:31 +01001281}
1282
1283#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
1284
Xiaokang Qianecc29482022-11-02 07:52:47 +00001285/* Early Data Indication Extension
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001286 *
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001287 * struct {
1288 * select ( Handshake.msg_type ) {
Jerry Yu52335392023-11-23 18:06:06 +08001289 * case new_session_ticket: uint32 max_early_data_size;
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001290 * case client_hello: Empty;
1291 * case encrypted_extensions: Empty;
1292 * };
1293 * } EarlyDataIndication;
1294 */
1295#if defined(MBEDTLS_SSL_EARLY_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01001296int mbedtls_ssl_tls13_write_early_data_ext(mbedtls_ssl_context *ssl,
Jerry Yuc59c5862023-12-05 10:40:49 +08001297 int in_new_session_ticket,
Gilles Peskine449bd832023-01-11 14:50:10 +01001298 unsigned char *buf,
1299 const unsigned char *end,
Jerry Yuc59c5862023-12-05 10:40:49 +08001300 size_t *out_len)
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001301{
1302 unsigned char *p = buf;
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001303
Jerry Yu52335392023-11-23 18:06:06 +08001304#if defined(MBEDTLS_SSL_SRV_C)
Jerry Yuc59c5862023-12-05 10:40:49 +08001305 const size_t needed = in_new_session_ticket ? 8 : 4;
Jerry Yu52335392023-11-23 18:06:06 +08001306#else
1307 const size_t needed = 4;
Jerry Yuc59c5862023-12-05 10:40:49 +08001308 ((void) in_new_session_ticket);
Jerry Yu52335392023-11-23 18:06:06 +08001309#endif
1310
1311 *out_len = 0;
1312
1313 MBEDTLS_SSL_CHK_BUF_PTR(p, end, needed);
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001314
Gilles Peskine449bd832023-01-11 14:50:10 +01001315 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EARLY_DATA, p, 0);
Jerry Yu52335392023-11-23 18:06:06 +08001316 MBEDTLS_PUT_UINT16_BE(needed - 4, p, 2);
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001317
Jerry Yu52335392023-11-23 18:06:06 +08001318#if defined(MBEDTLS_SSL_SRV_C)
Jerry Yuc59c5862023-12-05 10:40:49 +08001319 if (in_new_session_ticket) {
1320 MBEDTLS_PUT_UINT32_BE(ssl->conf->max_early_data_size, p, 4);
Jerry Yu52335392023-11-23 18:06:06 +08001321 MBEDTLS_SSL_DEBUG_MSG(
1322 4, ("Sent max_early_data_size=%u",
Jerry Yuc59c5862023-12-05 10:40:49 +08001323 (unsigned int) ssl->conf->max_early_data_size));
Jerry Yu52335392023-11-23 18:06:06 +08001324 }
1325#endif
1326
1327 *out_len = needed;
Xiaokang Qian2cd5ce02022-11-15 10:33:53 +00001328
Gilles Peskine449bd832023-01-11 14:50:10 +01001329 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_EARLY_DATA);
Xiaokang Qian2cd5ce02022-11-15 10:33:53 +00001330
Gilles Peskine449bd832023-01-11 14:50:10 +01001331 return 0;
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001332}
Ronald Cron85718042024-02-22 10:22:09 +01001333
1334#if defined(MBEDTLS_SSL_SRV_C)
1335int mbedtls_ssl_tls13_check_early_data_len(mbedtls_ssl_context *ssl,
1336 size_t early_data_len)
1337{
Ronald Cron85718042024-02-22 10:22:09 +01001338 /*
1339 * This function should be called only while an handshake is in progress
1340 * and thus a session under negotiation. Add a sanity check to detect a
1341 * misuse.
1342 */
1343 if (ssl->session_negotiate == NULL) {
1344 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1345 }
1346
1347 /* RFC 8446 section 4.6.1
1348 *
1349 * A server receiving more than max_early_data_size bytes of 0-RTT data
1350 * SHOULD terminate the connection with an "unexpected_message" alert.
Ronald Cron93795f22024-03-07 09:24:56 +01001351 * Note that if it is still possible to send early_data_len bytes of early
1352 * data, it means that early_data_len is smaller than max_early_data_size
1353 * (type uint32_t) and can fit in an uint32_t. We use this further
1354 * down.
Ronald Cron85718042024-02-22 10:22:09 +01001355 */
Ronald Cron2e7dfd52024-03-05 10:54:33 +01001356 if (early_data_len >
Ronald Cron85718042024-02-22 10:22:09 +01001357 (ssl->session_negotiate->max_early_data_size -
Ronald Cron19bfe0a2024-02-26 16:43:01 +01001358 ssl->total_early_data_size)) {
Ronald Cron85718042024-02-22 10:22:09 +01001359
1360 MBEDTLS_SSL_DEBUG_MSG(
Gilles Peskinea9d4ef02024-06-03 22:16:23 +02001361 2, ("EarlyData: Too much early data received, "
Gilles Peskine69770aa2024-06-04 08:45:58 +02001362 "%lu + %" MBEDTLS_PRINTF_SIZET " > %lu",
1363 (unsigned long) ssl->total_early_data_size,
Gilles Peskinea9d4ef02024-06-03 22:16:23 +02001364 early_data_len,
Gilles Peskine69770aa2024-06-04 08:45:58 +02001365 (unsigned long) ssl->session_negotiate->max_early_data_size));
Ronald Cron85718042024-02-22 10:22:09 +01001366
1367 MBEDTLS_SSL_PEND_FATAL_ALERT(
1368 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
1369 MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
1370 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
1371 }
1372
Ronald Cron2e7dfd52024-03-05 10:54:33 +01001373 /*
Ronald Cron93795f22024-03-07 09:24:56 +01001374 * early_data_len has been checked to be less than max_early_data_size
1375 * that is uint32_t. Its cast to an uint32_t below is thus safe. We need
1376 * the cast to appease some compilers.
Ronald Cron2e7dfd52024-03-05 10:54:33 +01001377 */
Ronald Cron2e7dfd52024-03-05 10:54:33 +01001378 ssl->total_early_data_size += (uint32_t) early_data_len;
Ronald Cron85718042024-02-22 10:22:09 +01001379
1380 return 0;
1381}
1382#endif /* MBEDTLS_SSL_SRV_C */
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001383#endif /* MBEDTLS_SSL_EARLY_DATA */
1384
XiaokangQian78b1fa72022-01-19 06:56:30 +00001385/* Reset SSL context and update hash for handling HRR.
1386 *
1387 * Replace Transcript-Hash(X) by
1388 * Transcript-Hash( message_hash ||
1389 * 00 00 Hash.length ||
1390 * X )
1391 * A few states of the handshake are preserved, including:
1392 * - session ID
1393 * - session ticket
1394 * - negotiated ciphersuite
1395 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001396int mbedtls_ssl_reset_transcript_for_hrr(mbedtls_ssl_context *ssl)
XiaokangQian78b1fa72022-01-19 06:56:30 +00001397{
1398 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Przemyslaw Stekielda645252022-09-14 12:50:51 +02001399 unsigned char hash_transcript[PSA_HASH_MAX_SIZE + 4];
XiaokangQian0ece9982022-01-24 08:56:23 +00001400 size_t hash_len;
Xiaokang Qian6b980012023-02-07 03:17:45 +00001401 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
1402 ssl->handshake->ciphersuite_info;
XiaokangQian78b1fa72022-01-19 06:56:30 +00001403
Gilles Peskine449bd832023-01-11 14:50:10 +01001404 MBEDTLS_SSL_DEBUG_MSG(3, ("Reset SSL session for HRR"));
XiaokangQian78b1fa72022-01-19 06:56:30 +00001405
Dave Rodgman2eab4622023-10-05 13:30:37 +01001406 ret = mbedtls_ssl_get_handshake_transcript(ssl, (mbedtls_md_type_t) ciphersuite_info->mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001407 hash_transcript + 4,
1408 PSA_HASH_MAX_SIZE,
1409 &hash_len);
1410 if (ret != 0) {
Manuel Pégourié-Gonnardda7979b2023-02-21 09:31:10 +01001411 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_get_handshake_transcript", ret);
Gilles Peskine449bd832023-01-11 14:50:10 +01001412 return ret;
XiaokangQian0ece9982022-01-24 08:56:23 +00001413 }
1414
1415 hash_transcript[0] = MBEDTLS_SSL_HS_MESSAGE_HASH;
1416 hash_transcript[1] = 0;
1417 hash_transcript[2] = 0;
1418 hash_transcript[3] = (unsigned char) hash_len;
1419
1420 hash_len += 4;
1421
Manuel Pégourié-Gonnardda7979b2023-02-21 09:31:10 +01001422 MBEDTLS_SSL_DEBUG_BUF(4, "Truncated handshake transcript",
1423 hash_transcript, hash_len);
1424
Manuel Pégourié-Gonnardd7a7a232023-02-05 10:26:49 +01001425 /* Reset running hash and replace it with a hash of the transcript */
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001426 ret = mbedtls_ssl_reset_checksum(ssl);
1427 if (ret != 0) {
1428 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_reset_checksum", ret);
1429 return ret;
1430 }
1431 ret = ssl->handshake->update_checksum(ssl, hash_transcript, hash_len);
1432 if (ret != 0) {
1433 MBEDTLS_SSL_DEBUG_RET(1, "update_checksum", ret);
1434 return ret;
1435 }
Przemyslaw Stekiel4b3fff42022-02-14 16:39:52 +01001436
Gilles Peskine449bd832023-01-11 14:50:10 +01001437 return ret;
XiaokangQian78b1fa72022-01-19 06:56:30 +00001438}
1439
Valerio Settic9ae8622023-07-25 11:23:50 +02001440#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001441
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001442int mbedtls_ssl_tls13_read_public_xxdhe_share(mbedtls_ssl_context *ssl,
Gilles Peskine449bd832023-01-11 14:50:10 +01001443 const unsigned char *buf,
1444 size_t buf_len)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001445{
Gilles Peskine449bd832023-01-11 14:50:10 +01001446 uint8_t *p = (uint8_t *) buf;
XiaokangQiancfd925f2022-04-14 07:10:37 +00001447 const uint8_t *end = buf + buf_len;
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001448 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001449
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001450 /* Get size of the TLS opaque key_exchange field of the KeyShareEntry struct. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001451 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1452 uint16_t peerkey_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001453 p += 2;
XiaokangQian3207a322022-02-23 03:15:27 +00001454
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001455 /* Check if key size is consistent with given buffer length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001456 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, peerkey_len);
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001457
Gilles Peskine12c5aaa2023-10-02 14:55:45 +02001458 /* Store peer's ECDH/FFDH public key. */
1459 if (peerkey_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02001460 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %u > %" MBEDTLS_PRINTF_SIZET,
1461 (unsigned) peerkey_len,
1462 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskine12c5aaa2023-10-02 14:55:45 +02001463 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1464 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001465 memcpy(handshake->xxdh_psa_peerkey, p, peerkey_len);
1466 handshake->xxdh_psa_peerkey_len = peerkey_len;
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001467
Gilles Peskine449bd832023-01-11 14:50:10 +01001468 return 0;
XiaokangQian3207a322022-02-23 03:15:27 +00001469}
Jerry Yu89e103c2022-03-30 22:43:29 +08001470
Valerio Setti711f8532023-07-31 11:28:07 +02001471#if defined(PSA_WANT_ALG_FFDH)
Przemek Stekielda4fba62023-06-02 14:52:28 +02001472static psa_status_t mbedtls_ssl_get_psa_ffdh_info_from_tls_id(
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001473 uint16_t tls_id, size_t *bits, psa_key_type_t *key_type)
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001474{
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001475 switch (tls_id) {
Valerio Settiecaf7c52024-01-17 12:30:30 +01001476#if defined(PSA_WANT_DH_RFC7919_2048)
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001477 case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048:
1478 *bits = 2048;
1479 *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1480 return PSA_SUCCESS;
Valerio Settiecaf7c52024-01-17 12:30:30 +01001481#endif /* PSA_WANT_DH_RFC7919_2048 */
1482#if defined(PSA_WANT_DH_RFC7919_3072)
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001483 case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072:
1484 *bits = 3072;
1485 *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1486 return PSA_SUCCESS;
Valerio Settiecaf7c52024-01-17 12:30:30 +01001487#endif /* PSA_WANT_DH_RFC7919_3072 */
1488#if defined(PSA_WANT_DH_RFC7919_4096)
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001489 case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096:
1490 *bits = 4096;
1491 *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1492 return PSA_SUCCESS;
Valerio Settiecaf7c52024-01-17 12:30:30 +01001493#endif /* PSA_WANT_DH_RFC7919_4096 */
1494#if defined(PSA_WANT_DH_RFC7919_6144)
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001495 case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144:
1496 *bits = 6144;
1497 *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1498 return PSA_SUCCESS;
Valerio Settiecaf7c52024-01-17 12:30:30 +01001499#endif /* PSA_WANT_DH_RFC7919_6144 */
1500#if defined(PSA_WANT_DH_RFC7919_8192)
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001501 case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192:
1502 *bits = 8192;
1503 *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1504 return PSA_SUCCESS;
Valerio Settiecaf7c52024-01-17 12:30:30 +01001505#endif /* PSA_WANT_DH_RFC7919_8192 */
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001506 default:
1507 return PSA_ERROR_NOT_SUPPORTED;
1508 }
1509}
Valerio Setti711f8532023-07-31 11:28:07 +02001510#endif /* PSA_WANT_ALG_FFDH */
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001511
Przemek Stekiel408569f2023-07-06 11:26:44 +02001512int mbedtls_ssl_tls13_generate_and_write_xxdh_key_exchange(
Gilles Peskine449bd832023-01-11 14:50:10 +01001513 mbedtls_ssl_context *ssl,
1514 uint16_t named_group,
1515 unsigned char *buf,
1516 unsigned char *end,
1517 size_t *out_len)
Jerry Yu89e103c2022-03-30 22:43:29 +08001518{
1519 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
1520 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1521 psa_key_attributes_t key_attributes;
1522 size_t own_pubkey_len;
1523 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001524 size_t bits = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001525 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
1526 psa_algorithm_t alg = PSA_ALG_NONE;
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001527 size_t buf_size = (size_t) (end - buf);
Jerry Yu89e103c2022-03-30 22:43:29 +08001528
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001529 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH/FFDH computation."));
Jerry Yu89e103c2022-03-30 22:43:29 +08001530
Valerio Setti40d9ca92023-01-04 16:08:04 +01001531 /* Convert EC's TLS ID to PSA key type. */
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001532#if defined(PSA_WANT_ALG_ECDH)
Xiaokang Qian73437382023-03-29 08:24:12 +00001533 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(
Przemek Stekielda4fba62023-06-02 14:52:28 +02001534 named_group, &key_type, &bits) == PSA_SUCCESS) {
1535 alg = PSA_ALG_ECDH;
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001536 }
1537#endif
1538#if defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001539 if (mbedtls_ssl_get_psa_ffdh_info_from_tls_id(named_group, &bits,
1540 &key_type) == PSA_SUCCESS) {
Przemek Stekielda4fba62023-06-02 14:52:28 +02001541 alg = PSA_ALG_FFDH;
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001542 }
1543#endif
1544
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001545 if (key_type == PSA_KEY_TYPE_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01001546 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01001547 }
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001548
Przemek Stekielda4fba62023-06-02 14:52:28 +02001549 if (buf_size < PSA_BITS_TO_BYTES(bits)) {
Przemek Stekielda4fba62023-06-02 14:52:28 +02001550 return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
1551 }
1552
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001553 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02001554 ssl->handshake->xxdh_psa_bits = bits;
Jerry Yu89e103c2022-03-30 22:43:29 +08001555
1556 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01001557 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
Przemek Stekielda4fba62023-06-02 14:52:28 +02001558 psa_set_key_algorithm(&key_attributes, alg);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001559 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02001560 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Jerry Yu89e103c2022-03-30 22:43:29 +08001561
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001562 /* Generate ECDH/FFDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001563 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001564 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01001565 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001566 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01001567 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
1568 return ret;
Jerry Yu89e103c2022-03-30 22:43:29 +08001569
1570 }
1571
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001572 /* Export the public part of the ECDH/FFDH private key from PSA. */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001573 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001574 buf, buf_size,
Gilles Peskine449bd832023-01-11 14:50:10 +01001575 &own_pubkey_len);
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001576
Gilles Peskine449bd832023-01-11 14:50:10 +01001577 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001578 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01001579 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
1580 return ret;
Jerry Yu89e103c2022-03-30 22:43:29 +08001581 }
1582
1583 *out_len = own_pubkey_len;
1584
Gilles Peskine449bd832023-01-11 14:50:10 +01001585 return 0;
Jerry Yu89e103c2022-03-30 22:43:29 +08001586}
Valerio Settic9ae8622023-07-25 11:23:50 +02001587#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001588
Jerry Yu0c354a22022-08-29 15:25:36 +08001589/* RFC 8446 section 4.2
1590 *
1591 * If an implementation receives an extension which it recognizes and which is
1592 * not specified for the message in which it appears, it MUST abort the handshake
1593 * with an "illegal_parameter" alert.
1594 *
1595 */
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001596int mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01001597 mbedtls_ssl_context *ssl,
1598 int hs_msg_type,
1599 unsigned int received_extension_type,
1600 uint32_t hs_msg_allowed_extensions_mask)
Jerry Yu0c354a22022-08-29 15:25:36 +08001601{
Jerry Yudf0ad652022-10-31 13:20:57 +08001602 uint32_t extension_mask = mbedtls_ssl_get_extension_mask(
Gilles Peskine449bd832023-01-11 14:50:10 +01001603 received_extension_type);
Jerry Yu0c354a22022-08-29 15:25:36 +08001604
Jerry Yu79aa7212022-11-08 21:30:21 +08001605 MBEDTLS_SSL_PRINT_EXT(
Gilles Peskine449bd832023-01-11 14:50:10 +01001606 3, hs_msg_type, received_extension_type, "received");
Jerry Yu0c354a22022-08-29 15:25:36 +08001607
Gilles Peskine449bd832023-01-11 14:50:10 +01001608 if ((extension_mask & hs_msg_allowed_extensions_mask) == 0) {
Jerry Yu79aa7212022-11-08 21:30:21 +08001609 MBEDTLS_SSL_PRINT_EXT(
Gilles Peskine449bd832023-01-11 14:50:10 +01001610 3, hs_msg_type, received_extension_type, "is illegal");
Jerry Yu0c354a22022-08-29 15:25:36 +08001611 MBEDTLS_SSL_PEND_FATAL_ALERT(
1612 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
Gilles Peskine449bd832023-01-11 14:50:10 +01001613 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1614 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yu0c354a22022-08-29 15:25:36 +08001615 }
1616
1617 ssl->handshake->received_extensions |= extension_mask;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001618 /*
1619 * If it is a message containing extension responses, check that we
1620 * previously sent the extension.
1621 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001622 switch (hs_msg_type) {
Jerry Yu0c354a22022-08-29 15:25:36 +08001623 case MBEDTLS_SSL_HS_SERVER_HELLO:
Jerry Yudf0ad652022-10-31 13:20:57 +08001624 case MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST:
Jerry Yu0c354a22022-08-29 15:25:36 +08001625 case MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS:
1626 case MBEDTLS_SSL_HS_CERTIFICATE:
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001627 /* Check if the received extension is sent by peer message.*/
Gilles Peskine449bd832023-01-11 14:50:10 +01001628 if ((ssl->handshake->sent_extensions & extension_mask) != 0) {
1629 return 0;
1630 }
Jerry Yu0c354a22022-08-29 15:25:36 +08001631 break;
1632 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001633 return 0;
Jerry Yu0c354a22022-08-29 15:25:36 +08001634 }
1635
Jerry Yu79aa7212022-11-08 21:30:21 +08001636 MBEDTLS_SSL_PRINT_EXT(
Gilles Peskine449bd832023-01-11 14:50:10 +01001637 3, hs_msg_type, received_extension_type, "is unsupported");
Jerry Yu0c354a22022-08-29 15:25:36 +08001638 MBEDTLS_SSL_PEND_FATAL_ALERT(
1639 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT,
Gilles Peskine449bd832023-01-11 14:50:10 +01001640 MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION);
1641 return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
Jerry Yu0c354a22022-08-29 15:25:36 +08001642}
1643
Jan Bruckner151f6422023-02-10 12:45:19 +01001644#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
Yanray Wangfaf70bd2023-12-07 10:03:32 +08001645
1646/* RFC 8449, section 4:
1647 *
Jan Bruckner151f6422023-02-10 12:45:19 +01001648 * The ExtensionData of the "record_size_limit" extension is
1649 * RecordSizeLimit:
1650 * uint16 RecordSizeLimit;
1651 */
1652MBEDTLS_CHECK_RETURN_CRITICAL
1653int mbedtls_ssl_tls13_parse_record_size_limit_ext(mbedtls_ssl_context *ssl,
1654 const unsigned char *buf,
1655 const unsigned char *end)
1656{
Jan Bruckner1a38e542023-03-15 14:15:11 +01001657 const unsigned char *p = buf;
1658 uint16_t record_size_limit;
Jan Brucknera0589e72023-03-15 11:04:45 +01001659 const size_t extension_data_len = end - buf;
Jan Bruckner1a38e542023-03-15 14:15:11 +01001660
Xiaokang Qian73437382023-03-29 08:24:12 +00001661 if (extension_data_len !=
1662 MBEDTLS_SSL_RECORD_SIZE_LIMIT_EXTENSION_DATA_LENGTH) {
Jan Bruckner151f6422023-02-10 12:45:19 +01001663 MBEDTLS_SSL_DEBUG_MSG(2,
Jan Bruckner1a38e542023-03-15 14:15:11 +01001664 ("record_size_limit extension has invalid length: %"
1665 MBEDTLS_PRINTF_SIZET " Bytes",
Jan Bruckner151f6422023-02-10 12:45:19 +01001666 extension_data_len));
1667
1668 MBEDTLS_SSL_PEND_FATAL_ALERT(
1669 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1670 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1671 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1672 }
1673
Jan Bruckner151f6422023-02-10 12:45:19 +01001674 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1675 record_size_limit = MBEDTLS_GET_UINT16_BE(p, 0);
1676
1677 MBEDTLS_SSL_DEBUG_MSG(2, ("RecordSizeLimit: %u Bytes", record_size_limit));
1678
Waleed Elmelegye1ac98d2024-01-05 18:10:12 +00001679 /* RFC 8449, section 4:
1680 *
1681 * Endpoints MUST NOT send a "record_size_limit" extension with a value
1682 * smaller than 64. An endpoint MUST treat receipt of a smaller value
1683 * as a fatal error and generate an "illegal_parameter" alert.
1684 */
1685 if (record_size_limit < MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN) {
1686 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid record size limit : %u Bytes",
1687 record_size_limit));
1688 MBEDTLS_SSL_PEND_FATAL_ALERT(
1689 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1690 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1691 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jan Bruckner151f6422023-02-10 12:45:19 +01001692 }
1693
Jan Brucknerf482dcc2023-03-15 09:09:06 +01001694 ssl->session_negotiate->record_size_limit = record_size_limit;
Jan Bruckner151f6422023-02-10 12:45:19 +01001695
Jan Brucknerf482dcc2023-03-15 09:09:06 +01001696 return 0;
Jan Bruckner151f6422023-02-10 12:45:19 +01001697}
Jan Brucknerf482dcc2023-03-15 09:09:06 +01001698
Yanray Wangfaf70bd2023-12-07 10:03:32 +08001699MBEDTLS_CHECK_RETURN_CRITICAL
1700int mbedtls_ssl_tls13_write_record_size_limit_ext(mbedtls_ssl_context *ssl,
Yanray Wangfaf70bd2023-12-07 10:03:32 +08001701 unsigned char *buf,
1702 const unsigned char *end,
1703 size_t *out_len)
1704{
Yanray Wangfaf70bd2023-12-07 10:03:32 +08001705 unsigned char *p = buf;
1706 *out_len = 0;
1707
Waleed Elmelegy148dfb62024-01-04 18:02:35 +00001708 MBEDTLS_STATIC_ASSERT(MBEDTLS_SSL_IN_CONTENT_LEN >= MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN,
Waleed Elmelegye1ac98d2024-01-05 18:10:12 +00001709 "MBEDTLS_SSL_IN_CONTENT_LEN is less than the "
1710 "minimum record size limit");
Yanray Wangfaf70bd2023-12-07 10:03:32 +08001711
1712 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
1713
1714 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT, p, 0);
Waleed Elmelegye1ac98d2024-01-05 18:10:12 +00001715 MBEDTLS_PUT_UINT16_BE(MBEDTLS_SSL_RECORD_SIZE_LIMIT_EXTENSION_DATA_LENGTH,
1716 p, 2);
Waleed Elmelegy148dfb62024-01-04 18:02:35 +00001717 MBEDTLS_PUT_UINT16_BE(MBEDTLS_SSL_IN_CONTENT_LEN, p, 4);
Yanray Wangfaf70bd2023-12-07 10:03:32 +08001718
1719 *out_len = 6;
1720
Waleed Elmelegy3ff47242024-01-10 16:15:52 +00001721 MBEDTLS_SSL_DEBUG_MSG(2, ("Sent RecordSizeLimit: %d Bytes",
Waleed Elmelegye1ac98d2024-01-05 18:10:12 +00001722 MBEDTLS_SSL_IN_CONTENT_LEN));
Yanray Wangfaf70bd2023-12-07 10:03:32 +08001723
1724 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT);
1725
1726 return 0;
1727}
1728
Jan Bruckner151f6422023-02-10 12:45:19 +01001729#endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
1730
Jerry Yufb4b6472022-01-27 15:03:26 +08001731#endif /* MBEDTLS_SSL_TLS_C && MBEDTLS_SSL_PROTO_TLS1_3 */