blob: d0557946108c3232e146af7b92c75aa5fbed743f [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002 * TLS shared functions
Paul Bakker5121ce52009-01-03 21:22:43 +00003 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * 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.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19/*
Paul Bakker5121ce52009-01-03 21:22:43 +000020 * http://www.ietf.org/rfc/rfc2246.txt
21 * http://www.ietf.org/rfc/rfc4346.txt
22 */
23
Gilles Peskinedb09ef62020-06-03 01:43:33 +020024#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000025
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020026#if defined(MBEDTLS_SSL_TLS_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Jerry Yub476a442022-01-21 18:14:45 +080028#include <assert.h>
29
SimonBd5800b72016-04-26 07:43:27 +010030#if defined(MBEDTLS_PLATFORM_C)
31#include "mbedtls/platform.h"
32#else
33#include <stdlib.h>
Jerry Yu6ade7432022-01-25 10:39:33 +080034#include <stdio.h>
SimonBd5800b72016-04-26 07:43:27 +010035#define mbedtls_calloc calloc
36#define mbedtls_free free
Jerry Yu6ade7432022-01-25 10:39:33 +080037#define mbedtls_printf printf
38#endif /* !MBEDTLS_PLATFORM_C */
SimonBd5800b72016-04-26 07:43:27 +010039
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000040#include "mbedtls/ssl.h"
Ronald Cron9f0fba32022-02-10 16:45:15 +010041#include "ssl_client.h"
Ronald Cron27c85e72022-03-08 11:37:55 +010042#include "ssl_debug_helpers.h"
Chris Jones84a773f2021-03-05 18:38:47 +000043#include "ssl_misc.h"
Janos Follath73c616b2019-12-18 15:07:04 +000044#include "mbedtls/debug.h"
45#include "mbedtls/error.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050046#include "mbedtls/platform_util.h"
Hanno Beckera835da52019-05-16 12:39:07 +010047#include "mbedtls/version.h"
Gabor Mezei765862c2021-10-19 12:22:25 +020048#include "mbedtls/constant_time.h"
Paul Bakker0be444a2013-08-27 21:55:01 +020049
Rich Evans00ab4702015-02-06 13:43:58 +000050#include <string.h>
51
Andrzej Kurekd6db9be2019-01-10 05:27:10 -050052#if defined(MBEDTLS_USE_PSA_CRYPTO)
53#include "mbedtls/psa_util.h"
54#include "psa/crypto.h"
55#endif
56
Janos Follath23bdca02016-10-07 14:47:14 +010057#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000058#include "mbedtls/oid.h"
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +020059#endif
60
Ronald Cronad8c17b2022-06-10 17:18:09 +020061#if defined(MBEDTLS_TEST_HOOKS)
62static mbedtls_ssl_chk_buf_ptr_args chk_buf_ptr_fail_args;
63
64void mbedtls_ssl_set_chk_buf_ptr_fail_args(
65 const uint8_t *cur, const uint8_t *end, size_t need )
66{
67 chk_buf_ptr_fail_args.cur = cur;
68 chk_buf_ptr_fail_args.end = end;
69 chk_buf_ptr_fail_args.need = need;
70}
71
72void mbedtls_ssl_reset_chk_buf_ptr_fail_args( void )
73{
74 memset( &chk_buf_ptr_fail_args, 0, sizeof( chk_buf_ptr_fail_args ) );
75}
76
77int mbedtls_ssl_cmp_chk_buf_ptr_fail_args( mbedtls_ssl_chk_buf_ptr_args *args )
78{
79 return( ( chk_buf_ptr_fail_args.cur != args->cur ) ||
80 ( chk_buf_ptr_fail_args.end != args->end ) ||
81 ( chk_buf_ptr_fail_args.need != args->need ) );
82}
83#endif /* MBEDTLS_TEST_HOOKS */
84
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +020085#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker2b1e3542018-08-06 11:19:13 +010086
Hanno Beckera0e20d02019-05-15 14:03:01 +010087#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerf8542cf2019-04-09 15:22:03 +010088/* Top-level Connection ID API */
89
Hanno Becker8367ccc2019-05-14 11:30:10 +010090int mbedtls_ssl_conf_cid( mbedtls_ssl_config *conf,
91 size_t len,
92 int ignore_other_cid )
Hanno Beckerad4a1372019-05-03 13:06:44 +010093{
94 if( len > MBEDTLS_SSL_CID_IN_LEN_MAX )
95 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
96
Hanno Becker611ac772019-05-14 11:45:26 +010097 if( ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_FAIL &&
98 ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_IGNORE )
99 {
100 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
101 }
102
103 conf->ignore_unexpected_cid = ignore_other_cid;
Hanno Beckerad4a1372019-05-03 13:06:44 +0100104 conf->cid_len = len;
105 return( 0 );
106}
107
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100108int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
109 int enable,
110 unsigned char const *own_cid,
111 size_t own_cid_len )
112{
Hanno Becker76a79ab2019-05-03 14:38:32 +0100113 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
114 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
115
Hanno Beckerca092242019-04-25 16:01:49 +0100116 ssl->negotiate_cid = enable;
117 if( enable == MBEDTLS_SSL_CID_DISABLED )
118 {
119 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Disable use of CID extension." ) );
120 return( 0 );
121 }
122 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Enable use of CID extension." ) );
Hanno Beckerad4a1372019-05-03 13:06:44 +0100123 MBEDTLS_SSL_DEBUG_BUF( 3, "Own CID", own_cid, own_cid_len );
Hanno Beckerca092242019-04-25 16:01:49 +0100124
Hanno Beckerad4a1372019-05-03 13:06:44 +0100125 if( own_cid_len != ssl->conf->cid_len )
Hanno Beckerca092242019-04-25 16:01:49 +0100126 {
Hanno Beckerad4a1372019-05-03 13:06:44 +0100127 MBEDTLS_SSL_DEBUG_MSG( 3, ( "CID length %u does not match CID length %u in config",
128 (unsigned) own_cid_len,
129 (unsigned) ssl->conf->cid_len ) );
Hanno Beckerca092242019-04-25 16:01:49 +0100130 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
131 }
132
133 memcpy( ssl->own_cid, own_cid, own_cid_len );
Hanno Beckerb7ee0cf2019-04-30 14:07:31 +0100134 /* Truncation is not an issue here because
135 * MBEDTLS_SSL_CID_IN_LEN_MAX at most 255. */
136 ssl->own_cid_len = (uint8_t) own_cid_len;
Hanno Beckerca092242019-04-25 16:01:49 +0100137
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100138 return( 0 );
139}
140
Paul Elliott0113cf12022-03-11 20:26:47 +0000141int mbedtls_ssl_get_own_cid( mbedtls_ssl_context *ssl,
142 int *enabled,
143 unsigned char own_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX],
144 size_t *own_cid_len )
145{
146 *enabled = MBEDTLS_SSL_CID_DISABLED;
147
148 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
149 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
150
151 /* We report MBEDTLS_SSL_CID_DISABLED in case the CID length is
152 * zero as this is indistinguishable from not requesting to use
153 * the CID extension. */
154 if( ssl->own_cid_len == 0 || ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED )
155 return( 0 );
156
157 if( own_cid_len != NULL )
158 {
159 *own_cid_len = ssl->own_cid_len;
160 if( own_cid != NULL )
161 memcpy( own_cid, ssl->own_cid, ssl->own_cid_len );
162 }
163
164 *enabled = MBEDTLS_SSL_CID_ENABLED;
165
166 return( 0 );
167}
168
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100169int mbedtls_ssl_get_peer_cid( mbedtls_ssl_context *ssl,
170 int *enabled,
171 unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ],
172 size_t *peer_cid_len )
173{
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100174 *enabled = MBEDTLS_SSL_CID_DISABLED;
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100175
Hanno Becker76a79ab2019-05-03 14:38:32 +0100176 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
Paul Elliott27b0d942022-03-18 21:55:32 +0000177 mbedtls_ssl_is_handshake_over( ssl ) == 0 )
Hanno Becker76a79ab2019-05-03 14:38:32 +0100178 {
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100179 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Hanno Becker76a79ab2019-05-03 14:38:32 +0100180 }
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100181
Hanno Beckerc5f24222019-05-03 12:54:52 +0100182 /* We report MBEDTLS_SSL_CID_DISABLED in case the CID extensions
183 * were used, but client and server requested the empty CID.
184 * This is indistinguishable from not using the CID extension
185 * in the first place. */
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100186 if( ssl->transform_in->in_cid_len == 0 &&
187 ssl->transform_in->out_cid_len == 0 )
188 {
189 return( 0 );
190 }
191
Hanno Becker615ef172019-05-22 16:50:35 +0100192 if( peer_cid_len != NULL )
193 {
194 *peer_cid_len = ssl->transform_in->out_cid_len;
195 if( peer_cid != NULL )
196 {
197 memcpy( peer_cid, ssl->transform_in->out_cid,
198 ssl->transform_in->out_cid_len );
199 }
200 }
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100201
202 *enabled = MBEDTLS_SSL_CID_ENABLED;
203
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100204 return( 0 );
205}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100206#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200209
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200210#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200211/*
212 * Convert max_fragment_length codes to length.
213 * RFC 6066 says:
214 * enum{
215 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
216 * } MaxFragmentLength;
217 * and we add 0 -> extension unused
218 */
Angus Grattond8213d02016-05-25 20:56:48 +1000219static unsigned int ssl_mfl_code_to_length( int mfl )
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200220{
Angus Grattond8213d02016-05-25 20:56:48 +1000221 switch( mfl )
222 {
223 case MBEDTLS_SSL_MAX_FRAG_LEN_NONE:
224 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
225 case MBEDTLS_SSL_MAX_FRAG_LEN_512:
226 return 512;
227 case MBEDTLS_SSL_MAX_FRAG_LEN_1024:
228 return 1024;
229 case MBEDTLS_SSL_MAX_FRAG_LEN_2048:
230 return 2048;
231 case MBEDTLS_SSL_MAX_FRAG_LEN_4096:
232 return 4096;
233 default:
234 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
235 }
236}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200237#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200238
Hanno Becker52055ae2019-02-06 14:30:46 +0000239int mbedtls_ssl_session_copy( mbedtls_ssl_session *dst,
240 const mbedtls_ssl_session *src )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200241{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200242 mbedtls_ssl_session_free( dst );
243 memcpy( dst, src, sizeof( mbedtls_ssl_session ) );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200244
吴敬辉0b716112021-11-29 10:46:35 +0800245#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
246 dst->ticket = NULL;
247#endif
248
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200249#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker6d1986e2019-02-07 12:27:42 +0000250
251#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200252 if( src->peer_cert != NULL )
253 {
Janos Follath865b3eb2019-12-16 11:46:15 +0000254 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker2292d1f2013-09-15 17:06:49 +0200255
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200256 dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200257 if( dst->peer_cert == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200258 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200259
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200260 mbedtls_x509_crt_init( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200262 if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p,
Manuel Pégourié-Gonnard4d2a8eb2014-06-13 20:33:27 +0200263 src->peer_cert->raw.len ) ) != 0 )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200264 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200265 mbedtls_free( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200266 dst->peer_cert = NULL;
267 return( ret );
268 }
269 }
Hanno Becker6d1986e2019-02-07 12:27:42 +0000270#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker9198ad12019-02-05 17:00:50 +0000271 if( src->peer_cert_digest != NULL )
272 {
Hanno Becker9198ad12019-02-05 17:00:50 +0000273 dst->peer_cert_digest =
Hanno Beckeraccc5992019-02-25 10:06:59 +0000274 mbedtls_calloc( 1, src->peer_cert_digest_len );
Hanno Becker9198ad12019-02-05 17:00:50 +0000275 if( dst->peer_cert_digest == NULL )
276 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
277
278 memcpy( dst->peer_cert_digest, src->peer_cert_digest,
279 src->peer_cert_digest_len );
280 dst->peer_cert_digest_type = src->peer_cert_digest_type;
Hanno Beckeraccc5992019-02-25 10:06:59 +0000281 dst->peer_cert_digest_len = src->peer_cert_digest_len;
Hanno Becker9198ad12019-02-05 17:00:50 +0000282 }
283#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
284
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200285#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200286
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +0200287#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200288 if( src->ticket != NULL )
289 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200290 dst->ticket = mbedtls_calloc( 1, src->ticket_len );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200291 if( dst->ticket == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200292 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200293
294 memcpy( dst->ticket, src->ticket, src->ticket_len );
295 }
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +0200296#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200297
298 return( 0 );
299}
300
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500301#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200302MBEDTLS_CHECK_RETURN_CRITICAL
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500303static int resize_buffer( unsigned char **buffer, size_t len_new, size_t *len_old )
304{
305 unsigned char* resized_buffer = mbedtls_calloc( 1, len_new );
306 if( resized_buffer == NULL )
307 return -1;
308
309 /* We want to copy len_new bytes when downsizing the buffer, and
310 * len_old bytes when upsizing, so we choose the smaller of two sizes,
311 * to fit one buffer into another. Size checks, ensuring that no data is
312 * lost, are done outside of this function. */
313 memcpy( resized_buffer, *buffer,
314 ( len_new < *len_old ) ? len_new : *len_old );
315 mbedtls_platform_zeroize( *buffer, *len_old );
316 mbedtls_free( *buffer );
317
318 *buffer = resized_buffer;
319 *len_old = len_new;
320
321 return 0;
322}
Andrzej Kurek4a063792020-10-21 15:08:44 +0200323
324static void handle_buffer_resizing( mbedtls_ssl_context *ssl, int downsizing,
Andrzej Kurek069fa962021-01-07 08:02:15 -0500325 size_t in_buf_new_len,
326 size_t out_buf_new_len )
Andrzej Kurek4a063792020-10-21 15:08:44 +0200327{
328 int modified = 0;
329 size_t written_in = 0, iv_offset_in = 0, len_offset_in = 0;
330 size_t written_out = 0, iv_offset_out = 0, len_offset_out = 0;
331 if( ssl->in_buf != NULL )
332 {
333 written_in = ssl->in_msg - ssl->in_buf;
334 iv_offset_in = ssl->in_iv - ssl->in_buf;
335 len_offset_in = ssl->in_len - ssl->in_buf;
336 if( downsizing ?
337 ssl->in_buf_len > in_buf_new_len && ssl->in_left < in_buf_new_len :
338 ssl->in_buf_len < in_buf_new_len )
339 {
340 if( resize_buffer( &ssl->in_buf, in_buf_new_len, &ssl->in_buf_len ) != 0 )
341 {
342 MBEDTLS_SSL_DEBUG_MSG( 1, ( "input buffer resizing failed - out of memory" ) );
343 }
344 else
345 {
Paul Elliottb7449902021-03-10 18:14:58 +0000346 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating in_buf to %" MBEDTLS_PRINTF_SIZET,
347 in_buf_new_len ) );
Andrzej Kurek4a063792020-10-21 15:08:44 +0200348 modified = 1;
349 }
350 }
351 }
352
353 if( ssl->out_buf != NULL )
354 {
355 written_out = ssl->out_msg - ssl->out_buf;
356 iv_offset_out = ssl->out_iv - ssl->out_buf;
357 len_offset_out = ssl->out_len - ssl->out_buf;
358 if( downsizing ?
359 ssl->out_buf_len > out_buf_new_len && ssl->out_left < out_buf_new_len :
360 ssl->out_buf_len < out_buf_new_len )
361 {
362 if( resize_buffer( &ssl->out_buf, out_buf_new_len, &ssl->out_buf_len ) != 0 )
363 {
364 MBEDTLS_SSL_DEBUG_MSG( 1, ( "output buffer resizing failed - out of memory" ) );
365 }
366 else
367 {
Paul Elliottb7449902021-03-10 18:14:58 +0000368 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating out_buf to %" MBEDTLS_PRINTF_SIZET,
369 out_buf_new_len ) );
Andrzej Kurek4a063792020-10-21 15:08:44 +0200370 modified = 1;
371 }
372 }
373 }
374 if( modified )
375 {
376 /* Update pointers here to avoid doing it twice. */
377 mbedtls_ssl_reset_in_out_pointers( ssl );
378 /* Fields below might not be properly updated with record
379 * splitting or with CID, so they are manually updated here. */
380 ssl->out_msg = ssl->out_buf + written_out;
381 ssl->out_len = ssl->out_buf + len_offset_out;
382 ssl->out_iv = ssl->out_buf + iv_offset_out;
383
384 ssl->in_msg = ssl->in_buf + written_in;
385 ssl->in_len = ssl->in_buf + len_offset_in;
386 ssl->in_iv = ssl->in_buf + iv_offset_in;
387 }
388}
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500389#endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
390
Jerry Yudb8c48a2022-01-27 14:54:54 +0800391#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yued14c932022-02-17 13:40:45 +0800392
393#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
394typedef int (*tls_prf_fn)( const unsigned char *secret, size_t slen,
395 const char *label,
396 const unsigned char *random, size_t rlen,
397 unsigned char *dstbuf, size_t dlen );
398
399static tls_prf_fn ssl_tls12prf_from_cs( int ciphersuite_id );
400
401#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
402
403/* Type for the TLS PRF */
404typedef int ssl_tls_prf_t(const unsigned char *, size_t, const char *,
405 const unsigned char *, size_t,
406 unsigned char *, size_t);
407
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200408MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yued14c932022-02-17 13:40:45 +0800409static int ssl_tls12_populate_transform( mbedtls_ssl_transform *transform,
410 int ciphersuite,
411 const unsigned char master[48],
Neil Armstrongf2c82f02022-04-05 11:16:53 +0200412#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Jerry Yued14c932022-02-17 13:40:45 +0800413 int encrypt_then_mac,
Neil Armstrongf2c82f02022-04-05 11:16:53 +0200414#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Jerry Yued14c932022-02-17 13:40:45 +0800415 ssl_tls_prf_t tls_prf,
416 const unsigned char randbytes[64],
Glenn Strauss07c64162022-03-14 12:34:51 -0400417 mbedtls_ssl_protocol_version tls_version,
Jerry Yued14c932022-02-17 13:40:45 +0800418 unsigned endpoint,
419 const mbedtls_ssl_context *ssl );
420
421#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200422MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yued14c932022-02-17 13:40:45 +0800423static int tls_prf_sha256( const unsigned char *secret, size_t slen,
424 const char *label,
425 const unsigned char *random, size_t rlen,
426 unsigned char *dstbuf, size_t dlen );
427static void ssl_calc_verify_tls_sha256( const mbedtls_ssl_context *,unsigned char*, size_t * );
428static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int );
429
430#endif /* MBEDTLS_SHA256_C */
431
432#if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200433MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yued14c932022-02-17 13:40:45 +0800434static int tls_prf_sha384( const unsigned char *secret, size_t slen,
435 const char *label,
436 const unsigned char *random, size_t rlen,
437 unsigned char *dstbuf, size_t dlen );
438
439static void ssl_calc_verify_tls_sha384( const mbedtls_ssl_context *, unsigned char*, size_t * );
440static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int );
441#endif /* MBEDTLS_SHA384_C */
442
Jerry Yu438ddd82022-07-07 06:55:50 +0000443static size_t ssl_tls12_session_save( const mbedtls_ssl_session *session,
Jerry Yued14c932022-02-17 13:40:45 +0800444 unsigned char *buf,
445 size_t buf_len );
Jerry Yu251a12e2022-07-13 15:15:48 +0800446
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200447MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu438ddd82022-07-07 06:55:50 +0000448static int ssl_tls12_session_load( mbedtls_ssl_session *session,
Jerry Yued14c932022-02-17 13:40:45 +0800449 const unsigned char *buf,
450 size_t len );
451#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
452
Jerry Yu53d23e22022-02-09 16:25:09 +0800453static void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t );
454
Jerry Yudb8c48a2022-01-27 14:54:54 +0800455#if defined(MBEDTLS_SHA256_C)
456static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t );
Jerry Yu53d23e22022-02-09 16:25:09 +0800457#endif /* MBEDTLS_SHA256_C */
Jerry Yudb8c48a2022-01-27 14:54:54 +0800458
459#if defined(MBEDTLS_SHA384_C)
460static void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t );
Jerry Yu53d23e22022-02-09 16:25:09 +0800461#endif /* MBEDTLS_SHA384_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000462
Ron Eldor51d3ab52019-05-12 14:54:30 +0300463int mbedtls_ssl_tls_prf( const mbedtls_tls_prf_types prf,
464 const unsigned char *secret, size_t slen,
465 const char *label,
466 const unsigned char *random, size_t rlen,
467 unsigned char *dstbuf, size_t dlen )
468{
469 mbedtls_ssl_tls_prf_cb *tls_prf = NULL;
470
471 switch( prf )
472 {
Ron Eldord2f25f72019-05-15 14:54:22 +0300473#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Mateusz Starzykc6d94ab2021-05-19 13:31:59 +0200474#if defined(MBEDTLS_SHA384_C)
Ron Eldor51d3ab52019-05-12 14:54:30 +0300475 case MBEDTLS_SSL_TLS_PRF_SHA384:
476 tls_prf = tls_prf_sha384;
477 break;
Mateusz Starzykc6d94ab2021-05-19 13:31:59 +0200478#endif /* MBEDTLS_SHA384_C */
Ron Eldor51d3ab52019-05-12 14:54:30 +0300479#if defined(MBEDTLS_SHA256_C)
480 case MBEDTLS_SSL_TLS_PRF_SHA256:
481 tls_prf = tls_prf_sha256;
482 break;
Ron Eldord2f25f72019-05-15 14:54:22 +0300483#endif /* MBEDTLS_SHA256_C */
484#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Ron Eldor51d3ab52019-05-12 14:54:30 +0300485 default:
486 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
487 }
488
489 return( tls_prf( secret, slen, label, random, rlen, dstbuf, dlen ) );
490}
491
Jerry Yuc73c6182022-02-08 20:29:25 +0800492#if defined(MBEDTLS_X509_CRT_PARSE_C)
493static void ssl_clear_peer_cert( mbedtls_ssl_session *session )
494{
495#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
496 if( session->peer_cert != NULL )
497 {
498 mbedtls_x509_crt_free( session->peer_cert );
499 mbedtls_free( session->peer_cert );
500 session->peer_cert = NULL;
501 }
502#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
503 if( session->peer_cert_digest != NULL )
504 {
505 /* Zeroization is not necessary. */
506 mbedtls_free( session->peer_cert_digest );
507 session->peer_cert_digest = NULL;
508 session->peer_cert_digest_type = MBEDTLS_MD_NONE;
509 session->peer_cert_digest_len = 0;
510 }
511#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
512}
513#endif /* MBEDTLS_X509_CRT_PARSE_C */
514
515void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl,
516 const mbedtls_ssl_ciphersuite_t *ciphersuite_info )
517{
518 ((void) ciphersuite_info);
519
520#if defined(MBEDTLS_SHA384_C)
521 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
522 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
523 else
524#endif
525#if defined(MBEDTLS_SHA256_C)
526 if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 )
527 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
528 else
529#endif
530 {
531 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
532 return;
533 }
534}
535
XiaokangQianadab9a62022-07-18 07:41:26 +0000536void mbedtls_ssl_add_hs_hdr_to_checksum( mbedtls_ssl_context *ssl,
537 unsigned hs_type,
538 size_t total_hs_len )
Ronald Cron8f6d39a2022-03-10 18:56:50 +0100539{
540 unsigned char hs_hdr[4];
541
542 /* Build HS header for checksum update. */
543 hs_hdr[0] = MBEDTLS_BYTE_0( hs_type );
544 hs_hdr[1] = MBEDTLS_BYTE_2( total_hs_len );
545 hs_hdr[2] = MBEDTLS_BYTE_1( total_hs_len );
546 hs_hdr[3] = MBEDTLS_BYTE_0( total_hs_len );
547
548 ssl->handshake->update_checksum( ssl, hs_hdr, sizeof( hs_hdr ) );
549}
550
551void mbedtls_ssl_add_hs_msg_to_checksum( mbedtls_ssl_context *ssl,
552 unsigned hs_type,
553 unsigned char const *msg,
554 size_t msg_len )
555{
556 mbedtls_ssl_add_hs_hdr_to_checksum( ssl, hs_type, msg_len );
557 ssl->handshake->update_checksum( ssl, msg, msg_len );
558}
559
Jerry Yuc73c6182022-02-08 20:29:25 +0800560void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl )
561{
562 ((void) ssl);
563#if defined(MBEDTLS_SHA256_C)
564#if defined(MBEDTLS_USE_PSA_CRYPTO)
565 psa_hash_abort( &ssl->handshake->fin_sha256_psa );
566 psa_hash_setup( &ssl->handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
567#else
568 mbedtls_sha256_starts( &ssl->handshake->fin_sha256, 0 );
569#endif
570#endif
571#if defined(MBEDTLS_SHA384_C)
572#if defined(MBEDTLS_USE_PSA_CRYPTO)
573 psa_hash_abort( &ssl->handshake->fin_sha384_psa );
574 psa_hash_setup( &ssl->handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
575#else
576 mbedtls_sha512_starts( &ssl->handshake->fin_sha512, 1 );
577#endif
578#endif
579}
580
581static void ssl_update_checksum_start( mbedtls_ssl_context *ssl,
582 const unsigned char *buf, size_t len )
583{
584#if defined(MBEDTLS_SHA256_C)
585#if defined(MBEDTLS_USE_PSA_CRYPTO)
586 psa_hash_update( &ssl->handshake->fin_sha256_psa, buf, len );
587#else
588 mbedtls_sha256_update( &ssl->handshake->fin_sha256, buf, len );
589#endif
590#endif
591#if defined(MBEDTLS_SHA384_C)
592#if defined(MBEDTLS_USE_PSA_CRYPTO)
593 psa_hash_update( &ssl->handshake->fin_sha384_psa, buf, len );
594#else
595 mbedtls_sha512_update( &ssl->handshake->fin_sha512, buf, len );
596#endif
597#endif
598}
599
600#if defined(MBEDTLS_SHA256_C)
601static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl,
602 const unsigned char *buf, size_t len )
603{
604#if defined(MBEDTLS_USE_PSA_CRYPTO)
605 psa_hash_update( &ssl->handshake->fin_sha256_psa, buf, len );
606#else
607 mbedtls_sha256_update( &ssl->handshake->fin_sha256, buf, len );
608#endif
609}
610#endif
611
612#if defined(MBEDTLS_SHA384_C)
613static void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl,
614 const unsigned char *buf, size_t len )
615{
616#if defined(MBEDTLS_USE_PSA_CRYPTO)
617 psa_hash_update( &ssl->handshake->fin_sha384_psa, buf, len );
618#else
619 mbedtls_sha512_update( &ssl->handshake->fin_sha512, buf, len );
620#endif
621}
622#endif
623
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200624static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake )
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200625{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200626 memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -0500629#if defined(MBEDTLS_USE_PSA_CRYPTO)
630 handshake->fin_sha256_psa = psa_hash_operation_init();
631 psa_hash_setup( &handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
632#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200633 mbedtls_sha256_init( &handshake->fin_sha256 );
TRodziewicz26371e42021-06-08 16:45:41 +0200634 mbedtls_sha256_starts( &handshake->fin_sha256, 0 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200635#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -0500636#endif
Mateusz Starzykc6d94ab2021-05-19 13:31:59 +0200637#if defined(MBEDTLS_SHA384_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -0500638#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -0500639 handshake->fin_sha384_psa = psa_hash_operation_init();
640 psa_hash_setup( &handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
Andrzej Kurekeb342242019-01-29 09:14:33 -0500641#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200642 mbedtls_sha512_init( &handshake->fin_sha512 );
TRodziewicz26371e42021-06-08 16:45:41 +0200643 mbedtls_sha512_starts( &handshake->fin_sha512, 1 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200644#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -0500645#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200646
647 handshake->update_checksum = ssl_update_checksum_start;
Hanno Becker7e5437a2017-04-28 17:15:26 +0100648
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200649#if defined(MBEDTLS_DHM_C)
650 mbedtls_dhm_init( &handshake->dhm_ctx );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200651#endif
Neil Armstrongf3f46412022-04-12 14:43:39 +0200652#if !defined(MBEDTLS_USE_PSA_CRYPTO) && defined(MBEDTLS_ECDH_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200653 mbedtls_ecdh_init( &handshake->ecdh_ctx );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200654#endif
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200655#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +0200656 mbedtls_ecjpake_init( &handshake->ecjpake_ctx );
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +0200657#if defined(MBEDTLS_SSL_CLI_C)
658 handshake->ecjpake_cache = NULL;
659 handshake->ecjpake_cache_len = 0;
660#endif
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +0200661#endif
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +0200662
Gilles Peskineeccd8882020-03-10 12:19:08 +0100663#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard6b7301c2017-08-15 12:08:45 +0200664 mbedtls_x509_crt_restart_init( &handshake->ecrs_ctx );
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +0200665#endif
666
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +0200667#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
668 handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
669#endif
Hanno Becker75173122019-02-06 16:18:31 +0000670
671#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
672 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
673 mbedtls_pk_init( &handshake->peer_pubkey );
674#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200675}
676
Hanno Beckera18d1322018-01-03 14:27:32 +0000677void mbedtls_ssl_transform_init( mbedtls_ssl_transform *transform )
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200678{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200679 memset( transform, 0, sizeof(mbedtls_ssl_transform) );
Paul Bakker84bbeb52014-07-01 14:53:22 +0200680
Przemyslaw Stekiel8f80fb92022-01-11 08:28:13 +0100681#if defined(MBEDTLS_USE_PSA_CRYPTO)
682 transform->psa_key_enc = MBEDTLS_SVC_KEY_ID_INIT;
683 transform->psa_key_dec = MBEDTLS_SVC_KEY_ID_INIT;
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +0100684#else
685 mbedtls_cipher_init( &transform->cipher_ctx_enc );
686 mbedtls_cipher_init( &transform->cipher_ctx_dec );
Przemyslaw Stekiel8f80fb92022-01-11 08:28:13 +0100687#endif
688
Hanno Beckerfd86ca82020-11-30 08:54:23 +0000689#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Neil Armstrong39b8e7d2022-02-23 09:24:45 +0100690#if defined(MBEDTLS_USE_PSA_CRYPTO)
691 transform->psa_mac_enc = MBEDTLS_SVC_KEY_ID_INIT;
692 transform->psa_mac_dec = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrongcf8841a2022-02-24 11:17:45 +0100693#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200694 mbedtls_md_init( &transform->md_ctx_enc );
695 mbedtls_md_init( &transform->md_ctx_dec );
Hanno Beckerd56ed242018-01-03 15:32:51 +0000696#endif
Neil Armstrongcf8841a2022-02-24 11:17:45 +0100697#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200698}
699
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200700void mbedtls_ssl_session_init( mbedtls_ssl_session *session )
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200701{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200702 memset( session, 0, sizeof(mbedtls_ssl_session) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200703}
704
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200705MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200706static int ssl_handshake_init( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +0000707{
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200708 /* Clear old handshake information if present */
Paul Bakker48916f92012-09-16 19:57:18 +0000709 if( ssl->transform_negotiate )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200710 mbedtls_ssl_transform_free( ssl->transform_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200711 if( ssl->session_negotiate )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712 mbedtls_ssl_session_free( ssl->session_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200713 if( ssl->handshake )
Gilles Peskine9b562d52018-04-25 20:32:43 +0200714 mbedtls_ssl_handshake_free( ssl );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200715
716 /*
717 * Either the pointers are now NULL or cleared properly and can be freed.
718 * Now allocate missing structures.
719 */
720 if( ssl->transform_negotiate == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200721 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200722 ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200723 }
Paul Bakker48916f92012-09-16 19:57:18 +0000724
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200725 if( ssl->session_negotiate == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200726 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200727 ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200728 }
Paul Bakker48916f92012-09-16 19:57:18 +0000729
Paul Bakker82788fb2014-10-20 13:59:19 +0200730 if( ssl->handshake == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200731 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200732 ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200733 }
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500734#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
735 /* If the buffers are too small - reallocate */
Andrzej Kurek8ea68722020-04-03 06:40:47 -0400736
Andrzej Kurek4a063792020-10-21 15:08:44 +0200737 handle_buffer_resizing( ssl, 0, MBEDTLS_SSL_IN_BUFFER_LEN,
738 MBEDTLS_SSL_OUT_BUFFER_LEN );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500739#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000740
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200741 /* All pointers should exist and can be directly freed without issue */
Paul Bakker48916f92012-09-16 19:57:18 +0000742 if( ssl->handshake == NULL ||
743 ssl->transform_negotiate == NULL ||
744 ssl->session_negotiate == NULL )
745 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +0200746 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc() of ssl sub-contexts failed" ) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200747
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200748 mbedtls_free( ssl->handshake );
749 mbedtls_free( ssl->transform_negotiate );
750 mbedtls_free( ssl->session_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200751
752 ssl->handshake = NULL;
753 ssl->transform_negotiate = NULL;
754 ssl->session_negotiate = NULL;
755
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200756 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker48916f92012-09-16 19:57:18 +0000757 }
758
Paul Bakkeraccaffe2014-06-26 13:37:14 +0200759 /* Initialize structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760 mbedtls_ssl_session_init( ssl->session_negotiate );
Hanno Beckera18d1322018-01-03 14:27:32 +0000761 mbedtls_ssl_transform_init( ssl->transform_negotiate );
Paul Bakker968afaa2014-07-09 11:09:24 +0200762 ssl_handshake_params_init( ssl->handshake );
763
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200764#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200765 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
766 {
767 ssl->handshake->alt_transform_out = ssl->transform_out;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +0200768
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200769 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
770 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
771 else
772 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +0200773
Hanno Becker0f57a652020-02-05 10:37:26 +0000774 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +0200775 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +0200776#endif
777
Brett Warrene0edc842021-08-17 09:53:13 +0100778/*
779 * curve_list is translated to IANA TLS group identifiers here because
780 * mbedtls_ssl_conf_curves returns void and so can't return
781 * any error codes.
782 */
783#if defined(MBEDTLS_ECP_C)
784#if !defined(MBEDTLS_DEPRECATED_REMOVED)
785 /* Heap allocate and translate curve_list from internal to IANA group ids */
786 if ( ssl->conf->curve_list != NULL )
787 {
788 size_t length;
789 const mbedtls_ecp_group_id *curve_list = ssl->conf->curve_list;
790
791 for( length = 0; ( curve_list[length] != MBEDTLS_ECP_DP_NONE ) &&
792 ( length < MBEDTLS_ECP_DP_MAX ); length++ ) {}
793
794 /* Leave room for zero termination */
795 uint16_t *group_list = mbedtls_calloc( length + 1, sizeof(uint16_t) );
796 if ( group_list == NULL )
797 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
798
799 for( size_t i = 0; i < length; i++ )
800 {
801 const mbedtls_ecp_curve_info *info =
802 mbedtls_ecp_curve_info_from_grp_id( curve_list[i] );
803 if ( info == NULL )
804 {
805 mbedtls_free( group_list );
806 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
807 }
808 group_list[i] = info->tls_id;
809 }
810
811 group_list[length] = 0;
812
813 ssl->handshake->group_list = group_list;
814 ssl->handshake->group_list_heap_allocated = 1;
815 }
816 else
817 {
818 ssl->handshake->group_list = ssl->conf->group_list;
819 ssl->handshake->group_list_heap_allocated = 0;
820 }
821#endif /* MBEDTLS_DEPRECATED_REMOVED */
822#endif /* MBEDTLS_ECP_C */
823
Jerry Yuf017ee42022-01-12 15:49:48 +0800824#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
825#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Jerry Yua69269a2022-01-17 21:06:01 +0800826#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yu713013f2022-01-17 18:16:35 +0800827 /* Heap allocate and translate sig_hashes from internal hash identifiers to
828 signature algorithms IANA identifiers. */
829 if ( mbedtls_ssl_conf_is_tls12_only( ssl->conf ) &&
Jerry Yuf017ee42022-01-12 15:49:48 +0800830 ssl->conf->sig_hashes != NULL )
831 {
832 const int *md;
833 const int *sig_hashes = ssl->conf->sig_hashes;
Jerry Yub476a442022-01-21 18:14:45 +0800834 size_t sig_algs_len = 0;
Jerry Yuf017ee42022-01-12 15:49:48 +0800835 uint16_t *p;
836
Jerry Yub476a442022-01-21 18:14:45 +0800837#if defined(static_assert)
838 static_assert( MBEDTLS_SSL_MAX_SIG_ALG_LIST_LEN
839 <= ( SIZE_MAX - ( 2 * sizeof(uint16_t) ) ),
840 "MBEDTLS_SSL_MAX_SIG_ALG_LIST_LEN too big" );
Jerry Yua68dca22022-01-20 16:28:27 +0800841#endif
842
Jerry Yuf017ee42022-01-12 15:49:48 +0800843 for( md = sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
844 {
845 if( mbedtls_ssl_hash_from_md_alg( *md ) == MBEDTLS_SSL_HASH_NONE )
846 continue;
Jerry Yub476a442022-01-21 18:14:45 +0800847#if defined(MBEDTLS_ECDSA_C)
848 sig_algs_len += sizeof( uint16_t );
849#endif
Jerry Yua68dca22022-01-20 16:28:27 +0800850
Jerry Yub476a442022-01-21 18:14:45 +0800851#if defined(MBEDTLS_RSA_C)
852 sig_algs_len += sizeof( uint16_t );
853#endif
854 if( sig_algs_len > MBEDTLS_SSL_MAX_SIG_ALG_LIST_LEN )
855 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
Jerry Yuf017ee42022-01-12 15:49:48 +0800856 }
857
Jerry Yub476a442022-01-21 18:14:45 +0800858 if( sig_algs_len < MBEDTLS_SSL_MIN_SIG_ALG_LIST_LEN )
Jerry Yuf017ee42022-01-12 15:49:48 +0800859 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
860
Jerry Yub476a442022-01-21 18:14:45 +0800861 ssl->handshake->sig_algs = mbedtls_calloc( 1, sig_algs_len +
862 sizeof( uint16_t ));
Jerry Yuf017ee42022-01-12 15:49:48 +0800863 if( ssl->handshake->sig_algs == NULL )
864 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
865
866 p = (uint16_t *)ssl->handshake->sig_algs;
867 for( md = sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
868 {
869 unsigned char hash = mbedtls_ssl_hash_from_md_alg( *md );
870 if( hash == MBEDTLS_SSL_HASH_NONE )
871 continue;
Jerry Yu6106fdc2022-01-12 16:36:14 +0800872#if defined(MBEDTLS_ECDSA_C)
Jerry Yuf017ee42022-01-12 15:49:48 +0800873 *p = (( hash << 8 ) | MBEDTLS_SSL_SIG_ECDSA);
874 p++;
Jerry Yu6106fdc2022-01-12 16:36:14 +0800875#endif
876#if defined(MBEDTLS_RSA_C)
Jerry Yuf017ee42022-01-12 15:49:48 +0800877 *p = (( hash << 8 ) | MBEDTLS_SSL_SIG_RSA);
878 p++;
Jerry Yu6106fdc2022-01-12 16:36:14 +0800879#endif
Jerry Yuf017ee42022-01-12 15:49:48 +0800880 }
Gabor Mezei15b95a62022-05-09 16:37:58 +0200881 *p = MBEDTLS_TLS_SIG_NONE;
Jerry Yuf017ee42022-01-12 15:49:48 +0800882 ssl->handshake->sig_algs_heap_allocated = 1;
883 }
884 else
Jerry Yua69269a2022-01-17 21:06:01 +0800885#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Jerry Yuf017ee42022-01-12 15:49:48 +0800886 {
Jerry Yuf017ee42022-01-12 15:49:48 +0800887 ssl->handshake->sig_algs_heap_allocated = 0;
888 }
Jerry Yucc539102022-06-27 16:27:35 +0800889#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Jerry Yuf017ee42022-01-12 15:49:48 +0800890#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +0000891 return( 0 );
892}
893
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +0200894#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +0200895/* Dummy cookie callbacks for defaults */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200896MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +0200897static int ssl_cookie_write_dummy( void *ctx,
898 unsigned char **p, unsigned char *end,
899 const unsigned char *cli_id, size_t cli_id_len )
900{
901 ((void) ctx);
902 ((void) p);
903 ((void) end);
904 ((void) cli_id);
905 ((void) cli_id_len);
906
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200907 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +0200908}
909
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200910MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +0200911static int ssl_cookie_check_dummy( void *ctx,
912 const unsigned char *cookie, size_t cookie_len,
913 const unsigned char *cli_id, size_t cli_id_len )
914{
915 ((void) ctx);
916 ((void) cookie);
917 ((void) cookie_len);
918 ((void) cli_id);
919 ((void) cli_id_len);
920
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200921 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +0200922}
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +0200923#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +0200924
Paul Bakker5121ce52009-01-03 21:22:43 +0000925/*
926 * Initialize an SSL context
927 */
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200928void mbedtls_ssl_init( mbedtls_ssl_context *ssl )
929{
930 memset( ssl, 0, sizeof( mbedtls_ssl_context ) );
931}
932
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200933MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu60835a82021-08-04 10:13:52 +0800934static int ssl_conf_version_check( const mbedtls_ssl_context *ssl )
935{
Ronald Cron086ee0b2022-03-15 15:18:51 +0100936 const mbedtls_ssl_config *conf = ssl->conf;
937
Ronald Cron6f135e12021-12-08 16:57:54 +0100938#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Ronald Cron086ee0b2022-03-15 15:18:51 +0100939 if( mbedtls_ssl_conf_is_tls13_only( conf ) )
940 {
XiaokangQianed582dd2022-04-13 08:21:05 +0000941 if( conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
942 {
943 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS 1.3 is not yet supported." ) );
944 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
945 }
946
Jerry Yu60835a82021-08-04 10:13:52 +0800947 MBEDTLS_SSL_DEBUG_MSG( 4, ( "The SSL configuration is tls13 only." ) );
948 return( 0 );
949 }
950#endif
951
952#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Ronald Cron086ee0b2022-03-15 15:18:51 +0100953 if( mbedtls_ssl_conf_is_tls12_only( conf ) )
Jerry Yu60835a82021-08-04 10:13:52 +0800954 {
955 MBEDTLS_SSL_DEBUG_MSG( 4, ( "The SSL configuration is tls12 only." ) );
956 return( 0 );
957 }
958#endif
959
Ronald Cron6f135e12021-12-08 16:57:54 +0100960#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
Ronald Cron086ee0b2022-03-15 15:18:51 +0100961 if( mbedtls_ssl_conf_is_hybrid_tls12_tls13( conf ) )
Jerry Yu60835a82021-08-04 10:13:52 +0800962 {
XiaokangQianed582dd2022-04-13 08:21:05 +0000963 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
964 {
965 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS not yet supported in Hybrid TLS 1.3 + TLS 1.2" ) );
966 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
967 }
968
XiaokangQian8f9dfe42022-04-15 02:52:39 +0000969 if( conf->endpoint == MBEDTLS_SSL_IS_SERVER )
970 {
971 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLS 1.3 server is not supported yet." ) );
972 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
973 }
974
975
Ronald Crone1d3f062022-02-10 14:50:54 +0100976 MBEDTLS_SSL_DEBUG_MSG( 4, ( "The SSL configuration is TLS 1.3 or TLS 1.2." ) );
977 return( 0 );
Jerry Yu60835a82021-08-04 10:13:52 +0800978 }
979#endif
980
981 MBEDTLS_SSL_DEBUG_MSG( 1, ( "The SSL configuration is invalid." ) );
982 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
983}
984
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200985MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu60835a82021-08-04 10:13:52 +0800986static int ssl_conf_check(const mbedtls_ssl_context *ssl)
987{
988 int ret;
989 ret = ssl_conf_version_check( ssl );
990 if( ret != 0 )
991 return( ret );
992
993 /* Space for further checks */
994
995 return( 0 );
996}
997
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +0200998/*
999 * Setup an SSL context
1000 */
Hanno Becker2a43f6f2018-08-10 11:12:52 +01001001
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02001002int mbedtls_ssl_setup( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +02001003 const mbedtls_ssl_config *conf )
Paul Bakker5121ce52009-01-03 21:22:43 +00001004{
Janos Follath865b3eb2019-12-16 11:46:15 +00001005 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Darryl Greenb33cc762019-11-28 14:29:44 +00001006 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
1007 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
Paul Bakker5121ce52009-01-03 21:22:43 +00001008
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02001009 ssl->conf = conf;
Paul Bakker62f2dee2012-09-28 07:31:51 +00001010
Jerry Yu60835a82021-08-04 10:13:52 +08001011 if( ( ret = ssl_conf_check( ssl ) ) != 0 )
1012 return( ret );
1013
Paul Bakker62f2dee2012-09-28 07:31:51 +00001014 /*
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01001015 * Prepare base structures
Paul Bakker62f2dee2012-09-28 07:31:51 +00001016 */
k-stachowiakc9a5f022018-07-24 13:53:31 +02001017
1018 /* Set to NULL in case of an error condition */
1019 ssl->out_buf = NULL;
k-stachowiaka47911c2018-07-04 17:41:58 +02001020
Darryl Greenb33cc762019-11-28 14:29:44 +00001021#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1022 ssl->in_buf_len = in_buf_len;
1023#endif
1024 ssl->in_buf = mbedtls_calloc( 1, in_buf_len );
Angus Grattond8213d02016-05-25 20:56:48 +10001025 if( ssl->in_buf == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001026 {
Paul Elliottd48d5c62021-01-07 14:47:05 +00001027 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", in_buf_len ) );
k-stachowiak9f7798e2018-07-31 16:52:32 +02001028 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02001029 goto error;
Angus Grattond8213d02016-05-25 20:56:48 +10001030 }
1031
Darryl Greenb33cc762019-11-28 14:29:44 +00001032#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1033 ssl->out_buf_len = out_buf_len;
1034#endif
1035 ssl->out_buf = mbedtls_calloc( 1, out_buf_len );
Angus Grattond8213d02016-05-25 20:56:48 +10001036 if( ssl->out_buf == NULL )
1037 {
Paul Elliottd48d5c62021-01-07 14:47:05 +00001038 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", out_buf_len ) );
k-stachowiak9f7798e2018-07-31 16:52:32 +02001039 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02001040 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00001041 }
1042
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00001043 mbedtls_ssl_reset_in_out_pointers( ssl );
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02001044
Johan Pascalb62bb512015-12-03 21:56:45 +01001045#if defined(MBEDTLS_SSL_DTLS_SRTP)
Ron Eldor3adb9922017-12-21 10:15:08 +02001046 memset( &ssl->dtls_srtp_info, 0, sizeof(ssl->dtls_srtp_info) );
Johan Pascalb62bb512015-12-03 21:56:45 +01001047#endif
1048
Paul Bakker48916f92012-09-16 19:57:18 +00001049 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
k-stachowiaka47911c2018-07-04 17:41:58 +02001050 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00001051
1052 return( 0 );
k-stachowiaka47911c2018-07-04 17:41:58 +02001053
1054error:
1055 mbedtls_free( ssl->in_buf );
1056 mbedtls_free( ssl->out_buf );
1057
1058 ssl->conf = NULL;
1059
Darryl Greenb33cc762019-11-28 14:29:44 +00001060#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1061 ssl->in_buf_len = 0;
1062 ssl->out_buf_len = 0;
1063#endif
k-stachowiaka47911c2018-07-04 17:41:58 +02001064 ssl->in_buf = NULL;
1065 ssl->out_buf = NULL;
1066
1067 ssl->in_hdr = NULL;
1068 ssl->in_ctr = NULL;
1069 ssl->in_len = NULL;
1070 ssl->in_iv = NULL;
1071 ssl->in_msg = NULL;
1072
1073 ssl->out_hdr = NULL;
1074 ssl->out_ctr = NULL;
1075 ssl->out_len = NULL;
1076 ssl->out_iv = NULL;
1077 ssl->out_msg = NULL;
1078
k-stachowiak9f7798e2018-07-31 16:52:32 +02001079 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001080}
1081
1082/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00001083 * Reset an initialized and used SSL context for re-use while retaining
1084 * all application-set variables, function pointers and data.
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02001085 *
1086 * If partial is non-zero, keep data in the input buffer and client ID.
1087 * (Use when a DTLS client reconnects from the same port.)
Paul Bakker7eb013f2011-10-06 12:37:39 +00001088 */
XiaokangQian78b1fa72022-01-19 06:56:30 +00001089void mbedtls_ssl_session_reset_msg_layer( mbedtls_ssl_context *ssl,
1090 int partial )
Paul Bakker7eb013f2011-10-06 12:37:39 +00001091{
Darryl Greenb33cc762019-11-28 14:29:44 +00001092#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1093 size_t in_buf_len = ssl->in_buf_len;
1094 size_t out_buf_len = ssl->out_buf_len;
1095#else
1096 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
1097 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
1098#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001099
Hanno Beckerb0302c42021-08-03 09:39:42 +01001100#if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || !defined(MBEDTLS_SSL_SRV_C)
1101 partial = 0;
Hanno Becker7e772132018-08-10 12:38:21 +01001102#endif
1103
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02001104 /* Cancel any possibly running timer */
Hanno Becker0f57a652020-02-05 10:37:26 +00001105 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02001106
Hanno Beckerb0302c42021-08-03 09:39:42 +01001107 mbedtls_ssl_reset_in_out_pointers( ssl );
1108
1109 /* Reset incoming message parsing */
1110 ssl->in_offt = NULL;
1111 ssl->nb_zero = 0;
1112 ssl->in_msgtype = 0;
1113 ssl->in_msglen = 0;
1114 ssl->in_hslen = 0;
1115 ssl->keep_current_message = 0;
1116 ssl->transform_in = NULL;
1117
1118#if defined(MBEDTLS_SSL_PROTO_DTLS)
1119 ssl->next_record_offset = 0;
1120 ssl->in_epoch = 0;
1121#endif
1122
1123 /* Keep current datagram if partial == 1 */
1124 if( partial == 0 )
1125 {
1126 ssl->in_left = 0;
1127 memset( ssl->in_buf, 0, in_buf_len );
1128 }
1129
Ronald Cronad8c17b2022-06-10 17:18:09 +02001130 ssl->send_alert = 0;
1131
Hanno Beckerb0302c42021-08-03 09:39:42 +01001132 /* Reset outgoing message writing */
1133 ssl->out_msgtype = 0;
1134 ssl->out_msglen = 0;
1135 ssl->out_left = 0;
1136 memset( ssl->out_buf, 0, out_buf_len );
1137 memset( ssl->cur_out_ctr, 0, sizeof( ssl->cur_out_ctr ) );
1138 ssl->transform_out = NULL;
1139
1140#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
1141 mbedtls_ssl_dtls_replay_reset( ssl );
1142#endif
1143
XiaokangQian2b01dc32022-01-21 02:53:13 +00001144#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Beckerb0302c42021-08-03 09:39:42 +01001145 if( ssl->transform )
1146 {
1147 mbedtls_ssl_transform_free( ssl->transform );
1148 mbedtls_free( ssl->transform );
1149 ssl->transform = NULL;
1150 }
XiaokangQian2b01dc32022-01-21 02:53:13 +00001151#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1152
XiaokangQian2b01dc32022-01-21 02:53:13 +00001153#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1154 mbedtls_ssl_transform_free( ssl->transform_application );
1155 mbedtls_free( ssl->transform_application );
1156 ssl->transform_application = NULL;
1157
1158 if( ssl->handshake != NULL )
1159 {
1160 mbedtls_ssl_transform_free( ssl->handshake->transform_earlydata );
1161 mbedtls_free( ssl->handshake->transform_earlydata );
1162 ssl->handshake->transform_earlydata = NULL;
1163
1164 mbedtls_ssl_transform_free( ssl->handshake->transform_handshake );
1165 mbedtls_free( ssl->handshake->transform_handshake );
1166 ssl->handshake->transform_handshake = NULL;
1167 }
1168
XiaokangQian2b01dc32022-01-21 02:53:13 +00001169#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerb0302c42021-08-03 09:39:42 +01001170}
1171
1172int mbedtls_ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial )
1173{
1174 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1175
1176 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
1177
XiaokangQian78b1fa72022-01-19 06:56:30 +00001178 mbedtls_ssl_session_reset_msg_layer( ssl, partial );
Hanno Beckerb0302c42021-08-03 09:39:42 +01001179
1180 /* Reset renegotiation state */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001181#if defined(MBEDTLS_SSL_RENEGOTIATION)
1182 ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001183 ssl->renego_records_seen = 0;
Paul Bakker48916f92012-09-16 19:57:18 +00001184
1185 ssl->verify_data_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001186 memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
1187 memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001188#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001189 ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +00001190
Hanno Beckerb0302c42021-08-03 09:39:42 +01001191 ssl->session_in = NULL;
Hanno Becker78640902018-08-13 16:35:15 +01001192 ssl->session_out = NULL;
Paul Bakkerc0463502013-02-14 11:19:38 +01001193 if( ssl->session )
1194 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001195 mbedtls_ssl_session_free( ssl->session );
1196 mbedtls_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01001197 ssl->session = NULL;
1198 }
1199
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001200#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02001201 ssl->alpn_chosen = NULL;
1202#endif
1203
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02001204#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Hanno Becker4ccbf062018-08-10 11:20:38 +01001205#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE)
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02001206 if( partial == 0 )
Hanno Becker4ccbf062018-08-10 11:20:38 +01001207#endif
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02001208 {
1209 mbedtls_free( ssl->cli_id );
1210 ssl->cli_id = NULL;
1211 ssl->cli_id_len = 0;
1212 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02001213#endif
1214
Paul Bakker48916f92012-09-16 19:57:18 +00001215 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
1216 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001217
1218 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00001219}
1220
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02001221/*
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02001222 * Reset an initialized and used SSL context for re-use while retaining
1223 * all application-set variables, function pointers and data.
1224 */
1225int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl )
1226{
Hanno Becker43aefe22020-02-05 10:44:56 +00001227 return( mbedtls_ssl_session_reset_int( ssl, 0 ) );
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02001228}
1229
1230/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001231 * SSL set accessors
1232 */
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001233void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint )
Paul Bakker5121ce52009-01-03 21:22:43 +00001234{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001235 conf->endpoint = endpoint;
Paul Bakker5121ce52009-01-03 21:22:43 +00001236}
1237
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02001238void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport )
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01001239{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001240 conf->transport = transport;
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01001241}
1242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001243#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001244void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode )
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02001245{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001246 conf->anti_replay = mode;
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02001247}
1248#endif
1249
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001250void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit )
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02001251{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001252 conf->badmac_limit = limit;
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02001253}
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02001254
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001255#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker04da1892018-08-14 13:22:10 +01001256
Hanno Becker1841b0a2018-08-24 11:13:57 +01001257void mbedtls_ssl_set_datagram_packing( mbedtls_ssl_context *ssl,
1258 unsigned allow_packing )
Hanno Becker04da1892018-08-14 13:22:10 +01001259{
1260 ssl->disable_datagram_packing = !allow_packing;
1261}
1262
1263void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf,
1264 uint32_t min, uint32_t max )
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02001265{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001266 conf->hs_timeout_min = min;
1267 conf->hs_timeout_max = max;
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02001268}
1269#endif
1270
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001271void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode )
Paul Bakker5121ce52009-01-03 21:22:43 +00001272{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001273 conf->authmode = authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00001274}
1275
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001276#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001277void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02001278 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00001279 void *p_vrfy )
1280{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001281 conf->f_vrfy = f_vrfy;
1282 conf->p_vrfy = p_vrfy;
Paul Bakkerb63b0af2011-01-13 17:54:59 +00001283}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001284#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00001285
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001286void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf,
Paul Bakkera3d195c2011-11-27 21:07:34 +00001287 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00001288 void *p_rng )
1289{
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01001290 conf->f_rng = f_rng;
1291 conf->p_rng = p_rng;
Paul Bakker5121ce52009-01-03 21:22:43 +00001292}
1293
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001294void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardfd474232015-06-23 16:34:24 +02001295 void (*f_dbg)(void *, int, const char *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00001296 void *p_dbg )
1297{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001298 conf->f_dbg = f_dbg;
1299 conf->p_dbg = p_dbg;
Paul Bakker5121ce52009-01-03 21:22:43 +00001300}
1301
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001302void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02001303 void *p_bio,
Simon Butchere846b512016-03-01 17:31:49 +00001304 mbedtls_ssl_send_t *f_send,
1305 mbedtls_ssl_recv_t *f_recv,
1306 mbedtls_ssl_recv_timeout_t *f_recv_timeout )
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02001307{
1308 ssl->p_bio = p_bio;
1309 ssl->f_send = f_send;
1310 ssl->f_recv = f_recv;
1311 ssl->f_recv_timeout = f_recv_timeout;
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01001312}
1313
Manuel Pégourié-Gonnard6e7aaca2018-08-20 10:37:23 +02001314#if defined(MBEDTLS_SSL_PROTO_DTLS)
1315void mbedtls_ssl_set_mtu( mbedtls_ssl_context *ssl, uint16_t mtu )
1316{
1317 ssl->mtu = mtu;
1318}
1319#endif
1320
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001321void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout )
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01001322{
1323 conf->read_timeout = timeout;
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02001324}
1325
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02001326void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl,
1327 void *p_timer,
Simon Butchere846b512016-03-01 17:31:49 +00001328 mbedtls_ssl_set_timer_t *f_set_timer,
1329 mbedtls_ssl_get_timer_t *f_get_timer )
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02001330{
1331 ssl->p_timer = p_timer;
1332 ssl->f_set_timer = f_set_timer;
1333 ssl->f_get_timer = f_get_timer;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02001334
1335 /* Make sure we start with no timer running */
Hanno Becker0f57a652020-02-05 10:37:26 +00001336 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02001337}
1338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001339#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001340void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf,
Hanno Beckera637ff62021-04-15 08:42:48 +01001341 void *p_cache,
1342 mbedtls_ssl_cache_get_t *f_get_cache,
1343 mbedtls_ssl_cache_set_t *f_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00001344{
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01001345 conf->p_cache = p_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001346 conf->f_get_cache = f_get_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001347 conf->f_set_cache = f_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00001348}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001349#endif /* MBEDTLS_SSL_SRV_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001350
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001351#if defined(MBEDTLS_SSL_CLI_C)
1352int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00001353{
Janos Follath865b3eb2019-12-16 11:46:15 +00001354 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02001355
1356 if( ssl == NULL ||
1357 session == NULL ||
1358 ssl->session_negotiate == NULL ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001359 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02001360 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001361 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02001362 }
1363
Hanno Beckere810bbc2021-05-14 16:01:05 +01001364 if( ssl->handshake->resume == 1 )
1365 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
1366
Hanno Becker52055ae2019-02-06 14:30:46 +00001367 if( ( ret = mbedtls_ssl_session_copy( ssl->session_negotiate,
1368 session ) ) != 0 )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02001369 return( ret );
1370
Paul Bakker0a597072012-09-25 21:55:46 +00001371 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02001372
1373 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001374}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001375#endif /* MBEDTLS_SSL_CLI_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001376
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01001377void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf,
1378 const int *ciphersuites )
1379{
Hanno Beckerd60b6c62021-04-29 12:04:11 +01001380 conf->ciphersuite_list = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00001381}
1382
Ronald Cron6f135e12021-12-08 16:57:54 +01001383#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yucadebe52021-08-24 10:36:45 +08001384void mbedtls_ssl_conf_tls13_key_exchange_modes( mbedtls_ssl_config *conf,
Hanno Becker71f1ed62021-07-24 06:01:47 +01001385 const int kex_modes )
1386{
Xiaofei Bai746f9482021-11-12 08:53:56 +00001387 conf->tls13_kex_modes = kex_modes & MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL;
Hanno Becker71f1ed62021-07-24 06:01:47 +01001388}
Ronald Cron6f135e12021-12-08 16:57:54 +01001389#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Becker71f1ed62021-07-24 06:01:47 +01001390
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001391#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02001392void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf,
Nicholas Wilson2088e2e2015-09-08 16:53:18 +01001393 const mbedtls_x509_crt_profile *profile )
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02001394{
1395 conf->cert_profile = profile;
1396}
1397
Glenn Strauss36872db2022-01-22 05:06:31 -05001398static void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert )
1399{
1400 mbedtls_ssl_key_cert *cur = key_cert, *next;
1401
1402 while( cur != NULL )
1403 {
1404 next = cur->next;
1405 mbedtls_free( cur );
1406 cur = next;
1407 }
1408}
1409
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02001410/* Append a new keycert entry to a (possibly empty) list */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001411MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02001412static int ssl_append_key_cert( mbedtls_ssl_key_cert **head,
1413 mbedtls_x509_crt *cert,
1414 mbedtls_pk_context *key )
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02001415{
niisato8ee24222018-06-25 19:05:48 +09001416 mbedtls_ssl_key_cert *new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02001417
Glenn Strauss36872db2022-01-22 05:06:31 -05001418 if( cert == NULL )
1419 {
1420 /* Free list if cert is null */
1421 ssl_key_cert_free( *head );
1422 *head = NULL;
1423 return( 0 );
1424 }
1425
niisato8ee24222018-06-25 19:05:48 +09001426 new_cert = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) );
1427 if( new_cert == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02001428 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02001429
niisato8ee24222018-06-25 19:05:48 +09001430 new_cert->cert = cert;
1431 new_cert->key = key;
1432 new_cert->next = NULL;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02001433
Glenn Strauss36872db2022-01-22 05:06:31 -05001434 /* Update head if the list was null, else add to the end */
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02001435 if( *head == NULL )
Paul Bakker0333b972013-11-04 17:08:28 +01001436 {
niisato8ee24222018-06-25 19:05:48 +09001437 *head = new_cert;
Paul Bakker0333b972013-11-04 17:08:28 +01001438 }
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02001439 else
1440 {
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02001441 mbedtls_ssl_key_cert *cur = *head;
1442 while( cur->next != NULL )
1443 cur = cur->next;
niisato8ee24222018-06-25 19:05:48 +09001444 cur->next = new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02001445 }
1446
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02001447 return( 0 );
1448}
1449
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001450int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02001451 mbedtls_x509_crt *own_cert,
1452 mbedtls_pk_context *pk_key )
1453{
Manuel Pégourié-Gonnard17a40cd2015-05-10 23:17:17 +02001454 return( ssl_append_key_cert( &conf->key_cert, own_cert, pk_key ) );
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02001455}
1456
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001457void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01001458 mbedtls_x509_crt *ca_chain,
1459 mbedtls_x509_crl *ca_crl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001460{
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01001461 conf->ca_chain = ca_chain;
1462 conf->ca_crl = ca_crl;
Hanno Becker5adaad92019-03-27 16:54:37 +00001463
1464#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
1465 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
1466 * cannot be used together. */
1467 conf->f_ca_cb = NULL;
1468 conf->p_ca_cb = NULL;
1469#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
Paul Bakker5121ce52009-01-03 21:22:43 +00001470}
Hanno Becker5adaad92019-03-27 16:54:37 +00001471
1472#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
1473void mbedtls_ssl_conf_ca_cb( mbedtls_ssl_config *conf,
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00001474 mbedtls_x509_crt_ca_cb_t f_ca_cb,
Hanno Becker5adaad92019-03-27 16:54:37 +00001475 void *p_ca_cb )
1476{
1477 conf->f_ca_cb = f_ca_cb;
1478 conf->p_ca_cb = p_ca_cb;
1479
1480 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
1481 * cannot be used together. */
1482 conf->ca_chain = NULL;
1483 conf->ca_crl = NULL;
1484}
1485#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001486#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00001487
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02001488#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Glenn Strauss69894072022-01-24 12:58:00 -05001489const unsigned char *mbedtls_ssl_get_hs_sni( mbedtls_ssl_context *ssl,
1490 size_t *name_len )
1491{
1492 *name_len = ssl->handshake->sni_name_len;
1493 return( ssl->handshake->sni_name );
1494}
1495
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02001496int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl,
1497 mbedtls_x509_crt *own_cert,
1498 mbedtls_pk_context *pk_key )
1499{
1500 return( ssl_append_key_cert( &ssl->handshake->sni_key_cert,
1501 own_cert, pk_key ) );
1502}
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02001503
1504void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl,
1505 mbedtls_x509_crt *ca_chain,
1506 mbedtls_x509_crl *ca_crl )
1507{
1508 ssl->handshake->sni_ca_chain = ca_chain;
1509 ssl->handshake->sni_ca_crl = ca_crl;
1510}
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02001511
Glenn Strauss999ef702022-03-11 01:37:23 -05001512#if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
1513void mbedtls_ssl_set_hs_dn_hints( mbedtls_ssl_context *ssl,
1514 const mbedtls_x509_crt *crt)
1515{
1516 ssl->handshake->dn_hints = crt;
1517}
1518#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
1519
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02001520void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl,
1521 int authmode )
1522{
1523 ssl->handshake->sni_authmode = authmode;
1524}
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02001525#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
1526
Hanno Becker8927c832019-04-03 12:52:50 +01001527#if defined(MBEDTLS_X509_CRT_PARSE_C)
1528void mbedtls_ssl_set_verify( mbedtls_ssl_context *ssl,
1529 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
1530 void *p_vrfy )
1531{
1532 ssl->f_vrfy = f_vrfy;
1533 ssl->p_vrfy = p_vrfy;
1534}
1535#endif
1536
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02001537#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02001538/*
1539 * Set EC J-PAKE password for current handshake
1540 */
1541int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,
1542 const unsigned char *pw,
1543 size_t pw_len )
1544{
1545 mbedtls_ecjpake_role role;
1546
Janos Follath8eb64132016-06-03 15:40:57 +01001547 if( ssl->handshake == NULL || ssl->conf == NULL )
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02001548 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1549
1550 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
1551 role = MBEDTLS_ECJPAKE_SERVER;
1552 else
1553 role = MBEDTLS_ECJPAKE_CLIENT;
1554
1555 return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx,
1556 role,
1557 MBEDTLS_MD_SHA256,
1558 MBEDTLS_ECP_DP_SECP256R1,
1559 pw, pw_len ) );
1560}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02001561#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02001562
Gilles Peskineeccd8882020-03-10 12:19:08 +01001563#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001564
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001565MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker2ed3dce2021-04-19 21:59:14 +01001566static int ssl_conf_psk_is_configured( mbedtls_ssl_config const *conf )
1567{
1568#if defined(MBEDTLS_USE_PSA_CRYPTO)
1569 if( !mbedtls_svc_key_id_is_null( conf->psk_opaque ) )
1570 return( 1 );
1571#endif /* MBEDTLS_USE_PSA_CRYPTO */
Hanno Becker2ed3dce2021-04-19 21:59:14 +01001572 if( conf->psk != NULL )
1573 return( 1 );
1574
1575 return( 0 );
1576}
1577
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001578static void ssl_conf_remove_psk( mbedtls_ssl_config *conf )
1579{
1580 /* Remove reference to existing PSK, if any. */
1581#if defined(MBEDTLS_USE_PSA_CRYPTO)
Ronald Croncf56a0a2020-08-04 09:51:30 +02001582 if( ! mbedtls_svc_key_id_is_null( conf->psk_opaque ) )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001583 {
1584 /* The maintenance of the PSK key slot is the
1585 * user's responsibility. */
Ronald Croncf56a0a2020-08-04 09:51:30 +02001586 conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001587 }
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001588#endif /* MBEDTLS_USE_PSA_CRYPTO */
1589 if( conf->psk != NULL )
1590 {
1591 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
1592
1593 mbedtls_free( conf->psk );
1594 conf->psk = NULL;
1595 conf->psk_len = 0;
1596 }
1597
1598 /* Remove reference to PSK identity, if any. */
1599 if( conf->psk_identity != NULL )
1600 {
1601 mbedtls_free( conf->psk_identity );
1602 conf->psk_identity = NULL;
1603 conf->psk_identity_len = 0;
1604 }
1605}
1606
Hanno Becker7390c712018-11-15 13:33:04 +00001607/* This function assumes that PSK identity in the SSL config is unset.
1608 * It checks that the provided identity is well-formed and attempts
1609 * to make a copy of it in the SSL config.
1610 * On failure, the PSK identity in the config remains unset. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001611MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker7390c712018-11-15 13:33:04 +00001612static int ssl_conf_set_psk_identity( mbedtls_ssl_config *conf,
1613 unsigned char const *psk_identity,
1614 size_t psk_identity_len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001615{
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02001616 /* Identity len will be encoded on two bytes */
Hanno Becker7390c712018-11-15 13:33:04 +00001617 if( psk_identity == NULL ||
1618 ( psk_identity_len >> 16 ) != 0 ||
Angus Grattond8213d02016-05-25 20:56:48 +10001619 psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02001620 {
1621 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1622 }
1623
Hanno Becker7390c712018-11-15 13:33:04 +00001624 conf->psk_identity = mbedtls_calloc( 1, psk_identity_len );
1625 if( conf->psk_identity == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02001626 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker6db455e2013-09-18 17:29:31 +02001627
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01001628 conf->psk_identity_len = psk_identity_len;
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01001629 memcpy( conf->psk_identity, psk_identity, conf->psk_identity_len );
Paul Bakker5ad403f2013-09-18 21:21:30 +02001630
1631 return( 0 );
Paul Bakker6db455e2013-09-18 17:29:31 +02001632}
1633
Hanno Becker7390c712018-11-15 13:33:04 +00001634int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
1635 const unsigned char *psk, size_t psk_len,
1636 const unsigned char *psk_identity, size_t psk_identity_len )
1637{
Janos Follath865b3eb2019-12-16 11:46:15 +00001638 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker2ed3dce2021-04-19 21:59:14 +01001639
1640 /* We currently only support one PSK, raw or opaque. */
1641 if( ssl_conf_psk_is_configured( conf ) )
1642 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Hanno Becker7390c712018-11-15 13:33:04 +00001643
1644 /* Check and set raw PSK */
Piotr Nowicki9926eaf2019-11-20 14:54:36 +01001645 if( psk == NULL )
Hanno Becker7390c712018-11-15 13:33:04 +00001646 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Piotr Nowicki9926eaf2019-11-20 14:54:36 +01001647 if( psk_len == 0 )
1648 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1649 if( psk_len > MBEDTLS_PSK_MAX_LEN )
1650 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1651
Hanno Becker7390c712018-11-15 13:33:04 +00001652 if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
1653 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
1654 conf->psk_len = psk_len;
1655 memcpy( conf->psk, psk, conf->psk_len );
1656
1657 /* Check and set PSK Identity */
1658 ret = ssl_conf_set_psk_identity( conf, psk_identity, psk_identity_len );
1659 if( ret != 0 )
1660 ssl_conf_remove_psk( conf );
1661
1662 return( ret );
1663}
1664
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001665static void ssl_remove_psk( mbedtls_ssl_context *ssl )
1666{
1667#if defined(MBEDTLS_USE_PSA_CRYPTO)
Ronald Croncf56a0a2020-08-04 09:51:30 +02001668 if( ! mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001669 {
Neil Armstrong501c9322022-05-03 09:35:09 +02001670 /* The maintenance of the external PSK key slot is the
1671 * user's responsibility. */
1672 if( ssl->handshake->psk_opaque_is_internal )
1673 {
1674 psa_destroy_key( ssl->handshake->psk_opaque );
1675 ssl->handshake->psk_opaque_is_internal = 0;
1676 }
Ronald Croncf56a0a2020-08-04 09:51:30 +02001677 ssl->handshake->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001678 }
Neil Armstronge952a302022-05-03 10:22:14 +02001679#else
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001680 if( ssl->handshake->psk != NULL )
1681 {
1682 mbedtls_platform_zeroize( ssl->handshake->psk,
1683 ssl->handshake->psk_len );
1684 mbedtls_free( ssl->handshake->psk );
1685 ssl->handshake->psk_len = 0;
1686 }
Neil Armstronge952a302022-05-03 10:22:14 +02001687#endif /* MBEDTLS_USE_PSA_CRYPTO */
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001688}
1689
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001690int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl,
1691 const unsigned char *psk, size_t psk_len )
1692{
Neil Armstrong501c9322022-05-03 09:35:09 +02001693#if defined(MBEDTLS_USE_PSA_CRYPTO)
1694 psa_key_attributes_t key_attributes = psa_key_attributes_init();
1695 psa_status_t status;
1696 psa_algorithm_t alg;
1697 mbedtls_svc_key_id_t key;
1698#endif /* MBEDTLS_USE_PSA_CRYPTO */
1699
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001700 if( psk == NULL || ssl->handshake == NULL )
1701 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1702
1703 if( psk_len > MBEDTLS_PSK_MAX_LEN )
1704 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1705
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001706 ssl_remove_psk( ssl );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001707
Neil Armstrong501c9322022-05-03 09:35:09 +02001708#if defined(MBEDTLS_USE_PSA_CRYPTO)
1709 if( ssl->handshake->ciphersuite_info->mac == MBEDTLS_MD_SHA384)
1710 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
1711 else
1712 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
1713
1714 psa_set_key_usage_flags( &key_attributes, PSA_KEY_USAGE_DERIVE );
1715 psa_set_key_algorithm( &key_attributes, alg );
1716 psa_set_key_type( &key_attributes, PSA_KEY_TYPE_DERIVE );
1717
1718 status = psa_import_key( &key_attributes, psk, psk_len, &key );
1719 if( status != PSA_SUCCESS )
1720 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
1721
1722 /* Allow calling psa_destroy_key() on psk remove */
1723 ssl->handshake->psk_opaque_is_internal = 1;
1724 return mbedtls_ssl_set_hs_psk_opaque( ssl, key );
1725#else
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001726 if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02001727 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001728
1729 ssl->handshake->psk_len = psk_len;
1730 memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len );
1731
1732 return( 0 );
Neil Armstrong501c9322022-05-03 09:35:09 +02001733#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001734}
1735
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001736#if defined(MBEDTLS_USE_PSA_CRYPTO)
1737int mbedtls_ssl_conf_psk_opaque( mbedtls_ssl_config *conf,
Andrzej Kurek03e01462022-01-03 12:53:24 +01001738 mbedtls_svc_key_id_t psk,
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001739 const unsigned char *psk_identity,
1740 size_t psk_identity_len )
1741{
Janos Follath865b3eb2019-12-16 11:46:15 +00001742 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker2ed3dce2021-04-19 21:59:14 +01001743
1744 /* We currently only support one PSK, raw or opaque. */
1745 if( ssl_conf_psk_is_configured( conf ) )
1746 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001747
Hanno Becker7390c712018-11-15 13:33:04 +00001748 /* Check and set opaque PSK */
Ronald Croncf56a0a2020-08-04 09:51:30 +02001749 if( mbedtls_svc_key_id_is_null( psk ) )
Hanno Becker7390c712018-11-15 13:33:04 +00001750 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Ronald Croncf56a0a2020-08-04 09:51:30 +02001751 conf->psk_opaque = psk;
Hanno Becker7390c712018-11-15 13:33:04 +00001752
1753 /* Check and set PSK Identity */
1754 ret = ssl_conf_set_psk_identity( conf, psk_identity,
1755 psk_identity_len );
1756 if( ret != 0 )
1757 ssl_conf_remove_psk( conf );
1758
1759 return( ret );
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01001760}
1761
Przemyslaw Stekiel6928a512022-02-03 13:50:35 +01001762int mbedtls_ssl_set_hs_psk_opaque( mbedtls_ssl_context *ssl,
1763 mbedtls_svc_key_id_t psk )
1764{
1765 if( ( mbedtls_svc_key_id_is_null( psk ) ) ||
1766 ( ssl->handshake == NULL ) )
1767 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1768
1769 ssl_remove_psk( ssl );
1770 ssl->handshake->psk_opaque = psk;
1771 return( 0 );
1772}
1773#endif /* MBEDTLS_USE_PSA_CRYPTO */
1774
1775void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,
1776 int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *,
1777 size_t),
1778 void *p_psk )
1779{
1780 conf->f_psk = f_psk;
1781 conf->p_psk = p_psk;
1782}
1783#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
1784
1785#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine301711e2022-04-26 16:57:05 +02001786static mbedtls_ssl_mode_t mbedtls_ssl_get_base_mode(
1787 psa_algorithm_t alg )
Neil Armstrong8a0f3e82022-03-30 10:57:37 +02001788{
Neil Armstrong8a0f3e82022-03-30 10:57:37 +02001789#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001790 if( alg == PSA_ALG_CBC_NO_PADDING )
Neil Armstrong8a0f3e82022-03-30 10:57:37 +02001791 return( MBEDTLS_SSL_MODE_CBC );
Neil Armstrong8a0f3e82022-03-30 10:57:37 +02001792#endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001793 if( PSA_ALG_IS_AEAD( alg ) )
Neil Armstrong8a0f3e82022-03-30 10:57:37 +02001794 return( MBEDTLS_SSL_MODE_AEAD );
Gilles Peskine301711e2022-04-26 16:57:05 +02001795 return( MBEDTLS_SSL_MODE_STREAM );
1796}
1797
1798#else /* MBEDTLS_USE_PSA_CRYPTO */
1799
1800static mbedtls_ssl_mode_t mbedtls_ssl_get_base_mode(
1801 mbedtls_cipher_mode_t mode )
1802{
1803#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
1804 if( mode == MBEDTLS_MODE_CBC )
1805 return( MBEDTLS_SSL_MODE_CBC );
1806#endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
1807
Neil Armstrong8a0f3e82022-03-30 10:57:37 +02001808#if defined(MBEDTLS_GCM_C) || \
1809 defined(MBEDTLS_CCM_C) || \
1810 defined(MBEDTLS_CHACHAPOLY_C)
1811 if( mode == MBEDTLS_MODE_GCM ||
1812 mode == MBEDTLS_MODE_CCM ||
1813 mode == MBEDTLS_MODE_CHACHAPOLY )
1814 return( MBEDTLS_SSL_MODE_AEAD );
1815#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */
Neil Armstrong8a0f3e82022-03-30 10:57:37 +02001816
1817 return( MBEDTLS_SSL_MODE_STREAM );
1818}
Gilles Peskine301711e2022-04-26 16:57:05 +02001819#endif /* MBEDTLS_USE_PSA_CRYPTO */
Neil Armstrong8a0f3e82022-03-30 10:57:37 +02001820
Gilles Peskinee108d982022-04-26 16:50:40 +02001821static mbedtls_ssl_mode_t mbedtls_ssl_get_actual_mode(
1822 mbedtls_ssl_mode_t base_mode,
1823 int encrypt_then_mac )
1824{
1825#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
1826 if( encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED &&
1827 base_mode == MBEDTLS_SSL_MODE_CBC )
1828 {
1829 return( MBEDTLS_SSL_MODE_CBC_ETM );
1830 }
1831#else
1832 (void) encrypt_then_mac;
1833#endif
1834 return( base_mode );
1835}
1836
Neil Armstrongab555e02022-04-04 11:07:59 +02001837mbedtls_ssl_mode_t mbedtls_ssl_get_mode_from_transform(
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001838 const mbedtls_ssl_transform *transform )
1839{
Gilles Peskinee108d982022-04-26 16:50:40 +02001840 mbedtls_ssl_mode_t base_mode = mbedtls_ssl_get_base_mode(
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001841#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskinee108d982022-04-26 16:50:40 +02001842 transform->psa_alg
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001843#else
Gilles Peskinee108d982022-04-26 16:50:40 +02001844 mbedtls_cipher_get_cipher_mode( &transform->cipher_ctx_enc )
1845#endif
1846 );
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001847
Gilles Peskinee108d982022-04-26 16:50:40 +02001848 int encrypt_then_mac = 0;
Neil Armstrongf2c82f02022-04-05 11:16:53 +02001849#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Gilles Peskinee108d982022-04-26 16:50:40 +02001850 encrypt_then_mac = transform->encrypt_then_mac;
1851#endif
1852 return( mbedtls_ssl_get_actual_mode( base_mode, encrypt_then_mac ) );
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001853}
1854
Neil Armstrongab555e02022-04-04 11:07:59 +02001855mbedtls_ssl_mode_t mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongf2c82f02022-04-05 11:16:53 +02001856#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001857 int encrypt_then_mac,
Neil Armstrongf2c82f02022-04-05 11:16:53 +02001858#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001859 const mbedtls_ssl_ciphersuite_t *suite )
1860{
Gilles Peskinee108d982022-04-26 16:50:40 +02001861 mbedtls_ssl_mode_t base_mode = MBEDTLS_SSL_MODE_STREAM;
1862
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001863#if defined(MBEDTLS_USE_PSA_CRYPTO)
1864 psa_status_t status;
1865 psa_algorithm_t alg;
1866 psa_key_type_t type;
1867 size_t size;
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001868 status = mbedtls_ssl_cipher_to_psa( suite->cipher, 0, &alg, &type, &size );
1869 if( status == PSA_SUCCESS )
Gilles Peskinee108d982022-04-26 16:50:40 +02001870 base_mode = mbedtls_ssl_get_base_mode( alg );
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001871#else
1872 const mbedtls_cipher_info_t *cipher =
1873 mbedtls_cipher_info_from_type( suite->cipher );
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001874 if( cipher != NULL )
Gilles Peskinee108d982022-04-26 16:50:40 +02001875 {
1876 base_mode =
1877 mbedtls_ssl_get_base_mode(
1878 mbedtls_cipher_info_get_mode( cipher ) );
1879 }
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001880#endif /* MBEDTLS_USE_PSA_CRYPTO */
1881
Gilles Peskinee108d982022-04-26 16:50:40 +02001882#if !defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
1883 int encrypt_then_mac = 0;
1884#endif
1885 return( mbedtls_ssl_get_actual_mode( base_mode, encrypt_then_mac ) );
Neil Armstrong4bf4c862022-04-01 10:35:48 +02001886}
1887
Neil Armstrong8395d7a2022-05-18 11:44:56 +02001888#if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu251a12e2022-07-13 15:15:48 +08001889
1890#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu438ddd82022-07-07 06:55:50 +00001891/* Serialization of TLS 1.3 sessions:
1892 *
1893 * struct {
1894 * uint64 ticket_received;
1895 * uint32 ticket_lifetime;
1896 * opaque ticket<0..2^16>;
1897 * } ClientOnlyData;
1898 *
1899 * struct {
1900 * uint8 endpoint;
1901 * uint8 ciphersuite[2];
1902 * uint32 ticket_age_add;
1903 * uint8 ticket_flags;
1904 * opaque resumption_key<0..255>;
1905 * select ( endpoint ) {
1906 * case client: ClientOnlyData;
1907 * case server: uint64 start_time;
1908 * };
1909 * } serialized_session_tls13;
1910 *
1911 */
1912#if defined(MBEDTLS_SSL_SESSION_TICKETS)
1913static size_t ssl_tls13_session_save( const mbedtls_ssl_session *session,
1914 unsigned char *buf,
1915 size_t buf_len )
1916{
1917 unsigned char *p = buf;
1918 size_t needed = 1 /* endpoint */
1919 + 2 /* ciphersuite */
1920 + 4 /* ticket_age_add */
1921 + 2 /* key_len */
1922 + session->key_len; /* key */
1923
1924#if defined(MBEDTLS_HAVE_TIME)
1925 needed += 8; /* start_time or ticket_received */
1926#endif
1927
1928#if defined(MBEDTLS_SSL_CLI_C)
1929 if( session->endpoint == MBEDTLS_SSL_IS_CLIENT )
1930 {
1931 needed += 4 /* ticket_lifetime */
1932 + 2 /* ticket_len */
1933 + session->ticket_len; /* ticket */
1934 }
1935#endif /* MBEDTLS_SSL_CLI_C */
1936
1937 if( needed > buf_len )
1938 return( needed );
1939
1940 p[0] = session->endpoint;
1941 MBEDTLS_PUT_UINT16_BE( session->ciphersuite, p, 1 );
1942 MBEDTLS_PUT_UINT32_BE( session->ticket_age_add, p, 3 );
1943 p[7] = session->ticket_flags;
1944
1945 /* save resumption_key */
1946 p[8] = session->key_len;
1947 p += 9;
1948 memcpy( p, session->key, session->key_len );
1949 p += session->key_len;
1950
1951#if defined(MBEDTLS_HAVE_TIME) && defined(MBEDTLS_SSL_SRV_C)
1952 if( session->endpoint == MBEDTLS_SSL_IS_SERVER )
1953 {
1954 MBEDTLS_PUT_UINT64_BE( (uint64_t) session->start, p, 0 );
1955 p += 8;
1956 }
1957#endif /* MBEDTLS_HAVE_TIME */
1958
1959#if defined(MBEDTLS_SSL_CLI_C)
1960 if( session->endpoint == MBEDTLS_SSL_IS_CLIENT )
1961 {
1962#if defined(MBEDTLS_HAVE_TIME)
1963 MBEDTLS_PUT_UINT64_BE( (uint64_t) session->ticket_received, p, 0 );
1964 p += 8;
1965#endif
1966 MBEDTLS_PUT_UINT32_BE( session->ticket_lifetime, p, 0 );
1967 p += 4;
1968
1969 MBEDTLS_PUT_UINT16_BE( session->ticket_len, p, 0 );
1970 p += 2;
1971 if( session->ticket_len > 0 )
1972 {
1973 memcpy( p, session->ticket, session->ticket_len );
1974 p += session->ticket_len;
1975 }
1976 }
1977#endif /* MBEDTLS_SSL_CLI_C */
1978 return( needed );
1979}
1980
1981MBEDTLS_CHECK_RETURN_CRITICAL
1982static int ssl_tls13_session_load( mbedtls_ssl_session *session,
1983 const unsigned char *buf,
1984 size_t len )
1985{
1986 const unsigned char *p = buf;
1987 const unsigned char *end = buf + len;
1988
1989 if( end - p < 9 )
1990 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1991 session->endpoint = p[0];
1992 session->ciphersuite = MBEDTLS_GET_UINT16_BE( p, 1 );
1993 session->ticket_age_add = MBEDTLS_GET_UINT32_BE( p, 3 );
1994 session->ticket_flags = p[7];
1995
1996 /* load resumption_key */
1997 session->key_len = p[8];
1998 p += 9;
1999
2000 if( end - p < session->key_len )
2001 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2002
2003 if( sizeof( session->key ) < session->key_len)
2004 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2005 memcpy( session->key, p, session->key_len );
2006 p += session->key_len;
2007
2008#if defined(MBEDTLS_HAVE_TIME) && defined(MBEDTLS_SSL_SRV_C)
2009 if( session->endpoint == MBEDTLS_SSL_IS_SERVER )
2010 {
2011 if( end - p < 8 )
2012 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2013 session->start = MBEDTLS_GET_UINT64_BE( p, 0 );
2014 p += 8;
2015 }
2016#endif /* MBEDTLS_HAVE_TIME */
2017
2018#if defined(MBEDTLS_SSL_CLI_C)
2019 if( session->endpoint == MBEDTLS_SSL_IS_CLIENT )
2020 {
2021#if defined(MBEDTLS_HAVE_TIME)
2022 if( end - p < 8 )
2023 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2024 session->ticket_received = MBEDTLS_GET_UINT64_BE( p, 0 );
2025 p += 8;
2026#endif
2027 if( end - p < 4 )
2028 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2029 session->ticket_lifetime = MBEDTLS_GET_UINT32_BE( p, 0 );
2030 p += 4;
2031
2032 if( end - p < 2 )
2033 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2034 session->ticket_len = MBEDTLS_GET_UINT16_BE( p, 0 );
2035 p += 2;
2036
2037 if( end - p < ( long int )session->ticket_len )
2038 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2039 if( session->ticket_len > 0 )
2040 {
2041 session->ticket = mbedtls_calloc( 1, session->ticket_len );
2042 if( session->ticket == NULL )
2043 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
2044 memcpy( session->ticket, p, session->ticket_len );
2045 p += session->ticket_len;
2046 }
2047 }
2048#endif /* MBEDTLS_SSL_CLI_C */
2049
2050 return( 0 );
2051
2052}
2053#else /* MBEDTLS_SSL_SESSION_TICKETS */
2054static size_t ssl_tls13_session_save( const mbedtls_ssl_session *session,
Jerry Yu251a12e2022-07-13 15:15:48 +08002055 unsigned char *buf,
2056 size_t buf_len )
2057{
2058 ((void) session);
2059 ((void) buf);
2060 ((void) buf_len);
2061 return( 0 );
2062}
Jerry Yu438ddd82022-07-07 06:55:50 +00002063
2064static int ssl_tls13_session_load( const mbedtls_ssl_session *session,
2065 unsigned char *buf,
2066 size_t buf_len )
2067{
2068 ((void) session);
2069 ((void) buf);
2070 ((void) buf_len);
2071 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
2072}
2073#endif /* !MBEDTLS_SSL_SESSION_TICKETS */
Jerry Yu251a12e2022-07-13 15:15:48 +08002074#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
2075
Przemyslaw Stekielf57b4562022-01-25 00:04:18 +01002076psa_status_t mbedtls_ssl_cipher_to_psa( mbedtls_cipher_type_t mbedtls_cipher_type,
Przemyslaw Stekiel430f3372022-01-10 11:55:46 +01002077 size_t taglen,
2078 psa_algorithm_t *alg,
2079 psa_key_type_t *key_type,
2080 size_t *key_size )
2081{
2082 switch ( mbedtls_cipher_type )
2083 {
2084 case MBEDTLS_CIPHER_AES_128_CBC:
2085 *alg = PSA_ALG_CBC_NO_PADDING;
2086 *key_type = PSA_KEY_TYPE_AES;
2087 *key_size = 128;
2088 break;
2089 case MBEDTLS_CIPHER_AES_128_CCM:
2090 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2091 *key_type = PSA_KEY_TYPE_AES;
2092 *key_size = 128;
2093 break;
2094 case MBEDTLS_CIPHER_AES_128_GCM:
2095 *alg = PSA_ALG_GCM;
2096 *key_type = PSA_KEY_TYPE_AES;
2097 *key_size = 128;
2098 break;
2099 case MBEDTLS_CIPHER_AES_192_CCM:
2100 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2101 *key_type = PSA_KEY_TYPE_AES;
2102 *key_size = 192;
2103 break;
2104 case MBEDTLS_CIPHER_AES_192_GCM:
2105 *alg = PSA_ALG_GCM;
2106 *key_type = PSA_KEY_TYPE_AES;
2107 *key_size = 192;
2108 break;
2109 case MBEDTLS_CIPHER_AES_256_CBC:
2110 *alg = PSA_ALG_CBC_NO_PADDING;
2111 *key_type = PSA_KEY_TYPE_AES;
2112 *key_size = 256;
2113 break;
2114 case MBEDTLS_CIPHER_AES_256_CCM:
2115 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2116 *key_type = PSA_KEY_TYPE_AES;
2117 *key_size = 256;
2118 break;
2119 case MBEDTLS_CIPHER_AES_256_GCM:
2120 *alg = PSA_ALG_GCM;
2121 *key_type = PSA_KEY_TYPE_AES;
2122 *key_size = 256;
2123 break;
2124 case MBEDTLS_CIPHER_ARIA_128_CBC:
2125 *alg = PSA_ALG_CBC_NO_PADDING;
2126 *key_type = PSA_KEY_TYPE_ARIA;
2127 *key_size = 128;
2128 break;
2129 case MBEDTLS_CIPHER_ARIA_128_CCM:
2130 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2131 *key_type = PSA_KEY_TYPE_ARIA;
2132 *key_size = 128;
2133 break;
2134 case MBEDTLS_CIPHER_ARIA_128_GCM:
2135 *alg = PSA_ALG_GCM;
2136 *key_type = PSA_KEY_TYPE_ARIA;
2137 *key_size = 128;
2138 break;
2139 case MBEDTLS_CIPHER_ARIA_192_CCM:
2140 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2141 *key_type = PSA_KEY_TYPE_ARIA;
2142 *key_size = 192;
2143 break;
2144 case MBEDTLS_CIPHER_ARIA_192_GCM:
2145 *alg = PSA_ALG_GCM;
2146 *key_type = PSA_KEY_TYPE_ARIA;
2147 *key_size = 192;
2148 break;
2149 case MBEDTLS_CIPHER_ARIA_256_CBC:
2150 *alg = PSA_ALG_CBC_NO_PADDING;
2151 *key_type = PSA_KEY_TYPE_ARIA;
2152 *key_size = 256;
2153 break;
2154 case MBEDTLS_CIPHER_ARIA_256_CCM:
2155 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2156 *key_type = PSA_KEY_TYPE_ARIA;
2157 *key_size = 256;
2158 break;
2159 case MBEDTLS_CIPHER_ARIA_256_GCM:
2160 *alg = PSA_ALG_GCM;
2161 *key_type = PSA_KEY_TYPE_ARIA;
2162 *key_size = 256;
2163 break;
2164 case MBEDTLS_CIPHER_CAMELLIA_128_CBC:
2165 *alg = PSA_ALG_CBC_NO_PADDING;
2166 *key_type = PSA_KEY_TYPE_CAMELLIA;
2167 *key_size = 128;
2168 break;
2169 case MBEDTLS_CIPHER_CAMELLIA_128_CCM:
2170 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2171 *key_type = PSA_KEY_TYPE_CAMELLIA;
2172 *key_size = 128;
2173 break;
2174 case MBEDTLS_CIPHER_CAMELLIA_128_GCM:
2175 *alg = PSA_ALG_GCM;
2176 *key_type = PSA_KEY_TYPE_CAMELLIA;
2177 *key_size = 128;
2178 break;
2179 case MBEDTLS_CIPHER_CAMELLIA_192_CCM:
2180 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2181 *key_type = PSA_KEY_TYPE_CAMELLIA;
2182 *key_size = 192;
2183 break;
2184 case MBEDTLS_CIPHER_CAMELLIA_192_GCM:
2185 *alg = PSA_ALG_GCM;
2186 *key_type = PSA_KEY_TYPE_CAMELLIA;
2187 *key_size = 192;
2188 break;
2189 case MBEDTLS_CIPHER_CAMELLIA_256_CBC:
2190 *alg = PSA_ALG_CBC_NO_PADDING;
2191 *key_type = PSA_KEY_TYPE_CAMELLIA;
2192 *key_size = 256;
2193 break;
2194 case MBEDTLS_CIPHER_CAMELLIA_256_CCM:
2195 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2196 *key_type = PSA_KEY_TYPE_CAMELLIA;
2197 *key_size = 256;
2198 break;
2199 case MBEDTLS_CIPHER_CAMELLIA_256_GCM:
2200 *alg = PSA_ALG_GCM;
2201 *key_type = PSA_KEY_TYPE_CAMELLIA;
2202 *key_size = 256;
2203 break;
2204 case MBEDTLS_CIPHER_CHACHA20_POLY1305:
2205 *alg = PSA_ALG_CHACHA20_POLY1305;
2206 *key_type = PSA_KEY_TYPE_CHACHA20;
2207 *key_size = 256;
2208 break;
2209 case MBEDTLS_CIPHER_NULL:
2210 *alg = MBEDTLS_SSL_NULL_CIPHER;
2211 *key_type = 0;
2212 *key_size = 0;
2213 break;
2214 default:
2215 return PSA_ERROR_NOT_SUPPORTED;
2216 }
2217
2218 return PSA_SUCCESS;
2219}
Neil Armstrong8395d7a2022-05-18 11:44:56 +02002220#endif /* MBEDTLS_USE_PSA_CRYPTO || MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002221
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02002222#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Hanno Beckera90658f2017-10-04 15:29:08 +01002223int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf,
2224 const unsigned char *dhm_P, size_t P_len,
2225 const unsigned char *dhm_G, size_t G_len )
2226{
Janos Follath865b3eb2019-12-16 11:46:15 +00002227 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Beckera90658f2017-10-04 15:29:08 +01002228
Glenn Strausscee11292021-12-20 01:43:17 -05002229 mbedtls_mpi_free( &conf->dhm_P );
2230 mbedtls_mpi_free( &conf->dhm_G );
2231
Hanno Beckera90658f2017-10-04 15:29:08 +01002232 if( ( ret = mbedtls_mpi_read_binary( &conf->dhm_P, dhm_P, P_len ) ) != 0 ||
2233 ( ret = mbedtls_mpi_read_binary( &conf->dhm_G, dhm_G, G_len ) ) != 0 )
2234 {
2235 mbedtls_mpi_free( &conf->dhm_P );
2236 mbedtls_mpi_free( &conf->dhm_G );
2237 return( ret );
2238 }
2239
2240 return( 0 );
2241}
Paul Bakker5121ce52009-01-03 21:22:43 +00002242
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002243int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx )
Paul Bakker1b57b062011-01-06 15:48:19 +00002244{
Janos Follath865b3eb2019-12-16 11:46:15 +00002245 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker1b57b062011-01-06 15:48:19 +00002246
Glenn Strausscee11292021-12-20 01:43:17 -05002247 mbedtls_mpi_free( &conf->dhm_P );
2248 mbedtls_mpi_free( &conf->dhm_G );
2249
Gilles Peskinee5702482021-06-11 21:59:08 +02002250 if( ( ret = mbedtls_dhm_get_value( dhm_ctx, MBEDTLS_DHM_PARAM_P,
2251 &conf->dhm_P ) ) != 0 ||
2252 ( ret = mbedtls_dhm_get_value( dhm_ctx, MBEDTLS_DHM_PARAM_G,
2253 &conf->dhm_G ) ) != 0 )
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002254 {
2255 mbedtls_mpi_free( &conf->dhm_P );
2256 mbedtls_mpi_free( &conf->dhm_G );
Paul Bakker1b57b062011-01-06 15:48:19 +00002257 return( ret );
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002258 }
Paul Bakker1b57b062011-01-06 15:48:19 +00002259
2260 return( 0 );
2261}
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02002262#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00002263
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002264#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
2265/*
2266 * Set the minimum length for Diffie-Hellman parameters
2267 */
2268void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf,
2269 unsigned int bitlen )
2270{
2271 conf->dhm_min_bitlen = bitlen;
2272}
2273#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */
2274
Gilles Peskineeccd8882020-03-10 12:19:08 +01002275#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yu7ddc38c2022-01-19 11:08:05 +08002276#if !defined(MBEDTLS_DEPRECATED_REMOVED) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02002277/*
2278 * Set allowed/preferred hashes for handshake signatures
2279 */
2280void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf,
2281 const int *hashes )
2282{
2283 conf->sig_hashes = hashes;
2284}
Jerry Yu7ddc38c2022-01-19 11:08:05 +08002285#endif /* !MBEDTLS_DEPRECATED_REMOVED && MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Becker1cd6e002021-08-10 13:27:10 +01002286
Jerry Yuf017ee42022-01-12 15:49:48 +08002287/* Configure allowed signature algorithms for handshake */
Hanno Becker1cd6e002021-08-10 13:27:10 +01002288void mbedtls_ssl_conf_sig_algs( mbedtls_ssl_config *conf,
2289 const uint16_t* sig_algs )
2290{
Jerry Yuf017ee42022-01-12 15:49:48 +08002291#if !defined(MBEDTLS_DEPRECATED_REMOVED)
2292 conf->sig_hashes = NULL;
2293#endif /* !MBEDTLS_DEPRECATED_REMOVED */
2294 conf->sig_algs = sig_algs;
Hanno Becker1cd6e002021-08-10 13:27:10 +01002295}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002296#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02002297
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02002298#if defined(MBEDTLS_ECP_C)
Brett Warrene0edc842021-08-17 09:53:13 +01002299#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01002300/*
2301 * Set the allowed elliptic curves
Brett Warrene0edc842021-08-17 09:53:13 +01002302 *
2303 * mbedtls_ssl_setup() takes the provided list
2304 * and translates it to a list of IANA TLS group identifiers,
2305 * stored in ssl->handshake->group_list.
2306 *
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01002307 */
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002308void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002309 const mbedtls_ecp_group_id *curve_list )
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01002310{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002311 conf->curve_list = curve_list;
Brett Warrene0edc842021-08-17 09:53:13 +01002312 conf->group_list = NULL;
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01002313}
Brett Warrene0edc842021-08-17 09:53:13 +01002314#endif /* MBEDTLS_DEPRECATED_REMOVED */
Hanno Becker947194e2017-04-07 13:25:49 +01002315#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01002316
Brett Warrene0edc842021-08-17 09:53:13 +01002317/*
2318 * Set the allowed groups
2319 */
2320void mbedtls_ssl_conf_groups( mbedtls_ssl_config *conf,
2321 const uint16_t *group_list )
2322{
2323#if defined(MBEDTLS_ECP_C) && !defined(MBEDTLS_DEPRECATED_REMOVED)
2324 conf->curve_list = NULL;
2325#endif
2326 conf->group_list = group_list;
2327}
2328
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01002329#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002330int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00002331{
Hanno Becker947194e2017-04-07 13:25:49 +01002332 /* Initialize to suppress unnecessary compiler warning */
2333 size_t hostname_len = 0;
2334
2335 /* Check if new hostname is valid before
2336 * making any change to current one */
Hanno Becker947194e2017-04-07 13:25:49 +01002337 if( hostname != NULL )
2338 {
2339 hostname_len = strlen( hostname );
2340
2341 if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN )
2342 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2343 }
2344
2345 /* Now it's clear that we will overwrite the old hostname,
2346 * so we can free it safely */
2347
2348 if( ssl->hostname != NULL )
2349 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05002350 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
Hanno Becker947194e2017-04-07 13:25:49 +01002351 mbedtls_free( ssl->hostname );
2352 }
2353
2354 /* Passing NULL as hostname shall clear the old one */
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +01002355
Paul Bakker5121ce52009-01-03 21:22:43 +00002356 if( hostname == NULL )
Hanno Becker947194e2017-04-07 13:25:49 +01002357 {
2358 ssl->hostname = NULL;
2359 }
2360 else
2361 {
2362 ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 );
Hanno Becker947194e2017-04-07 13:25:49 +01002363 if( ssl->hostname == NULL )
2364 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02002365
Hanno Becker947194e2017-04-07 13:25:49 +01002366 memcpy( ssl->hostname, hostname, hostname_len );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02002367
Hanno Becker947194e2017-04-07 13:25:49 +01002368 ssl->hostname[hostname_len] = '\0';
2369 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002370
2371 return( 0 );
2372}
Hanno Becker1a9a51c2017-04-07 13:02:16 +01002373#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00002374
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01002375#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002376void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002377 int (*f_sni)(void *, mbedtls_ssl_context *,
Paul Bakker5701cdc2012-09-27 21:49:42 +00002378 const unsigned char *, size_t),
2379 void *p_sni )
2380{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002381 conf->f_sni = f_sni;
2382 conf->p_sni = p_sni;
Paul Bakker5701cdc2012-09-27 21:49:42 +00002383}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002384#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00002385
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002386#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002387int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos )
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02002388{
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002389 size_t cur_len, tot_len;
2390 const char **p;
2391
2392 /*
Brian J Murray1903fb32016-11-06 04:45:15 -08002393 * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings
2394 * MUST NOT be truncated."
2395 * We check lengths now rather than later.
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002396 */
2397 tot_len = 0;
2398 for( p = protos; *p != NULL; p++ )
2399 {
2400 cur_len = strlen( *p );
2401 tot_len += cur_len;
2402
Ronald Cron8216dd32020-04-23 16:41:44 +02002403 if( ( cur_len == 0 ) ||
2404 ( cur_len > MBEDTLS_SSL_MAX_ALPN_NAME_LEN ) ||
2405 ( tot_len > MBEDTLS_SSL_MAX_ALPN_LIST_LEN ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002406 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002407 }
2408
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002409 conf->alpn_list = protos;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002410
2411 return( 0 );
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02002412}
2413
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002414const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02002415{
Paul Bakkerd8bb8262014-06-17 14:06:49 +02002416 return( ssl->alpn_chosen );
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02002417}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002418#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02002419
Johan Pascalb62bb512015-12-03 21:56:45 +01002420#if defined(MBEDTLS_SSL_DTLS_SRTP)
Ron Eldoref72faf2018-07-12 11:54:20 +03002421void mbedtls_ssl_conf_srtp_mki_value_supported( mbedtls_ssl_config *conf,
2422 int support_mki_value )
Ron Eldor591f1622018-01-22 12:30:04 +02002423{
2424 conf->dtls_srtp_mki_support = support_mki_value;
2425}
2426
Ron Eldoref72faf2018-07-12 11:54:20 +03002427int mbedtls_ssl_dtls_srtp_set_mki_value( mbedtls_ssl_context *ssl,
2428 unsigned char *mki_value,
Johan Pascalf6417ec2020-09-22 15:15:19 +02002429 uint16_t mki_len )
Ron Eldor591f1622018-01-22 12:30:04 +02002430{
Johan Pascal5ef72d22020-10-28 17:05:47 +01002431 if( mki_len > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH )
Ron Eldora9788042018-12-05 11:04:31 +02002432 {
Johan Pascald576fdb2020-09-22 10:39:53 +02002433 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Ron Eldora9788042018-12-05 11:04:31 +02002434 }
Ron Eldor591f1622018-01-22 12:30:04 +02002435
2436 if( ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED )
Ron Eldora9788042018-12-05 11:04:31 +02002437 {
Johan Pascald576fdb2020-09-22 10:39:53 +02002438 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Ron Eldora9788042018-12-05 11:04:31 +02002439 }
Ron Eldor591f1622018-01-22 12:30:04 +02002440
2441 memcpy( ssl->dtls_srtp_info.mki_value, mki_value, mki_len );
2442 ssl->dtls_srtp_info.mki_len = mki_len;
Ron Eldora9788042018-12-05 11:04:31 +02002443 return( 0 );
Ron Eldor591f1622018-01-22 12:30:04 +02002444}
2445
Ron Eldoref72faf2018-07-12 11:54:20 +03002446int mbedtls_ssl_conf_dtls_srtp_protection_profiles( mbedtls_ssl_config *conf,
Johan Pascal253d0262020-09-22 13:04:45 +02002447 const mbedtls_ssl_srtp_profile *profiles )
Johan Pascalb62bb512015-12-03 21:56:45 +01002448{
Johan Pascal253d0262020-09-22 13:04:45 +02002449 const mbedtls_ssl_srtp_profile *p;
2450 size_t list_size = 0;
Johan Pascalb62bb512015-12-03 21:56:45 +01002451
Johan Pascal253d0262020-09-22 13:04:45 +02002452 /* check the profiles list: all entry must be valid,
2453 * its size cannot be more than the total number of supported profiles, currently 4 */
Johan Pascald387aa02020-09-23 18:47:56 +02002454 for( p = profiles; *p != MBEDTLS_TLS_SRTP_UNSET &&
2455 list_size <= MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH;
2456 p++ )
Johan Pascald576fdb2020-09-22 10:39:53 +02002457 {
Johan Pascal5ef72d22020-10-28 17:05:47 +01002458 if( mbedtls_ssl_check_srtp_profile_value( *p ) != MBEDTLS_TLS_SRTP_UNSET )
Johan Pascald576fdb2020-09-22 10:39:53 +02002459 {
Johan Pascal76fdf1d2020-10-22 23:31:00 +02002460 list_size++;
2461 }
2462 else
2463 {
2464 /* unsupported value, stop parsing and set the size to an error value */
2465 list_size = MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH + 1;
Johan Pascalb62bb512015-12-03 21:56:45 +01002466 }
2467 }
2468
Johan Pascal5ef72d22020-10-28 17:05:47 +01002469 if( list_size > MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH )
Johan Pascald387aa02020-09-23 18:47:56 +02002470 {
Johan Pascal253d0262020-09-22 13:04:45 +02002471 conf->dtls_srtp_profile_list = NULL;
2472 conf->dtls_srtp_profile_list_len = 0;
2473 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2474 }
2475
Johan Pascal9bc97ca2020-09-21 23:44:45 +02002476 conf->dtls_srtp_profile_list = profiles;
Johan Pascal253d0262020-09-22 13:04:45 +02002477 conf->dtls_srtp_profile_list_len = list_size;
Johan Pascalb62bb512015-12-03 21:56:45 +01002478
2479 return( 0 );
2480}
2481
Johan Pascal5ef72d22020-10-28 17:05:47 +01002482void mbedtls_ssl_get_dtls_srtp_negotiation_result( const mbedtls_ssl_context *ssl,
2483 mbedtls_dtls_srtp_info *dtls_srtp_info )
Johan Pascalb62bb512015-12-03 21:56:45 +01002484{
Johan Pascal2258a4f2020-10-28 13:53:09 +01002485 dtls_srtp_info->chosen_dtls_srtp_profile = ssl->dtls_srtp_info.chosen_dtls_srtp_profile;
2486 /* do not copy the mki value if there is no chosen profile */
Johan Pascal5ef72d22020-10-28 17:05:47 +01002487 if( dtls_srtp_info->chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET )
Johan Pascal0dbcd1d2020-10-28 11:03:07 +01002488 {
Johan Pascal2258a4f2020-10-28 13:53:09 +01002489 dtls_srtp_info->mki_len = 0;
Johan Pascal0dbcd1d2020-10-28 11:03:07 +01002490 }
Johan Pascal2258a4f2020-10-28 13:53:09 +01002491 else
2492 {
2493 dtls_srtp_info->mki_len = ssl->dtls_srtp_info.mki_len;
Johan Pascal5ef72d22020-10-28 17:05:47 +01002494 memcpy( dtls_srtp_info->mki_value, ssl->dtls_srtp_info.mki_value,
2495 ssl->dtls_srtp_info.mki_len );
Johan Pascal2258a4f2020-10-28 13:53:09 +01002496 }
Johan Pascalb62bb512015-12-03 21:56:45 +01002497}
Johan Pascalb62bb512015-12-03 21:56:45 +01002498#endif /* MBEDTLS_SSL_DTLS_SRTP */
2499
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02002500void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor )
Paul Bakker490ecc82011-10-06 13:04:09 +00002501{
Glenn Strauss2dfcea22022-03-14 17:26:42 -04002502 conf->max_tls_version = (major << 8) | minor;
Paul Bakker490ecc82011-10-06 13:04:09 +00002503}
2504
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02002505void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor )
Paul Bakker1d29fb52012-09-28 13:28:45 +00002506{
Glenn Strauss2dfcea22022-03-14 17:26:42 -04002507 conf->min_tls_version = (major << 8) | minor;
Paul Bakker1d29fb52012-09-28 13:28:45 +00002508}
2509
Janos Follath088ce432017-04-10 12:42:31 +01002510#if defined(MBEDTLS_SSL_SRV_C)
2511void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf,
2512 char cert_req_ca_list )
2513{
2514 conf->cert_req_ca_list = cert_req_ca_list;
2515}
2516#endif
2517
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002518#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002519void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002520{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002521 conf->encrypt_then_mac = etm;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002522}
2523#endif
2524
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002525#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002526void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002527{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002528 conf->extended_ms = ems;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002529}
2530#endif
2531
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002532#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002533int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02002534{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002535 if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ||
Angus Grattond8213d02016-05-25 20:56:48 +10002536 ssl_mfl_code_to_length( mfl_code ) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02002537 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002538 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02002539 }
2540
Manuel Pégourié-Gonnard6bf89d62015-05-05 17:01:57 +01002541 conf->mfl_code = mfl_code;
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02002542
2543 return( 0 );
2544}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002545#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02002546
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002547void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy )
Paul Bakker48916f92012-09-16 19:57:18 +00002548{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002549 conf->allow_legacy_renegotiation = allow_legacy;
Paul Bakker48916f92012-09-16 19:57:18 +00002550}
2551
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002552#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002553void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002554{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002555 conf->disable_renegotiation = renegotiation;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002556}
2557
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002558void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records )
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02002559{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002560 conf->renego_max_records = max_records;
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02002561}
2562
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002563void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01002564 const unsigned char period[8] )
2565{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002566 memcpy( conf->renego_period, period, 8 );
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01002567}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002568#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker5121ce52009-01-03 21:22:43 +00002569
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002570#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02002571#if defined(MBEDTLS_SSL_CLI_C)
2572void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets )
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02002573{
Manuel Pégourié-Gonnard2b494452015-05-06 10:05:11 +01002574 conf->session_tickets = use_tickets;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02002575}
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02002576#endif
Paul Bakker606b4ba2013-08-14 16:52:14 +02002577
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02002578#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02002579void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,
2580 mbedtls_ssl_ticket_write_t *f_ticket_write,
2581 mbedtls_ssl_ticket_parse_t *f_ticket_parse,
2582 void *p_ticket )
Paul Bakker606b4ba2013-08-14 16:52:14 +02002583{
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02002584 conf->f_ticket_write = f_ticket_write;
2585 conf->f_ticket_parse = f_ticket_parse;
2586 conf->p_ticket = p_ticket;
Paul Bakker606b4ba2013-08-14 16:52:14 +02002587}
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02002588#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002589#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02002590
Hanno Becker7e6c1782021-06-08 09:24:55 +01002591void mbedtls_ssl_set_export_keys_cb( mbedtls_ssl_context *ssl,
2592 mbedtls_ssl_export_keys_t *f_export_keys,
2593 void *p_export_keys )
Robert Cragie4feb7ae2015-10-02 13:33:37 +01002594{
Hanno Becker7e6c1782021-06-08 09:24:55 +01002595 ssl->f_export_keys = f_export_keys;
2596 ssl->p_export_keys = p_export_keys;
Ron Eldorf5cc10d2019-05-07 18:33:40 +03002597}
Robert Cragie4feb7ae2015-10-02 13:33:37 +01002598
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002599#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine8bf79f62018-01-05 21:11:53 +01002600void mbedtls_ssl_conf_async_private_cb(
2601 mbedtls_ssl_config *conf,
2602 mbedtls_ssl_async_sign_t *f_async_sign,
2603 mbedtls_ssl_async_decrypt_t *f_async_decrypt,
2604 mbedtls_ssl_async_resume_t *f_async_resume,
2605 mbedtls_ssl_async_cancel_t *f_async_cancel,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002606 void *async_config_data )
Gilles Peskine8bf79f62018-01-05 21:11:53 +01002607{
2608 conf->f_async_sign_start = f_async_sign;
2609 conf->f_async_decrypt_start = f_async_decrypt;
2610 conf->f_async_resume = f_async_resume;
2611 conf->f_async_cancel = f_async_cancel;
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002612 conf->p_async_config_data = async_config_data;
2613}
2614
Gilles Peskine8f97af72018-04-26 11:46:10 +02002615void *mbedtls_ssl_conf_get_async_config_data( const mbedtls_ssl_config *conf )
2616{
2617 return( conf->p_async_config_data );
2618}
2619
Gilles Peskine1febfef2018-04-30 11:54:39 +02002620void *mbedtls_ssl_get_async_operation_data( const mbedtls_ssl_context *ssl )
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002621{
2622 if( ssl->handshake == NULL )
2623 return( NULL );
2624 else
2625 return( ssl->handshake->user_async_ctx );
2626}
2627
Gilles Peskine1febfef2018-04-30 11:54:39 +02002628void mbedtls_ssl_set_async_operation_data( mbedtls_ssl_context *ssl,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002629 void *ctx )
2630{
2631 if( ssl->handshake != NULL )
2632 ssl->handshake->user_async_ctx = ctx;
Gilles Peskine8bf79f62018-01-05 21:11:53 +01002633}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002634#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine8bf79f62018-01-05 21:11:53 +01002635
Paul Bakker5121ce52009-01-03 21:22:43 +00002636/*
2637 * SSL get accessors
2638 */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02002639uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002640{
Manuel Pégourié-Gonnarde89163c2015-01-23 14:30:57 +00002641 if( ssl->session != NULL )
2642 return( ssl->session->verify_result );
2643
2644 if( ssl->session_negotiate != NULL )
2645 return( ssl->session_negotiate->verify_result );
2646
Manuel Pégourié-Gonnard6ab9b002015-05-14 11:25:04 +02002647 return( 0xFFFFFFFF );
Paul Bakker5121ce52009-01-03 21:22:43 +00002648}
2649
Glenn Strauss8f526902022-01-13 00:04:49 -05002650int mbedtls_ssl_get_ciphersuite_id_from_ssl( const mbedtls_ssl_context *ssl )
2651{
2652 if( ssl == NULL || ssl->session == NULL )
2653 return( 0 );
2654
2655 return( ssl->session->ciphersuite );
2656}
2657
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002658const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00002659{
Paul Bakker926c8e42013-03-06 10:23:34 +01002660 if( ssl == NULL || ssl->session == NULL )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02002661 return( NULL );
Paul Bakker926c8e42013-03-06 10:23:34 +01002662
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002663 return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00002664}
2665
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002666const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl )
Paul Bakker43ca69c2011-01-15 17:35:19 +00002667{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002668#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002669 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01002670 {
Glenn Strauss60bfe602022-03-14 19:04:24 -04002671 switch( ssl->tls_version )
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01002672 {
Glenn Strauss60bfe602022-03-14 19:04:24 -04002673 case MBEDTLS_SSL_VERSION_TLS1_2:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01002674 return( "DTLSv1.2" );
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01002675 default:
2676 return( "unknown (DTLS)" );
2677 }
2678 }
2679#endif
2680
Glenn Strauss60bfe602022-03-14 19:04:24 -04002681 switch( ssl->tls_version )
Paul Bakker43ca69c2011-01-15 17:35:19 +00002682 {
Glenn Strauss60bfe602022-03-14 19:04:24 -04002683 case MBEDTLS_SSL_VERSION_TLS1_2:
Paul Bakker1ef83d62012-04-11 12:09:53 +00002684 return( "TLSv1.2" );
Glenn Strauss60bfe602022-03-14 19:04:24 -04002685 case MBEDTLS_SSL_VERSION_TLS1_3:
Gilles Peskinec63a1e02022-01-13 01:10:24 +01002686 return( "TLSv1.3" );
Paul Bakker43ca69c2011-01-15 17:35:19 +00002687 default:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01002688 return( "unknown" );
Paul Bakker43ca69c2011-01-15 17:35:19 +00002689 }
Paul Bakker43ca69c2011-01-15 17:35:19 +00002690}
2691
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02002692#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Andrzej Kurek90c6e842020-04-03 05:25:29 -04002693size_t mbedtls_ssl_get_input_max_frag_len( const mbedtls_ssl_context *ssl )
2694{
David Horstmann95d516f2021-05-04 18:36:56 +01002695 size_t max_len = MBEDTLS_SSL_IN_CONTENT_LEN;
Andrzej Kurek90c6e842020-04-03 05:25:29 -04002696 size_t read_mfl;
2697
2698 /* Use the configured MFL for the client if we're past SERVER_HELLO_DONE */
2699 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
2700 ssl->state >= MBEDTLS_SSL_SERVER_HELLO_DONE )
2701 {
2702 return ssl_mfl_code_to_length( ssl->conf->mfl_code );
2703 }
2704
2705 /* Check if a smaller max length was negotiated */
2706 if( ssl->session_out != NULL )
2707 {
2708 read_mfl = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
2709 if( read_mfl < max_len )
2710 {
2711 max_len = read_mfl;
2712 }
2713 }
2714
2715 // During a handshake, use the value being negotiated
2716 if( ssl->session_negotiate != NULL )
2717 {
2718 read_mfl = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
2719 if( read_mfl < max_len )
2720 {
2721 max_len = read_mfl;
2722 }
2723 }
2724
2725 return( max_len );
2726}
2727
2728size_t mbedtls_ssl_get_output_max_frag_len( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02002729{
2730 size_t max_len;
2731
2732 /*
2733 * Assume mfl_code is correct since it was checked when set
2734 */
Angus Grattond8213d02016-05-25 20:56:48 +10002735 max_len = ssl_mfl_code_to_length( ssl->conf->mfl_code );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02002736
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02002737 /* Check if a smaller max length was negotiated */
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02002738 if( ssl->session_out != NULL &&
Angus Grattond8213d02016-05-25 20:56:48 +10002739 ssl_mfl_code_to_length( ssl->session_out->mfl_code ) < max_len )
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02002740 {
Angus Grattond8213d02016-05-25 20:56:48 +10002741 max_len = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02002742 }
2743
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02002744 /* During a handshake, use the value being negotiated */
2745 if( ssl->session_negotiate != NULL &&
2746 ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code ) < max_len )
2747 {
2748 max_len = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
2749 }
2750
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02002751 return( max_len );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02002752}
2753#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
2754
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02002755#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker89490712020-02-05 10:50:12 +00002756size_t mbedtls_ssl_get_current_mtu( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02002757{
Andrzej Kurekef43ce62018-10-09 08:24:12 -04002758 /* Return unlimited mtu for client hello messages to avoid fragmentation. */
2759 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
2760 ( ssl->state == MBEDTLS_SSL_CLIENT_HELLO ||
2761 ssl->state == MBEDTLS_SSL_SERVER_HELLO ) )
2762 return ( 0 );
2763
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02002764 if( ssl->handshake == NULL || ssl->handshake->mtu == 0 )
2765 return( ssl->mtu );
2766
2767 if( ssl->mtu == 0 )
2768 return( ssl->handshake->mtu );
2769
2770 return( ssl->mtu < ssl->handshake->mtu ?
2771 ssl->mtu : ssl->handshake->mtu );
2772}
2773#endif /* MBEDTLS_SSL_PROTO_DTLS */
2774
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02002775int mbedtls_ssl_get_max_out_record_payload( const mbedtls_ssl_context *ssl )
2776{
2777 size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
2778
Manuel Pégourié-Gonnard000281e2018-08-21 11:20:58 +02002779#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
2780 !defined(MBEDTLS_SSL_PROTO_DTLS)
2781 (void) ssl;
2782#endif
2783
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02002784#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Andrzej Kurek90c6e842020-04-03 05:25:29 -04002785 const size_t mfl = mbedtls_ssl_get_output_max_frag_len( ssl );
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02002786
2787 if( max_len > mfl )
2788 max_len = mfl;
2789#endif
2790
2791#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker89490712020-02-05 10:50:12 +00002792 if( mbedtls_ssl_get_current_mtu( ssl ) != 0 )
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02002793 {
Hanno Becker89490712020-02-05 10:50:12 +00002794 const size_t mtu = mbedtls_ssl_get_current_mtu( ssl );
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02002795 const int ret = mbedtls_ssl_get_record_expansion( ssl );
2796 const size_t overhead = (size_t) ret;
2797
2798 if( ret < 0 )
2799 return( ret );
2800
2801 if( mtu <= overhead )
2802 {
2803 MBEDTLS_SSL_DEBUG_MSG( 1, ( "MTU too low for record expansion" ) );
2804 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
2805 }
2806
2807 if( max_len > mtu - overhead )
2808 max_len = mtu - overhead;
2809 }
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02002810#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02002811
Hanno Becker0defedb2018-08-10 12:35:02 +01002812#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
2813 !defined(MBEDTLS_SSL_PROTO_DTLS)
2814 ((void) ssl);
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02002815#endif
2816
2817 return( (int) max_len );
2818}
2819
Hanno Becker2d8e99b2021-04-21 06:19:50 +01002820int mbedtls_ssl_get_max_in_record_payload( const mbedtls_ssl_context *ssl )
2821{
2822 size_t max_len = MBEDTLS_SSL_IN_CONTENT_LEN;
2823
2824#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2825 (void) ssl;
2826#endif
2827
2828#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2829 const size_t mfl = mbedtls_ssl_get_input_max_frag_len( ssl );
2830
2831 if( max_len > mfl )
2832 max_len = mfl;
2833#endif
2834
2835 return( (int) max_len );
2836}
2837
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002838#if defined(MBEDTLS_X509_CRT_PARSE_C)
2839const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl )
Paul Bakkerb0550d92012-10-30 07:51:03 +00002840{
2841 if( ssl == NULL || ssl->session == NULL )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02002842 return( NULL );
Paul Bakkerb0550d92012-10-30 07:51:03 +00002843
Hanno Beckere6824572019-02-07 13:18:46 +00002844#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Paul Bakkerd8bb8262014-06-17 14:06:49 +02002845 return( ssl->session->peer_cert );
Hanno Beckere6824572019-02-07 13:18:46 +00002846#else
2847 return( NULL );
2848#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakkerb0550d92012-10-30 07:51:03 +00002849}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002850#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00002851
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002852#if defined(MBEDTLS_SSL_CLI_C)
Hanno Beckerf852b1c2019-02-05 11:42:30 +00002853int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl,
2854 mbedtls_ssl_session *dst )
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02002855{
Hanno Beckere810bbc2021-05-14 16:01:05 +01002856 int ret;
2857
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02002858 if( ssl == NULL ||
2859 dst == NULL ||
2860 ssl->session == NULL ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002861 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02002862 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002863 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02002864 }
2865
Hanno Beckere810bbc2021-05-14 16:01:05 +01002866 /* Since Mbed TLS 3.0, mbedtls_ssl_get_session() is no longer
2867 * idempotent: Each session can only be exported once.
2868 *
2869 * (This is in preparation for TLS 1.3 support where we will
2870 * need the ability to export multiple sessions (aka tickets),
2871 * which will be achieved by calling mbedtls_ssl_get_session()
2872 * multiple times until it fails.)
2873 *
2874 * Check whether we have already exported the current session,
2875 * and fail if so.
2876 */
2877 if( ssl->session->exported == 1 )
2878 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
2879
2880 ret = mbedtls_ssl_session_copy( dst, ssl->session );
2881 if( ret != 0 )
2882 return( ret );
2883
2884 /* Remember that we've exported the session. */
2885 ssl->session->exported = 1;
2886 return( 0 );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02002887}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002888#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02002889
Paul Bakker5121ce52009-01-03 21:22:43 +00002890/*
Hanno Beckera835da52019-05-16 12:39:07 +01002891 * Define ticket header determining Mbed TLS version
2892 * and structure of the ticket.
2893 */
2894
Hanno Becker94ef3b32019-05-16 12:50:45 +01002895/*
Hanno Becker50b59662019-05-28 14:30:45 +01002896 * Define bitflag determining compile-time settings influencing
2897 * structure of serialized SSL sessions.
Hanno Becker94ef3b32019-05-16 12:50:45 +01002898 */
2899
Hanno Becker50b59662019-05-28 14:30:45 +01002900#if defined(MBEDTLS_HAVE_TIME)
Hanno Becker3e088662019-05-29 11:10:18 +01002901#define SSL_SERIALIZED_SESSION_CONFIG_TIME 1
Hanno Becker50b59662019-05-28 14:30:45 +01002902#else
Hanno Becker3e088662019-05-29 11:10:18 +01002903#define SSL_SERIALIZED_SESSION_CONFIG_TIME 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01002904#endif /* MBEDTLS_HAVE_TIME */
2905
2906#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker3e088662019-05-29 11:10:18 +01002907#define SSL_SERIALIZED_SESSION_CONFIG_CRT 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01002908#else
Hanno Becker3e088662019-05-29 11:10:18 +01002909#define SSL_SERIALIZED_SESSION_CONFIG_CRT 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01002910#endif /* MBEDTLS_X509_CRT_PARSE_C */
2911
2912#if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_SESSION_TICKETS)
Hanno Becker3e088662019-05-29 11:10:18 +01002913#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01002914#else
Hanno Becker3e088662019-05-29 11:10:18 +01002915#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01002916#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_SESSION_TICKETS */
2917
2918#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Hanno Becker3e088662019-05-29 11:10:18 +01002919#define SSL_SERIALIZED_SESSION_CONFIG_MFL 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01002920#else
Hanno Becker3e088662019-05-29 11:10:18 +01002921#define SSL_SERIALIZED_SESSION_CONFIG_MFL 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01002922#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
2923
Hanno Becker94ef3b32019-05-16 12:50:45 +01002924#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker3e088662019-05-29 11:10:18 +01002925#define SSL_SERIALIZED_SESSION_CONFIG_ETM 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01002926#else
Hanno Becker3e088662019-05-29 11:10:18 +01002927#define SSL_SERIALIZED_SESSION_CONFIG_ETM 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01002928#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
2929
Hanno Becker94ef3b32019-05-16 12:50:45 +01002930#if defined(MBEDTLS_SSL_SESSION_TICKETS)
2931#define SSL_SERIALIZED_SESSION_CONFIG_TICKET 1
2932#else
2933#define SSL_SERIALIZED_SESSION_CONFIG_TICKET 0
2934#endif /* MBEDTLS_SSL_SESSION_TICKETS */
2935
Hanno Becker3e088662019-05-29 11:10:18 +01002936#define SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT 0
2937#define SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT 1
2938#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT 2
2939#define SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT 3
Hanno Becker37bdbe62021-08-01 05:38:58 +01002940#define SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT 4
2941#define SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT 5
Hanno Becker3e088662019-05-29 11:10:18 +01002942
Hanno Becker50b59662019-05-28 14:30:45 +01002943#define SSL_SERIALIZED_SESSION_CONFIG_BITFLAG \
Hanno Becker3e088662019-05-29 11:10:18 +01002944 ( (uint16_t) ( \
2945 ( SSL_SERIALIZED_SESSION_CONFIG_TIME << SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT ) | \
2946 ( SSL_SERIALIZED_SESSION_CONFIG_CRT << SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT ) | \
2947 ( SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET << SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT ) | \
2948 ( SSL_SERIALIZED_SESSION_CONFIG_MFL << SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT ) | \
Hanno Becker3e088662019-05-29 11:10:18 +01002949 ( SSL_SERIALIZED_SESSION_CONFIG_ETM << SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT ) | \
Hanno Beckerbe34e8e2019-06-04 09:43:16 +01002950 ( SSL_SERIALIZED_SESSION_CONFIG_TICKET << SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT ) ) )
Hanno Becker94ef3b32019-05-16 12:50:45 +01002951
Hanno Beckerf8787072019-05-16 12:41:07 +01002952static unsigned char ssl_serialized_session_header[] = {
Hanno Becker94ef3b32019-05-16 12:50:45 +01002953 MBEDTLS_VERSION_MAJOR,
2954 MBEDTLS_VERSION_MINOR,
2955 MBEDTLS_VERSION_PATCH,
Joe Subbiani2194dc42021-07-14 12:31:31 +01002956 MBEDTLS_BYTE_1( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
2957 MBEDTLS_BYTE_0( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
Hanno Beckerf8787072019-05-16 12:41:07 +01002958};
Hanno Beckera835da52019-05-16 12:39:07 +01002959
2960/*
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02002961 * Serialize a session in the following format:
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02002962 * (in the presentation language of TLS, RFC 8446 section 3)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02002963 *
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01002964 * struct {
Hanno Beckerdc28b6c2019-05-29 11:08:00 +01002965 *
Hanno Beckerdce50972021-08-01 05:39:23 +01002966 * opaque mbedtls_version[3]; // library version: major, minor, patch
2967 * opaque session_format[2]; // library-version specific 16-bit field
2968 * // determining the format of the remaining
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01002969 * // serialized data.
Hanno Beckerdc28b6c2019-05-29 11:08:00 +01002970 *
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01002971 * Note: When updating the format, remember to keep
2972 * these version+format bytes.
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02002973 *
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01002974 * // In this version, `session_format` determines
2975 * // the setting of those compile-time
2976 * // configuration options which influence
2977 * // the structure of mbedtls_ssl_session.
2978 *
Glenn Straussda7851c2022-03-14 13:29:48 -04002979 * uint8_t minor_ver; // Protocol minor version. Possible values:
2980 * // - TLS 1.2 (3)
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01002981 *
Glenn Straussda7851c2022-03-14 13:29:48 -04002982 * select (serialized_session.tls_version) {
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01002983 *
Glenn Straussda7851c2022-03-14 13:29:48 -04002984 * case MBEDTLS_SSL_VERSION_TLS1_2:
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01002985 * serialized_session_tls12 data;
2986 *
2987 * };
2988 *
2989 * } serialized_session;
2990 *
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02002991 */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01002992
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002993MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01002994static int ssl_session_save( const mbedtls_ssl_session *session,
2995 unsigned char omit_header,
2996 unsigned char *buf,
2997 size_t buf_len,
2998 size_t *olen )
2999{
3000 unsigned char *p = buf;
3001 size_t used = 0;
Jerry Yu251a12e2022-07-13 15:15:48 +08003002 size_t remaining_len;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003003
Jerry Yu438ddd82022-07-07 06:55:50 +00003004 if( session == NULL )
3005 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3006
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003007 if( !omit_header )
3008 {
3009 /*
3010 * Add Mbed TLS version identifier
3011 */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003012 used += sizeof( ssl_serialized_session_header );
3013
3014 if( used <= buf_len )
3015 {
3016 memcpy( p, ssl_serialized_session_header,
3017 sizeof( ssl_serialized_session_header ) );
3018 p += sizeof( ssl_serialized_session_header );
3019 }
3020 }
3021
3022 /*
3023 * TLS version identifier
3024 */
3025 used += 1;
3026 if( used <= buf_len )
3027 {
Glenn Straussda7851c2022-03-14 13:29:48 -04003028 *p++ = MBEDTLS_BYTE_0( session->tls_version );
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003029 }
3030
3031 /* Forward to version-specific serialization routine. */
Jerry Yufca4d572022-07-21 10:37:48 +08003032 remaining_len = (buf_len >= used) ? buf_len - used : 0;
Glenn Straussda7851c2022-03-14 13:29:48 -04003033 switch( session->tls_version )
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003034 {
3035#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Glenn Straussda7851c2022-03-14 13:29:48 -04003036 case MBEDTLS_SSL_VERSION_TLS1_2:
Jerry Yu438ddd82022-07-07 06:55:50 +00003037 used += ssl_tls12_session_save( session, p, remaining_len );
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003038 break;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003039#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3040
Jerry Yu251a12e2022-07-13 15:15:48 +08003041#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
3042 case MBEDTLS_SSL_VERSION_TLS1_3:
Jerry Yu438ddd82022-07-07 06:55:50 +00003043 used += ssl_tls13_session_save( session, p, remaining_len );
Jerry Yu251a12e2022-07-13 15:15:48 +08003044 break;
Jerry Yu251a12e2022-07-13 15:15:48 +08003045#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
3046
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003047 default:
3048 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3049 }
3050
3051 *olen = used;
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003052 if( used > buf_len )
3053 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003054
3055 return( 0 );
3056}
3057
3058/*
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003059 * Public wrapper for ssl_session_save()
3060 */
3061int mbedtls_ssl_session_save( const mbedtls_ssl_session *session,
3062 unsigned char *buf,
3063 size_t buf_len,
3064 size_t *olen )
3065{
3066 return( ssl_session_save( session, 0, buf, buf_len, olen ) );
3067}
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003068
Jerry Yuf1b23ca2022-02-18 11:48:47 +08003069/*
3070 * Deserialize session, see mbedtls_ssl_session_save() for format.
3071 *
3072 * This internal version is wrapped by a public function that cleans up in
3073 * case of error, and has an extra option omit_header.
3074 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003075MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003076static int ssl_session_load( mbedtls_ssl_session *session,
3077 unsigned char omit_header,
3078 const unsigned char *buf,
3079 size_t len )
3080{
3081 const unsigned char *p = buf;
3082 const unsigned char * const end = buf + len;
Jerry Yu438ddd82022-07-07 06:55:50 +00003083 size_t remaining_len;
3084
3085
3086 if( session == NULL )
3087 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003088
3089 if( !omit_header )
3090 {
3091 /*
3092 * Check Mbed TLS version identifier
3093 */
3094
3095 if( (size_t)( end - p ) < sizeof( ssl_serialized_session_header ) )
3096 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3097
3098 if( memcmp( p, ssl_serialized_session_header,
3099 sizeof( ssl_serialized_session_header ) ) != 0 )
3100 {
3101 return( MBEDTLS_ERR_SSL_VERSION_MISMATCH );
3102 }
3103 p += sizeof( ssl_serialized_session_header );
3104 }
3105
3106 /*
3107 * TLS version identifier
3108 */
3109 if( 1 > (size_t)( end - p ) )
3110 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Glenn Straussda7851c2022-03-14 13:29:48 -04003111 session->tls_version = 0x0300 | *p++;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003112
3113 /* Dispatch according to TLS version. */
Jerry Yu438ddd82022-07-07 06:55:50 +00003114 remaining_len = ( end - p );
Glenn Straussda7851c2022-03-14 13:29:48 -04003115 switch( session->tls_version )
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003116 {
3117#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Glenn Straussda7851c2022-03-14 13:29:48 -04003118 case MBEDTLS_SSL_VERSION_TLS1_2:
Jerry Yu438ddd82022-07-07 06:55:50 +00003119 return( ssl_tls12_session_load( session, p, remaining_len ) );
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003120#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3121
Jerry Yu438ddd82022-07-07 06:55:50 +00003122#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
3123 case MBEDTLS_SSL_VERSION_TLS1_3:
3124 return( ssl_tls13_session_load( session, p, remaining_len ) );
3125#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
3126
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003127 default:
3128 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3129 }
3130}
3131
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003132/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02003133 * Deserialize session: public wrapper for error cleaning
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003134 */
3135int mbedtls_ssl_session_load( mbedtls_ssl_session *session,
3136 const unsigned char *buf,
3137 size_t len )
3138{
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003139 int ret = ssl_session_load( session, 0, buf, len );
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003140
3141 if( ret != 0 )
3142 mbedtls_ssl_session_free( session );
3143
3144 return( ret );
3145}
3146
3147/*
Paul Bakker1961b702013-01-25 14:49:24 +01003148 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003149 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003150MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker41934dd2021-08-07 19:13:43 +01003151static int ssl_prepare_handshake_step( mbedtls_ssl_context *ssl )
3152{
3153 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3154
Ronald Cron66dbf912022-02-02 15:33:46 +01003155 /*
3156 * We may have not been able to send to the peer all the handshake data
Ronald Cron3f20b772022-03-08 16:00:02 +01003157 * that were written into the output buffer by the previous handshake step,
3158 * if the write to the network callback returned with the
Ronald Cron66dbf912022-02-02 15:33:46 +01003159 * #MBEDTLS_ERR_SSL_WANT_WRITE error code.
3160 * We proceed to the next handshake step only when all data from the
3161 * previous one have been sent to the peer, thus we make sure that this is
3162 * the case here by calling `mbedtls_ssl_flush_output()`. The function may
3163 * return with the #MBEDTLS_ERR_SSL_WANT_WRITE error code in which case
3164 * we have to wait before to go ahead.
3165 * In the case of TLS 1.3, handshake step handlers do not send data to the
3166 * peer. Data are only sent here and through
3167 * `mbedtls_ssl_handle_pending_alert` in case an error that triggered an
Andrzej Kurek5c65c572022-04-13 14:28:52 -04003168 * alert occurred.
Ronald Cron66dbf912022-02-02 15:33:46 +01003169 */
Hanno Becker41934dd2021-08-07 19:13:43 +01003170 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
3171 return( ret );
3172
3173#if defined(MBEDTLS_SSL_PROTO_DTLS)
3174 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3175 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
3176 {
3177 if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
3178 return( ret );
3179 }
3180#endif /* MBEDTLS_SSL_PROTO_DTLS */
3181
3182 return( ret );
3183}
3184
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003185int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003186{
Hanno Becker41934dd2021-08-07 19:13:43 +01003187 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003188
Hanno Becker41934dd2021-08-07 19:13:43 +01003189 if( ssl == NULL ||
3190 ssl->conf == NULL ||
3191 ssl->handshake == NULL ||
Paul Elliott27b0d942022-03-18 21:55:32 +00003192 mbedtls_ssl_is_handshake_over( ssl ) == 1 )
Hanno Becker41934dd2021-08-07 19:13:43 +01003193 {
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02003194 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Hanno Becker41934dd2021-08-07 19:13:43 +01003195 }
3196
3197 ret = ssl_prepare_handshake_step( ssl );
3198 if( ret != 0 )
3199 return( ret );
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02003200
Jerry Yue7047812021-09-13 19:26:39 +08003201 ret = mbedtls_ssl_handle_pending_alert( ssl );
3202 if( ret != 0 )
3203 goto cleanup;
3204
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003205#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003206 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Jerry Yub9930e72021-08-06 17:11:51 +08003207 {
Ronald Cron27c85e72022-03-08 11:37:55 +01003208 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %s",
3209 mbedtls_ssl_states_str( ssl->state ) ) );
Jerry Yub9930e72021-08-06 17:11:51 +08003210
Ronald Cron9f0fba32022-02-10 16:45:15 +01003211 switch( ssl->state )
3212 {
3213 case MBEDTLS_SSL_HELLO_REQUEST:
3214 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
3215 break;
Jerry Yub9930e72021-08-06 17:11:51 +08003216
Ronald Cron9f0fba32022-02-10 16:45:15 +01003217 case MBEDTLS_SSL_CLIENT_HELLO:
3218 ret = mbedtls_ssl_write_client_hello( ssl );
3219 break;
3220
3221 default:
3222#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
Glenn Strauss60bfe602022-03-14 19:04:24 -04003223 if( ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_3 )
Ronald Cron9f0fba32022-02-10 16:45:15 +01003224 ret = mbedtls_ssl_tls13_handshake_client_step( ssl );
3225 else
3226 ret = mbedtls_ssl_handshake_client_step( ssl );
3227#elif defined(MBEDTLS_SSL_PROTO_TLS1_2)
3228 ret = mbedtls_ssl_handshake_client_step( ssl );
3229#else
3230 ret = mbedtls_ssl_tls13_handshake_client_step( ssl );
3231#endif
3232 }
Jerry Yub9930e72021-08-06 17:11:51 +08003233 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003234#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003235#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003236 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Jerry Yub9930e72021-08-06 17:11:51 +08003237 {
Ronald Cron6f135e12021-12-08 16:57:54 +01003238#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yub9930e72021-08-06 17:11:51 +08003239 if( mbedtls_ssl_conf_is_tls13_only( ssl->conf ) )
Jerry Yu27561932021-08-27 17:07:38 +08003240 ret = mbedtls_ssl_tls13_handshake_server_step( ssl );
Ronald Cron6f135e12021-12-08 16:57:54 +01003241#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Jerry Yub9930e72021-08-06 17:11:51 +08003242
3243#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3244 if( mbedtls_ssl_conf_is_tls12_only( ssl->conf ) )
3245 ret = mbedtls_ssl_handshake_server_step( ssl );
3246#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3247 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003248#endif
3249
Jerry Yue7047812021-09-13 19:26:39 +08003250 if( ret != 0 )
3251 {
Jerry Yubbd5a3f2021-09-18 20:50:22 +08003252 /* handshake_step return error. And it is same
3253 * with alert_reason.
3254 */
Jerry Yu3bf1f972021-09-22 21:37:18 +08003255 if( ssl->send_alert )
Jerry Yue7047812021-09-13 19:26:39 +08003256 {
Jerry Yu3bf1f972021-09-22 21:37:18 +08003257 ret = mbedtls_ssl_handle_pending_alert( ssl );
Jerry Yue7047812021-09-13 19:26:39 +08003258 goto cleanup;
3259 }
3260 }
3261
3262cleanup:
Paul Bakker1961b702013-01-25 14:49:24 +01003263 return( ret );
3264}
3265
3266/*
3267 * Perform the SSL handshake
3268 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003269int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl )
Paul Bakker1961b702013-01-25 14:49:24 +01003270{
3271 int ret = 0;
3272
Hanno Beckera817ea42020-10-20 15:20:23 +01003273 /* Sanity checks */
3274
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02003275 if( ssl == NULL || ssl->conf == NULL )
3276 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3277
Hanno Beckera817ea42020-10-20 15:20:23 +01003278#if defined(MBEDTLS_SSL_PROTO_DTLS)
3279 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3280 ( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL ) )
3281 {
3282 MBEDTLS_SSL_DEBUG_MSG( 1, ( "You must use "
3283 "mbedtls_ssl_set_timer_cb() for DTLS" ) );
3284 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3285 }
3286#endif /* MBEDTLS_SSL_PROTO_DTLS */
3287
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003288 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
Paul Bakker1961b702013-01-25 14:49:24 +01003289
Hanno Beckera817ea42020-10-20 15:20:23 +01003290 /* Main handshake loop */
Paul Elliott27b0d942022-03-18 21:55:32 +00003291 while( mbedtls_ssl_is_handshake_over( ssl ) == 0 )
Paul Bakker1961b702013-01-25 14:49:24 +01003292 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003293 ret = mbedtls_ssl_handshake_step( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003294
3295 if( ret != 0 )
3296 break;
3297 }
3298
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003299 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003300
3301 return( ret );
3302}
3303
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003304#if defined(MBEDTLS_SSL_RENEGOTIATION)
3305#if defined(MBEDTLS_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003306/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003307 * Write HelloRequest to request renegotiation on server
Paul Bakker48916f92012-09-16 19:57:18 +00003308 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003309MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003310static int ssl_write_hello_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003311{
Janos Follath865b3eb2019-12-16 11:46:15 +00003312 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003313
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003314 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello request" ) );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003315
3316 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003317 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3318 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003319
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003320 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003321 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003322 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003323 return( ret );
3324 }
3325
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003326 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello request" ) );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003327
3328 return( 0 );
3329}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003330#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003331
3332/*
3333 * Actually renegotiate current connection, triggered by either:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003334 * - any side: calling mbedtls_ssl_renegotiate(),
3335 * - client: receiving a HelloRequest during mbedtls_ssl_read(),
3336 * - server: receiving any handshake message on server during mbedtls_ssl_read() after
Manuel Pégourié-Gonnard55e4ff22014-08-19 11:16:35 +02003337 * the initial handshake is completed.
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003338 * If the handshake doesn't complete due to waiting for I/O, it will continue
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003339 * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively.
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003340 */
Hanno Becker40cdaa12020-02-05 10:48:27 +00003341int mbedtls_ssl_start_renegotiation( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00003342{
Janos Follath865b3eb2019-12-16 11:46:15 +00003343 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker48916f92012-09-16 19:57:18 +00003344
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003345 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003346
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003347 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3348 return( ret );
Paul Bakker48916f92012-09-16 19:57:18 +00003349
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02003350 /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and
3351 * the ServerHello will have message_seq = 1" */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003352#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003353 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003354 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02003355 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003356 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02003357 ssl->handshake->out_msg_seq = 1;
3358 else
3359 ssl->handshake->in_msg_seq = 1;
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02003360 }
3361#endif
3362
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003363 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
3364 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS;
Paul Bakker48916f92012-09-16 19:57:18 +00003365
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003366 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00003367 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003368 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Paul Bakker48916f92012-09-16 19:57:18 +00003369 return( ret );
3370 }
3371
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003372 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003373
3374 return( 0 );
3375}
3376
3377/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003378 * Renegotiate current connection on client,
3379 * or request renegotiation on server
3380 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003381int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003382{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003383 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003384
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02003385 if( ssl == NULL || ssl->conf == NULL )
3386 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3387
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003388#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003389 /* On server, just send the request */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003390 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003391 {
Paul Elliott27b0d942022-03-18 21:55:32 +00003392 if( mbedtls_ssl_is_handshake_over( ssl ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003393 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003394
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003395 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02003396
3397 /* Did we already try/start sending HelloRequest? */
3398 if( ssl->out_left != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003399 return( mbedtls_ssl_flush_output( ssl ) );
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02003400
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003401 return( ssl_write_hello_request( ssl ) );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003402 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003403#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003404
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003405#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003406 /*
3407 * On client, either start the renegotiation process or,
3408 * if already in progress, continue the handshake
3409 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003410 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003411 {
Paul Elliott27b0d942022-03-18 21:55:32 +00003412 if( mbedtls_ssl_is_handshake_over( ssl ) == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003413 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003414
Hanno Becker40cdaa12020-02-05 10:48:27 +00003415 if( ( ret = mbedtls_ssl_start_renegotiation( ssl ) ) != 0 )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003416 {
Hanno Becker40cdaa12020-02-05 10:48:27 +00003417 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_start_renegotiation", ret );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003418 return( ret );
3419 }
3420 }
3421 else
3422 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003423 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003424 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003425 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003426 return( ret );
3427 }
3428 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003429#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003430
Paul Bakker37ce0ff2013-10-31 14:32:04 +01003431 return( ret );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003432}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003433#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003434
Gilles Peskine9b562d52018-04-25 20:32:43 +02003435void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00003436{
Gilles Peskine9b562d52018-04-25 20:32:43 +02003437 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3438
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003439 if( handshake == NULL )
3440 return;
3441
Brett Warrene0edc842021-08-17 09:53:13 +01003442#if defined(MBEDTLS_ECP_C)
3443#if !defined(MBEDTLS_DEPRECATED_REMOVED)
3444 if ( ssl->handshake->group_list_heap_allocated )
3445 mbedtls_free( (void*) handshake->group_list );
3446 handshake->group_list = NULL;
3447#endif /* MBEDTLS_DEPRECATED_REMOVED */
3448#endif /* MBEDTLS_ECP_C */
3449
Jerry Yuf017ee42022-01-12 15:49:48 +08003450#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
3451#if !defined(MBEDTLS_DEPRECATED_REMOVED)
3452 if ( ssl->handshake->sig_algs_heap_allocated )
3453 mbedtls_free( (void*) handshake->sig_algs );
3454 handshake->sig_algs = NULL;
3455#endif /* MBEDTLS_DEPRECATED_REMOVED */
Xiaofei Baic234ecf2022-02-08 09:59:23 +00003456#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
3457 if( ssl->handshake->certificate_request_context )
3458 {
3459 mbedtls_free( (void*) handshake->certificate_request_context );
3460 }
3461#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Jerry Yuf017ee42022-01-12 15:49:48 +08003462#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
3463
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003464#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3465 if( ssl->conf->f_async_cancel != NULL && handshake->async_in_progress != 0 )
3466 {
Gilles Peskine8f97af72018-04-26 11:46:10 +02003467 ssl->conf->f_async_cancel( ssl );
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02003468 handshake->async_in_progress = 0;
3469 }
3470#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3471
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02003472#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05003473#if defined(MBEDTLS_USE_PSA_CRYPTO)
3474 psa_hash_abort( &handshake->fin_sha256_psa );
3475#else
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02003476 mbedtls_sha256_free( &handshake->fin_sha256 );
3477#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05003478#endif
Mateusz Starzykc6d94ab2021-05-19 13:31:59 +02003479#if defined(MBEDTLS_SHA384_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05003480#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05003481 psa_hash_abort( &handshake->fin_sha384_psa );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003482#else
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02003483 mbedtls_sha512_free( &handshake->fin_sha512 );
3484#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05003485#endif
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02003486
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003487#if defined(MBEDTLS_DHM_C)
3488 mbedtls_dhm_free( &handshake->dhm_ctx );
Paul Bakker48916f92012-09-16 19:57:18 +00003489#endif
Neil Armstrongf3f46412022-04-12 14:43:39 +02003490#if !defined(MBEDTLS_USE_PSA_CRYPTO) && defined(MBEDTLS_ECDH_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003491 mbedtls_ecdh_free( &handshake->ecdh_ctx );
Paul Bakker61d113b2013-07-04 11:51:43 +02003492#endif
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02003493#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02003494 mbedtls_ecjpake_free( &handshake->ecjpake_ctx );
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02003495#if defined(MBEDTLS_SSL_CLI_C)
3496 mbedtls_free( handshake->ecjpake_cache );
3497 handshake->ecjpake_cache = NULL;
3498 handshake->ecjpake_cache_len = 0;
3499#endif
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02003500#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02003501
Janos Follath4ae5c292016-02-10 11:27:43 +00003502#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
3503 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Paul Bakker9af723c2014-05-01 13:03:14 +02003504 /* explicit void pointer cast for buggy MS compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003505 mbedtls_free( (void *) handshake->curves );
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +02003506#endif
3507
Gilles Peskineeccd8882020-03-10 12:19:08 +01003508#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Neil Armstrong501c9322022-05-03 09:35:09 +02003509#if defined(MBEDTLS_USE_PSA_CRYPTO)
3510 if( ! mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
3511 {
3512 /* The maintenance of the external PSK key slot is the
3513 * user's responsibility. */
3514 if( ssl->handshake->psk_opaque_is_internal )
3515 {
3516 psa_destroy_key( ssl->handshake->psk_opaque );
3517 ssl->handshake->psk_opaque_is_internal = 0;
3518 }
3519 ssl->handshake->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
3520 }
Neil Armstronge952a302022-05-03 10:22:14 +02003521#else
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01003522 if( handshake->psk != NULL )
3523 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003524 mbedtls_platform_zeroize( handshake->psk, handshake->psk_len );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01003525 mbedtls_free( handshake->psk );
3526 }
Neil Armstronge952a302022-05-03 10:22:14 +02003527#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01003528#endif
3529
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003530#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
3531 defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02003532 /*
3533 * Free only the linked list wrapper, not the keys themselves
3534 * since the belong to the SNI callback
3535 */
Glenn Strauss36872db2022-01-22 05:06:31 -05003536 ssl_key_cert_free( handshake->sni_key_cert );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003537#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02003538
Gilles Peskineeccd8882020-03-10 12:19:08 +01003539#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard6b7301c2017-08-15 12:08:45 +02003540 mbedtls_x509_crt_restart_free( &handshake->ecrs_ctx );
Hanno Becker3dad3112019-02-05 17:19:52 +00003541 if( handshake->ecrs_peer_cert != NULL )
3542 {
3543 mbedtls_x509_crt_free( handshake->ecrs_peer_cert );
3544 mbedtls_free( handshake->ecrs_peer_cert );
3545 }
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003546#endif
3547
Hanno Becker75173122019-02-06 16:18:31 +00003548#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
3549 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3550 mbedtls_pk_free( &handshake->peer_pubkey );
3551#endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3552
XiaokangQian9b93c0d2022-02-09 06:02:25 +00003553#if defined(MBEDTLS_SSL_CLI_C) && \
3554 ( defined(MBEDTLS_SSL_PROTO_DTLS) || defined(MBEDTLS_SSL_PROTO_TLS1_3) )
3555 mbedtls_free( handshake->cookie );
3556#endif /* MBEDTLS_SSL_CLI_C &&
3557 ( MBEDTLS_SSL_PROTO_DTLS || MBEDTLS_SSL_PROTO_TLS1_3 ) */
XiaokangQian8499b6c2022-01-27 09:00:11 +00003558
3559#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker533ab5f2020-02-05 10:49:13 +00003560 mbedtls_ssl_flight_free( handshake->flight );
3561 mbedtls_ssl_buffering_free( ssl );
XiaokangQian8499b6c2022-01-27 09:00:11 +00003562#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02003563
Ronald Cronf12b81d2022-03-15 10:42:41 +01003564#if defined(MBEDTLS_ECDH_C) && \
3565 ( defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3) )
Neil Armstrongf716a702022-04-04 11:23:46 +02003566 if( handshake->ecdh_psa_privkey_is_external == 0 )
Neil Armstrong8113d252022-03-23 10:57:04 +01003567 psa_destroy_key( handshake->ecdh_psa_privkey );
Hanno Becker4a63ed42019-01-08 11:39:35 +00003568#endif /* MBEDTLS_ECDH_C && MBEDTLS_USE_PSA_CRYPTO */
3569
Ronald Cron6f135e12021-12-08 16:57:54 +01003570#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yua1a568c2021-11-09 10:17:21 +08003571 mbedtls_ssl_transform_free( handshake->transform_handshake );
3572 mbedtls_ssl_transform_free( handshake->transform_earlydata );
Jerry Yuba9c7272021-10-30 11:54:10 +08003573 mbedtls_free( handshake->transform_earlydata );
3574 mbedtls_free( handshake->transform_handshake );
Ronald Cron6f135e12021-12-08 16:57:54 +01003575#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Jerry Yuba9c7272021-10-30 11:54:10 +08003576
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003577
3578#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3579 /* If the buffers are too big - reallocate. Because of the way Mbed TLS
3580 * processes datagrams and the fact that a datagram is allowed to have
3581 * several records in it, it is possible that the I/O buffers are not
3582 * empty at this stage */
Andrzej Kurek4a063792020-10-21 15:08:44 +02003583 handle_buffer_resizing( ssl, 1, mbedtls_ssl_get_input_buflen( ssl ),
3584 mbedtls_ssl_get_output_buflen( ssl ) );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003585#endif
Hanno Becker3aa186f2021-08-10 09:24:19 +01003586
Jerry Yuba9c7272021-10-30 11:54:10 +08003587 /* mbedtls_platform_zeroize MUST be last one in this function */
3588 mbedtls_platform_zeroize( handshake,
3589 sizeof( mbedtls_ssl_handshake_params ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003590}
3591
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003592void mbedtls_ssl_session_free( mbedtls_ssl_session *session )
Paul Bakker48916f92012-09-16 19:57:18 +00003593{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003594 if( session == NULL )
3595 return;
3596
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003597#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker1294a0b2019-02-05 12:38:15 +00003598 ssl_clear_peer_cert( session );
Paul Bakkered27a042013-04-18 22:46:23 +02003599#endif
Paul Bakker0a597072012-09-25 21:55:46 +00003600
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02003601#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003602 mbedtls_free( session->ticket );
Paul Bakkera503a632013-08-14 13:48:06 +02003603#endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02003604
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003605 mbedtls_platform_zeroize( session, sizeof( mbedtls_ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003606}
3607
Manuel Pégourié-Gonnard5c0e3772019-07-23 16:13:17 +02003608#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02003609
3610#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
3611#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 1u
3612#else
3613#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 0u
3614#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3615
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02003616#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 1u
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02003617
3618#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
3619#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 1u
3620#else
3621#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 0u
3622#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
3623
3624#if defined(MBEDTLS_SSL_ALPN)
3625#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 1u
3626#else
3627#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 0u
3628#endif /* MBEDTLS_SSL_ALPN */
3629
3630#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT 0
3631#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT 1
3632#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT 2
3633#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT 3
3634
3635#define SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG \
3636 ( (uint32_t) ( \
3637 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT ) | \
3638 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT ) | \
3639 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT ) | \
3640 ( SSL_SERIALIZED_CONTEXT_CONFIG_ALPN << SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT ) | \
3641 0u ) )
3642
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003643static unsigned char ssl_serialized_context_header[] = {
3644 MBEDTLS_VERSION_MAJOR,
3645 MBEDTLS_VERSION_MINOR,
3646 MBEDTLS_VERSION_PATCH,
Joe Subbiani2194dc42021-07-14 12:31:31 +01003647 MBEDTLS_BYTE_1( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
3648 MBEDTLS_BYTE_0( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
3649 MBEDTLS_BYTE_2( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
3650 MBEDTLS_BYTE_1( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
3651 MBEDTLS_BYTE_0( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003652};
3653
Paul Bakker5121ce52009-01-03 21:22:43 +00003654/*
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02003655 * Serialize a full SSL context
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02003656 *
3657 * The format of the serialized data is:
3658 * (in the presentation language of TLS, RFC 8446 section 3)
3659 *
3660 * // header
3661 * opaque mbedtls_version[3]; // major, minor, patch
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003662 * opaque context_format[5]; // version-specific field determining
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02003663 * // the format of the remaining
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003664 * // serialized data.
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02003665 * Note: When updating the format, remember to keep these
3666 * version+format bytes. (We may make their size part of the API.)
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02003667 *
3668 * // session sub-structure
3669 * opaque session<1..2^32-1>; // see mbedtls_ssl_session_save()
3670 * // transform sub-structure
3671 * uint8 random[64]; // ServerHello.random+ClientHello.random
3672 * uint8 in_cid<0..2^8-1> // Connection ID: expected incoming value
3673 * uint8 out_cid<0..2^8-1> // Connection ID: outgoing value to use
3674 * // fields from ssl_context
3675 * uint32 badmac_seen; // DTLS: number of records with failing MAC
3676 * uint64 in_window_top; // DTLS: last validated record seq_num
3677 * uint64 in_window; // DTLS: bitmask for replay protection
3678 * uint8 disable_datagram_packing; // DTLS: only one record per datagram
3679 * uint64 cur_out_ctr; // Record layer: outgoing sequence number
3680 * uint16 mtu; // DTLS: path mtu (max outgoing fragment size)
3681 * uint8 alpn_chosen<0..2^8-1> // ALPN: negotiated application protocol
3682 *
3683 * Note that many fields of the ssl_context or sub-structures are not
3684 * serialized, as they fall in one of the following categories:
3685 *
3686 * 1. forced value (eg in_left must be 0)
3687 * 2. pointer to dynamically-allocated memory (eg session, transform)
3688 * 3. value can be re-derived from other data (eg session keys from MS)
3689 * 4. value was temporary (eg content of input buffer)
3690 * 5. value will be provided by the user again (eg I/O callbacks and context)
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02003691 */
3692int mbedtls_ssl_context_save( mbedtls_ssl_context *ssl,
3693 unsigned char *buf,
3694 size_t buf_len,
3695 size_t *olen )
3696{
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003697 unsigned char *p = buf;
3698 size_t used = 0;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003699 size_t session_len;
3700 int ret = 0;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003701
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02003702 /*
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003703 * Enforce usage restrictions, see "return BAD_INPUT_DATA" in
3704 * this function's documentation.
3705 *
3706 * These are due to assumptions/limitations in the implementation. Some of
3707 * them are likely to stay (no handshake in progress) some might go away
3708 * (only DTLS) but are currently used to simplify the implementation.
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02003709 */
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003710 /* The initial handshake must be over */
Paul Elliott27b0d942022-03-18 21:55:32 +00003711 if( mbedtls_ssl_is_handshake_over( ssl ) == 0 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003712 {
3713 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Initial handshake isn't over" ) );
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02003714 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003715 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003716 if( ssl->handshake != NULL )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003717 {
3718 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Handshake isn't completed" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003719 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003720 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003721 /* Double-check that sub-structures are indeed ready */
3722 if( ssl->transform == NULL || ssl->session == NULL )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003723 {
3724 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Serialised structures aren't ready" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003725 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003726 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003727 /* There must be no pending incoming or outgoing data */
3728 if( mbedtls_ssl_check_pending( ssl ) != 0 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003729 {
3730 MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending incoming data" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003731 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003732 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003733 if( ssl->out_left != 0 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003734 {
3735 MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending outgoing data" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003736 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003737 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003738 /* Protocol must be DLTS, not TLS */
3739 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003740 {
3741 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only DTLS is supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003742 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003743 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003744 /* Version must be 1.2 */
Glenn Strauss60bfe602022-03-14 19:04:24 -04003745 if( ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003746 {
3747 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only version 1.2 supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003748 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003749 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003750 /* We must be using an AEAD ciphersuite */
3751 if( mbedtls_ssl_transform_uses_aead( ssl->transform ) != 1 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003752 {
3753 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only AEAD ciphersuites supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003754 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003755 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003756 /* Renegotiation must not be enabled */
3757#if defined(MBEDTLS_SSL_RENEGOTIATION)
3758 if( ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003759 {
3760 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Renegotiation must not be enabled" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003761 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03003762 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02003763#endif
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02003764
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003765 /*
3766 * Version and format identifier
3767 */
3768 used += sizeof( ssl_serialized_context_header );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02003769
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003770 if( used <= buf_len )
3771 {
3772 memcpy( p, ssl_serialized_context_header,
3773 sizeof( ssl_serialized_context_header ) );
3774 p += sizeof( ssl_serialized_context_header );
3775 }
3776
3777 /*
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003778 * Session (length + data)
3779 */
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003780 ret = ssl_session_save( ssl->session, 1, NULL, 0, &session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003781 if( ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL )
3782 return( ret );
3783
3784 used += 4 + session_len;
3785 if( used <= buf_len )
3786 {
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01003787 MBEDTLS_PUT_UINT32_BE( session_len, p, 0 );
3788 p += 4;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003789
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003790 ret = ssl_session_save( ssl->session, 1,
3791 p, session_len, &session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003792 if( ret != 0 )
3793 return( ret );
3794
3795 p += session_len;
3796 }
3797
3798 /*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02003799 * Transform
3800 */
3801 used += sizeof( ssl->transform->randbytes );
3802 if( used <= buf_len )
3803 {
3804 memcpy( p, ssl->transform->randbytes,
3805 sizeof( ssl->transform->randbytes ) );
3806 p += sizeof( ssl->transform->randbytes );
3807 }
3808
3809#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
3810 used += 2 + ssl->transform->in_cid_len + ssl->transform->out_cid_len;
3811 if( used <= buf_len )
3812 {
3813 *p++ = ssl->transform->in_cid_len;
3814 memcpy( p, ssl->transform->in_cid, ssl->transform->in_cid_len );
3815 p += ssl->transform->in_cid_len;
3816
3817 *p++ = ssl->transform->out_cid_len;
3818 memcpy( p, ssl->transform->out_cid, ssl->transform->out_cid_len );
3819 p += ssl->transform->out_cid_len;
3820 }
3821#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
3822
3823 /*
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02003824 * Saved fields from top-level ssl_context structure
3825 */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02003826 used += 4;
3827 if( used <= buf_len )
3828 {
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01003829 MBEDTLS_PUT_UINT32_BE( ssl->badmac_seen, p, 0 );
3830 p += 4;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02003831 }
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02003832
3833#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
3834 used += 16;
3835 if( used <= buf_len )
3836 {
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01003837 MBEDTLS_PUT_UINT64_BE( ssl->in_window_top, p, 0 );
3838 p += 8;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02003839
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01003840 MBEDTLS_PUT_UINT64_BE( ssl->in_window, p, 0 );
3841 p += 8;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02003842 }
3843#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
3844
3845#if defined(MBEDTLS_SSL_PROTO_DTLS)
3846 used += 1;
3847 if( used <= buf_len )
3848 {
3849 *p++ = ssl->disable_datagram_packing;
3850 }
3851#endif /* MBEDTLS_SSL_PROTO_DTLS */
3852
Jerry Yuae0b2e22021-10-08 15:21:19 +08003853 used += MBEDTLS_SSL_SEQUENCE_NUMBER_LEN;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02003854 if( used <= buf_len )
3855 {
Jerry Yuae0b2e22021-10-08 15:21:19 +08003856 memcpy( p, ssl->cur_out_ctr, MBEDTLS_SSL_SEQUENCE_NUMBER_LEN );
3857 p += MBEDTLS_SSL_SEQUENCE_NUMBER_LEN;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02003858 }
3859
3860#if defined(MBEDTLS_SSL_PROTO_DTLS)
3861 used += 2;
3862 if( used <= buf_len )
3863 {
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01003864 MBEDTLS_PUT_UINT16_BE( ssl->mtu, p, 0 );
3865 p += 2;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02003866 }
3867#endif /* MBEDTLS_SSL_PROTO_DTLS */
3868
3869#if defined(MBEDTLS_SSL_ALPN)
3870 {
3871 const uint8_t alpn_len = ssl->alpn_chosen
Manuel Pégourié-Gonnardf041f4e2019-07-24 00:58:27 +02003872 ? (uint8_t) strlen( ssl->alpn_chosen )
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02003873 : 0;
3874
3875 used += 1 + alpn_len;
3876 if( used <= buf_len )
3877 {
3878 *p++ = alpn_len;
3879
3880 if( ssl->alpn_chosen != NULL )
3881 {
3882 memcpy( p, ssl->alpn_chosen, alpn_len );
3883 p += alpn_len;
3884 }
3885 }
3886 }
3887#endif /* MBEDTLS_SSL_ALPN */
3888
3889 /*
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003890 * Done
3891 */
3892 *olen = used;
3893
3894 if( used > buf_len )
3895 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02003896
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003897 MBEDTLS_SSL_DEBUG_BUF( 4, "saved context", buf, used );
3898
Hanno Becker43aefe22020-02-05 10:44:56 +00003899 return( mbedtls_ssl_session_reset_int( ssl, 0 ) );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02003900}
3901
3902/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02003903 * Deserialize context, see mbedtls_ssl_context_save() for format.
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003904 *
3905 * This internal version is wrapped by a public function that cleans up in
3906 * case of error.
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02003907 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003908MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003909static int ssl_context_load( mbedtls_ssl_context *ssl,
3910 const unsigned char *buf,
3911 size_t len )
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02003912{
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003913 const unsigned char *p = buf;
3914 const unsigned char * const end = buf + len;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003915 size_t session_len;
Janos Follath865b3eb2019-12-16 11:46:15 +00003916 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003917
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02003918 /*
3919 * The context should have been freshly setup or reset.
3920 * Give the user an error in case of obvious misuse.
Manuel Pégourié-Gonnard4ca930f2019-07-26 16:31:53 +02003921 * (Checking session is useful because it won't be NULL if we're
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02003922 * renegotiating, or if the user mistakenly loaded a session first.)
3923 */
3924 if( ssl->state != MBEDTLS_SSL_HELLO_REQUEST ||
3925 ssl->session != NULL )
3926 {
3927 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3928 }
3929
3930 /*
3931 * We can't check that the config matches the initial one, but we can at
3932 * least check it matches the requirements for serializing.
3933 */
3934 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
Glenn Strauss2dfcea22022-03-14 17:26:42 -04003935 ssl->conf->max_tls_version < MBEDTLS_SSL_VERSION_TLS1_2 ||
3936 ssl->conf->min_tls_version > MBEDTLS_SSL_VERSION_TLS1_2 ||
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02003937#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02003938 ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED ||
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02003939#endif
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02003940 0 )
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02003941 {
3942 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3943 }
3944
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003945 MBEDTLS_SSL_DEBUG_BUF( 4, "context to load", buf, len );
3946
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02003947 /*
3948 * Check version identifier
3949 */
3950 if( (size_t)( end - p ) < sizeof( ssl_serialized_context_header ) )
3951 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3952
3953 if( memcmp( p, ssl_serialized_context_header,
3954 sizeof( ssl_serialized_context_header ) ) != 0 )
3955 {
3956 return( MBEDTLS_ERR_SSL_VERSION_MISMATCH );
3957 }
3958 p += sizeof( ssl_serialized_context_header );
3959
3960 /*
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003961 * Session
3962 */
3963 if( (size_t)( end - p ) < 4 )
3964 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3965
3966 session_len = ( (size_t) p[0] << 24 ) |
3967 ( (size_t) p[1] << 16 ) |
3968 ( (size_t) p[2] << 8 ) |
3969 ( (size_t) p[3] );
3970 p += 4;
3971
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02003972 /* This has been allocated by ssl_handshake_init(), called by
Hanno Becker43aefe22020-02-05 10:44:56 +00003973 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02003974 ssl->session = ssl->session_negotiate;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003975 ssl->session_in = ssl->session;
3976 ssl->session_out = ssl->session;
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02003977 ssl->session_negotiate = NULL;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003978
3979 if( (size_t)( end - p ) < session_len )
3980 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3981
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003982 ret = ssl_session_load( ssl->session, 1, p, session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003983 if( ret != 0 )
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003984 {
3985 mbedtls_ssl_session_free( ssl->session );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003986 return( ret );
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003987 }
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02003988
3989 p += session_len;
3990
3991 /*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02003992 * Transform
3993 */
3994
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02003995 /* This has been allocated by ssl_handshake_init(), called by
Hanno Becker43aefe22020-02-05 10:44:56 +00003996 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02003997 ssl->transform = ssl->transform_negotiate;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02003998 ssl->transform_in = ssl->transform;
3999 ssl->transform_out = ssl->transform;
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02004000 ssl->transform_negotiate = NULL;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004001
4002 /* Read random bytes and populate structure */
4003 if( (size_t)( end - p ) < sizeof( ssl->transform->randbytes ) )
4004 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jerry Yu840fbb22022-02-17 14:59:29 +08004005#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Beckerbd257552021-03-22 06:59:27 +00004006 ret = ssl_tls12_populate_transform( ssl->transform,
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004007 ssl->session->ciphersuite,
4008 ssl->session->master,
Neil Armstrongf2c82f02022-04-05 11:16:53 +02004009#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004010 ssl->session->encrypt_then_mac,
Neil Armstrongf2c82f02022-04-05 11:16:53 +02004011#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004012 ssl_tls12prf_from_cs( ssl->session->ciphersuite ),
4013 p, /* currently pointing to randbytes */
Glenn Strauss07c64162022-03-14 12:34:51 -04004014 MBEDTLS_SSL_VERSION_TLS1_2, /* (D)TLS 1.2 is forced */
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004015 ssl->conf->endpoint,
4016 ssl );
4017 if( ret != 0 )
4018 return( ret );
Jerry Yu840fbb22022-02-17 14:59:29 +08004019#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004020 p += sizeof( ssl->transform->randbytes );
4021
4022#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
4023 /* Read connection IDs and store them */
4024 if( (size_t)( end - p ) < 1 )
4025 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4026
4027 ssl->transform->in_cid_len = *p++;
4028
Manuel Pégourié-Gonnard5ea13b82019-07-23 15:02:54 +02004029 if( (size_t)( end - p ) < ssl->transform->in_cid_len + 1u )
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004030 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4031
4032 memcpy( ssl->transform->in_cid, p, ssl->transform->in_cid_len );
4033 p += ssl->transform->in_cid_len;
4034
4035 ssl->transform->out_cid_len = *p++;
4036
4037 if( (size_t)( end - p ) < ssl->transform->out_cid_len )
4038 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4039
4040 memcpy( ssl->transform->out_cid, p, ssl->transform->out_cid_len );
4041 p += ssl->transform->out_cid_len;
4042#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
4043
4044 /*
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004045 * Saved fields from top-level ssl_context structure
4046 */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004047 if( (size_t)( end - p ) < 4 )
4048 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4049
4050 ssl->badmac_seen = ( (uint32_t) p[0] << 24 ) |
4051 ( (uint32_t) p[1] << 16 ) |
4052 ( (uint32_t) p[2] << 8 ) |
4053 ( (uint32_t) p[3] );
4054 p += 4;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004055
4056#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
4057 if( (size_t)( end - p ) < 16 )
4058 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4059
4060 ssl->in_window_top = ( (uint64_t) p[0] << 56 ) |
4061 ( (uint64_t) p[1] << 48 ) |
4062 ( (uint64_t) p[2] << 40 ) |
4063 ( (uint64_t) p[3] << 32 ) |
4064 ( (uint64_t) p[4] << 24 ) |
4065 ( (uint64_t) p[5] << 16 ) |
4066 ( (uint64_t) p[6] << 8 ) |
4067 ( (uint64_t) p[7] );
4068 p += 8;
4069
4070 ssl->in_window = ( (uint64_t) p[0] << 56 ) |
4071 ( (uint64_t) p[1] << 48 ) |
4072 ( (uint64_t) p[2] << 40 ) |
4073 ( (uint64_t) p[3] << 32 ) |
4074 ( (uint64_t) p[4] << 24 ) |
4075 ( (uint64_t) p[5] << 16 ) |
4076 ( (uint64_t) p[6] << 8 ) |
4077 ( (uint64_t) p[7] );
4078 p += 8;
4079#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
4080
4081#if defined(MBEDTLS_SSL_PROTO_DTLS)
4082 if( (size_t)( end - p ) < 1 )
4083 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4084
4085 ssl->disable_datagram_packing = *p++;
4086#endif /* MBEDTLS_SSL_PROTO_DTLS */
4087
Jerry Yud9a94fe2021-09-28 18:58:59 +08004088 if( (size_t)( end - p ) < sizeof( ssl->cur_out_ctr ) )
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004089 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jerry Yud9a94fe2021-09-28 18:58:59 +08004090 memcpy( ssl->cur_out_ctr, p, sizeof( ssl->cur_out_ctr ) );
4091 p += sizeof( ssl->cur_out_ctr );
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004092
4093#if defined(MBEDTLS_SSL_PROTO_DTLS)
4094 if( (size_t)( end - p ) < 2 )
4095 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4096
4097 ssl->mtu = ( p[0] << 8 ) | p[1];
4098 p += 2;
4099#endif /* MBEDTLS_SSL_PROTO_DTLS */
4100
4101#if defined(MBEDTLS_SSL_ALPN)
4102 {
4103 uint8_t alpn_len;
4104 const char **cur;
4105
4106 if( (size_t)( end - p ) < 1 )
4107 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4108
4109 alpn_len = *p++;
4110
4111 if( alpn_len != 0 && ssl->conf->alpn_list != NULL )
4112 {
4113 /* alpn_chosen should point to an item in the configured list */
4114 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
4115 {
4116 if( strlen( *cur ) == alpn_len &&
4117 memcmp( p, cur, alpn_len ) == 0 )
4118 {
4119 ssl->alpn_chosen = *cur;
4120 break;
4121 }
4122 }
4123 }
4124
4125 /* can only happen on conf mismatch */
4126 if( alpn_len != 0 && ssl->alpn_chosen == NULL )
4127 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4128
4129 p += alpn_len;
4130 }
4131#endif /* MBEDTLS_SSL_ALPN */
4132
4133 /*
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02004134 * Forced fields from top-level ssl_context structure
4135 *
4136 * Most of them already set to the correct value by mbedtls_ssl_init() and
4137 * mbedtls_ssl_reset(), so we only need to set the remaining ones.
4138 */
4139 ssl->state = MBEDTLS_SSL_HANDSHAKE_OVER;
Glenn Strauss60bfe602022-03-14 19:04:24 -04004140 ssl->tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02004141
Hanno Becker361b10d2019-08-30 10:42:49 +01004142 /* Adjust pointers for header fields of outgoing records to
4143 * the given transform, accounting for explicit IV and CID. */
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00004144 mbedtls_ssl_update_out_pointers( ssl, ssl->transform );
Hanno Becker361b10d2019-08-30 10:42:49 +01004145
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02004146#if defined(MBEDTLS_SSL_PROTO_DTLS)
4147 ssl->in_epoch = 1;
4148#endif
4149
4150 /* mbedtls_ssl_reset() leaves the handshake sub-structure allocated,
4151 * which we don't want - otherwise we'd end up freeing the wrong transform
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00004152 * by calling mbedtls_ssl_handshake_wrapup_free_hs_transform()
4153 * inappropriately. */
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02004154 if( ssl->handshake != NULL )
4155 {
4156 mbedtls_ssl_handshake_free( ssl );
4157 mbedtls_free( ssl->handshake );
4158 ssl->handshake = NULL;
4159 }
4160
4161 /*
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004162 * Done - should have consumed entire buffer
4163 */
4164 if( p != end )
4165 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02004166
4167 return( 0 );
4168}
4169
4170/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02004171 * Deserialize context: public wrapper for error cleaning
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004172 */
4173int mbedtls_ssl_context_load( mbedtls_ssl_context *context,
4174 const unsigned char *buf,
4175 size_t len )
4176{
4177 int ret = ssl_context_load( context, buf, len );
4178
4179 if( ret != 0 )
4180 mbedtls_ssl_free( context );
4181
4182 return( ret );
4183}
Manuel Pégourié-Gonnard5c0e3772019-07-23 16:13:17 +02004184#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004185
4186/*
Paul Bakker5121ce52009-01-03 21:22:43 +00004187 * Free an SSL context
4188 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004189void mbedtls_ssl_free( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004190{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02004191 if( ssl == NULL )
4192 return;
4193
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004194 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> free" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004195
Manuel Pégourié-Gonnard7ee6f0e2014-02-13 10:54:07 +01004196 if( ssl->out_buf != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00004197 {
sander-visserb8aa2072020-05-06 22:05:13 +02004198#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
4199 size_t out_buf_len = ssl->out_buf_len;
4200#else
4201 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
4202#endif
4203
Darryl Greenb33cc762019-11-28 14:29:44 +00004204 mbedtls_platform_zeroize( ssl->out_buf, out_buf_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004205 mbedtls_free( ssl->out_buf );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004206 ssl->out_buf = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00004207 }
4208
Manuel Pégourié-Gonnard7ee6f0e2014-02-13 10:54:07 +01004209 if( ssl->in_buf != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00004210 {
sander-visserb8aa2072020-05-06 22:05:13 +02004211#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
4212 size_t in_buf_len = ssl->in_buf_len;
4213#else
4214 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
4215#endif
4216
Darryl Greenb33cc762019-11-28 14:29:44 +00004217 mbedtls_platform_zeroize( ssl->in_buf, in_buf_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004218 mbedtls_free( ssl->in_buf );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004219 ssl->in_buf = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00004220 }
4221
Paul Bakker48916f92012-09-16 19:57:18 +00004222 if( ssl->transform )
4223 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004224 mbedtls_ssl_transform_free( ssl->transform );
4225 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00004226 }
4227
4228 if( ssl->handshake )
4229 {
Gilles Peskine9b562d52018-04-25 20:32:43 +02004230 mbedtls_ssl_handshake_free( ssl );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004231 mbedtls_ssl_transform_free( ssl->transform_negotiate );
4232 mbedtls_ssl_session_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00004233
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004234 mbedtls_free( ssl->handshake );
4235 mbedtls_free( ssl->transform_negotiate );
4236 mbedtls_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00004237 }
4238
Ronald Cron6f135e12021-12-08 16:57:54 +01004239#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Hanno Becker3aa186f2021-08-10 09:24:19 +01004240 mbedtls_ssl_transform_free( ssl->transform_application );
4241 mbedtls_free( ssl->transform_application );
Ronald Cron6f135e12021-12-08 16:57:54 +01004242#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Becker3aa186f2021-08-10 09:24:19 +01004243
Paul Bakkerc0463502013-02-14 11:19:38 +01004244 if( ssl->session )
4245 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004246 mbedtls_ssl_session_free( ssl->session );
4247 mbedtls_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01004248 }
4249
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +02004250#if defined(MBEDTLS_X509_CRT_PARSE_C)
Paul Bakker66d5d072014-06-17 16:39:18 +02004251 if( ssl->hostname != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00004252 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004253 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004254 mbedtls_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00004255 }
Paul Bakker0be444a2013-08-27 21:55:01 +02004256#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00004257
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02004258#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004259 mbedtls_free( ssl->cli_id );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02004260#endif
4261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004262 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00004263
Paul Bakker86f04f42013-02-14 11:20:09 +01004264 /* Actually clear after last debug message */
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004265 mbedtls_platform_zeroize( ssl, sizeof( mbedtls_ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004266}
4267
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004268/*
Shaun Case8b0ecbc2021-12-20 21:14:10 -08004269 * Initialize mbedtls_ssl_config
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004270 */
4271void mbedtls_ssl_config_init( mbedtls_ssl_config *conf )
4272{
4273 memset( conf, 0, sizeof( mbedtls_ssl_config ) );
4274}
4275
Gilles Peskineae270bf2021-06-02 00:05:29 +02004276/* The selection should be the same as mbedtls_x509_crt_profile_default in
4277 * x509_crt.c, plus Montgomery curves for ECDHE. Here, the order matters:
Gilles Peskineb1940a72021-06-02 15:18:12 +02004278 * curves with a lower resource usage come first.
Gilles Peskineae270bf2021-06-02 00:05:29 +02004279 * See the documentation of mbedtls_ssl_conf_curves() for what we promise
Gilles Peskineb1940a72021-06-02 15:18:12 +02004280 * about this list.
4281 */
Brett Warrene0edc842021-08-17 09:53:13 +01004282static uint16_t ssl_preset_default_groups[] = {
Gilles Peskineae270bf2021-06-02 00:05:29 +02004283#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004284 MBEDTLS_SSL_IANA_TLS_GROUP_X25519,
Gilles Peskineae270bf2021-06-02 00:05:29 +02004285#endif
4286#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004287 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
Gilles Peskineae270bf2021-06-02 00:05:29 +02004288#endif
Gilles Peskineb1940a72021-06-02 15:18:12 +02004289#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004290 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
Gilles Peskineb1940a72021-06-02 15:18:12 +02004291#endif
4292#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004293 MBEDTLS_SSL_IANA_TLS_GROUP_X448,
Gilles Peskineb1940a72021-06-02 15:18:12 +02004294#endif
4295#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004296 MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1,
Gilles Peskineb1940a72021-06-02 15:18:12 +02004297#endif
Gilles Peskineae270bf2021-06-02 00:05:29 +02004298#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004299 MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1,
Gilles Peskineae270bf2021-06-02 00:05:29 +02004300#endif
Gilles Peskineb1940a72021-06-02 15:18:12 +02004301#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004302 MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1,
Gilles Peskineb1940a72021-06-02 15:18:12 +02004303#endif
4304#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004305 MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1,
Gilles Peskineb1940a72021-06-02 15:18:12 +02004306#endif
Brett Warrene0edc842021-08-17 09:53:13 +01004307 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
Gilles Peskineae270bf2021-06-02 00:05:29 +02004308};
Gilles Peskineae270bf2021-06-02 00:05:29 +02004309
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004310static int ssl_preset_suiteb_ciphersuites[] = {
4311 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
4312 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
4313 0
4314};
4315
Gilles Peskineeccd8882020-03-10 12:19:08 +01004316#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker9c6aa7b2021-08-10 13:50:43 +01004317
Jerry Yu909df7b2022-01-22 11:56:27 +08004318/* NOTICE:
Jerry Yu0b994b82022-01-25 17:22:12 +08004319 * For ssl_preset_*_sig_algs and ssl_tls12_preset_*_sig_algs, the following
Jerry Yu370e1462022-01-25 10:36:53 +08004320 * rules SHOULD be upheld.
4321 * - No duplicate entries.
4322 * - But if there is a good reason, do not change the order of the algorithms.
4323 * - ssl_tls12_present* is for TLS 1.2 use only.
4324 * - ssl_preset_* is for TLS 1.3 only or hybrid TLS 1.3/1.2 handshakes.
Jerry Yu9bb3ee42022-06-23 10:16:33 +08004325 *
Jerry Yua1255e62022-06-24 10:10:47 +08004326 * When GnuTLS/Openssl server is configured in TLS 1.2 mode with a certificate
4327 * declaring an RSA public key and Mbed TLS is configured in hybrid mode, if
4328 * `rsa_pss_rsae_*` algorithms are before `rsa_pkcs1_*` ones in this list then
Jerry Yucc539102022-06-27 16:27:35 +08004329 * the GnuTLS/Openssl server chooses an `rsa_pss_rsae_*` signature algorithm
4330 * for its signature in the key exchange message. As Mbed TLS 1.2 does not
Jerry Yua1255e62022-06-24 10:10:47 +08004331 * support them, the handshake fails.
Jerry Yu1a8b4812022-01-20 17:56:50 +08004332 */
Hanno Becker9c6aa7b2021-08-10 13:50:43 +01004333static uint16_t ssl_preset_default_sig_algs[] = {
Jerry Yu1a8b4812022-01-20 17:56:50 +08004334
Jerry Yued5e9f42022-01-26 11:21:34 +08004335#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C) && \
4336 defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
4337 MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256,
4338#endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA256_C &&
4339 MBEDTLS_ECP_DP_SECP256R1_ENABLED */
Jerry Yu909df7b2022-01-22 11:56:27 +08004340
Jerry Yu909df7b2022-01-22 11:56:27 +08004341#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA384_C) && \
4342 defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
4343 MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384,
4344#endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA384_C &&
4345 MBEDTLS_ECP_DP_SECP384R1_ENABLED */
4346
Jerry Yued5e9f42022-01-26 11:21:34 +08004347#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA512_C) && \
4348 defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
4349 MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512,
4350#endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA384_C &&
4351 MBEDTLS_ECP_DP_SECP521R1_ENABLED */
Jerry Yu909df7b2022-01-22 11:56:27 +08004352
Ronald Cron8540cf62022-03-16 08:01:09 +01004353#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA512_C)
4354 MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA512,
4355#endif /* MBEDTLS_RSA_C && MBEDTLS_SHA512_C */
4356
4357#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA384_C)
4358 MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA384,
4359#endif /* MBEDTLS_RSA_C && MBEDTLS_SHA384_C */
4360
Jerry Yu53037892022-01-25 11:02:06 +08004361#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA256_C)
4362 MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256,
4363#endif /* MBEDTLS_RSA_C && MBEDTLS_SHA256_C */
4364
Jerry Yu9bb3ee42022-06-23 10:16:33 +08004365#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && defined(MBEDTLS_SHA512_C)
4366 MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512,
4367#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT && MBEDTLS_SHA512_C */
4368
4369#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && defined(MBEDTLS_SHA384_C)
4370 MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384,
4371#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT && MBEDTLS_SHA384_C */
4372
4373#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && defined(MBEDTLS_SHA256_C)
4374 MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256,
4375#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT && MBEDTLS_SHA256_C */
4376
Gabor Mezei15b95a62022-05-09 16:37:58 +02004377 MBEDTLS_TLS_SIG_NONE
Jerry Yu909df7b2022-01-22 11:56:27 +08004378};
4379
4380/* NOTICE: see above */
4381#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4382static uint16_t ssl_tls12_preset_default_sig_algs[] = {
Jerry Yu713013f2022-01-17 18:16:35 +08004383#if defined(MBEDTLS_SHA512_C)
Gabor Mezeic1051b62022-05-10 13:13:58 +02004384#if defined(MBEDTLS_ECDSA_C)
4385 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG( MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA512 ),
Jerry Yu713013f2022-01-17 18:16:35 +08004386#endif
Gabor Mezeic1051b62022-05-10 13:13:58 +02004387#if defined(MBEDTLS_RSA_C)
4388 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG( MBEDTLS_SSL_SIG_RSA, MBEDTLS_SSL_HASH_SHA512 ),
4389#endif
4390#endif /* MBEDTLS_SHA512_C */
Jerry Yu11f0a9c2022-01-12 18:43:08 +08004391#if defined(MBEDTLS_SHA384_C)
Gabor Mezeic1051b62022-05-10 13:13:58 +02004392#if defined(MBEDTLS_ECDSA_C)
4393 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG( MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA384 ),
Jerry Yu11f0a9c2022-01-12 18:43:08 +08004394#endif
Gabor Mezeic1051b62022-05-10 13:13:58 +02004395#if defined(MBEDTLS_RSA_C)
4396 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG( MBEDTLS_SSL_SIG_RSA, MBEDTLS_SSL_HASH_SHA384 ),
4397#endif
4398#endif /* MBEDTLS_SHA384_C */
Jerry Yu11f0a9c2022-01-12 18:43:08 +08004399#if defined(MBEDTLS_SHA256_C)
Gabor Mezeic1051b62022-05-10 13:13:58 +02004400#if defined(MBEDTLS_ECDSA_C)
4401 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG( MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA256 ),
Jerry Yu11f0a9c2022-01-12 18:43:08 +08004402#endif
Gabor Mezeic1051b62022-05-10 13:13:58 +02004403#if defined(MBEDTLS_RSA_C)
4404 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG( MBEDTLS_SSL_SIG_RSA, MBEDTLS_SSL_HASH_SHA256 ),
4405#endif
4406#endif /* MBEDTLS_SHA256_C */
Gabor Mezei15b95a62022-05-09 16:37:58 +02004407 MBEDTLS_TLS_SIG_NONE
Jerry Yu909df7b2022-01-22 11:56:27 +08004408};
4409#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
4410/* NOTICE: see above */
4411static uint16_t ssl_preset_suiteb_sig_algs[] = {
4412
Jerry Yu909df7b2022-01-22 11:56:27 +08004413#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C) && \
4414 defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
4415 MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256,
4416#endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA256_C &&
4417 MBEDTLS_ECP_DP_SECP256R1_ENABLED */
4418
Jerry Yu53037892022-01-25 11:02:06 +08004419#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA384_C) && \
4420 defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
4421 MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384,
4422#endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA384_C &&
4423 MBEDTLS_ECP_DP_SECP384R1_ENABLED */
Jerry Yu909df7b2022-01-22 11:56:27 +08004424
4425#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && defined(MBEDTLS_SHA256_C)
4426 MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256,
4427#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT && MBEDTLS_SHA256_C */
Jerry Yu1a8b4812022-01-20 17:56:50 +08004428
Jerry Yu53037892022-01-25 11:02:06 +08004429#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA256_C)
4430 MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256,
4431#endif /* MBEDTLS_RSA_C && MBEDTLS_SHA256_C */
4432
Gabor Mezei15b95a62022-05-09 16:37:58 +02004433 MBEDTLS_TLS_SIG_NONE
Jerry Yu713013f2022-01-17 18:16:35 +08004434};
Jerry Yu6106fdc2022-01-12 16:36:14 +08004435
Jerry Yu909df7b2022-01-22 11:56:27 +08004436/* NOTICE: see above */
4437#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4438static uint16_t ssl_tls12_preset_suiteb_sig_algs[] = {
Jerry Yu713013f2022-01-17 18:16:35 +08004439#if defined(MBEDTLS_SHA256_C)
Gabor Mezeic1051b62022-05-10 13:13:58 +02004440#if defined(MBEDTLS_ECDSA_C)
4441 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG( MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA256 ),
Jerry Yu713013f2022-01-17 18:16:35 +08004442#endif
Gabor Mezeic1051b62022-05-10 13:13:58 +02004443#if defined(MBEDTLS_RSA_C)
4444 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG( MBEDTLS_SSL_SIG_RSA, MBEDTLS_SSL_HASH_SHA256 ),
4445#endif
4446#endif /* MBEDTLS_SHA256_C */
Jerry Yu18c833e2022-01-25 10:55:47 +08004447#if defined(MBEDTLS_SHA384_C)
Gabor Mezeic1051b62022-05-10 13:13:58 +02004448#if defined(MBEDTLS_ECDSA_C)
4449 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG( MBEDTLS_SSL_SIG_ECDSA, MBEDTLS_SSL_HASH_SHA384 ),
Jerry Yu18c833e2022-01-25 10:55:47 +08004450#endif
Gabor Mezeic1051b62022-05-10 13:13:58 +02004451#if defined(MBEDTLS_RSA_C)
4452 MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG( MBEDTLS_SSL_SIG_RSA, MBEDTLS_SSL_HASH_SHA384 ),
4453#endif
4454#endif /* MBEDTLS_SHA256_C */
Gabor Mezei15b95a62022-05-09 16:37:58 +02004455 MBEDTLS_TLS_SIG_NONE
Hanno Becker9c6aa7b2021-08-10 13:50:43 +01004456};
Jerry Yu909df7b2022-01-22 11:56:27 +08004457#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
4458
Jerry Yu1a8b4812022-01-20 17:56:50 +08004459#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004460
Brett Warrene0edc842021-08-17 09:53:13 +01004461static uint16_t ssl_preset_suiteb_groups[] = {
Jaeden Amerod4311042019-06-03 08:27:16 +01004462#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004463 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
Jaeden Amerod4311042019-06-03 08:27:16 +01004464#endif
4465#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004466 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
Jaeden Amerod4311042019-06-03 08:27:16 +01004467#endif
Brett Warrene0edc842021-08-17 09:53:13 +01004468 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004469};
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004470
Jerry Yu1a8b4812022-01-20 17:56:50 +08004471#if defined(MBEDTLS_DEBUG_C) && defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yu909df7b2022-01-22 11:56:27 +08004472/* Function for checking `ssl_preset_*_sig_algs` and `ssl_tls12_preset_*_sig_algs`
Jerry Yu370e1462022-01-25 10:36:53 +08004473 * to make sure there are no duplicated signature algorithm entries. */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02004474MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuf377d642022-01-25 10:43:59 +08004475static int ssl_check_no_sig_alg_duplication( uint16_t * sig_algs )
Jerry Yu1a8b4812022-01-20 17:56:50 +08004476{
4477 size_t i, j;
4478 int ret = 0;
Jerry Yu909df7b2022-01-22 11:56:27 +08004479
Gabor Mezei15b95a62022-05-09 16:37:58 +02004480 for( i = 0; sig_algs[i] != MBEDTLS_TLS_SIG_NONE; i++ )
Jerry Yu1a8b4812022-01-20 17:56:50 +08004481 {
Jerry Yuf377d642022-01-25 10:43:59 +08004482 for( j = 0; j < i; j++ )
Jerry Yu1a8b4812022-01-20 17:56:50 +08004483 {
Jerry Yuf377d642022-01-25 10:43:59 +08004484 if( sig_algs[i] != sig_algs[j] )
4485 continue;
4486 mbedtls_printf( " entry(%04x,%" MBEDTLS_PRINTF_SIZET
4487 ") is duplicated at %" MBEDTLS_PRINTF_SIZET "\n",
4488 sig_algs[i], j, i );
4489 ret = -1;
Jerry Yu1a8b4812022-01-20 17:56:50 +08004490 }
4491 }
4492 return( ret );
4493}
4494
4495#endif /* MBEDTLS_DEBUG_C && MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
4496
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004497/*
Tillmann Karras588ad502015-09-25 04:27:22 +02004498 * Load default in mbedtls_ssl_config
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004499 */
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02004500int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004501 int endpoint, int transport, int preset )
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004502{
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02004503#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Janos Follath865b3eb2019-12-16 11:46:15 +00004504 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02004505#endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004506
Jerry Yu1a8b4812022-01-20 17:56:50 +08004507#if defined(MBEDTLS_DEBUG_C) && defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yuf377d642022-01-25 10:43:59 +08004508 if( ssl_check_no_sig_alg_duplication( ssl_preset_suiteb_sig_algs ) )
Jerry Yu1a8b4812022-01-20 17:56:50 +08004509 {
4510 mbedtls_printf( "ssl_preset_suiteb_sig_algs has duplicated entries\n" );
4511 return( MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED );
4512 }
4513
Jerry Yuf377d642022-01-25 10:43:59 +08004514 if( ssl_check_no_sig_alg_duplication( ssl_preset_default_sig_algs ) )
Jerry Yu1a8b4812022-01-20 17:56:50 +08004515 {
4516 mbedtls_printf( "ssl_preset_default_sig_algs has duplicated entries\n" );
4517 return( MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED );
4518 }
Jerry Yu909df7b2022-01-22 11:56:27 +08004519
4520#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yuf377d642022-01-25 10:43:59 +08004521 if( ssl_check_no_sig_alg_duplication( ssl_tls12_preset_suiteb_sig_algs ) )
Jerry Yu909df7b2022-01-22 11:56:27 +08004522 {
Jerry Yu909df7b2022-01-22 11:56:27 +08004523 mbedtls_printf( "ssl_tls12_preset_suiteb_sig_algs has duplicated entries\n" );
Jerry Yu909df7b2022-01-22 11:56:27 +08004524 return( MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED );
4525 }
4526
Jerry Yuf377d642022-01-25 10:43:59 +08004527 if( ssl_check_no_sig_alg_duplication( ssl_tls12_preset_default_sig_algs ) )
Jerry Yu909df7b2022-01-22 11:56:27 +08004528 {
Jerry Yu909df7b2022-01-22 11:56:27 +08004529 mbedtls_printf( "ssl_tls12_preset_default_sig_algs has duplicated entries\n" );
Jerry Yu909df7b2022-01-22 11:56:27 +08004530 return( MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED );
4531 }
4532#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Jerry Yu1a8b4812022-01-20 17:56:50 +08004533#endif /* MBEDTLS_DEBUG_C && MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
4534
Manuel Pégourié-Gonnard0de074f2015-05-14 12:58:01 +02004535 /* Use the functions here so that they are covered in tests,
4536 * but otherwise access member directly for efficiency */
4537 mbedtls_ssl_conf_endpoint( conf, endpoint );
4538 mbedtls_ssl_conf_transport( conf, transport );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004539
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004540 /*
4541 * Things that are common to all presets
4542 */
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02004543#if defined(MBEDTLS_SSL_CLI_C)
4544 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
4545 {
4546 conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
4547#if defined(MBEDTLS_SSL_SESSION_TICKETS)
4548 conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED;
4549#endif
4550 }
4551#endif
4552
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004553#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
4554 conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
4555#endif
4556
4557#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
4558 conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
4559#endif
4560
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02004561#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004562 conf->f_cookie_write = ssl_cookie_write_dummy;
4563 conf->f_cookie_check = ssl_cookie_check_dummy;
4564#endif
4565
4566#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
4567 conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
4568#endif
4569
Janos Follath088ce432017-04-10 12:42:31 +01004570#if defined(MBEDTLS_SSL_SRV_C)
4571 conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED;
TRodziewicz3946f792021-06-14 12:11:18 +02004572 conf->respect_cli_pref = MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_SERVER;
Janos Follath088ce432017-04-10 12:42:31 +01004573#endif
4574
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004575#if defined(MBEDTLS_SSL_PROTO_DTLS)
4576 conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
4577 conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
4578#endif
4579
4580#if defined(MBEDTLS_SSL_RENEGOTIATION)
4581 conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
Andres AG2196c7f2016-12-15 17:01:16 +00004582 memset( conf->renego_period, 0x00, 2 );
4583 memset( conf->renego_period + 2, 0xFF, 6 );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004584#endif
4585
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004586#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Hanno Beckere2defad2021-07-24 05:59:17 +01004587 if( endpoint == MBEDTLS_SSL_IS_SERVER )
4588 {
4589 const unsigned char dhm_p[] =
4590 MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN;
4591 const unsigned char dhm_g[] =
4592 MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN;
Hanno Becker00d0a682017-10-04 13:14:29 +01004593
Hanno Beckere2defad2021-07-24 05:59:17 +01004594 if ( ( ret = mbedtls_ssl_conf_dh_param_bin( conf,
4595 dhm_p, sizeof( dhm_p ),
4596 dhm_g, sizeof( dhm_g ) ) ) != 0 )
4597 {
4598 return( ret );
4599 }
4600 }
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02004601#endif
4602
Ronald Cron6f135e12021-12-08 16:57:54 +01004603#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Hanno Becker71f1ed62021-07-24 06:01:47 +01004604 /*
4605 * Allow all TLS 1.3 key exchange modes by default.
4606 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00004607 conf->tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL;
Ronald Cron6f135e12021-12-08 16:57:54 +01004608#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Becker71f1ed62021-07-24 06:01:47 +01004609
XiaokangQian4d3a6042022-04-21 13:46:17 +00004610 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
4611 {
Glenn Strauss2dfcea22022-03-14 17:26:42 -04004612#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
XiaokangQian4d3a6042022-04-21 13:46:17 +00004613 conf->min_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
XiaokangQian060d8672022-04-21 09:24:56 +00004614 conf->max_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
XiaokangQian4d3a6042022-04-21 13:46:17 +00004615#else
XiaokangQian060d8672022-04-21 09:24:56 +00004616 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
XiaokangQian060d8672022-04-21 09:24:56 +00004617#endif
XiaokangQian4d3a6042022-04-21 13:46:17 +00004618 }
4619 else
4620 {
4621#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
4622 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
4623 {
4624 conf->min_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
4625 conf->max_tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
4626 }
4627 else
4628 /* Hybrid TLS 1.2 / 1.3 is not supported on server side yet */
4629 {
4630 conf->min_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
4631 conf->max_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
4632 }
4633#elif defined(MBEDTLS_SSL_PROTO_TLS1_3)
4634 conf->min_tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
4635 conf->max_tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
4636#elif defined(MBEDTLS_SSL_PROTO_TLS1_2)
4637 conf->min_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
4638 conf->max_tls_version = MBEDTLS_SSL_VERSION_TLS1_2;
4639#else
4640 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
4641#endif
4642 }
Glenn Strauss2dfcea22022-03-14 17:26:42 -04004643
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004644 /*
4645 * Preset-specific defaults
4646 */
4647 switch( preset )
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004648 {
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004649 /*
4650 * NSA Suite B
4651 */
4652 case MBEDTLS_SSL_PRESET_SUITEB:
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004653
Hanno Beckerd60b6c62021-04-29 12:04:11 +01004654 conf->ciphersuite_list = ssl_preset_suiteb_ciphersuites;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004655
4656#if defined(MBEDTLS_X509_CRT_PARSE_C)
4657 conf->cert_profile = &mbedtls_x509_crt_profile_suiteb;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004658#endif
4659
Gilles Peskineeccd8882020-03-10 12:19:08 +01004660#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yu909df7b2022-01-22 11:56:27 +08004661#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4662 if( mbedtls_ssl_conf_is_tls12_only( conf ) )
4663 conf->sig_algs = ssl_tls12_preset_suiteb_sig_algs;
4664 else
4665#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
4666 conf->sig_algs = ssl_preset_suiteb_sig_algs;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004667#endif
4668
Brett Warrene0edc842021-08-17 09:53:13 +01004669#if defined(MBEDTLS_ECP_C) && !defined(MBEDTLS_DEPRECATED_REMOVED)
4670 conf->curve_list = NULL;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004671#endif
Brett Warrene0edc842021-08-17 09:53:13 +01004672 conf->group_list = ssl_preset_suiteb_groups;
Manuel Pégourié-Gonnardc98204e2015-08-11 04:21:01 +02004673 break;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004674
4675 /*
4676 * Default
4677 */
4678 default:
Ronald Cronf6606552022-03-15 11:23:25 +01004679
Hanno Beckerd60b6c62021-04-29 12:04:11 +01004680 conf->ciphersuite_list = mbedtls_ssl_list_ciphersuites();
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004681
4682#if defined(MBEDTLS_X509_CRT_PARSE_C)
4683 conf->cert_profile = &mbedtls_x509_crt_profile_default;
4684#endif
4685
Gilles Peskineeccd8882020-03-10 12:19:08 +01004686#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yu909df7b2022-01-22 11:56:27 +08004687#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4688 if( mbedtls_ssl_conf_is_tls12_only( conf ) )
4689 conf->sig_algs = ssl_tls12_preset_default_sig_algs;
4690 else
4691#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
4692 conf->sig_algs = ssl_preset_default_sig_algs;
Hanno Beckerdeb68ce2021-08-10 16:04:05 +01004693#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004694
Brett Warrene0edc842021-08-17 09:53:13 +01004695#if defined(MBEDTLS_ECP_C) && !defined(MBEDTLS_DEPRECATED_REMOVED)
4696 conf->curve_list = NULL;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004697#endif
Brett Warrene0edc842021-08-17 09:53:13 +01004698 conf->group_list = ssl_preset_default_groups;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004699
4700#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
4701 conf->dhm_min_bitlen = 1024;
4702#endif
4703 }
4704
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004705 return( 0 );
4706}
4707
4708/*
4709 * Free mbedtls_ssl_config
4710 */
4711void mbedtls_ssl_config_free( mbedtls_ssl_config *conf )
4712{
4713#if defined(MBEDTLS_DHM_C)
4714 mbedtls_mpi_free( &conf->dhm_P );
4715 mbedtls_mpi_free( &conf->dhm_G );
4716#endif
4717
Gilles Peskineeccd8882020-03-10 12:19:08 +01004718#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Neil Armstrong501c9322022-05-03 09:35:09 +02004719#if defined(MBEDTLS_USE_PSA_CRYPTO)
4720 if( ! mbedtls_svc_key_id_is_null( conf->psk_opaque ) )
4721 {
Neil Armstrong501c9322022-05-03 09:35:09 +02004722 conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
4723 }
Neil Armstrong8ecd6682022-05-05 11:40:35 +02004724#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004725 if( conf->psk != NULL )
4726 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004727 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004728 mbedtls_free( conf->psk );
Azim Khan27e8a122018-03-21 14:24:11 +00004729 conf->psk = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004730 conf->psk_len = 0;
junyeonLEE316b1622017-12-20 16:29:30 +09004731 }
4732
4733 if( conf->psk_identity != NULL )
4734 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004735 mbedtls_platform_zeroize( conf->psk_identity, conf->psk_identity_len );
junyeonLEE316b1622017-12-20 16:29:30 +09004736 mbedtls_free( conf->psk_identity );
Azim Khan27e8a122018-03-21 14:24:11 +00004737 conf->psk_identity = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004738 conf->psk_identity_len = 0;
4739 }
4740#endif
4741
4742#if defined(MBEDTLS_X509_CRT_PARSE_C)
4743 ssl_key_cert_free( conf->key_cert );
4744#endif
4745
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004746 mbedtls_platform_zeroize( conf, sizeof( mbedtls_ssl_config ) );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004747}
4748
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02004749#if defined(MBEDTLS_PK_C) && \
4750 ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02004751/*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004752 * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02004753 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004754unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02004755{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004756#if defined(MBEDTLS_RSA_C)
4757 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) )
4758 return( MBEDTLS_SSL_SIG_RSA );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02004759#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004760#if defined(MBEDTLS_ECDSA_C)
4761 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) )
4762 return( MBEDTLS_SSL_SIG_ECDSA );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02004763#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004764 return( MBEDTLS_SSL_SIG_ANON );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02004765}
4766
Hanno Becker7e5437a2017-04-28 17:15:26 +01004767unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type )
4768{
4769 switch( type ) {
4770 case MBEDTLS_PK_RSA:
4771 return( MBEDTLS_SSL_SIG_RSA );
4772 case MBEDTLS_PK_ECDSA:
4773 case MBEDTLS_PK_ECKEY:
4774 return( MBEDTLS_SSL_SIG_ECDSA );
4775 default:
4776 return( MBEDTLS_SSL_SIG_ANON );
4777 }
4778}
4779
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004780mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig )
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004781{
4782 switch( sig )
4783 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004784#if defined(MBEDTLS_RSA_C)
4785 case MBEDTLS_SSL_SIG_RSA:
4786 return( MBEDTLS_PK_RSA );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004787#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004788#if defined(MBEDTLS_ECDSA_C)
4789 case MBEDTLS_SSL_SIG_ECDSA:
4790 return( MBEDTLS_PK_ECDSA );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004791#endif
4792 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004793 return( MBEDTLS_PK_NONE );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004794 }
4795}
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02004796#endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004797
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02004798/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02004799 * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02004800 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004801mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash )
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004802{
4803 switch( hash )
4804 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004805#if defined(MBEDTLS_MD5_C)
4806 case MBEDTLS_SSL_HASH_MD5:
4807 return( MBEDTLS_MD_MD5 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004808#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004809#if defined(MBEDTLS_SHA1_C)
4810 case MBEDTLS_SSL_HASH_SHA1:
4811 return( MBEDTLS_MD_SHA1 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004812#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +02004813#if defined(MBEDTLS_SHA224_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004814 case MBEDTLS_SSL_HASH_SHA224:
4815 return( MBEDTLS_MD_SHA224 );
Mateusz Starzyke3c48b42021-04-19 16:46:28 +02004816#endif
4817#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004818 case MBEDTLS_SSL_HASH_SHA256:
4819 return( MBEDTLS_MD_SHA256 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004820#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +02004821#if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004822 case MBEDTLS_SSL_HASH_SHA384:
4823 return( MBEDTLS_MD_SHA384 );
Mateusz Starzyk3352a532021-04-06 14:28:22 +02004824#endif
4825#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004826 case MBEDTLS_SSL_HASH_SHA512:
4827 return( MBEDTLS_MD_SHA512 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004828#endif
4829 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004830 return( MBEDTLS_MD_NONE );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004831 }
4832}
4833
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02004834/*
4835 * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX
4836 */
4837unsigned char mbedtls_ssl_hash_from_md_alg( int md )
4838{
4839 switch( md )
4840 {
4841#if defined(MBEDTLS_MD5_C)
4842 case MBEDTLS_MD_MD5:
4843 return( MBEDTLS_SSL_HASH_MD5 );
4844#endif
4845#if defined(MBEDTLS_SHA1_C)
4846 case MBEDTLS_MD_SHA1:
4847 return( MBEDTLS_SSL_HASH_SHA1 );
4848#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +02004849#if defined(MBEDTLS_SHA224_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02004850 case MBEDTLS_MD_SHA224:
4851 return( MBEDTLS_SSL_HASH_SHA224 );
Mateusz Starzyke3c48b42021-04-19 16:46:28 +02004852#endif
4853#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02004854 case MBEDTLS_MD_SHA256:
4855 return( MBEDTLS_SSL_HASH_SHA256 );
4856#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +02004857#if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02004858 case MBEDTLS_MD_SHA384:
4859 return( MBEDTLS_SSL_HASH_SHA384 );
Mateusz Starzyk3352a532021-04-06 14:28:22 +02004860#endif
4861#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02004862 case MBEDTLS_MD_SHA512:
4863 return( MBEDTLS_SSL_HASH_SHA512 );
4864#endif
4865 default:
4866 return( MBEDTLS_SSL_HASH_NONE );
4867 }
4868}
4869
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01004870/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02004871 * Check if a curve proposed by the peer is in our list.
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02004872 * Return 0 if we're willing to use it, -1 otherwise.
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01004873 */
Manuel Pégourié-Gonnard0d63b842022-01-18 13:10:56 +01004874int mbedtls_ssl_check_curve_tls_id( const mbedtls_ssl_context *ssl, uint16_t tls_id )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01004875{
Brett Warrene0edc842021-08-17 09:53:13 +01004876 const uint16_t *group_list = mbedtls_ssl_get_groups( ssl );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01004877
Brett Warrene0edc842021-08-17 09:53:13 +01004878 if( group_list == NULL )
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02004879 return( -1 );
4880
Brett Warrene0edc842021-08-17 09:53:13 +01004881 for( ; *group_list != 0; group_list++ )
4882 {
4883 if( *group_list == tls_id )
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02004884 return( 0 );
Brett Warrene0edc842021-08-17 09:53:13 +01004885 }
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01004886
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02004887 return( -1 );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01004888}
Manuel Pégourié-Gonnard0d63b842022-01-18 13:10:56 +01004889
4890#if defined(MBEDTLS_ECP_C)
4891/*
4892 * Same as mbedtls_ssl_check_curve_tls_id() but with a mbedtls_ecp_group_id.
4893 */
4894int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id )
4895{
Manuel Pégourié-Gonnard422370d2022-02-07 11:55:21 +01004896 uint16_t tls_id = mbedtls_ecp_curve_info_from_grp_id( grp_id )->tls_id;
Manuel Pégourié-Gonnard0d63b842022-01-18 13:10:56 +01004897 return mbedtls_ssl_check_curve_tls_id( ssl, tls_id );
4898}
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02004899#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004900
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004901#if defined(MBEDTLS_X509_CRT_PARSE_C)
4902int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,
4903 const mbedtls_ssl_ciphersuite_t *ciphersuite,
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01004904 int cert_endpoint,
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02004905 uint32_t *flags )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004906{
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01004907 int ret = 0;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004908 int usage = 0;
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02004909 const char *ext_oid;
4910 size_t ext_len;
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02004911
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004912 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004913 {
4914 /* Server part of the key exchange */
4915 switch( ciphersuite->key_exchange )
4916 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004917 case MBEDTLS_KEY_EXCHANGE_RSA:
4918 case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01004919 usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004920 break;
4921
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004922 case MBEDTLS_KEY_EXCHANGE_DHE_RSA:
4923 case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
4924 case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
4925 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004926 break;
4927
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004928 case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
4929 case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01004930 usage = MBEDTLS_X509_KU_KEY_AGREEMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004931 break;
4932
4933 /* Don't use default: we want warnings when adding new values */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004934 case MBEDTLS_KEY_EXCHANGE_NONE:
4935 case MBEDTLS_KEY_EXCHANGE_PSK:
4936 case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
4937 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
Manuel Pégourié-Gonnard557535d2015-09-15 17:53:32 +02004938 case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004939 usage = 0;
4940 }
4941 }
4942 else
4943 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004944 /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */
4945 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004946 }
4947
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004948 if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 )
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01004949 {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01004950 *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01004951 ret = -1;
4952 }
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004953
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004954 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02004955 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004956 ext_oid = MBEDTLS_OID_SERVER_AUTH;
4957 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH );
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02004958 }
4959 else
4960 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004961 ext_oid = MBEDTLS_OID_CLIENT_AUTH;
4962 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH );
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02004963 }
4964
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004965 if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 )
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01004966 {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01004967 *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01004968 ret = -1;
4969 }
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02004970
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01004971 return( ret );
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02004972}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004973#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3a306b92014-04-29 15:11:17 +02004974
Jerry Yu148165c2021-09-24 23:20:59 +08004975#if defined(MBEDTLS_USE_PSA_CRYPTO)
4976int mbedtls_ssl_get_handshake_transcript( mbedtls_ssl_context *ssl,
4977 const mbedtls_md_type_t md,
4978 unsigned char *dst,
4979 size_t dst_len,
4980 size_t *olen )
4981{
Ronald Cronf6893e12022-01-07 22:09:01 +01004982 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
4983 psa_hash_operation_t *hash_operation_to_clone;
4984 psa_hash_operation_t hash_operation = psa_hash_operation_init();
4985
Jerry Yu148165c2021-09-24 23:20:59 +08004986 *olen = 0;
Ronald Cronf6893e12022-01-07 22:09:01 +01004987
4988 switch( md )
4989 {
4990#if defined(MBEDTLS_SHA384_C)
4991 case MBEDTLS_MD_SHA384:
4992 hash_operation_to_clone = &ssl->handshake->fin_sha384_psa;
4993 break;
4994#endif
4995
4996#if defined(MBEDTLS_SHA256_C)
4997 case MBEDTLS_MD_SHA256:
4998 hash_operation_to_clone = &ssl->handshake->fin_sha256_psa;
4999 break;
5000#endif
5001
5002 default:
5003 goto exit;
5004 }
5005
5006 status = psa_hash_clone( hash_operation_to_clone, &hash_operation );
5007 if( status != PSA_SUCCESS )
5008 goto exit;
5009
5010 status = psa_hash_finish( &hash_operation, dst, dst_len, olen );
5011 if( status != PSA_SUCCESS )
5012 goto exit;
5013
5014exit:
Ronald Cronb788c042022-02-15 09:14:15 +01005015 return( psa_ssl_status_to_mbedtls( status ) );
Jerry Yu148165c2021-09-24 23:20:59 +08005016}
5017#else /* MBEDTLS_USE_PSA_CRYPTO */
5018
Jerry Yu24c0ec32021-09-09 14:21:07 +08005019#if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02005020MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu000f9762021-09-14 11:12:51 +08005021static int ssl_get_handshake_transcript_sha384( mbedtls_ssl_context *ssl,
5022 unsigned char *dst,
5023 size_t dst_len,
5024 size_t *olen )
Jerry Yu24c0ec32021-09-09 14:21:07 +08005025{
Jerry Yu24c0ec32021-09-09 14:21:07 +08005026 int ret;
5027 mbedtls_sha512_context sha512;
5028
5029 if( dst_len < 48 )
5030 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
5031
5032 mbedtls_sha512_init( &sha512 );
5033 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
5034
5035 if( ( ret = mbedtls_sha512_finish( &sha512, dst ) ) != 0 )
5036 {
5037 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha512_finish", ret );
5038 goto exit;
5039 }
5040
5041 *olen = 48;
5042
5043exit:
5044
5045 mbedtls_sha512_free( &sha512 );
5046 return( ret );
Jerry Yu24c0ec32021-09-09 14:21:07 +08005047}
5048#endif /* MBEDTLS_SHA384_C */
5049
5050#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02005051MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu000f9762021-09-14 11:12:51 +08005052static int ssl_get_handshake_transcript_sha256( mbedtls_ssl_context *ssl,
5053 unsigned char *dst,
5054 size_t dst_len,
5055 size_t *olen )
Jerry Yu24c0ec32021-09-09 14:21:07 +08005056{
Jerry Yu24c0ec32021-09-09 14:21:07 +08005057 int ret;
5058 mbedtls_sha256_context sha256;
5059
5060 if( dst_len < 32 )
5061 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
5062
5063 mbedtls_sha256_init( &sha256 );
5064 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
Jerry Yuc5aef882021-12-23 20:15:02 +08005065
Jerry Yu24c0ec32021-09-09 14:21:07 +08005066 if( ( ret = mbedtls_sha256_finish( &sha256, dst ) ) != 0 )
5067 {
5068 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha256_finish", ret );
5069 goto exit;
5070 }
5071
5072 *olen = 32;
5073
5074exit:
5075
5076 mbedtls_sha256_free( &sha256 );
5077 return( ret );
Jerry Yu24c0ec32021-09-09 14:21:07 +08005078}
5079#endif /* MBEDTLS_SHA256_C */
5080
Jerry Yu000f9762021-09-14 11:12:51 +08005081int mbedtls_ssl_get_handshake_transcript( mbedtls_ssl_context *ssl,
5082 const mbedtls_md_type_t md,
5083 unsigned char *dst,
5084 size_t dst_len,
5085 size_t *olen )
Jerry Yu24c0ec32021-09-09 14:21:07 +08005086{
Jerry Yuc1ddeef2021-10-08 15:14:45 +08005087 switch( md )
5088 {
5089
Jerry Yu24c0ec32021-09-09 14:21:07 +08005090#if defined(MBEDTLS_SHA384_C)
Jerry Yuc1ddeef2021-10-08 15:14:45 +08005091 case MBEDTLS_MD_SHA384:
Jerry Yuc5aef882021-12-23 20:15:02 +08005092 return( ssl_get_handshake_transcript_sha384( ssl, dst, dst_len, olen ) );
Jerry Yuc10f6b42021-12-23 17:16:42 +08005093#endif /* MBEDTLS_SHA384_C */
Jerry Yuc1ddeef2021-10-08 15:14:45 +08005094
Jerry Yu24c0ec32021-09-09 14:21:07 +08005095#if defined(MBEDTLS_SHA256_C)
Jerry Yuc1ddeef2021-10-08 15:14:45 +08005096 case MBEDTLS_MD_SHA256:
Jerry Yuc5aef882021-12-23 20:15:02 +08005097 return( ssl_get_handshake_transcript_sha256( ssl, dst, dst_len, olen ) );
Jerry Yuc10f6b42021-12-23 17:16:42 +08005098#endif /* MBEDTLS_SHA256_C */
Jerry Yuc1ddeef2021-10-08 15:14:45 +08005099
5100 default:
5101 break;
5102 }
Jerry Yuc5aef882021-12-23 20:15:02 +08005103 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Jerry Yu24c0ec32021-09-09 14:21:07 +08005104}
XiaokangQian647719a2021-12-07 09:16:29 +00005105
Jerry Yu148165c2021-09-24 23:20:59 +08005106#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Jerry Yu24c0ec32021-09-09 14:21:07 +08005107
Gabor Mezei078e8032022-04-27 21:17:56 +02005108#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
5109/* mbedtls_ssl_parse_sig_alg_ext()
5110 *
5111 * The `extension_data` field of signature algorithm contains a `SignatureSchemeList`
5112 * value (TLS 1.3 RFC8446):
5113 * enum {
5114 * ....
5115 * ecdsa_secp256r1_sha256( 0x0403 ),
5116 * ecdsa_secp384r1_sha384( 0x0503 ),
5117 * ecdsa_secp521r1_sha512( 0x0603 ),
5118 * ....
5119 * } SignatureScheme;
5120 *
5121 * struct {
5122 * SignatureScheme supported_signature_algorithms<2..2^16-2>;
5123 * } SignatureSchemeList;
5124 *
5125 * The `extension_data` field of signature algorithm contains a `SignatureAndHashAlgorithm`
5126 * value (TLS 1.2 RFC5246):
5127 * enum {
5128 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
5129 * sha512(6), (255)
5130 * } HashAlgorithm;
5131 *
5132 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
5133 * SignatureAlgorithm;
5134 *
5135 * struct {
5136 * HashAlgorithm hash;
5137 * SignatureAlgorithm signature;
5138 * } SignatureAndHashAlgorithm;
5139 *
5140 * SignatureAndHashAlgorithm
5141 * supported_signature_algorithms<2..2^16-2>;
5142 *
5143 * The TLS 1.3 signature algorithm extension was defined to be a compatible
5144 * generalization of the TLS 1.2 signature algorithm extension.
5145 * `SignatureAndHashAlgorithm` field of TLS 1.2 can be represented by
5146 * `SignatureScheme` field of TLS 1.3
5147 *
5148 */
5149int mbedtls_ssl_parse_sig_alg_ext( mbedtls_ssl_context *ssl,
5150 const unsigned char *buf,
5151 const unsigned char *end )
5152{
5153 const unsigned char *p = buf;
5154 size_t supported_sig_algs_len = 0;
5155 const unsigned char *supported_sig_algs_end;
5156 uint16_t sig_alg;
5157 uint32_t common_idx = 0;
5158
5159 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
5160 supported_sig_algs_len = MBEDTLS_GET_UINT16_BE( p, 0 );
5161 p += 2;
5162
5163 memset( ssl->handshake->received_sig_algs, 0,
5164 sizeof(ssl->handshake->received_sig_algs) );
5165
5166 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, supported_sig_algs_len );
5167 supported_sig_algs_end = p + supported_sig_algs_len;
5168 while( p < supported_sig_algs_end )
5169 {
5170 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, supported_sig_algs_end, 2 );
5171 sig_alg = MBEDTLS_GET_UINT16_BE( p, 0 );
5172 p += 2;
Jerry Yuf3b46b52022-06-19 16:52:27 +08005173 MBEDTLS_SSL_DEBUG_MSG( 4, ( "received signature algorithm: 0x%x %s",
5174 sig_alg,
5175 mbedtls_ssl_sig_alg_to_str( sig_alg ) ) );
Jerry Yu2fe6c632022-06-29 10:02:38 +08005176#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yu52b7d922022-07-01 18:03:31 +08005177 if( ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_2 &&
Jerry Yu2fe6c632022-06-29 10:02:38 +08005178 ( ! ( mbedtls_ssl_sig_alg_is_supported( ssl, sig_alg ) &&
5179 mbedtls_ssl_sig_alg_is_offered( ssl, sig_alg ) ) ) )
5180 {
Gabor Mezei078e8032022-04-27 21:17:56 +02005181 continue;
Jerry Yu2fe6c632022-06-29 10:02:38 +08005182 }
5183#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Gabor Mezei078e8032022-04-27 21:17:56 +02005184
Jerry Yuf3b46b52022-06-19 16:52:27 +08005185 MBEDTLS_SSL_DEBUG_MSG( 4, ( "valid signature algorithm: %s",
5186 mbedtls_ssl_sig_alg_to_str( sig_alg ) ) );
Gabor Mezei078e8032022-04-27 21:17:56 +02005187
5188 if( common_idx + 1 < MBEDTLS_RECEIVED_SIG_ALGS_SIZE )
5189 {
5190 ssl->handshake->received_sig_algs[common_idx] = sig_alg;
5191 common_idx += 1;
5192 }
5193 }
5194 /* Check that we consumed all the message. */
5195 if( p != end )
5196 {
5197 MBEDTLS_SSL_DEBUG_MSG( 1,
5198 ( "Signature algorithms extension length misaligned" ) );
5199 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
5200 MBEDTLS_ERR_SSL_DECODE_ERROR );
5201 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
5202 }
5203
5204 if( common_idx == 0 )
5205 {
5206 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no signature algorithm in common" ) );
5207 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
5208 MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
5209 return( MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE );
5210 }
5211
Gabor Mezei15b95a62022-05-09 16:37:58 +02005212 ssl->handshake->received_sig_algs[common_idx] = MBEDTLS_TLS_SIG_NONE;
Gabor Mezei078e8032022-04-27 21:17:56 +02005213 return( 0 );
5214}
5215
5216#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
5217
Jerry Yudc7bd172022-02-17 13:44:15 +08005218#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5219
5220#if defined(MBEDTLS_USE_PSA_CRYPTO)
5221
5222static psa_status_t setup_psa_key_derivation( psa_key_derivation_operation_t* derivation,
5223 mbedtls_svc_key_id_t key,
5224 psa_algorithm_t alg,
Neil Armstrong8ecd6682022-05-05 11:40:35 +02005225 const unsigned char* raw_psk, size_t raw_psk_length,
Jerry Yudc7bd172022-02-17 13:44:15 +08005226 const unsigned char* seed, size_t seed_length,
5227 const unsigned char* label, size_t label_length,
Przemek Stekiel51a1f362022-04-13 08:57:06 +02005228 const unsigned char* other_secret,
5229 size_t other_secret_length,
Jerry Yudc7bd172022-02-17 13:44:15 +08005230 size_t capacity )
5231{
5232 psa_status_t status;
5233
5234 status = psa_key_derivation_setup( derivation, alg );
5235 if( status != PSA_SUCCESS )
5236 return( status );
5237
5238 if( PSA_ALG_IS_TLS12_PRF( alg ) || PSA_ALG_IS_TLS12_PSK_TO_MS( alg ) )
5239 {
5240 status = psa_key_derivation_input_bytes( derivation,
5241 PSA_KEY_DERIVATION_INPUT_SEED,
5242 seed, seed_length );
5243 if( status != PSA_SUCCESS )
5244 return( status );
5245
Przemek Stekiel51a1f362022-04-13 08:57:06 +02005246 if ( other_secret != NULL )
Przemek Stekiel1f027032022-04-05 17:12:11 +02005247 {
5248 status = psa_key_derivation_input_bytes( derivation,
Przemek Stekiel51a1f362022-04-13 08:57:06 +02005249 PSA_KEY_DERIVATION_INPUT_OTHER_SECRET,
5250 other_secret, other_secret_length );
Przemek Stekiel1f027032022-04-05 17:12:11 +02005251 if( status != PSA_SUCCESS )
5252 return( status );
5253 }
5254
Jerry Yudc7bd172022-02-17 13:44:15 +08005255 if( mbedtls_svc_key_id_is_null( key ) )
5256 {
5257 status = psa_key_derivation_input_bytes(
5258 derivation, PSA_KEY_DERIVATION_INPUT_SECRET,
Neil Armstrong8ecd6682022-05-05 11:40:35 +02005259 raw_psk, raw_psk_length );
Jerry Yudc7bd172022-02-17 13:44:15 +08005260 }
5261 else
5262 {
5263 status = psa_key_derivation_input_key(
5264 derivation, PSA_KEY_DERIVATION_INPUT_SECRET, key );
5265 }
5266 if( status != PSA_SUCCESS )
5267 return( status );
5268
5269 status = psa_key_derivation_input_bytes( derivation,
5270 PSA_KEY_DERIVATION_INPUT_LABEL,
5271 label, label_length );
5272 if( status != PSA_SUCCESS )
5273 return( status );
5274 }
5275 else
5276 {
5277 return( PSA_ERROR_NOT_SUPPORTED );
5278 }
5279
5280 status = psa_key_derivation_set_capacity( derivation, capacity );
5281 if( status != PSA_SUCCESS )
5282 return( status );
5283
5284 return( PSA_SUCCESS );
5285}
5286
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02005287MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yudc7bd172022-02-17 13:44:15 +08005288static int tls_prf_generic( mbedtls_md_type_t md_type,
5289 const unsigned char *secret, size_t slen,
5290 const char *label,
5291 const unsigned char *random, size_t rlen,
5292 unsigned char *dstbuf, size_t dlen )
5293{
5294 psa_status_t status;
5295 psa_algorithm_t alg;
5296 mbedtls_svc_key_id_t master_key = MBEDTLS_SVC_KEY_ID_INIT;
5297 psa_key_derivation_operation_t derivation =
5298 PSA_KEY_DERIVATION_OPERATION_INIT;
5299
5300 if( md_type == MBEDTLS_MD_SHA384 )
5301 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_384);
5302 else
5303 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256);
5304
5305 /* Normally a "secret" should be long enough to be impossible to
5306 * find by brute force, and in particular should not be empty. But
5307 * this PRF is also used to derive an IV, in particular in EAP-TLS,
5308 * and for this use case it makes sense to have a 0-length "secret".
5309 * Since the key API doesn't allow importing a key of length 0,
5310 * keep master_key=0, which setup_psa_key_derivation() understands
5311 * to mean a 0-length "secret" input. */
5312 if( slen != 0 )
5313 {
5314 psa_key_attributes_t key_attributes = psa_key_attributes_init();
5315 psa_set_key_usage_flags( &key_attributes, PSA_KEY_USAGE_DERIVE );
5316 psa_set_key_algorithm( &key_attributes, alg );
5317 psa_set_key_type( &key_attributes, PSA_KEY_TYPE_DERIVE );
5318
5319 status = psa_import_key( &key_attributes, secret, slen, &master_key );
5320 if( status != PSA_SUCCESS )
5321 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
5322 }
5323
5324 status = setup_psa_key_derivation( &derivation,
5325 master_key, alg,
Neil Armstrong8ecd6682022-05-05 11:40:35 +02005326 NULL, 0,
Jerry Yudc7bd172022-02-17 13:44:15 +08005327 random, rlen,
5328 (unsigned char const *) label,
5329 (size_t) strlen( label ),
Przemek Stekiel1f027032022-04-05 17:12:11 +02005330 NULL, 0,
Jerry Yudc7bd172022-02-17 13:44:15 +08005331 dlen );
5332 if( status != PSA_SUCCESS )
5333 {
5334 psa_key_derivation_abort( &derivation );
5335 psa_destroy_key( master_key );
5336 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
5337 }
5338
5339 status = psa_key_derivation_output_bytes( &derivation, dstbuf, dlen );
5340 if( status != PSA_SUCCESS )
5341 {
5342 psa_key_derivation_abort( &derivation );
5343 psa_destroy_key( master_key );
5344 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
5345 }
5346
5347 status = psa_key_derivation_abort( &derivation );
5348 if( status != PSA_SUCCESS )
5349 {
5350 psa_destroy_key( master_key );
5351 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
5352 }
5353
5354 if( ! mbedtls_svc_key_id_is_null( master_key ) )
5355 status = psa_destroy_key( master_key );
5356 if( status != PSA_SUCCESS )
5357 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
5358
5359 return( 0 );
5360}
5361
5362#else /* MBEDTLS_USE_PSA_CRYPTO */
5363
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02005364MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yudc7bd172022-02-17 13:44:15 +08005365static int tls_prf_generic( mbedtls_md_type_t md_type,
5366 const unsigned char *secret, size_t slen,
5367 const char *label,
5368 const unsigned char *random, size_t rlen,
5369 unsigned char *dstbuf, size_t dlen )
5370{
5371 size_t nb;
5372 size_t i, j, k, md_len;
5373 unsigned char *tmp;
5374 size_t tmp_len = 0;
5375 unsigned char h_i[MBEDTLS_MD_MAX_SIZE];
5376 const mbedtls_md_info_t *md_info;
5377 mbedtls_md_context_t md_ctx;
5378 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5379
5380 mbedtls_md_init( &md_ctx );
5381
5382 if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL )
5383 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
5384
5385 md_len = mbedtls_md_get_size( md_info );
5386
5387 tmp_len = md_len + strlen( label ) + rlen;
5388 tmp = mbedtls_calloc( 1, tmp_len );
5389 if( tmp == NULL )
5390 {
5391 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
5392 goto exit;
5393 }
5394
5395 nb = strlen( label );
5396 memcpy( tmp + md_len, label, nb );
5397 memcpy( tmp + md_len + nb, random, rlen );
5398 nb += rlen;
5399
5400 /*
5401 * Compute P_<hash>(secret, label + random)[0..dlen]
5402 */
5403 if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
5404 goto exit;
5405
5406 ret = mbedtls_md_hmac_starts( &md_ctx, secret, slen );
5407 if( ret != 0 )
5408 goto exit;
5409 ret = mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb );
5410 if( ret != 0 )
5411 goto exit;
5412 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
5413 if( ret != 0 )
5414 goto exit;
5415
5416 for( i = 0; i < dlen; i += md_len )
5417 {
5418 ret = mbedtls_md_hmac_reset ( &md_ctx );
5419 if( ret != 0 )
5420 goto exit;
5421 ret = mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb );
5422 if( ret != 0 )
5423 goto exit;
5424 ret = mbedtls_md_hmac_finish( &md_ctx, h_i );
5425 if( ret != 0 )
5426 goto exit;
5427
5428 ret = mbedtls_md_hmac_reset ( &md_ctx );
5429 if( ret != 0 )
5430 goto exit;
5431 ret = mbedtls_md_hmac_update( &md_ctx, tmp, md_len );
5432 if( ret != 0 )
5433 goto exit;
5434 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
5435 if( ret != 0 )
5436 goto exit;
5437
5438 k = ( i + md_len > dlen ) ? dlen % md_len : md_len;
5439
5440 for( j = 0; j < k; j++ )
5441 dstbuf[i + j] = h_i[j];
5442 }
5443
5444exit:
5445 mbedtls_md_free( &md_ctx );
5446
5447 mbedtls_platform_zeroize( tmp, tmp_len );
5448 mbedtls_platform_zeroize( h_i, sizeof( h_i ) );
5449
5450 mbedtls_free( tmp );
5451
5452 return( ret );
5453}
5454#endif /* MBEDTLS_USE_PSA_CRYPTO */
5455
5456#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02005457MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yudc7bd172022-02-17 13:44:15 +08005458static int tls_prf_sha256( const unsigned char *secret, size_t slen,
5459 const char *label,
5460 const unsigned char *random, size_t rlen,
5461 unsigned char *dstbuf, size_t dlen )
5462{
5463 return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen,
5464 label, random, rlen, dstbuf, dlen ) );
5465}
5466#endif /* MBEDTLS_SHA256_C */
5467
5468#if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02005469MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yudc7bd172022-02-17 13:44:15 +08005470static int tls_prf_sha384( const unsigned char *secret, size_t slen,
5471 const char *label,
5472 const unsigned char *random, size_t rlen,
5473 unsigned char *dstbuf, size_t dlen )
5474{
5475 return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen,
5476 label, random, rlen, dstbuf, dlen ) );
5477}
5478#endif /* MBEDTLS_SHA384_C */
5479
Jerry Yuf009d862022-02-17 14:01:37 +08005480/*
5481 * Set appropriate PRF function and other SSL / TLS1.2 functions
5482 *
5483 * Inputs:
Jerry Yuf009d862022-02-17 14:01:37 +08005484 * - hash associated with the ciphersuite (only used by TLS 1.2)
5485 *
5486 * Outputs:
5487 * - the tls_prf, calc_verify and calc_finished members of handshake structure
5488 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02005489MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuf009d862022-02-17 14:01:37 +08005490static int ssl_set_handshake_prfs( mbedtls_ssl_handshake_params *handshake,
Jerry Yuf009d862022-02-17 14:01:37 +08005491 mbedtls_md_type_t hash )
5492{
Jerry Yuf009d862022-02-17 14:01:37 +08005493#if defined(MBEDTLS_SHA384_C)
Ronald Cron81591aa2022-03-07 09:05:51 +01005494 if( hash == MBEDTLS_MD_SHA384 )
Jerry Yuf009d862022-02-17 14:01:37 +08005495 {
5496 handshake->tls_prf = tls_prf_sha384;
5497 handshake->calc_verify = ssl_calc_verify_tls_sha384;
5498 handshake->calc_finished = ssl_calc_finished_tls_sha384;
5499 }
5500 else
5501#endif
5502#if defined(MBEDTLS_SHA256_C)
Jerry Yuf009d862022-02-17 14:01:37 +08005503 {
Ronald Cron81591aa2022-03-07 09:05:51 +01005504 (void) hash;
Jerry Yuf009d862022-02-17 14:01:37 +08005505 handshake->tls_prf = tls_prf_sha256;
5506 handshake->calc_verify = ssl_calc_verify_tls_sha256;
5507 handshake->calc_finished = ssl_calc_finished_tls_sha256;
5508 }
Ronald Cron81591aa2022-03-07 09:05:51 +01005509#else
Jerry Yuf009d862022-02-17 14:01:37 +08005510 {
Jerry Yuf009d862022-02-17 14:01:37 +08005511 (void) handshake;
Ronald Cron81591aa2022-03-07 09:05:51 +01005512 (void) hash;
Jerry Yuf009d862022-02-17 14:01:37 +08005513 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
5514 }
Ronald Cron81591aa2022-03-07 09:05:51 +01005515#endif
Jerry Yuf009d862022-02-17 14:01:37 +08005516
5517 return( 0 );
5518}
Jerry Yud6ab2352022-02-17 14:03:43 +08005519
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005520/*
5521 * Compute master secret if needed
5522 *
5523 * Parameters:
5524 * [in/out] handshake
5525 * [in] resume, premaster, extended_ms, calc_verify, tls_prf
5526 * (PSA-PSK) ciphersuite_info, psk_opaque
5527 * [out] premaster (cleared)
5528 * [out] master
5529 * [in] ssl: optionally used for debugging, EMS and PSA-PSK
5530 * debug: conf->f_dbg, conf->p_dbg
5531 * EMS: passed to calc_verify (debug + session_negotiate)
Ronald Crona25cf582022-03-07 11:10:36 +01005532 * PSA-PSA: conf
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005533 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02005534MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005535static int ssl_compute_master( mbedtls_ssl_handshake_params *handshake,
5536 unsigned char *master,
5537 const mbedtls_ssl_context *ssl )
5538{
5539 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5540
5541 /* cf. RFC 5246, Section 8.1:
5542 * "The master secret is always exactly 48 bytes in length." */
5543 size_t const master_secret_len = 48;
5544
5545#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
5546 unsigned char session_hash[48];
5547#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
5548
5549 /* The label for the KDF used for key expansion.
5550 * This is either "master secret" or "extended master secret"
5551 * depending on whether the Extended Master Secret extension
5552 * is used. */
5553 char const *lbl = "master secret";
5554
Przemek Stekielae4ed302022-04-05 17:15:55 +02005555 /* The seed for the KDF used for key expansion.
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005556 * - If the Extended Master Secret extension is not used,
5557 * this is ClientHello.Random + ServerHello.Random
5558 * (see Sect. 8.1 in RFC 5246).
5559 * - If the Extended Master Secret extension is used,
5560 * this is the transcript of the handshake so far.
5561 * (see Sect. 4 in RFC 7627). */
Przemek Stekielae4ed302022-04-05 17:15:55 +02005562 unsigned char const *seed = handshake->randbytes;
5563 size_t seed_len = 64;
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005564
5565#if !defined(MBEDTLS_DEBUG_C) && \
5566 !defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \
5567 !(defined(MBEDTLS_USE_PSA_CRYPTO) && \
5568 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED))
5569 ssl = NULL; /* make sure we don't use it except for those cases */
5570 (void) ssl;
5571#endif
5572
5573 if( handshake->resume != 0 )
5574 {
5575 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
5576 return( 0 );
5577 }
5578
5579#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
5580 if( handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED )
5581 {
5582 lbl = "extended master secret";
Przemek Stekielae4ed302022-04-05 17:15:55 +02005583 seed = session_hash;
5584 handshake->calc_verify( ssl, session_hash, &seed_len );
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005585
5586 MBEDTLS_SSL_DEBUG_BUF( 3, "session hash for extended master secret",
Przemek Stekielae4ed302022-04-05 17:15:55 +02005587 session_hash, seed_len );
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005588 }
Przemek Stekiel169bf0b2022-04-29 07:53:29 +02005589#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005590
Przemek Stekiel99114f32022-04-22 11:20:09 +02005591#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
Przemek Stekiel8a4b7fd2022-04-28 09:22:22 +02005592 defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Neil Armstronge952a302022-05-03 10:22:14 +02005593 if( mbedtls_ssl_ciphersuite_uses_psk( handshake->ciphersuite_info ) == 1 )
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005594 {
5595 /* Perform PSK-to-MS expansion in a single step. */
5596 psa_status_t status;
5597 psa_algorithm_t alg;
5598 mbedtls_svc_key_id_t psk;
5599 psa_key_derivation_operation_t derivation =
5600 PSA_KEY_DERIVATION_OPERATION_INIT;
5601 mbedtls_md_type_t hash_alg = handshake->ciphersuite_info->mac;
5602
5603 MBEDTLS_SSL_DEBUG_MSG( 2, ( "perform PSA-based PSK-to-MS expansion" ) );
5604
5605 psk = mbedtls_ssl_get_opaque_psk( ssl );
5606
5607 if( hash_alg == MBEDTLS_MD_SHA384 )
5608 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
5609 else
5610 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
5611
Przemek Stekiel51a1f362022-04-13 08:57:06 +02005612 size_t other_secret_len = 0;
5613 unsigned char* other_secret = NULL;
Przemek Stekielc2033402022-04-05 17:19:41 +02005614
Przemek Stekiel19b80f82022-04-14 08:29:31 +02005615 switch( handshake->ciphersuite_info->key_exchange )
Przemek Stekielc2033402022-04-05 17:19:41 +02005616 {
Przemek Stekiel19b80f82022-04-14 08:29:31 +02005617 /* Provide other secret.
Przemek Stekiel51a1f362022-04-13 08:57:06 +02005618 * Other secret is stored in premaster, where first 2 bytes hold the
Przemek Stekiel19b80f82022-04-14 08:29:31 +02005619 * length of the other key.
Przemek Stekielc2033402022-04-05 17:19:41 +02005620 */
Przemek Stekiel19b80f82022-04-14 08:29:31 +02005621 case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
Przemek Stekiel8abcee92022-04-28 09:16:28 +02005622 /* For RSA-PSK other key length is always 48 bytes. */
Przemek Stekiel19b80f82022-04-14 08:29:31 +02005623 other_secret_len = 48;
5624 other_secret = handshake->premaster + 2;
5625 break;
5626 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
Przemek Stekielb293aaa2022-04-19 12:22:38 +02005627 case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
Przemek Stekiel19b80f82022-04-14 08:29:31 +02005628 other_secret_len = MBEDTLS_GET_UINT16_BE(handshake->premaster, 0);
5629 other_secret = handshake->premaster + 2;
5630 break;
5631 default:
5632 break;
Przemek Stekielc2033402022-04-05 17:19:41 +02005633 }
5634
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005635 status = setup_psa_key_derivation( &derivation, psk, alg,
Neil Armstrong8ecd6682022-05-05 11:40:35 +02005636 ssl->conf->psk, ssl->conf->psk_len,
Przemek Stekielae4ed302022-04-05 17:15:55 +02005637 seed, seed_len,
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005638 (unsigned char const *) lbl,
5639 (size_t) strlen( lbl ),
Przemek Stekiel51a1f362022-04-13 08:57:06 +02005640 other_secret, other_secret_len,
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005641 master_secret_len );
5642 if( status != PSA_SUCCESS )
5643 {
5644 psa_key_derivation_abort( &derivation );
5645 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
5646 }
5647
5648 status = psa_key_derivation_output_bytes( &derivation,
5649 master,
5650 master_secret_len );
5651 if( status != PSA_SUCCESS )
5652 {
5653 psa_key_derivation_abort( &derivation );
5654 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
5655 }
5656
5657 status = psa_key_derivation_abort( &derivation );
5658 if( status != PSA_SUCCESS )
5659 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
5660 }
5661 else
5662#endif
5663 {
5664 ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,
Przemek Stekielae4ed302022-04-05 17:15:55 +02005665 lbl, seed, seed_len,
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08005666 master,
5667 master_secret_len );
5668 if( ret != 0 )
5669 {
5670 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
5671 return( ret );
5672 }
5673
5674 MBEDTLS_SSL_DEBUG_BUF( 3, "premaster secret",
5675 handshake->premaster,
5676 handshake->pmslen );
5677
5678 mbedtls_platform_zeroize( handshake->premaster,
5679 sizeof(handshake->premaster) );
5680 }
5681
5682 return( 0 );
5683}
5684
Jerry Yud62f87e2022-02-17 14:09:02 +08005685int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
5686{
5687 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5688 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
5689 ssl->handshake->ciphersuite_info;
5690
5691 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
5692
5693 /* Set PRF, calc_verify and calc_finished function pointers */
5694 ret = ssl_set_handshake_prfs( ssl->handshake,
Jerry Yud62f87e2022-02-17 14:09:02 +08005695 ciphersuite_info->mac );
5696 if( ret != 0 )
5697 {
5698 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_set_handshake_prfs", ret );
5699 return( ret );
5700 }
5701
5702 /* Compute master secret if needed */
5703 ret = ssl_compute_master( ssl->handshake,
5704 ssl->session_negotiate->master,
5705 ssl );
5706 if( ret != 0 )
5707 {
5708 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_compute_master", ret );
5709 return( ret );
5710 }
5711
5712 /* Swap the client and server random values:
5713 * - MS derivation wanted client+server (RFC 5246 8.1)
5714 * - key derivation wants server+client (RFC 5246 6.3) */
5715 {
5716 unsigned char tmp[64];
5717 memcpy( tmp, ssl->handshake->randbytes, 64 );
5718 memcpy( ssl->handshake->randbytes, tmp + 32, 32 );
5719 memcpy( ssl->handshake->randbytes + 32, tmp, 32 );
5720 mbedtls_platform_zeroize( tmp, sizeof( tmp ) );
5721 }
5722
5723 /* Populate transform structure */
5724 ret = ssl_tls12_populate_transform( ssl->transform_negotiate,
5725 ssl->session_negotiate->ciphersuite,
5726 ssl->session_negotiate->master,
Neil Armstrongf2c82f02022-04-05 11:16:53 +02005727#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Jerry Yud62f87e2022-02-17 14:09:02 +08005728 ssl->session_negotiate->encrypt_then_mac,
Neil Armstrongf2c82f02022-04-05 11:16:53 +02005729#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Jerry Yud62f87e2022-02-17 14:09:02 +08005730 ssl->handshake->tls_prf,
5731 ssl->handshake->randbytes,
Glenn Strauss60bfe602022-03-14 19:04:24 -04005732 ssl->tls_version,
Jerry Yud62f87e2022-02-17 14:09:02 +08005733 ssl->conf->endpoint,
5734 ssl );
5735 if( ret != 0 )
5736 {
5737 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls12_populate_transform", ret );
5738 return( ret );
5739 }
5740
5741 /* We no longer need Server/ClientHello.random values */
5742 mbedtls_platform_zeroize( ssl->handshake->randbytes,
5743 sizeof( ssl->handshake->randbytes ) );
5744
5745 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
5746
5747 return( 0 );
5748}
Jerry Yu8392e0d2022-02-17 14:10:24 +08005749
Ronald Cron4dcbca92022-03-07 10:21:40 +01005750int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md )
5751{
Ronald Cron4dcbca92022-03-07 10:21:40 +01005752 switch( md )
5753 {
5754#if defined(MBEDTLS_SHA384_C)
5755 case MBEDTLS_SSL_HASH_SHA384:
5756 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384;
5757 break;
5758#endif
5759#if defined(MBEDTLS_SHA256_C)
5760 case MBEDTLS_SSL_HASH_SHA256:
5761 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256;
5762 break;
5763#endif
5764 default:
5765 return( -1 );
5766 }
5767
Ronald Cronc2f13a02022-03-07 10:25:24 +01005768 return( 0 );
Ronald Cron4dcbca92022-03-07 10:21:40 +01005769}
5770
Jerry Yu8392e0d2022-02-17 14:10:24 +08005771#if defined(MBEDTLS_SHA256_C)
5772void ssl_calc_verify_tls_sha256( const mbedtls_ssl_context *ssl,
5773 unsigned char *hash,
5774 size_t *hlen )
5775{
5776#if defined(MBEDTLS_USE_PSA_CRYPTO)
5777 size_t hash_size;
5778 psa_status_t status;
5779 psa_hash_operation_t sha256_psa = psa_hash_operation_init();
5780
5781 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> PSA calc verify sha256" ) );
5782 status = psa_hash_clone( &ssl->handshake->fin_sha256_psa, &sha256_psa );
5783 if( status != PSA_SUCCESS )
5784 {
5785 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
5786 return;
5787 }
5788
5789 status = psa_hash_finish( &sha256_psa, hash, 32, &hash_size );
5790 if( status != PSA_SUCCESS )
5791 {
5792 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
5793 return;
5794 }
5795
5796 *hlen = 32;
5797 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated verify result", hash, *hlen );
5798 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= PSA calc verify" ) );
5799#else
5800 mbedtls_sha256_context sha256;
5801
5802 mbedtls_sha256_init( &sha256 );
5803
5804 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
5805
5806 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
5807 mbedtls_sha256_finish( &sha256, hash );
5808
5809 *hlen = 32;
5810
5811 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
5812 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
5813
5814 mbedtls_sha256_free( &sha256 );
5815#endif /* MBEDTLS_USE_PSA_CRYPTO */
5816 return;
5817}
5818#endif /* MBEDTLS_SHA256_C */
5819
Jerry Yuc1cb3842022-02-17 14:13:48 +08005820#if defined(MBEDTLS_SHA384_C)
5821void ssl_calc_verify_tls_sha384( const mbedtls_ssl_context *ssl,
5822 unsigned char *hash,
5823 size_t *hlen )
5824{
5825#if defined(MBEDTLS_USE_PSA_CRYPTO)
5826 size_t hash_size;
5827 psa_status_t status;
5828 psa_hash_operation_t sha384_psa = psa_hash_operation_init();
5829
5830 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> PSA calc verify sha384" ) );
5831 status = psa_hash_clone( &ssl->handshake->fin_sha384_psa, &sha384_psa );
5832 if( status != PSA_SUCCESS )
5833 {
5834 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
5835 return;
5836 }
5837
5838 status = psa_hash_finish( &sha384_psa, hash, 48, &hash_size );
5839 if( status != PSA_SUCCESS )
5840 {
5841 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
5842 return;
5843 }
5844
5845 *hlen = 48;
5846 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated verify result", hash, *hlen );
5847 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= PSA calc verify" ) );
5848#else
5849 mbedtls_sha512_context sha512;
5850
5851 mbedtls_sha512_init( &sha512 );
5852
5853 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
5854
5855 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
5856 mbedtls_sha512_finish( &sha512, hash );
5857
5858 *hlen = 48;
5859
5860 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
5861 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
5862
5863 mbedtls_sha512_free( &sha512 );
5864#endif /* MBEDTLS_USE_PSA_CRYPTO */
5865 return;
5866}
5867#endif /* MBEDTLS_SHA384_C */
5868
Neil Armstrong80f6f322022-05-03 17:56:38 +02005869#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
5870 defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Jerry Yuce3dca42022-02-17 14:16:37 +08005871int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex )
5872{
5873 unsigned char *p = ssl->handshake->premaster;
5874 unsigned char *end = p + sizeof( ssl->handshake->premaster );
5875 const unsigned char *psk = NULL;
5876 size_t psk_len = 0;
Przemek Stekielb293aaa2022-04-19 12:22:38 +02005877 int psk_ret = mbedtls_ssl_get_psk( ssl, &psk, &psk_len );
Jerry Yuce3dca42022-02-17 14:16:37 +08005878
Przemek Stekielb293aaa2022-04-19 12:22:38 +02005879 if( psk_ret == MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED )
Jerry Yuce3dca42022-02-17 14:16:37 +08005880 {
5881 /*
5882 * This should never happen because the existence of a PSK is always
Przemek Stekielb293aaa2022-04-19 12:22:38 +02005883 * checked before calling this function.
5884 *
5885 * The exception is opaque DHE-PSK. For DHE-PSK fill premaster with
Przemek Stekiel8abcee92022-04-28 09:16:28 +02005886 * the shared secret without PSK.
Jerry Yuce3dca42022-02-17 14:16:37 +08005887 */
Przemek Stekielb293aaa2022-04-19 12:22:38 +02005888 if ( key_ex != MBEDTLS_KEY_EXCHANGE_DHE_PSK )
5889 {
5890 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
5891 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
5892 }
Jerry Yuce3dca42022-02-17 14:16:37 +08005893 }
5894
5895 /*
5896 * PMS = struct {
5897 * opaque other_secret<0..2^16-1>;
5898 * opaque psk<0..2^16-1>;
5899 * };
5900 * with "other_secret" depending on the particular key exchange
5901 */
5902#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
5903 if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK )
5904 {
5905 if( end - p < 2 )
5906 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5907
5908 MBEDTLS_PUT_UINT16_BE( psk_len, p, 0 );
5909 p += 2;
5910
5911 if( end < p || (size_t)( end - p ) < psk_len )
5912 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5913
5914 memset( p, 0, psk_len );
5915 p += psk_len;
5916 }
5917 else
5918#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
5919#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
5920 if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
5921 {
5922 /*
5923 * other_secret already set by the ClientKeyExchange message,
5924 * and is 48 bytes long
5925 */
5926 if( end - p < 2 )
5927 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5928
5929 *p++ = 0;
5930 *p++ = 48;
5931 p += 48;
5932 }
5933 else
5934#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
5935#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
5936 if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
5937 {
5938 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5939 size_t len;
5940
5941 /* Write length only when we know the actual value */
5942 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
5943 p + 2, end - ( p + 2 ), &len,
5944 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
5945 {
5946 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
5947 return( ret );
5948 }
5949 MBEDTLS_PUT_UINT16_BE( len, p, 0 );
5950 p += 2 + len;
5951
5952 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
5953 }
5954 else
5955#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrong80f6f322022-05-03 17:56:38 +02005956#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Jerry Yuce3dca42022-02-17 14:16:37 +08005957 if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
5958 {
5959 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5960 size_t zlen;
5961
5962 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen,
5963 p + 2, end - ( p + 2 ),
5964 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
5965 {
5966 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
5967 return( ret );
5968 }
5969
5970 MBEDTLS_PUT_UINT16_BE( zlen, p, 0 );
5971 p += 2 + zlen;
5972
5973 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
5974 MBEDTLS_DEBUG_ECDH_Z );
5975 }
5976 else
Neil Armstrong80f6f322022-05-03 17:56:38 +02005977#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Jerry Yuce3dca42022-02-17 14:16:37 +08005978 {
5979 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
5980 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
5981 }
5982
5983 /* opaque psk<0..2^16-1>; */
5984 if( end - p < 2 )
5985 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5986
5987 MBEDTLS_PUT_UINT16_BE( psk_len, p, 0 );
5988 p += 2;
5989
5990 if( end < p || (size_t)( end - p ) < psk_len )
5991 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5992
5993 memcpy( p, psk, psk_len );
5994 p += psk_len;
5995
5996 ssl->handshake->pmslen = p - ssl->handshake->premaster;
5997
5998 return( 0 );
5999}
Neil Armstrong80f6f322022-05-03 17:56:38 +02006000#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Jerry Yuc2c673d2022-02-17 14:20:39 +08006001
6002#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02006003MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yuc2c673d2022-02-17 14:20:39 +08006004static int ssl_write_hello_request( mbedtls_ssl_context *ssl );
6005
6006#if defined(MBEDTLS_SSL_PROTO_DTLS)
6007int mbedtls_ssl_resend_hello_request( mbedtls_ssl_context *ssl )
6008{
6009 /* If renegotiation is not enforced, retransmit until we would reach max
6010 * timeout if we were using the usual handshake doubling scheme */
6011 if( ssl->conf->renego_max_records < 0 )
6012 {
6013 uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1;
6014 unsigned char doublings = 1;
6015
6016 while( ratio != 0 )
6017 {
6018 ++doublings;
6019 ratio >>= 1;
6020 }
6021
6022 if( ++ssl->renego_records_seen > doublings )
6023 {
6024 MBEDTLS_SSL_DEBUG_MSG( 2, ( "no longer retransmitting hello request" ) );
6025 return( 0 );
6026 }
6027 }
6028
6029 return( ssl_write_hello_request( ssl ) );
6030}
6031#endif
6032#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
Jerry Yud9526692022-02-17 14:23:47 +08006033
Jerry Yud9526692022-02-17 14:23:47 +08006034/*
6035 * Handshake functions
6036 */
6037#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
6038/* No certificate support -> dummy functions */
6039int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
6040{
6041 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
6042 ssl->handshake->ciphersuite_info;
6043
6044 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
6045
6046 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
6047 {
6048 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
6049 ssl->state++;
6050 return( 0 );
6051 }
6052
6053 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
6054 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
6055}
6056
6057int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
6058{
6059 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
6060 ssl->handshake->ciphersuite_info;
6061
6062 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
6063
6064 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
6065 {
6066 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
6067 ssl->state++;
6068 return( 0 );
6069 }
6070
6071 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
6072 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
6073}
6074
6075#else /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
6076/* Some certificate support -> implement write and parse */
6077
6078int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
6079{
6080 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
6081 size_t i, n;
6082 const mbedtls_x509_crt *crt;
6083 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
6084 ssl->handshake->ciphersuite_info;
6085
6086 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
6087
6088 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
6089 {
6090 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
6091 ssl->state++;
6092 return( 0 );
6093 }
6094
6095#if defined(MBEDTLS_SSL_CLI_C)
6096 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
6097 {
6098 if( ssl->handshake->client_auth == 0 )
6099 {
6100 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
6101 ssl->state++;
6102 return( 0 );
6103 }
6104 }
6105#endif /* MBEDTLS_SSL_CLI_C */
6106#if defined(MBEDTLS_SSL_SRV_C)
6107 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
6108 {
6109 if( mbedtls_ssl_own_cert( ssl ) == NULL )
6110 {
6111 /* Should never happen because we shouldn't have picked the
6112 * ciphersuite if we don't have a certificate. */
6113 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
6114 }
6115 }
6116#endif
6117
6118 MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", mbedtls_ssl_own_cert( ssl ) );
6119
6120 /*
6121 * 0 . 0 handshake type
6122 * 1 . 3 handshake length
6123 * 4 . 6 length of all certs
6124 * 7 . 9 length of cert. 1
6125 * 10 . n-1 peer certificate
6126 * n . n+2 length of cert. 2
6127 * n+3 . ... upper level cert, etc.
6128 */
6129 i = 7;
6130 crt = mbedtls_ssl_own_cert( ssl );
6131
6132 while( crt != NULL )
6133 {
6134 n = crt->raw.len;
6135 if( n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i )
6136 {
6137 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate too large, %" MBEDTLS_PRINTF_SIZET
6138 " > %" MBEDTLS_PRINTF_SIZET,
6139 i + 3 + n, (size_t) MBEDTLS_SSL_OUT_CONTENT_LEN ) );
6140 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
6141 }
6142
6143 ssl->out_msg[i ] = MBEDTLS_BYTE_2( n );
6144 ssl->out_msg[i + 1] = MBEDTLS_BYTE_1( n );
6145 ssl->out_msg[i + 2] = MBEDTLS_BYTE_0( n );
6146
6147 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
6148 i += n; crt = crt->next;
6149 }
6150
6151 ssl->out_msg[4] = MBEDTLS_BYTE_2( i - 7 );
6152 ssl->out_msg[5] = MBEDTLS_BYTE_1( i - 7 );
6153 ssl->out_msg[6] = MBEDTLS_BYTE_0( i - 7 );
6154
6155 ssl->out_msglen = i;
6156 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
6157 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE;
6158
6159 ssl->state++;
6160
6161 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
6162 {
6163 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
6164 return( ret );
6165 }
6166
6167 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
6168
6169 return( ret );
6170}
6171
6172#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
6173
6174#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02006175MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yud9526692022-02-17 14:23:47 +08006176static int ssl_check_peer_crt_unchanged( mbedtls_ssl_context *ssl,
6177 unsigned char *crt_buf,
6178 size_t crt_buf_len )
6179{
6180 mbedtls_x509_crt const * const peer_crt = ssl->session->peer_cert;
6181
6182 if( peer_crt == NULL )
6183 return( -1 );
6184
6185 if( peer_crt->raw.len != crt_buf_len )
6186 return( -1 );
6187
6188 return( memcmp( peer_crt->raw.p, crt_buf, peer_crt->raw.len ) );
6189}
6190#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02006191MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yud9526692022-02-17 14:23:47 +08006192static int ssl_check_peer_crt_unchanged( mbedtls_ssl_context *ssl,
6193 unsigned char *crt_buf,
6194 size_t crt_buf_len )
6195{
6196 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6197 unsigned char const * const peer_cert_digest =
6198 ssl->session->peer_cert_digest;
6199 mbedtls_md_type_t const peer_cert_digest_type =
6200 ssl->session->peer_cert_digest_type;
6201 mbedtls_md_info_t const * const digest_info =
6202 mbedtls_md_info_from_type( peer_cert_digest_type );
6203 unsigned char tmp_digest[MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN];
6204 size_t digest_len;
6205
6206 if( peer_cert_digest == NULL || digest_info == NULL )
6207 return( -1 );
6208
6209 digest_len = mbedtls_md_get_size( digest_info );
6210 if( digest_len > MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN )
6211 return( -1 );
6212
6213 ret = mbedtls_md( digest_info, crt_buf, crt_buf_len, tmp_digest );
6214 if( ret != 0 )
6215 return( -1 );
6216
6217 return( memcmp( tmp_digest, peer_cert_digest, digest_len ) );
6218}
6219#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
6220#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
6221
6222/*
6223 * Once the certificate message is read, parse it into a cert chain and
6224 * perform basic checks, but leave actual verification to the caller
6225 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02006226MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yud9526692022-02-17 14:23:47 +08006227static int ssl_parse_certificate_chain( mbedtls_ssl_context *ssl,
6228 mbedtls_x509_crt *chain )
6229{
6230 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6231#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
6232 int crt_cnt=0;
6233#endif
6234 size_t i, n;
6235 uint8_t alert;
6236
6237 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
6238 {
6239 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
6240 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6241 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
6242 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
6243 }
6244
6245 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE )
6246 {
6247 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6248 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
6249 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
6250 }
6251
6252 if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 )
6253 {
6254 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
6255 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6256 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
6257 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
6258 }
6259
6260 i = mbedtls_ssl_hs_hdr_len( ssl );
6261
6262 /*
6263 * Same message structure as in mbedtls_ssl_write_certificate()
6264 */
6265 n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2];
6266
6267 if( ssl->in_msg[i] != 0 ||
6268 ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) )
6269 {
6270 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
6271 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6272 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
6273 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
6274 }
6275
6276 /* Make &ssl->in_msg[i] point to the beginning of the CRT chain. */
6277 i += 3;
6278
6279 /* Iterate through and parse the CRTs in the provided chain. */
6280 while( i < ssl->in_hslen )
6281 {
6282 /* Check that there's room for the next CRT's length fields. */
6283 if ( i + 3 > ssl->in_hslen ) {
6284 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
6285 mbedtls_ssl_send_alert_message( ssl,
6286 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6287 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
6288 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
6289 }
6290 /* In theory, the CRT can be up to 2**24 Bytes, but we don't support
6291 * anything beyond 2**16 ~ 64K. */
6292 if( ssl->in_msg[i] != 0 )
6293 {
6294 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
6295 mbedtls_ssl_send_alert_message( ssl,
6296 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6297 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT );
6298 return( MBEDTLS_ERR_SSL_BAD_CERTIFICATE );
6299 }
6300
6301 /* Read length of the next CRT in the chain. */
6302 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
6303 | (unsigned int) ssl->in_msg[i + 2];
6304 i += 3;
6305
6306 if( n < 128 || i + n > ssl->in_hslen )
6307 {
6308 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
6309 mbedtls_ssl_send_alert_message( ssl,
6310 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6311 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
6312 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
6313 }
6314
6315 /* Check if we're handling the first CRT in the chain. */
6316#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
6317 if( crt_cnt++ == 0 &&
6318 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
6319 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
6320 {
6321 /* During client-side renegotiation, check that the server's
6322 * end-CRTs hasn't changed compared to the initial handshake,
6323 * mitigating the triple handshake attack. On success, reuse
6324 * the original end-CRT instead of parsing it again. */
6325 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Check that peer CRT hasn't changed during renegotiation" ) );
6326 if( ssl_check_peer_crt_unchanged( ssl,
6327 &ssl->in_msg[i],
6328 n ) != 0 )
6329 {
6330 MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) );
6331 mbedtls_ssl_send_alert_message( ssl,
6332 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6333 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED );
6334 return( MBEDTLS_ERR_SSL_BAD_CERTIFICATE );
6335 }
6336
6337 /* Now we can safely free the original chain. */
6338 ssl_clear_peer_cert( ssl->session );
6339 }
6340#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
6341
6342 /* Parse the next certificate in the chain. */
6343#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
6344 ret = mbedtls_x509_crt_parse_der( chain, ssl->in_msg + i, n );
6345#else
6346 /* If we don't need to store the CRT chain permanently, parse
6347 * it in-place from the input buffer instead of making a copy. */
6348 ret = mbedtls_x509_crt_parse_der_nocopy( chain, ssl->in_msg + i, n );
6349#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
6350 switch( ret )
6351 {
6352 case 0: /*ok*/
6353 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
6354 /* Ignore certificate with an unknown algorithm: maybe a
6355 prior certificate was already trusted. */
6356 break;
6357
6358 case MBEDTLS_ERR_X509_ALLOC_FAILED:
6359 alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR;
6360 goto crt_parse_der_failed;
6361
6362 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
6363 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6364 goto crt_parse_der_failed;
6365
6366 default:
6367 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
6368 crt_parse_der_failed:
6369 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert );
6370 MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret );
6371 return( ret );
6372 }
6373
6374 i += n;
6375 }
6376
6377 MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", chain );
6378 return( 0 );
6379}
6380
6381#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02006382MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yud9526692022-02-17 14:23:47 +08006383static int ssl_srv_check_client_no_crt_notification( mbedtls_ssl_context *ssl )
6384{
6385 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
6386 return( -1 );
6387
6388 if( ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len( ssl ) &&
6389 ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
6390 ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE &&
6391 memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), "\0\0\0", 3 ) == 0 )
6392 {
Ronald Cron19385882022-06-15 16:26:13 +02006393 MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer has no certificate" ) );
Jerry Yud9526692022-02-17 14:23:47 +08006394 return( 0 );
6395 }
6396 return( -1 );
6397}
6398#endif /* MBEDTLS_SSL_SRV_C */
6399
6400/* Check if a certificate message is expected.
6401 * Return either
6402 * - SSL_CERTIFICATE_EXPECTED, or
6403 * - SSL_CERTIFICATE_SKIP
6404 * indicating whether a Certificate message is expected or not.
6405 */
6406#define SSL_CERTIFICATE_EXPECTED 0
6407#define SSL_CERTIFICATE_SKIP 1
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02006408MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yud9526692022-02-17 14:23:47 +08006409static int ssl_parse_certificate_coordinate( mbedtls_ssl_context *ssl,
6410 int authmode )
6411{
6412 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
6413 ssl->handshake->ciphersuite_info;
6414
6415 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
6416 return( SSL_CERTIFICATE_SKIP );
6417
6418#if defined(MBEDTLS_SSL_SRV_C)
6419 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
6420 {
6421 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
6422 return( SSL_CERTIFICATE_SKIP );
6423
6424 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
6425 {
6426 ssl->session_negotiate->verify_result =
6427 MBEDTLS_X509_BADCERT_SKIP_VERIFY;
6428 return( SSL_CERTIFICATE_SKIP );
6429 }
6430 }
6431#else
6432 ((void) authmode);
6433#endif /* MBEDTLS_SSL_SRV_C */
6434
6435 return( SSL_CERTIFICATE_EXPECTED );
6436}
6437
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02006438MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yud9526692022-02-17 14:23:47 +08006439static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl,
6440 int authmode,
6441 mbedtls_x509_crt *chain,
6442 void *rs_ctx )
6443{
6444 int ret = 0;
6445 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
6446 ssl->handshake->ciphersuite_info;
6447 int have_ca_chain = 0;
6448
6449 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *);
6450 void *p_vrfy;
6451
6452 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
6453 return( 0 );
6454
6455 if( ssl->f_vrfy != NULL )
6456 {
6457 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use context-specific verification callback" ) );
6458 f_vrfy = ssl->f_vrfy;
6459 p_vrfy = ssl->p_vrfy;
6460 }
6461 else
6462 {
6463 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use configuration-specific verification callback" ) );
6464 f_vrfy = ssl->conf->f_vrfy;
6465 p_vrfy = ssl->conf->p_vrfy;
6466 }
6467
6468 /*
6469 * Main check: verify certificate
6470 */
6471#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
6472 if( ssl->conf->f_ca_cb != NULL )
6473 {
6474 ((void) rs_ctx);
6475 have_ca_chain = 1;
6476
6477 MBEDTLS_SSL_DEBUG_MSG( 3, ( "use CA callback for X.509 CRT verification" ) );
6478 ret = mbedtls_x509_crt_verify_with_ca_cb(
6479 chain,
6480 ssl->conf->f_ca_cb,
6481 ssl->conf->p_ca_cb,
6482 ssl->conf->cert_profile,
6483 ssl->hostname,
6484 &ssl->session_negotiate->verify_result,
6485 f_vrfy, p_vrfy );
6486 }
6487 else
6488#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
6489 {
6490 mbedtls_x509_crt *ca_chain;
6491 mbedtls_x509_crl *ca_crl;
6492
6493#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
6494 if( ssl->handshake->sni_ca_chain != NULL )
6495 {
6496 ca_chain = ssl->handshake->sni_ca_chain;
6497 ca_crl = ssl->handshake->sni_ca_crl;
6498 }
6499 else
6500#endif
6501 {
6502 ca_chain = ssl->conf->ca_chain;
6503 ca_crl = ssl->conf->ca_crl;
6504 }
6505
6506 if( ca_chain != NULL )
6507 have_ca_chain = 1;
6508
6509 ret = mbedtls_x509_crt_verify_restartable(
6510 chain,
6511 ca_chain, ca_crl,
6512 ssl->conf->cert_profile,
6513 ssl->hostname,
6514 &ssl->session_negotiate->verify_result,
6515 f_vrfy, p_vrfy, rs_ctx );
6516 }
6517
6518 if( ret != 0 )
6519 {
6520 MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
6521 }
6522
6523#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
6524 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
6525 return( MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS );
6526#endif
6527
6528 /*
6529 * Secondary checks: always done, but change 'ret' only if it was 0
6530 */
6531
6532#if defined(MBEDTLS_ECP_C)
6533 {
6534 const mbedtls_pk_context *pk = &chain->pk;
6535
Manuel Pégourié-Gonnard66b0d612022-06-17 10:49:29 +02006536 /* If certificate uses an EC key, make sure the curve is OK.
6537 * This is a public key, so it can't be opaque, so can_do() is a good
6538 * enough check to ensure pk_ec() is safe to use here. */
Jerry Yud9526692022-02-17 14:23:47 +08006539 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) &&
6540 mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 )
6541 {
6542 ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY;
6543
6544 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) );
6545 if( ret == 0 )
6546 ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
6547 }
6548 }
6549#endif /* MBEDTLS_ECP_C */
6550
6551 if( mbedtls_ssl_check_cert_usage( chain,
6552 ciphersuite_info,
6553 ! ssl->conf->endpoint,
6554 &ssl->session_negotiate->verify_result ) != 0 )
6555 {
6556 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) );
6557 if( ret == 0 )
6558 ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
6559 }
6560
6561 /* mbedtls_x509_crt_verify_with_profile is supposed to report a
6562 * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
6563 * with details encoded in the verification flags. All other kinds
6564 * of error codes, including those from the user provided f_vrfy
6565 * functions, are treated as fatal and lead to a failure of
6566 * ssl_parse_certificate even if verification was optional. */
6567 if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
6568 ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
6569 ret == MBEDTLS_ERR_SSL_BAD_CERTIFICATE ) )
6570 {
6571 ret = 0;
6572 }
6573
6574 if( have_ca_chain == 0 && authmode == MBEDTLS_SSL_VERIFY_REQUIRED )
6575 {
6576 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
6577 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
6578 }
6579
6580 if( ret != 0 )
6581 {
6582 uint8_t alert;
6583
6584 /* The certificate may have been rejected for several reasons.
6585 Pick one and send the corresponding alert. Which alert to send
6586 may be a subject of debate in some cases. */
6587 if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER )
6588 alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED;
6589 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH )
6590 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
6591 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE )
6592 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6593 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE )
6594 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6595 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE )
6596 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6597 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK )
6598 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6599 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY )
6600 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6601 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED )
6602 alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED;
6603 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED )
6604 alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED;
6605 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED )
6606 alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA;
6607 else
6608 alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN;
6609 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6610 alert );
6611 }
6612
6613#if defined(MBEDTLS_DEBUG_C)
6614 if( ssl->session_negotiate->verify_result != 0 )
6615 {
6616 MBEDTLS_SSL_DEBUG_MSG( 3, ( "! Certificate verification flags %08x",
6617 (unsigned int) ssl->session_negotiate->verify_result ) );
6618 }
6619 else
6620 {
6621 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate verification flags clear" ) );
6622 }
6623#endif /* MBEDTLS_DEBUG_C */
6624
6625 return( ret );
6626}
6627
6628#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02006629MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yud9526692022-02-17 14:23:47 +08006630static int ssl_remember_peer_crt_digest( mbedtls_ssl_context *ssl,
6631 unsigned char *start, size_t len )
6632{
6633 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6634 /* Remember digest of the peer's end-CRT. */
6635 ssl->session_negotiate->peer_cert_digest =
6636 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
6637 if( ssl->session_negotiate->peer_cert_digest == NULL )
6638 {
6639 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
6640 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN ) );
6641 mbedtls_ssl_send_alert_message( ssl,
6642 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6643 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
6644
6645 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
6646 }
6647
6648 ret = mbedtls_md( mbedtls_md_info_from_type(
6649 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
6650 start, len,
6651 ssl->session_negotiate->peer_cert_digest );
6652
6653 ssl->session_negotiate->peer_cert_digest_type =
6654 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
6655 ssl->session_negotiate->peer_cert_digest_len =
6656 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
6657
6658 return( ret );
6659}
6660
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02006661MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yud9526692022-02-17 14:23:47 +08006662static int ssl_remember_peer_pubkey( mbedtls_ssl_context *ssl,
6663 unsigned char *start, size_t len )
6664{
6665 unsigned char *end = start + len;
6666 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6667
6668 /* Make a copy of the peer's raw public key. */
6669 mbedtls_pk_init( &ssl->handshake->peer_pubkey );
6670 ret = mbedtls_pk_parse_subpubkey( &start, end,
6671 &ssl->handshake->peer_pubkey );
6672 if( ret != 0 )
6673 {
6674 /* We should have parsed the public key before. */
6675 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
6676 }
6677
6678 return( 0 );
6679}
6680#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
6681
6682int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
6683{
6684 int ret = 0;
6685 int crt_expected;
6686#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
6687 const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET
6688 ? ssl->handshake->sni_authmode
6689 : ssl->conf->authmode;
6690#else
6691 const int authmode = ssl->conf->authmode;
6692#endif
6693 void *rs_ctx = NULL;
6694 mbedtls_x509_crt *chain = NULL;
6695
6696 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
6697
6698 crt_expected = ssl_parse_certificate_coordinate( ssl, authmode );
6699 if( crt_expected == SSL_CERTIFICATE_SKIP )
6700 {
6701 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
6702 goto exit;
6703 }
6704
6705#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
6706 if( ssl->handshake->ecrs_enabled &&
6707 ssl->handshake->ecrs_state == ssl_ecrs_crt_verify )
6708 {
6709 chain = ssl->handshake->ecrs_peer_cert;
6710 ssl->handshake->ecrs_peer_cert = NULL;
6711 goto crt_verify;
6712 }
6713#endif
6714
6715 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
6716 {
6717 /* mbedtls_ssl_read_record may have sent an alert already. We
6718 let it decide whether to alert. */
6719 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
6720 goto exit;
6721 }
6722
6723#if defined(MBEDTLS_SSL_SRV_C)
6724 if( ssl_srv_check_client_no_crt_notification( ssl ) == 0 )
6725 {
6726 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
6727
6728 if( authmode != MBEDTLS_SSL_VERIFY_OPTIONAL )
6729 ret = MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
6730
6731 goto exit;
6732 }
6733#endif /* MBEDTLS_SSL_SRV_C */
6734
6735 /* Clear existing peer CRT structure in case we tried to
6736 * reuse a session but it failed, and allocate a new one. */
6737 ssl_clear_peer_cert( ssl->session_negotiate );
6738
6739 chain = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
6740 if( chain == NULL )
6741 {
6742 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed",
6743 sizeof( mbedtls_x509_crt ) ) );
6744 mbedtls_ssl_send_alert_message( ssl,
6745 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6746 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
6747
6748 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
6749 goto exit;
6750 }
6751 mbedtls_x509_crt_init( chain );
6752
6753 ret = ssl_parse_certificate_chain( ssl, chain );
6754 if( ret != 0 )
6755 goto exit;
6756
6757#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
6758 if( ssl->handshake->ecrs_enabled)
6759 ssl->handshake->ecrs_state = ssl_ecrs_crt_verify;
6760
6761crt_verify:
6762 if( ssl->handshake->ecrs_enabled)
6763 rs_ctx = &ssl->handshake->ecrs_ctx;
6764#endif
6765
6766 ret = ssl_parse_certificate_verify( ssl, authmode,
6767 chain, rs_ctx );
6768 if( ret != 0 )
6769 goto exit;
6770
6771#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
6772 {
6773 unsigned char *crt_start, *pk_start;
6774 size_t crt_len, pk_len;
6775
6776 /* We parse the CRT chain without copying, so
6777 * these pointers point into the input buffer,
6778 * and are hence still valid after freeing the
6779 * CRT chain. */
6780
6781 crt_start = chain->raw.p;
6782 crt_len = chain->raw.len;
6783
6784 pk_start = chain->pk_raw.p;
6785 pk_len = chain->pk_raw.len;
6786
6787 /* Free the CRT structures before computing
6788 * digest and copying the peer's public key. */
6789 mbedtls_x509_crt_free( chain );
6790 mbedtls_free( chain );
6791 chain = NULL;
6792
6793 ret = ssl_remember_peer_crt_digest( ssl, crt_start, crt_len );
6794 if( ret != 0 )
6795 goto exit;
6796
6797 ret = ssl_remember_peer_pubkey( ssl, pk_start, pk_len );
6798 if( ret != 0 )
6799 goto exit;
6800 }
6801#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
6802 /* Pass ownership to session structure. */
6803 ssl->session_negotiate->peer_cert = chain;
6804 chain = NULL;
6805#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
6806
6807 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
6808
6809exit:
6810
6811 if( ret == 0 )
6812 ssl->state++;
6813
6814#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
6815 if( ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS )
6816 {
6817 ssl->handshake->ecrs_peer_cert = chain;
6818 chain = NULL;
6819 }
6820#endif
6821
6822 if( chain != NULL )
6823 {
6824 mbedtls_x509_crt_free( chain );
6825 mbedtls_free( chain );
6826 }
6827
6828 return( ret );
6829}
6830#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
6831
Jerry Yu615bd6f2022-02-17 14:25:15 +08006832#if defined(MBEDTLS_SHA256_C)
6833static void ssl_calc_finished_tls_sha256(
6834 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
6835{
6836 int len = 12;
6837 const char *sender;
6838 unsigned char padbuf[32];
6839#if defined(MBEDTLS_USE_PSA_CRYPTO)
6840 size_t hash_size;
6841 psa_hash_operation_t sha256_psa = PSA_HASH_OPERATION_INIT;
6842 psa_status_t status;
6843#else
6844 mbedtls_sha256_context sha256;
6845#endif
6846
6847 mbedtls_ssl_session *session = ssl->session_negotiate;
6848 if( !session )
6849 session = ssl->session;
6850
6851 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
6852 ? "client finished"
6853 : "server finished";
6854
6855#if defined(MBEDTLS_USE_PSA_CRYPTO)
6856 sha256_psa = psa_hash_operation_init();
6857
6858 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc PSA finished tls sha256" ) );
6859
6860 status = psa_hash_clone( &ssl->handshake->fin_sha256_psa, &sha256_psa );
6861 if( status != PSA_SUCCESS )
6862 {
6863 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
6864 return;
6865 }
6866
6867 status = psa_hash_finish( &sha256_psa, padbuf, sizeof( padbuf ), &hash_size );
6868 if( status != PSA_SUCCESS )
6869 {
6870 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
6871 return;
6872 }
6873 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated padbuf", padbuf, 32 );
6874#else
6875
6876 mbedtls_sha256_init( &sha256 );
6877
6878 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
6879
6880 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
6881
6882 /*
6883 * TLSv1.2:
6884 * hash = PRF( master, finished_label,
6885 * Hash( handshake ) )[0.11]
6886 */
6887
6888#if !defined(MBEDTLS_SHA256_ALT)
6889 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
6890 sha256.state, sizeof( sha256.state ) );
6891#endif
6892
6893 mbedtls_sha256_finish( &sha256, padbuf );
6894 mbedtls_sha256_free( &sha256 );
6895#endif /* MBEDTLS_USE_PSA_CRYPTO */
6896
6897 ssl->handshake->tls_prf( session->master, 48, sender,
6898 padbuf, 32, buf, len );
6899
6900 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
6901
6902 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
6903
6904 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
6905}
6906#endif /* MBEDTLS_SHA256_C */
6907
Jerry Yub7ba49e2022-02-17 14:25:53 +08006908
6909#if defined(MBEDTLS_SHA384_C)
6910
6911static void ssl_calc_finished_tls_sha384(
6912 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
6913{
6914 int len = 12;
6915 const char *sender;
6916 unsigned char padbuf[48];
6917#if defined(MBEDTLS_USE_PSA_CRYPTO)
6918 size_t hash_size;
6919 psa_hash_operation_t sha384_psa = PSA_HASH_OPERATION_INIT;
6920 psa_status_t status;
6921#else
6922 mbedtls_sha512_context sha512;
6923#endif
6924
6925 mbedtls_ssl_session *session = ssl->session_negotiate;
6926 if( !session )
6927 session = ssl->session;
6928
6929 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
6930 ? "client finished"
6931 : "server finished";
6932
6933#if defined(MBEDTLS_USE_PSA_CRYPTO)
6934 sha384_psa = psa_hash_operation_init();
6935
6936 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc PSA finished tls sha384" ) );
6937
6938 status = psa_hash_clone( &ssl->handshake->fin_sha384_psa, &sha384_psa );
6939 if( status != PSA_SUCCESS )
6940 {
6941 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
6942 return;
6943 }
6944
6945 status = psa_hash_finish( &sha384_psa, padbuf, sizeof( padbuf ), &hash_size );
6946 if( status != PSA_SUCCESS )
6947 {
6948 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
6949 return;
6950 }
6951 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated padbuf", padbuf, 48 );
6952#else
6953 mbedtls_sha512_init( &sha512 );
6954
6955 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
6956
6957 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
6958
6959 /*
6960 * TLSv1.2:
6961 * hash = PRF( master, finished_label,
6962 * Hash( handshake ) )[0.11]
6963 */
6964
6965#if !defined(MBEDTLS_SHA512_ALT)
6966 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
6967 sha512.state, sizeof( sha512.state ) );
6968#endif
6969 mbedtls_sha512_finish( &sha512, padbuf );
6970
6971 mbedtls_sha512_free( &sha512 );
6972#endif
6973
6974 ssl->handshake->tls_prf( session->master, 48, sender,
6975 padbuf, 48, buf, len );
6976
6977 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
6978
6979 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
6980
6981 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
6982}
6983#endif /* MBEDTLS_SHA384_C */
6984
Jerry Yuaef00152022-02-17 14:27:31 +08006985void mbedtls_ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl )
6986{
6987 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup: final free" ) );
6988
6989 /*
6990 * Free our handshake params
6991 */
6992 mbedtls_ssl_handshake_free( ssl );
6993 mbedtls_free( ssl->handshake );
6994 ssl->handshake = NULL;
6995
6996 /*
Shaun Case8b0ecbc2021-12-20 21:14:10 -08006997 * Free the previous transform and switch in the current one
Jerry Yuaef00152022-02-17 14:27:31 +08006998 */
6999 if( ssl->transform )
7000 {
7001 mbedtls_ssl_transform_free( ssl->transform );
7002 mbedtls_free( ssl->transform );
7003 }
7004 ssl->transform = ssl->transform_negotiate;
7005 ssl->transform_negotiate = NULL;
7006
7007 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup: final free" ) );
7008}
7009
Jerry Yu2a9fff52022-02-17 14:28:51 +08007010void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl )
7011{
7012 int resume = ssl->handshake->resume;
7013
7014 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
7015
7016#if defined(MBEDTLS_SSL_RENEGOTIATION)
7017 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
7018 {
7019 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE;
7020 ssl->renego_records_seen = 0;
7021 }
7022#endif
7023
7024 /*
7025 * Free the previous session and switch in the current one
7026 */
7027 if( ssl->session )
7028 {
7029#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
7030 /* RFC 7366 3.1: keep the EtM state */
7031 ssl->session_negotiate->encrypt_then_mac =
7032 ssl->session->encrypt_then_mac;
7033#endif
7034
7035 mbedtls_ssl_session_free( ssl->session );
7036 mbedtls_free( ssl->session );
7037 }
7038 ssl->session = ssl->session_negotiate;
7039 ssl->session_negotiate = NULL;
7040
7041 /*
7042 * Add cache entry
7043 */
7044 if( ssl->conf->f_set_cache != NULL &&
7045 ssl->session->id_len != 0 &&
7046 resume == 0 )
7047 {
7048 if( ssl->conf->f_set_cache( ssl->conf->p_cache,
7049 ssl->session->id,
7050 ssl->session->id_len,
7051 ssl->session ) != 0 )
7052 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
7053 }
7054
7055#if defined(MBEDTLS_SSL_PROTO_DTLS)
7056 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
7057 ssl->handshake->flight != NULL )
7058 {
7059 /* Cancel handshake timer */
7060 mbedtls_ssl_set_timer( ssl, 0 );
7061
7062 /* Keep last flight around in case we need to resend it:
7063 * we need the handshake and transform structures for that */
7064 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip freeing handshake and transform" ) );
7065 }
7066 else
7067#endif
7068 mbedtls_ssl_handshake_wrapup_free_hs_transform( ssl );
7069
7070 ssl->state++;
7071
7072 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
7073}
7074
Jerry Yu3c8e47b2022-02-17 14:30:01 +08007075int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl )
7076{
7077 int ret, hash_len;
7078
7079 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
7080
7081 mbedtls_ssl_update_out_pointers( ssl, ssl->transform_negotiate );
7082
7083 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint );
7084
7085 /*
7086 * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites
7087 * may define some other value. Currently (early 2016), no defined
7088 * ciphersuite does this (and this is unlikely to change as activity has
7089 * moved to TLS 1.3 now) so we can keep the hardcoded 12 here.
7090 */
7091 hash_len = 12;
7092
7093#if defined(MBEDTLS_SSL_RENEGOTIATION)
7094 ssl->verify_data_len = hash_len;
7095 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
7096#endif
7097
7098 ssl->out_msglen = 4 + hash_len;
7099 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
7100 ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED;
7101
7102 /*
7103 * In case of session resuming, invert the client and server
7104 * ChangeCipherSpec messages order.
7105 */
7106 if( ssl->handshake->resume != 0 )
7107 {
7108#if defined(MBEDTLS_SSL_CLI_C)
7109 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
7110 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
7111#endif
7112#if defined(MBEDTLS_SSL_SRV_C)
7113 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
7114 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
7115#endif
7116 }
7117 else
7118 ssl->state++;
7119
7120 /*
7121 * Switch to our negotiated transform and session parameters for outbound
7122 * data.
7123 */
7124 MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
7125
7126#if defined(MBEDTLS_SSL_PROTO_DTLS)
7127 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
7128 {
7129 unsigned char i;
7130
7131 /* Remember current epoch settings for resending */
7132 ssl->handshake->alt_transform_out = ssl->transform_out;
7133 memcpy( ssl->handshake->alt_out_ctr, ssl->cur_out_ctr,
7134 sizeof( ssl->handshake->alt_out_ctr ) );
7135
7136 /* Set sequence_number to zero */
7137 memset( &ssl->cur_out_ctr[2], 0, sizeof( ssl->cur_out_ctr ) - 2 );
7138
7139
7140 /* Increment epoch */
7141 for( i = 2; i > 0; i-- )
7142 if( ++ssl->cur_out_ctr[i - 1] != 0 )
7143 break;
7144
7145 /* The loop goes to its end iff the counter is wrapping */
7146 if( i == 0 )
7147 {
7148 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) );
7149 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
7150 }
7151 }
7152 else
7153#endif /* MBEDTLS_SSL_PROTO_DTLS */
7154 memset( ssl->cur_out_ctr, 0, sizeof( ssl->cur_out_ctr ) );
7155
7156 ssl->transform_out = ssl->transform_negotiate;
7157 ssl->session_out = ssl->session_negotiate;
7158
7159#if defined(MBEDTLS_SSL_PROTO_DTLS)
7160 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
7161 mbedtls_ssl_send_flight_completed( ssl );
7162#endif
7163
7164 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
7165 {
7166 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
7167 return( ret );
7168 }
7169
7170#if defined(MBEDTLS_SSL_PROTO_DTLS)
7171 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
7172 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
7173 {
7174 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
7175 return( ret );
7176 }
7177#endif
7178
7179 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
7180
7181 return( 0 );
7182}
7183
Jerry Yu0b3d7c12022-02-17 14:30:51 +08007184#define SSL_MAX_HASH_LEN 12
7185
7186int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl )
7187{
7188 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7189 unsigned int hash_len = 12;
7190 unsigned char buf[SSL_MAX_HASH_LEN];
7191
7192 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
7193
7194 ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 );
7195
7196 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
7197 {
7198 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
7199 goto exit;
7200 }
7201
7202 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
7203 {
7204 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
7205 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7206 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
7207 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
7208 goto exit;
7209 }
7210
7211 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED )
7212 {
7213 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7214 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
7215 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
7216 goto exit;
7217 }
7218
7219 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len )
7220 {
7221 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
7222 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7223 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
7224 ret = MBEDTLS_ERR_SSL_DECODE_ERROR;
7225 goto exit;
7226 }
7227
7228 if( mbedtls_ct_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ),
7229 buf, hash_len ) != 0 )
7230 {
7231 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
7232 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7233 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );
7234 ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
7235 goto exit;
7236 }
7237
7238#if defined(MBEDTLS_SSL_RENEGOTIATION)
7239 ssl->verify_data_len = hash_len;
7240 memcpy( ssl->peer_verify_data, buf, hash_len );
7241#endif
7242
7243 if( ssl->handshake->resume != 0 )
7244 {
7245#if defined(MBEDTLS_SSL_CLI_C)
7246 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
7247 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
7248#endif
7249#if defined(MBEDTLS_SSL_SRV_C)
7250 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
7251 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
7252#endif
7253 }
7254 else
7255 ssl->state++;
7256
7257#if defined(MBEDTLS_SSL_PROTO_DTLS)
7258 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
7259 mbedtls_ssl_recv_flight_completed( ssl );
7260#endif
7261
7262 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
7263
7264exit:
7265 mbedtls_platform_zeroize( buf, hash_len );
7266 return( ret );
7267}
7268
Jerry Yu392112c2022-02-17 14:34:10 +08007269#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
7270/*
7271 * Helper to get TLS 1.2 PRF from ciphersuite
7272 * (Duplicates bits of logic from ssl_set_handshake_prfs().)
7273 */
7274static tls_prf_fn ssl_tls12prf_from_cs( int ciphersuite_id )
7275{
7276#if defined(MBEDTLS_SHA384_C)
7277 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
7278 mbedtls_ssl_ciphersuite_from_id( ciphersuite_id );
7279
7280 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
7281 return( tls_prf_sha384 );
7282#else
7283 (void) ciphersuite_id;
7284#endif
7285 return( tls_prf_sha256 );
7286}
7287#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Jerry Yue93ffcd2022-02-17 14:37:06 +08007288
7289static mbedtls_tls_prf_types tls_prf_get_type( mbedtls_ssl_tls_prf_cb *tls_prf )
7290{
7291 ((void) tls_prf);
7292#if defined(MBEDTLS_SHA384_C)
7293 if( tls_prf == tls_prf_sha384 )
7294 {
7295 return( MBEDTLS_SSL_TLS_PRF_SHA384 );
7296 }
7297 else
7298#endif
7299#if defined(MBEDTLS_SHA256_C)
7300 if( tls_prf == tls_prf_sha256 )
7301 {
7302 return( MBEDTLS_SSL_TLS_PRF_SHA256 );
7303 }
7304 else
7305#endif
7306 return( MBEDTLS_SSL_TLS_PRF_NONE );
7307}
7308
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007309/*
7310 * Populate a transform structure with session keys and all the other
7311 * necessary information.
7312 *
7313 * Parameters:
7314 * - [in/out]: transform: structure to populate
7315 * [in] must be just initialised with mbedtls_ssl_transform_init()
7316 * [out] fully populated, ready for use by mbedtls_ssl_{en,de}crypt_buf()
7317 * - [in] ciphersuite
7318 * - [in] master
7319 * - [in] encrypt_then_mac
7320 * - [in] compression
7321 * - [in] tls_prf: pointer to PRF to use for key derivation
7322 * - [in] randbytes: buffer holding ServerHello.random + ClientHello.random
Glenn Strauss07c64162022-03-14 12:34:51 -04007323 * - [in] tls_version: TLS version
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007324 * - [in] endpoint: client or server
7325 * - [in] ssl: used for:
7326 * - ssl->conf->{f,p}_export_keys
7327 * [in] optionally used for:
7328 * - MBEDTLS_DEBUG_C: ssl->conf->{f,p}_dbg
7329 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02007330MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007331static int ssl_tls12_populate_transform( mbedtls_ssl_transform *transform,
7332 int ciphersuite,
7333 const unsigned char master[48],
Neil Armstrongf2c82f02022-04-05 11:16:53 +02007334#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007335 int encrypt_then_mac,
Neil Armstrongf2c82f02022-04-05 11:16:53 +02007336#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007337 ssl_tls_prf_t tls_prf,
7338 const unsigned char randbytes[64],
Glenn Strauss07c64162022-03-14 12:34:51 -04007339 mbedtls_ssl_protocol_version tls_version,
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007340 unsigned endpoint,
7341 const mbedtls_ssl_context *ssl )
7342{
7343 int ret = 0;
7344 unsigned char keyblk[256];
7345 unsigned char *key1;
7346 unsigned char *key2;
7347 unsigned char *mac_enc;
7348 unsigned char *mac_dec;
7349 size_t mac_key_len = 0;
7350 size_t iv_copy_len;
7351 size_t keylen;
7352 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Neil Armstrong7fea33e2022-04-01 15:40:25 +02007353 mbedtls_ssl_mode_t ssl_mode;
Neil Armstronge4512952022-03-08 09:08:22 +01007354#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007355 const mbedtls_cipher_info_t *cipher_info;
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007356 const mbedtls_md_info_t *md_info;
Neil Armstronge4512952022-03-08 09:08:22 +01007357#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007358
7359#if defined(MBEDTLS_USE_PSA_CRYPTO)
7360 psa_key_type_t key_type;
7361 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
7362 psa_algorithm_t alg;
Neil Armstronge4512952022-03-08 09:08:22 +01007363 psa_algorithm_t mac_alg = 0;
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007364 size_t key_bits;
7365 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
7366#endif
7367
7368#if !defined(MBEDTLS_DEBUG_C) && \
7369 !defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
7370 if( ssl->f_export_keys == NULL )
7371 {
7372 ssl = NULL; /* make sure we don't use it except for these cases */
7373 (void) ssl;
7374 }
7375#endif
7376
7377 /*
7378 * Some data just needs copying into the structure
7379 */
Neil Armstrongf2c82f02022-04-05 11:16:53 +02007380#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007381 transform->encrypt_then_mac = encrypt_then_mac;
Neil Armstrongf2c82f02022-04-05 11:16:53 +02007382#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Glenn Strauss07c64162022-03-14 12:34:51 -04007383 transform->tls_version = tls_version;
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007384
7385#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
7386 memcpy( transform->randbytes, randbytes, sizeof( transform->randbytes ) );
7387#endif
7388
7389#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Glenn Strauss07c64162022-03-14 12:34:51 -04007390 if( tls_version == MBEDTLS_SSL_VERSION_TLS1_3 )
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007391 {
7392 /* At the moment, we keep TLS <= 1.2 and TLS 1.3 transform
7393 * generation separate. This should never happen. */
7394 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
7395 }
7396#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
7397
7398 /*
7399 * Get various info structures
7400 */
7401 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuite );
7402 if( ciphersuite_info == NULL )
7403 {
7404 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %d not found",
7405 ciphersuite ) );
7406 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
7407 }
7408
Neil Armstrongab555e02022-04-04 11:07:59 +02007409 ssl_mode = mbedtls_ssl_get_mode_from_ciphersuite(
Neil Armstrongf2c82f02022-04-05 11:16:53 +02007410#if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
Neil Armstrong7fea33e2022-04-01 15:40:25 +02007411 encrypt_then_mac,
Neil Armstrongf2c82f02022-04-05 11:16:53 +02007412#endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
Neil Armstrong7fea33e2022-04-01 15:40:25 +02007413 ciphersuite_info );
7414
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007415 if( ssl_mode == MBEDTLS_SSL_MODE_AEAD )
7416 transform->taglen =
7417 ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;
7418
7419#if defined(MBEDTLS_USE_PSA_CRYPTO)
7420 if( ( status = mbedtls_ssl_cipher_to_psa( ciphersuite_info->cipher,
7421 transform->taglen,
7422 &alg,
7423 &key_type,
7424 &key_bits ) ) != PSA_SUCCESS )
7425 {
7426 ret = psa_ssl_status_to_mbedtls( status );
7427 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_cipher_to_psa", ret );
7428 goto end;
7429 }
7430#else
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007431 cipher_info = mbedtls_cipher_info_from_type( ciphersuite_info->cipher );
7432 if( cipher_info == NULL )
7433 {
7434 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %u not found",
7435 ciphersuite_info->cipher ) );
7436 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
7437 }
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007438#endif /* MBEDTLS_USE_PSA_CRYPTO */
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007439
Neil Armstronge4512952022-03-08 09:08:22 +01007440#if defined(MBEDTLS_USE_PSA_CRYPTO)
7441 mac_alg = mbedtls_psa_translate_md( ciphersuite_info->mac );
7442 if( mac_alg == 0 )
7443 {
7444 MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_psa_translate_md for %u not found",
7445 (unsigned) ciphersuite_info->mac ) );
7446 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
7447 }
7448#else
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007449 md_info = mbedtls_md_info_from_type( ciphersuite_info->mac );
7450 if( md_info == NULL )
7451 {
7452 MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_md info for %u not found",
7453 (unsigned) ciphersuite_info->mac ) );
7454 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
7455 }
Neil Armstronge4512952022-03-08 09:08:22 +01007456#endif /* MBEDTLS_USE_PSA_CRYPTO */
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007457
7458#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
7459 /* Copy own and peer's CID if the use of the CID
7460 * extension has been negotiated. */
7461 if( ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_ENABLED )
7462 {
7463 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Copy CIDs into SSL transform" ) );
7464
7465 transform->in_cid_len = ssl->own_cid_len;
7466 memcpy( transform->in_cid, ssl->own_cid, ssl->own_cid_len );
7467 MBEDTLS_SSL_DEBUG_BUF( 3, "Incoming CID", transform->in_cid,
7468 transform->in_cid_len );
7469
7470 transform->out_cid_len = ssl->handshake->peer_cid_len;
7471 memcpy( transform->out_cid, ssl->handshake->peer_cid,
7472 ssl->handshake->peer_cid_len );
7473 MBEDTLS_SSL_DEBUG_BUF( 3, "Outgoing CID", transform->out_cid,
7474 transform->out_cid_len );
7475 }
7476#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
7477
7478 /*
7479 * Compute key block using the PRF
7480 */
7481 ret = tls_prf( master, 48, "key expansion", randbytes, 64, keyblk, 256 );
7482 if( ret != 0 )
7483 {
7484 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
7485 return( ret );
7486 }
7487
7488 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
7489 mbedtls_ssl_get_ciphersuite_name( ciphersuite ) ) );
7490 MBEDTLS_SSL_DEBUG_BUF( 3, "master secret", master, 48 );
7491 MBEDTLS_SSL_DEBUG_BUF( 4, "random bytes", randbytes, 64 );
7492 MBEDTLS_SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
7493
7494 /*
7495 * Determine the appropriate key, IV and MAC length.
7496 */
7497
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007498#if defined(MBEDTLS_USE_PSA_CRYPTO)
7499 keylen = PSA_BITS_TO_BYTES(key_bits);
7500#else
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007501 keylen = mbedtls_cipher_info_get_key_bitlen( cipher_info ) / 8;
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007502#endif
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007503
7504#if defined(MBEDTLS_GCM_C) || \
7505 defined(MBEDTLS_CCM_C) || \
7506 defined(MBEDTLS_CHACHAPOLY_C)
Neil Armstrong7fea33e2022-04-01 15:40:25 +02007507 if( ssl_mode == MBEDTLS_SSL_MODE_AEAD )
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007508 {
7509 size_t explicit_ivlen;
7510
7511 transform->maclen = 0;
7512 mac_key_len = 0;
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007513
7514 /* All modes haves 96-bit IVs, but the length of the static parts vary
7515 * with mode and version:
7516 * - For GCM and CCM in TLS 1.2, there's a static IV of 4 Bytes
7517 * (to be concatenated with a dynamically chosen IV of 8 Bytes)
7518 * - For ChaChaPoly in TLS 1.2, and all modes in TLS 1.3, there's
7519 * a static IV of 12 Bytes (to be XOR'ed with the 8 Byte record
7520 * sequence number).
7521 */
7522 transform->ivlen = 12;
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007523#if defined(MBEDTLS_USE_PSA_CRYPTO)
7524 if( key_type == PSA_KEY_TYPE_CHACHA20 )
7525#else
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007526 if( mbedtls_cipher_info_get_mode( cipher_info ) == MBEDTLS_MODE_CHACHAPOLY )
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007527#endif /* MBEDTLS_USE_PSA_CRYPTO */
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007528 transform->fixed_ivlen = 12;
7529 else
7530 transform->fixed_ivlen = 4;
7531
7532 /* Minimum length of encrypted record */
7533 explicit_ivlen = transform->ivlen - transform->fixed_ivlen;
7534 transform->minlen = explicit_ivlen + transform->taglen;
7535 }
7536 else
7537#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */
7538#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Neil Armstrong7fea33e2022-04-01 15:40:25 +02007539 if( ssl_mode == MBEDTLS_SSL_MODE_STREAM ||
7540 ssl_mode == MBEDTLS_SSL_MODE_CBC ||
7541 ssl_mode == MBEDTLS_SSL_MODE_CBC_ETM )
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007542 {
Neil Armstronge4512952022-03-08 09:08:22 +01007543#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrongd1be7672022-04-04 11:21:41 +02007544 size_t block_size = PSA_BLOCK_CIPHER_BLOCK_LENGTH( key_type );
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007545#else
7546 size_t block_size = cipher_info->block_size;
7547#endif /* MBEDTLS_USE_PSA_CRYPTO */
7548
7549#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstronge4512952022-03-08 09:08:22 +01007550 /* Get MAC length */
7551 mac_key_len = PSA_HASH_LENGTH(mac_alg);
7552#else
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007553 /* Initialize HMAC contexts */
7554 if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 ||
7555 ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 )
7556 {
7557 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
7558 goto end;
7559 }
7560
7561 /* Get MAC length */
7562 mac_key_len = mbedtls_md_get_size( md_info );
Neil Armstronge4512952022-03-08 09:08:22 +01007563#endif /* MBEDTLS_USE_PSA_CRYPTO */
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007564 transform->maclen = mac_key_len;
7565
7566 /* IV length */
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007567#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstrong2230e6c2022-04-27 10:36:14 +02007568 transform->ivlen = PSA_CIPHER_IV_LENGTH( key_type, alg );
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007569#else
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007570 transform->ivlen = cipher_info->iv_size;
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007571#endif /* MBEDTLS_USE_PSA_CRYPTO */
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007572
7573 /* Minimum length */
Neil Armstrong7fea33e2022-04-01 15:40:25 +02007574 if( ssl_mode == MBEDTLS_SSL_MODE_STREAM )
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007575 transform->minlen = transform->maclen;
7576 else
7577 {
7578 /*
7579 * GenericBlockCipher:
7580 * 1. if EtM is in use: one block plus MAC
7581 * otherwise: * first multiple of blocklen greater than maclen
7582 * 2. IV
7583 */
7584#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Neil Armstrong7fea33e2022-04-01 15:40:25 +02007585 if( ssl_mode == MBEDTLS_SSL_MODE_CBC_ETM )
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007586 {
7587 transform->minlen = transform->maclen
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007588 + block_size;
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007589 }
7590 else
7591#endif
7592 {
7593 transform->minlen = transform->maclen
Neil Armstronga0eeb7f2022-04-01 17:36:10 +02007594 + block_size
7595 - transform->maclen % block_size;
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007596 }
7597
Glenn Strauss07c64162022-03-14 12:34:51 -04007598 if( tls_version == MBEDTLS_SSL_VERSION_TLS1_2 )
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007599 {
7600 transform->minlen += transform->ivlen;
7601 }
7602 else
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007603 {
7604 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
7605 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
7606 goto end;
7607 }
7608 }
7609 }
7610 else
7611#endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
7612 {
7613 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
7614 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
7615 }
7616
7617 MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %u, minlen: %u, ivlen: %u, maclen: %u",
7618 (unsigned) keylen,
7619 (unsigned) transform->minlen,
7620 (unsigned) transform->ivlen,
7621 (unsigned) transform->maclen ) );
7622
7623 /*
7624 * Finally setup the cipher contexts, IVs and MAC secrets.
7625 */
7626#if defined(MBEDTLS_SSL_CLI_C)
7627 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
7628 {
7629 key1 = keyblk + mac_key_len * 2;
7630 key2 = keyblk + mac_key_len * 2 + keylen;
7631
7632 mac_enc = keyblk;
7633 mac_dec = keyblk + mac_key_len;
7634
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007635 iv_copy_len = ( transform->fixed_ivlen ) ?
7636 transform->fixed_ivlen : transform->ivlen;
7637 memcpy( transform->iv_enc, key2 + keylen, iv_copy_len );
7638 memcpy( transform->iv_dec, key2 + keylen + iv_copy_len,
7639 iv_copy_len );
7640 }
7641 else
7642#endif /* MBEDTLS_SSL_CLI_C */
7643#if defined(MBEDTLS_SSL_SRV_C)
7644 if( endpoint == MBEDTLS_SSL_IS_SERVER )
7645 {
7646 key1 = keyblk + mac_key_len * 2 + keylen;
7647 key2 = keyblk + mac_key_len * 2;
7648
7649 mac_enc = keyblk + mac_key_len;
7650 mac_dec = keyblk;
7651
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007652 iv_copy_len = ( transform->fixed_ivlen ) ?
7653 transform->fixed_ivlen : transform->ivlen;
7654 memcpy( transform->iv_dec, key1 + keylen, iv_copy_len );
7655 memcpy( transform->iv_enc, key1 + keylen + iv_copy_len,
7656 iv_copy_len );
7657 }
7658 else
7659#endif /* MBEDTLS_SSL_SRV_C */
7660 {
7661 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
7662 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
7663 goto end;
7664 }
7665
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007666 if( ssl != NULL && ssl->f_export_keys != NULL )
7667 {
7668 ssl->f_export_keys( ssl->p_export_keys,
7669 MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET,
7670 master, 48,
7671 randbytes + 32,
7672 randbytes,
7673 tls_prf_get_type( tls_prf ) );
7674 }
7675
7676#if defined(MBEDTLS_USE_PSA_CRYPTO)
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007677 transform->psa_alg = alg;
7678
7679 if ( alg != MBEDTLS_SSL_NULL_CIPHER )
7680 {
7681 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
7682 psa_set_key_algorithm( &attributes, alg );
7683 psa_set_key_type( &attributes, key_type );
7684
7685 if( ( status = psa_import_key( &attributes,
7686 key1,
7687 PSA_BITS_TO_BYTES( key_bits ),
7688 &transform->psa_key_enc ) ) != PSA_SUCCESS )
7689 {
7690 MBEDTLS_SSL_DEBUG_RET( 3, "psa_import_key", (int)status );
7691 ret = psa_ssl_status_to_mbedtls( status );
7692 MBEDTLS_SSL_DEBUG_RET( 1, "psa_import_key", ret );
7693 goto end;
7694 }
7695
7696 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
7697
7698 if( ( status = psa_import_key( &attributes,
7699 key2,
7700 PSA_BITS_TO_BYTES( key_bits ),
7701 &transform->psa_key_dec ) ) != PSA_SUCCESS )
7702 {
7703 ret = psa_ssl_status_to_mbedtls( status );
7704 MBEDTLS_SSL_DEBUG_RET( 1, "psa_import_key", ret );
7705 goto end;
7706 }
7707 }
7708#else
7709 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,
7710 cipher_info ) ) != 0 )
7711 {
7712 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
7713 goto end;
7714 }
7715
7716 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec,
7717 cipher_info ) ) != 0 )
7718 {
7719 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
7720 goto end;
7721 }
7722
7723 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1,
7724 (int) mbedtls_cipher_info_get_key_bitlen( cipher_info ),
7725 MBEDTLS_ENCRYPT ) ) != 0 )
7726 {
7727 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
7728 goto end;
7729 }
7730
7731 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2,
7732 (int) mbedtls_cipher_info_get_key_bitlen( cipher_info ),
7733 MBEDTLS_DECRYPT ) ) != 0 )
7734 {
7735 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
7736 goto end;
7737 }
7738
7739#if defined(MBEDTLS_CIPHER_MODE_CBC)
7740 if( mbedtls_cipher_info_get_mode( cipher_info ) == MBEDTLS_MODE_CBC )
7741 {
7742 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc,
7743 MBEDTLS_PADDING_NONE ) ) != 0 )
7744 {
7745 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
7746 goto end;
7747 }
7748
7749 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec,
7750 MBEDTLS_PADDING_NONE ) ) != 0 )
7751 {
7752 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
7753 goto end;
7754 }
7755 }
7756#endif /* MBEDTLS_CIPHER_MODE_CBC */
7757#endif /* MBEDTLS_USE_PSA_CRYPTO */
7758
Neil Armstrong29c0c042022-03-17 17:47:28 +01007759#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
7760 /* For HMAC-based ciphersuites, initialize the HMAC transforms.
7761 For AEAD-based ciphersuites, there is nothing to do here. */
7762 if( mac_key_len != 0 )
7763 {
7764#if defined(MBEDTLS_USE_PSA_CRYPTO)
Neil Armstronge4512952022-03-08 09:08:22 +01007765 transform->psa_mac_alg = PSA_ALG_HMAC( mac_alg );
Neil Armstrong29c0c042022-03-17 17:47:28 +01007766
7767 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_SIGN_MESSAGE );
Neil Armstronge4512952022-03-08 09:08:22 +01007768 psa_set_key_algorithm( &attributes, PSA_ALG_HMAC( mac_alg ) );
Neil Armstrong29c0c042022-03-17 17:47:28 +01007769 psa_set_key_type( &attributes, PSA_KEY_TYPE_HMAC );
7770
7771 if( ( status = psa_import_key( &attributes,
7772 mac_enc, mac_key_len,
7773 &transform->psa_mac_enc ) ) != PSA_SUCCESS )
7774 {
7775 ret = psa_ssl_status_to_mbedtls( status );
7776 MBEDTLS_SSL_DEBUG_RET( 1, "psa_import_mac_key", ret );
7777 goto end;
7778 }
7779
Ronald Cronfb39f152022-03-25 14:36:28 +01007780 if( ( transform->psa_alg == MBEDTLS_SSL_NULL_CIPHER ) ||
7781 ( ( transform->psa_alg == PSA_ALG_CBC_NO_PADDING ) &&
7782 ( transform->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ) ) )
Neil Armstrong29c0c042022-03-17 17:47:28 +01007783 /* mbedtls_ct_hmac() requires the key to be exportable */
7784 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_EXPORT |
7785 PSA_KEY_USAGE_VERIFY_HASH );
7786 else
7787 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
7788
7789 if( ( status = psa_import_key( &attributes,
7790 mac_dec, mac_key_len,
7791 &transform->psa_mac_dec ) ) != PSA_SUCCESS )
7792 {
7793 ret = psa_ssl_status_to_mbedtls( status );
7794 MBEDTLS_SSL_DEBUG_RET( 1, "psa_import_mac_key", ret );
7795 goto end;
7796 }
7797#else
7798 ret = mbedtls_md_hmac_starts( &transform->md_ctx_enc, mac_enc, mac_key_len );
7799 if( ret != 0 )
7800 goto end;
7801 ret = mbedtls_md_hmac_starts( &transform->md_ctx_dec, mac_dec, mac_key_len );
7802 if( ret != 0 )
7803 goto end;
7804#endif /* MBEDTLS_USE_PSA_CRYPTO */
7805 }
7806#endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
7807
7808 ((void) mac_dec);
7809 ((void) mac_enc);
7810
Jerry Yu9bccc4c2022-02-17 14:38:28 +08007811end:
7812 mbedtls_platform_zeroize( keyblk, sizeof( keyblk ) );
7813 return( ret );
7814}
7815
Jerry Yuee40f9d2022-02-17 14:55:16 +08007816#if defined(MBEDTLS_USE_PSA_CRYPTO)
7817int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
7818 unsigned char *hash, size_t *hashlen,
7819 unsigned char *data, size_t data_len,
7820 mbedtls_md_type_t md_alg )
7821{
7822 psa_status_t status;
7823 psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT;
7824 psa_algorithm_t hash_alg = mbedtls_psa_translate_md( md_alg );
7825
7826 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Perform PSA-based computation of digest of ServerKeyExchange" ) );
7827
7828 if( ( status = psa_hash_setup( &hash_operation,
7829 hash_alg ) ) != PSA_SUCCESS )
7830 {
7831 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_setup", status );
7832 goto exit;
7833 }
7834
7835 if( ( status = psa_hash_update( &hash_operation, ssl->handshake->randbytes,
7836 64 ) ) != PSA_SUCCESS )
7837 {
7838 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_update", status );
7839 goto exit;
7840 }
7841
7842 if( ( status = psa_hash_update( &hash_operation,
7843 data, data_len ) ) != PSA_SUCCESS )
7844 {
7845 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_update", status );
7846 goto exit;
7847 }
7848
7849 if( ( status = psa_hash_finish( &hash_operation, hash, PSA_HASH_MAX_SIZE,
7850 hashlen ) ) != PSA_SUCCESS )
7851 {
7852 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_finish", status );
7853 goto exit;
7854 }
7855
7856exit:
7857 if( status != PSA_SUCCESS )
7858 {
7859 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7860 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7861 switch( status )
7862 {
7863 case PSA_ERROR_NOT_SUPPORTED:
7864 return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE );
7865 case PSA_ERROR_BAD_STATE: /* Intentional fallthrough */
7866 case PSA_ERROR_BUFFER_TOO_SMALL:
7867 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
7868 case PSA_ERROR_INSUFFICIENT_MEMORY:
7869 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
7870 default:
7871 return( MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED );
7872 }
7873 }
7874 return( 0 );
7875}
7876
7877#else
7878
7879int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
7880 unsigned char *hash, size_t *hashlen,
7881 unsigned char *data, size_t data_len,
7882 mbedtls_md_type_t md_alg )
7883{
7884 int ret = 0;
7885 mbedtls_md_context_t ctx;
7886 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );
7887 *hashlen = mbedtls_md_get_size( md_info );
7888
7889 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Perform mbedtls-based computation of digest of ServerKeyExchange" ) );
7890
7891 mbedtls_md_init( &ctx );
7892
7893 /*
7894 * digitally-signed struct {
7895 * opaque client_random[32];
7896 * opaque server_random[32];
7897 * ServerDHParams params;
7898 * };
7899 */
7900 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
7901 {
7902 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
7903 goto exit;
7904 }
7905 if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 )
7906 {
7907 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_starts", ret );
7908 goto exit;
7909 }
7910 if( ( ret = mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 ) ) != 0 )
7911 {
7912 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
7913 goto exit;
7914 }
7915 if( ( ret = mbedtls_md_update( &ctx, data, data_len ) ) != 0 )
7916 {
7917 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
7918 goto exit;
7919 }
7920 if( ( ret = mbedtls_md_finish( &ctx, hash ) ) != 0 )
7921 {
7922 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_finish", ret );
7923 goto exit;
7924 }
7925
7926exit:
7927 mbedtls_md_free( &ctx );
7928
7929 if( ret != 0 )
7930 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7931 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7932
7933 return( ret );
7934}
7935#endif /* MBEDTLS_USE_PSA_CRYPTO */
7936
Jerry Yud9d91da2022-02-17 14:57:06 +08007937#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
7938
Gabor Mezeia3d016c2022-05-10 12:44:09 +02007939/* Find the preferred hash for a given signature algorithm. */
7940unsigned int mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
7941 mbedtls_ssl_context *ssl,
7942 unsigned int sig_alg )
Jerry Yud9d91da2022-02-17 14:57:06 +08007943{
Gabor Mezei078e8032022-04-27 21:17:56 +02007944 unsigned int i;
Gabor Mezeia3d016c2022-05-10 12:44:09 +02007945 uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
Gabor Mezei078e8032022-04-27 21:17:56 +02007946
7947 if( sig_alg == MBEDTLS_SSL_SIG_ANON )
Gabor Mezeia3d016c2022-05-10 12:44:09 +02007948 return( MBEDTLS_SSL_HASH_NONE );
Gabor Mezei078e8032022-04-27 21:17:56 +02007949
Gabor Mezeia3d016c2022-05-10 12:44:09 +02007950 for( i = 0; received_sig_algs[i] != MBEDTLS_TLS_SIG_NONE; i++ )
Jerry Yud9d91da2022-02-17 14:57:06 +08007951 {
Neil Armstrong9f1176a2022-06-24 18:19:19 +02007952 unsigned int hash_alg_received =
7953 MBEDTLS_SSL_TLS12_HASH_ALG_FROM_SIG_AND_HASH_ALG(
7954 received_sig_algs[i] );
7955 unsigned int sig_alg_received =
7956 MBEDTLS_SSL_TLS12_SIG_ALG_FROM_SIG_AND_HASH_ALG(
7957 received_sig_algs[i] );
7958
7959 if( sig_alg == sig_alg_received )
7960 {
7961#if defined(MBEDTLS_USE_PSA_CRYPTO)
7962 if( ssl->handshake->key_cert && ssl->handshake->key_cert->key )
7963 {
Neil Armstrong96eceb82022-06-30 18:05:05 +02007964 psa_algorithm_t psa_hash_alg =
7965 mbedtls_psa_translate_md( hash_alg_received );
Neil Armstrong9f1176a2022-06-24 18:19:19 +02007966
Neil Armstrong96eceb82022-06-30 18:05:05 +02007967 if( sig_alg_received == MBEDTLS_SSL_SIG_ECDSA &&
7968 ! mbedtls_pk_can_do_ext( ssl->handshake->key_cert->key,
7969 PSA_ALG_ECDSA( psa_hash_alg ),
7970 PSA_KEY_USAGE_SIGN_HASH ) )
Neil Armstrong9f1176a2022-06-24 18:19:19 +02007971 continue;
7972
Neil Armstrong96eceb82022-06-30 18:05:05 +02007973 if( sig_alg_received == MBEDTLS_SSL_SIG_RSA &&
Neil Armstrong971f30d2022-07-01 16:23:50 +02007974 ! mbedtls_pk_can_do_ext( ssl->handshake->key_cert->key,
7975 PSA_ALG_RSA_PKCS1V15_SIGN(
7976 psa_hash_alg ),
7977 PSA_KEY_USAGE_SIGN_HASH ) )
Neil Armstrong9f1176a2022-06-24 18:19:19 +02007978 continue;
7979 }
Neil Armstrong9f1176a2022-06-24 18:19:19 +02007980#endif /* MBEDTLS_USE_PSA_CRYPTO */
Neil Armstrong96eceb82022-06-30 18:05:05 +02007981
Neil Armstrong9f1176a2022-06-24 18:19:19 +02007982 return( hash_alg_received );
7983 }
Jerry Yud9d91da2022-02-17 14:57:06 +08007984 }
Jerry Yud9d91da2022-02-17 14:57:06 +08007985
Gabor Mezeia3d016c2022-05-10 12:44:09 +02007986 return( MBEDTLS_SSL_HASH_NONE );
Jerry Yud9d91da2022-02-17 14:57:06 +08007987}
7988
7989#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
7990
Jerry Yu4f9e3ef2022-02-17 14:58:27 +08007991/* Serialization of TLS 1.2 sessions:
7992 *
7993 * struct {
7994 * uint64 start_time;
7995 * uint8 ciphersuite[2]; // defined by the standard
7996 * uint8 compression; // 0 or 1
7997 * uint8 session_id_len; // at most 32
7998 * opaque session_id[32];
7999 * opaque master[48]; // fixed length in the standard
8000 * uint32 verify_result;
8001 * opaque peer_cert<0..2^24-1>; // length 0 means no peer cert
8002 * opaque ticket<0..2^24-1>; // length 0 means no ticket
8003 * uint32 ticket_lifetime;
8004 * uint8 mfl_code; // up to 255 according to standard
8005 * uint8 encrypt_then_mac; // 0 or 1
8006 * } serialized_session_tls12;
8007 *
8008 */
Jerry Yu438ddd82022-07-07 06:55:50 +00008009static size_t ssl_tls12_session_save( const mbedtls_ssl_session *session,
Jerry Yu4f9e3ef2022-02-17 14:58:27 +08008010 unsigned char *buf,
8011 size_t buf_len )
8012{
8013 unsigned char *p = buf;
8014 size_t used = 0;
8015
8016#if defined(MBEDTLS_HAVE_TIME)
8017 uint64_t start;
8018#endif
8019#if defined(MBEDTLS_X509_CRT_PARSE_C)
8020#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
8021 size_t cert_len;
8022#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8023#endif /* MBEDTLS_X509_CRT_PARSE_C */
8024
8025 /*
8026 * Time
8027 */
8028#if defined(MBEDTLS_HAVE_TIME)
8029 used += 8;
8030
8031 if( used <= buf_len )
8032 {
8033 start = (uint64_t) session->start;
8034
8035 MBEDTLS_PUT_UINT64_BE( start, p, 0 );
8036 p += 8;
8037 }
8038#endif /* MBEDTLS_HAVE_TIME */
8039
8040 /*
8041 * Basic mandatory fields
8042 */
8043 used += 2 /* ciphersuite */
8044 + 1 /* compression */
8045 + 1 /* id_len */
8046 + sizeof( session->id )
8047 + sizeof( session->master )
8048 + 4; /* verify_result */
8049
8050 if( used <= buf_len )
8051 {
8052 MBEDTLS_PUT_UINT16_BE( session->ciphersuite, p, 0 );
8053 p += 2;
8054
8055 *p++ = MBEDTLS_BYTE_0( session->compression );
8056
8057 *p++ = MBEDTLS_BYTE_0( session->id_len );
8058 memcpy( p, session->id, 32 );
8059 p += 32;
8060
8061 memcpy( p, session->master, 48 );
8062 p += 48;
8063
8064 MBEDTLS_PUT_UINT32_BE( session->verify_result, p, 0 );
8065 p += 4;
8066 }
8067
8068 /*
8069 * Peer's end-entity certificate
8070 */
8071#if defined(MBEDTLS_X509_CRT_PARSE_C)
8072#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
8073 if( session->peer_cert == NULL )
8074 cert_len = 0;
8075 else
8076 cert_len = session->peer_cert->raw.len;
8077
8078 used += 3 + cert_len;
8079
8080 if( used <= buf_len )
8081 {
8082 *p++ = MBEDTLS_BYTE_2( cert_len );
8083 *p++ = MBEDTLS_BYTE_1( cert_len );
8084 *p++ = MBEDTLS_BYTE_0( cert_len );
8085
8086 if( session->peer_cert != NULL )
8087 {
8088 memcpy( p, session->peer_cert->raw.p, cert_len );
8089 p += cert_len;
8090 }
8091 }
8092#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8093 if( session->peer_cert_digest != NULL )
8094 {
8095 used += 1 /* type */ + 1 /* length */ + session->peer_cert_digest_len;
8096 if( used <= buf_len )
8097 {
8098 *p++ = (unsigned char) session->peer_cert_digest_type;
8099 *p++ = (unsigned char) session->peer_cert_digest_len;
8100 memcpy( p, session->peer_cert_digest,
8101 session->peer_cert_digest_len );
8102 p += session->peer_cert_digest_len;
8103 }
8104 }
8105 else
8106 {
8107 used += 2;
8108 if( used <= buf_len )
8109 {
8110 *p++ = (unsigned char) MBEDTLS_MD_NONE;
8111 *p++ = 0;
8112 }
8113 }
8114#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8115#endif /* MBEDTLS_X509_CRT_PARSE_C */
8116
8117 /*
8118 * Session ticket if any, plus associated data
8119 */
8120#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
8121 used += 3 + session->ticket_len + 4; /* len + ticket + lifetime */
8122
8123 if( used <= buf_len )
8124 {
8125 *p++ = MBEDTLS_BYTE_2( session->ticket_len );
8126 *p++ = MBEDTLS_BYTE_1( session->ticket_len );
8127 *p++ = MBEDTLS_BYTE_0( session->ticket_len );
8128
8129 if( session->ticket != NULL )
8130 {
8131 memcpy( p, session->ticket, session->ticket_len );
8132 p += session->ticket_len;
8133 }
8134
8135 MBEDTLS_PUT_UINT32_BE( session->ticket_lifetime, p, 0 );
8136 p += 4;
8137 }
8138#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
8139
8140 /*
8141 * Misc extension-related info
8142 */
8143#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
8144 used += 1;
8145
8146 if( used <= buf_len )
8147 *p++ = session->mfl_code;
8148#endif
8149
8150#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
8151 used += 1;
8152
8153 if( used <= buf_len )
8154 *p++ = MBEDTLS_BYTE_0( session->encrypt_then_mac );
8155#endif
8156
8157 return( used );
8158}
8159
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02008160MBEDTLS_CHECK_RETURN_CRITICAL
Jerry Yu438ddd82022-07-07 06:55:50 +00008161static int ssl_tls12_session_load( mbedtls_ssl_session *session,
Jerry Yu4f9e3ef2022-02-17 14:58:27 +08008162 const unsigned char *buf,
8163 size_t len )
8164{
8165#if defined(MBEDTLS_HAVE_TIME)
8166 uint64_t start;
8167#endif
8168#if defined(MBEDTLS_X509_CRT_PARSE_C)
8169#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
8170 size_t cert_len;
8171#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8172#endif /* MBEDTLS_X509_CRT_PARSE_C */
8173
8174 const unsigned char *p = buf;
8175 const unsigned char * const end = buf + len;
8176
8177 /*
8178 * Time
8179 */
8180#if defined(MBEDTLS_HAVE_TIME)
8181 if( 8 > (size_t)( end - p ) )
8182 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8183
8184 start = ( (uint64_t) p[0] << 56 ) |
8185 ( (uint64_t) p[1] << 48 ) |
8186 ( (uint64_t) p[2] << 40 ) |
8187 ( (uint64_t) p[3] << 32 ) |
8188 ( (uint64_t) p[4] << 24 ) |
8189 ( (uint64_t) p[5] << 16 ) |
8190 ( (uint64_t) p[6] << 8 ) |
8191 ( (uint64_t) p[7] );
8192 p += 8;
8193
8194 session->start = (time_t) start;
8195#endif /* MBEDTLS_HAVE_TIME */
8196
8197 /*
8198 * Basic mandatory fields
8199 */
8200 if( 2 + 1 + 1 + 32 + 48 + 4 > (size_t)( end - p ) )
8201 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8202
8203 session->ciphersuite = ( p[0] << 8 ) | p[1];
8204 p += 2;
8205
8206 session->compression = *p++;
8207
8208 session->id_len = *p++;
8209 memcpy( session->id, p, 32 );
8210 p += 32;
8211
8212 memcpy( session->master, p, 48 );
8213 p += 48;
8214
8215 session->verify_result = ( (uint32_t) p[0] << 24 ) |
8216 ( (uint32_t) p[1] << 16 ) |
8217 ( (uint32_t) p[2] << 8 ) |
8218 ( (uint32_t) p[3] );
8219 p += 4;
8220
8221 /* Immediately clear invalid pointer values that have been read, in case
8222 * we exit early before we replaced them with valid ones. */
8223#if defined(MBEDTLS_X509_CRT_PARSE_C)
8224#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
8225 session->peer_cert = NULL;
8226#else
8227 session->peer_cert_digest = NULL;
8228#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8229#endif /* MBEDTLS_X509_CRT_PARSE_C */
8230#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
8231 session->ticket = NULL;
8232#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
8233
8234 /*
8235 * Peer certificate
8236 */
8237#if defined(MBEDTLS_X509_CRT_PARSE_C)
8238#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
8239 /* Deserialize CRT from the end of the ticket. */
8240 if( 3 > (size_t)( end - p ) )
8241 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8242
8243 cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
8244 p += 3;
8245
8246 if( cert_len != 0 )
8247 {
8248 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
8249
8250 if( cert_len > (size_t)( end - p ) )
8251 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8252
8253 session->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
8254
8255 if( session->peer_cert == NULL )
8256 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
8257
8258 mbedtls_x509_crt_init( session->peer_cert );
8259
8260 if( ( ret = mbedtls_x509_crt_parse_der( session->peer_cert,
8261 p, cert_len ) ) != 0 )
8262 {
8263 mbedtls_x509_crt_free( session->peer_cert );
8264 mbedtls_free( session->peer_cert );
8265 session->peer_cert = NULL;
8266 return( ret );
8267 }
8268
8269 p += cert_len;
8270 }
8271#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8272 /* Deserialize CRT digest from the end of the ticket. */
8273 if( 2 > (size_t)( end - p ) )
8274 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8275
8276 session->peer_cert_digest_type = (mbedtls_md_type_t) *p++;
8277 session->peer_cert_digest_len = (size_t) *p++;
8278
8279 if( session->peer_cert_digest_len != 0 )
8280 {
8281 const mbedtls_md_info_t *md_info =
8282 mbedtls_md_info_from_type( session->peer_cert_digest_type );
8283 if( md_info == NULL )
8284 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8285 if( session->peer_cert_digest_len != mbedtls_md_get_size( md_info ) )
8286 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8287
8288 if( session->peer_cert_digest_len > (size_t)( end - p ) )
8289 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8290
8291 session->peer_cert_digest =
8292 mbedtls_calloc( 1, session->peer_cert_digest_len );
8293 if( session->peer_cert_digest == NULL )
8294 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
8295
8296 memcpy( session->peer_cert_digest, p,
8297 session->peer_cert_digest_len );
8298 p += session->peer_cert_digest_len;
8299 }
8300#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
8301#endif /* MBEDTLS_X509_CRT_PARSE_C */
8302
8303 /*
8304 * Session ticket and associated data
8305 */
8306#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
8307 if( 3 > (size_t)( end - p ) )
8308 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8309
8310 session->ticket_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
8311 p += 3;
8312
8313 if( session->ticket_len != 0 )
8314 {
8315 if( session->ticket_len > (size_t)( end - p ) )
8316 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8317
8318 session->ticket = mbedtls_calloc( 1, session->ticket_len );
8319 if( session->ticket == NULL )
8320 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
8321
8322 memcpy( session->ticket, p, session->ticket_len );
8323 p += session->ticket_len;
8324 }
8325
8326 if( 4 > (size_t)( end - p ) )
8327 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8328
8329 session->ticket_lifetime = ( (uint32_t) p[0] << 24 ) |
8330 ( (uint32_t) p[1] << 16 ) |
8331 ( (uint32_t) p[2] << 8 ) |
8332 ( (uint32_t) p[3] );
8333 p += 4;
8334#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
8335
8336 /*
8337 * Misc extension-related info
8338 */
8339#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
8340 if( 1 > (size_t)( end - p ) )
8341 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8342
8343 session->mfl_code = *p++;
8344#endif
8345
8346#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
8347 if( 1 > (size_t)( end - p ) )
8348 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8349
8350 session->encrypt_then_mac = *p++;
8351#endif
8352
8353 /* Done, should have consumed entire buffer */
8354 if( p != end )
8355 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8356
8357 return( 0 );
8358}
Jerry Yudc7bd172022-02-17 13:44:15 +08008359#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
8360
XiaokangQian75d40ef2022-04-20 11:05:24 +00008361int mbedtls_ssl_validate_ciphersuite(
8362 const mbedtls_ssl_context *ssl,
8363 const mbedtls_ssl_ciphersuite_t *suite_info,
8364 mbedtls_ssl_protocol_version min_tls_version,
8365 mbedtls_ssl_protocol_version max_tls_version )
8366{
8367 (void) ssl;
8368
8369 if( suite_info == NULL )
8370 return( -1 );
8371
8372 if( ( suite_info->min_tls_version > max_tls_version ) ||
8373 ( suite_info->max_tls_version < min_tls_version ) )
8374 {
8375 return( -1 );
8376 }
8377
XiaokangQian060d8672022-04-21 09:24:56 +00008378#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_CLI_C)
XiaokangQian75d40ef2022-04-20 11:05:24 +00008379#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
8380 if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
8381 mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
8382 {
8383 return( -1 );
8384 }
8385#endif
8386
8387 /* Don't suggest PSK-based ciphersuite if no PSK is available. */
8388#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
8389 if( mbedtls_ssl_ciphersuite_uses_psk( suite_info ) &&
8390 mbedtls_ssl_conf_has_static_psk( ssl->conf ) == 0 )
8391 {
8392 return( -1 );
8393 }
8394#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
8395#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
8396
8397 return( 0 );
8398}
8399
XiaokangQianeaf36512022-04-24 09:07:44 +00008400#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
8401/*
8402 * Function for writing a signature algorithm extension.
8403 *
8404 * The `extension_data` field of signature algorithm contains a `SignatureSchemeList`
8405 * value (TLS 1.3 RFC8446):
8406 * enum {
8407 * ....
8408 * ecdsa_secp256r1_sha256( 0x0403 ),
8409 * ecdsa_secp384r1_sha384( 0x0503 ),
8410 * ecdsa_secp521r1_sha512( 0x0603 ),
8411 * ....
8412 * } SignatureScheme;
8413 *
8414 * struct {
8415 * SignatureScheme supported_signature_algorithms<2..2^16-2>;
8416 * } SignatureSchemeList;
8417 *
8418 * The `extension_data` field of signature algorithm contains a `SignatureAndHashAlgorithm`
8419 * value (TLS 1.2 RFC5246):
8420 * enum {
8421 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
8422 * sha512(6), (255)
8423 * } HashAlgorithm;
8424 *
8425 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
8426 * SignatureAlgorithm;
8427 *
8428 * struct {
8429 * HashAlgorithm hash;
8430 * SignatureAlgorithm signature;
8431 * } SignatureAndHashAlgorithm;
8432 *
8433 * SignatureAndHashAlgorithm
8434 * supported_signature_algorithms<2..2^16-2>;
8435 *
8436 * The TLS 1.3 signature algorithm extension was defined to be a compatible
8437 * generalization of the TLS 1.2 signature algorithm extension.
8438 * `SignatureAndHashAlgorithm` field of TLS 1.2 can be represented by
8439 * `SignatureScheme` field of TLS 1.3
8440 *
8441 */
8442int mbedtls_ssl_write_sig_alg_ext( mbedtls_ssl_context *ssl, unsigned char *buf,
8443 const unsigned char *end, size_t *out_len )
8444{
8445 unsigned char *p = buf;
8446 unsigned char *supported_sig_alg; /* Start of supported_signature_algorithms */
8447 size_t supported_sig_alg_len = 0; /* Length of supported_signature_algorithms */
8448
8449 *out_len = 0;
8450
8451 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding signature_algorithms extension" ) );
8452
8453 /* Check if we have space for header and length field:
8454 * - extension_type (2 bytes)
8455 * - extension_data_length (2 bytes)
8456 * - supported_signature_algorithms_length (2 bytes)
8457 */
8458 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
8459 p += 6;
8460
8461 /*
8462 * Write supported_signature_algorithms
8463 */
8464 supported_sig_alg = p;
8465 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs( ssl );
8466 if( sig_alg == NULL )
8467 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
8468
8469 for( ; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++ )
8470 {
Jerry Yu53f5c152022-06-22 20:24:38 +08008471 MBEDTLS_SSL_DEBUG_MSG( 3, ( "got signature scheme [%x] %s",
8472 *sig_alg,
8473 mbedtls_ssl_sig_alg_to_str( *sig_alg ) ) );
XiaokangQianeaf36512022-04-24 09:07:44 +00008474 if( ! mbedtls_ssl_sig_alg_is_supported( ssl, *sig_alg ) )
8475 continue;
8476 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
8477 MBEDTLS_PUT_UINT16_BE( *sig_alg, p, 0 );
8478 p += 2;
Jerry Yu80dd5db2022-06-22 19:30:32 +08008479 MBEDTLS_SSL_DEBUG_MSG( 3, ( "sent signature scheme [%x] %s",
Jerry Yuf3b46b52022-06-19 16:52:27 +08008480 *sig_alg,
8481 mbedtls_ssl_sig_alg_to_str( *sig_alg ) ) );
XiaokangQianeaf36512022-04-24 09:07:44 +00008482 }
8483
8484 /* Length of supported_signature_algorithms */
8485 supported_sig_alg_len = p - supported_sig_alg;
8486 if( supported_sig_alg_len == 0 )
8487 {
8488 MBEDTLS_SSL_DEBUG_MSG( 1, ( "No signature algorithms defined." ) );
8489 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
8490 }
8491
XiaokangQianeaf36512022-04-24 09:07:44 +00008492 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SIG_ALG, buf, 0 );
XiaokangQianeaf36512022-04-24 09:07:44 +00008493 MBEDTLS_PUT_UINT16_BE( supported_sig_alg_len + 2, buf, 2 );
XiaokangQianeaf36512022-04-24 09:07:44 +00008494 MBEDTLS_PUT_UINT16_BE( supported_sig_alg_len, buf, 4 );
8495
XiaokangQianeaf36512022-04-24 09:07:44 +00008496 *out_len = p - buf;
8497
8498#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
8499 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SIG_ALG;
8500#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
8501 return( 0 );
8502}
8503#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
8504
XiaokangQian40a35232022-05-07 09:02:40 +00008505#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
XiaokangQian9b2b7712022-05-17 02:57:00 +00008506/*
8507 * mbedtls_ssl_parse_server_name_ext
8508 *
8509 * Structure of server_name extension:
8510 *
8511 * enum {
8512 * host_name(0), (255)
8513 * } NameType;
8514 * opaque HostName<1..2^16-1>;
8515 *
8516 * struct {
8517 * NameType name_type;
8518 * select (name_type) {
8519 * case host_name: HostName;
8520 * } name;
8521 * } ServerName;
8522 * struct {
8523 * ServerName server_name_list<1..2^16-1>
8524 * } ServerNameList;
8525 */
Ronald Cronce7d76e2022-07-08 18:56:49 +02008526MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQian9b2b7712022-05-17 02:57:00 +00008527int mbedtls_ssl_parse_server_name_ext( mbedtls_ssl_context *ssl,
8528 const unsigned char *buf,
8529 const unsigned char *end )
XiaokangQian40a35232022-05-07 09:02:40 +00008530{
8531 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
8532 const unsigned char *p = buf;
XiaokangQian9b2b7712022-05-17 02:57:00 +00008533 size_t server_name_list_len, hostname_len;
8534 const unsigned char *server_name_list_end;
XiaokangQian40a35232022-05-07 09:02:40 +00008535
XiaokangQianf2a94202022-05-20 06:44:24 +00008536 MBEDTLS_SSL_DEBUG_MSG( 3, ( "parse ServerName extension" ) );
XiaokangQian40a35232022-05-07 09:02:40 +00008537
8538 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 2 );
XiaokangQian9b2b7712022-05-17 02:57:00 +00008539 server_name_list_len = MBEDTLS_GET_UINT16_BE( p, 0 );
XiaokangQian40a35232022-05-07 09:02:40 +00008540 p += 2;
8541
XiaokangQian9b2b7712022-05-17 02:57:00 +00008542 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, server_name_list_len );
8543 server_name_list_end = p + server_name_list_len;
XiaokangQian75fe8c72022-06-15 09:42:45 +00008544 while( p < server_name_list_end )
XiaokangQian40a35232022-05-07 09:02:40 +00008545 {
XiaokangQian9b2b7712022-05-17 02:57:00 +00008546 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, server_name_list_end, 3 );
XiaokangQian40a35232022-05-07 09:02:40 +00008547 hostname_len = MBEDTLS_GET_UINT16_BE( p, 1 );
XiaokangQian9b2b7712022-05-17 02:57:00 +00008548 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, server_name_list_end,
8549 hostname_len + 3 );
XiaokangQian40a35232022-05-07 09:02:40 +00008550
8551 if( p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME )
8552 {
XiaokangQian75fe8c72022-06-15 09:42:45 +00008553 /* sni_name is intended to be used only during the parsing of the
8554 * ClientHello message (it is reset to NULL before the end of
8555 * the message parsing). Thus it is ok to just point to the
8556 * reception buffer and not make a copy of it.
8557 */
XiaokangQianf2a94202022-05-20 06:44:24 +00008558 ssl->handshake->sni_name = p + 3;
8559 ssl->handshake->sni_name_len = hostname_len;
8560 if( ssl->conf->f_sni == NULL )
8561 return( 0 );
XiaokangQian40a35232022-05-07 09:02:40 +00008562 ret = ssl->conf->f_sni( ssl->conf->p_sni,
XiaokangQian9b2b7712022-05-17 02:57:00 +00008563 ssl, p + 3, hostname_len );
XiaokangQian40a35232022-05-07 09:02:40 +00008564 if( ret != 0 )
8565 {
XiaokangQianf2a94202022-05-20 06:44:24 +00008566 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_sni_wrapper", ret );
XiaokangQian129aeb92022-06-02 09:29:18 +00008567 MBEDTLS_SSL_PEND_FATAL_ALERT( MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME,
8568 MBEDTLS_ERR_SSL_UNRECOGNIZED_NAME );
XiaokangQian40a35232022-05-07 09:02:40 +00008569 return( MBEDTLS_ERR_SSL_UNRECOGNIZED_NAME );
8570 }
8571 return( 0 );
8572 }
8573
8574 p += hostname_len + 3;
8575 }
8576
8577 return( 0 );
8578}
8579#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
8580
XiaokangQianacb39922022-06-17 10:18:48 +00008581#if defined(MBEDTLS_SSL_ALPN)
Ronald Cronce7d76e2022-07-08 18:56:49 +02008582MBEDTLS_CHECK_RETURN_CRITICAL
XiaokangQianacb39922022-06-17 10:18:48 +00008583int mbedtls_ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
8584 const unsigned char *buf,
8585 const unsigned char *end )
8586{
8587 const unsigned char *p = buf;
XiaokangQianc7403452022-06-23 03:24:12 +00008588 size_t protocol_name_list_len;
XiaokangQian95d5f542022-06-24 02:29:26 +00008589 const unsigned char *protocol_name_list;
8590 const unsigned char *protocol_name_list_end;
XiaokangQianc7403452022-06-23 03:24:12 +00008591 size_t protocol_name_len;
XiaokangQianacb39922022-06-17 10:18:48 +00008592
8593 /* If ALPN not configured, just ignore the extension */
8594 if( ssl->conf->alpn_list == NULL )
8595 return( 0 );
8596
8597 /*
XiaokangQianc7403452022-06-23 03:24:12 +00008598 * RFC7301, section 3.1
8599 * opaque ProtocolName<1..2^8-1>;
XiaokangQianacb39922022-06-17 10:18:48 +00008600 *
XiaokangQianc7403452022-06-23 03:24:12 +00008601 * struct {
8602 * ProtocolName protocol_name_list<2..2^16-1>
8603 * } ProtocolNameList;
XiaokangQianacb39922022-06-17 10:18:48 +00008604 */
8605
XiaokangQianc7403452022-06-23 03:24:12 +00008606 /*
XiaokangQian0b776e22022-06-24 09:04:59 +00008607 * protocol_name_list_len 2 bytes
8608 * protocol_name_len 1 bytes
8609 * protocol_name >=1 byte
XiaokangQianc7403452022-06-23 03:24:12 +00008610 */
XiaokangQianacb39922022-06-17 10:18:48 +00008611 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, 4 );
8612
XiaokangQianc7403452022-06-23 03:24:12 +00008613 protocol_name_list_len = MBEDTLS_GET_UINT16_BE( p, 0 );
XiaokangQianacb39922022-06-17 10:18:48 +00008614 p += 2;
XiaokangQianc7403452022-06-23 03:24:12 +00008615 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, end, protocol_name_list_len );
XiaokangQian95d5f542022-06-24 02:29:26 +00008616 protocol_name_list = p;
8617 protocol_name_list_end = p + protocol_name_list_len;
XiaokangQianacb39922022-06-17 10:18:48 +00008618
8619 /* Validate peer's list (lengths) */
XiaokangQian95d5f542022-06-24 02:29:26 +00008620 while( p < protocol_name_list_end )
XiaokangQianacb39922022-06-17 10:18:48 +00008621 {
XiaokangQian95d5f542022-06-24 02:29:26 +00008622 protocol_name_len = *p++;
8623 MBEDTLS_SSL_CHK_BUF_READ_PTR( p, protocol_name_list_end,
8624 protocol_name_len );
XiaokangQianc7403452022-06-23 03:24:12 +00008625 if( protocol_name_len == 0 )
XiaokangQian95d5f542022-06-24 02:29:26 +00008626 {
8627 MBEDTLS_SSL_PEND_FATAL_ALERT(
8628 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
8629 MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
XiaokangQianacb39922022-06-17 10:18:48 +00008630 return( MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER );
XiaokangQian95d5f542022-06-24 02:29:26 +00008631 }
8632
8633 p += protocol_name_len;
XiaokangQianacb39922022-06-17 10:18:48 +00008634 }
8635
8636 /* Use our order of preference */
8637 for( const char **alpn = ssl->conf->alpn_list; *alpn != NULL; alpn++ )
8638 {
8639 size_t const alpn_len = strlen( *alpn );
XiaokangQian95d5f542022-06-24 02:29:26 +00008640 p = protocol_name_list;
8641 while( p < protocol_name_list_end )
XiaokangQianacb39922022-06-17 10:18:48 +00008642 {
XiaokangQian95d5f542022-06-24 02:29:26 +00008643 protocol_name_len = *p++;
XiaokangQianc7403452022-06-23 03:24:12 +00008644 if( protocol_name_len == alpn_len &&
XiaokangQian95d5f542022-06-24 02:29:26 +00008645 memcmp( p, *alpn, alpn_len ) == 0 )
XiaokangQianacb39922022-06-17 10:18:48 +00008646 {
8647 ssl->alpn_chosen = *alpn;
8648 return( 0 );
8649 }
XiaokangQian95d5f542022-06-24 02:29:26 +00008650
8651 p += protocol_name_len;
XiaokangQianacb39922022-06-17 10:18:48 +00008652 }
8653 }
8654
XiaokangQian95d5f542022-06-24 02:29:26 +00008655 /* If we get here, no match was found */
XiaokangQianacb39922022-06-17 10:18:48 +00008656 MBEDTLS_SSL_PEND_FATAL_ALERT(
8657 MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL,
8658 MBEDTLS_ERR_SSL_NO_APPLICATION_PROTOCOL );
8659 return( MBEDTLS_ERR_SSL_NO_APPLICATION_PROTOCOL );
8660}
8661
8662int mbedtls_ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
8663 unsigned char *buf,
8664 unsigned char *end,
XiaokangQianc7403452022-06-23 03:24:12 +00008665 size_t *out_len )
XiaokangQianacb39922022-06-17 10:18:48 +00008666{
8667 unsigned char *p = buf;
XiaokangQian95d5f542022-06-24 02:29:26 +00008668 size_t protocol_name_len;
XiaokangQianc7403452022-06-23 03:24:12 +00008669 *out_len = 0;
XiaokangQianacb39922022-06-17 10:18:48 +00008670
8671 if( ssl->alpn_chosen == NULL )
8672 {
8673 return( 0 );
8674 }
8675
XiaokangQian95d5f542022-06-24 02:29:26 +00008676 protocol_name_len = strlen( ssl->alpn_chosen );
8677 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 7 + protocol_name_len );
XiaokangQianacb39922022-06-17 10:18:48 +00008678
8679 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server side, adding alpn extension" ) );
8680 /*
8681 * 0 . 1 ext identifier
8682 * 2 . 3 ext length
8683 * 4 . 5 protocol list length
8684 * 6 . 6 protocol name length
8685 * 7 . 7+n protocol name
8686 */
8687 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_ALPN, p, 0 );
8688
XiaokangQian95d5f542022-06-24 02:29:26 +00008689 *out_len = 7 + protocol_name_len;
XiaokangQianacb39922022-06-17 10:18:48 +00008690
XiaokangQian95d5f542022-06-24 02:29:26 +00008691 MBEDTLS_PUT_UINT16_BE( protocol_name_len + 3, p, 2 );
8692 MBEDTLS_PUT_UINT16_BE( protocol_name_len + 1, p, 4 );
XiaokangQian0b776e22022-06-24 09:04:59 +00008693 /* Note: the length of the chosen protocol has been checked to be less
8694 * than 255 bytes in `mbedtls_ssl_conf_alpn_protocols`.
8695 */
XiaokangQian95d5f542022-06-24 02:29:26 +00008696 p[6] = MBEDTLS_BYTE_0( protocol_name_len );
XiaokangQianacb39922022-06-17 10:18:48 +00008697
XiaokangQian95d5f542022-06-24 02:29:26 +00008698 memcpy( p + 7, ssl->alpn_chosen, protocol_name_len );
XiaokangQianacb39922022-06-17 10:18:48 +00008699 return ( 0 );
8700}
8701#endif /* MBEDTLS_SSL_ALPN */
8702
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008703#endif /* MBEDTLS_SSL_TLS_C */