blob: 3c9ab905f44ab725d8513a79316b77f0dd3f724d [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
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20#include "common.h"
21
Jerry Yufb4b6472022-01-27 15:03:26 +080022#if defined(MBEDTLS_SSL_TLS_C) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu65dd2cc2021-08-18 16:38:40 +080023
Jerry Yu30b071c2021-09-12 20:16:03 +080024#include <string.h>
25
Jerry Yuc8a392c2021-08-18 16:46:28 +080026#include "mbedtls/error.h"
Jerry Yu75336352021-09-01 15:59:36 +080027#include "mbedtls/debug.h"
Jerry Yu30b071c2021-09-12 20:16:03 +080028#include "mbedtls/oid.h"
29#include "mbedtls/platform.h"
Gabor Mezei685472b2021-11-24 11:17:36 +010030#include "mbedtls/constant_time.h"
Jerry Yu141bbe72022-12-01 20:30:41 +080031#include "psa/crypto.h"
32#include "mbedtls/psa_util.h"
Jerry Yuc8a392c2021-08-18 16:46:28 +080033
Jerry Yu65dd2cc2021-08-18 16:38:40 +080034#include "ssl_misc.h"
Ronald Crone3dac4a2022-06-10 17:21:51 +020035#include "ssl_tls13_invasive.h"
Jerry Yu30b071c2021-09-12 20:16:03 +080036#include "ssl_tls13_keys.h"
Jerry Yu67eced02022-02-25 13:37:36 +080037#include "ssl_debug_helpers.h"
Jerry Yu65dd2cc2021-08-18 16:38:40 +080038
Jerry Yufbe3e642022-04-25 19:31:51 +080039const uint8_t mbedtls_ssl_tls13_hello_retry_request_magic[
David Horstmann8b6068b2023-01-05 15:42:32 +000040 MBEDTLS_SERVER_HELLO_RANDOM_LEN] =
41{ 0xCF, 0x21, 0xAD, 0x74, 0xE5, 0x9A, 0x61, 0x11,
42 0xBE, 0x1D, 0x8C, 0x02, 0x1E, 0x65, 0xB8, 0x91,
43 0xC2, 0xA2, 0x11, 0x16, 0x7A, 0xBB, 0x8C, 0x5E,
44 0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C };
Jerry Yu93a13f22022-04-11 23:00:01 +080045
David Horstmann8b6068b2023-01-05 15:42:32 +000046int mbedtls_ssl_tls13_fetch_handshake_msg(mbedtls_ssl_context *ssl,
47 unsigned hs_type,
48 unsigned char **buf,
49 size_t *buf_len)
XiaokangQian6b226b02021-09-24 07:51:16 +000050{
51 int ret;
52
David Horstmann8b6068b2023-01-05 15:42:32 +000053 if ((ret = mbedtls_ssl_read_record(ssl, 0)) != 0) {
54 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
XiaokangQian6b226b02021-09-24 07:51:16 +000055 goto cleanup;
56 }
57
David Horstmann8b6068b2023-01-05 15:42:32 +000058 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
59 ssl->in_msg[0] != hs_type) {
60 MBEDTLS_SSL_DEBUG_MSG(1, ("Receive unexpected handshake message."));
61 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
62 MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
XiaokangQian6b226b02021-09-24 07:51:16 +000063 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
64 goto cleanup;
65 }
66
XiaokangQian05420b12021-09-29 08:46:37 +000067 /*
68 * Jump handshake header (4 bytes, see Section 4 of RFC 8446).
69 * ...
70 * HandshakeType msg_type;
71 * uint24 length;
72 * ...
73 */
Xiaofei Baieef15042021-11-18 07:29:56 +000074 *buf = ssl->in_msg + 4;
75 *buf_len = ssl->in_hslen - 4;
XiaokangQian6b226b02021-09-24 07:51:16 +000076
XiaokangQian6b226b02021-09-24 07:51:16 +000077cleanup:
78
David Horstmann8b6068b2023-01-05 15:42:32 +000079 return ret;
XiaokangQian6b226b02021-09-24 07:51:16 +000080}
81
Ronald Cron928cbd32022-10-04 16:14:26 +020082#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu30b071c2021-09-12 20:16:03 +080083/*
Jerry Yu30b071c2021-09-12 20:16:03 +080084 * STATE HANDLING: Read CertificateVerify
85 */
Jerry Yud0fc5852021-10-29 11:09:06 +080086/* Macro to express the maximum length of the verify structure.
Jerry Yu30b071c2021-09-12 20:16:03 +080087 *
88 * The structure is computed per TLS 1.3 specification as:
89 * - 64 bytes of octet 32,
90 * - 33 bytes for the context string
91 * (which is either "TLS 1.3, client CertificateVerify"
92 * or "TLS 1.3, server CertificateVerify"),
Jerry Yud0fc5852021-10-29 11:09:06 +080093 * - 1 byte for the octet 0x0, which serves as a separator,
Jerry Yu30b071c2021-09-12 20:16:03 +080094 * - 32 or 48 bytes for the Transcript-Hash(Handshake Context, Certificate)
95 * (depending on the size of the transcript_hash)
96 *
97 * This results in a total size of
98 * - 130 bytes for a SHA256-based transcript hash, or
99 * (64 + 33 + 1 + 32 bytes)
100 * - 146 bytes for a SHA384-based transcript hash.
101 * (64 + 33 + 1 + 48 bytes)
102 *
103 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000104#define SSL_VERIFY_STRUCT_MAX_SIZE (64 + \
105 33 + \
106 1 + \
107 MBEDTLS_TLS1_3_MD_MAX_SIZE \
108 )
Jerry Yu30b071c2021-09-12 20:16:03 +0800109
Jerry Yu0b32c502021-10-28 13:41:59 +0800110/*
111 * The ssl_tls13_create_verify_structure() creates the verify structure.
112 * As input, it requires the transcript hash.
113 *
114 * The caller has to ensure that the buffer has size at least
115 * SSL_VERIFY_STRUCT_MAX_SIZE bytes.
116 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000117static void ssl_tls13_create_verify_structure(const unsigned char *transcript_hash,
118 size_t transcript_hash_len,
119 unsigned char *verify_buffer,
120 size_t *verify_buffer_len,
121 int from)
Jerry Yu0b32c502021-10-28 13:41:59 +0800122{
123 size_t idx;
Jerry Yu30b071c2021-09-12 20:16:03 +0800124
Jerry Yu0b32c502021-10-28 13:41:59 +0800125 /* RFC 8446, Section 4.4.3:
126 *
127 * The digital signature [in the CertificateVerify message] is then
128 * computed over the concatenation of:
129 * - A string that consists of octet 32 (0x20) repeated 64 times
130 * - The context string
131 * - A single 0 byte which serves as the separator
132 * - The content to be signed
133 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000134 memset(verify_buffer, 0x20, 64);
Jerry Yu0b32c502021-10-28 13:41:59 +0800135 idx = 64;
136
David Horstmann8b6068b2023-01-05 15:42:32 +0000137 if (from == MBEDTLS_SSL_IS_CLIENT) {
138 memcpy(verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(client_cv));
139 idx += MBEDTLS_SSL_TLS1_3_LBL_LEN(client_cv);
140 } else { /* from == MBEDTLS_SSL_IS_SERVER */
141 memcpy(verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(server_cv));
142 idx += MBEDTLS_SSL_TLS1_3_LBL_LEN(server_cv);
Jerry Yu0b32c502021-10-28 13:41:59 +0800143 }
144
145 verify_buffer[idx++] = 0x0;
146
David Horstmann8b6068b2023-01-05 15:42:32 +0000147 memcpy(verify_buffer + idx, transcript_hash, transcript_hash_len);
Jerry Yu0b32c502021-10-28 13:41:59 +0800148 idx += transcript_hash_len;
149
150 *verify_buffer_len = idx;
151}
152
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200153MBEDTLS_CHECK_RETURN_CRITICAL
David Horstmann8b6068b2023-01-05 15:42:32 +0000154static int ssl_tls13_parse_certificate_verify(mbedtls_ssl_context *ssl,
155 const unsigned char *buf,
156 const unsigned char *end,
157 const unsigned char *verify_buffer,
158 size_t verify_buffer_len)
Jerry Yu30b071c2021-09-12 20:16:03 +0800159{
160 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
pespaceka1378102022-04-26 15:03:11 +0200161 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Jerry Yu30b071c2021-09-12 20:16:03 +0800162 const unsigned char *p = buf;
163 uint16_t algorithm;
Jerry Yu30b071c2021-09-12 20:16:03 +0800164 size_t signature_len;
165 mbedtls_pk_type_t sig_alg;
166 mbedtls_md_type_t md_alg;
pespaceka1378102022-04-26 15:03:11 +0200167 psa_algorithm_t hash_alg = PSA_ALG_NONE;
168 unsigned char verify_hash[PSA_HASH_MAX_SIZE];
Jerry Yu30b071c2021-09-12 20:16:03 +0800169 size_t verify_hash_len;
170
Xiaofei Baid25fab62021-12-02 06:36:27 +0000171 void const *options = NULL;
XiaokangQian82d34cc2021-11-03 08:51:56 +0000172#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
Xiaofei Baid25fab62021-12-02 06:36:27 +0000173 mbedtls_pk_rsassa_pss_options rsassa_pss_options;
XiaokangQian82d34cc2021-11-03 08:51:56 +0000174#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
175
Jerry Yu30b071c2021-09-12 20:16:03 +0800176 /*
177 * struct {
178 * SignatureScheme algorithm;
179 * opaque signature<0..2^16-1>;
180 * } CertificateVerify;
181 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000182 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
183 algorithm = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yu30b071c2021-09-12 20:16:03 +0800184 p += 2;
185
186 /* RFC 8446 section 4.4.3
187 *
188 * If the CertificateVerify message is sent by a server, the signature algorithm
189 * MUST be one offered in the client's "signature_algorithms" extension unless
190 * no valid certificate chain can be produced without unsupported algorithms
191 *
192 * RFC 8446 section 4.4.2.2
193 *
194 * If the client cannot construct an acceptable chain using the provided
195 * certificates and decides to abort the handshake, then it MUST abort the handshake
196 * with an appropriate certificate-related alert (by default, "unsupported_certificate").
197 *
Jerry Yu6f87f252021-10-29 20:12:51 +0800198 * Check if algorithm is an offered signature algorithm.
Jerry Yu30b071c2021-09-12 20:16:03 +0800199 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000200 if (!mbedtls_ssl_sig_alg_is_offered(ssl, algorithm)) {
Jerry Yu982d9e52021-10-14 15:59:37 +0800201 /* algorithm not in offered signature algorithms list */
David Horstmann8b6068b2023-01-05 15:42:32 +0000202 MBEDTLS_SSL_DEBUG_MSG(1, ("Received signature algorithm(%04x) is not "
203 "offered.",
204 (unsigned int) algorithm));
Jerry Yu6f87f252021-10-29 20:12:51 +0800205 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800206 }
207
David Horstmann8b6068b2023-01-05 15:42:32 +0000208 if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
209 algorithm, &sig_alg, &md_alg) != 0) {
Jerry Yu8c338862022-03-23 13:34:04 +0800210 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800211 }
212
David Horstmann8b6068b2023-01-05 15:42:32 +0000213 hash_alg = mbedtls_hash_info_psa_from_md(md_alg);
214 if (hash_alg == 0) {
pespaceka1378102022-04-26 15:03:11 +0200215 goto error;
216 }
217
David Horstmann8b6068b2023-01-05 15:42:32 +0000218 MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate Verify: Signature algorithm ( %04x )",
219 (unsigned int) algorithm));
Jerry Yu30b071c2021-09-12 20:16:03 +0800220
221 /*
222 * Check the certificate's key type matches the signature alg
223 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000224 if (!mbedtls_pk_can_do(&ssl->session_negotiate->peer_cert->pk, sig_alg)) {
225 MBEDTLS_SSL_DEBUG_MSG(1, ("signature algorithm doesn't match cert key"));
Jerry Yu6f87f252021-10-29 20:12:51 +0800226 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800227 }
228
David Horstmann8b6068b2023-01-05 15:42:32 +0000229 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
230 signature_len = MBEDTLS_GET_UINT16_BE(p, 0);
Jerry Yu30b071c2021-09-12 20:16:03 +0800231 p += 2;
David Horstmann8b6068b2023-01-05 15:42:32 +0000232 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, signature_len);
Jerry Yu30b071c2021-09-12 20:16:03 +0800233
David Horstmann8b6068b2023-01-05 15:42:32 +0000234 status = psa_hash_compute(hash_alg,
235 verify_buffer,
236 verify_buffer_len,
237 verify_hash,
238 sizeof(verify_hash),
239 &verify_hash_len);
240 if (status != PSA_SUCCESS) {
241 MBEDTLS_SSL_DEBUG_RET(1, "hash computation PSA error", status);
Jerry Yu6f87f252021-10-29 20:12:51 +0800242 goto error;
Jerry Yu133690c2021-10-25 14:01:13 +0800243 }
244
David Horstmann8b6068b2023-01-05 15:42:32 +0000245 MBEDTLS_SSL_DEBUG_BUF(3, "verify hash", verify_hash, verify_hash_len);
XiaokangQian82d34cc2021-11-03 08:51:56 +0000246#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
David Horstmann8b6068b2023-01-05 15:42:32 +0000247 if (sig_alg == MBEDTLS_PK_RSASSA_PSS) {
Xiaofei Baid25fab62021-12-02 06:36:27 +0000248 rsassa_pss_options.mgf1_hash_id = md_alg;
Przemek Stekiel6a5e0182022-06-27 11:53:13 +0200249
David Horstmann8b6068b2023-01-05 15:42:32 +0000250 rsassa_pss_options.expected_salt_len = PSA_HASH_LENGTH(hash_alg);
251 options = (const void *) &rsassa_pss_options;
XiaokangQian82d34cc2021-11-03 08:51:56 +0000252 }
253#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
Jerry Yu30b071c2021-09-12 20:16:03 +0800254
David Horstmann8b6068b2023-01-05 15:42:32 +0000255 if ((ret = mbedtls_pk_verify_ext(sig_alg, options,
256 &ssl->session_negotiate->peer_cert->pk,
257 md_alg, verify_hash, verify_hash_len,
258 p, signature_len)) == 0) {
259 return 0;
Jerry Yu30b071c2021-09-12 20:16:03 +0800260 }
David Horstmann8b6068b2023-01-05 15:42:32 +0000261 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify_ext", ret);
Jerry Yu30b071c2021-09-12 20:16:03 +0800262
Jerry Yu6f87f252021-10-29 20:12:51 +0800263error:
264 /* RFC 8446 section 4.4.3
265 *
266 * If the verification fails, the receiver MUST terminate the handshake
267 * with a "decrypt_error" alert.
David Horstmann8b6068b2023-01-05 15:42:32 +0000268 */
269 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
270 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
271 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu6f87f252021-10-29 20:12:51 +0800272
Jerry Yu30b071c2021-09-12 20:16:03 +0800273}
Ronald Cron928cbd32022-10-04 16:14:26 +0200274#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu30b071c2021-09-12 20:16:03 +0800275
David Horstmann8b6068b2023-01-05 15:42:32 +0000276int mbedtls_ssl_tls13_process_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu30b071c2021-09-12 20:16:03 +0800277{
Jerry Yu30b071c2021-09-12 20:16:03 +0800278
Ronald Cron928cbd32022-10-04 16:14:26 +0200279#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yuda8cdf22021-10-25 15:06:49 +0800280 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
281 unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
282 size_t verify_buffer_len;
283 unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
284 size_t transcript_len;
285 unsigned char *buf;
286 size_t buf_len;
287
David Horstmann8b6068b2023-01-05 15:42:32 +0000288 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
Jerry Yu30b071c2021-09-12 20:16:03 +0800289
Jerry Yuda8cdf22021-10-25 15:06:49 +0800290 MBEDTLS_SSL_PROC_CHK(
David Horstmann8b6068b2023-01-05 15:42:32 +0000291 mbedtls_ssl_tls13_fetch_handshake_msg(ssl,
292 MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, &buf, &buf_len));
Jerry Yu30b071c2021-09-12 20:16:03 +0800293
Jerry Yuda8cdf22021-10-25 15:06:49 +0800294 /* Need to calculate the hash of the transcript first
Jerry Yu0b32c502021-10-28 13:41:59 +0800295 * before reading the message since otherwise it gets
296 * included in the transcript
297 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000298 ret = mbedtls_ssl_get_handshake_transcript(ssl,
299 ssl->handshake->ciphersuite_info->mac,
300 transcript, sizeof(transcript),
301 &transcript_len);
302 if (ret != 0) {
Jerry Yuda8cdf22021-10-25 15:06:49 +0800303 MBEDTLS_SSL_PEND_FATAL_ALERT(
304 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
David Horstmann8b6068b2023-01-05 15:42:32 +0000305 MBEDTLS_ERR_SSL_INTERNAL_ERROR);
306 return ret;
Jerry Yu30b071c2021-09-12 20:16:03 +0800307 }
308
David Horstmann8b6068b2023-01-05 15:42:32 +0000309 MBEDTLS_SSL_DEBUG_BUF(3, "handshake hash", transcript, transcript_len);
Jerry Yuda8cdf22021-10-25 15:06:49 +0800310
311 /* Create verify structure */
David Horstmann8b6068b2023-01-05 15:42:32 +0000312 ssl_tls13_create_verify_structure(transcript,
313 transcript_len,
314 verify_buffer,
315 &verify_buffer_len,
316 (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) ?
317 MBEDTLS_SSL_IS_SERVER :
318 MBEDTLS_SSL_IS_CLIENT);
Jerry Yuda8cdf22021-10-25 15:06:49 +0800319
320 /* Process the message contents */
David Horstmann8b6068b2023-01-05 15:42:32 +0000321 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_certificate_verify(ssl, buf,
322 buf + buf_len, verify_buffer,
323 verify_buffer_len));
Jerry Yuda8cdf22021-10-25 15:06:49 +0800324
David Horstmann8b6068b2023-01-05 15:42:32 +0000325 mbedtls_ssl_add_hs_msg_to_checksum(ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
326 buf, buf_len);
Jerry Yu30b071c2021-09-12 20:16:03 +0800327
328cleanup:
329
David Horstmann8b6068b2023-01-05 15:42:32 +0000330 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
331 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_process_certificate_verify", ret);
332 return ret;
Jerry Yuda8cdf22021-10-25 15:06:49 +0800333#else
334 ((void) ssl);
David Horstmann8b6068b2023-01-05 15:42:32 +0000335 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
336 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Ronald Cron928cbd32022-10-04 16:14:26 +0200337#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu30b071c2021-09-12 20:16:03 +0800338}
339
340/*
Xiaofei Bai947571e2021-09-29 09:12:03 +0000341 *
XiaokangQian6b916b12022-04-25 07:29:34 +0000342 * STATE HANDLING: Incoming Certificate.
Xiaofei Bai947571e2021-09-29 09:12:03 +0000343 *
344 */
345
Ronald Cronde08cf32022-10-04 17:15:35 +0200346#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000347#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
348/*
349 * Structure of Certificate message:
350 *
351 * enum {
352 * X509(0),
353 * RawPublicKey(2),
354 * (255)
355 * } CertificateType;
356 *
357 * struct {
358 * select (certificate_type) {
359 * case RawPublicKey:
360 * * From RFC 7250 ASN.1_subjectPublicKeyInfo *
361 * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
362 * case X509:
363 * opaque cert_data<1..2^24-1>;
364 * };
365 * Extension extensions<0..2^16-1>;
366 * } CertificateEntry;
367 *
368 * struct {
369 * opaque certificate_request_context<0..2^8-1>;
370 * CertificateEntry certificate_list<0..2^24-1>;
371 * } Certificate;
372 *
373 */
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000374
375/* Parse certificate chain send by the server. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200376MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Crone3dac4a2022-06-10 17:21:51 +0200377MBEDTLS_STATIC_TESTABLE
David Horstmann8b6068b2023-01-05 15:42:32 +0000378int mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context *ssl,
379 const unsigned char *buf,
380 const unsigned char *end)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000381{
382 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
383 size_t certificate_request_context_len = 0;
384 size_t certificate_list_len = 0;
385 const unsigned char *p = buf;
386 const unsigned char *certificate_list_end;
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800387 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000388
David Horstmann8b6068b2023-01-05 15:42:32 +0000389 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 4);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000390 certificate_request_context_len = p[0];
David Horstmann8b6068b2023-01-05 15:42:32 +0000391 certificate_list_len = MBEDTLS_GET_UINT24_BE(p, 1);
XiaokangQian63e713e2022-05-15 04:26:57 +0000392 p += 4;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000393
394 /* In theory, the certificate list can be up to 2^24 Bytes, but we don't
395 * support anything beyond 2^16 = 64K.
396 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000397 if ((certificate_request_context_len != 0) ||
398 (certificate_list_len >= 0x10000)) {
399 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
400 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
401 MBEDTLS_ERR_SSL_DECODE_ERROR);
402 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000403 }
404
405 /* In case we tried to reuse a session but it failed */
David Horstmann8b6068b2023-01-05 15:42:32 +0000406 if (ssl->session_negotiate->peer_cert != NULL) {
407 mbedtls_x509_crt_free(ssl->session_negotiate->peer_cert);
408 mbedtls_free(ssl->session_negotiate->peer_cert);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000409 }
410
David Horstmann8b6068b2023-01-05 15:42:32 +0000411 if (certificate_list_len == 0) {
XiaokangQianc3017f62022-05-13 05:55:41 +0000412 ssl->session_negotiate->peer_cert = NULL;
413 ret = 0;
414 goto exit;
415 }
416
David Horstmann8b6068b2023-01-05 15:42:32 +0000417 if ((ssl->session_negotiate->peer_cert =
418 mbedtls_calloc(1, sizeof(mbedtls_x509_crt))) == NULL) {
419 MBEDTLS_SSL_DEBUG_MSG(1, ("alloc( %" MBEDTLS_PRINTF_SIZET " bytes ) failed",
420 sizeof(mbedtls_x509_crt)));
421 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
422 MBEDTLS_ERR_SSL_ALLOC_FAILED);
423 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000424 }
425
David Horstmann8b6068b2023-01-05 15:42:32 +0000426 mbedtls_x509_crt_init(ssl->session_negotiate->peer_cert);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000427
David Horstmann8b6068b2023-01-05 15:42:32 +0000428 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, certificate_list_len);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000429 certificate_list_end = p + certificate_list_len;
David Horstmann8b6068b2023-01-05 15:42:32 +0000430 while (p < certificate_list_end) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000431 size_t cert_data_len, extensions_len;
Jerry Yu2eaa7602022-08-04 17:28:15 +0800432 const unsigned char *extensions_end;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000433
David Horstmann8b6068b2023-01-05 15:42:32 +0000434 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, 3);
435 cert_data_len = MBEDTLS_GET_UINT24_BE(p, 0);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000436 p += 3;
437
438 /* In theory, the CRT can be up to 2^24 Bytes, but we don't support
439 * anything beyond 2^16 = 64K. Otherwise as in the TLS 1.2 code,
440 * check that we have a minimum of 128 bytes of data, this is not
441 * clear why we need that though.
442 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000443 if ((cert_data_len < 128) || (cert_data_len >= 0x10000)) {
444 MBEDTLS_SSL_DEBUG_MSG(1, ("bad Certificate message"));
445 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
446 MBEDTLS_ERR_SSL_DECODE_ERROR);
447 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000448 }
449
David Horstmann8b6068b2023-01-05 15:42:32 +0000450 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, cert_data_len);
451 ret = mbedtls_x509_crt_parse_der(ssl->session_negotiate->peer_cert,
452 p, cert_data_len);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000453
David Horstmann8b6068b2023-01-05 15:42:32 +0000454 switch (ret) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000455 case 0: /*ok*/
456 break;
457 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
458 /* Ignore certificate with an unknown algorithm: maybe a
459 prior certificate was already trusted. */
460 break;
461
462 case MBEDTLS_ERR_X509_ALLOC_FAILED:
David Horstmann8b6068b2023-01-05 15:42:32 +0000463 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
464 MBEDTLS_ERR_X509_ALLOC_FAILED);
465 MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
466 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000467
468 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
David Horstmann8b6068b2023-01-05 15:42:32 +0000469 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT,
470 MBEDTLS_ERR_X509_UNKNOWN_VERSION);
471 MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
472 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000473
474 default:
David Horstmann8b6068b2023-01-05 15:42:32 +0000475 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_BAD_CERT,
476 ret);
477 MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
478 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000479 }
480
481 p += cert_data_len;
482
483 /* Certificate extensions length */
David Horstmann8b6068b2023-01-05 15:42:32 +0000484 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, 2);
485 extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000486 p += 2;
David Horstmann8b6068b2023-01-05 15:42:32 +0000487 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, extensions_len);
Jerry Yu2eaa7602022-08-04 17:28:15 +0800488
489 extensions_end = p + extensions_len;
Jerry Yu0d5cfb72022-10-31 14:15:48 +0800490 handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
Jerry Yu2eaa7602022-08-04 17:28:15 +0800491
David Horstmann8b6068b2023-01-05 15:42:32 +0000492 while (p < extensions_end) {
Jerry Yu2eaa7602022-08-04 17:28:15 +0800493 unsigned int extension_type;
494 size_t extension_data_len;
495
496 /*
David Horstmann8b6068b2023-01-05 15:42:32 +0000497 * struct {
498 * ExtensionType extension_type; (2 bytes)
499 * opaque extension_data<0..2^16-1>;
500 * } Extension;
501 */
502 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
503 extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
504 extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
Jerry Yu2eaa7602022-08-04 17:28:15 +0800505 p += 4;
506
David Horstmann8b6068b2023-01-05 15:42:32 +0000507 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
Jerry Yu2eaa7602022-08-04 17:28:15 +0800508
Jerry Yuc4bf5d62022-10-29 09:08:47 +0800509 ret = mbedtls_ssl_tls13_check_received_extension(
David Horstmann8b6068b2023-01-05 15:42:32 +0000510 ssl, MBEDTLS_SSL_HS_CERTIFICATE, extension_type,
511 MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CT);
512 if (ret != 0) {
513 return ret;
514 }
Jerry Yu0c354a22022-08-29 15:25:36 +0800515
David Horstmann8b6068b2023-01-05 15:42:32 +0000516 switch (extension_type) {
Jerry Yu2eaa7602022-08-04 17:28:15 +0800517 default:
Jerry Yu79aa7212022-11-08 21:30:21 +0800518 MBEDTLS_SSL_PRINT_EXT(
Jerry Yu0d5cfb72022-10-31 14:15:48 +0800519 3, MBEDTLS_SSL_HS_CERTIFICATE,
David Horstmann8b6068b2023-01-05 15:42:32 +0000520 extension_type, "( ignored )");
Jerry Yu2eaa7602022-08-04 17:28:15 +0800521 break;
522 }
523
524 p += extension_data_len;
525 }
526
David Horstmann8b6068b2023-01-05 15:42:32 +0000527 MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_CERTIFICATE,
528 handshake->received_extensions);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000529 }
530
XiaokangQian63e713e2022-05-15 04:26:57 +0000531exit:
Xiaofei Bai947571e2021-09-29 09:12:03 +0000532 /* Check that all the message is consumed. */
David Horstmann8b6068b2023-01-05 15:42:32 +0000533 if (p != end) {
534 MBEDTLS_SSL_DEBUG_MSG(1, ("bad Certificate message"));
535 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
536 MBEDTLS_ERR_SSL_DECODE_ERROR);
537 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000538 }
539
David Horstmann8b6068b2023-01-05 15:42:32 +0000540 MBEDTLS_SSL_DEBUG_CRT(3, "peer certificate", ssl->session_negotiate->peer_cert);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000541
David Horstmann8b6068b2023-01-05 15:42:32 +0000542 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000543}
544#else
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200545MBEDTLS_CHECK_RETURN_CRITICAL
Ronald Crone3dac4a2022-06-10 17:21:51 +0200546MBEDTLS_STATIC_TESTABLE
David Horstmann8b6068b2023-01-05 15:42:32 +0000547int mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context *ssl,
548 const unsigned char *buf,
549 const unsigned char *end)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000550{
551 ((void) ssl);
552 ((void) buf);
553 ((void) end);
David Horstmann8b6068b2023-01-05 15:42:32 +0000554 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000555}
556#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Ronald Cronde08cf32022-10-04 17:15:35 +0200557#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Xiaofei Bai947571e2021-09-29 09:12:03 +0000558
Ronald Cronde08cf32022-10-04 17:15:35 +0200559#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000560#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000561/* Validate certificate chain sent by the server. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200562MBEDTLS_CHECK_RETURN_CRITICAL
David Horstmann8b6068b2023-01-05 15:42:32 +0000563static int ssl_tls13_validate_certificate(mbedtls_ssl_context *ssl)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000564{
565 int ret = 0;
XiaokangQian989f06d2022-05-17 01:50:15 +0000566 int authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000567 mbedtls_x509_crt *ca_chain;
568 mbedtls_x509_crl *ca_crl;
Ronald Cron30c5a252022-06-16 19:31:06 +0200569 const char *ext_oid;
570 size_t ext_len;
Xiaofei Baiff456022021-10-28 06:50:17 +0000571 uint32_t verify_result = 0;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000572
XiaokangQian6b916b12022-04-25 07:29:34 +0000573 /* If SNI was used, overwrite authentication mode
574 * from the configuration. */
XiaokangQian989f06d2022-05-17 01:50:15 +0000575#if defined(MBEDTLS_SSL_SRV_C)
David Horstmann8b6068b2023-01-05 15:42:32 +0000576 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
XiaokangQian0557c942022-05-30 08:10:53 +0000577#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
David Horstmann8b6068b2023-01-05 15:42:32 +0000578 if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
XiaokangQian0557c942022-05-30 08:10:53 +0000579 authmode = ssl->handshake->sni_authmode;
David Horstmann8b6068b2023-01-05 15:42:32 +0000580 } else
XiaokangQian0557c942022-05-30 08:10:53 +0000581#endif
David Horstmann8b6068b2023-01-05 15:42:32 +0000582 authmode = ssl->conf->authmode;
XiaokangQian0557c942022-05-30 08:10:53 +0000583 }
XiaokangQian6b916b12022-04-25 07:29:34 +0000584#endif
585
586 /*
XiaokangQian989f06d2022-05-17 01:50:15 +0000587 * If the peer hasn't sent a certificate ( i.e. it sent
XiaokangQian6b916b12022-04-25 07:29:34 +0000588 * an empty certificate chain ), this is reflected in the peer CRT
589 * structure being unset.
590 * Check for that and handle it depending on the
XiaokangQian989f06d2022-05-17 01:50:15 +0000591 * authentication mode.
XiaokangQian6b916b12022-04-25 07:29:34 +0000592 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000593 if (ssl->session_negotiate->peer_cert == NULL) {
594 MBEDTLS_SSL_DEBUG_MSG(1, ("peer has no certificate"));
XiaokangQian989f06d2022-05-17 01:50:15 +0000595
XiaokangQian63e713e2022-05-15 04:26:57 +0000596#if defined(MBEDTLS_SSL_SRV_C)
David Horstmann8b6068b2023-01-05 15:42:32 +0000597 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
XiaokangQian63e713e2022-05-15 04:26:57 +0000598 /* The client was asked for a certificate but didn't send
599 * one. The client should know what's going on, so we
600 * don't send an alert.
601 */
602 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
David Horstmann8b6068b2023-01-05 15:42:32 +0000603 if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL) {
604 return 0;
605 } else {
606 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_NO_CERT,
607 MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE);
608 return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
XiaokangQian989f06d2022-05-17 01:50:15 +0000609 }
XiaokangQian63e713e2022-05-15 04:26:57 +0000610 }
XiaokangQian6b916b12022-04-25 07:29:34 +0000611#endif /* MBEDTLS_SSL_SRV_C */
612
XiaokangQianc3017f62022-05-13 05:55:41 +0000613#if defined(MBEDTLS_SSL_CLI_C)
David Horstmann8b6068b2023-01-05 15:42:32 +0000614 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
615 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_NO_CERT,
616 MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE);
617 return MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE;
XiaokangQian63e713e2022-05-15 04:26:57 +0000618 }
XiaokangQianc3017f62022-05-13 05:55:41 +0000619#endif /* MBEDTLS_SSL_CLI_C */
XiaokangQian63e713e2022-05-15 04:26:57 +0000620 }
XiaokangQian6b916b12022-04-25 07:29:34 +0000621
Xiaofei Bai947571e2021-09-29 09:12:03 +0000622#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
David Horstmann8b6068b2023-01-05 15:42:32 +0000623 if (ssl->handshake->sni_ca_chain != NULL) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000624 ca_chain = ssl->handshake->sni_ca_chain;
625 ca_crl = ssl->handshake->sni_ca_crl;
David Horstmann8b6068b2023-01-05 15:42:32 +0000626 } else
Xiaofei Bai947571e2021-09-29 09:12:03 +0000627#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
628 {
629 ca_chain = ssl->conf->ca_chain;
630 ca_crl = ssl->conf->ca_crl;
631 }
632
633 /*
634 * Main check: verify certificate
635 */
636 ret = mbedtls_x509_crt_verify_with_profile(
637 ssl->session_negotiate->peer_cert,
638 ca_chain, ca_crl,
639 ssl->conf->cert_profile,
640 ssl->hostname,
Xiaofei Baiff456022021-10-28 06:50:17 +0000641 &verify_result,
David Horstmann8b6068b2023-01-05 15:42:32 +0000642 ssl->conf->f_vrfy, ssl->conf->p_vrfy);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000643
David Horstmann8b6068b2023-01-05 15:42:32 +0000644 if (ret != 0) {
645 MBEDTLS_SSL_DEBUG_RET(1, "x509_verify_cert", ret);
Xiaofei Bai947571e2021-09-29 09:12:03 +0000646 }
647
648 /*
649 * Secondary checks: always done, but change 'ret' only if it was 0
650 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000651 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
Ronald Cron30c5a252022-06-16 19:31:06 +0200652 ext_oid = MBEDTLS_OID_SERVER_AUTH;
David Horstmann8b6068b2023-01-05 15:42:32 +0000653 ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_SERVER_AUTH);
654 } else {
Ronald Cron30c5a252022-06-16 19:31:06 +0200655 ext_oid = MBEDTLS_OID_CLIENT_AUTH;
David Horstmann8b6068b2023-01-05 15:42:32 +0000656 ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_CLIENT_AUTH);
Ronald Cron30c5a252022-06-16 19:31:06 +0200657 }
658
David Horstmann8b6068b2023-01-05 15:42:32 +0000659 if ((mbedtls_x509_crt_check_key_usage(
660 ssl->session_negotiate->peer_cert,
661 MBEDTLS_X509_KU_DIGITAL_SIGNATURE) != 0) ||
662 (mbedtls_x509_crt_check_extended_key_usage(
663 ssl->session_negotiate->peer_cert,
664 ext_oid, ext_len) != 0)) {
665 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate (usage extensions)"));
666 if (ret == 0) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000667 ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
David Horstmann8b6068b2023-01-05 15:42:32 +0000668 }
Xiaofei Bai947571e2021-09-29 09:12:03 +0000669 }
670
XiaokangQian6b916b12022-04-25 07:29:34 +0000671 /* mbedtls_x509_crt_verify_with_profile is supposed to report a
672 * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
673 * with details encoded in the verification flags. All other kinds
674 * of error codes, including those from the user provided f_vrfy
675 * functions, are treated as fatal and lead to a failure of
Ronald Crone3dac4a2022-06-10 17:21:51 +0200676 * mbedtls_ssl_tls13_parse_certificate even if verification was optional.
677 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000678 if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
679 (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
680 ret == MBEDTLS_ERR_SSL_BAD_CERTIFICATE)) {
XiaokangQian6b916b12022-04-25 07:29:34 +0000681 ret = 0;
682 }
Xiaofei Bai947571e2021-09-29 09:12:03 +0000683
David Horstmann8b6068b2023-01-05 15:42:32 +0000684 if (ca_chain == NULL && authmode == MBEDTLS_SSL_VERIFY_REQUIRED) {
685 MBEDTLS_SSL_DEBUG_MSG(1, ("got no CA chain"));
Xiaofei Bai947571e2021-09-29 09:12:03 +0000686 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
687 }
688
David Horstmann8b6068b2023-01-05 15:42:32 +0000689 if (ret != 0) {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000690 /* The certificate may have been rejected for several reasons.
691 Pick one and send the corresponding alert. Which alert to send
692 may be a subject of debate in some cases. */
David Horstmann8b6068b2023-01-05 15:42:32 +0000693 if (verify_result & MBEDTLS_X509_BADCERT_OTHER) {
694 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED, ret);
695 } else if (verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH) {
696 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_BAD_CERT, ret);
697 } else if (verify_result & (MBEDTLS_X509_BADCERT_KEY_USAGE |
698 MBEDTLS_X509_BADCERT_EXT_KEY_USAGE |
699 MBEDTLS_X509_BADCERT_NS_CERT_TYPE |
700 MBEDTLS_X509_BADCERT_BAD_PK |
701 MBEDTLS_X509_BADCERT_BAD_KEY)) {
702 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT, ret);
703 } else if (verify_result & MBEDTLS_X509_BADCERT_EXPIRED) {
704 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED, ret);
705 } else if (verify_result & MBEDTLS_X509_BADCERT_REVOKED) {
706 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED, ret);
707 } else if (verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED) {
708 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA, ret);
709 } else {
710 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN, ret);
711 }
Xiaofei Bai947571e2021-09-29 09:12:03 +0000712 }
713
714#if defined(MBEDTLS_DEBUG_C)
David Horstmann8b6068b2023-01-05 15:42:32 +0000715 if (verify_result != 0) {
716 MBEDTLS_SSL_DEBUG_MSG(3, ("! Certificate verification flags %08x",
717 (unsigned int) verify_result));
718 } else {
719 MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate verification flags clear"));
Xiaofei Bai947571e2021-09-29 09:12:03 +0000720 }
721#endif /* MBEDTLS_DEBUG_C */
722
Xiaofei Baiff456022021-10-28 06:50:17 +0000723 ssl->session_negotiate->verify_result = verify_result;
David Horstmann8b6068b2023-01-05 15:42:32 +0000724 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000725}
726#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200727MBEDTLS_CHECK_RETURN_CRITICAL
David Horstmann8b6068b2023-01-05 15:42:32 +0000728static int ssl_tls13_validate_certificate(mbedtls_ssl_context *ssl)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000729{
730 ((void) ssl);
David Horstmann8b6068b2023-01-05 15:42:32 +0000731 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000732}
733#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Ronald Cronde08cf32022-10-04 17:15:35 +0200734#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Xiaofei Bai947571e2021-09-29 09:12:03 +0000735
David Horstmann8b6068b2023-01-05 15:42:32 +0000736int mbedtls_ssl_tls13_process_certificate(mbedtls_ssl_context *ssl)
Xiaofei Bai947571e2021-09-29 09:12:03 +0000737{
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000738 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
David Horstmann8b6068b2023-01-05 15:42:32 +0000739 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate"));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000740
Ronald Cronde08cf32022-10-04 17:15:35 +0200741#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
XiaokangQianc3017f62022-05-13 05:55:41 +0000742 unsigned char *buf;
743 size_t buf_len;
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000744
David Horstmann8b6068b2023-01-05 15:42:32 +0000745 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
746 ssl, MBEDTLS_SSL_HS_CERTIFICATE,
747 &buf, &buf_len));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000748
XiaokangQianc3017f62022-05-13 05:55:41 +0000749 /* Parse the certificate chain sent by the peer. */
David Horstmann8b6068b2023-01-05 15:42:32 +0000750 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_parse_certificate(ssl, buf,
751 buf + buf_len));
XiaokangQianc3017f62022-05-13 05:55:41 +0000752 /* Validate the certificate chain and set the verification results. */
David Horstmann8b6068b2023-01-05 15:42:32 +0000753 MBEDTLS_SSL_PROC_CHK(ssl_tls13_validate_certificate(ssl));
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000754
David Horstmann8b6068b2023-01-05 15:42:32 +0000755 mbedtls_ssl_add_hs_msg_to_checksum(ssl, MBEDTLS_SSL_HS_CERTIFICATE,
756 buf, buf_len);
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000757
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000758cleanup:
Ronald Cronde08cf32022-10-04 17:15:35 +0200759#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000760
David Horstmann8b6068b2023-01-05 15:42:32 +0000761 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate"));
762 return ret;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000763}
Ronald Cron928cbd32022-10-04 16:14:26 +0200764#if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
Jerry Yu7399d0d2022-01-30 17:54:19 +0800765/*
766 * enum {
767 * X509(0),
768 * RawPublicKey(2),
769 * (255)
770 * } CertificateType;
771 *
772 * struct {
773 * select (certificate_type) {
774 * case RawPublicKey:
775 * // From RFC 7250 ASN.1_subjectPublicKeyInfo
776 * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
777 *
778 * case X509:
779 * opaque cert_data<1..2^24-1>;
780 * };
781 * Extension extensions<0..2^16-1>;
782 * } CertificateEntry;
783 *
784 * struct {
785 * opaque certificate_request_context<0..2^8-1>;
786 * CertificateEntry certificate_list<0..2^24-1>;
787 * } Certificate;
788 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200789MBEDTLS_CHECK_RETURN_CRITICAL
David Horstmann8b6068b2023-01-05 15:42:32 +0000790static int ssl_tls13_write_certificate_body(mbedtls_ssl_context *ssl,
791 unsigned char *buf,
792 unsigned char *end,
793 size_t *out_len)
Jerry Yu5cc35062022-01-28 16:16:08 +0800794{
David Horstmann8b6068b2023-01-05 15:42:32 +0000795 const mbedtls_x509_crt *crt = mbedtls_ssl_own_cert(ssl);
Jerry Yu3e536442022-02-15 11:05:59 +0800796 unsigned char *p = buf;
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800797 unsigned char *certificate_request_context =
David Horstmann8b6068b2023-01-05 15:42:32 +0000798 ssl->handshake->certificate_request_context;
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800799 unsigned char certificate_request_context_len =
David Horstmann8b6068b2023-01-05 15:42:32 +0000800 ssl->handshake->certificate_request_context_len;
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800801 unsigned char *p_certificate_list_len;
Jerry Yu5cc35062022-01-28 16:16:08 +0800802
Jerry Yu5cc35062022-01-28 16:16:08 +0800803
Jerry Yu3391ac02022-02-16 11:21:37 +0800804 /* ...
805 * opaque certificate_request_context<0..2^8-1>;
806 * ...
807 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000808 MBEDTLS_SSL_CHK_BUF_PTR(p, end, certificate_request_context_len + 1);
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800809 *p++ = certificate_request_context_len;
David Horstmann8b6068b2023-01-05 15:42:32 +0000810 if (certificate_request_context_len > 0) {
811 memcpy(p, certificate_request_context, certificate_request_context_len);
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800812 p += certificate_request_context_len;
Jerry Yu537530d2022-02-15 14:00:57 +0800813 }
814
Jerry Yu3391ac02022-02-16 11:21:37 +0800815 /* ...
816 * CertificateEntry certificate_list<0..2^24-1>;
817 * ...
818 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000819 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 3);
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800820 p_certificate_list_len = p;
Jerry Yu3e536442022-02-15 11:05:59 +0800821 p += 3;
822
David Horstmann8b6068b2023-01-05 15:42:32 +0000823 MBEDTLS_SSL_DEBUG_CRT(3, "own certificate", crt);
Jerry Yu5cc35062022-01-28 16:16:08 +0800824
David Horstmann8b6068b2023-01-05 15:42:32 +0000825 while (crt != NULL) {
Jerry Yu7399d0d2022-01-30 17:54:19 +0800826 size_t cert_data_len = crt->raw.len;
Jerry Yu5cc35062022-01-28 16:16:08 +0800827
David Horstmann8b6068b2023-01-05 15:42:32 +0000828 MBEDTLS_SSL_CHK_BUF_PTR(p, end, cert_data_len + 3 + 2);
829 MBEDTLS_PUT_UINT24_BE(cert_data_len, p, 0);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800830 p += 3;
Jerry Yu5cc35062022-01-28 16:16:08 +0800831
David Horstmann8b6068b2023-01-05 15:42:32 +0000832 memcpy(p, crt->raw.p, cert_data_len);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800833 p += cert_data_len;
834 crt = crt->next;
Jerry Yu5cc35062022-01-28 16:16:08 +0800835
836 /* Currently, we don't have any certificate extensions defined.
837 * Hence, we are sending an empty extension with length zero.
838 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000839 MBEDTLS_PUT_UINT16_BE(0, p, 0);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800840 p += 2;
Jerry Yu5cc35062022-01-28 16:16:08 +0800841 }
Jerry Yu5cc35062022-01-28 16:16:08 +0800842
David Horstmann8b6068b2023-01-05 15:42:32 +0000843 MBEDTLS_PUT_UINT24_BE(p - p_certificate_list_len - 3,
844 p_certificate_list_len, 0);
Jerry Yu7399d0d2022-01-30 17:54:19 +0800845
Jerry Yu3e536442022-02-15 11:05:59 +0800846 *out_len = p - buf;
Jerry Yu5cc35062022-01-28 16:16:08 +0800847
Jerry Yu7de2ff02022-11-08 21:43:46 +0800848 MBEDTLS_SSL_PRINT_EXTS(
David Horstmann8b6068b2023-01-05 15:42:32 +0000849 3, MBEDTLS_SSL_HS_CERTIFICATE, ssl->handshake->sent_extensions);
Jerry Yu4b8f2f72022-10-31 13:31:22 +0800850
David Horstmann8b6068b2023-01-05 15:42:32 +0000851 return 0;
Jerry Yu5cc35062022-01-28 16:16:08 +0800852}
Jerry Yu5cc35062022-01-28 16:16:08 +0800853
David Horstmann8b6068b2023-01-05 15:42:32 +0000854int mbedtls_ssl_tls13_write_certificate(mbedtls_ssl_context *ssl)
Jerry Yu5cc35062022-01-28 16:16:08 +0800855{
856 int ret;
Ronald Cron5bb8fc82022-03-09 07:00:13 +0100857 unsigned char *buf;
858 size_t buf_len, msg_len;
859
David Horstmann8b6068b2023-01-05 15:42:32 +0000860 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate"));
Jerry Yu5cc35062022-01-28 16:16:08 +0800861
David Horstmann8b6068b2023-01-05 15:42:32 +0000862 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
863 MBEDTLS_SSL_HS_CERTIFICATE, &buf,
864 &buf_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800865
David Horstmann8b6068b2023-01-05 15:42:32 +0000866 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_body(ssl,
867 buf,
868 buf + buf_len,
869 &msg_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800870
David Horstmann8b6068b2023-01-05 15:42:32 +0000871 mbedtls_ssl_add_hs_msg_to_checksum(ssl, MBEDTLS_SSL_HS_CERTIFICATE,
872 buf, msg_len);
Jerry Yu5cc35062022-01-28 16:16:08 +0800873
David Horstmann8b6068b2023-01-05 15:42:32 +0000874 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
875 ssl, buf_len, msg_len));
Jerry Yu5cc35062022-01-28 16:16:08 +0800876cleanup:
877
David Horstmann8b6068b2023-01-05 15:42:32 +0000878 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate"));
879 return ret;
Jerry Yu5cc35062022-01-28 16:16:08 +0800880}
881
Jerry Yu3e536442022-02-15 11:05:59 +0800882/*
883 * STATE HANDLING: Output Certificate Verify
884 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000885int mbedtls_ssl_tls13_check_sig_alg_cert_key_match(uint16_t sig_alg,
886 mbedtls_pk_context *key)
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800887{
David Horstmann8b6068b2023-01-05 15:42:32 +0000888 mbedtls_pk_type_t pk_type = mbedtls_ssl_sig_from_pk(key);
889 size_t key_size = mbedtls_pk_get_bitlen(key);
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800890
David Horstmann8b6068b2023-01-05 15:42:32 +0000891 switch (pk_type) {
Jerry Yu67eced02022-02-25 13:37:36 +0800892 case MBEDTLS_SSL_SIG_ECDSA:
David Horstmann8b6068b2023-01-05 15:42:32 +0000893 switch (key_size) {
Jerry Yu67eced02022-02-25 13:37:36 +0800894 case 256:
David Horstmann8b6068b2023-01-05 15:42:32 +0000895 return
896 sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800897
Jerry Yu67eced02022-02-25 13:37:36 +0800898 case 384:
David Horstmann8b6068b2023-01-05 15:42:32 +0000899 return
900 sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800901
Jerry Yu67eced02022-02-25 13:37:36 +0800902 case 521:
David Horstmann8b6068b2023-01-05 15:42:32 +0000903 return
904 sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512;
Jerry Yu67eced02022-02-25 13:37:36 +0800905 default:
Jerry Yu67eced02022-02-25 13:37:36 +0800906 break;
907 }
908 break;
Jerry Yu67eced02022-02-25 13:37:36 +0800909
Jerry Yu67eced02022-02-25 13:37:36 +0800910 case MBEDTLS_SSL_SIG_RSA:
David Horstmann8b6068b2023-01-05 15:42:32 +0000911 switch (sig_alg) {
Ronald Cron38391bf2022-09-16 11:19:27 +0200912 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256: /* Intentional fallthrough */
913 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384: /* Intentional fallthrough */
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800914 case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512:
David Horstmann8b6068b2023-01-05 15:42:32 +0000915 return 1;
Jerry Yuc2e04932022-06-27 22:13:03 +0800916
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800917 default:
918 break;
Jerry Yucef3f332022-03-22 23:00:13 +0800919 }
Jerry Yu67eced02022-02-25 13:37:36 +0800920 break;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800921
Jerry Yu67eced02022-02-25 13:37:36 +0800922 default:
Jerry Yu67eced02022-02-25 13:37:36 +0800923 break;
924 }
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800925
David Horstmann8b6068b2023-01-05 15:42:32 +0000926 return 0;
Jerry Yu0c6be8f2022-06-20 20:42:00 +0800927}
928
Ronald Cronce7d76e2022-07-08 18:56:49 +0200929MBEDTLS_CHECK_RETURN_CRITICAL
David Horstmann8b6068b2023-01-05 15:42:32 +0000930static int ssl_tls13_write_certificate_verify_body(mbedtls_ssl_context *ssl,
931 unsigned char *buf,
932 unsigned char *end,
933 size_t *out_len)
Jerry Yu8511f122022-01-29 10:01:04 +0800934{
Ronald Cron067a1e72022-09-16 13:44:49 +0200935 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Jerry Yu3e536442022-02-15 11:05:59 +0800936 unsigned char *p = buf;
Jerry Yu8511f122022-01-29 10:01:04 +0800937 mbedtls_pk_context *own_key;
Jerry Yu3e536442022-02-15 11:05:59 +0800938
David Horstmann8b6068b2023-01-05 15:42:32 +0000939 unsigned char handshake_hash[MBEDTLS_TLS1_3_MD_MAX_SIZE];
Jerry Yu8511f122022-01-29 10:01:04 +0800940 size_t handshake_hash_len;
David Horstmann8b6068b2023-01-05 15:42:32 +0000941 unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
Jerry Yu3e536442022-02-15 11:05:59 +0800942 size_t verify_buffer_len;
Ronald Cron067a1e72022-09-16 13:44:49 +0200943
944 uint16_t *sig_alg = ssl->handshake->received_sig_algs;
Jerry Yu3e536442022-02-15 11:05:59 +0800945 size_t signature_len = 0;
Jerry Yu8511f122022-01-29 10:01:04 +0800946
Jerry Yu0b7b1012022-02-23 12:23:05 +0800947 *out_len = 0;
948
David Horstmann8b6068b2023-01-05 15:42:32 +0000949 own_key = mbedtls_ssl_own_key(ssl);
950 if (own_key == NULL) {
951 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
952 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu8511f122022-01-29 10:01:04 +0800953 }
954
David Horstmann8b6068b2023-01-05 15:42:32 +0000955 ret = mbedtls_ssl_get_handshake_transcript(ssl,
956 ssl->handshake->ciphersuite_info->mac,
957 handshake_hash,
958 sizeof(handshake_hash),
959 &handshake_hash_len);
960 if (ret != 0) {
961 return ret;
962 }
Jerry Yu8511f122022-01-29 10:01:04 +0800963
David Horstmann8b6068b2023-01-05 15:42:32 +0000964 MBEDTLS_SSL_DEBUG_BUF(3, "handshake hash",
965 handshake_hash,
966 handshake_hash_len);
Jerry Yu8511f122022-01-29 10:01:04 +0800967
David Horstmann8b6068b2023-01-05 15:42:32 +0000968 ssl_tls13_create_verify_structure(handshake_hash, handshake_hash_len,
969 verify_buffer, &verify_buffer_len,
970 ssl->conf->endpoint);
Jerry Yu8511f122022-01-29 10:01:04 +0800971
972 /*
973 * struct {
974 * SignatureScheme algorithm;
975 * opaque signature<0..2^16-1>;
976 * } CertificateVerify;
977 */
Ronald Cron067a1e72022-09-16 13:44:49 +0200978 /* Check there is space for the algorithm identifier (2 bytes) and the
979 * signature length (2 bytes).
980 */
David Horstmann8b6068b2023-01-05 15:42:32 +0000981 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
Ronald Cron067a1e72022-09-16 13:44:49 +0200982
David Horstmann8b6068b2023-01-05 15:42:32 +0000983 for (; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++) {
Ronald Cron067a1e72022-09-16 13:44:49 +0200984 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
985 mbedtls_pk_type_t pk_type = MBEDTLS_PK_NONE;
986 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
987 psa_algorithm_t psa_algorithm = PSA_ALG_NONE;
988 unsigned char verify_hash[PSA_HASH_MAX_SIZE];
989 size_t verify_hash_len;
Jerry Yu67eced02022-02-25 13:37:36 +0800990
David Horstmann8b6068b2023-01-05 15:42:32 +0000991 if (!mbedtls_ssl_sig_alg_is_offered(ssl, *sig_alg)) {
Ronald Cron067a1e72022-09-16 13:44:49 +0200992 continue;
David Horstmann8b6068b2023-01-05 15:42:32 +0000993 }
Jerry Yu67eced02022-02-25 13:37:36 +0800994
David Horstmann8b6068b2023-01-05 15:42:32 +0000995 if (!mbedtls_ssl_tls13_sig_alg_for_cert_verify_is_supported(*sig_alg)) {
Ronald Cron067a1e72022-09-16 13:44:49 +0200996 continue;
David Horstmann8b6068b2023-01-05 15:42:32 +0000997 }
Ronald Cron067a1e72022-09-16 13:44:49 +0200998
David Horstmann8b6068b2023-01-05 15:42:32 +0000999 if (!mbedtls_ssl_tls13_check_sig_alg_cert_key_match(*sig_alg, own_key)) {
Ronald Cron067a1e72022-09-16 13:44:49 +02001000 continue;
David Horstmann8b6068b2023-01-05 15:42:32 +00001001 }
Ronald Cron067a1e72022-09-16 13:44:49 +02001002
David Horstmann8b6068b2023-01-05 15:42:32 +00001003 if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
1004 *sig_alg, &pk_type, &md_alg) != 0) {
1005 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Ronald Cron067a1e72022-09-16 13:44:49 +02001006 }
1007
1008 /* Hash verify buffer with indicated hash function */
David Horstmann8b6068b2023-01-05 15:42:32 +00001009 psa_algorithm = mbedtls_hash_info_psa_from_md(md_alg);
1010 status = psa_hash_compute(psa_algorithm,
1011 verify_buffer,
1012 verify_buffer_len,
1013 verify_hash, sizeof(verify_hash),
1014 &verify_hash_len);
1015 if (status != PSA_SUCCESS) {
1016 return psa_ssl_status_to_mbedtls(status);
Ronald Cron067a1e72022-09-16 13:44:49 +02001017 }
1018
David Horstmann8b6068b2023-01-05 15:42:32 +00001019 MBEDTLS_SSL_DEBUG_BUF(3, "verify hash", verify_hash, verify_hash_len);
1020
1021 if ((ret = mbedtls_pk_sign_ext(pk_type, own_key,
1022 md_alg, verify_hash, verify_hash_len,
1023 p + 4, (size_t) (end - (p + 4)), &signature_len,
1024 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
1025 MBEDTLS_SSL_DEBUG_MSG(2, ("CertificateVerify signature failed with %s",
1026 mbedtls_ssl_sig_alg_to_str(*sig_alg)));
1027 MBEDTLS_SSL_DEBUG_RET(2, "mbedtls_pk_sign_ext", ret);
1028
1029 /* The signature failed. This is possible if the private key
1030 * was not suitable for the signature operation as purposely we
1031 * did not check its suitability completely. Let's try with
1032 * another signature algorithm.
1033 */
1034 continue;
1035 }
1036
1037 MBEDTLS_SSL_DEBUG_MSG(2, ("CertificateVerify signature with %s",
1038 mbedtls_ssl_sig_alg_to_str(*sig_alg)));
Ronald Cron067a1e72022-09-16 13:44:49 +02001039
1040 break;
1041 }
1042
David Horstmann8b6068b2023-01-05 15:42:32 +00001043 if (*sig_alg == MBEDTLS_TLS1_3_SIG_NONE) {
1044 MBEDTLS_SSL_DEBUG_MSG(1, ("no suitable signature algorithm"));
1045 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1046 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
1047 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Jerry Yu8511f122022-01-29 10:01:04 +08001048 }
1049
David Horstmann8b6068b2023-01-05 15:42:32 +00001050 MBEDTLS_PUT_UINT16_BE(*sig_alg, p, 0);
1051 MBEDTLS_PUT_UINT16_BE(signature_len, p, 2);
Jerry Yuf3b46b52022-06-19 16:52:27 +08001052
Ronald Cron067a1e72022-09-16 13:44:49 +02001053 *out_len = 4 + signature_len;
Jerry Yu8c338862022-03-23 13:34:04 +08001054
David Horstmann8b6068b2023-01-05 15:42:32 +00001055 return 0;
Jerry Yu8511f122022-01-29 10:01:04 +08001056}
Jerry Yu8511f122022-01-29 10:01:04 +08001057
David Horstmann8b6068b2023-01-05 15:42:32 +00001058int mbedtls_ssl_tls13_write_certificate_verify(mbedtls_ssl_context *ssl)
Jerry Yu8511f122022-01-29 10:01:04 +08001059{
1060 int ret = 0;
Jerry Yuca133a32022-02-15 14:22:05 +08001061 unsigned char *buf;
1062 size_t buf_len, msg_len;
1063
David Horstmann8b6068b2023-01-05 15:42:32 +00001064 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate verify"));
Jerry Yu8511f122022-01-29 10:01:04 +08001065
David Horstmann8b6068b2023-01-05 15:42:32 +00001066 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
1067 MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, &buf,
1068 &buf_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001069
David Horstmann8b6068b2023-01-05 15:42:32 +00001070 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_verify_body(
1071 ssl, buf, buf + buf_len, &msg_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001072
David Horstmann8b6068b2023-01-05 15:42:32 +00001073 mbedtls_ssl_add_hs_msg_to_checksum(ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
1074 buf, msg_len);
Jerry Yu8511f122022-01-29 10:01:04 +08001075
David Horstmann8b6068b2023-01-05 15:42:32 +00001076 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
1077 ssl, buf_len, msg_len));
Jerry Yu8511f122022-01-29 10:01:04 +08001078
1079cleanup:
1080
David Horstmann8b6068b2023-01-05 15:42:32 +00001081 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate verify"));
1082 return ret;
Jerry Yu8511f122022-01-29 10:01:04 +08001083}
1084
Ronald Cron928cbd32022-10-04 16:14:26 +02001085#endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
Jerry Yu90f152d2022-01-29 22:12:42 +08001086
Jerry Yu5cc35062022-01-28 16:16:08 +08001087/*
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001088 *
XiaokangQianc5c39d52021-11-09 11:55:10 +00001089 * STATE HANDLING: Incoming Finished message.
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001090 */
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001091/*
1092 * Implementation
1093 */
1094
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001095MBEDTLS_CHECK_RETURN_CRITICAL
David Horstmann8b6068b2023-01-05 15:42:32 +00001096static int ssl_tls13_preprocess_finished_message(mbedtls_ssl_context *ssl)
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001097{
1098 int ret;
1099
David Horstmann8b6068b2023-01-05 15:42:32 +00001100 ret = mbedtls_ssl_tls13_calculate_verify_data(ssl,
1101 ssl->handshake->state_local.finished_in.digest,
1102 sizeof(ssl->handshake->state_local.finished_in.
1103 digest),
1104 &ssl->handshake->state_local.finished_in.digest_len,
1105 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ?
1106 MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT);
1107 if (ret != 0) {
1108 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_calculate_verify_data", ret);
1109 return ret;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001110 }
1111
David Horstmann8b6068b2023-01-05 15:42:32 +00001112 return 0;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001113}
1114
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001115MBEDTLS_CHECK_RETURN_CRITICAL
David Horstmann8b6068b2023-01-05 15:42:32 +00001116static int ssl_tls13_parse_finished_message(mbedtls_ssl_context *ssl,
1117 const unsigned char *buf,
1118 const unsigned char *end)
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001119{
XiaokangQian33062842021-11-11 03:37:45 +00001120 /*
1121 * struct {
XiaokangQianc13f9352021-11-11 06:13:22 +00001122 * opaque verify_data[Hash.length];
XiaokangQian33062842021-11-11 03:37:45 +00001123 * } Finished;
1124 */
1125 const unsigned char *expected_verify_data =
1126 ssl->handshake->state_local.finished_in.digest;
1127 size_t expected_verify_data_len =
1128 ssl->handshake->state_local.finished_in.digest_len;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001129 /* Structural validation */
David Horstmann8b6068b2023-01-05 15:42:32 +00001130 if ((size_t) (end - buf) != expected_verify_data_len) {
1131 MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001132
David Horstmann8b6068b2023-01-05 15:42:32 +00001133 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
1134 MBEDTLS_ERR_SSL_DECODE_ERROR);
1135 return MBEDTLS_ERR_SSL_DECODE_ERROR;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001136 }
1137
David Horstmann8b6068b2023-01-05 15:42:32 +00001138 MBEDTLS_SSL_DEBUG_BUF(4, "verify_data (self-computed):",
1139 expected_verify_data,
1140 expected_verify_data_len);
1141 MBEDTLS_SSL_DEBUG_BUF(4, "verify_data (received message):", buf,
1142 expected_verify_data_len);
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001143
1144 /* Semantic validation */
David Horstmann8b6068b2023-01-05 15:42:32 +00001145 if (mbedtls_ct_memcmp(buf,
1146 expected_verify_data,
1147 expected_verify_data_len) != 0) {
1148 MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001149
David Horstmann8b6068b2023-01-05 15:42:32 +00001150 MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
1151 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
1152 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001153 }
David Horstmann8b6068b2023-01-05 15:42:32 +00001154 return 0;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001155}
1156
David Horstmann8b6068b2023-01-05 15:42:32 +00001157int mbedtls_ssl_tls13_process_finished_message(mbedtls_ssl_context *ssl)
XiaokangQianc5c39d52021-11-09 11:55:10 +00001158{
XiaokangQian33062842021-11-11 03:37:45 +00001159 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001160 unsigned char *buf;
Xiaofei Baieef15042021-11-18 07:29:56 +00001161 size_t buf_len;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001162
David Horstmann8b6068b2023-01-05 15:42:32 +00001163 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse finished message"));
XiaokangQianc5c39d52021-11-09 11:55:10 +00001164
David Horstmann8b6068b2023-01-05 15:42:32 +00001165 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(ssl,
1166 MBEDTLS_SSL_HS_FINISHED,
1167 &buf, &buf_len));
Jerry Yu0a92d6c2022-05-16 16:54:46 +08001168
1169 /* Preprocessing step: Compute handshake digest */
David Horstmann8b6068b2023-01-05 15:42:32 +00001170 MBEDTLS_SSL_PROC_CHK(ssl_tls13_preprocess_finished_message(ssl));
Jerry Yu0a92d6c2022-05-16 16:54:46 +08001171
David Horstmann8b6068b2023-01-05 15:42:32 +00001172 MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_finished_message(ssl, buf, buf + buf_len));
Jerry Yu0a92d6c2022-05-16 16:54:46 +08001173
David Horstmann8b6068b2023-01-05 15:42:32 +00001174 mbedtls_ssl_add_hs_msg_to_checksum(ssl, MBEDTLS_SSL_HS_FINISHED,
1175 buf, buf_len);
XiaokangQianc5c39d52021-11-09 11:55:10 +00001176
1177cleanup:
1178
David Horstmann8b6068b2023-01-05 15:42:32 +00001179 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse finished message"));
1180 return ret;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001181}
1182
XiaokangQian74af2a82021-09-22 07:40:30 +00001183/*
1184 *
XiaokangQiancc90c942021-11-09 12:30:09 +00001185 * STATE HANDLING: Write and send Finished message.
XiaokangQian74af2a82021-09-22 07:40:30 +00001186 *
1187 */
XiaokangQian74af2a82021-09-22 07:40:30 +00001188/*
XiaokangQian35dc6252021-11-11 08:16:19 +00001189 * Implement
XiaokangQian74af2a82021-09-22 07:40:30 +00001190 */
1191
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001192MBEDTLS_CHECK_RETURN_CRITICAL
David Horstmann8b6068b2023-01-05 15:42:32 +00001193static int ssl_tls13_prepare_finished_message(mbedtls_ssl_context *ssl)
XiaokangQian74af2a82021-09-22 07:40:30 +00001194{
1195 int ret;
1196
1197 /* Compute transcript of handshake up to now. */
David Horstmann8b6068b2023-01-05 15:42:32 +00001198 ret = mbedtls_ssl_tls13_calculate_verify_data(ssl,
1199 ssl->handshake->state_local.finished_out.digest,
1200 sizeof(ssl->handshake->state_local.finished_out.
1201 digest),
1202 &ssl->handshake->state_local.finished_out.digest_len,
1203 ssl->conf->endpoint);
XiaokangQian74af2a82021-09-22 07:40:30 +00001204
David Horstmann8b6068b2023-01-05 15:42:32 +00001205 if (ret != 0) {
1206 MBEDTLS_SSL_DEBUG_RET(1, "calculate_verify_data failed", ret);
1207 return ret;
XiaokangQian74af2a82021-09-22 07:40:30 +00001208 }
1209
David Horstmann8b6068b2023-01-05 15:42:32 +00001210 return 0;
XiaokangQian74af2a82021-09-22 07:40:30 +00001211}
1212
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001213MBEDTLS_CHECK_RETURN_CRITICAL
David Horstmann8b6068b2023-01-05 15:42:32 +00001214static int ssl_tls13_write_finished_message_body(mbedtls_ssl_context *ssl,
1215 unsigned char *buf,
1216 unsigned char *end,
1217 size_t *out_len)
XiaokangQian74af2a82021-09-22 07:40:30 +00001218{
XiaokangQian8773aa02021-11-10 07:33:09 +00001219 size_t verify_data_len = ssl->handshake->state_local.finished_out.digest_len;
XiaokangQian0fa66432021-11-15 03:33:57 +00001220 /*
1221 * struct {
1222 * opaque verify_data[Hash.length];
1223 * } Finished;
1224 */
David Horstmann8b6068b2023-01-05 15:42:32 +00001225 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, verify_data_len);
XiaokangQian74af2a82021-09-22 07:40:30 +00001226
David Horstmann8b6068b2023-01-05 15:42:32 +00001227 memcpy(buf, ssl->handshake->state_local.finished_out.digest,
1228 verify_data_len);
XiaokangQian74af2a82021-09-22 07:40:30 +00001229
Xiaofei Baid25fab62021-12-02 06:36:27 +00001230 *out_len = verify_data_len;
David Horstmann8b6068b2023-01-05 15:42:32 +00001231 return 0;
XiaokangQian74af2a82021-09-22 07:40:30 +00001232}
XiaokangQianc5c39d52021-11-09 11:55:10 +00001233
XiaokangQian35dc6252021-11-11 08:16:19 +00001234/* Main entry point: orchestrates the other functions */
David Horstmann8b6068b2023-01-05 15:42:32 +00001235int mbedtls_ssl_tls13_write_finished_message(mbedtls_ssl_context *ssl)
XiaokangQian35dc6252021-11-11 08:16:19 +00001236{
1237 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1238 unsigned char *buf;
1239 size_t buf_len, msg_len;
1240
David Horstmann8b6068b2023-01-05 15:42:32 +00001241 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write finished message"));
XiaokangQian35dc6252021-11-11 08:16:19 +00001242
David Horstmann8b6068b2023-01-05 15:42:32 +00001243 MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_finished_message(ssl));
XiaokangQiandce82242021-11-15 06:01:26 +00001244
David Horstmann8b6068b2023-01-05 15:42:32 +00001245 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
1246 MBEDTLS_SSL_HS_FINISHED, &buf, &buf_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001247
David Horstmann8b6068b2023-01-05 15:42:32 +00001248 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_finished_message_body(
1249 ssl, buf, buf + buf_len, &msg_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001250
David Horstmann8b6068b2023-01-05 15:42:32 +00001251 mbedtls_ssl_add_hs_msg_to_checksum(ssl, MBEDTLS_SSL_HS_FINISHED,
1252 buf, msg_len);
XiaokangQian35dc6252021-11-11 08:16:19 +00001253
David Horstmann8b6068b2023-01-05 15:42:32 +00001254 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
1255 ssl, buf_len, msg_len));
XiaokangQian35dc6252021-11-11 08:16:19 +00001256cleanup:
1257
David Horstmann8b6068b2023-01-05 15:42:32 +00001258 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write finished message"));
1259 return ret;
XiaokangQian35dc6252021-11-11 08:16:19 +00001260}
1261
David Horstmann8b6068b2023-01-05 15:42:32 +00001262void mbedtls_ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl)
Jerry Yu378254d2021-10-30 21:44:47 +08001263{
1264
David Horstmann8b6068b2023-01-05 15:42:32 +00001265 MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup"));
Jerry Yu378254d2021-10-30 21:44:47 +08001266
David Horstmann8b6068b2023-01-05 15:42:32 +00001267 MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to application keys for inbound traffic"));
1268 mbedtls_ssl_set_inbound_transform(ssl, ssl->transform_application);
Jerry Yue8c1fca2022-05-18 14:48:56 +08001269
David Horstmann8b6068b2023-01-05 15:42:32 +00001270 MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to application keys for outbound traffic"));
1271 mbedtls_ssl_set_outbound_transform(ssl, ssl->transform_application);
Jerry Yue8c1fca2022-05-18 14:48:56 +08001272
Jerry Yu378254d2021-10-30 21:44:47 +08001273 /*
Jerry Yucfe64f02021-11-15 13:54:06 +08001274 * Free the previous session and switch to the current one.
Jerry Yu378254d2021-10-30 21:44:47 +08001275 */
David Horstmann8b6068b2023-01-05 15:42:32 +00001276 if (ssl->session) {
1277 mbedtls_ssl_session_free(ssl->session);
1278 mbedtls_free(ssl->session);
Jerry Yu378254d2021-10-30 21:44:47 +08001279 }
1280 ssl->session = ssl->session_negotiate;
1281 ssl->session_negotiate = NULL;
1282
David Horstmann8b6068b2023-01-05 15:42:32 +00001283 MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup"));
Jerry Yu378254d2021-10-30 21:44:47 +08001284}
1285
Ronald Cron49ad6192021-11-24 16:25:31 +01001286/*
1287 *
1288 * STATE HANDLING: Write ChangeCipherSpec
1289 *
1290 */
1291#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001292MBEDTLS_CHECK_RETURN_CRITICAL
David Horstmann8b6068b2023-01-05 15:42:32 +00001293static int ssl_tls13_write_change_cipher_spec_body(mbedtls_ssl_context *ssl,
1294 unsigned char *buf,
1295 unsigned char *end,
1296 size_t *olen)
Ronald Cron49ad6192021-11-24 16:25:31 +01001297{
1298 ((void) ssl);
1299
David Horstmann8b6068b2023-01-05 15:42:32 +00001300 MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 1);
Ronald Cron49ad6192021-11-24 16:25:31 +01001301 buf[0] = 1;
1302 *olen = 1;
1303
David Horstmann8b6068b2023-01-05 15:42:32 +00001304 return 0;
Ronald Cron49ad6192021-11-24 16:25:31 +01001305}
1306
David Horstmann8b6068b2023-01-05 15:42:32 +00001307int mbedtls_ssl_tls13_write_change_cipher_spec(mbedtls_ssl_context *ssl)
Ronald Cron49ad6192021-11-24 16:25:31 +01001308{
1309 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1310
David Horstmann8b6068b2023-01-05 15:42:32 +00001311 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write change cipher spec"));
Ronald Cron49ad6192021-11-24 16:25:31 +01001312
Ronald Cron49ad6192021-11-24 16:25:31 +01001313 /* Write CCS message */
David Horstmann8b6068b2023-01-05 15:42:32 +00001314 MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_change_cipher_spec_body(
1315 ssl, ssl->out_msg,
1316 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
1317 &ssl->out_msglen));
Ronald Cron49ad6192021-11-24 16:25:31 +01001318
1319 ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC;
1320
Ronald Cron49ad6192021-11-24 16:25:31 +01001321 /* Dispatch message */
David Horstmann8b6068b2023-01-05 15:42:32 +00001322 MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_write_record(ssl, 0));
Ronald Cron49ad6192021-11-24 16:25:31 +01001323
1324cleanup:
1325
David Horstmann8b6068b2023-01-05 15:42:32 +00001326 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write change cipher spec"));
1327 return ret;
Ronald Cron49ad6192021-11-24 16:25:31 +01001328}
1329
1330#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
1331
Xiaokang Qianecc29482022-11-02 07:52:47 +00001332/* Early Data Indication Extension
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001333 *
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001334 * struct {
1335 * select ( Handshake.msg_type ) {
Xiaokang Qianecc29482022-11-02 07:52:47 +00001336 * ...
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001337 * case client_hello: Empty;
1338 * case encrypted_extensions: Empty;
1339 * };
1340 * } EarlyDataIndication;
1341 */
1342#if defined(MBEDTLS_SSL_EARLY_DATA)
David Horstmann8b6068b2023-01-05 15:42:32 +00001343int mbedtls_ssl_tls13_write_early_data_ext(mbedtls_ssl_context *ssl,
1344 unsigned char *buf,
1345 const unsigned char *end,
1346 size_t *out_len)
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001347{
1348 unsigned char *p = buf;
1349 *out_len = 0;
1350 ((void) ssl);
1351
David Horstmann8b6068b2023-01-05 15:42:32 +00001352 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001353
David Horstmann8b6068b2023-01-05 15:42:32 +00001354 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EARLY_DATA, p, 0);
1355 MBEDTLS_PUT_UINT16_BE(0, p, 2);
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001356
1357 *out_len = 4;
Xiaokang Qian2cd5ce02022-11-15 10:33:53 +00001358
David Horstmann8b6068b2023-01-05 15:42:32 +00001359 mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_EARLY_DATA);
Xiaokang Qian2cd5ce02022-11-15 10:33:53 +00001360
David Horstmann8b6068b2023-01-05 15:42:32 +00001361 return 0;
Xiaokang Qian0e97d4d2022-10-24 11:12:51 +00001362}
1363#endif /* MBEDTLS_SSL_EARLY_DATA */
1364
XiaokangQian78b1fa72022-01-19 06:56:30 +00001365/* Reset SSL context and update hash for handling HRR.
1366 *
1367 * Replace Transcript-Hash(X) by
1368 * Transcript-Hash( message_hash ||
1369 * 00 00 Hash.length ||
1370 * X )
1371 * A few states of the handshake are preserved, including:
1372 * - session ID
1373 * - session ticket
1374 * - negotiated ciphersuite
1375 */
David Horstmann8b6068b2023-01-05 15:42:32 +00001376int mbedtls_ssl_reset_transcript_for_hrr(mbedtls_ssl_context *ssl)
XiaokangQian78b1fa72022-01-19 06:56:30 +00001377{
1378 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Przemyslaw Stekielda645252022-09-14 12:50:51 +02001379 unsigned char hash_transcript[PSA_HASH_MAX_SIZE + 4];
XiaokangQian0ece9982022-01-24 08:56:23 +00001380 size_t hash_len;
XiaokangQian78b1fa72022-01-19 06:56:30 +00001381 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
1382 uint16_t cipher_suite = ssl->session_negotiate->ciphersuite;
David Horstmann8b6068b2023-01-05 15:42:32 +00001383 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(cipher_suite);
XiaokangQian78b1fa72022-01-19 06:56:30 +00001384
David Horstmann8b6068b2023-01-05 15:42:32 +00001385 MBEDTLS_SSL_DEBUG_MSG(3, ("Reset SSL session for HRR"));
XiaokangQian78b1fa72022-01-19 06:56:30 +00001386
David Horstmann8b6068b2023-01-05 15:42:32 +00001387 ret = mbedtls_ssl_get_handshake_transcript(ssl, ciphersuite_info->mac,
1388 hash_transcript + 4,
1389 PSA_HASH_MAX_SIZE,
1390 &hash_len);
1391 if (ret != 0) {
1392 MBEDTLS_SSL_DEBUG_RET(4, "mbedtls_ssl_get_handshake_transcript", ret);
1393 return ret;
XiaokangQian0ece9982022-01-24 08:56:23 +00001394 }
1395
1396 hash_transcript[0] = MBEDTLS_SSL_HS_MESSAGE_HASH;
1397 hash_transcript[1] = 0;
1398 hash_transcript[2] = 0;
1399 hash_transcript[3] = (unsigned char) hash_len;
1400
1401 hash_len += 4;
1402
Przemek Stekiel9dfbf3a2022-09-06 07:40:46 +02001403#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA)
David Horstmann8b6068b2023-01-05 15:42:32 +00001404 if (ciphersuite_info->mac == MBEDTLS_MD_SHA256) {
1405 MBEDTLS_SSL_DEBUG_BUF(4, "Truncated SHA-256 handshake transcript",
1406 hash_transcript, hash_len);
XiaokangQian78b1fa72022-01-19 06:56:30 +00001407
1408#if defined(MBEDTLS_USE_PSA_CRYPTO)
David Horstmann8b6068b2023-01-05 15:42:32 +00001409 psa_hash_abort(&ssl->handshake->fin_sha256_psa);
1410 psa_hash_setup(&ssl->handshake->fin_sha256_psa, PSA_ALG_SHA_256);
XiaokangQian78b1fa72022-01-19 06:56:30 +00001411#else
David Horstmann8b6068b2023-01-05 15:42:32 +00001412 mbedtls_sha256_starts(&ssl->handshake->fin_sha256, 0);
XiaokangQian78b1fa72022-01-19 06:56:30 +00001413#endif
XiaokangQian78b1fa72022-01-19 06:56:30 +00001414 }
Przemek Stekiel9dfbf3a2022-09-06 07:40:46 +02001415#endif /* MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
1416#if defined(MBEDTLS_HAS_ALG_SHA_384_VIA_MD_OR_PSA_BASED_ON_USE_PSA)
David Horstmann8b6068b2023-01-05 15:42:32 +00001417 if (ciphersuite_info->mac == MBEDTLS_MD_SHA384) {
1418 MBEDTLS_SSL_DEBUG_BUF(4, "Truncated SHA-384 handshake transcript",
1419 hash_transcript, hash_len);
XiaokangQian78b1fa72022-01-19 06:56:30 +00001420
1421#if defined(MBEDTLS_USE_PSA_CRYPTO)
David Horstmann8b6068b2023-01-05 15:42:32 +00001422 psa_hash_abort(&ssl->handshake->fin_sha384_psa);
1423 psa_hash_setup(&ssl->handshake->fin_sha384_psa, PSA_ALG_SHA_384);
XiaokangQian78b1fa72022-01-19 06:56:30 +00001424#else
David Horstmann8b6068b2023-01-05 15:42:32 +00001425 mbedtls_sha512_starts(&ssl->handshake->fin_sha384, 1);
XiaokangQian78b1fa72022-01-19 06:56:30 +00001426#endif
XiaokangQian78b1fa72022-01-19 06:56:30 +00001427 }
Przemek Stekiel9dfbf3a2022-09-06 07:40:46 +02001428#endif /* MBEDTLS_HAS_ALG_SHA_384_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
David Horstmann8b6068b2023-01-05 15:42:32 +00001429#if defined(MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA) || \
1430 defined(MBEDTLS_HAS_ALG_SHA_384_VIA_MD_OR_PSA_BASED_ON_USE_PSA)
1431 ssl->handshake->update_checksum(ssl, hash_transcript, hash_len);
1432#endif \
1433 /* MBEDTLS_HAS_ALG_SHA_256_VIA_MD_OR_PSA_BASED_ON_USE_PSA || MBEDTLS_HAS_ALG_SHA_384_VIA_MD_OR_PSA_BASED_ON_USE_PSA */
Przemyslaw Stekiel4b3fff42022-02-14 16:39:52 +01001434
David Horstmann8b6068b2023-01-05 15:42:32 +00001435 return ret;
XiaokangQian78b1fa72022-01-19 06:56:30 +00001436}
1437
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001438#if defined(MBEDTLS_ECDH_C)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001439
David Horstmann8b6068b2023-01-05 15:42:32 +00001440int mbedtls_ssl_tls13_read_public_ecdhe_share(mbedtls_ssl_context *ssl,
1441 const unsigned char *buf,
1442 size_t buf_len)
XiaokangQian7807f9f2022-02-15 10:04:37 +00001443{
David Horstmann8b6068b2023-01-05 15:42:32 +00001444 uint8_t *p = (uint8_t *) buf;
XiaokangQiancfd925f2022-04-14 07:10:37 +00001445 const uint8_t *end = buf + buf_len;
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001446 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
XiaokangQian7807f9f2022-02-15 10:04:37 +00001447
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001448 /* Get size of the TLS opaque key_exchange field of the KeyShareEntry struct. */
David Horstmann8b6068b2023-01-05 15:42:32 +00001449 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
1450 uint16_t peerkey_len = MBEDTLS_GET_UINT16_BE(p, 0);
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001451 p += 2;
XiaokangQian3207a322022-02-23 03:15:27 +00001452
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001453 /* Check if key size is consistent with given buffer length. */
David Horstmann8b6068b2023-01-05 15:42:32 +00001454 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, peerkey_len);
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001455
1456 /* Store peer's ECDH public key. */
David Horstmann8b6068b2023-01-05 15:42:32 +00001457 memcpy(handshake->ecdh_psa_peerkey, p, peerkey_len);
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001458 handshake->ecdh_psa_peerkey_len = peerkey_len;
1459
David Horstmann8b6068b2023-01-05 15:42:32 +00001460 return 0;
XiaokangQian3207a322022-02-23 03:15:27 +00001461}
Jerry Yu89e103c2022-03-30 22:43:29 +08001462
1463int mbedtls_ssl_tls13_generate_and_write_ecdh_key_exchange(
David Horstmann8b6068b2023-01-05 15:42:32 +00001464 mbedtls_ssl_context *ssl,
1465 uint16_t named_group,
1466 unsigned char *buf,
1467 unsigned char *end,
1468 size_t *out_len)
Jerry Yu89e103c2022-03-30 22:43:29 +08001469{
1470 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
1471 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1472 psa_key_attributes_t key_attributes;
1473 size_t own_pubkey_len;
1474 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
1475 size_t ecdh_bits = 0;
1476
David Horstmann8b6068b2023-01-05 15:42:32 +00001477 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Jerry Yu89e103c2022-03-30 22:43:29 +08001478
1479 /* Convert EC group to PSA key type. */
David Horstmann8b6068b2023-01-05 15:42:32 +00001480 if ((handshake->ecdh_psa_type =
1481 mbedtls_psa_parse_tls_ecc_group(named_group, &ecdh_bits)) == 0) {
1482 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1483 }
Jerry Yu89e103c2022-03-30 22:43:29 +08001484
1485 ssl->handshake->ecdh_bits = ecdh_bits;
1486
1487 key_attributes = psa_key_attributes_init();
David Horstmann8b6068b2023-01-05 15:42:32 +00001488 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
1489 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
1490 psa_set_key_type(&key_attributes, handshake->ecdh_psa_type);
1491 psa_set_key_bits(&key_attributes, handshake->ecdh_bits);
Jerry Yu89e103c2022-03-30 22:43:29 +08001492
1493 /* Generate ECDH private key. */
David Horstmann8b6068b2023-01-05 15:42:32 +00001494 status = psa_generate_key(&key_attributes,
1495 &handshake->ecdh_psa_privkey);
1496 if (status != PSA_SUCCESS) {
1497 ret = psa_ssl_status_to_mbedtls(status);
1498 MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
1499 return ret;
Jerry Yu89e103c2022-03-30 22:43:29 +08001500
1501 }
1502
1503 /* Export the public part of the ECDH private key from PSA. */
David Horstmann8b6068b2023-01-05 15:42:32 +00001504 status = psa_export_public_key(handshake->ecdh_psa_privkey,
1505 buf, (size_t) (end - buf),
1506 &own_pubkey_len);
1507 if (status != PSA_SUCCESS) {
1508 ret = psa_ssl_status_to_mbedtls(status);
1509 MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
1510 return ret;
Jerry Yu89e103c2022-03-30 22:43:29 +08001511
1512 }
1513
1514 *out_len = own_pubkey_len;
1515
David Horstmann8b6068b2023-01-05 15:42:32 +00001516 return 0;
Jerry Yu89e103c2022-03-30 22:43:29 +08001517}
XiaokangQian9b5d04b2022-04-10 10:20:43 +00001518#endif /* MBEDTLS_ECDH_C */
XiaokangQian7807f9f2022-02-15 10:04:37 +00001519
Jerry Yu0c354a22022-08-29 15:25:36 +08001520/* RFC 8446 section 4.2
1521 *
1522 * If an implementation receives an extension which it recognizes and which is
1523 * not specified for the message in which it appears, it MUST abort the handshake
1524 * with an "illegal_parameter" alert.
1525 *
1526 */
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001527int mbedtls_ssl_tls13_check_received_extension(
David Horstmann8b6068b2023-01-05 15:42:32 +00001528 mbedtls_ssl_context *ssl,
1529 int hs_msg_type,
1530 unsigned int received_extension_type,
1531 uint32_t hs_msg_allowed_extensions_mask)
Jerry Yu0c354a22022-08-29 15:25:36 +08001532{
Jerry Yudf0ad652022-10-31 13:20:57 +08001533 uint32_t extension_mask = mbedtls_ssl_get_extension_mask(
David Horstmann8b6068b2023-01-05 15:42:32 +00001534 received_extension_type);
Jerry Yu0c354a22022-08-29 15:25:36 +08001535
Jerry Yu79aa7212022-11-08 21:30:21 +08001536 MBEDTLS_SSL_PRINT_EXT(
David Horstmann8b6068b2023-01-05 15:42:32 +00001537 3, hs_msg_type, received_extension_type, "received");
Jerry Yu0c354a22022-08-29 15:25:36 +08001538
David Horstmann8b6068b2023-01-05 15:42:32 +00001539 if ((extension_mask & hs_msg_allowed_extensions_mask) == 0) {
Jerry Yu79aa7212022-11-08 21:30:21 +08001540 MBEDTLS_SSL_PRINT_EXT(
David Horstmann8b6068b2023-01-05 15:42:32 +00001541 3, hs_msg_type, received_extension_type, "is illegal");
Jerry Yu0c354a22022-08-29 15:25:36 +08001542 MBEDTLS_SSL_PEND_FATAL_ALERT(
1543 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
David Horstmann8b6068b2023-01-05 15:42:32 +00001544 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
1545 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Jerry Yu0c354a22022-08-29 15:25:36 +08001546 }
1547
1548 ssl->handshake->received_extensions |= extension_mask;
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001549 /*
1550 * If it is a message containing extension responses, check that we
1551 * previously sent the extension.
1552 */
David Horstmann8b6068b2023-01-05 15:42:32 +00001553 switch (hs_msg_type) {
Jerry Yu0c354a22022-08-29 15:25:36 +08001554 case MBEDTLS_SSL_HS_SERVER_HELLO:
Jerry Yudf0ad652022-10-31 13:20:57 +08001555 case MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST:
Jerry Yu0c354a22022-08-29 15:25:36 +08001556 case MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS:
1557 case MBEDTLS_SSL_HS_CERTIFICATE:
Jerry Yuc4bf5d62022-10-29 09:08:47 +08001558 /* Check if the received extension is sent by peer message.*/
David Horstmann8b6068b2023-01-05 15:42:32 +00001559 if ((ssl->handshake->sent_extensions & extension_mask) != 0) {
1560 return 0;
1561 }
Jerry Yu0c354a22022-08-29 15:25:36 +08001562 break;
1563 default:
David Horstmann8b6068b2023-01-05 15:42:32 +00001564 return 0;
Jerry Yu0c354a22022-08-29 15:25:36 +08001565 }
1566
Jerry Yu79aa7212022-11-08 21:30:21 +08001567 MBEDTLS_SSL_PRINT_EXT(
David Horstmann8b6068b2023-01-05 15:42:32 +00001568 3, hs_msg_type, received_extension_type, "is unsupported");
Jerry Yu0c354a22022-08-29 15:25:36 +08001569 MBEDTLS_SSL_PEND_FATAL_ALERT(
1570 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT,
David Horstmann8b6068b2023-01-05 15:42:32 +00001571 MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION);
1572 return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
Jerry Yu0c354a22022-08-29 15:25:36 +08001573}
1574
Jerry Yufb4b6472022-01-27 15:03:26 +08001575#endif /* MBEDTLS_SSL_TLS_C && MBEDTLS_SSL_PROTO_TLS1_3 */