blob: 7c7aac80e4fefa130882d50f81125fe48913549b [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
8#include "common.h"
9
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"
Jerry Yu75336352021-09-01 15:59:36 +080015#include "mbedtls/debug.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"
Manuel Pégourié-Gonnard02b10d82023-03-28 12:33:20 +020020#include "md_psa.h"
Jerry Yuc8a392c2021-08-18 16:46:28 +080021
Jerry Yu65dd2cc2021-08-18 16:38:40 +080022#include "ssl_misc.h"
Ronald Crone3dac4a2022-06-10 17:21:51 +020023#include "ssl_tls13_invasive.h"
Jerry Yu30b071c2021-09-12 20:16:03 +080024#include "ssl_tls13_keys.h"
Jerry Yu67eced02022-02-25 13:37:36 +080025#include "ssl_debug_helpers.h"
Jerry Yu65dd2cc2021-08-18 16:38:40 +080026
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050027#include "psa/crypto.h"
Manuel Pégourié-Gonnard2be8c632023-06-07 13:07:21 +020028#include "psa_util_internal.h"
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050029
Valerio Settic9ae8622023-07-25 11:23:50 +020030#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040031/* Define a local translating function to save code size by not using too many
32 * arguments in each translating place. */
33static int local_err_translation(psa_status_t status)
34{
35 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040036 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040037 psa_generic_status_to_mbedtls);
38}
39#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kureka6033ac2023-05-30 15:16:34 -040040#endif
Andrzej Kurek8a045ce2022-12-23 11:00:06 -050041
Jerry Yufbe3e642022-04-25 19:31:51 +080042const uint8_t mbedtls_ssl_tls13_hello_retry_request_magic[
Gilles Peskine449bd832023-01-11 14:50:10 +010043 MBEDTLS_SERVER_HELLO_RANDOM_LEN] =
44{ 0xCF, 0x21, 0xAD, 0x74, 0xE5, 0x9A, 0x61, 0x11,
45 0xBE, 0x1D, 0x8C, 0x02, 0x1E, 0x65, 0xB8, 0x91,
46 0xC2, 0xA2, 0x11, 0x16, 0x7A, 0xBB, 0x8C, 0x5E,
47 0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C };
Jerry Yu93a13f22022-04-11 23:00:01 +080048
Gilles Peskine449bd832023-01-11 14:50:10 +010049int mbedtls_ssl_tls13_fetch_handshake_msg(mbedtls_ssl_context *ssl,
50 unsigned hs_type,
51 unsigned char **buf,
52 size_t *buf_len)
XiaokangQian6b226b02021-09-24 07:51:16 +000053{
54 int ret;
55
Gilles Peskine449bd832023-01-11 14:50:10 +010056 if ((ret = mbedtls_ssl_read_record(ssl, 0)) != 0) {
57 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
XiaokangQian6b226b02021-09-24 07:51:16 +000058 goto cleanup;
59 }
60
Gilles Peskine449bd832023-01-11 14:50:10 +010061 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
62 ssl->in_msg[0] != hs_type) {
63 MBEDTLS_SSL_DEBUG_MSG(1, ("Receive unexpected handshake message."));
64 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
65 MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
XiaokangQian6b226b02021-09-24 07:51:16 +000066 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
67 goto cleanup;
68 }
69
XiaokangQian05420b12021-09-29 08:46:37 +000070 /*
71 * Jump handshake header (4 bytes, see Section 4 of RFC 8446).
72 * ...
73 * HandshakeType msg_type;
74 * uint24 length;
75 * ...
76 */
Xiaofei Baieef15042021-11-18 07:29:56 +000077 *buf = ssl->in_msg + 4;
78 *buf_len = ssl->in_hslen - 4;
XiaokangQian6b226b02021-09-24 07:51:16 +000079
XiaokangQian6b226b02021-09-24 07:51:16 +000080cleanup:
81
Gilles Peskine449bd832023-01-11 14:50:10 +010082 return ret;
XiaokangQian6b226b02021-09-24 07:51:16 +000083}
84
Ronald Cron47dce632023-02-08 17:38:29 +010085int mbedtls_ssl_tls13_is_supported_versions_ext_present_in_exts(
86 mbedtls_ssl_context *ssl,
87 const unsigned char *buf, const unsigned char *end,
Ronald Croneff56732023-04-03 17:36:31 +020088 const unsigned char **supported_versions_data,
89 const unsigned char **supported_versions_data_end)
Ronald Cron47dce632023-02-08 17:38:29 +010090{
91 const unsigned char *p = buf;
92 size_t extensions_len;
93 const unsigned char *extensions_end;
94
Ronald Croneff56732023-04-03 17:36:31 +020095 *supported_versions_data = NULL;
96 *supported_versions_data_end = NULL;
Ronald Cron47dce632023-02-08 17:38:29 +010097
98 /* Case of no extension */
99 if (p == end) {
100 return 0;
101 }
102
103 /* ...
104 * Extension extensions<x..2^16-1>;
105 * ...
106 * struct {
107 * ExtensionType extension_type; (2 bytes)
108 * opaque extension_data<0..2^16-1>;
109 * } Extension;
110 */
111 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
112 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
113 p += 2;
114
115 /* Check extensions do not go beyond the buffer of data. */
116 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
117 extensions_end = p + extensions_len;
118
119 while (p < extensions_end) {
120 unsigned int extension_type;
121 size_t extension_data_len;
122
123 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
124 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
125 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
126 p += 4;
127 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
128
129 if (extension_type == MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS) {
Ronald Croneff56732023-04-03 17:36:31 +0200130 *supported_versions_data = p;
131 *supported_versions_data_end = p + extension_data_len;
Ronald Cron47dce632023-02-08 17:38:29 +0100132 return 1;
133 }
134 p += extension_data_len;
135 }
136
137 return 0;
138}
139
Ronald Cron928cbd32022-10-04 16:14:26 +0200140#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu30b071c2021-09-12 20:16:03 +0800141/*
Jerry Yu30b071c2021-09-12 20:16:03 +0800142 * STATE HANDLING: Read CertificateVerify
143 */
Jerry Yud0fc5852021-10-29 11:09:06 +0800144/* Macro to express the maximum length of the verify structure.
Jerry Yu30b071c2021-09-12 20:16:03 +0800145 *
146 * The structure is computed per TLS 1.3 specification as:
147 * - 64 bytes of octet 32,
148 * - 33 bytes for the context string
149 * (which is either "TLS 1.3, client CertificateVerify"
150 * or "TLS 1.3, server CertificateVerify"),
Jerry Yud0fc5852021-10-29 11:09:06 +0800151 * - 1 byte for the octet 0x0, which serves as a separator,
Jerry Yu30b071c2021-09-12 20:16:03 +0800152 * - 32 or 48 bytes for the Transcript-Hash(Handshake Context, Certificate)
153 * (depending on the size of the transcript_hash)
154 *
155 * This results in a total size of
156 * - 130 bytes for a SHA256-based transcript hash, or
157 * (64 + 33 + 1 + 32 bytes)
158 * - 146 bytes for a SHA384-based transcript hash.
159 * (64 + 33 + 1 + 48 bytes)
160 *
161 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100162#define SSL_VERIFY_STRUCT_MAX_SIZE (64 + \
163 33 + \
164 1 + \
165 MBEDTLS_TLS1_3_MD_MAX_SIZE \
166 )
Jerry Yu30b071c2021-09-12 20:16:03 +0800167
Jerry Yu0b32c502021-10-28 13:41:59 +0800168/*
169 * The ssl_tls13_create_verify_structure() creates the verify structure.
170 * As input, it requires the transcript hash.
171 *
172 * The caller has to ensure that the buffer has size at least
173 * SSL_VERIFY_STRUCT_MAX_SIZE bytes.
174 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100175static void ssl_tls13_create_verify_structure(const unsigned char *transcript_hash,
176 size_t transcript_hash_len,
177 unsigned char *verify_buffer,
178 size_t *verify_buffer_len,
179 int from)
Jerry Yu0b32c502021-10-28 13:41:59 +0800180{
181 size_t idx;
Jerry Yu30b071c2021-09-12 20:16:03 +0800182
Jerry Yu0b32c502021-10-28 13:41:59 +0800183 /* RFC 8446, Section 4.4.3:
184 *
185 * The digital signature [in the CertificateVerify message] is then
186 * computed over the concatenation of:
187 * - A string that consists of octet 32 (0x20) repeated 64 times
188 * - The context string
189 * - A single 0 byte which serves as the separator
190 * - The content to be signed
191 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100192 memset(verify_buffer, 0x20, 64);
Jerry Yu0b32c502021-10-28 13:41:59 +0800193 idx = 64;
194
Gilles Peskine449bd832023-01-11 14:50:10 +0100195 if (from == MBEDTLS_SSL_IS_CLIENT) {
196 memcpy(verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(client_cv));
197 idx += MBEDTLS_SSL_TLS1_3_LBL_LEN(client_cv);
198 } else { /* from == MBEDTLS_SSL_IS_SERVER */
199 memcpy(verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(server_cv));
200 idx += MBEDTLS_SSL_TLS1_3_LBL_LEN(server_cv);
Jerry Yu0b32c502021-10-28 13:41:59 +0800201 }
202
203 verify_buffer[idx++] = 0x0;
204
Gilles Peskine449bd832023-01-11 14:50:10 +0100205 memcpy(verify_buffer + idx, transcript_hash, transcript_hash_len);
Jerry Yu0b32c502021-10-28 13:41:59 +0800206 idx += transcript_hash_len;
207
208 *verify_buffer_len = idx;
209}
210
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200211MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100212static int ssl_tls13_parse_certificate_verify(mbedtls_ssl_context *ssl,
213 const unsigned char *buf,
214 const unsigned char *end,
215 const unsigned char *verify_buffer,
216 size_t verify_buffer_len)
Jerry Yu30b071c2021-09-12 20:16:03 +0800217{
218 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
pespaceka1378102022-04-26 15:03:11 +0200219 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Jerry Yu30b071c2021-09-12 20:16:03 +0800220 const unsigned char *p = buf;
221 uint16_t algorithm;
Jerry Yu30b071c2021-09-12 20:16:03 +0800222 size_t signature_len;
223 mbedtls_pk_type_t sig_alg;
224 mbedtls_md_type_t md_alg;
pespaceka1378102022-04-26 15:03:11 +0200225 psa_algorithm_t hash_alg = PSA_ALG_NONE;
226 unsigned char verify_hash[PSA_HASH_MAX_SIZE];
Jerry Yu30b071c2021-09-12 20:16:03 +0800227 size_t verify_hash_len;
228
Xiaofei Baid25fab62021-12-02 06:36:27 +0000229 void const *options = NULL;
XiaokangQian82d34cc2021-11-03 08:51:56 +0000230#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
Xiaofei Baid25fab62021-12-02 06:36:27 +0000231 mbedtls_pk_rsassa_pss_options rsassa_pss_options;
XiaokangQian82d34cc2021-11-03 08:51:56 +0000232#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
233
Jerry Yu30b071c2021-09-12 20:16:03 +0800234 /*
235 * struct {
236 * SignatureScheme algorithm;
237 * opaque signature<0..2^16-1>;
238 * } CertificateVerify;
239 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
241 algorithm = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yu30b071c2021-09-12 20:16:03 +0800242 p += 2;
243
244 /* RFC 8446 section 4.4.3
245 *
Xiaokang Qian73437382023-03-29 08:24:12 +0000246 * If the CertificateVerify message is sent by a server, the signature
247 * algorithm MUST be one offered in the client's "signature_algorithms"
248 * extension unless no valid certificate chain can be produced without
249 * unsupported algorithms
Jerry Yu30b071c2021-09-12 20:16:03 +0800250 *
251 * RFC 8446 section 4.4.2.2
252 *
253 * If the client cannot construct an acceptable chain using the provided
Xiaokang Qian73437382023-03-29 08:24:12 +0000254 * certificates and decides to abort the handshake, then it MUST abort the
255 * handshake with an appropriate certificate-related alert
256 * (by default, "unsupported_certificate").
Jerry Yu30b071c2021-09-12 20:16:03 +0800257 *
Jerry Yu6f87f252021-10-29 20:12:51 +0800258 * Check if algorithm is an offered signature algorithm.
Jerry Yu30b071c2021-09-12 20:16:03 +0800259 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100260 if (!mbedtls_ssl_sig_alg_is_offered(ssl, algorithm)) {
Jerry Yu982d9e52021-10-14 15:59:37 +0800261 /* algorithm not in offered signature algorithms list */
Gilles Peskine449bd832023-01-11 14:50:10 +0100262 MBEDTLS_SSL_DEBUG_MSG(1, ("Received signature algorithm(%04x) is not "
263 "offered.",
264 (unsigned int) algorithm));
Jerry Yu6f87f252021-10-29 20:12:51 +0800265 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800266 }
267
Gilles Peskine449bd832023-01-11 14:50:10 +0100268 if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
269 algorithm, &sig_alg, &md_alg) != 0) {
Jerry Yu8c338862022-03-23 13:34:04 +0800270 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800271 }
272
Manuel Pégourié-Gonnard2d6d9932023-03-28 11:38:08 +0200273 hash_alg = mbedtls_md_psa_alg_from_type(md_alg);
Gilles Peskine449bd832023-01-11 14:50:10 +0100274 if (hash_alg == 0) {
pespaceka1378102022-04-26 15:03:11 +0200275 goto error;
276 }
277
Gilles Peskine449bd832023-01-11 14:50:10 +0100278 MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate Verify: Signature algorithm ( %04x )",
279 (unsigned int) algorithm));
Jerry Yu30b071c2021-09-12 20:16:03 +0800280
281 /*
282 * Check the certificate's key type matches the signature alg
283 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100284 if (!mbedtls_pk_can_do(&ssl->session_negotiate->peer_cert->pk, sig_alg)) {
285 MBEDTLS_SSL_DEBUG_MSG(1, ("signature algorithm doesn't match cert key"));
Jerry Yu6f87f252021-10-29 20:12:51 +0800286 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800287 }
288
Gilles Peskine449bd832023-01-11 14:50:10 +0100289 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
290 signature_len = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yu30b071c2021-09-12 20:16:03 +0800291 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100292 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, signature_len);
Jerry Yu30b071c2021-09-12 20:16:03 +0800293
Gilles Peskine449bd832023-01-11 14:50:10 +0100294 status = psa_hash_compute(hash_alg,
295 verify_buffer,
296 verify_buffer_len,
297 verify_hash,
298 sizeof(verify_hash),
299 &verify_hash_len);
300 if (status != PSA_SUCCESS) {
301 MBEDTLS_SSL_DEBUG_RET(1, "hash computation PSA error", status);
Jerry Yu6f87f252021-10-29 20:12:51 +0800302 goto error;
Jerry Yu133690c2021-10-25 14:01:13 +0800303 }
304
Gilles Peskine449bd832023-01-11 14:50:10 +0100305 MBEDTLS_SSL_DEBUG_BUF(3, "verify hash", verify_hash, verify_hash_len);
XiaokangQian82d34cc2021-11-03 08:51:56 +0000306#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
Gilles Peskine449bd832023-01-11 14:50:10 +0100307 if (sig_alg == MBEDTLS_PK_RSASSA_PSS) {
Xiaofei Baid25fab62021-12-02 06:36:27 +0000308 rsassa_pss_options.mgf1_hash_id = md_alg;
Przemek Stekiel6a5e0182022-06-27 11:53:13 +0200309
Gilles Peskine449bd832023-01-11 14:50:10 +0100310 rsassa_pss_options.expected_salt_len = PSA_HASH_LENGTH(hash_alg);
311 options = (const void *) &rsassa_pss_options;
XiaokangQian82d34cc2021-11-03 08:51:56 +0000312 }
313#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
Jerry Yu30b071c2021-09-12 20:16:03 +0800314
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 if ((ret = mbedtls_pk_verify_ext(sig_alg, options,
316 &ssl->session_negotiate->peer_cert->pk,
317 md_alg, verify_hash, verify_hash_len,
318 p, signature_len)) == 0) {
319 return 0;
Jerry Yu30b071c2021-09-12 20:16:03 +0800320 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100321 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify_ext", ret);
Jerry Yu30b071c2021-09-12 20:16:03 +0800322
Jerry Yu6f87f252021-10-29 20:12:51 +0800323error:
324 /* RFC 8446 section 4.4.3
325 *
326 * If the verification fails, the receiver MUST terminate the handshake
327 * with a "decrypt_error" alert.
Gilles Peskine449bd832023-01-11 14:50:10 +0100328 */
329 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
330 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
331 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu6f87f252021-10-29 20:12:51 +0800332
Jerry Yu30b071c2021-09-12 20:16:03 +0800333}
Ronald Cron928cbd32022-10-04 16:14:26 +0200334#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu30b071c2021-09-12 20:16:03 +0800335
Gilles Peskine449bd832023-01-11 14:50:10 +0100336int mbedtls_ssl_tls13_process_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu30b071c2021-09-12 20:16:03 +0800337{
Jerry Yu30b071c2021-09-12 20:16:03 +0800338
Ronald Cron928cbd32022-10-04 16:14:26 +0200339#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yuda8cdf22021-10-25 15:06:49 +0800340 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
341 unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
342 size_t verify_buffer_len;
343 unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
344 size_t transcript_len;
345 unsigned char *buf;
346 size_t buf_len;
347
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Jerry Yu30b071c2021-09-12 20:16:03 +0800349
Jerry Yuda8cdf22021-10-25 15:06:49 +0800350 MBEDTLS_SSL_PROC_CHK(
Xiaokang Qian73437382023-03-29 08:24:12 +0000351 mbedtls_ssl_tls13_fetch_handshake_msg(
352 ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, &buf, &buf_len));
Jerry Yu30b071c2021-09-12 20:16:03 +0800353
Jerry Yuda8cdf22021-10-25 15:06:49 +0800354 /* Need to calculate the hash of the transcript first
Jerry Yu0b32c502021-10-28 13:41:59 +0800355 * before reading the message since otherwise it gets
356 * included in the transcript
357 */
Xiaokang Qian73437382023-03-29 08:24:12 +0000358 ret = mbedtls_ssl_get_handshake_transcript(
359 ssl,
Dave Rodgman2eab4622023-10-05 13:30:37 +0100360 (mbedtls_md_type_t) ssl->handshake->ciphersuite_info->mac,
Xiaokang Qian73437382023-03-29 08:24:12 +0000361 transcript, sizeof(transcript),
362 &transcript_len);
Gilles Peskine449bd832023-01-11 14:50:10 +0100363 if (ret != 0) {
Jerry Yuda8cdf22021-10-25 15:06:49 +0800364 MBEDTLS_SSL_PEND_FATAL_ALERT(
365 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 MBEDTLS_ERR_SSL_INTERNAL_ERROR);
367 return ret;
Jerry Yu30b071c2021-09-12 20:16:03 +0800368 }
369
Gilles Peskine449bd832023-01-11 14:50:10 +0100370 MBEDTLS_SSL_DEBUG_BUF(3, "handshake hash", transcript, transcript_len);
Jerry Yuda8cdf22021-10-25 15:06:49 +0800371
372 /* Create verify structure */
Gilles Peskine449bd832023-01-11 14:50:10 +0100373 ssl_tls13_create_verify_structure(transcript,
374 transcript_len,
375 verify_buffer,
376 &verify_buffer_len,
377 (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) ?
378 MBEDTLS_SSL_IS_SERVER :
379 MBEDTLS_SSL_IS_CLIENT);
Jerry Yuda8cdf22021-10-25 15:06:49 +0800380
381 /* Process the message contents */
Xiaokang Qian73437382023-03-29 08:24:12 +0000382 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_certificate_verify(
383 ssl, buf, buf + buf_len,
384 verify_buffer, verify_buffer_len));
Jerry Yuda8cdf22021-10-25 15:06:49 +0800385
Xiaokang Qian73437382023-03-29 08:24:12 +0000386 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
387 ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
388 buf, buf_len));
Jerry Yu30b071c2021-09-12 20:16:03 +0800389
390cleanup:
391
Gilles Peskine449bd832023-01-11 14:50:10 +0100392 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
393 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_process_certificate_verify", ret);
394 return ret;
Jerry Yuda8cdf22021-10-25 15:06:49 +0800395#else
396 ((void) ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
398 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Ronald Cron928cbd32022-10-04 16:14:26 +0200399#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu30b071c2021-09-12 20:16:03 +0800400}
401
402/*
Xiaofei Bai947571e2021-09-29 09:12:03 +0000403 *
XiaokangQian6b916b12022-04-25 07:29:34 +0000404 * STATE HANDLING: Incoming Certificate.
Xiaofei Bai947571e2021-09-29 09:12:03 +0000405 *
406 */
407
Ronald Cronde08cf32022-10-04 17:15:35 +0200408#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000409#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
410/*
411 * Structure of Certificate message:
412 *
413 * enum {
414 * X509(0),
415 * RawPublicKey(2),
416 * (255)
417 * } CertificateType;
418 *
419 * struct {
420 * select (certificate_type) {
421 * case RawPublicKey:
422 * * From RFC 7250 ASN.1_subjectPublicKeyInfo *
423 * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
424 * case X509:
425 * opaque cert_data<1..2^24-1>;
426 * };
427 * Extension extensions<0..2^16-1>;
428 * } CertificateEntry;
429 *
430 * struct {
431 * opaque certificate_request_context<0..2^8-1>;
432 * CertificateEntry certificate_list<0..2^24-1>;
433 * } Certificate;
434 *
435 */
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000436
437/* Parse certificate chain send by the server. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200438MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Crone3dac4a2022-06-10 17:21:51 +0200439MBEDTLS_STATIC_TESTABLE
Gilles Peskine449bd832023-01-11 14:50:10 +0100440int mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context *ssl,
441 const unsigned char *buf,
442 const unsigned char *end)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000443{
444 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
445 size_t certificate_request_context_len = 0;
446 size_t certificate_list_len = 0;
447 const unsigned char *p = buf;
448 const unsigned char *certificate_list_end;
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800449 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000450
Gilles Peskine449bd832023-01-11 14:50:10 +0100451 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 4);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000452 certificate_request_context_len = p[0];
Gilles Peskine449bd832023-01-11 14:50:10 +0100453 certificate_list_len = MBEDTLS_GET_UINT24_BE(p, 1);
XiaokangQian63e713e2022-05-15 04:26:57 +0000454 p += 4;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000455
456 /* In theory, the certificate list can be up to 2^24 Bytes, but we don't
457 * support anything beyond 2^16 = 64K.
458 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100459 if ((certificate_request_context_len != 0) ||
460 (certificate_list_len >= 0x10000)) {
461 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
462 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
463 MBEDTLS_ERR_SSL_DECODE_ERROR);
464 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000465 }
466
467 /* In case we tried to reuse a session but it failed */
Gilles Peskine449bd832023-01-11 14:50:10 +0100468 if (ssl->session_negotiate->peer_cert != NULL) {
469 mbedtls_x509_crt_free(ssl->session_negotiate->peer_cert);
470 mbedtls_free(ssl->session_negotiate->peer_cert);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000471 }
472
Gilles Peskine449bd832023-01-11 14:50:10 +0100473 if (certificate_list_len == 0) {
XiaokangQianc3017f62022-05-13 05:55:41 +0000474 ssl->session_negotiate->peer_cert = NULL;
475 ret = 0;
476 goto exit;
477 }
478
Gilles Peskine449bd832023-01-11 14:50:10 +0100479 if ((ssl->session_negotiate->peer_cert =
480 mbedtls_calloc(1, sizeof(mbedtls_x509_crt))) == NULL) {
481 MBEDTLS_SSL_DEBUG_MSG(1, ("alloc( %" MBEDTLS_PRINTF_SIZET " bytes ) failed",
482 sizeof(mbedtls_x509_crt)));
483 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
484 MBEDTLS_ERR_SSL_ALLOC_FAILED);
485 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000486 }
487
Gilles Peskine449bd832023-01-11 14:50:10 +0100488 mbedtls_x509_crt_init(ssl->session_negotiate->peer_cert);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000489
Gilles Peskine449bd832023-01-11 14:50:10 +0100490 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, certificate_list_len);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000491 certificate_list_end = p + certificate_list_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100492 while (p < certificate_list_end) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000493 size_t cert_data_len, extensions_len;
Jerry Yu2eaa7602022-08-04 17:28:15 +0800494 const unsigned char *extensions_end;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000495
Gilles Peskine449bd832023-01-11 14:50:10 +0100496 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, 3);
497 cert_data_len = MBEDTLS_GET_UINT24_BE(p, 0);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000498 p += 3;
499
500 /* In theory, the CRT can be up to 2^24 Bytes, but we don't support
501 * anything beyond 2^16 = 64K. Otherwise as in the TLS 1.2 code,
502 * check that we have a minimum of 128 bytes of data, this is not
503 * clear why we need that though.
504 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100505 if ((cert_data_len < 128) || (cert_data_len >= 0x10000)) {
506 MBEDTLS_SSL_DEBUG_MSG(1, ("bad Certificate message"));
507 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
508 MBEDTLS_ERR_SSL_DECODE_ERROR);
509 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000510 }
511
Gilles Peskine449bd832023-01-11 14:50:10 +0100512 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, cert_data_len);
513 ret = mbedtls_x509_crt_parse_der(ssl->session_negotiate->peer_cert,
514 p, cert_data_len);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000515
Gilles Peskine449bd832023-01-11 14:50:10 +0100516 switch (ret) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000517 case 0: /*ok*/
518 break;
519 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
520 /* Ignore certificate with an unknown algorithm: maybe a
521 prior certificate was already trusted. */
522 break;
523
524 case MBEDTLS_ERR_X509_ALLOC_FAILED:
Gilles Peskine449bd832023-01-11 14:50:10 +0100525 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
526 MBEDTLS_ERR_X509_ALLOC_FAILED);
527 MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
528 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000529
530 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
Gilles Peskine449bd832023-01-11 14:50:10 +0100531 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT,
532 MBEDTLS_ERR_X509_UNKNOWN_VERSION);
533 MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
534 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000535
536 default:
Gilles Peskine449bd832023-01-11 14:50:10 +0100537 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_BAD_CERT,
538 ret);
539 MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
540 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000541 }
542
543 p += cert_data_len;
544
545 /* Certificate extensions length */
Gilles Peskine449bd832023-01-11 14:50:10 +0100546 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, 2);
547 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000548 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100549 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, extensions_len);
Jerry Yu2eaa7602022-08-04 17:28:15 +0800550
551 extensions_end = p + extensions_len;
Jerry Yu0d5cfb72022-10-31 14:15:48 +0800552 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu2eaa7602022-08-04 17:28:15 +0800553
Gilles Peskine449bd832023-01-11 14:50:10 +0100554 while (p < extensions_end) {
Jerry Yu2eaa7602022-08-04 17:28:15 +0800555 unsigned int extension_type;
556 size_t extension_data_len;
557
558 /*
Gilles Peskine449bd832023-01-11 14:50:10 +0100559 * struct {
560 * ExtensionType extension_type; (2 bytes)
561 * opaque extension_data<0..2^16-1>;
562 * } Extension;
563 */
564 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
565 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
566 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
Jerry Yu2eaa7602022-08-04 17:28:15 +0800567 p += 4;
568
Gilles Peskine449bd832023-01-11 14:50:10 +0100569 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
Jerry Yu2eaa7602022-08-04 17:28:15 +0800570
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800571 ret = mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +0100572 ssl, MBEDTLS_SSL_HS_CERTIFICATE, extension_type,
573 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CT);
574 if (ret != 0) {
575 return ret;
576 }
Jerry Yu0c354a22022-08-29 15:25:36 +0800577
Gilles Peskine449bd832023-01-11 14:50:10 +0100578 switch (extension_type) {
Jerry Yu2eaa7602022-08-04 17:28:15 +0800579 default:
Jerry Yu79aa7212022-11-08 21:30:21 +0800580 MBEDTLS_SSL_PRINT_EXT(
Jerry Yu0d5cfb72022-10-31 14:15:48 +0800581 3, MBEDTLS_SSL_HS_CERTIFICATE,
Gilles Peskine449bd832023-01-11 14:50:10 +0100582 extension_type, "( ignored )");
Jerry Yu2eaa7602022-08-04 17:28:15 +0800583 break;
584 }
585
586 p += extension_data_len;
587 }
588
Gilles Peskine449bd832023-01-11 14:50:10 +0100589 MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_CERTIFICATE,
590 handshake->received_extensions);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000591 }
592
XiaokangQian63e713e2022-05-15 04:26:57 +0000593exit:
Xiaofei Bai947571e2021-09-29 09:12:03 +0000594 /* Check that all the message is consumed. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100595 if (p != end) {
596 MBEDTLS_SSL_DEBUG_MSG(1, ("bad Certificate message"));
597 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
598 MBEDTLS_ERR_SSL_DECODE_ERROR);
599 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000600 }
601
Xiaokang Qian73437382023-03-29 08:24:12 +0000602 MBEDTLS_SSL_DEBUG_CRT(3, "peer certificate",
603 ssl->session_negotiate->peer_cert);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000604
Gilles Peskine449bd832023-01-11 14:50:10 +0100605 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000606}
607#else
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200608MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Crone3dac4a2022-06-10 17:21:51 +0200609MBEDTLS_STATIC_TESTABLE
Gilles Peskine449bd832023-01-11 14:50:10 +0100610int mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context *ssl,
611 const unsigned char *buf,
612 const unsigned char *end)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000613{
614 ((void) ssl);
615 ((void) buf);
616 ((void) end);
Gilles Peskine449bd832023-01-11 14:50:10 +0100617 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000618}
619#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Ronald Cronde08cf32022-10-04 17:15:35 +0200620#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Xiaofei Bai947571e2021-09-29 09:12:03 +0000621
Ronald Cronde08cf32022-10-04 17:15:35 +0200622#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000623#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000624/* Validate certificate chain sent by the server. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200625MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100626static int ssl_tls13_validate_certificate(mbedtls_ssl_context *ssl)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000627{
628 int ret = 0;
XiaokangQian989f06d2022-05-17 01:50:15 +0000629 int authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000630 mbedtls_x509_crt *ca_chain;
631 mbedtls_x509_crl *ca_crl;
Ronald Cron30c5a252022-06-16 19:31:06 +0200632 const char *ext_oid;
633 size_t ext_len;
Xiaofei Baiff456022021-10-28 06:50:17 +0000634 uint32_t verify_result = 0;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000635
XiaokangQian6b916b12022-04-25 07:29:34 +0000636 /* If SNI was used, overwrite authentication mode
637 * from the configuration. */
XiaokangQian989f06d2022-05-17 01:50:15 +0000638#if defined(MBEDTLS_SSL_SRV_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100639 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
XiaokangQian0557c942022-05-30 08:10:53 +0000640#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100641 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
XiaokangQian0557c942022-05-30 08:10:53 +0000642 authmode = ssl->handshake->sni_authmode;
Gilles Peskine449bd832023-01-11 14:50:10 +0100643 } else
XiaokangQian0557c942022-05-30 08:10:53 +0000644#endif
Gilles Peskine449bd832023-01-11 14:50:10 +0100645 authmode = ssl->conf->authmode;
XiaokangQian0557c942022-05-30 08:10:53 +0000646 }
XiaokangQian6b916b12022-04-25 07:29:34 +0000647#endif
648
649 /*
XiaokangQian989f06d2022-05-17 01:50:15 +0000650 * If the peer hasn't sent a certificate ( i.e. it sent
XiaokangQian6b916b12022-04-25 07:29:34 +0000651 * an empty certificate chain ), this is reflected in the peer CRT
652 * structure being unset.
653 * Check for that and handle it depending on the
XiaokangQian989f06d2022-05-17 01:50:15 +0000654 * authentication mode.
XiaokangQian6b916b12022-04-25 07:29:34 +0000655 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100656 if (ssl->session_negotiate->peer_cert == NULL) {
657 MBEDTLS_SSL_DEBUG_MSG(1, ("peer has no certificate"));
XiaokangQian989f06d2022-05-17 01:50:15 +0000658
XiaokangQian63e713e2022-05-15 04:26:57 +0000659#if defined(MBEDTLS_SSL_SRV_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100660 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
XiaokangQian63e713e2022-05-15 04:26:57 +0000661 /* The client was asked for a certificate but didn't send
662 * one. The client should know what's going on, so we
663 * don't send an alert.
664 */
665 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
Gilles Peskine449bd832023-01-11 14:50:10 +0100666 if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL) {
667 return 0;
668 } else {
Xiaokang Qian73437382023-03-29 08:24:12 +0000669 MBEDTLS_SSL_PEND_FATAL_ALERT(
670 MBEDTLS_SSL_ALERT_MSG_NO_CERT,
671 MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE);
Gilles Peskine449bd832023-01-11 14:50:10 +0100672 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
XiaokangQian989f06d2022-05-17 01:50:15 +0000673 }
XiaokangQian63e713e2022-05-15 04:26:57 +0000674 }
XiaokangQian6b916b12022-04-25 07:29:34 +0000675#endif /* MBEDTLS_SSL_SRV_C */
676
XiaokangQianc3017f62022-05-13 05:55:41 +0000677#if defined(MBEDTLS_SSL_CLI_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100678 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
679 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_NO_CERT,
680 MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE);
681 return MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE;
XiaokangQian63e713e2022-05-15 04:26:57 +0000682 }
XiaokangQianc3017f62022-05-13 05:55:41 +0000683#endif /* MBEDTLS_SSL_CLI_C */
XiaokangQian63e713e2022-05-15 04:26:57 +0000684 }
XiaokangQian6b916b12022-04-25 07:29:34 +0000685
Xiaofei Bai947571e2021-09-29 09:12:03 +0000686#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100687 if (ssl->handshake->sni_ca_chain != NULL) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000688 ca_chain = ssl->handshake->sni_ca_chain;
689 ca_crl = ssl->handshake->sni_ca_crl;
Gilles Peskine449bd832023-01-11 14:50:10 +0100690 } else
Xiaofei Bai947571e2021-09-29 09:12:03 +0000691#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
692 {
693 ca_chain = ssl->conf->ca_chain;
694 ca_crl = ssl->conf->ca_crl;
695 }
696
697 /*
698 * Main check: verify certificate
699 */
700 ret = mbedtls_x509_crt_verify_with_profile(
701 ssl->session_negotiate->peer_cert,
702 ca_chain, ca_crl,
703 ssl->conf->cert_profile,
704 ssl->hostname,
Xiaofei Baiff456022021-10-28 06:50:17 +0000705 &verify_result,
Gilles Peskine449bd832023-01-11 14:50:10 +0100706 ssl->conf->f_vrfy, ssl->conf->p_vrfy);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000707
Gilles Peskine449bd832023-01-11 14:50:10 +0100708 if (ret != 0) {
709 MBEDTLS_SSL_DEBUG_RET(1, "x509_verify_cert", ret);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000710 }
711
712 /*
713 * Secondary checks: always done, but change 'ret' only if it was 0
714 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100715 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
Ronald Cron30c5a252022-06-16 19:31:06 +0200716 ext_oid = MBEDTLS_OID_SERVER_AUTH;
Gilles Peskine449bd832023-01-11 14:50:10 +0100717 ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_SERVER_AUTH);
718 } else {
Ronald Cron30c5a252022-06-16 19:31:06 +0200719 ext_oid = MBEDTLS_OID_CLIENT_AUTH;
Gilles Peskine449bd832023-01-11 14:50:10 +0100720 ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_CLIENT_AUTH);
Ronald Cron30c5a252022-06-16 19:31:06 +0200721 }
722
Gilles Peskine449bd832023-01-11 14:50:10 +0100723 if ((mbedtls_x509_crt_check_key_usage(
724 ssl->session_negotiate->peer_cert,
725 MBEDTLS_X509_KU_DIGITAL_SIGNATURE) != 0) ||
726 (mbedtls_x509_crt_check_extended_key_usage(
727 ssl->session_negotiate->peer_cert,
728 ext_oid, ext_len) != 0)) {
729 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate (usage extensions)"));
730 if (ret == 0) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000731 ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
Gilles Peskine449bd832023-01-11 14:50:10 +0100732 }
Xiaofei Bai947571e2021-09-29 09:12:03 +0000733 }
734
XiaokangQian6b916b12022-04-25 07:29:34 +0000735 /* mbedtls_x509_crt_verify_with_profile is supposed to report a
736 * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
737 * with details encoded in the verification flags. All other kinds
738 * of error codes, including those from the user provided f_vrfy
739 * functions, are treated as fatal and lead to a failure of
Ronald Crone3dac4a2022-06-10 17:21:51 +0200740 * mbedtls_ssl_tls13_parse_certificate even if verification was optional.
741 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100742 if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
743 (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
744 ret == MBEDTLS_ERR_SSL_BAD_CERTIFICATE)) {
XiaokangQian6b916b12022-04-25 07:29:34 +0000745 ret = 0;
746 }
Xiaofei Bai947571e2021-09-29 09:12:03 +0000747
Gilles Peskine449bd832023-01-11 14:50:10 +0100748 if (ca_chain == NULL && authmode == MBEDTLS_SSL_VERIFY_REQUIRED) {
749 MBEDTLS_SSL_DEBUG_MSG(1, ("got no CA chain"));
Xiaofei Bai947571e2021-09-29 09:12:03 +0000750 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
751 }
752
Gilles Peskine449bd832023-01-11 14:50:10 +0100753 if (ret != 0) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000754 /* The certificate may have been rejected for several reasons.
755 Pick one and send the corresponding alert. Which alert to send
756 may be a subject of debate in some cases. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100757 if (verify_result & MBEDTLS_X509_BADCERT_OTHER) {
Xiaokang Qian73437382023-03-29 08:24:12 +0000758 MBEDTLS_SSL_PEND_FATAL_ALERT(
759 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED, ret);
Gilles Peskine449bd832023-01-11 14:50:10 +0100760 } else if (verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH) {
761 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_BAD_CERT, ret);
762 } else if (verify_result & (MBEDTLS_X509_BADCERT_KEY_USAGE |
763 MBEDTLS_X509_BADCERT_EXT_KEY_USAGE |
764 MBEDTLS_X509_BADCERT_NS_CERT_TYPE |
765 MBEDTLS_X509_BADCERT_BAD_PK |
766 MBEDTLS_X509_BADCERT_BAD_KEY)) {
Xiaokang Qian73437382023-03-29 08:24:12 +0000767 MBEDTLS_SSL_PEND_FATAL_ALERT(
768 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT, ret);
Gilles Peskine449bd832023-01-11 14:50:10 +0100769 } else if (verify_result & MBEDTLS_X509_BADCERT_EXPIRED) {
Xiaokang Qian73437382023-03-29 08:24:12 +0000770 MBEDTLS_SSL_PEND_FATAL_ALERT(
771 MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED, ret);
Gilles Peskine449bd832023-01-11 14:50:10 +0100772 } else if (verify_result & MBEDTLS_X509_BADCERT_REVOKED) {
Xiaokang Qian73437382023-03-29 08:24:12 +0000773 MBEDTLS_SSL_PEND_FATAL_ALERT(
774 MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED, ret);
Gilles Peskine449bd832023-01-11 14:50:10 +0100775 } else if (verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED) {
776 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA, ret);
777 } else {
Xiaokang Qian73437382023-03-29 08:24:12 +0000778 MBEDTLS_SSL_PEND_FATAL_ALERT(
779 MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN, ret);
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 }
Xiaofei Bai947571e2021-09-29 09:12:03 +0000781 }
782
783#if defined(MBEDTLS_DEBUG_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100784 if (verify_result != 0) {
785 MBEDTLS_SSL_DEBUG_MSG(3, ("! Certificate verification flags %08x",
786 (unsigned int) verify_result));
787 } else {
788 MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate verification flags clear"));
Xiaofei Bai947571e2021-09-29 09:12:03 +0000789 }
790#endif /* MBEDTLS_DEBUG_C */
791
Xiaofei Baiff456022021-10-28 06:50:17 +0000792 ssl->session_negotiate->verify_result = verify_result;
Gilles Peskine449bd832023-01-11 14:50:10 +0100793 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000794}
795#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200796MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100797static int ssl_tls13_validate_certificate(mbedtls_ssl_context *ssl)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000798{
799 ((void) ssl);
Gilles Peskine449bd832023-01-11 14:50:10 +0100800 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000801}
802#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Ronald Cronde08cf32022-10-04 17:15:35 +0200803#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Xiaofei Bai947571e2021-09-29 09:12:03 +0000804
Gilles Peskine449bd832023-01-11 14:50:10 +0100805int mbedtls_ssl_tls13_process_certificate(mbedtls_ssl_context *ssl)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000806{
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000807 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine449bd832023-01-11 14:50:10 +0100808 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate"));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000809
Ronald Cronde08cf32022-10-04 17:15:35 +0200810#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
XiaokangQianc3017f62022-05-13 05:55:41 +0000811 unsigned char *buf;
812 size_t buf_len;
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000813
Gilles Peskine449bd832023-01-11 14:50:10 +0100814 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
815 ssl, MBEDTLS_SSL_HS_CERTIFICATE,
816 &buf, &buf_len));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000817
XiaokangQianc3017f62022-05-13 05:55:41 +0000818 /* Parse the certificate chain sent by the peer. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100819 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_parse_certificate(ssl, buf,
820 buf + buf_len));
XiaokangQianc3017f62022-05-13 05:55:41 +0000821 /* Validate the certificate chain and set the verification results. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100822 MBEDTLS_SSL_PROC_CHK(ssl_tls13_validate_certificate(ssl));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000823
Xiaokang Qian73437382023-03-29 08:24:12 +0000824 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
825 ssl, MBEDTLS_SSL_HS_CERTIFICATE, buf, buf_len));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000826
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000827cleanup:
Gilles Peskineff2558a2023-09-05 21:10:39 +0200828#else /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
829 (void) ssl;
Ronald Cronde08cf32022-10-04 17:15:35 +0200830#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000831
Gilles Peskine449bd832023-01-11 14:50:10 +0100832 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate"));
833 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000834}
Ronald Cron928cbd32022-10-04 16:14:26 +0200835#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu7399d0d2022-01-30 17:54:19 +0800836/*
837 * enum {
838 * X509(0),
839 * RawPublicKey(2),
840 * (255)
841 * } CertificateType;
842 *
843 * struct {
844 * select (certificate_type) {
845 * case RawPublicKey:
846 * // From RFC 7250 ASN.1_subjectPublicKeyInfo
847 * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
848 *
849 * case X509:
850 * opaque cert_data<1..2^24-1>;
851 * };
852 * Extension extensions<0..2^16-1>;
853 * } CertificateEntry;
854 *
855 * struct {
856 * opaque certificate_request_context<0..2^8-1>;
857 * CertificateEntry certificate_list<0..2^24-1>;
858 * } Certificate;
859 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200860MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100861static int ssl_tls13_write_certificate_body(mbedtls_ssl_context *ssl,
862 unsigned char *buf,
863 unsigned char *end,
864 size_t *out_len)
Jerry Yu5cc35062022-01-28 16:16:08 +0800865{
Gilles Peskine449bd832023-01-11 14:50:10 +0100866 const mbedtls_x509_crt *crt = mbedtls_ssl_own_cert(ssl);
Jerry Yu3e536442022-02-15 11:05:59 +0800867 unsigned char *p = buf;
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800868 unsigned char *certificate_request_context =
Gilles Peskine449bd832023-01-11 14:50:10 +0100869 ssl->handshake->certificate_request_context;
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800870 unsigned char certificate_request_context_len =
Gilles Peskine449bd832023-01-11 14:50:10 +0100871 ssl->handshake->certificate_request_context_len;
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800872 unsigned char *p_certificate_list_len;
Jerry Yu5cc35062022-01-28 16:16:08 +0800873
Jerry Yu5cc35062022-01-28 16:16:08 +0800874
Jerry Yu3391ac02022-02-16 11:21:37 +0800875 /* ...
876 * opaque certificate_request_context<0..2^8-1>;
877 * ...
878 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100879 MBEDTLS_SSL_CHK_BUF_PTR(p, end, certificate_request_context_len + 1);
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800880 *p++ = certificate_request_context_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100881 if (certificate_request_context_len > 0) {
882 memcpy(p, certificate_request_context, certificate_request_context_len);
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800883 p += certificate_request_context_len;
Jerry Yu537530d2022-02-15 14:00:57 +0800884 }
885
Jerry Yu3391ac02022-02-16 11:21:37 +0800886 /* ...
887 * CertificateEntry certificate_list<0..2^24-1>;
888 * ...
889 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100890 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 3);
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800891 p_certificate_list_len = p;
Jerry Yu3e536442022-02-15 11:05:59 +0800892 p += 3;
893
Gilles Peskine449bd832023-01-11 14:50:10 +0100894 MBEDTLS_SSL_DEBUG_CRT(3, "own certificate", crt);
Jerry Yu5cc35062022-01-28 16:16:08 +0800895
Gilles Peskine449bd832023-01-11 14:50:10 +0100896 while (crt != NULL) {
Jerry Yu7399d0d2022-01-30 17:54:19 +0800897 size_t cert_data_len = crt->raw.len;
Jerry Yu5cc35062022-01-28 16:16:08 +0800898
Gilles Peskine449bd832023-01-11 14:50:10 +0100899 MBEDTLS_SSL_CHK_BUF_PTR(p, end, cert_data_len + 3 + 2);
900 MBEDTLS_PUT_UINT24_BE(cert_data_len, p, 0);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800901 p += 3;
Jerry Yu5cc35062022-01-28 16:16:08 +0800902
Gilles Peskine449bd832023-01-11 14:50:10 +0100903 memcpy(p, crt->raw.p, cert_data_len);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800904 p += cert_data_len;
905 crt = crt->next;
Jerry Yu5cc35062022-01-28 16:16:08 +0800906
907 /* Currently, we don't have any certificate extensions defined.
908 * Hence, we are sending an empty extension with length zero.
909 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100910 MBEDTLS_PUT_UINT16_BE(0, p, 0);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800911 p += 2;
Jerry Yu5cc35062022-01-28 16:16:08 +0800912 }
Jerry Yu5cc35062022-01-28 16:16:08 +0800913
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 MBEDTLS_PUT_UINT24_BE(p - p_certificate_list_len - 3,
915 p_certificate_list_len, 0);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800916
Jerry Yu3e536442022-02-15 11:05:59 +0800917 *out_len = p - buf;
Jerry Yu5cc35062022-01-28 16:16:08 +0800918
Jerry Yu7de2ff02022-11-08 21:43:46 +0800919 MBEDTLS_SSL_PRINT_EXTS(
Gilles Peskine449bd832023-01-11 14:50:10 +0100920 3, MBEDTLS_SSL_HS_CERTIFICATE, ssl->handshake->sent_extensions);
Jerry Yu4b8f2f72022-10-31 13:31:22 +0800921
Gilles Peskine449bd832023-01-11 14:50:10 +0100922 return 0;
Jerry Yu5cc35062022-01-28 16:16:08 +0800923}
Jerry Yu5cc35062022-01-28 16:16:08 +0800924
Gilles Peskine449bd832023-01-11 14:50:10 +0100925int mbedtls_ssl_tls13_write_certificate(mbedtls_ssl_context *ssl)
Jerry Yu5cc35062022-01-28 16:16:08 +0800926{
927 int ret;
Ronald Cron5bb8fc82022-03-09 07:00:13 +0100928 unsigned char *buf;
929 size_t buf_len, msg_len;
930
Gilles Peskine449bd832023-01-11 14:50:10 +0100931 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate"));
Jerry Yu5cc35062022-01-28 16:16:08 +0800932
Xiaokang Qian73437382023-03-29 08:24:12 +0000933 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
934 ssl, MBEDTLS_SSL_HS_CERTIFICATE, &buf, &buf_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800935
Gilles Peskine449bd832023-01-11 14:50:10 +0100936 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_body(ssl,
937 buf,
938 buf + buf_len,
939 &msg_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800940
Xiaokang Qian73437382023-03-29 08:24:12 +0000941 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
942 ssl, MBEDTLS_SSL_HS_CERTIFICATE, buf, msg_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800943
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
945 ssl, buf_len, msg_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800946cleanup:
947
Gilles Peskine449bd832023-01-11 14:50:10 +0100948 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate"));
949 return ret;
Jerry Yu5cc35062022-01-28 16:16:08 +0800950}
951
Jerry Yu3e536442022-02-15 11:05:59 +0800952/*
953 * STATE HANDLING: Output Certificate Verify
954 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100955int mbedtls_ssl_tls13_check_sig_alg_cert_key_match(uint16_t sig_alg,
956 mbedtls_pk_context *key)
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800957{
Dave Rodgman2eab4622023-10-05 13:30:37 +0100958 mbedtls_pk_type_t pk_type = (mbedtls_pk_type_t) mbedtls_ssl_sig_from_pk(key);
Gilles Peskine449bd832023-01-11 14:50:10 +0100959 size_t key_size = mbedtls_pk_get_bitlen(key);
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800960
Gilles Peskine449bd832023-01-11 14:50:10 +0100961 switch (pk_type) {
Jerry Yu67eced02022-02-25 13:37:36 +0800962 case MBEDTLS_SSL_SIG_ECDSA:
Gilles Peskine449bd832023-01-11 14:50:10 +0100963 switch (key_size) {
Jerry Yu67eced02022-02-25 13:37:36 +0800964 case 256:
Gilles Peskine449bd832023-01-11 14:50:10 +0100965 return
966 sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800967
Jerry Yu67eced02022-02-25 13:37:36 +0800968 case 384:
Gilles Peskine449bd832023-01-11 14:50:10 +0100969 return
970 sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800971
Jerry Yu67eced02022-02-25 13:37:36 +0800972 case 521:
Gilles Peskine449bd832023-01-11 14:50:10 +0100973 return
974 sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512;
Jerry Yu67eced02022-02-25 13:37:36 +0800975 default:
Jerry Yu67eced02022-02-25 13:37:36 +0800976 break;
977 }
978 break;
Jerry Yu67eced02022-02-25 13:37:36 +0800979
Jerry Yu67eced02022-02-25 13:37:36 +0800980 case MBEDTLS_SSL_SIG_RSA:
Gilles Peskine449bd832023-01-11 14:50:10 +0100981 switch (sig_alg) {
Ronald Cron38391bf2022-09-16 11:19:27 +0200982 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256: /* Intentional fallthrough */
983 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384: /* Intentional fallthrough */
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800984 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512:
Gilles Peskine449bd832023-01-11 14:50:10 +0100985 return 1;
Jerry Yuc2e04932022-06-27 22:13:03 +0800986
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800987 default:
988 break;
Jerry Yucef3f332022-03-22 23:00:13 +0800989 }
Jerry Yu67eced02022-02-25 13:37:36 +0800990 break;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800991
Jerry Yu67eced02022-02-25 13:37:36 +0800992 default:
Jerry Yu67eced02022-02-25 13:37:36 +0800993 break;
994 }
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800995
Gilles Peskine449bd832023-01-11 14:50:10 +0100996 return 0;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800997}
998
Ronald Cronce7d76e2022-07-08 18:56:49 +0200999MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001000static int ssl_tls13_write_certificate_verify_body(mbedtls_ssl_context *ssl,
1001 unsigned char *buf,
1002 unsigned char *end,
1003 size_t *out_len)
Jerry Yu8511f122022-01-29 10:01:04 +08001004{
Ronald Cron067a1e72022-09-16 13:44:49 +02001005 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu3e536442022-02-15 11:05:59 +08001006 unsigned char *p = buf;
Jerry Yu8511f122022-01-29 10:01:04 +08001007 mbedtls_pk_context *own_key;
Jerry Yu3e536442022-02-15 11:05:59 +08001008
Gilles Peskine449bd832023-01-11 14:50:10 +01001009 unsigned char handshake_hash[MBEDTLS_TLS1_3_MD_MAX_SIZE];
Jerry Yu8511f122022-01-29 10:01:04 +08001010 size_t handshake_hash_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001011 unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
Jerry Yu3e536442022-02-15 11:05:59 +08001012 size_t verify_buffer_len;
Ronald Cron067a1e72022-09-16 13:44:49 +02001013
1014 uint16_t *sig_alg = ssl->handshake->received_sig_algs;
Jerry Yu3e536442022-02-15 11:05:59 +08001015 size_t signature_len = 0;
Jerry Yu8511f122022-01-29 10:01:04 +08001016
Jerry Yu0b7b1012022-02-23 12:23:05 +08001017 *out_len = 0;
1018
Gilles Peskine449bd832023-01-11 14:50:10 +01001019 own_key = mbedtls_ssl_own_key(ssl);
1020 if (own_key == NULL) {
1021 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
1022 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu8511f122022-01-29 10:01:04 +08001023 }
1024
Xiaokang Qian73437382023-03-29 08:24:12 +00001025 ret = mbedtls_ssl_get_handshake_transcript(
Dave Rodgman2eab4622023-10-05 13:30:37 +01001026 ssl, (mbedtls_md_type_t) ssl->handshake->ciphersuite_info->mac,
Xiaokang Qian73437382023-03-29 08:24:12 +00001027 handshake_hash, sizeof(handshake_hash), &handshake_hash_len);
Gilles Peskine449bd832023-01-11 14:50:10 +01001028 if (ret != 0) {
1029 return ret;
1030 }
Jerry Yu8511f122022-01-29 10:01:04 +08001031
Gilles Peskine449bd832023-01-11 14:50:10 +01001032 MBEDTLS_SSL_DEBUG_BUF(3, "handshake hash",
1033 handshake_hash,
1034 handshake_hash_len);
Jerry Yu8511f122022-01-29 10:01:04 +08001035
Gilles Peskine449bd832023-01-11 14:50:10 +01001036 ssl_tls13_create_verify_structure(handshake_hash, handshake_hash_len,
1037 verify_buffer, &verify_buffer_len,
1038 ssl->conf->endpoint);
Jerry Yu8511f122022-01-29 10:01:04 +08001039
1040 /*
1041 * struct {
1042 * SignatureScheme algorithm;
1043 * opaque signature<0..2^16-1>;
1044 * } CertificateVerify;
1045 */
Ronald Cron067a1e72022-09-16 13:44:49 +02001046 /* Check there is space for the algorithm identifier (2 bytes) and the
1047 * signature length (2 bytes).
1048 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001049 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
Ronald Cron067a1e72022-09-16 13:44:49 +02001050
Gilles Peskine449bd832023-01-11 14:50:10 +01001051 for (; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++) {
Ronald Cron067a1e72022-09-16 13:44:49 +02001052 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
1053 mbedtls_pk_type_t pk_type = MBEDTLS_PK_NONE;
1054 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
1055 psa_algorithm_t psa_algorithm = PSA_ALG_NONE;
1056 unsigned char verify_hash[PSA_HASH_MAX_SIZE];
1057 size_t verify_hash_len;
Jerry Yu67eced02022-02-25 13:37:36 +08001058
Gilles Peskine449bd832023-01-11 14:50:10 +01001059 if (!mbedtls_ssl_sig_alg_is_offered(ssl, *sig_alg)) {
Ronald Cron067a1e72022-09-16 13:44:49 +02001060 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001061 }
Jerry Yu67eced02022-02-25 13:37:36 +08001062
Gilles Peskine449bd832023-01-11 14:50:10 +01001063 if (!mbedtls_ssl_tls13_sig_alg_for_cert_verify_is_supported(*sig_alg)) {
Ronald Cron067a1e72022-09-16 13:44:49 +02001064 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001065 }
Ronald Cron067a1e72022-09-16 13:44:49 +02001066
Gilles Peskine449bd832023-01-11 14:50:10 +01001067 if (!mbedtls_ssl_tls13_check_sig_alg_cert_key_match(*sig_alg, own_key)) {
Ronald Cron067a1e72022-09-16 13:44:49 +02001068 continue;
Gilles Peskine449bd832023-01-11 14:50:10 +01001069 }
Ronald Cron067a1e72022-09-16 13:44:49 +02001070
Gilles Peskine449bd832023-01-11 14:50:10 +01001071 if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
1072 *sig_alg, &pk_type, &md_alg) != 0) {
1073 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Ronald Cron067a1e72022-09-16 13:44:49 +02001074 }
1075
1076 /* Hash verify buffer with indicated hash function */
Manuel Pégourié-Gonnard2d6d9932023-03-28 11:38:08 +02001077 psa_algorithm = mbedtls_md_psa_alg_from_type(md_alg);
Gilles Peskine449bd832023-01-11 14:50:10 +01001078 status = psa_hash_compute(psa_algorithm,
1079 verify_buffer,
1080 verify_buffer_len,
1081 verify_hash, sizeof(verify_hash),
1082 &verify_hash_len);
1083 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001084 return PSA_TO_MBEDTLS_ERR(status);
Ronald Cron067a1e72022-09-16 13:44:49 +02001085 }
1086
Gilles Peskine449bd832023-01-11 14:50:10 +01001087 MBEDTLS_SSL_DEBUG_BUF(3, "verify hash", verify_hash, verify_hash_len);
1088
1089 if ((ret = mbedtls_pk_sign_ext(pk_type, own_key,
1090 md_alg, verify_hash, verify_hash_len,
1091 p + 4, (size_t) (end - (p + 4)), &signature_len,
1092 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
1093 MBEDTLS_SSL_DEBUG_MSG(2, ("CertificateVerify signature failed with %s",
1094 mbedtls_ssl_sig_alg_to_str(*sig_alg)));
1095 MBEDTLS_SSL_DEBUG_RET(2, "mbedtls_pk_sign_ext", ret);
1096
1097 /* The signature failed. This is possible if the private key
1098 * was not suitable for the signature operation as purposely we
1099 * did not check its suitability completely. Let's try with
1100 * another signature algorithm.
1101 */
1102 continue;
1103 }
1104
1105 MBEDTLS_SSL_DEBUG_MSG(2, ("CertificateVerify signature with %s",
1106 mbedtls_ssl_sig_alg_to_str(*sig_alg)));
Ronald Cron067a1e72022-09-16 13:44:49 +02001107
1108 break;
1109 }
1110
Gilles Peskine449bd832023-01-11 14:50:10 +01001111 if (*sig_alg == MBEDTLS_TLS1_3_SIG_NONE) {
1112 MBEDTLS_SSL_DEBUG_MSG(1, ("no suitable signature algorithm"));
1113 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1114 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
1115 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu8511f122022-01-29 10:01:04 +08001116 }
1117
Gilles Peskine449bd832023-01-11 14:50:10 +01001118 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, 0);
1119 MBEDTLS_PUT_UINT16_BE(signature_len, p, 2);
Jerry Yuf3b46b52022-06-19 16:52:27 +08001120
Ronald Cron067a1e72022-09-16 13:44:49 +02001121 *out_len = 4 + signature_len;
Jerry Yu8c338862022-03-23 13:34:04 +08001122
Gilles Peskine449bd832023-01-11 14:50:10 +01001123 return 0;
Jerry Yu8511f122022-01-29 10:01:04 +08001124}
Jerry Yu8511f122022-01-29 10:01:04 +08001125
Gilles Peskine449bd832023-01-11 14:50:10 +01001126int mbedtls_ssl_tls13_write_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu8511f122022-01-29 10:01:04 +08001127{
1128 int ret = 0;
Jerry Yuca133a32022-02-15 14:22:05 +08001129 unsigned char *buf;
1130 size_t buf_len, msg_len;
1131
Gilles Peskine449bd832023-01-11 14:50:10 +01001132 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate verify"));
Jerry Yu8511f122022-01-29 10:01:04 +08001133
Xiaokang Qian73437382023-03-29 08:24:12 +00001134 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
1135 ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
1136 &buf, &buf_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001137
Gilles Peskine449bd832023-01-11 14:50:10 +01001138 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_verify_body(
1139 ssl, buf, buf + buf_len, &msg_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001140
Xiaokang Qian73437382023-03-29 08:24:12 +00001141 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
1142 ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
1143 buf, msg_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001144
Gilles Peskine449bd832023-01-11 14:50:10 +01001145 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
1146 ssl, buf_len, msg_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001147
1148cleanup:
1149
Gilles Peskine449bd832023-01-11 14:50:10 +01001150 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate verify"));
1151 return ret;
Jerry Yu8511f122022-01-29 10:01:04 +08001152}
1153
Ronald Cron928cbd32022-10-04 16:14:26 +02001154#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu90f152d2022-01-29 22:12:42 +08001155
Jerry Yu5cc35062022-01-28 16:16:08 +08001156/*
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001157 *
XiaokangQianc5c39d52021-11-09 11:55:10 +00001158 * STATE HANDLING: Incoming Finished message.
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001159 */
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001160/*
1161 * Implementation
1162 */
1163
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001164MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001165static int ssl_tls13_preprocess_finished_message(mbedtls_ssl_context *ssl)
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001166{
1167 int ret;
1168
Xiaokang Qian73437382023-03-29 08:24:12 +00001169 ret = mbedtls_ssl_tls13_calculate_verify_data(
1170 ssl,
1171 ssl->handshake->state_local.finished_in.digest,
1172 sizeof(ssl->handshake->state_local.finished_in.digest),
1173 &ssl->handshake->state_local.finished_in.digest_len,
1174 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ?
1175 MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT);
Gilles Peskine449bd832023-01-11 14:50:10 +01001176 if (ret != 0) {
1177 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_calculate_verify_data", ret);
1178 return ret;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001179 }
1180
Gilles Peskine449bd832023-01-11 14:50:10 +01001181 return 0;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001182}
1183
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001184MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001185static int ssl_tls13_parse_finished_message(mbedtls_ssl_context *ssl,
1186 const unsigned char *buf,
1187 const unsigned char *end)
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001188{
XiaokangQian33062842021-11-11 03:37:45 +00001189 /*
1190 * struct {
XiaokangQianc13f9352021-11-11 06:13:22 +00001191 * opaque verify_data[Hash.length];
XiaokangQian33062842021-11-11 03:37:45 +00001192 * } Finished;
1193 */
1194 const unsigned char *expected_verify_data =
1195 ssl->handshake->state_local.finished_in.digest;
1196 size_t expected_verify_data_len =
1197 ssl->handshake->state_local.finished_in.digest_len;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001198 /* Structural validation */
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 if ((size_t) (end - buf) != expected_verify_data_len) {
1200 MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001201
Gilles Peskine449bd832023-01-11 14:50:10 +01001202 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
1203 MBEDTLS_ERR_SSL_DECODE_ERROR);
1204 return MBEDTLS_ERR_SSL_DECODE_ERROR;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001205 }
1206
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 MBEDTLS_SSL_DEBUG_BUF(4, "verify_data (self-computed):",
1208 expected_verify_data,
1209 expected_verify_data_len);
1210 MBEDTLS_SSL_DEBUG_BUF(4, "verify_data (received message):", buf,
1211 expected_verify_data_len);
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001212
1213 /* Semantic validation */
Gilles Peskine449bd832023-01-11 14:50:10 +01001214 if (mbedtls_ct_memcmp(buf,
1215 expected_verify_data,
1216 expected_verify_data_len) != 0) {
1217 MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001218
Gilles Peskine449bd832023-01-11 14:50:10 +01001219 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
1220 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
1221 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001222 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001223 return 0;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001224}
1225
Gilles Peskine449bd832023-01-11 14:50:10 +01001226int mbedtls_ssl_tls13_process_finished_message(mbedtls_ssl_context *ssl)
XiaokangQianc5c39d52021-11-09 11:55:10 +00001227{
XiaokangQian33062842021-11-11 03:37:45 +00001228 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001229 unsigned char *buf;
Xiaofei Baieef15042021-11-18 07:29:56 +00001230 size_t buf_len;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001231
Gilles Peskine449bd832023-01-11 14:50:10 +01001232 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse finished message"));
XiaokangQianc5c39d52021-11-09 11:55:10 +00001233
Xiaokang Qian73437382023-03-29 08:24:12 +00001234 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
1235 ssl, MBEDTLS_SSL_HS_FINISHED, &buf, &buf_len));
Jerry Yu0a92d6c2022-05-16 16:54:46 +08001236
1237 /* Preprocessing step: Compute handshake digest */
Gilles Peskine449bd832023-01-11 14:50:10 +01001238 MBEDTLS_SSL_PROC_CHK(ssl_tls13_preprocess_finished_message(ssl));
Jerry Yu0a92d6c2022-05-16 16:54:46 +08001239
Xiaokang Qian73437382023-03-29 08:24:12 +00001240 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_finished_message(
1241 ssl, buf, buf + buf_len));
Jerry Yu0a92d6c2022-05-16 16:54:46 +08001242
Xiaokang Qian73437382023-03-29 08:24:12 +00001243 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
1244 ssl, MBEDTLS_SSL_HS_FINISHED, buf, buf_len));
XiaokangQianc5c39d52021-11-09 11:55:10 +00001245
1246cleanup:
1247
Gilles Peskine449bd832023-01-11 14:50:10 +01001248 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse finished message"));
1249 return ret;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001250}
1251
XiaokangQian74af2a82021-09-22 07:40:30 +00001252/*
1253 *
XiaokangQiancc90c942021-11-09 12:30:09 +00001254 * STATE HANDLING: Write and send Finished message.
XiaokangQian74af2a82021-09-22 07:40:30 +00001255 *
1256 */
XiaokangQian74af2a82021-09-22 07:40:30 +00001257/*
XiaokangQian35dc6252021-11-11 08:16:19 +00001258 * Implement
XiaokangQian74af2a82021-09-22 07:40:30 +00001259 */
1260
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001261MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001262static int ssl_tls13_prepare_finished_message(mbedtls_ssl_context *ssl)
XiaokangQian74af2a82021-09-22 07:40:30 +00001263{
1264 int ret;
1265
1266 /* Compute transcript of handshake up to now. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001267 ret = mbedtls_ssl_tls13_calculate_verify_data(ssl,
1268 ssl->handshake->state_local.finished_out.digest,
1269 sizeof(ssl->handshake->state_local.finished_out.
1270 digest),
1271 &ssl->handshake->state_local.finished_out.digest_len,
1272 ssl->conf->endpoint);
XiaokangQian74af2a82021-09-22 07:40:30 +00001273
Gilles Peskine449bd832023-01-11 14:50:10 +01001274 if (ret != 0) {
1275 MBEDTLS_SSL_DEBUG_RET(1, "calculate_verify_data failed", ret);
1276 return ret;
XiaokangQian74af2a82021-09-22 07:40:30 +00001277 }
1278
Gilles Peskine449bd832023-01-11 14:50:10 +01001279 return 0;
XiaokangQian74af2a82021-09-22 07:40:30 +00001280}
1281
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001282MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001283static int ssl_tls13_write_finished_message_body(mbedtls_ssl_context *ssl,
1284 unsigned char *buf,
1285 unsigned char *end,
1286 size_t *out_len)
XiaokangQian74af2a82021-09-22 07:40:30 +00001287{
XiaokangQian8773aa02021-11-10 07:33:09 +00001288 size_t verify_data_len = ssl->handshake->state_local.finished_out.digest_len;
XiaokangQian0fa66432021-11-15 03:33:57 +00001289 /*
1290 * struct {
1291 * opaque verify_data[Hash.length];
1292 * } Finished;
1293 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, verify_data_len);
XiaokangQian74af2a82021-09-22 07:40:30 +00001295
Gilles Peskine449bd832023-01-11 14:50:10 +01001296 memcpy(buf, ssl->handshake->state_local.finished_out.digest,
1297 verify_data_len);
XiaokangQian74af2a82021-09-22 07:40:30 +00001298
Xiaofei Baid25fab62021-12-02 06:36:27 +00001299 *out_len = verify_data_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01001300 return 0;
XiaokangQian74af2a82021-09-22 07:40:30 +00001301}
XiaokangQianc5c39d52021-11-09 11:55:10 +00001302
XiaokangQian35dc6252021-11-11 08:16:19 +00001303/* Main entry point: orchestrates the other functions */
Gilles Peskine449bd832023-01-11 14:50:10 +01001304int mbedtls_ssl_tls13_write_finished_message(mbedtls_ssl_context *ssl)
XiaokangQian35dc6252021-11-11 08:16:19 +00001305{
1306 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1307 unsigned char *buf;
1308 size_t buf_len, msg_len;
1309
Gilles Peskine449bd832023-01-11 14:50:10 +01001310 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write finished message"));
XiaokangQian35dc6252021-11-11 08:16:19 +00001311
Gilles Peskine449bd832023-01-11 14:50:10 +01001312 MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_finished_message(ssl));
XiaokangQiandce82242021-11-15 06:01:26 +00001313
Gilles Peskine449bd832023-01-11 14:50:10 +01001314 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
1315 MBEDTLS_SSL_HS_FINISHED, &buf, &buf_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001316
Gilles Peskine449bd832023-01-11 14:50:10 +01001317 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_finished_message_body(
1318 ssl, buf, buf + buf_len, &msg_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001319
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001320 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(ssl,
Manuel Pégourié-Gonnard43cc1272023-02-06 11:48:19 +01001321 MBEDTLS_SSL_HS_FINISHED, buf, msg_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001322
Gilles Peskine449bd832023-01-11 14:50:10 +01001323 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
1324 ssl, buf_len, msg_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001325cleanup:
1326
Gilles Peskine449bd832023-01-11 14:50:10 +01001327 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write finished message"));
1328 return ret;
XiaokangQian35dc6252021-11-11 08:16:19 +00001329}
1330
Gilles Peskine449bd832023-01-11 14:50:10 +01001331void mbedtls_ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl)
Jerry Yu378254d2021-10-30 21:44:47 +08001332{
1333
Gilles Peskine449bd832023-01-11 14:50:10 +01001334 MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup"));
Jerry Yu378254d2021-10-30 21:44:47 +08001335
Gilles Peskine449bd832023-01-11 14:50:10 +01001336 MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to application keys for inbound traffic"));
1337 mbedtls_ssl_set_inbound_transform(ssl, ssl->transform_application);
Jerry Yue8c1fca2022-05-18 14:48:56 +08001338
Gilles Peskine449bd832023-01-11 14:50:10 +01001339 MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to application keys for outbound traffic"));
1340 mbedtls_ssl_set_outbound_transform(ssl, ssl->transform_application);
Jerry Yue8c1fca2022-05-18 14:48:56 +08001341
Jerry Yu378254d2021-10-30 21:44:47 +08001342 /*
Jerry Yucfe64f02021-11-15 13:54:06 +08001343 * Free the previous session and switch to the current one.
Jerry Yu378254d2021-10-30 21:44:47 +08001344 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001345 if (ssl->session) {
1346 mbedtls_ssl_session_free(ssl->session);
1347 mbedtls_free(ssl->session);
Jerry Yu378254d2021-10-30 21:44:47 +08001348 }
1349 ssl->session = ssl->session_negotiate;
1350 ssl->session_negotiate = NULL;
1351
Gilles Peskine449bd832023-01-11 14:50:10 +01001352 MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup"));
Jerry Yu378254d2021-10-30 21:44:47 +08001353}
1354
Ronald Cron49ad6192021-11-24 16:25:31 +01001355/*
1356 *
1357 * STATE HANDLING: Write ChangeCipherSpec
1358 *
1359 */
1360#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001361MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001362static int ssl_tls13_write_change_cipher_spec_body(mbedtls_ssl_context *ssl,
1363 unsigned char *buf,
1364 unsigned char *end,
1365 size_t *olen)
Ronald Cron49ad6192021-11-24 16:25:31 +01001366{
1367 ((void) ssl);
1368
Gilles Peskine449bd832023-01-11 14:50:10 +01001369 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 1);
Ronald Cron49ad6192021-11-24 16:25:31 +01001370 buf[0] = 1;
1371 *olen = 1;
1372
Gilles Peskine449bd832023-01-11 14:50:10 +01001373 return 0;
Ronald Cron49ad6192021-11-24 16:25:31 +01001374}
1375
Gilles Peskine449bd832023-01-11 14:50:10 +01001376int mbedtls_ssl_tls13_write_change_cipher_spec(mbedtls_ssl_context *ssl)
Ronald Cron49ad6192021-11-24 16:25:31 +01001377{
1378 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1379
Gilles Peskine449bd832023-01-11 14:50:10 +01001380 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write change cipher spec"));
Ronald Cron49ad6192021-11-24 16:25:31 +01001381
Ronald Cron49ad6192021-11-24 16:25:31 +01001382 /* Write CCS message */
Gilles Peskine449bd832023-01-11 14:50:10 +01001383 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_change_cipher_spec_body(
1384 ssl, ssl->out_msg,
1385 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
1386 &ssl->out_msglen));
Ronald Cron49ad6192021-11-24 16:25:31 +01001387
1388 ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC;
1389
Ronald Cron49ad6192021-11-24 16:25:31 +01001390 /* Dispatch message */
Gilles Peskine449bd832023-01-11 14:50:10 +01001391 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_write_record(ssl, 0));
Ronald Cron49ad6192021-11-24 16:25:31 +01001392
1393cleanup:
1394
Gilles Peskine449bd832023-01-11 14:50:10 +01001395 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write change cipher spec"));
1396 return ret;
Ronald Cron49ad6192021-11-24 16:25:31 +01001397}
1398
1399#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
1400
Xiaokang Qianecc29482022-11-02 07:52:47 +00001401/* Early Data Indication Extension
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001402 *
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001403 * struct {
1404 * select ( Handshake.msg_type ) {
Xiaokang Qianecc29482022-11-02 07:52:47 +00001405 * ...
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001406 * case client_hello: Empty;
1407 * case encrypted_extensions: Empty;
1408 * };
1409 * } EarlyDataIndication;
1410 */
1411#if defined(MBEDTLS_SSL_EARLY_DATA)
Gilles Peskine449bd832023-01-11 14:50:10 +01001412int mbedtls_ssl_tls13_write_early_data_ext(mbedtls_ssl_context *ssl,
1413 unsigned char *buf,
1414 const unsigned char *end,
1415 size_t *out_len)
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001416{
1417 unsigned char *p = buf;
1418 *out_len = 0;
1419 ((void) ssl);
1420
Gilles Peskine449bd832023-01-11 14:50:10 +01001421 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001422
Gilles Peskine449bd832023-01-11 14:50:10 +01001423 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EARLY_DATA, p, 0);
1424 MBEDTLS_PUT_UINT16_BE(0, p, 2);
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001425
1426 *out_len = 4;
Xiaokang Qian2cd5ce02022-11-15 10:33:53 +00001427
Gilles Peskine449bd832023-01-11 14:50:10 +01001428 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_EARLY_DATA);
Xiaokang Qian2cd5ce02022-11-15 10:33:53 +00001429
Gilles Peskine449bd832023-01-11 14:50:10 +01001430 return 0;
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001431}
1432#endif /* MBEDTLS_SSL_EARLY_DATA */
1433
XiaokangQian78b1fa72022-01-19 06:56:30 +00001434/* Reset SSL context and update hash for handling HRR.
1435 *
1436 * Replace Transcript-Hash(X) by
1437 * Transcript-Hash( message_hash ||
1438 * 00 00 Hash.length ||
1439 * X )
1440 * A few states of the handshake are preserved, including:
1441 * - session ID
1442 * - session ticket
1443 * - negotiated ciphersuite
1444 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001445int mbedtls_ssl_reset_transcript_for_hrr(mbedtls_ssl_context *ssl)
XiaokangQian78b1fa72022-01-19 06:56:30 +00001446{
1447 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Przemyslaw Stekielda645252022-09-14 12:50:51 +02001448 unsigned char hash_transcript[PSA_HASH_MAX_SIZE + 4];
XiaokangQian0ece9982022-01-24 08:56:23 +00001449 size_t hash_len;
Xiaokang Qian6b980012023-02-07 03:17:45 +00001450 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
1451 ssl->handshake->ciphersuite_info;
XiaokangQian78b1fa72022-01-19 06:56:30 +00001452
Gilles Peskine449bd832023-01-11 14:50:10 +01001453 MBEDTLS_SSL_DEBUG_MSG(3, ("Reset SSL session for HRR"));
XiaokangQian78b1fa72022-01-19 06:56:30 +00001454
Dave Rodgman2eab4622023-10-05 13:30:37 +01001455 ret = mbedtls_ssl_get_handshake_transcript(ssl, (mbedtls_md_type_t) ciphersuite_info->mac,
Gilles Peskine449bd832023-01-11 14:50:10 +01001456 hash_transcript + 4,
1457 PSA_HASH_MAX_SIZE,
1458 &hash_len);
1459 if (ret != 0) {
Manuel Pégourié-Gonnardda7979b2023-02-21 09:31:10 +01001460 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_get_handshake_transcript", ret);
Gilles Peskine449bd832023-01-11 14:50:10 +01001461 return ret;
XiaokangQian0ece9982022-01-24 08:56:23 +00001462 }
1463
1464 hash_transcript[0] = MBEDTLS_SSL_HS_MESSAGE_HASH;
1465 hash_transcript[1] = 0;
1466 hash_transcript[2] = 0;
1467 hash_transcript[3] = (unsigned char) hash_len;
1468
1469 hash_len += 4;
1470
Manuel Pégourié-Gonnardda7979b2023-02-21 09:31:10 +01001471 MBEDTLS_SSL_DEBUG_BUF(4, "Truncated handshake transcript",
1472 hash_transcript, hash_len);
1473
Manuel Pégourié-Gonnardd7a7a232023-02-05 10:26:49 +01001474 /* Reset running hash and replace it with a hash of the transcript */
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001475 ret = mbedtls_ssl_reset_checksum(ssl);
1476 if (ret != 0) {
1477 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_reset_checksum", ret);
1478 return ret;
1479 }
1480 ret = ssl->handshake->update_checksum(ssl, hash_transcript, hash_len);
1481 if (ret != 0) {
1482 MBEDTLS_SSL_DEBUG_RET(1, "update_checksum", ret);
1483 return ret;
1484 }
Przemyslaw Stekiel4b3fff42022-02-14 16:39:52 +01001485
Gilles Peskine449bd832023-01-11 14:50:10 +01001486 return ret;
XiaokangQian78b1fa72022-01-19 06:56:30 +00001487}
1488
Valerio Settic9ae8622023-07-25 11:23:50 +02001489#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001490
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001491int mbedtls_ssl_tls13_read_public_xxdhe_share(mbedtls_ssl_context *ssl,
Gilles Peskine449bd832023-01-11 14:50:10 +01001492 const unsigned char *buf,
1493 size_t buf_len)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001494{
Gilles Peskine449bd832023-01-11 14:50:10 +01001495 uint8_t *p = (uint8_t *) buf;
XiaokangQiancfd925f2022-04-14 07:10:37 +00001496 const uint8_t *end = buf + buf_len;
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001497 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001498
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001499 /* Get size of the TLS opaque key_exchange field of the KeyShareEntry struct. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001500 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1501 uint16_t peerkey_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001502 p += 2;
XiaokangQian3207a322022-02-23 03:15:27 +00001503
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001504 /* Check if key size is consistent with given buffer length. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001505 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, peerkey_len);
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001506
Gilles Peskine12c5aaa2023-10-02 14:55:45 +02001507 /* Store peer's ECDH/FFDH public key. */
1508 if (peerkey_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine530c4232023-10-02 15:37:23 +02001509 MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %u > %" MBEDTLS_PRINTF_SIZET,
1510 (unsigned) peerkey_len,
1511 sizeof(handshake->xxdh_psa_peerkey)));
Gilles Peskine12c5aaa2023-10-02 14:55:45 +02001512 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1513 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001514 memcpy(handshake->xxdh_psa_peerkey, p, peerkey_len);
1515 handshake->xxdh_psa_peerkey_len = peerkey_len;
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001516
Gilles Peskine449bd832023-01-11 14:50:10 +01001517 return 0;
XiaokangQian3207a322022-02-23 03:15:27 +00001518}
Jerry Yu89e103c2022-03-30 22:43:29 +08001519
Valerio Setti711f8532023-07-31 11:28:07 +02001520#if defined(PSA_WANT_ALG_FFDH)
Przemek Stekielda4fba62023-06-02 14:52:28 +02001521static psa_status_t mbedtls_ssl_get_psa_ffdh_info_from_tls_id(
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001522 uint16_t tls_id, size_t *bits, psa_key_type_t *key_type)
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001523{
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001524 switch (tls_id) {
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001525 case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048:
1526 *bits = 2048;
1527 *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1528 return PSA_SUCCESS;
1529 case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072:
1530 *bits = 3072;
1531 *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1532 return PSA_SUCCESS;
1533 case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096:
1534 *bits = 4096;
1535 *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1536 return PSA_SUCCESS;
1537 case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144:
1538 *bits = 6144;
1539 *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1540 return PSA_SUCCESS;
1541 case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192:
1542 *bits = 8192;
1543 *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
1544 return PSA_SUCCESS;
1545 default:
1546 return PSA_ERROR_NOT_SUPPORTED;
1547 }
1548}
Valerio Setti711f8532023-07-31 11:28:07 +02001549#endif /* PSA_WANT_ALG_FFDH */
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001550
Przemek Stekiel408569f2023-07-06 11:26:44 +02001551int mbedtls_ssl_tls13_generate_and_write_xxdh_key_exchange(
Gilles Peskine449bd832023-01-11 14:50:10 +01001552 mbedtls_ssl_context *ssl,
1553 uint16_t named_group,
1554 unsigned char *buf,
1555 unsigned char *end,
1556 size_t *out_len)
Jerry Yu89e103c2022-03-30 22:43:29 +08001557{
1558 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
1559 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1560 psa_key_attributes_t key_attributes;
1561 size_t own_pubkey_len;
1562 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001563 size_t bits = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001564 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
1565 psa_algorithm_t alg = PSA_ALG_NONE;
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001566 size_t buf_size = (size_t) (end - buf);
Jerry Yu89e103c2022-03-30 22:43:29 +08001567
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001568 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH/FFDH computation."));
Jerry Yu89e103c2022-03-30 22:43:29 +08001569
Valerio Setti40d9ca92023-01-04 16:08:04 +01001570 /* Convert EC's TLS ID to PSA key type. */
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001571#if defined(PSA_WANT_ALG_ECDH)
Xiaokang Qian73437382023-03-29 08:24:12 +00001572 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(
Przemek Stekielda4fba62023-06-02 14:52:28 +02001573 named_group, &key_type, &bits) == PSA_SUCCESS) {
1574 alg = PSA_ALG_ECDH;
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001575 }
1576#endif
1577#if defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001578 if (mbedtls_ssl_get_psa_ffdh_info_from_tls_id(named_group, &bits,
1579 &key_type) == PSA_SUCCESS) {
Przemek Stekielda4fba62023-06-02 14:52:28 +02001580 alg = PSA_ALG_FFDH;
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001581 }
1582#endif
1583
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001584 if (key_type == PSA_KEY_TYPE_NONE) {
Gilles Peskine449bd832023-01-11 14:50:10 +01001585 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01001586 }
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001587
Przemek Stekielda4fba62023-06-02 14:52:28 +02001588 if (buf_size < PSA_BITS_TO_BYTES(bits)) {
Przemek Stekielda4fba62023-06-02 14:52:28 +02001589 return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
1590 }
1591
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001592 handshake->xxdh_psa_type = key_type;
Valerio Settiea59c432023-07-25 11:14:03 +02001593 ssl->handshake->xxdh_psa_bits = bits;
Jerry Yu89e103c2022-03-30 22:43:29 +08001594
1595 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01001596 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
Przemek Stekielda4fba62023-06-02 14:52:28 +02001597 psa_set_key_algorithm(&key_attributes, alg);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001598 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
Valerio Settiea59c432023-07-25 11:14:03 +02001599 psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
Jerry Yu89e103c2022-03-30 22:43:29 +08001600
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001601 /* Generate ECDH/FFDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001602 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001603 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01001604 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001605 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01001606 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
1607 return ret;
Jerry Yu89e103c2022-03-30 22:43:29 +08001608
1609 }
1610
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001611 /* Export the public part of the ECDH/FFDH private key from PSA. */
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001612 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001613 buf, buf_size,
Gilles Peskine449bd832023-01-11 14:50:10 +01001614 &own_pubkey_len);
Przemek Stekiel29c219c2023-05-31 15:21:04 +02001615
Gilles Peskine449bd832023-01-11 14:50:10 +01001616 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05001617 ret = PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01001618 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
1619 return ret;
Jerry Yu89e103c2022-03-30 22:43:29 +08001620 }
1621
1622 *out_len = own_pubkey_len;
1623
Gilles Peskine449bd832023-01-11 14:50:10 +01001624 return 0;
Jerry Yu89e103c2022-03-30 22:43:29 +08001625}
Valerio Settic9ae8622023-07-25 11:23:50 +02001626#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001627
Jerry Yu0c354a22022-08-29 15:25:36 +08001628/* RFC 8446 section 4.2
1629 *
1630 * If an implementation receives an extension which it recognizes and which is
1631 * not specified for the message in which it appears, it MUST abort the handshake
1632 * with an "illegal_parameter" alert.
1633 *
1634 */
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001635int mbedtls_ssl_tls13_check_received_extension(
Gilles Peskine449bd832023-01-11 14:50:10 +01001636 mbedtls_ssl_context *ssl,
1637 int hs_msg_type,
1638 unsigned int received_extension_type,
1639 uint32_t hs_msg_allowed_extensions_mask)
Jerry Yu0c354a22022-08-29 15:25:36 +08001640{
Jerry Yudf0ad652022-10-31 13:20:57 +08001641 uint32_t extension_mask = mbedtls_ssl_get_extension_mask(
Gilles Peskine449bd832023-01-11 14:50:10 +01001642 received_extension_type);
Jerry Yu0c354a22022-08-29 15:25:36 +08001643
Jerry Yu79aa7212022-11-08 21:30:21 +08001644 MBEDTLS_SSL_PRINT_EXT(
Gilles Peskine449bd832023-01-11 14:50:10 +01001645 3, hs_msg_type, received_extension_type, "received");
Jerry Yu0c354a22022-08-29 15:25:36 +08001646
Gilles Peskine449bd832023-01-11 14:50:10 +01001647 if ((extension_mask & hs_msg_allowed_extensions_mask) == 0) {
Jerry Yu79aa7212022-11-08 21:30:21 +08001648 MBEDTLS_SSL_PRINT_EXT(
Gilles Peskine449bd832023-01-11 14:50:10 +01001649 3, hs_msg_type, received_extension_type, "is illegal");
Jerry Yu0c354a22022-08-29 15:25:36 +08001650 MBEDTLS_SSL_PEND_FATAL_ALERT(
1651 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
Gilles Peskine449bd832023-01-11 14:50:10 +01001652 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1653 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yu0c354a22022-08-29 15:25:36 +08001654 }
1655
1656 ssl->handshake->received_extensions |= extension_mask;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001657 /*
1658 * If it is a message containing extension responses, check that we
1659 * previously sent the extension.
1660 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001661 switch (hs_msg_type) {
Jerry Yu0c354a22022-08-29 15:25:36 +08001662 case MBEDTLS_SSL_HS_SERVER_HELLO:
Jerry Yudf0ad652022-10-31 13:20:57 +08001663 case MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST:
Jerry Yu0c354a22022-08-29 15:25:36 +08001664 case MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS:
1665 case MBEDTLS_SSL_HS_CERTIFICATE:
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001666 /* Check if the received extension is sent by peer message.*/
Gilles Peskine449bd832023-01-11 14:50:10 +01001667 if ((ssl->handshake->sent_extensions & extension_mask) != 0) {
1668 return 0;
1669 }
Jerry Yu0c354a22022-08-29 15:25:36 +08001670 break;
1671 default:
Gilles Peskine449bd832023-01-11 14:50:10 +01001672 return 0;
Jerry Yu0c354a22022-08-29 15:25:36 +08001673 }
1674
Jerry Yu79aa7212022-11-08 21:30:21 +08001675 MBEDTLS_SSL_PRINT_EXT(
Gilles Peskine449bd832023-01-11 14:50:10 +01001676 3, hs_msg_type, received_extension_type, "is unsupported");
Jerry Yu0c354a22022-08-29 15:25:36 +08001677 MBEDTLS_SSL_PEND_FATAL_ALERT(
1678 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT,
Gilles Peskine449bd832023-01-11 14:50:10 +01001679 MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION);
1680 return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
Jerry Yu0c354a22022-08-29 15:25:36 +08001681}
1682
Jan Bruckner151f6422023-02-10 12:45:19 +01001683#if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
Jan Bruckner1a38e542023-03-15 14:15:11 +01001684/* RFC 8449, section 4:
1685 *
Jan Bruckner151f6422023-02-10 12:45:19 +01001686 * The ExtensionData of the "record_size_limit" extension is
1687 * RecordSizeLimit:
1688 * uint16 RecordSizeLimit;
1689 */
1690MBEDTLS_CHECK_RETURN_CRITICAL
1691int mbedtls_ssl_tls13_parse_record_size_limit_ext(mbedtls_ssl_context *ssl,
1692 const unsigned char *buf,
1693 const unsigned char *end)
1694{
Jan Bruckner1a38e542023-03-15 14:15:11 +01001695 const unsigned char *p = buf;
1696 uint16_t record_size_limit;
Jan Brucknera0589e72023-03-15 11:04:45 +01001697 const size_t extension_data_len = end - buf;
Jan Bruckner1a38e542023-03-15 14:15:11 +01001698
Xiaokang Qian73437382023-03-29 08:24:12 +00001699 if (extension_data_len !=
1700 MBEDTLS_SSL_RECORD_SIZE_LIMIT_EXTENSION_DATA_LENGTH) {
Jan Bruckner151f6422023-02-10 12:45:19 +01001701 MBEDTLS_SSL_DEBUG_MSG(2,
Jan Bruckner1a38e542023-03-15 14:15:11 +01001702 ("record_size_limit extension has invalid length: %"
1703 MBEDTLS_PRINTF_SIZET " Bytes",
Jan Bruckner151f6422023-02-10 12:45:19 +01001704 extension_data_len));
1705
1706 MBEDTLS_SSL_PEND_FATAL_ALERT(
1707 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1708 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1709 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1710 }
1711
Jan Bruckner151f6422023-02-10 12:45:19 +01001712 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1713 record_size_limit = MBEDTLS_GET_UINT16_BE(p, 0);
1714
1715 MBEDTLS_SSL_DEBUG_MSG(2, ("RecordSizeLimit: %u Bytes", record_size_limit));
1716
Jan Brucknerf482dcc2023-03-15 09:09:06 +01001717 /* RFC 8449, section 4:
Jan Bruckner151f6422023-02-10 12:45:19 +01001718 *
1719 * Endpoints MUST NOT send a "record_size_limit" extension with a value
1720 * smaller than 64. An endpoint MUST treat receipt of a smaller value
1721 * as a fatal error and generate an "illegal_parameter" alert.
1722 */
Jan Brucknera0589e72023-03-15 11:04:45 +01001723 if (record_size_limit < MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN) {
Jan Bruckner151f6422023-02-10 12:45:19 +01001724 MBEDTLS_SSL_PEND_FATAL_ALERT(
1725 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
1726 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1727 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1728 }
1729
Jan Brucknerf482dcc2023-03-15 09:09:06 +01001730 ssl->session_negotiate->record_size_limit = record_size_limit;
Jan Bruckner151f6422023-02-10 12:45:19 +01001731
Jan Brucknerf482dcc2023-03-15 09:09:06 +01001732 return 0;
1733}
1734
1735static inline size_t ssl_compute_internal_record_size_limit(size_t record_size_limit)
1736{
1737 /* RFC 8449, section 4:
1738 *
1739 * This value [record_size_limit] is the length of the plaintext of a protected record.
1740 * The value includes the content type and padding added in TLS 1.3 (that is, the complete
1741 * length of TLSInnerPlaintext).
1742 *
1743 * Thus, round down to a multiple of MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY
1744 * and subtract 1 (for the content type that will be added later)
1745 */
1746 return ((record_size_limit / MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY) *
1747 MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY) - 1;
1748}
1749
1750size_t mbedtls_ssl_get_output_record_size_limit(const mbedtls_ssl_context *ssl)
1751{
1752 const size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
1753 size_t record_size_limit = max_len;
1754
1755 if (ssl->session != NULL &&
1756 ssl->session->record_size_limit >= MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN &&
1757 ssl->session->record_size_limit < max_len) {
1758 record_size_limit = ssl_compute_internal_record_size_limit(ssl->session->record_size_limit);
1759 }
1760
1761 // TODO: this is currently untested
1762 /* During a handshake, use the value being negotiated */
1763 if (ssl->session_negotiate != NULL &&
1764 ssl->session_negotiate->record_size_limit >= MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN &&
1765 ssl->session_negotiate->record_size_limit < max_len) {
1766 record_size_limit = ssl_compute_internal_record_size_limit(
1767 ssl->session_negotiate->record_size_limit);
1768 }
1769
1770 return record_size_limit;
Jan Bruckner151f6422023-02-10 12:45:19 +01001771}
1772#endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
1773
Jerry Yufb4b6472022-01-27 15:03:26 +08001774#endif /* MBEDTLS_SSL_TLS_C && MBEDTLS_SSL_PROTO_TLS1_3 */