blob: 5aa85877759645b8ebaaa1852ee59ee4ed2e6f9c [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"
XiaokangQian74af2a82021-09-22 07:40:30 +000031#include <string.h>
Jerry Yuc8a392c2021-08-18 16:46:28 +080032
Jerry Yu65dd2cc2021-08-18 16:38:40 +080033#include "ssl_misc.h"
Jerry Yu30b071c2021-09-12 20:16:03 +080034#include "ssl_tls13_keys.h"
Jerry Yu67eced02022-02-25 13:37:36 +080035#include "ssl_debug_helpers.h"
Jerry Yu65dd2cc2021-08-18 16:38:40 +080036
Xiaofei Bai746f9482021-11-12 08:53:56 +000037int mbedtls_ssl_tls13_fetch_handshake_msg( mbedtls_ssl_context *ssl,
38 unsigned hs_type,
39 unsigned char **buf,
Xiaofei Baieef15042021-11-18 07:29:56 +000040 size_t *buf_len )
XiaokangQian6b226b02021-09-24 07:51:16 +000041{
42 int ret;
43
44 if( ( ret = mbedtls_ssl_read_record( ssl, 0 ) ) != 0 )
45 {
46 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
47 goto cleanup;
48 }
49
XiaokangQian16c61aa2021-09-27 09:30:17 +000050 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
XiaokangQian6b226b02021-09-24 07:51:16 +000051 ssl->in_msg[0] != hs_type )
52 {
XiaokangQian16c61aa2021-09-27 09:30:17 +000053 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Receive unexpected handshake message." ) );
XiaokangQian6b226b02021-09-24 07:51:16 +000054 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
XiaokangQian05420b12021-09-29 08:46:37 +000055 MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
XiaokangQian6b226b02021-09-24 07:51:16 +000056 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
57 goto cleanup;
58 }
59
XiaokangQian05420b12021-09-29 08:46:37 +000060 /*
61 * Jump handshake header (4 bytes, see Section 4 of RFC 8446).
62 * ...
63 * HandshakeType msg_type;
64 * uint24 length;
65 * ...
66 */
Xiaofei Baieef15042021-11-18 07:29:56 +000067 *buf = ssl->in_msg + 4;
68 *buf_len = ssl->in_hslen - 4;
XiaokangQian6b226b02021-09-24 07:51:16 +000069
XiaokangQian6b226b02021-09-24 07:51:16 +000070cleanup:
71
72 return( ret );
73}
74
Jerry Yuf4436812021-08-26 22:59:56 +080075int mbedtls_ssl_tls13_start_handshake_msg( mbedtls_ssl_context *ssl,
Jerry Yueecfbf02021-08-30 18:32:07 +080076 unsigned hs_type,
77 unsigned char **buf,
Jerry Yu0c63af62021-09-02 12:59:12 +080078 size_t *buf_len )
Jerry Yu65dd2cc2021-08-18 16:38:40 +080079{
Jerry Yu1bc2c1f2021-09-01 12:57:29 +080080 /*
81 * Reserve 4 bytes for hanshake header. ( Section 4,RFC 8446 )
82 * ...
83 * HandshakeType msg_type;
84 * uint24 length;
85 * ...
86 */
Jerry Yuc8a392c2021-08-18 16:46:28 +080087 *buf = ssl->out_msg + 4;
Jerry Yu0c63af62021-09-02 12:59:12 +080088 *buf_len = MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
Jerry Yuc8a392c2021-08-18 16:46:28 +080089
90 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
91 ssl->out_msg[0] = hs_type;
92
93 return( 0 );
Jerry Yu65dd2cc2021-08-18 16:38:40 +080094}
95
Jerry Yuf4436812021-08-26 22:59:56 +080096int mbedtls_ssl_tls13_finish_handshake_msg( mbedtls_ssl_context *ssl,
Jerry Yueecfbf02021-08-30 18:32:07 +080097 size_t buf_len,
98 size_t msg_len )
Jerry Yu65dd2cc2021-08-18 16:38:40 +080099{
Jerry Yuc8a392c2021-08-18 16:46:28 +0800100 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Xiaofei Baieef15042021-11-18 07:29:56 +0000101 size_t msg_with_header_len;
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800102 ((void) buf_len);
Jerry Yuc8a392c2021-08-18 16:46:28 +0800103
Jerry Yu1bc2c1f2021-09-01 12:57:29 +0800104 /* Add reserved 4 bytes for handshake header */
Xiaofei Baieef15042021-11-18 07:29:56 +0000105 msg_with_header_len = msg_len + 4;
106 ssl->out_msglen = msg_with_header_len;
Ronald Cron66dbf912022-02-02 15:33:46 +0100107 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_write_handshake_msg_ext( ssl, 0, 0 ) );
Jerry Yuc8a392c2021-08-18 16:46:28 +0800108
109cleanup:
110 return( ret );
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800111}
112
Xiaofei Bai746f9482021-11-12 08:53:56 +0000113void mbedtls_ssl_tls13_add_hs_msg_to_checksum( mbedtls_ssl_context *ssl,
114 unsigned hs_type,
115 unsigned char const *msg,
116 size_t msg_len )
Jerry Yu7bea4ba2021-09-09 15:06:18 +0800117{
118 mbedtls_ssl_tls13_add_hs_hdr_to_checksum( ssl, hs_type, msg_len );
119 ssl->handshake->update_checksum( ssl, msg, msg_len );
120}
121
Jerry Yuf4436812021-08-26 22:59:56 +0800122void mbedtls_ssl_tls13_add_hs_hdr_to_checksum( mbedtls_ssl_context *ssl,
Jerry Yueecfbf02021-08-30 18:32:07 +0800123 unsigned hs_type,
124 size_t total_hs_len )
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800125{
126 unsigned char hs_hdr[4];
127
128 /* Build HS header for checksum update. */
Jerry Yu2ac64192021-08-26 18:38:58 +0800129 hs_hdr[0] = MBEDTLS_BYTE_0( hs_type );
130 hs_hdr[1] = MBEDTLS_BYTE_2( total_hs_len );
131 hs_hdr[2] = MBEDTLS_BYTE_1( total_hs_len );
132 hs_hdr[3] = MBEDTLS_BYTE_0( total_hs_len );
Jerry Yu65dd2cc2021-08-18 16:38:40 +0800133
134 ssl->handshake->update_checksum( ssl, hs_hdr, sizeof( hs_hdr ) );
135}
136
Jerry Yubc20bdd2021-08-24 15:59:48 +0800137#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000138/* mbedtls_ssl_tls13_parse_sig_alg_ext()
139 *
140 * enum {
141 * ....
142 * ecdsa_secp256r1_sha256( 0x0403 ),
143 * ecdsa_secp384r1_sha384( 0x0503 ),
144 * ecdsa_secp521r1_sha512( 0x0603 ),
145 * ....
146 * } SignatureScheme;
147 *
148 * struct {
149 * SignatureScheme supported_signature_algorithms<2..2^16-2>;
150 * } SignatureSchemeList;
151 */
152int mbedtls_ssl_tls13_parse_sig_alg_ext( mbedtls_ssl_context *ssl,
153 const unsigned char *buf,
154 const unsigned char *end )
155{
156 const unsigned char *p = buf;
Xiaofei Baif5b4d252022-01-28 06:37:15 +0000157 size_t supported_sig_algs_len = 0;
158 const unsigned char *supported_sig_algs_end;
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +0000159 uint16_t sig_alg;
Xiaofei Baic234ecf2022-02-08 09:59:23 +0000160 uint32_t common_idx = 0;
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000161
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000162 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
Xiaofei Baif5b4d252022-01-28 06:37:15 +0000163 supported_sig_algs_len = MBEDTLS_GET_UINT16_BE( p, 0 );
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000164 p += 2;
165
Xiaofei Baif5b4d252022-01-28 06:37:15 +0000166 memset( ssl->handshake->received_sig_algs, 0,
Xiaofei Bai51f515a2022-02-08 07:28:04 +0000167 sizeof(ssl->handshake->received_sig_algs) );
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000168
Xiaofei Baif5b4d252022-01-28 06:37:15 +0000169 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, supported_sig_algs_len );
170 supported_sig_algs_end = p + supported_sig_algs_len;
Xiaofei Bai51f515a2022-02-08 07:28:04 +0000171 while( p < supported_sig_algs_end )
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000172 {
Xiaofei Baif5b4d252022-01-28 06:37:15 +0000173 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, supported_sig_algs_end, 2 );
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +0000174 sig_alg = MBEDTLS_GET_UINT16_BE( p, 0 );
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000175 p += 2;
176
177 MBEDTLS_SSL_DEBUG_MSG( 4, ( "received signature algorithm: 0x%x",
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +0000178 sig_alg ) );
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000179
Xiaofei Bai51f515a2022-02-08 07:28:04 +0000180 if( ! mbedtls_ssl_sig_alg_is_offered( ssl, sig_alg ) ||
181 ! mbedtls_ssl_sig_alg_is_supported( ssl, sig_alg ) )
182 continue;
183
184 if( common_idx + 1 < MBEDTLS_RECEIVED_SIG_ALGS_SIZE )
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000185 {
Xiaofei Baif5b4d252022-01-28 06:37:15 +0000186 ssl->handshake->received_sig_algs[common_idx] = sig_alg;
Xiaofei Bai82f0a9a2022-01-26 09:21:54 +0000187 common_idx += 1;
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000188 }
189 }
190 /* Check that we consumed all the message. */
191 if( p != end )
192 {
193 MBEDTLS_SSL_DEBUG_MSG( 1,
194 ( "Signature algorithms extension length misaligned" ) );
195 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
196 MBEDTLS_ERR_SSL_DECODE_ERROR );
197 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
198 }
199
200 if( common_idx == 0 )
201 {
202 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no signature algorithm in common" ) );
203 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
204 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
205 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
206 }
207
Xiaofei Baif5b4d252022-01-28 06:37:15 +0000208 ssl->handshake->received_sig_algs[common_idx] = MBEDTLS_TLS1_3_SIG_NONE;
Xiaofei Bai69fcd392022-01-20 08:25:00 +0000209 return( 0 );
210}
211
Jerry Yu30b071c2021-09-12 20:16:03 +0800212/*
Jerry Yu30b071c2021-09-12 20:16:03 +0800213 * STATE HANDLING: Read CertificateVerify
214 */
Jerry Yud0fc5852021-10-29 11:09:06 +0800215/* Macro to express the maximum length of the verify structure.
Jerry Yu30b071c2021-09-12 20:16:03 +0800216 *
217 * The structure is computed per TLS 1.3 specification as:
218 * - 64 bytes of octet 32,
219 * - 33 bytes for the context string
220 * (which is either "TLS 1.3, client CertificateVerify"
221 * or "TLS 1.3, server CertificateVerify"),
Jerry Yud0fc5852021-10-29 11:09:06 +0800222 * - 1 byte for the octet 0x0, which serves as a separator,
Jerry Yu30b071c2021-09-12 20:16:03 +0800223 * - 32 or 48 bytes for the Transcript-Hash(Handshake Context, Certificate)
224 * (depending on the size of the transcript_hash)
225 *
226 * This results in a total size of
227 * - 130 bytes for a SHA256-based transcript hash, or
228 * (64 + 33 + 1 + 32 bytes)
229 * - 146 bytes for a SHA384-based transcript hash.
230 * (64 + 33 + 1 + 48 bytes)
231 *
232 */
Jerry Yu26c2d112021-10-25 12:42:58 +0800233#define SSL_VERIFY_STRUCT_MAX_SIZE ( 64 + \
234 33 + \
235 1 + \
236 MBEDTLS_TLS1_3_MD_MAX_SIZE \
Jerry Yu30b071c2021-09-12 20:16:03 +0800237 )
Jerry Yu30b071c2021-09-12 20:16:03 +0800238
Jerry Yu0b32c502021-10-28 13:41:59 +0800239/*
240 * The ssl_tls13_create_verify_structure() creates the verify structure.
241 * As input, it requires the transcript hash.
242 *
243 * The caller has to ensure that the buffer has size at least
244 * SSL_VERIFY_STRUCT_MAX_SIZE bytes.
245 */
Jerry Yud0fc5852021-10-29 11:09:06 +0800246static void ssl_tls13_create_verify_structure( const unsigned char *transcript_hash,
Jerry Yu0b32c502021-10-28 13:41:59 +0800247 size_t transcript_hash_len,
248 unsigned char *verify_buffer,
249 size_t *verify_buffer_len,
250 int from )
251{
252 size_t idx;
Jerry Yu30b071c2021-09-12 20:16:03 +0800253
Jerry Yu0b32c502021-10-28 13:41:59 +0800254 /* RFC 8446, Section 4.4.3:
255 *
256 * The digital signature [in the CertificateVerify message] is then
257 * computed over the concatenation of:
258 * - A string that consists of octet 32 (0x20) repeated 64 times
259 * - The context string
260 * - A single 0 byte which serves as the separator
261 * - The content to be signed
262 */
263 memset( verify_buffer, 0x20, 64 );
264 idx = 64;
265
266 if( from == MBEDTLS_SSL_IS_CLIENT )
267 {
268 memcpy( verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( client_cv ) );
269 idx += MBEDTLS_SSL_TLS1_3_LBL_LEN( client_cv );
270 }
271 else
272 { /* from == MBEDTLS_SSL_IS_SERVER */
273 memcpy( verify_buffer + idx, MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN( server_cv ) );
274 idx += MBEDTLS_SSL_TLS1_3_LBL_LEN( server_cv );
275 }
276
277 verify_buffer[idx++] = 0x0;
278
279 memcpy( verify_buffer + idx, transcript_hash, transcript_hash_len );
280 idx += transcript_hash_len;
281
282 *verify_buffer_len = idx;
283}
284
Jerry Yu0b32c502021-10-28 13:41:59 +0800285static int ssl_tls13_parse_certificate_verify( mbedtls_ssl_context *ssl,
Jerry Yud0fc5852021-10-29 11:09:06 +0800286 const unsigned char *buf,
287 const unsigned char *end,
288 const unsigned char *verify_buffer,
289 size_t verify_buffer_len )
Jerry Yu30b071c2021-09-12 20:16:03 +0800290{
291 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
292 const unsigned char *p = buf;
293 uint16_t algorithm;
Jerry Yu30b071c2021-09-12 20:16:03 +0800294 size_t signature_len;
295 mbedtls_pk_type_t sig_alg;
296 mbedtls_md_type_t md_alg;
Jerry Yud0fc5852021-10-29 11:09:06 +0800297 unsigned char verify_hash[MBEDTLS_MD_MAX_SIZE];
Jerry Yu30b071c2021-09-12 20:16:03 +0800298 size_t verify_hash_len;
299
Xiaofei Baid25fab62021-12-02 06:36:27 +0000300 void const *options = NULL;
XiaokangQian82d34cc2021-11-03 08:51:56 +0000301#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
Xiaofei Baid25fab62021-12-02 06:36:27 +0000302 mbedtls_pk_rsassa_pss_options rsassa_pss_options;
XiaokangQian82d34cc2021-11-03 08:51:56 +0000303#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
304
Jerry Yu30b071c2021-09-12 20:16:03 +0800305 /*
306 * struct {
307 * SignatureScheme algorithm;
308 * opaque signature<0..2^16-1>;
309 * } CertificateVerify;
310 */
311 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
312 algorithm = MBEDTLS_GET_UINT16_BE( p, 0 );
313 p += 2;
314
315 /* RFC 8446 section 4.4.3
316 *
317 * If the CertificateVerify message is sent by a server, the signature algorithm
318 * MUST be one offered in the client's "signature_algorithms" extension unless
319 * no valid certificate chain can be produced without unsupported algorithms
320 *
321 * RFC 8446 section 4.4.2.2
322 *
323 * If the client cannot construct an acceptable chain using the provided
324 * certificates and decides to abort the handshake, then it MUST abort the handshake
325 * with an appropriate certificate-related alert (by default, "unsupported_certificate").
326 *
Jerry Yu6f87f252021-10-29 20:12:51 +0800327 * Check if algorithm is an offered signature algorithm.
Jerry Yu30b071c2021-09-12 20:16:03 +0800328 */
Jerry Yu24811fb2022-01-19 18:02:15 +0800329 if( ! mbedtls_ssl_sig_alg_is_offered( ssl, algorithm ) )
Jerry Yu30b071c2021-09-12 20:16:03 +0800330 {
Jerry Yu982d9e52021-10-14 15:59:37 +0800331 /* algorithm not in offered signature algorithms list */
332 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Received signature algorithm(%04x) is not "
333 "offered.",
334 ( unsigned int ) algorithm ) );
Jerry Yu6f87f252021-10-29 20:12:51 +0800335 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800336 }
337
338 /* We currently only support ECDSA-based signatures */
Jerry Yu8c338862022-03-23 13:34:04 +0800339 if( mbedtls_ssl_tls13_get_pk_type_and_md_alg_from_sig_alg(
340 algorithm, &sig_alg, &md_alg ) == 0 )
Jerry Yu30b071c2021-09-12 20:16:03 +0800341 {
Jerry Yu8c338862022-03-23 13:34:04 +0800342 /* algorithm not in offered signature algorithms list */
343 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Get pk type and md algorithm from "
344 "signature algorithm(%04x) fail.",
345 ( unsigned int ) algorithm ) );
346 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800347 }
348
349 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate Verify: Signature algorithm ( %04x )",
350 ( unsigned int ) algorithm ) );
351
352 /*
353 * Check the certificate's key type matches the signature alg
354 */
355 if( !mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, sig_alg ) )
356 {
357 MBEDTLS_SSL_DEBUG_MSG( 1, ( "signature algorithm doesn't match cert key" ) );
Jerry Yu6f87f252021-10-29 20:12:51 +0800358 goto error;
Jerry Yu30b071c2021-09-12 20:16:03 +0800359 }
360
361 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
362 signature_len = MBEDTLS_GET_UINT16_BE( p, 0 );
363 p += 2;
364 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, signature_len );
365
366 /* Hash verify buffer with indicated hash function */
367 switch( md_alg )
368 {
369#if defined(MBEDTLS_SHA256_C)
370 case MBEDTLS_MD_SHA256:
371 verify_hash_len = 32;
Jerry Yu133690c2021-10-25 14:01:13 +0800372 ret = mbedtls_sha256( verify_buffer, verify_buffer_len, verify_hash, 0 );
Jerry Yu30b071c2021-09-12 20:16:03 +0800373 break;
374#endif /* MBEDTLS_SHA256_C */
375
376#if defined(MBEDTLS_SHA384_C)
377 case MBEDTLS_MD_SHA384:
378 verify_hash_len = 48;
Jerry Yu133690c2021-10-25 14:01:13 +0800379 ret = mbedtls_sha512( verify_buffer, verify_buffer_len, verify_hash, 1 );
Jerry Yu30b071c2021-09-12 20:16:03 +0800380 break;
381#endif /* MBEDTLS_SHA384_C */
382
383#if defined(MBEDTLS_SHA512_C)
384 case MBEDTLS_MD_SHA512:
385 verify_hash_len = 64;
Jerry Yu133690c2021-10-25 14:01:13 +0800386 ret = mbedtls_sha512( verify_buffer, verify_buffer_len, verify_hash, 0 );
Jerry Yu30b071c2021-09-12 20:16:03 +0800387 break;
388#endif /* MBEDTLS_SHA512_C */
389
Jerry Yu0b32c502021-10-28 13:41:59 +0800390 default:
391 ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
392 break;
Jerry Yu30b071c2021-09-12 20:16:03 +0800393 }
394
Jerry Yu133690c2021-10-25 14:01:13 +0800395 if( ret != 0 )
396 {
397 MBEDTLS_SSL_DEBUG_RET( 1, "hash computation error", ret );
Jerry Yu6f87f252021-10-29 20:12:51 +0800398 goto error;
Jerry Yu133690c2021-10-25 14:01:13 +0800399 }
400
Jerry Yu30b071c2021-09-12 20:16:03 +0800401 MBEDTLS_SSL_DEBUG_BUF( 3, "verify hash", verify_hash, verify_hash_len );
XiaokangQian82d34cc2021-11-03 08:51:56 +0000402#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
403 if( sig_alg == MBEDTLS_PK_RSASSA_PSS )
404 {
405 const mbedtls_md_info_t* md_info;
Xiaofei Baid25fab62021-12-02 06:36:27 +0000406 rsassa_pss_options.mgf1_hash_id = md_alg;
XiaokangQian82d34cc2021-11-03 08:51:56 +0000407 if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL )
408 {
409 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
410 }
Xiaofei Baid25fab62021-12-02 06:36:27 +0000411 rsassa_pss_options.expected_salt_len = mbedtls_md_get_size( md_info );
412 options = (const void*) &rsassa_pss_options;
XiaokangQian82d34cc2021-11-03 08:51:56 +0000413 }
414#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
Jerry Yu30b071c2021-09-12 20:16:03 +0800415
Xiaofei Baid25fab62021-12-02 06:36:27 +0000416 if( ( ret = mbedtls_pk_verify_ext( sig_alg, options,
Jerry Yu30b071c2021-09-12 20:16:03 +0800417 &ssl->session_negotiate->peer_cert->pk,
418 md_alg, verify_hash, verify_hash_len,
Jerry Yu6f87f252021-10-29 20:12:51 +0800419 p, signature_len ) ) == 0 )
Jerry Yu30b071c2021-09-12 20:16:03 +0800420 {
Jerry Yu6f87f252021-10-29 20:12:51 +0800421 return( 0 );
Jerry Yu30b071c2021-09-12 20:16:03 +0800422 }
Jerry Yu6f87f252021-10-29 20:12:51 +0800423 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify_ext", ret );
Jerry Yu30b071c2021-09-12 20:16:03 +0800424
Jerry Yu6f87f252021-10-29 20:12:51 +0800425error:
426 /* RFC 8446 section 4.4.3
427 *
428 * If the verification fails, the receiver MUST terminate the handshake
429 * with a "decrypt_error" alert.
430 */
431 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
432 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
433 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
434
Jerry Yu30b071c2021-09-12 20:16:03 +0800435}
436#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
437
438int mbedtls_ssl_tls13_process_certificate_verify( mbedtls_ssl_context *ssl )
439{
Jerry Yu30b071c2021-09-12 20:16:03 +0800440
Jerry Yuda8cdf22021-10-25 15:06:49 +0800441#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
442 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
443 unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
444 size_t verify_buffer_len;
445 unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
446 size_t transcript_len;
447 unsigned char *buf;
448 size_t buf_len;
449
Jerry Yu30b071c2021-09-12 20:16:03 +0800450 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
451
Jerry Yuda8cdf22021-10-25 15:06:49 +0800452 MBEDTLS_SSL_PROC_CHK(
Xiaofei Bai746f9482021-11-12 08:53:56 +0000453 mbedtls_ssl_tls13_fetch_handshake_msg( ssl,
Jerry Yuda8cdf22021-10-25 15:06:49 +0800454 MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, &buf, &buf_len ) );
Jerry Yu30b071c2021-09-12 20:16:03 +0800455
Jerry Yuda8cdf22021-10-25 15:06:49 +0800456 /* Need to calculate the hash of the transcript first
Jerry Yu0b32c502021-10-28 13:41:59 +0800457 * before reading the message since otherwise it gets
458 * included in the transcript
459 */
Jerry Yuda8cdf22021-10-25 15:06:49 +0800460 ret = mbedtls_ssl_get_handshake_transcript( ssl,
461 ssl->handshake->ciphersuite_info->mac,
462 transcript, sizeof( transcript ),
463 &transcript_len );
464 if( ret != 0 )
Jerry Yu30b071c2021-09-12 20:16:03 +0800465 {
Jerry Yuda8cdf22021-10-25 15:06:49 +0800466 MBEDTLS_SSL_PEND_FATAL_ALERT(
467 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
468 MBEDTLS_ERR_SSL_INTERNAL_ERROR );
469 return( ret );
Jerry Yu30b071c2021-09-12 20:16:03 +0800470 }
471
Jerry Yuda8cdf22021-10-25 15:06:49 +0800472 MBEDTLS_SSL_DEBUG_BUF( 3, "handshake hash", transcript, transcript_len );
473
474 /* Create verify structure */
475 ssl_tls13_create_verify_structure( transcript,
Jerry Yu0b32c502021-10-28 13:41:59 +0800476 transcript_len,
477 verify_buffer,
478 &verify_buffer_len,
479 ( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ?
480 MBEDTLS_SSL_IS_SERVER :
481 MBEDTLS_SSL_IS_CLIENT );
Jerry Yuda8cdf22021-10-25 15:06:49 +0800482
483 /* Process the message contents */
Jerry Yu0b32c502021-10-28 13:41:59 +0800484 MBEDTLS_SSL_PROC_CHK( ssl_tls13_parse_certificate_verify( ssl, buf,
485 buf + buf_len, verify_buffer, verify_buffer_len ) );
Jerry Yuda8cdf22021-10-25 15:06:49 +0800486
Xiaofei Bai746f9482021-11-12 08:53:56 +0000487 mbedtls_ssl_tls13_add_hs_msg_to_checksum( ssl,
Jerry Yuda8cdf22021-10-25 15:06:49 +0800488 MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, buf, buf_len );
Jerry Yu30b071c2021-09-12 20:16:03 +0800489
490cleanup:
491
492 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
Jerry Yu5398c102021-11-05 13:32:38 +0800493 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_process_certificate_verify", ret );
Jerry Yu30b071c2021-09-12 20:16:03 +0800494 return( ret );
Jerry Yuda8cdf22021-10-25 15:06:49 +0800495#else
496 ((void) ssl);
497 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
498 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
499#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Jerry Yu30b071c2021-09-12 20:16:03 +0800500}
501
502/*
Xiaofei Bai947571e2021-09-29 09:12:03 +0000503 *
504 * STATE HANDLING: Incoming Certificate, client-side only currently.
505 *
506 */
507
508/*
Xiaofei Bai947571e2021-09-29 09:12:03 +0000509 * Implementation
510 */
511
Xiaofei Bai947571e2021-09-29 09:12:03 +0000512#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
513#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
514/*
515 * Structure of Certificate message:
516 *
517 * enum {
518 * X509(0),
519 * RawPublicKey(2),
520 * (255)
521 * } CertificateType;
522 *
523 * struct {
524 * select (certificate_type) {
525 * case RawPublicKey:
526 * * From RFC 7250 ASN.1_subjectPublicKeyInfo *
527 * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
528 * case X509:
529 * opaque cert_data<1..2^24-1>;
530 * };
531 * Extension extensions<0..2^16-1>;
532 * } CertificateEntry;
533 *
534 * struct {
535 * opaque certificate_request_context<0..2^8-1>;
536 * CertificateEntry certificate_list<0..2^24-1>;
537 * } Certificate;
538 *
539 */
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000540
541/* Parse certificate chain send by the server. */
Xiaofei Bai947571e2021-09-29 09:12:03 +0000542static int ssl_tls13_parse_certificate( mbedtls_ssl_context *ssl,
543 const unsigned char *buf,
544 const unsigned char *end )
545{
546 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
547 size_t certificate_request_context_len = 0;
548 size_t certificate_list_len = 0;
549 const unsigned char *p = buf;
550 const unsigned char *certificate_list_end;
551
552 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 4 );
553 certificate_request_context_len = p[0];
Jerry Yub640bf62021-10-29 10:05:32 +0800554 certificate_list_len = MBEDTLS_GET_UINT24_BE( p, 1 );
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000555 p += 4;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000556
557 /* In theory, the certificate list can be up to 2^24 Bytes, but we don't
558 * support anything beyond 2^16 = 64K.
559 */
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000560 if( ( certificate_request_context_len != 0 ) ||
561 ( certificate_list_len >= 0x10000 ) )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000562 {
563 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
564 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
565 MBEDTLS_ERR_SSL_DECODE_ERROR );
566 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
567 }
568
569 /* In case we tried to reuse a session but it failed */
570 if( ssl->session_negotiate->peer_cert != NULL )
571 {
572 mbedtls_x509_crt_free( ssl->session_negotiate->peer_cert );
573 mbedtls_free( ssl->session_negotiate->peer_cert );
574 }
575
576 if( ( ssl->session_negotiate->peer_cert =
577 mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) ) ) == NULL )
578 {
579 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc( %" MBEDTLS_PRINTF_SIZET " bytes ) failed",
580 sizeof( mbedtls_x509_crt ) ) );
581 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
582 MBEDTLS_ERR_SSL_ALLOC_FAILED );
583 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
584 }
585
586 mbedtls_x509_crt_init( ssl->session_negotiate->peer_cert );
587
Xiaofei Bai947571e2021-09-29 09:12:03 +0000588 certificate_list_end = p + certificate_list_len;
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000589 while( p < certificate_list_end )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000590 {
591 size_t cert_data_len, extensions_len;
592
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000593 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, certificate_list_end, 3 );
Xiaofei Baif93cbd22021-10-29 02:39:30 +0000594 cert_data_len = MBEDTLS_GET_UINT24_BE( p, 0 );
Xiaofei Bai947571e2021-09-29 09:12:03 +0000595 p += 3;
596
597 /* In theory, the CRT can be up to 2^24 Bytes, but we don't support
598 * anything beyond 2^16 = 64K. Otherwise as in the TLS 1.2 code,
599 * check that we have a minimum of 128 bytes of data, this is not
600 * clear why we need that though.
601 */
602 if( ( cert_data_len < 128 ) || ( cert_data_len >= 0x10000 ) )
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000603 {
Xiaofei Bai947571e2021-09-29 09:12:03 +0000604 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad Certificate message" ) );
605 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
606 MBEDTLS_ERR_SSL_DECODE_ERROR );
607 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
608 }
609
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000610 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, certificate_list_end, cert_data_len );
Xiaofei Bai947571e2021-09-29 09:12:03 +0000611 ret = mbedtls_x509_crt_parse_der( ssl->session_negotiate->peer_cert,
612 p, cert_data_len );
613
614 switch( ret )
615 {
616 case 0: /*ok*/
617 break;
618 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
619 /* Ignore certificate with an unknown algorithm: maybe a
620 prior certificate was already trusted. */
621 break;
622
623 case MBEDTLS_ERR_X509_ALLOC_FAILED:
624 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
625 MBEDTLS_ERR_X509_ALLOC_FAILED );
626 MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret );
627 return( ret );
628
629 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
630 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT,
631 MBEDTLS_ERR_X509_UNKNOWN_VERSION );
632 MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret );
633 return( ret );
634
635 default:
636 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_BAD_CERT,
637 ret );
638 MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret );
639 return( ret );
640 }
641
642 p += cert_data_len;
643
644 /* Certificate extensions length */
645 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, certificate_list_end, 2 );
646 extensions_len = MBEDTLS_GET_UINT16_BE( p, 0 );
647 p += 2;
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000648 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, certificate_list_end, extensions_len );
Xiaofei Bai947571e2021-09-29 09:12:03 +0000649 p += extensions_len;
650 }
651
652 /* Check that all the message is consumed. */
653 if( p != end )
654 {
655 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad Certificate message" ) );
656 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR, \
657 MBEDTLS_ERR_SSL_DECODE_ERROR );
658 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
659 }
660
661 MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
662
663 return( ret );
664}
665#else
666static int ssl_tls13_parse_certificate( mbedtls_ssl_context *ssl,
667 const unsigned char *buf,
668 const unsigned char *end )
669{
670 ((void) ssl);
671 ((void) buf);
672 ((void) end);
673 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
674}
675#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
676#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
677
678#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
679#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000680/* Validate certificate chain sent by the server. */
Xiaofei Bai947571e2021-09-29 09:12:03 +0000681static int ssl_tls13_validate_certificate( mbedtls_ssl_context *ssl )
682{
683 int ret = 0;
684 mbedtls_x509_crt *ca_chain;
685 mbedtls_x509_crl *ca_crl;
Xiaofei Baiff456022021-10-28 06:50:17 +0000686 uint32_t verify_result = 0;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000687
688#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
689 if( ssl->handshake->sni_ca_chain != NULL )
690 {
691 ca_chain = ssl->handshake->sni_ca_chain;
692 ca_crl = ssl->handshake->sni_ca_crl;
693 }
694 else
695#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
696 {
697 ca_chain = ssl->conf->ca_chain;
698 ca_crl = ssl->conf->ca_crl;
699 }
700
701 /*
702 * Main check: verify certificate
703 */
704 ret = mbedtls_x509_crt_verify_with_profile(
705 ssl->session_negotiate->peer_cert,
706 ca_chain, ca_crl,
707 ssl->conf->cert_profile,
708 ssl->hostname,
Xiaofei Baiff456022021-10-28 06:50:17 +0000709 &verify_result,
Xiaofei Bai947571e2021-09-29 09:12:03 +0000710 ssl->conf->f_vrfy, ssl->conf->p_vrfy );
711
712 if( ret != 0 )
713 {
714 MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
715 }
716
717 /*
718 * Secondary checks: always done, but change 'ret' only if it was 0
719 */
720
721#if defined(MBEDTLS_ECP_C)
722 {
723 const mbedtls_pk_context *pk = &ssl->session_negotiate->peer_cert->pk;
724
725 /* If certificate uses an EC key, make sure the curve is OK */
726 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) &&
727 mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 )
728 {
Xiaofei Baiff456022021-10-28 06:50:17 +0000729 verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000730
731 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate ( EC key curve )" ) );
732 if( ret == 0 )
733 ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
734 }
735 }
736#endif /* MBEDTLS_ECP_C */
737
738 if( mbedtls_ssl_check_cert_usage( ssl->session_negotiate->peer_cert,
739 ssl->handshake->ciphersuite_info,
740 !ssl->conf->endpoint,
Xiaofei Baiff456022021-10-28 06:50:17 +0000741 &verify_result ) != 0 )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000742 {
743 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate ( usage extensions )" ) );
744 if( ret == 0 )
745 ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
746 }
747
748
749 if( ca_chain == NULL )
750 {
751 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
752 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
753 }
754
755 if( ret != 0 )
756 {
757 /* The certificate may have been rejected for several reasons.
758 Pick one and send the corresponding alert. Which alert to send
759 may be a subject of debate in some cases. */
Xiaofei Baiff456022021-10-28 06:50:17 +0000760 if( verify_result & MBEDTLS_X509_BADCERT_OTHER )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000761 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED, ret );
Xiaofei Baiff456022021-10-28 06:50:17 +0000762 else if( verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000763 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_BAD_CERT, ret );
Xiaofei Baif93cbd22021-10-29 02:39:30 +0000764 else if( verify_result & ( MBEDTLS_X509_BADCERT_KEY_USAGE |
765 MBEDTLS_X509_BADCERT_EXT_KEY_USAGE |
766 MBEDTLS_X509_BADCERT_NS_CERT_TYPE |
767 MBEDTLS_X509_BADCERT_BAD_PK |
768 MBEDTLS_X509_BADCERT_BAD_KEY ) )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000769 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT, ret );
Xiaofei Baiff456022021-10-28 06:50:17 +0000770 else if( verify_result & MBEDTLS_X509_BADCERT_EXPIRED )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000771 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED, ret );
Xiaofei Baiff456022021-10-28 06:50:17 +0000772 else if( verify_result & MBEDTLS_X509_BADCERT_REVOKED )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000773 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED, ret );
Xiaofei Baiff456022021-10-28 06:50:17 +0000774 else if( verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000775 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA, ret );
776 else
777 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN, ret );
778 }
779
780#if defined(MBEDTLS_DEBUG_C)
Xiaofei Baiff456022021-10-28 06:50:17 +0000781 if( verify_result != 0 )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000782 {
783 MBEDTLS_SSL_DEBUG_MSG( 3, ( "! Certificate verification flags %08x",
Jerry Yu83bb1312021-10-28 22:16:33 +0800784 (unsigned int) verify_result ) );
Xiaofei Bai947571e2021-09-29 09:12:03 +0000785 }
786 else
787 {
788 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate verification flags clear" ) );
789 }
790#endif /* MBEDTLS_DEBUG_C */
791
Xiaofei Baiff456022021-10-28 06:50:17 +0000792 ssl->session_negotiate->verify_result = verify_result;
Xiaofei Bai947571e2021-09-29 09:12:03 +0000793 return( ret );
794}
795#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
796static int ssl_tls13_validate_certificate( mbedtls_ssl_context *ssl )
797{
798 ((void) ssl);
799 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
800}
801#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
802#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
803
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000804int mbedtls_ssl_tls13_process_certificate( mbedtls_ssl_context *ssl )
Xiaofei Bai947571e2021-09-29 09:12:03 +0000805{
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000806 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
807 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
808
809#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
810 unsigned char *buf;
811 size_t buf_len;
812
Xiaofei Bai746f9482021-11-12 08:53:56 +0000813 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_fetch_handshake_msg(
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000814 ssl, MBEDTLS_SSL_HS_CERTIFICATE,
815 &buf, &buf_len ) );
816
817 /* Parse the certificate chain sent by the peer. */
818 MBEDTLS_SSL_PROC_CHK( ssl_tls13_parse_certificate( ssl, buf, buf + buf_len ) );
819 /* Validate the certificate chain and set the verification results. */
820 MBEDTLS_SSL_PROC_CHK( ssl_tls13_validate_certificate( ssl ) );
821
Xiaofei Bai746f9482021-11-12 08:53:56 +0000822 mbedtls_ssl_tls13_add_hs_msg_to_checksum( ssl, MBEDTLS_SSL_HS_CERTIFICATE,
823 buf, buf_len );
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000824
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000825cleanup:
826
827 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
Xiaofei Bai10aeec02021-10-26 09:50:08 +0000828#else
829 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
830 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
831#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Xiaofei Bai79595ac2021-10-26 07:16:45 +0000832 return( ret );
Xiaofei Bai947571e2021-09-29 09:12:03 +0000833}
Jerry Yu90f152d2022-01-29 22:12:42 +0800834#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yu7399d0d2022-01-30 17:54:19 +0800835/*
836 * enum {
837 * X509(0),
838 * RawPublicKey(2),
839 * (255)
840 * } CertificateType;
841 *
842 * struct {
843 * select (certificate_type) {
844 * case RawPublicKey:
845 * // From RFC 7250 ASN.1_subjectPublicKeyInfo
846 * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
847 *
848 * case X509:
849 * opaque cert_data<1..2^24-1>;
850 * };
851 * Extension extensions<0..2^16-1>;
852 * } CertificateEntry;
853 *
854 * struct {
855 * opaque certificate_request_context<0..2^8-1>;
856 * CertificateEntry certificate_list<0..2^24-1>;
857 * } Certificate;
858 */
859static int ssl_tls13_write_certificate_body( mbedtls_ssl_context *ssl,
Jerry Yu3e536442022-02-15 11:05:59 +0800860 unsigned char *buf,
Jerry Yu7399d0d2022-01-30 17:54:19 +0800861 unsigned char *end,
Jerry Yu3e536442022-02-15 11:05:59 +0800862 size_t *out_len )
Jerry Yu5cc35062022-01-28 16:16:08 +0800863{
Jerry Yu5cc35062022-01-28 16:16:08 +0800864 const mbedtls_x509_crt *crt = mbedtls_ssl_own_cert( ssl );
Jerry Yu3e536442022-02-15 11:05:59 +0800865 unsigned char *p = buf;
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800866 unsigned char *certificate_request_context =
867 ssl->handshake->certificate_request_context;
868 unsigned char certificate_request_context_len =
869 ssl->handshake->certificate_request_context_len;
870 unsigned char *p_certificate_list_len;
Jerry Yu5cc35062022-01-28 16:16:08 +0800871
Jerry Yu5cc35062022-01-28 16:16:08 +0800872
Jerry Yu3391ac02022-02-16 11:21:37 +0800873 /* ...
874 * opaque certificate_request_context<0..2^8-1>;
875 * ...
876 */
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800877 MBEDTLS_SSL_CHK_BUF_PTR( p, end, certificate_request_context_len + 1 );
878 *p++ = certificate_request_context_len;
879 if( certificate_request_context_len > 0 )
Jerry Yu537530d2022-02-15 14:00:57 +0800880 {
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800881 memcpy( p, certificate_request_context, certificate_request_context_len );
882 p += certificate_request_context_len;
Jerry Yu537530d2022-02-15 14:00:57 +0800883 }
884
Jerry Yu3391ac02022-02-16 11:21:37 +0800885 /* ...
886 * CertificateEntry certificate_list<0..2^24-1>;
887 * ...
888 */
Jerry Yu3e536442022-02-15 11:05:59 +0800889 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 3 );
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800890 p_certificate_list_len = p;
Jerry Yu3e536442022-02-15 11:05:59 +0800891 p += 3;
892
Jerry Yu7399d0d2022-01-30 17:54:19 +0800893 MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", crt );
Jerry Yu5cc35062022-01-28 16:16:08 +0800894
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800895 while( crt != NULL )
Jerry Yu5cc35062022-01-28 16:16:08 +0800896 {
Jerry Yu7399d0d2022-01-30 17:54:19 +0800897 size_t cert_data_len = crt->raw.len;
Jerry Yu5cc35062022-01-28 16:16:08 +0800898
Jerry Yu7399d0d2022-01-30 17:54:19 +0800899 MBEDTLS_SSL_CHK_BUF_PTR( p, end, cert_data_len + 3 + 2 );
900 MBEDTLS_PUT_UINT24_BE( cert_data_len, p, 0 );
901 p += 3;
Jerry Yu5cc35062022-01-28 16:16:08 +0800902
Jerry Yu7399d0d2022-01-30 17:54:19 +0800903 memcpy( p, crt->raw.p, cert_data_len );
904 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 */
Jerry Yu7399d0d2022-01-30 17:54:19 +0800910 MBEDTLS_PUT_UINT24_BE( 0, p, 0 );
911 p += 2;
Jerry Yu5cc35062022-01-28 16:16:08 +0800912 }
Jerry Yu5cc35062022-01-28 16:16:08 +0800913
Jerry Yuc8d8d4e2022-02-18 12:10:03 +0800914 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
919 return( 0 );
920}
Jerry Yu5cc35062022-01-28 16:16:08 +0800921
Jerry Yu3e536442022-02-15 11:05:59 +0800922int mbedtls_ssl_tls13_write_certificate( mbedtls_ssl_context *ssl )
Jerry Yu5cc35062022-01-28 16:16:08 +0800923{
924 int ret;
Ronald Cron5bb8fc82022-03-09 07:00:13 +0100925 unsigned char *buf;
926 size_t buf_len, msg_len;
927
Jerry Yu5cc35062022-01-28 16:16:08 +0800928 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
929
Ronald Cron5bb8fc82022-03-09 07:00:13 +0100930 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_start_handshake_msg( ssl,
931 MBEDTLS_SSL_HS_CERTIFICATE, &buf, &buf_len ) );
Jerry Yu5cc35062022-01-28 16:16:08 +0800932
Ronald Cron5bb8fc82022-03-09 07:00:13 +0100933 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_certificate_body( ssl,
934 buf,
935 buf + buf_len,
936 &msg_len ) );
Jerry Yu5cc35062022-01-28 16:16:08 +0800937
Ronald Cron5bb8fc82022-03-09 07:00:13 +0100938 mbedtls_ssl_tls13_add_hs_msg_to_checksum( ssl,
939 MBEDTLS_SSL_HS_CERTIFICATE,
940 buf,
941 msg_len );
Jerry Yu5cc35062022-01-28 16:16:08 +0800942
Ronald Cron5bb8fc82022-03-09 07:00:13 +0100943 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_finish_handshake_msg(
944 ssl, buf_len, msg_len ) );
Jerry Yu5cc35062022-01-28 16:16:08 +0800945cleanup:
946
947 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
948 return( ret );
949}
950
Jerry Yu3e536442022-02-15 11:05:59 +0800951/*
952 * STATE HANDLING: Output Certificate Verify
953 */
Jerry Yue91a51a2022-03-22 21:42:50 +0800954static int ssl_tls13_get_sig_alg_from_pk( mbedtls_ssl_context *ssl,
955 mbedtls_pk_context *own_key,
Jerry Yu8c338862022-03-23 13:34:04 +0800956 uint16_t *algorithm )
Jerry Yu67eced02022-02-25 13:37:36 +0800957{
958 mbedtls_pk_type_t sig = mbedtls_ssl_sig_from_pk( own_key );
959 /* Determine the size of the key */
960 size_t own_key_size = mbedtls_pk_get_bitlen( own_key );
Jerry Yue91a51a2022-03-22 21:42:50 +0800961 *algorithm = MBEDTLS_TLS1_3_SIG_NONE;
Jerry Yu67eced02022-02-25 13:37:36 +0800962 ((void) own_key_size);
963
964 switch( sig )
965 {
966#if defined(MBEDTLS_ECDSA_C)
967 case MBEDTLS_SSL_SIG_ECDSA:
968 switch( own_key_size )
969 {
970 case 256:
Jerry Yue91a51a2022-03-22 21:42:50 +0800971 *algorithm = MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256;
Jerry Yue91a51a2022-03-22 21:42:50 +0800972 return( 0 );
Jerry Yu67eced02022-02-25 13:37:36 +0800973 case 384:
Jerry Yue91a51a2022-03-22 21:42:50 +0800974 *algorithm = MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384;
Jerry Yue91a51a2022-03-22 21:42:50 +0800975 return( 0 );
Jerry Yu67eced02022-02-25 13:37:36 +0800976 case 521:
Jerry Yue91a51a2022-03-22 21:42:50 +0800977 *algorithm = MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512;
Jerry Yue91a51a2022-03-22 21:42:50 +0800978 return( 0 );
Jerry Yu67eced02022-02-25 13:37:36 +0800979 default:
980 MBEDTLS_SSL_DEBUG_MSG( 3,
981 ( "unknown key size: %"
982 MBEDTLS_PRINTF_SIZET " bits",
983 own_key_size ) );
984 break;
985 }
986 break;
987#endif /* MBEDTLS_ECDSA_C */
988
Jerry Yucef3f332022-03-22 23:00:13 +0800989#if defined(MBEDTLS_RSA_C)
Jerry Yu67eced02022-02-25 13:37:36 +0800990 case MBEDTLS_SSL_SIG_RSA:
Jerry Yucef3f332022-03-22 23:00:13 +0800991#if defined(MBEDTLS_PKCS1_V21)
992#if defined(MBEDTLS_SHA256_C)
Jerry Yu67eced02022-02-25 13:37:36 +0800993 if( own_key_size <= 2048 &&
994 mbedtls_ssl_sig_alg_is_received( ssl,
995 MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256 ) )
996 {
Jerry Yue91a51a2022-03-22 21:42:50 +0800997 *algorithm = MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256;
Jerry Yue91a51a2022-03-22 21:42:50 +0800998 return( 0 );
Jerry Yu67eced02022-02-25 13:37:36 +0800999 }
Jerry Yucef3f332022-03-22 23:00:13 +08001000 else
1001#endif /* MBEDTLS_SHA256_C */
1002#if defined(MBEDTLS_SHA384_C)
1003 if( own_key_size <= 3072 &&
1004 mbedtls_ssl_sig_alg_is_received( ssl,
Jerry Yu67eced02022-02-25 13:37:36 +08001005 MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384 ) )
1006 {
Jerry Yue91a51a2022-03-22 21:42:50 +08001007 *algorithm = MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384;
Jerry Yue91a51a2022-03-22 21:42:50 +08001008 return( 0 );
Jerry Yu67eced02022-02-25 13:37:36 +08001009 }
Jerry Yucef3f332022-03-22 23:00:13 +08001010 else
1011#endif /* MBEDTLS_SHA384_C */
1012#if defined(MBEDTLS_SHA512_C)
1013 if( own_key_size <= 4096 &&
1014 mbedtls_ssl_sig_alg_is_received( ssl,
Jerry Yu67eced02022-02-25 13:37:36 +08001015 MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512 ) )
1016 {
Jerry Yue91a51a2022-03-22 21:42:50 +08001017 *algorithm = MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512;
Jerry Yue91a51a2022-03-22 21:42:50 +08001018 return( 0 );
Jerry Yu67eced02022-02-25 13:37:36 +08001019 }
Jerry Yucef3f332022-03-22 23:00:13 +08001020 else
1021#endif /* MBEDTLS_SHA512_C */
1022#endif /* MBEDTLS_PKCS1_V21 */
1023#if defined(MBEDTLS_PKCS1_V15)
1024#if defined(MBEDTLS_SHA256_C)
1025 if( own_key_size <= 2048 &&
1026 mbedtls_ssl_sig_alg_is_received( ssl,
1027 MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256 ) )
1028 {
1029 *algorithm = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256;
Jerry Yucef3f332022-03-22 23:00:13 +08001030 return( 0 );
1031 }
1032 else
1033#endif /* MBEDTLS_SHA256_C */
1034#if defined(MBEDTLS_SHA384_C)
1035 if( own_key_size <= 3072 &&
1036 mbedtls_ssl_sig_alg_is_received( ssl,
1037 MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384 ) )
1038 {
1039 *algorithm = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384;
Jerry Yucef3f332022-03-22 23:00:13 +08001040 return( 0 );
1041 }
1042 else
1043#endif /* MBEDTLS_SHA384_C */
1044#if defined(MBEDTLS_SHA512_C)
1045 if( own_key_size <= 4096 &&
1046 mbedtls_ssl_sig_alg_is_received( ssl,
1047 MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512 ) )
1048 {
1049 *algorithm = MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512;
Jerry Yucef3f332022-03-22 23:00:13 +08001050 return( 0 );
1051 }
1052 else
1053#endif /* MBEDTLS_SHA512_C */
1054#endif /* MBEDTLS_PKCS1_V15 */
1055 {
1056 MBEDTLS_SSL_DEBUG_MSG( 3,
1057 ( "unknown key size: %"
1058 MBEDTLS_PRINTF_SIZET " bits",
1059 own_key_size ) );
1060 }
Jerry Yu67eced02022-02-25 13:37:36 +08001061 break;
Jerry Yucef3f332022-03-22 23:00:13 +08001062#endif /* MBEDTLS_RSA_C */
Jerry Yu67eced02022-02-25 13:37:36 +08001063 default:
1064 MBEDTLS_SSL_DEBUG_MSG( 1,
1065 ( "unkown signature type : %u", sig ) );
1066 break;
1067 }
Jerry Yue91a51a2022-03-22 21:42:50 +08001068 return( -1 );
Jerry Yu67eced02022-02-25 13:37:36 +08001069}
1070
Jerry Yu3e536442022-02-15 11:05:59 +08001071static int ssl_tls13_write_certificate_verify_body( mbedtls_ssl_context *ssl,
1072 unsigned char *buf,
1073 unsigned char *end,
1074 size_t *out_len )
Jerry Yu8511f122022-01-29 10:01:04 +08001075{
1076 int ret;
Jerry Yu3e536442022-02-15 11:05:59 +08001077 unsigned char *p = buf;
Jerry Yu8511f122022-01-29 10:01:04 +08001078 mbedtls_pk_context *own_key;
Jerry Yu3e536442022-02-15 11:05:59 +08001079
Jerry Yu8511f122022-01-29 10:01:04 +08001080 unsigned char handshake_hash[ MBEDTLS_TLS1_3_MD_MAX_SIZE ];
1081 size_t handshake_hash_len;
Jerry Yu3e536442022-02-15 11:05:59 +08001082 unsigned char verify_buffer[ SSL_VERIFY_STRUCT_MAX_SIZE ];
1083 size_t verify_buffer_len;
Jerry Yu67eced02022-02-25 13:37:36 +08001084 mbedtls_pk_type_t pk_type = MBEDTLS_PK_NONE;
Jerry Yu67eced02022-02-25 13:37:36 +08001085 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
Jerry Yu78272072022-02-22 10:28:13 +08001086 uint16_t algorithm = MBEDTLS_TLS1_3_SIG_NONE;
Jerry Yu3e536442022-02-15 11:05:59 +08001087 size_t signature_len = 0;
Jerry Yu8511f122022-01-29 10:01:04 +08001088 const mbedtls_md_info_t *md_info;
Jerry Yu3391ac02022-02-16 11:21:37 +08001089 unsigned char verify_hash[ MBEDTLS_MD_MAX_SIZE ];
Jerry Yu3e536442022-02-15 11:05:59 +08001090 size_t verify_hash_len;
Jerry Yu8511f122022-01-29 10:01:04 +08001091
Jerry Yu0b7b1012022-02-23 12:23:05 +08001092 *out_len = 0;
1093
Jerry Yu3e536442022-02-15 11:05:59 +08001094 own_key = mbedtls_ssl_own_key( ssl );
1095 if( own_key == NULL )
Jerry Yu8511f122022-01-29 10:01:04 +08001096 {
Jerry Yu3e536442022-02-15 11:05:59 +08001097 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1098 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Jerry Yu8511f122022-01-29 10:01:04 +08001099 }
1100
Jerry Yu8511f122022-01-29 10:01:04 +08001101 ret = mbedtls_ssl_get_handshake_transcript( ssl,
1102 ssl->handshake->ciphersuite_info->mac,
1103 handshake_hash,
1104 sizeof( handshake_hash ),
1105 &handshake_hash_len );
1106 if( ret != 0 )
1107 return( ret );
1108
1109 MBEDTLS_SSL_DEBUG_BUF( 3, "handshake hash",
1110 handshake_hash,
1111 handshake_hash_len);
1112
Jerry Yu8511f122022-01-29 10:01:04 +08001113 ssl_tls13_create_verify_structure( handshake_hash, handshake_hash_len,
1114 verify_buffer, &verify_buffer_len,
1115 ssl->conf->endpoint );
1116
1117 /*
1118 * struct {
1119 * SignatureScheme algorithm;
1120 * opaque signature<0..2^16-1>;
1121 * } CertificateVerify;
1122 */
Jerry Yu8c338862022-03-23 13:34:04 +08001123 ret = ssl_tls13_get_sig_alg_from_pk( ssl, own_key, &algorithm );
Jerry Yue91a51a2022-03-22 21:42:50 +08001124 if( ret != 0 || ! mbedtls_ssl_sig_alg_is_received( ssl, algorithm ) )
Jerry Yu8511f122022-01-29 10:01:04 +08001125 {
Jerry Yud66409a2022-02-18 16:42:24 +08001126 MBEDTLS_SSL_DEBUG_MSG( 1,
Jerry Yu2124d052022-02-18 21:07:18 +08001127 ( "signature algorithm not in received or offered list." ) );
Jerry Yu67eced02022-02-25 13:37:36 +08001128
1129 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Signature algorithm is %s",
1130 mbedtls_ssl_sig_alg_to_str( algorithm ) ) );
1131
Jerry Yu71f36f12022-02-23 17:34:29 +08001132 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
Jerry Yud66409a2022-02-18 16:42:24 +08001133 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Jerry Yu3391ac02022-02-16 11:21:37 +08001134 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
Jerry Yu8511f122022-01-29 10:01:04 +08001135 }
1136
Jerry Yu8c338862022-03-23 13:34:04 +08001137 ret = mbedtls_ssl_tls13_get_pk_type_and_md_alg_from_sig_alg( algorithm,
1138 &pk_type,
1139 &md_alg );
1140 if( ret == 0 )
1141 {
1142 MBEDTLS_SSL_DEBUG_MSG( 1,
1143 ( "signature algorithm is not supported." ) );
1144
1145 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Signature algorithm is %s",
1146 mbedtls_ssl_sig_alg_to_str( algorithm ) ) );
1147
1148 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1149 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1150 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1151
1152 }
1153
Jerry Yu3391ac02022-02-16 11:21:37 +08001154 /* Check there is space for the algorithm identifier (2 bytes) and the
1155 * signature length (2 bytes).
1156 */
1157 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 4 );
Jerry Yu3e536442022-02-15 11:05:59 +08001158 MBEDTLS_PUT_UINT16_BE( algorithm, p, 0 );
1159 p += 2;
Jerry Yu8511f122022-01-29 10:01:04 +08001160
1161 /* Hash verify buffer with indicated hash function */
1162 md_info = mbedtls_md_info_from_type( md_alg );
1163 if( md_info == NULL )
1164 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1165
1166 ret = mbedtls_md( md_info, verify_buffer, verify_buffer_len, verify_hash );
1167 if( ret != 0 )
1168 return( ret );
1169
1170 verify_hash_len = mbedtls_md_get_size( md_info );
1171 MBEDTLS_SSL_DEBUG_BUF( 3, "verify hash", verify_hash, verify_hash_len );
1172
Jerry Yu8beb9e12022-03-12 16:23:53 +08001173 if( ( ret = mbedtls_pk_sign_ext( pk_type, own_key,
1174 md_alg, verify_hash, verify_hash_len,
Jerry Yu67eced02022-02-25 13:37:36 +08001175 p + 2, (size_t)( end - ( p + 2 ) ), &signature_len,
1176 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Jerry Yu8511f122022-01-29 10:01:04 +08001177 {
1178 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
1179 return( ret );
1180 }
Jerry Yu8511f122022-01-29 10:01:04 +08001181
Jerry Yu3e536442022-02-15 11:05:59 +08001182 MBEDTLS_PUT_UINT16_BE( signature_len, p, 0 );
1183 p += 2 + signature_len;
Jerry Yu8511f122022-01-29 10:01:04 +08001184
Jerry Yu3e536442022-02-15 11:05:59 +08001185 *out_len = (size_t)( p - buf );
1186
Jerry Yu8511f122022-01-29 10:01:04 +08001187 return( ret );
1188}
Jerry Yu8511f122022-01-29 10:01:04 +08001189
Jerry Yu3e536442022-02-15 11:05:59 +08001190int mbedtls_ssl_tls13_write_certificate_verify( mbedtls_ssl_context *ssl )
Jerry Yu8511f122022-01-29 10:01:04 +08001191{
1192 int ret = 0;
Jerry Yuca133a32022-02-15 14:22:05 +08001193 unsigned char *buf;
1194 size_t buf_len, msg_len;
1195
Jerry Yu8511f122022-01-29 10:01:04 +08001196 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1197
Jerry Yuca133a32022-02-15 14:22:05 +08001198 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_start_handshake_msg( ssl,
1199 MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, &buf, &buf_len ) );
Jerry Yu8511f122022-01-29 10:01:04 +08001200
Jerry Yuca133a32022-02-15 14:22:05 +08001201 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_certificate_verify_body(
1202 ssl, buf, buf + buf_len, &msg_len ) );
Jerry Yu8511f122022-01-29 10:01:04 +08001203
Jerry Yuca133a32022-02-15 14:22:05 +08001204 mbedtls_ssl_tls13_add_hs_msg_to_checksum(
1205 ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, buf, msg_len );
Jerry Yu8511f122022-01-29 10:01:04 +08001206
Jerry Yuca133a32022-02-15 14:22:05 +08001207 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_finish_handshake_msg(
1208 ssl, buf_len, msg_len ) );
Jerry Yu8511f122022-01-29 10:01:04 +08001209
1210cleanup:
1211
1212 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
1213 return( ret );
1214}
1215
Jerry Yu90f152d2022-01-29 22:12:42 +08001216#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
1217
Jerry Yu5cc35062022-01-28 16:16:08 +08001218/*
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001219 *
XiaokangQianc5c39d52021-11-09 11:55:10 +00001220 * STATE HANDLING: Incoming Finished message.
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001221 */
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001222/*
1223 * Implementation
1224 */
1225
XiaokangQianaaa0e192021-11-10 03:07:04 +00001226static int ssl_tls13_preprocess_finished_message( mbedtls_ssl_context *ssl )
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001227{
1228 int ret;
1229
XiaokangQianc5c39d52021-11-09 11:55:10 +00001230 ret = mbedtls_ssl_tls13_calculate_verify_data( ssl,
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001231 ssl->handshake->state_local.finished_in.digest,
1232 sizeof( ssl->handshake->state_local.finished_in.digest ),
1233 &ssl->handshake->state_local.finished_in.digest_len,
XiaokangQianc5c39d52021-11-09 11:55:10 +00001234 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ?
XiaokangQianc13f9352021-11-11 06:13:22 +00001235 MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001236 if( ret != 0 )
1237 {
XiaokangQianc5c39d52021-11-09 11:55:10 +00001238 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_calculate_verify_data", ret );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001239 return( ret );
1240 }
1241
1242 return( 0 );
1243}
1244
XiaokangQianc5c39d52021-11-09 11:55:10 +00001245static int ssl_tls13_parse_finished_message( mbedtls_ssl_context *ssl,
1246 const unsigned char *buf,
1247 const unsigned char *end )
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001248{
XiaokangQian33062842021-11-11 03:37:45 +00001249 /*
1250 * struct {
XiaokangQianc13f9352021-11-11 06:13:22 +00001251 * opaque verify_data[Hash.length];
XiaokangQian33062842021-11-11 03:37:45 +00001252 * } Finished;
1253 */
1254 const unsigned char *expected_verify_data =
1255 ssl->handshake->state_local.finished_in.digest;
1256 size_t expected_verify_data_len =
1257 ssl->handshake->state_local.finished_in.digest_len;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001258 /* Structural validation */
XiaokangQian33062842021-11-11 03:37:45 +00001259 if( (size_t)( end - buf ) != expected_verify_data_len )
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001260 {
1261 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
1262
1263 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
XiaokangQianc13f9352021-11-11 06:13:22 +00001264 MBEDTLS_ERR_SSL_DECODE_ERROR );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001265 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
1266 }
1267
XiaokangQianc5c39d52021-11-09 11:55:10 +00001268 MBEDTLS_SSL_DEBUG_BUF( 4, "verify_data (self-computed):",
XiaokangQian33062842021-11-11 03:37:45 +00001269 expected_verify_data,
1270 expected_verify_data_len );
XiaokangQianc5c39d52021-11-09 11:55:10 +00001271 MBEDTLS_SSL_DEBUG_BUF( 4, "verify_data (received message):", buf,
XiaokangQian33062842021-11-11 03:37:45 +00001272 expected_verify_data_len );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001273
1274 /* Semantic validation */
Gabor Mezei685472b2021-11-24 11:17:36 +01001275 if( mbedtls_ct_memcmp( buf,
1276 expected_verify_data,
1277 expected_verify_data_len ) != 0 )
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001278 {
1279 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
1280
XiaokangQian33062842021-11-11 03:37:45 +00001281 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
XiaokangQianc13f9352021-11-11 06:13:22 +00001282 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001283 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1284 }
1285 return( 0 );
1286}
1287
XiaokangQianc13f9352021-11-11 06:13:22 +00001288#if defined(MBEDTLS_SSL_CLI_C)
XiaokangQianaaa0e192021-11-10 03:07:04 +00001289static int ssl_tls13_postprocess_server_finished_message( mbedtls_ssl_context *ssl )
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001290{
XiaokangQian33062842021-11-11 03:37:45 +00001291 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001292 mbedtls_ssl_key_set traffic_keys;
XiaokangQian1aef02e2021-10-28 09:54:34 +00001293 mbedtls_ssl_transform *transform_application = NULL;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001294
XiaokangQian4cab0242021-10-12 08:43:37 +00001295 ret = mbedtls_ssl_tls13_key_schedule_stage_application( ssl );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001296 if( ret != 0 )
1297 {
1298 MBEDTLS_SSL_DEBUG_RET( 1,
XiaokangQian4cab0242021-10-12 08:43:37 +00001299 "mbedtls_ssl_tls13_key_schedule_stage_application", ret );
XiaokangQian61bdbbc2021-10-28 08:03:38 +00001300 goto cleanup;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001301 }
1302
XiaokangQian33062842021-11-11 03:37:45 +00001303 ret = mbedtls_ssl_tls13_generate_application_keys( ssl, &traffic_keys );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001304 if( ret != 0 )
1305 {
1306 MBEDTLS_SSL_DEBUG_RET( 1,
XiaokangQiand0aa3e92021-11-10 06:17:40 +00001307 "mbedtls_ssl_tls13_generate_application_keys", ret );
XiaokangQian61bdbbc2021-10-28 08:03:38 +00001308 goto cleanup;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001309 }
1310
1311 transform_application =
1312 mbedtls_calloc( 1, sizeof( mbedtls_ssl_transform ) );
1313 if( transform_application == NULL )
XiaokangQian61bdbbc2021-10-28 08:03:38 +00001314 {
1315 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
1316 goto cleanup;
1317 }
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001318
1319 ret = mbedtls_ssl_tls13_populate_transform(
1320 transform_application,
1321 ssl->conf->endpoint,
1322 ssl->session_negotiate->ciphersuite,
1323 &traffic_keys,
1324 ssl );
1325 if( ret != 0 )
1326 {
1327 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_tls13_populate_transform", ret );
XiaokangQian61bdbbc2021-10-28 08:03:38 +00001328 goto cleanup;
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001329 }
1330
1331 ssl->transform_application = transform_application;
1332
XiaokangQian61bdbbc2021-10-28 08:03:38 +00001333cleanup:
1334
XiaokangQian33062842021-11-11 03:37:45 +00001335 mbedtls_platform_zeroize( &traffic_keys, sizeof( traffic_keys ) );
XiaokangQianc5c39d52021-11-09 11:55:10 +00001336 if( ret != 0 )
XiaokangQian1aef02e2021-10-28 09:54:34 +00001337 {
1338 mbedtls_free( transform_application );
1339 MBEDTLS_SSL_PEND_FATAL_ALERT(
1340 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
1341 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
1342 }
XiaokangQian61bdbbc2021-10-28 08:03:38 +00001343 return( ret );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001344}
XiaokangQianc13f9352021-11-11 06:13:22 +00001345#endif /* MBEDTLS_SSL_CLI_C */
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001346
XiaokangQiancc90c942021-11-09 12:30:09 +00001347static int ssl_tls13_postprocess_finished_message( mbedtls_ssl_context *ssl )
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001348{
1349
XiaokangQianc13f9352021-11-11 06:13:22 +00001350#if defined(MBEDTLS_SSL_CLI_C)
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001351 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
1352 {
XiaokangQianaaa0e192021-11-10 03:07:04 +00001353 return( ssl_tls13_postprocess_server_finished_message( ssl ) );
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001354 }
XiaokangQianc13f9352021-11-11 06:13:22 +00001355#else
1356 ((void) ssl);
1357#endif /* MBEDTLS_SSL_CLI_C */
XiaokangQianaa5f5c12021-09-18 06:20:25 +00001358
1359 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1360}
1361
XiaokangQianc5c39d52021-11-09 11:55:10 +00001362int mbedtls_ssl_tls13_process_finished_message( mbedtls_ssl_context *ssl )
1363{
XiaokangQian33062842021-11-11 03:37:45 +00001364 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001365 unsigned char *buf;
Xiaofei Baieef15042021-11-18 07:29:56 +00001366 size_t buf_len;
XiaokangQianc5c39d52021-11-09 11:55:10 +00001367
XiaokangQiand0aa3e92021-11-10 06:17:40 +00001368 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished message" ) );
XiaokangQianc5c39d52021-11-09 11:55:10 +00001369
1370 /* Preprocessing step: Compute handshake digest */
XiaokangQianaaa0e192021-11-10 03:07:04 +00001371 MBEDTLS_SSL_PROC_CHK( ssl_tls13_preprocess_finished_message( ssl ) );
XiaokangQianc5c39d52021-11-09 11:55:10 +00001372
Xiaofei Bai746f9482021-11-12 08:53:56 +00001373 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_fetch_handshake_msg( ssl,
XiaokangQianc5c39d52021-11-09 11:55:10 +00001374 MBEDTLS_SSL_HS_FINISHED,
Xiaofei Baieef15042021-11-18 07:29:56 +00001375 &buf, &buf_len ) );
1376 MBEDTLS_SSL_PROC_CHK( ssl_tls13_parse_finished_message( ssl, buf, buf + buf_len ) );
Xiaofei Bai746f9482021-11-12 08:53:56 +00001377 mbedtls_ssl_tls13_add_hs_msg_to_checksum(
Xiaofei Baieef15042021-11-18 07:29:56 +00001378 ssl, MBEDTLS_SSL_HS_FINISHED, buf, buf_len );
XiaokangQianaaa0e192021-11-10 03:07:04 +00001379 MBEDTLS_SSL_PROC_CHK( ssl_tls13_postprocess_finished_message( ssl ) );
XiaokangQianc5c39d52021-11-09 11:55:10 +00001380
1381cleanup:
1382
XiaokangQiand0aa3e92021-11-10 06:17:40 +00001383 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished message" ) );
XiaokangQianc5c39d52021-11-09 11:55:10 +00001384 return( ret );
1385}
1386
XiaokangQian74af2a82021-09-22 07:40:30 +00001387/*
1388 *
XiaokangQiancc90c942021-11-09 12:30:09 +00001389 * STATE HANDLING: Write and send Finished message.
XiaokangQian74af2a82021-09-22 07:40:30 +00001390 *
1391 */
XiaokangQian74af2a82021-09-22 07:40:30 +00001392/*
XiaokangQian35dc6252021-11-11 08:16:19 +00001393 * Implement
XiaokangQian74af2a82021-09-22 07:40:30 +00001394 */
1395
XiaokangQian8773aa02021-11-10 07:33:09 +00001396static int ssl_tls13_prepare_finished_message( mbedtls_ssl_context *ssl )
XiaokangQian74af2a82021-09-22 07:40:30 +00001397{
1398 int ret;
1399
1400 /* Compute transcript of handshake up to now. */
XiaokangQiancc90c942021-11-09 12:30:09 +00001401 ret = mbedtls_ssl_tls13_calculate_verify_data( ssl,
XiaokangQian74af2a82021-09-22 07:40:30 +00001402 ssl->handshake->state_local.finished_out.digest,
1403 sizeof( ssl->handshake->state_local.finished_out.digest ),
1404 &ssl->handshake->state_local.finished_out.digest_len,
1405 ssl->conf->endpoint );
1406
1407 if( ret != 0 )
1408 {
Jerry Yu7ca30542021-12-08 15:57:57 +08001409 MBEDTLS_SSL_DEBUG_RET( 1, "calculate_verify_data failed", ret );
XiaokangQian74af2a82021-09-22 07:40:30 +00001410 return( ret );
1411 }
1412
1413 return( 0 );
1414}
1415
XiaokangQiancc90c942021-11-09 12:30:09 +00001416static int ssl_tls13_finalize_finished_message( mbedtls_ssl_context *ssl )
XiaokangQian74af2a82021-09-22 07:40:30 +00001417{
XiaokangQian0fa66432021-11-15 03:33:57 +00001418 // TODO: Add back resumption keys calculation after MVP.
1419 ((void) ssl);
XiaokangQian74af2a82021-09-22 07:40:30 +00001420
1421 return( 0 );
1422}
1423
XiaokangQian8773aa02021-11-10 07:33:09 +00001424static int ssl_tls13_write_finished_message_body( mbedtls_ssl_context *ssl,
XiaokangQian35dc6252021-11-11 08:16:19 +00001425 unsigned char *buf,
1426 unsigned char *end,
Xiaofei Baid25fab62021-12-02 06:36:27 +00001427 size_t *out_len )
XiaokangQian74af2a82021-09-22 07:40:30 +00001428{
XiaokangQian8773aa02021-11-10 07:33:09 +00001429 size_t verify_data_len = ssl->handshake->state_local.finished_out.digest_len;
XiaokangQian0fa66432021-11-15 03:33:57 +00001430 /*
1431 * struct {
1432 * opaque verify_data[Hash.length];
1433 * } Finished;
1434 */
XiaokangQian8773aa02021-11-10 07:33:09 +00001435 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, verify_data_len );
XiaokangQian74af2a82021-09-22 07:40:30 +00001436
1437 memcpy( buf, ssl->handshake->state_local.finished_out.digest,
XiaokangQian8773aa02021-11-10 07:33:09 +00001438 verify_data_len );
XiaokangQian74af2a82021-09-22 07:40:30 +00001439
Xiaofei Baid25fab62021-12-02 06:36:27 +00001440 *out_len = verify_data_len;
XiaokangQian74af2a82021-09-22 07:40:30 +00001441 return( 0 );
1442}
XiaokangQianc5c39d52021-11-09 11:55:10 +00001443
XiaokangQian35dc6252021-11-11 08:16:19 +00001444/* Main entry point: orchestrates the other functions */
1445int mbedtls_ssl_tls13_write_finished_message( mbedtls_ssl_context *ssl )
1446{
1447 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1448 unsigned char *buf;
1449 size_t buf_len, msg_len;
1450
1451 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished message" ) );
1452
XiaokangQiandce82242021-11-15 06:01:26 +00001453 MBEDTLS_SSL_PROC_CHK( ssl_tls13_prepare_finished_message( ssl ) );
1454
XiaokangQian35dc6252021-11-11 08:16:19 +00001455 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_start_handshake_msg( ssl,
1456 MBEDTLS_SSL_HS_FINISHED, &buf, &buf_len ) );
1457
1458 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_finished_message_body(
1459 ssl, buf, buf + buf_len, &msg_len ) );
1460
Xiaofei Bai746f9482021-11-12 08:53:56 +00001461 mbedtls_ssl_tls13_add_hs_msg_to_checksum( ssl, MBEDTLS_SSL_HS_FINISHED,
1462 buf, msg_len );
XiaokangQian35dc6252021-11-11 08:16:19 +00001463
1464 MBEDTLS_SSL_PROC_CHK( ssl_tls13_finalize_finished_message( ssl ) );
1465 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_tls13_finish_handshake_msg( ssl,
1466 buf_len, msg_len ) );
XiaokangQian35dc6252021-11-11 08:16:19 +00001467
1468cleanup:
1469
1470 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished message" ) );
1471 return( ret );
1472}
1473
Jerry Yu378254d2021-10-30 21:44:47 +08001474void mbedtls_ssl_tls13_handshake_wrapup( mbedtls_ssl_context *ssl )
1475{
1476
1477 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
1478
1479 /*
Jerry Yucfe64f02021-11-15 13:54:06 +08001480 * Free the previous session and switch to the current one.
Jerry Yu378254d2021-10-30 21:44:47 +08001481 */
1482 if( ssl->session )
1483 {
Jerry Yu378254d2021-10-30 21:44:47 +08001484 mbedtls_ssl_session_free( ssl->session );
1485 mbedtls_free( ssl->session );
1486 }
1487 ssl->session = ssl->session_negotiate;
1488 ssl->session_negotiate = NULL;
1489
1490 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
1491}
1492
Ronald Cron49ad6192021-11-24 16:25:31 +01001493/*
1494 *
1495 * STATE HANDLING: Write ChangeCipherSpec
1496 *
1497 */
1498#if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
Ronald Cron49ad6192021-11-24 16:25:31 +01001499static int ssl_tls13_write_change_cipher_spec_body( mbedtls_ssl_context *ssl,
1500 unsigned char *buf,
1501 unsigned char *end,
1502 size_t *olen )
1503{
1504 ((void) ssl);
1505
1506 MBEDTLS_SSL_CHK_BUF_PTR( buf, end, 1 );
1507 buf[0] = 1;
1508 *olen = 1;
1509
1510 return( 0 );
1511}
1512
Ronald Cron49ad6192021-11-24 16:25:31 +01001513int mbedtls_ssl_tls13_write_change_cipher_spec( mbedtls_ssl_context *ssl )
1514{
1515 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1516
1517 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
1518
Ronald Cron49ad6192021-11-24 16:25:31 +01001519 /* Write CCS message */
1520 MBEDTLS_SSL_PROC_CHK( ssl_tls13_write_change_cipher_spec_body(
1521 ssl, ssl->out_msg,
1522 ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
1523 &ssl->out_msglen ) );
1524
1525 ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC;
1526
Ronald Cron49ad6192021-11-24 16:25:31 +01001527 /* Dispatch message */
Ronald Cron66dbf912022-02-02 15:33:46 +01001528 MBEDTLS_SSL_PROC_CHK( mbedtls_ssl_write_record( ssl, 0 ) );
Ronald Cron49ad6192021-11-24 16:25:31 +01001529
1530cleanup:
1531
1532 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
1533 return( ret );
1534}
1535
1536#endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
1537
XiaokangQian78b1fa72022-01-19 06:56:30 +00001538/* Reset SSL context and update hash for handling HRR.
1539 *
1540 * Replace Transcript-Hash(X) by
1541 * Transcript-Hash( message_hash ||
1542 * 00 00 Hash.length ||
1543 * X )
1544 * A few states of the handshake are preserved, including:
1545 * - session ID
1546 * - session ticket
1547 * - negotiated ciphersuite
1548 */
1549int mbedtls_ssl_reset_transcript_for_hrr( mbedtls_ssl_context *ssl )
1550{
1551 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1552 unsigned char hash_transcript[ MBEDTLS_MD_MAX_SIZE + 4 ];
XiaokangQian0ece9982022-01-24 08:56:23 +00001553 size_t hash_len;
XiaokangQian78b1fa72022-01-19 06:56:30 +00001554 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
1555 uint16_t cipher_suite = ssl->session_negotiate->ciphersuite;
Przemyslaw Stekiel4b3fff42022-02-14 16:39:52 +01001556 psa_status_t status = PSA_ERROR_GENERIC_ERROR;
XiaokangQian78b1fa72022-01-19 06:56:30 +00001557 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( cipher_suite );
1558
1559 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Reset SSL session for HRR" ) );
1560
XiaokangQian0ece9982022-01-24 08:56:23 +00001561 ret = mbedtls_ssl_get_handshake_transcript( ssl, ciphersuite_info->mac,
1562 hash_transcript + 4,
1563 MBEDTLS_MD_MAX_SIZE,
1564 &hash_len );
1565 if( ret != 0 )
1566 {
1567 MBEDTLS_SSL_DEBUG_RET( 4, "mbedtls_ssl_get_handshake_transcript", ret );
1568 return( ret );
1569 }
1570
1571 hash_transcript[0] = MBEDTLS_SSL_HS_MESSAGE_HASH;
1572 hash_transcript[1] = 0;
1573 hash_transcript[2] = 0;
1574 hash_transcript[3] = (unsigned char) hash_len;
1575
1576 hash_len += 4;
1577
XiaokangQian78b1fa72022-01-19 06:56:30 +00001578 if( ciphersuite_info->mac == MBEDTLS_MD_SHA256 )
1579 {
1580#if defined(MBEDTLS_SHA256_C)
XiaokangQian78b1fa72022-01-19 06:56:30 +00001581 MBEDTLS_SSL_DEBUG_BUF( 4, "Truncated SHA-256 handshake transcript",
XiaokangQian0ece9982022-01-24 08:56:23 +00001582 hash_transcript, hash_len );
XiaokangQian78b1fa72022-01-19 06:56:30 +00001583
1584#if defined(MBEDTLS_USE_PSA_CRYPTO)
1585 psa_hash_abort( &ssl->handshake->fin_sha256_psa );
1586 psa_hash_setup( &ssl->handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
1587#else
1588 mbedtls_sha256_starts( &ssl->handshake->fin_sha256, 0 );
1589#endif
XiaokangQian78b1fa72022-01-19 06:56:30 +00001590#endif /* MBEDTLS_SHA256_C */
1591 }
1592 else if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
1593 {
1594#if defined(MBEDTLS_SHA384_C)
XiaokangQian78b1fa72022-01-19 06:56:30 +00001595 MBEDTLS_SSL_DEBUG_BUF( 4, "Truncated SHA-384 handshake transcript",
XiaokangQian0ece9982022-01-24 08:56:23 +00001596 hash_transcript, hash_len );
XiaokangQian78b1fa72022-01-19 06:56:30 +00001597
1598#if defined(MBEDTLS_USE_PSA_CRYPTO)
1599 psa_hash_abort( &ssl->handshake->fin_sha384_psa );
1600 psa_hash_setup( &ssl->handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
1601#else
1602 mbedtls_sha512_starts( &ssl->handshake->fin_sha512, 1 );
1603#endif
XiaokangQian78b1fa72022-01-19 06:56:30 +00001604#endif /* MBEDTLS_SHA384_C */
1605 }
1606
XiaokangQian0ece9982022-01-24 08:56:23 +00001607#if defined(MBEDTLS_SHA256_C) || defined(MBEDTLS_SHA384_C)
1608 ssl->handshake->update_checksum( ssl, hash_transcript, hash_len );
1609#endif /* MBEDTLS_SHA256_C || MBEDTLS_SHA384_C */
Przemyslaw Stekiel4b3fff42022-02-14 16:39:52 +01001610
1611 /* Destroy generated private key. */
1612 status = psa_destroy_key( ssl->handshake->ecdh_psa_privkey );
1613
1614 if( status != PSA_SUCCESS )
1615 {
1616 ret = psa_ssl_status_to_mbedtls( status );
1617 MBEDTLS_SSL_DEBUG_RET( 1, "psa_destroy_key", ret );
1618 return( ret );
1619 }
1620
1621 ssl->handshake->ecdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
1622
XiaokangQian78b1fa72022-01-19 06:56:30 +00001623 return( ret );
1624}
1625
Jerry Yufb4b6472022-01-27 15:03:26 +08001626#endif /* MBEDTLS_SSL_TLS_C && MBEDTLS_SSL_PROTO_TLS1_3 */