blob: 5d79bc3e36e4a3d70c16897a4a636eb7b889bf18 [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"
Chris Jones84a773f2021-03-05 18:38:47 +000041#include "ssl_misc.h"
Janos Follath73c616b2019-12-18 15:07:04 +000042#include "mbedtls/debug.h"
43#include "mbedtls/error.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050044#include "mbedtls/platform_util.h"
Hanno Beckera835da52019-05-16 12:39:07 +010045#include "mbedtls/version.h"
Gabor Mezei765862c2021-10-19 12:22:25 +020046#include "mbedtls/constant_time.h"
Paul Bakker0be444a2013-08-27 21:55:01 +020047
Rich Evans00ab4702015-02-06 13:43:58 +000048#include <string.h>
49
Andrzej Kurekd6db9be2019-01-10 05:27:10 -050050#if defined(MBEDTLS_USE_PSA_CRYPTO)
51#include "mbedtls/psa_util.h"
52#include "psa/crypto.h"
53#endif
54
Janos Follath23bdca02016-10-07 14:47:14 +010055#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000056#include "mbedtls/oid.h"
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +020057#endif
58
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +020059#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker2b1e3542018-08-06 11:19:13 +010060
Hanno Beckera0e20d02019-05-15 14:03:01 +010061#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerf8542cf2019-04-09 15:22:03 +010062/* Top-level Connection ID API */
63
Hanno Becker8367ccc2019-05-14 11:30:10 +010064int mbedtls_ssl_conf_cid( mbedtls_ssl_config *conf,
65 size_t len,
66 int ignore_other_cid )
Hanno Beckerad4a1372019-05-03 13:06:44 +010067{
68 if( len > MBEDTLS_SSL_CID_IN_LEN_MAX )
69 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
70
Hanno Becker611ac772019-05-14 11:45:26 +010071 if( ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_FAIL &&
72 ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_IGNORE )
73 {
74 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
75 }
76
77 conf->ignore_unexpected_cid = ignore_other_cid;
Hanno Beckerad4a1372019-05-03 13:06:44 +010078 conf->cid_len = len;
79 return( 0 );
80}
81
Hanno Beckerf8542cf2019-04-09 15:22:03 +010082int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
83 int enable,
84 unsigned char const *own_cid,
85 size_t own_cid_len )
86{
Hanno Becker76a79ab2019-05-03 14:38:32 +010087 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
88 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
89
Hanno Beckerca092242019-04-25 16:01:49 +010090 ssl->negotiate_cid = enable;
91 if( enable == MBEDTLS_SSL_CID_DISABLED )
92 {
93 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Disable use of CID extension." ) );
94 return( 0 );
95 }
96 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Enable use of CID extension." ) );
Hanno Beckerad4a1372019-05-03 13:06:44 +010097 MBEDTLS_SSL_DEBUG_BUF( 3, "Own CID", own_cid, own_cid_len );
Hanno Beckerca092242019-04-25 16:01:49 +010098
Hanno Beckerad4a1372019-05-03 13:06:44 +010099 if( own_cid_len != ssl->conf->cid_len )
Hanno Beckerca092242019-04-25 16:01:49 +0100100 {
Hanno Beckerad4a1372019-05-03 13:06:44 +0100101 MBEDTLS_SSL_DEBUG_MSG( 3, ( "CID length %u does not match CID length %u in config",
102 (unsigned) own_cid_len,
103 (unsigned) ssl->conf->cid_len ) );
Hanno Beckerca092242019-04-25 16:01:49 +0100104 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
105 }
106
107 memcpy( ssl->own_cid, own_cid, own_cid_len );
Hanno Beckerb7ee0cf2019-04-30 14:07:31 +0100108 /* Truncation is not an issue here because
109 * MBEDTLS_SSL_CID_IN_LEN_MAX at most 255. */
110 ssl->own_cid_len = (uint8_t) own_cid_len;
Hanno Beckerca092242019-04-25 16:01:49 +0100111
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100112 return( 0 );
113}
114
115int mbedtls_ssl_get_peer_cid( mbedtls_ssl_context *ssl,
116 int *enabled,
117 unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ],
118 size_t *peer_cid_len )
119{
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100120 *enabled = MBEDTLS_SSL_CID_DISABLED;
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100121
Hanno Becker76a79ab2019-05-03 14:38:32 +0100122 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
123 ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
124 {
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100125 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Hanno Becker76a79ab2019-05-03 14:38:32 +0100126 }
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100127
Hanno Beckerc5f24222019-05-03 12:54:52 +0100128 /* We report MBEDTLS_SSL_CID_DISABLED in case the CID extensions
129 * were used, but client and server requested the empty CID.
130 * This is indistinguishable from not using the CID extension
131 * in the first place. */
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100132 if( ssl->transform_in->in_cid_len == 0 &&
133 ssl->transform_in->out_cid_len == 0 )
134 {
135 return( 0 );
136 }
137
Hanno Becker615ef172019-05-22 16:50:35 +0100138 if( peer_cid_len != NULL )
139 {
140 *peer_cid_len = ssl->transform_in->out_cid_len;
141 if( peer_cid != NULL )
142 {
143 memcpy( peer_cid, ssl->transform_in->out_cid,
144 ssl->transform_in->out_cid_len );
145 }
146 }
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100147
148 *enabled = MBEDTLS_SSL_CID_ENABLED;
149
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100150 return( 0 );
151}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100152#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100153
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200154#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200155
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200156#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200157/*
158 * Convert max_fragment_length codes to length.
159 * RFC 6066 says:
160 * enum{
161 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
162 * } MaxFragmentLength;
163 * and we add 0 -> extension unused
164 */
Angus Grattond8213d02016-05-25 20:56:48 +1000165static unsigned int ssl_mfl_code_to_length( int mfl )
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200166{
Angus Grattond8213d02016-05-25 20:56:48 +1000167 switch( mfl )
168 {
169 case MBEDTLS_SSL_MAX_FRAG_LEN_NONE:
170 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
171 case MBEDTLS_SSL_MAX_FRAG_LEN_512:
172 return 512;
173 case MBEDTLS_SSL_MAX_FRAG_LEN_1024:
174 return 1024;
175 case MBEDTLS_SSL_MAX_FRAG_LEN_2048:
176 return 2048;
177 case MBEDTLS_SSL_MAX_FRAG_LEN_4096:
178 return 4096;
179 default:
180 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
181 }
182}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200183#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200184
Hanno Becker52055ae2019-02-06 14:30:46 +0000185int mbedtls_ssl_session_copy( mbedtls_ssl_session *dst,
186 const mbedtls_ssl_session *src )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200187{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200188 mbedtls_ssl_session_free( dst );
189 memcpy( dst, src, sizeof( mbedtls_ssl_session ) );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200190
吴敬辉0b716112021-11-29 10:46:35 +0800191#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
192 dst->ticket = NULL;
193#endif
194
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200195#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker6d1986e2019-02-07 12:27:42 +0000196
197#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200198 if( src->peer_cert != NULL )
199 {
Janos Follath865b3eb2019-12-16 11:46:15 +0000200 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker2292d1f2013-09-15 17:06:49 +0200201
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200202 dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200203 if( dst->peer_cert == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200204 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200206 mbedtls_x509_crt_init( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208 if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p,
Manuel Pégourié-Gonnard4d2a8eb2014-06-13 20:33:27 +0200209 src->peer_cert->raw.len ) ) != 0 )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200210 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200211 mbedtls_free( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200212 dst->peer_cert = NULL;
213 return( ret );
214 }
215 }
Hanno Becker6d1986e2019-02-07 12:27:42 +0000216#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker9198ad12019-02-05 17:00:50 +0000217 if( src->peer_cert_digest != NULL )
218 {
Hanno Becker9198ad12019-02-05 17:00:50 +0000219 dst->peer_cert_digest =
Hanno Beckeraccc5992019-02-25 10:06:59 +0000220 mbedtls_calloc( 1, src->peer_cert_digest_len );
Hanno Becker9198ad12019-02-05 17:00:50 +0000221 if( dst->peer_cert_digest == NULL )
222 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
223
224 memcpy( dst->peer_cert_digest, src->peer_cert_digest,
225 src->peer_cert_digest_len );
226 dst->peer_cert_digest_type = src->peer_cert_digest_type;
Hanno Beckeraccc5992019-02-25 10:06:59 +0000227 dst->peer_cert_digest_len = src->peer_cert_digest_len;
Hanno Becker9198ad12019-02-05 17:00:50 +0000228 }
229#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
230
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200231#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200232
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +0200233#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200234 if( src->ticket != NULL )
235 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200236 dst->ticket = mbedtls_calloc( 1, src->ticket_len );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200237 if( dst->ticket == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200238 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200239
240 memcpy( dst->ticket, src->ticket, src->ticket_len );
241 }
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +0200242#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200243
244 return( 0 );
245}
246
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500247#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
248static int resize_buffer( unsigned char **buffer, size_t len_new, size_t *len_old )
249{
250 unsigned char* resized_buffer = mbedtls_calloc( 1, len_new );
251 if( resized_buffer == NULL )
252 return -1;
253
254 /* We want to copy len_new bytes when downsizing the buffer, and
255 * len_old bytes when upsizing, so we choose the smaller of two sizes,
256 * to fit one buffer into another. Size checks, ensuring that no data is
257 * lost, are done outside of this function. */
258 memcpy( resized_buffer, *buffer,
259 ( len_new < *len_old ) ? len_new : *len_old );
260 mbedtls_platform_zeroize( *buffer, *len_old );
261 mbedtls_free( *buffer );
262
263 *buffer = resized_buffer;
264 *len_old = len_new;
265
266 return 0;
267}
Andrzej Kurek4a063792020-10-21 15:08:44 +0200268
269static void handle_buffer_resizing( mbedtls_ssl_context *ssl, int downsizing,
Andrzej Kurek069fa962021-01-07 08:02:15 -0500270 size_t in_buf_new_len,
271 size_t out_buf_new_len )
Andrzej Kurek4a063792020-10-21 15:08:44 +0200272{
273 int modified = 0;
274 size_t written_in = 0, iv_offset_in = 0, len_offset_in = 0;
275 size_t written_out = 0, iv_offset_out = 0, len_offset_out = 0;
276 if( ssl->in_buf != NULL )
277 {
278 written_in = ssl->in_msg - ssl->in_buf;
279 iv_offset_in = ssl->in_iv - ssl->in_buf;
280 len_offset_in = ssl->in_len - ssl->in_buf;
281 if( downsizing ?
282 ssl->in_buf_len > in_buf_new_len && ssl->in_left < in_buf_new_len :
283 ssl->in_buf_len < in_buf_new_len )
284 {
285 if( resize_buffer( &ssl->in_buf, in_buf_new_len, &ssl->in_buf_len ) != 0 )
286 {
287 MBEDTLS_SSL_DEBUG_MSG( 1, ( "input buffer resizing failed - out of memory" ) );
288 }
289 else
290 {
Paul Elliottb7449902021-03-10 18:14:58 +0000291 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating in_buf to %" MBEDTLS_PRINTF_SIZET,
292 in_buf_new_len ) );
Andrzej Kurek4a063792020-10-21 15:08:44 +0200293 modified = 1;
294 }
295 }
296 }
297
298 if( ssl->out_buf != NULL )
299 {
300 written_out = ssl->out_msg - ssl->out_buf;
301 iv_offset_out = ssl->out_iv - ssl->out_buf;
302 len_offset_out = ssl->out_len - ssl->out_buf;
303 if( downsizing ?
304 ssl->out_buf_len > out_buf_new_len && ssl->out_left < out_buf_new_len :
305 ssl->out_buf_len < out_buf_new_len )
306 {
307 if( resize_buffer( &ssl->out_buf, out_buf_new_len, &ssl->out_buf_len ) != 0 )
308 {
309 MBEDTLS_SSL_DEBUG_MSG( 1, ( "output buffer resizing failed - out of memory" ) );
310 }
311 else
312 {
Paul Elliottb7449902021-03-10 18:14:58 +0000313 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating out_buf to %" MBEDTLS_PRINTF_SIZET,
314 out_buf_new_len ) );
Andrzej Kurek4a063792020-10-21 15:08:44 +0200315 modified = 1;
316 }
317 }
318 }
319 if( modified )
320 {
321 /* Update pointers here to avoid doing it twice. */
322 mbedtls_ssl_reset_in_out_pointers( ssl );
323 /* Fields below might not be properly updated with record
324 * splitting or with CID, so they are manually updated here. */
325 ssl->out_msg = ssl->out_buf + written_out;
326 ssl->out_len = ssl->out_buf + len_offset_out;
327 ssl->out_iv = ssl->out_buf + iv_offset_out;
328
329 ssl->in_msg = ssl->in_buf + written_in;
330 ssl->in_len = ssl->in_buf + len_offset_in;
331 ssl->in_iv = ssl->in_buf + iv_offset_in;
332 }
333}
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500334#endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
335
Jerry Yudb8c48a2022-01-27 14:54:54 +0800336#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yued14c932022-02-17 13:40:45 +0800337
338#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
339typedef int (*tls_prf_fn)( const unsigned char *secret, size_t slen,
340 const char *label,
341 const unsigned char *random, size_t rlen,
342 unsigned char *dstbuf, size_t dlen );
343
344static tls_prf_fn ssl_tls12prf_from_cs( int ciphersuite_id );
345
346#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
347
348/* Type for the TLS PRF */
349typedef int ssl_tls_prf_t(const unsigned char *, size_t, const char *,
350 const unsigned char *, size_t,
351 unsigned char *, size_t);
352
353static int ssl_tls12_populate_transform( mbedtls_ssl_transform *transform,
354 int ciphersuite,
355 const unsigned char master[48],
356#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC) && \
357 defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
358 int encrypt_then_mac,
359#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC &&
360 MBEDTLS_SSL_SOME_SUITES_USE_MAC */
361 ssl_tls_prf_t tls_prf,
362 const unsigned char randbytes[64],
363 int minor_ver,
364 unsigned endpoint,
365 const mbedtls_ssl_context *ssl );
366
367#if defined(MBEDTLS_SHA256_C)
368static int tls_prf_sha256( const unsigned char *secret, size_t slen,
369 const char *label,
370 const unsigned char *random, size_t rlen,
371 unsigned char *dstbuf, size_t dlen );
372static void ssl_calc_verify_tls_sha256( const mbedtls_ssl_context *,unsigned char*, size_t * );
373static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int );
374
375#endif /* MBEDTLS_SHA256_C */
376
377#if defined(MBEDTLS_SHA384_C)
378static int tls_prf_sha384( const unsigned char *secret, size_t slen,
379 const char *label,
380 const unsigned char *random, size_t rlen,
381 unsigned char *dstbuf, size_t dlen );
382
383static void ssl_calc_verify_tls_sha384( const mbedtls_ssl_context *, unsigned char*, size_t * );
384static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int );
385#endif /* MBEDTLS_SHA384_C */
386
387static size_t ssl_session_save_tls12( const mbedtls_ssl_session *session,
388 unsigned char *buf,
389 size_t buf_len );
390static int ssl_session_load_tls12( mbedtls_ssl_session *session,
391 const unsigned char *buf,
392 size_t len );
393#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
394
Jerry Yu53d23e22022-02-09 16:25:09 +0800395static void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t );
396
Jerry Yudb8c48a2022-01-27 14:54:54 +0800397#if defined(MBEDTLS_SHA256_C)
398static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t );
Jerry Yu53d23e22022-02-09 16:25:09 +0800399#endif /* MBEDTLS_SHA256_C */
Jerry Yudb8c48a2022-01-27 14:54:54 +0800400
401#if defined(MBEDTLS_SHA384_C)
402static void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t );
Jerry Yu53d23e22022-02-09 16:25:09 +0800403#endif /* MBEDTLS_SHA384_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000404
Ron Eldor51d3ab52019-05-12 14:54:30 +0300405int mbedtls_ssl_tls_prf( const mbedtls_tls_prf_types prf,
406 const unsigned char *secret, size_t slen,
407 const char *label,
408 const unsigned char *random, size_t rlen,
409 unsigned char *dstbuf, size_t dlen )
410{
411 mbedtls_ssl_tls_prf_cb *tls_prf = NULL;
412
413 switch( prf )
414 {
Ron Eldord2f25f72019-05-15 14:54:22 +0300415#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Mateusz Starzykc6d94ab2021-05-19 13:31:59 +0200416#if defined(MBEDTLS_SHA384_C)
Ron Eldor51d3ab52019-05-12 14:54:30 +0300417 case MBEDTLS_SSL_TLS_PRF_SHA384:
418 tls_prf = tls_prf_sha384;
419 break;
Mateusz Starzykc6d94ab2021-05-19 13:31:59 +0200420#endif /* MBEDTLS_SHA384_C */
Ron Eldor51d3ab52019-05-12 14:54:30 +0300421#if defined(MBEDTLS_SHA256_C)
422 case MBEDTLS_SSL_TLS_PRF_SHA256:
423 tls_prf = tls_prf_sha256;
424 break;
Ron Eldord2f25f72019-05-15 14:54:22 +0300425#endif /* MBEDTLS_SHA256_C */
426#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Ron Eldor51d3ab52019-05-12 14:54:30 +0300427 default:
428 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
429 }
430
431 return( tls_prf( secret, slen, label, random, rlen, dstbuf, dlen ) );
432}
433
Jerry Yu53d23e22022-02-09 16:25:09 +0800434#if defined(MBEDTLS_SSL_PROTO_TLS1_2) || \
435 defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
436static mbedtls_tls_prf_types tls_prf_get_type( mbedtls_ssl_tls_prf_cb *tls_prf )
437{
438 ((void) tls_prf);
439#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
440#if defined(MBEDTLS_SHA384_C)
441 if( tls_prf == tls_prf_sha384 )
442 {
443 return( MBEDTLS_SSL_TLS_PRF_SHA384 );
444 }
445 else
446#endif
447#if defined(MBEDTLS_SHA256_C)
448 if( tls_prf == tls_prf_sha256 )
449 {
450 return( MBEDTLS_SSL_TLS_PRF_SHA256 );
451 }
452 else
453#endif
454#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
455 return( MBEDTLS_SSL_TLS_PRF_NONE );
456}
457
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200458/* Type for the TLS PRF */
459typedef int ssl_tls_prf_t(const unsigned char *, size_t, const char *,
460 const unsigned char *, size_t,
461 unsigned char *, size_t);
462
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200463/*
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +0200464 * Populate a transform structure with session keys and all the other
465 * necessary information.
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200466 *
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +0200467 * Parameters:
468 * - [in/out]: transform: structure to populate
469 * [in] must be just initialised with mbedtls_ssl_transform_init()
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200470 * [out] fully populated, ready for use by mbedtls_ssl_{en,de}crypt_buf()
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200471 * - [in] ciphersuite
472 * - [in] master
473 * - [in] encrypt_then_mac
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200474 * - [in] compression
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200475 * - [in] tls_prf: pointer to PRF to use for key derivation
476 * - [in] randbytes: buffer holding ServerHello.random + ClientHello.random
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200477 * - [in] minor_ver: SSL/TLS minor version
478 * - [in] endpoint: client or server
Andrzej Kurek5902cd62021-09-28 10:00:32 -0400479 * - [in] ssl: used for:
480 * - ssl->conf->{f,p}_export_keys
481 * [in] optionally used for:
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200482 * - MBEDTLS_DEBUG_C: ssl->conf->{f,p}_dbg
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200483 */
Hanno Beckerbd257552021-03-22 06:59:27 +0000484static int ssl_tls12_populate_transform( mbedtls_ssl_transform *transform,
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200485 int ciphersuite,
486 const unsigned char master[48],
Hanno Beckerbd257552021-03-22 06:59:27 +0000487#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC) && \
488 defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200489 int encrypt_then_mac,
Hanno Beckerbd257552021-03-22 06:59:27 +0000490#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC &&
491 MBEDTLS_SSL_SOME_SUITES_USE_MAC */
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200492 ssl_tls_prf_t tls_prf,
493 const unsigned char randbytes[64],
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200494 int minor_ver,
495 unsigned endpoint,
Mateusz Starzyke204dbf2021-03-15 17:57:20 +0100496 const mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +0000497{
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200498 int ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000499 unsigned char keyblk[256];
500 unsigned char *key1;
501 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100502 unsigned char *mac_enc;
503 unsigned char *mac_dec;
sander-visser3888b032020-05-06 21:49:46 +0200504 size_t mac_key_len = 0;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200505 size_t iv_copy_len;
Gilles Peskine88d681c2021-09-01 11:19:33 +0200506 size_t keylen;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000507 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200508 const mbedtls_cipher_info_t *cipher_info;
509 const mbedtls_md_info_t *md_info;
Paul Bakker68884e32013-01-07 18:20:04 +0100510
Przemyslaw Stekielffccda42022-01-11 14:44:01 +0100511#if defined(MBEDTLS_USE_PSA_CRYPTO)
512 psa_key_type_t key_type;
513 psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
514 psa_algorithm_t alg;
515 size_t key_bits;
Przemyslaw Stekield66387f2022-02-03 08:55:33 +0100516 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
Przemyslaw Stekielffccda42022-01-11 14:44:01 +0100517#endif
518
Andrzej Kurek324f72e2021-09-29 04:21:21 -0400519#if !defined(MBEDTLS_DEBUG_C) && \
520 !defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Andrzej Kureka72fe642021-09-29 15:57:30 -0400521 if( ssl->f_export_keys == NULL )
522 {
523 ssl = NULL; /* make sure we don't use it except for these cases */
524 (void) ssl;
525 }
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200526#endif
527
Manuel Pégourié-Gonnard96fb0ee2019-07-09 12:54:17 +0200528 /*
529 * Some data just needs copying into the structure
530 */
Jaeden Amero2de07f12019-06-05 13:32:08 +0100531#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
Hanno Beckerfd86ca82020-11-30 08:54:23 +0000532 defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200533 transform->encrypt_then_mac = encrypt_then_mac;
Hanno Becker9eddaeb2017-12-27 21:37:21 +0000534#endif
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200535 transform->minor_ver = minor_ver;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000536
Manuel Pégourié-Gonnard96fb0ee2019-07-09 12:54:17 +0200537#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
538 memcpy( transform->randbytes, randbytes, sizeof( transform->randbytes ) );
539#endif
540
Ronald Cron6f135e12021-12-08 16:57:54 +0100541#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Hanno Beckerc0da10d2021-04-21 05:32:23 +0100542 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_4 )
543 {
544 /* At the moment, we keep TLS <= 1.2 and TLS 1.3 transform
545 * generation separate. This should never happen. */
546 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
547 }
Ronald Cron6f135e12021-12-08 16:57:54 +0100548#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerc0da10d2021-04-21 05:32:23 +0100549
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200550 /*
551 * Get various info structures
552 */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200553 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuite );
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200554 if( ciphersuite_info == NULL )
555 {
556 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %d not found",
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200557 ciphersuite ) );
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200558 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
559 }
560
Hanno Beckere694c3e2017-12-27 21:34:08 +0000561 cipher_info = mbedtls_cipher_info_from_type( ciphersuite_info->cipher );
Paul Bakker68884e32013-01-07 18:20:04 +0100562 if( cipher_info == NULL )
563 {
Paul Elliott9f352112020-12-09 14:55:45 +0000564 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %u not found",
Hanno Beckere694c3e2017-12-27 21:34:08 +0000565 ciphersuite_info->cipher ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +0100567 }
568
Hanno Beckere694c3e2017-12-27 21:34:08 +0000569 md_info = mbedtls_md_info_from_type( ciphersuite_info->mac );
Paul Bakker68884e32013-01-07 18:20:04 +0100570 if( md_info == NULL )
571 {
Paul Elliott9f352112020-12-09 14:55:45 +0000572 MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_md info for %u not found",
Paul Elliott3891caf2020-12-17 18:42:40 +0000573 (unsigned) ciphersuite_info->mac ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +0100575 }
576
Hanno Beckera0e20d02019-05-15 14:03:01 +0100577#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker4bf74652019-04-26 16:22:27 +0100578 /* Copy own and peer's CID if the use of the CID
579 * extension has been negotiated. */
580 if( ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_ENABLED )
581 {
582 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Copy CIDs into SSL transform" ) );
Hanno Becker8a7f9722019-04-30 13:52:29 +0100583
Hanno Becker05154c32019-05-03 15:23:51 +0100584 transform->in_cid_len = ssl->own_cid_len;
Hanno Becker05154c32019-05-03 15:23:51 +0100585 memcpy( transform->in_cid, ssl->own_cid, ssl->own_cid_len );
Hanno Becker1c1f0462019-05-03 12:55:51 +0100586 MBEDTLS_SSL_DEBUG_BUF( 3, "Incoming CID", transform->in_cid,
Hanno Becker4bf74652019-04-26 16:22:27 +0100587 transform->in_cid_len );
Hanno Beckerd1f20352019-05-15 10:21:55 +0100588
589 transform->out_cid_len = ssl->handshake->peer_cid_len;
590 memcpy( transform->out_cid, ssl->handshake->peer_cid,
591 ssl->handshake->peer_cid_len );
592 MBEDTLS_SSL_DEBUG_BUF( 3, "Outgoing CID", transform->out_cid,
593 transform->out_cid_len );
Hanno Becker4bf74652019-04-26 16:22:27 +0100594 }
Hanno Beckera0e20d02019-05-15 14:03:01 +0100595#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker4bf74652019-04-26 16:22:27 +0100596
Paul Bakker5121ce52009-01-03 21:22:43 +0000597 /*
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200598 * Compute key block using the PRF
Paul Bakker5121ce52009-01-03 21:22:43 +0000599 */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200600 ret = tls_prf( master, 48, "key expansion", randbytes, 64, keyblk, 256 );
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100601 if( ret != 0 )
602 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200603 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100604 return( ret );
605 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000606
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200607 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
Manuel Pégourié-Gonnardd91efa42019-05-20 10:27:20 +0200608 mbedtls_ssl_get_ciphersuite_name( ciphersuite ) ) );
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200609 MBEDTLS_SSL_DEBUG_BUF( 3, "master secret", master, 48 );
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200610 MBEDTLS_SSL_DEBUG_BUF( 4, "random bytes", randbytes, 64 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200611 MBEDTLS_SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000612
Paul Bakker5121ce52009-01-03 21:22:43 +0000613 /*
614 * Determine the appropriate key, IV and MAC length.
615 */
Paul Bakker68884e32013-01-07 18:20:04 +0100616
Gilles Peskinee720dbe2021-07-19 17:37:46 +0200617 keylen = mbedtls_cipher_info_get_key_bitlen( cipher_info ) / 8;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200618
Hanno Becker8031d062018-01-03 15:32:31 +0000619#if defined(MBEDTLS_GCM_C) || \
620 defined(MBEDTLS_CCM_C) || \
621 defined(MBEDTLS_CHACHAPOLY_C)
Gilles Peskinee720dbe2021-07-19 17:37:46 +0200622 if( mbedtls_cipher_info_get_mode( cipher_info ) == MBEDTLS_MODE_GCM ||
623 mbedtls_cipher_info_get_mode( cipher_info ) == MBEDTLS_MODE_CCM ||
624 mbedtls_cipher_info_get_mode( cipher_info ) == MBEDTLS_MODE_CHACHAPOLY )
Paul Bakker5121ce52009-01-03 21:22:43 +0000625 {
Hanno Beckerf704bef2018-11-16 15:21:18 +0000626 size_t explicit_ivlen;
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200627
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200628 transform->maclen = 0;
Hanno Becker81c7b182017-11-09 18:39:33 +0000629 mac_key_len = 0;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000630 transform->taglen =
631 ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200632
Hanno Becker447558d2020-05-28 07:36:33 +0100633 /* All modes haves 96-bit IVs, but the length of the static parts vary
634 * with mode and version:
635 * - For GCM and CCM in TLS 1.2, there's a static IV of 4 Bytes
636 * (to be concatenated with a dynamically chosen IV of 8 Bytes)
Hanno Beckerf93c2d72020-05-28 07:39:43 +0100637 * - For ChaChaPoly in TLS 1.2, and all modes in TLS 1.3, there's
638 * a static IV of 12 Bytes (to be XOR'ed with the 8 Byte record
639 * sequence number).
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200640 */
Paul Bakker68884e32013-01-07 18:20:04 +0100641 transform->ivlen = 12;
Gilles Peskinee720dbe2021-07-19 17:37:46 +0200642 if( mbedtls_cipher_info_get_mode( cipher_info ) == MBEDTLS_MODE_CHACHAPOLY )
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200643 transform->fixed_ivlen = 12;
644 else
Hanno Beckerc0da10d2021-04-21 05:32:23 +0100645 transform->fixed_ivlen = 4;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200646
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200647 /* Minimum length of encrypted record */
648 explicit_ivlen = transform->ivlen - transform->fixed_ivlen;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000649 transform->minlen = explicit_ivlen + transform->taglen;
Paul Bakker68884e32013-01-07 18:20:04 +0100650 }
651 else
Hanno Becker8031d062018-01-03 15:32:31 +0000652#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */
Hanno Beckerfd86ca82020-11-30 08:54:23 +0000653#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Gilles Peskinee720dbe2021-07-19 17:37:46 +0200654 if( mbedtls_cipher_info_get_mode( cipher_info ) == MBEDTLS_MODE_STREAM ||
655 mbedtls_cipher_info_get_mode( cipher_info ) == MBEDTLS_MODE_CBC )
Paul Bakker68884e32013-01-07 18:20:04 +0100656 {
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200657 /* Initialize HMAC contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200658 if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 ||
659 ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 )
Paul Bakker68884e32013-01-07 18:20:04 +0100660 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
Ron Eldore6992702019-05-07 18:27:13 +0300662 goto end;
Paul Bakker68884e32013-01-07 18:20:04 +0100663 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000664
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200665 /* Get MAC length */
Hanno Becker81c7b182017-11-09 18:39:33 +0000666 mac_key_len = mbedtls_md_get_size( md_info );
667 transform->maclen = mac_key_len;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200668
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200669 /* IV length */
Paul Bakker68884e32013-01-07 18:20:04 +0100670 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +0000671
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200672 /* Minimum length */
Gilles Peskinee720dbe2021-07-19 17:37:46 +0200673 if( mbedtls_cipher_info_get_mode( cipher_info ) == MBEDTLS_MODE_STREAM )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200674 transform->minlen = transform->maclen;
675 else
Paul Bakker68884e32013-01-07 18:20:04 +0100676 {
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200677 /*
678 * GenericBlockCipher:
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +0100679 * 1. if EtM is in use: one block plus MAC
680 * otherwise: * first multiple of blocklen greater than maclen
TRodziewicz2abf03c2021-06-25 14:40:09 +0200681 * 2. IV
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200682 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200683#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200684 if( encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED )
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +0100685 {
686 transform->minlen = transform->maclen
687 + cipher_info->block_size;
688 }
689 else
690#endif
691 {
692 transform->minlen = transform->maclen
693 + cipher_info->block_size
694 - transform->maclen % cipher_info->block_size;
695 }
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200696
TRodziewicz0f82ec62021-05-12 17:49:18 +0200697#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
698 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200699 {
700 transform->minlen += transform->ivlen;
701 }
702 else
703#endif
704 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200705 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Ron Eldore6992702019-05-07 18:27:13 +0300706 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
707 goto end;
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200708 }
Paul Bakker68884e32013-01-07 18:20:04 +0100709 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000710 }
Hanno Becker8031d062018-01-03 15:32:31 +0000711 else
Hanno Beckerfd86ca82020-11-30 08:54:23 +0000712#endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
Hanno Becker8031d062018-01-03 15:32:31 +0000713 {
714 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
715 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
716 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000717
Hanno Becker88aaf652017-12-27 08:17:40 +0000718 MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %u, minlen: %u, ivlen: %u, maclen: %u",
719 (unsigned) keylen,
720 (unsigned) transform->minlen,
721 (unsigned) transform->ivlen,
722 (unsigned) transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000723
724 /*
725 * Finally setup the cipher contexts, IVs and MAC secrets.
726 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200727#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200728 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker5121ce52009-01-03 21:22:43 +0000729 {
Hanno Becker81c7b182017-11-09 18:39:33 +0000730 key1 = keyblk + mac_key_len * 2;
Hanno Becker88aaf652017-12-27 08:17:40 +0000731 key2 = keyblk + mac_key_len * 2 + keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000732
Paul Bakker68884e32013-01-07 18:20:04 +0100733 mac_enc = keyblk;
Hanno Becker81c7b182017-11-09 18:39:33 +0000734 mac_dec = keyblk + mac_key_len;
Paul Bakker5121ce52009-01-03 21:22:43 +0000735
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000736 /*
737 * This is not used in TLS v1.1.
738 */
Paul Bakker48916f92012-09-16 19:57:18 +0000739 iv_copy_len = ( transform->fixed_ivlen ) ?
740 transform->fixed_ivlen : transform->ivlen;
Hanno Becker88aaf652017-12-27 08:17:40 +0000741 memcpy( transform->iv_enc, key2 + keylen, iv_copy_len );
742 memcpy( transform->iv_dec, key2 + keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000743 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000744 }
745 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200746#endif /* MBEDTLS_SSL_CLI_C */
747#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200748 if( endpoint == MBEDTLS_SSL_IS_SERVER )
Paul Bakker5121ce52009-01-03 21:22:43 +0000749 {
Hanno Becker88aaf652017-12-27 08:17:40 +0000750 key1 = keyblk + mac_key_len * 2 + keylen;
Hanno Becker81c7b182017-11-09 18:39:33 +0000751 key2 = keyblk + mac_key_len * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000752
Hanno Becker81c7b182017-11-09 18:39:33 +0000753 mac_enc = keyblk + mac_key_len;
Paul Bakker68884e32013-01-07 18:20:04 +0100754 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +0000755
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000756 /*
757 * This is not used in TLS v1.1.
758 */
Paul Bakker48916f92012-09-16 19:57:18 +0000759 iv_copy_len = ( transform->fixed_ivlen ) ?
760 transform->fixed_ivlen : transform->ivlen;
Hanno Becker88aaf652017-12-27 08:17:40 +0000761 memcpy( transform->iv_dec, key1 + keylen, iv_copy_len );
762 memcpy( transform->iv_enc, key1 + keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000763 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000764 }
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +0100765 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200766#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +0100767 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200768 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Ron Eldore6992702019-05-07 18:27:13 +0300769 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
770 goto end;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +0100771 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000772
TRodziewicz4ca18aa2021-05-20 14:46:20 +0200773#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
TRodziewicz0f82ec62021-05-12 17:49:18 +0200774#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
TRodziewicz345165c2021-07-06 13:42:11 +0200775 /* For HMAC-based ciphersuites, initialize the HMAC transforms.
776 For AEAD-based ciphersuites, there is nothing to do here. */
777 if( mac_key_len != 0 )
Paul Bakker68884e32013-01-07 18:20:04 +0100778 {
Gilles Peskineecf6beb2021-12-10 21:35:10 +0100779 ret = mbedtls_md_hmac_starts( &transform->md_ctx_enc, mac_enc, mac_key_len );
780 if( ret != 0 )
781 goto end;
782 ret = mbedtls_md_hmac_starts( &transform->md_ctx_dec, mac_dec, mac_key_len );
783 if( ret != 0 )
784 goto end;
Paul Bakker68884e32013-01-07 18:20:04 +0100785 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200786#endif
Hanno Beckerfd86ca82020-11-30 08:54:23 +0000787#endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
Paul Bakker68884e32013-01-07 18:20:04 +0100788
Hanno Beckerd56ed242018-01-03 15:32:51 +0000789 ((void) mac_dec);
790 ((void) mac_enc);
Paul Bakker05ef8352012-05-08 09:17:57 +0000791
Andrzej Kureka72fe642021-09-29 15:57:30 -0400792 if( ssl != NULL && ssl->f_export_keys != NULL )
Robert Cragie4feb7ae2015-10-02 13:33:37 +0100793 {
Hanno Becker7e6c1782021-06-08 09:24:55 +0100794 ssl->f_export_keys( ssl->p_export_keys,
795 MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET,
796 master, 48,
797 randbytes + 32,
798 randbytes,
799 tls_prf_get_type( tls_prf ) );
Ron Eldorf5cc10d2019-05-07 18:33:40 +0300800 }
Robert Cragie4feb7ae2015-10-02 13:33:37 +0100801
Hanno Beckerf704bef2018-11-16 15:21:18 +0000802#if defined(MBEDTLS_USE_PSA_CRYPTO)
Przemyslaw Stekielf57b4562022-01-25 00:04:18 +0100803 if( ( status = mbedtls_ssl_cipher_to_psa( cipher_info->type,
Przemyslaw Stekielffccda42022-01-11 14:44:01 +0100804 transform->taglen,
805 &alg,
806 &key_type,
807 &key_bits ) ) != PSA_SUCCESS )
808 {
Przemyslaw Stekiel77aec8d2022-01-31 20:22:53 +0100809 ret = psa_ssl_status_to_mbedtls( status );
Przemyslaw Stekielf57b4562022-01-25 00:04:18 +0100810 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_cipher_to_psa", ret );
Przemyslaw Stekielffccda42022-01-11 14:44:01 +0100811 goto end;
812 }
813
Przemyslaw Stekielffccda42022-01-11 14:44:01 +0100814 transform->psa_alg = alg;
815
Przemyslaw Stekielf9cd6082022-02-01 11:25:55 +0100816 if ( alg != MBEDTLS_SSL_NULL_CIPHER )
Przemyslaw Stekielffccda42022-01-11 14:44:01 +0100817 {
Przemyslaw Stekielf9cd6082022-02-01 11:25:55 +0100818 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_ENCRYPT );
819 psa_set_key_algorithm( &attributes, alg );
820 psa_set_key_type( &attributes, key_type );
Przemyslaw Stekielfe7397d2022-01-17 15:47:07 +0100821
Przemyslaw Stekielf9cd6082022-02-01 11:25:55 +0100822 if( ( status = psa_import_key( &attributes,
823 key1,
824 PSA_BITS_TO_BYTES( key_bits ),
825 &transform->psa_key_enc ) ) != PSA_SUCCESS )
826 {
827 MBEDTLS_SSL_DEBUG_RET( 3, "psa_import_key", (int)status );
828 ret = psa_ssl_status_to_mbedtls( status );
829 MBEDTLS_SSL_DEBUG_RET( 1, "psa_import_key", ret );
830 goto end;
831 }
Przemyslaw Stekielfe7397d2022-01-17 15:47:07 +0100832
Przemyslaw Stekielf9cd6082022-02-01 11:25:55 +0100833 psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_DECRYPT );
834
835 if( ( status = psa_import_key( &attributes,
836 key2,
837 PSA_BITS_TO_BYTES( key_bits ),
838 &transform->psa_key_dec ) ) != PSA_SUCCESS )
839 {
840 ret = psa_ssl_status_to_mbedtls( status );
841 MBEDTLS_SSL_DEBUG_RET( 1, "psa_import_key", ret );
842 goto end;
843 }
Przemyslaw Stekielffccda42022-01-11 14:44:01 +0100844 }
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +0100845#else
846 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,
847 cipher_info ) ) != 0 )
848 {
849 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
850 goto end;
851 }
852
853 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec,
854 cipher_info ) ) != 0 )
855 {
856 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
857 goto end;
858 }
859
860 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1,
861 (int) mbedtls_cipher_info_get_key_bitlen( cipher_info ),
862 MBEDTLS_ENCRYPT ) ) != 0 )
863 {
864 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
865 goto end;
866 }
867
868 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2,
869 (int) mbedtls_cipher_info_get_key_bitlen( cipher_info ),
870 MBEDTLS_DECRYPT ) ) != 0 )
871 {
872 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
873 goto end;
874 }
Przemyslaw Stekielffccda42022-01-11 14:44:01 +0100875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200876#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskinee720dbe2021-07-19 17:37:46 +0200877 if( mbedtls_cipher_info_get_mode( cipher_info ) == MBEDTLS_MODE_CBC )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200878 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200879 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc,
880 MBEDTLS_PADDING_NONE ) ) != 0 )
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +0200881 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200882 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
Ron Eldore6992702019-05-07 18:27:13 +0300883 goto end;
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +0200884 }
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200885
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200886 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec,
887 MBEDTLS_PADDING_NONE ) ) != 0 )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200888 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200889 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
Ron Eldore6992702019-05-07 18:27:13 +0300890 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200891 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000892 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200893#endif /* MBEDTLS_CIPHER_MODE_CBC */
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +0100894#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000895
Ron Eldore6992702019-05-07 18:27:13 +0300896end:
Ron Eldora9f9a732019-05-07 18:29:02 +0300897 mbedtls_platform_zeroize( keyblk, sizeof( keyblk ) );
Ron Eldore6992702019-05-07 18:27:13 +0300898 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000899}
Jerry Yu53d23e22022-02-09 16:25:09 +0800900#endif /* MBEDTLS_SSL_PROTO_TLS1_2 || MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Paul Bakker5121ce52009-01-03 21:22:43 +0000901
Jerry Yuc73c6182022-02-08 20:29:25 +0800902#if defined(MBEDTLS_X509_CRT_PARSE_C)
903static void ssl_clear_peer_cert( mbedtls_ssl_session *session )
904{
905#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
906 if( session->peer_cert != NULL )
907 {
908 mbedtls_x509_crt_free( session->peer_cert );
909 mbedtls_free( session->peer_cert );
910 session->peer_cert = NULL;
911 }
912#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
913 if( session->peer_cert_digest != NULL )
914 {
915 /* Zeroization is not necessary. */
916 mbedtls_free( session->peer_cert_digest );
917 session->peer_cert_digest = NULL;
918 session->peer_cert_digest_type = MBEDTLS_MD_NONE;
919 session->peer_cert_digest_len = 0;
920 }
921#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
922}
923#endif /* MBEDTLS_X509_CRT_PARSE_C */
924
925void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl,
926 const mbedtls_ssl_ciphersuite_t *ciphersuite_info )
927{
928 ((void) ciphersuite_info);
929
930#if defined(MBEDTLS_SHA384_C)
931 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
932 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
933 else
934#endif
935#if defined(MBEDTLS_SHA256_C)
936 if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 )
937 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
938 else
939#endif
940 {
941 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
942 return;
943 }
944}
945
946void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl )
947{
948 ((void) ssl);
949#if defined(MBEDTLS_SHA256_C)
950#if defined(MBEDTLS_USE_PSA_CRYPTO)
951 psa_hash_abort( &ssl->handshake->fin_sha256_psa );
952 psa_hash_setup( &ssl->handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
953#else
954 mbedtls_sha256_starts( &ssl->handshake->fin_sha256, 0 );
955#endif
956#endif
957#if defined(MBEDTLS_SHA384_C)
958#if defined(MBEDTLS_USE_PSA_CRYPTO)
959 psa_hash_abort( &ssl->handshake->fin_sha384_psa );
960 psa_hash_setup( &ssl->handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
961#else
962 mbedtls_sha512_starts( &ssl->handshake->fin_sha512, 1 );
963#endif
964#endif
965}
966
967static void ssl_update_checksum_start( mbedtls_ssl_context *ssl,
968 const unsigned char *buf, size_t len )
969{
970#if defined(MBEDTLS_SHA256_C)
971#if defined(MBEDTLS_USE_PSA_CRYPTO)
972 psa_hash_update( &ssl->handshake->fin_sha256_psa, buf, len );
973#else
974 mbedtls_sha256_update( &ssl->handshake->fin_sha256, buf, len );
975#endif
976#endif
977#if defined(MBEDTLS_SHA384_C)
978#if defined(MBEDTLS_USE_PSA_CRYPTO)
979 psa_hash_update( &ssl->handshake->fin_sha384_psa, buf, len );
980#else
981 mbedtls_sha512_update( &ssl->handshake->fin_sha512, buf, len );
982#endif
983#endif
984}
985
986#if defined(MBEDTLS_SHA256_C)
987static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl,
988 const unsigned char *buf, size_t len )
989{
990#if defined(MBEDTLS_USE_PSA_CRYPTO)
991 psa_hash_update( &ssl->handshake->fin_sha256_psa, buf, len );
992#else
993 mbedtls_sha256_update( &ssl->handshake->fin_sha256, buf, len );
994#endif
995}
996#endif
997
998#if defined(MBEDTLS_SHA384_C)
999static void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl,
1000 const unsigned char *buf, size_t len )
1001{
1002#if defined(MBEDTLS_USE_PSA_CRYPTO)
1003 psa_hash_update( &ssl->handshake->fin_sha384_psa, buf, len );
1004#else
1005 mbedtls_sha512_update( &ssl->handshake->fin_sha512, buf, len );
1006#endif
1007}
1008#endif
1009
Jerry Yubef175d2022-01-28 10:52:05 +08001010#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001011
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00001012void mbedtls_ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00001013{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001014 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup: final free" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00001015
1016 /*
1017 * Free our handshake params
1018 */
Gilles Peskine9b562d52018-04-25 20:32:43 +02001019 mbedtls_ssl_handshake_free( ssl );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001020 mbedtls_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00001021 ssl->handshake = NULL;
1022
1023 /*
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001024 * Free the previous transform and swith in the current one
Paul Bakker48916f92012-09-16 19:57:18 +00001025 */
1026 if( ssl->transform )
1027 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028 mbedtls_ssl_transform_free( ssl->transform );
1029 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00001030 }
1031 ssl->transform = ssl->transform_negotiate;
1032 ssl->transform_negotiate = NULL;
1033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001034 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup: final free" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001035}
1036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001037void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001038{
1039 int resume = ssl->handshake->resume;
1040
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001043#if defined(MBEDTLS_SSL_RENEGOTIATION)
1044 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001045 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001046 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE;
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001047 ssl->renego_records_seen = 0;
1048 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001049#endif
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001050
1051 /*
1052 * Free the previous session and switch in the current one
1053 */
Paul Bakker0a597072012-09-25 21:55:46 +00001054 if( ssl->session )
1055 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001056#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard1a034732014-11-04 17:36:18 +01001057 /* RFC 7366 3.1: keep the EtM state */
1058 ssl->session_negotiate->encrypt_then_mac =
1059 ssl->session->encrypt_then_mac;
1060#endif
1061
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001062 mbedtls_ssl_session_free( ssl->session );
1063 mbedtls_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00001064 }
1065 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00001066 ssl->session_negotiate = NULL;
1067
Paul Bakker0a597072012-09-25 21:55:46 +00001068 /*
1069 * Add cache entry
1070 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001071 if( ssl->conf->f_set_cache != NULL &&
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001072 ssl->session->id_len != 0 &&
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02001073 resume == 0 )
1074 {
Hanno Beckerccdaf6e2021-04-15 09:26:17 +01001075 if( ssl->conf->f_set_cache( ssl->conf->p_cache,
1076 ssl->session->id,
1077 ssl->session->id_len,
1078 ssl->session ) != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001079 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02001080 }
Paul Bakker0a597072012-09-25 21:55:46 +00001081
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001082#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001083 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001084 ssl->handshake->flight != NULL )
1085 {
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02001086 /* Cancel handshake timer */
Hanno Becker0f57a652020-02-05 10:37:26 +00001087 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02001088
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001089 /* Keep last flight around in case we need to resend it:
1090 * we need the handshake and transform structures for that */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip freeing handshake and transform" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001092 }
1093 else
1094#endif
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00001095 mbedtls_ssl_handshake_wrapup_free_hs_transform( ssl );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02001096
Paul Bakker48916f92012-09-16 19:57:18 +00001097 ssl->state++;
1098
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001099 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00001100}
1101
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001102int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001103{
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02001104 int ret, hash_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00001107
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00001108 mbedtls_ssl_update_out_pointers( ssl, ssl->transform_negotiate );
Paul Bakker92be97b2013-01-02 17:30:03 +01001109
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001110 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00001111
Manuel Pégourié-Gonnard214a8482016-02-22 11:27:26 +01001112 /*
1113 * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites
1114 * may define some other value. Currently (early 2016), no defined
1115 * ciphersuite does this (and this is unlikely to change as activity has
1116 * moved to TLS 1.3 now) so we can keep the hardcoded 12 here.
1117 */
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01001118 hash_len = 12;
Paul Bakker5121ce52009-01-03 21:22:43 +00001119
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001120#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001121 ssl->verify_data_len = hash_len;
1122 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001123#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001124
Paul Bakker5121ce52009-01-03 21:22:43 +00001125 ssl->out_msglen = 4 + hash_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001126 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
1127 ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED;
Paul Bakker5121ce52009-01-03 21:22:43 +00001128
1129 /*
1130 * In case of session resuming, invert the client and server
1131 * ChangeCipherSpec messages order.
1132 */
Paul Bakker0a597072012-09-25 21:55:46 +00001133 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001134 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001135#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001136 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001137 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001138#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001139#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001140 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001141 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001142#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001143 }
1144 else
1145 ssl->state++;
1146
Paul Bakker48916f92012-09-16 19:57:18 +00001147 /*
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001148 * Switch to our negotiated transform and session parameters for outbound
1149 * data.
Paul Bakker48916f92012-09-16 19:57:18 +00001150 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001151 MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
Manuel Pégourié-Gonnard5afb1672014-02-16 18:33:22 +01001152
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001153#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001154 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02001155 {
1156 unsigned char i;
1157
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001158 /* Remember current epoch settings for resending */
1159 ssl->handshake->alt_transform_out = ssl->transform_out;
Jerry Yud9a94fe2021-09-28 18:58:59 +08001160 memcpy( ssl->handshake->alt_out_ctr, ssl->cur_out_ctr,
Jerry Yud96a5c22021-09-29 17:46:51 +08001161 sizeof( ssl->handshake->alt_out_ctr ) );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001162
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02001163 /* Set sequence_number to zero */
Jerry Yufd320e92021-10-08 21:52:41 +08001164 memset( &ssl->cur_out_ctr[2], 0, sizeof( ssl->cur_out_ctr ) - 2 );
Jerry Yud9a94fe2021-09-28 18:58:59 +08001165
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02001166
1167 /* Increment epoch */
1168 for( i = 2; i > 0; i-- )
Hanno Becker19859472018-08-06 09:40:20 +01001169 if( ++ssl->cur_out_ctr[i - 1] != 0 )
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02001170 break;
1171
1172 /* The loop goes to its end iff the counter is wrapping */
1173 if( i == 0 )
1174 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001175 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) );
1176 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02001177 }
1178 }
1179 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001180#endif /* MBEDTLS_SSL_PROTO_DTLS */
Jerry Yufd320e92021-10-08 21:52:41 +08001181 memset( ssl->cur_out_ctr, 0, sizeof( ssl->cur_out_ctr ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001182
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001183 ssl->transform_out = ssl->transform_negotiate;
1184 ssl->session_out = ssl->session_negotiate;
1185
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001186#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001187 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001188 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02001189#endif
1190
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02001191 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001192 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02001193 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001194 return( ret );
1195 }
1196
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02001197#if defined(MBEDTLS_SSL_PROTO_DTLS)
1198 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
1199 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
1200 {
1201 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
1202 return( ret );
1203 }
1204#endif
1205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001206 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001207
1208 return( 0 );
1209}
1210
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00001211#define SSL_MAX_HASH_LEN 12
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00001212
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001213int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001214{
Janos Follath865b3eb2019-12-16 11:46:15 +00001215 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskinea4174312021-12-13 14:38:40 +01001216 unsigned int hash_len = 12;
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00001217 unsigned char buf[SSL_MAX_HASH_LEN];
Paul Bakker5121ce52009-01-03 21:22:43 +00001218
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001219 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001220
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001221 ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001222
Hanno Becker327c93b2018-08-15 13:56:18 +01001223 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001224 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001225 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Gilles Peskinef0fd4c32021-12-13 12:36:15 +01001226 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001227 }
1228
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001229 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001230 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001231 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001232 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1233 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Gilles Peskinef0fd4c32021-12-13 12:36:15 +01001234 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
1235 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001236 }
1237
Hanno Beckera0ca87e2021-06-24 10:27:37 +01001238 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED )
1239 {
1240 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1241 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Gilles Peskinef0fd4c32021-12-13 12:36:15 +01001242 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
1243 goto exit;
Hanno Beckera0ca87e2021-06-24 10:27:37 +01001244 }
1245
1246 if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len )
Paul Bakker5121ce52009-01-03 21:22:43 +00001247 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001248 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001249 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1250 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Gilles Peskinef0fd4c32021-12-13 12:36:15 +01001251 ret = MBEDTLS_ERR_SSL_DECODE_ERROR;
1252 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001253 }
1254
Gabor Mezei90437e32021-10-20 11:59:27 +02001255 if( mbedtls_ct_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ),
Manuel Pégourié-Gonnard4abc3272014-09-10 12:02:46 +00001256 buf, hash_len ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001257 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001258 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001259 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Dave Rodgman43fcb8d2021-06-28 21:49:15 +01001260 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );
Gilles Peskinef0fd4c32021-12-13 12:36:15 +01001261 ret = MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1262 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00001263 }
1264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001265#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001266 ssl->verify_data_len = hash_len;
1267 memcpy( ssl->peer_verify_data, buf, hash_len );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001268#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001269
Paul Bakker0a597072012-09-25 21:55:46 +00001270 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001271 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001272#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001273 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001274 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001275#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001276#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001277 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001278 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001279#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001280 }
1281 else
1282 ssl->state++;
1283
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001284#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001285 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001286 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001287#endif
1288
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001289 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001290
Gilles Peskinef0fd4c32021-12-13 12:36:15 +01001291exit:
1292 mbedtls_platform_zeroize( buf, hash_len );
1293 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001294}
1295
Jerry Yuc73c6182022-02-08 20:29:25 +08001296#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1297
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001298static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001299{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001300 memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001301
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001302#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05001303#if defined(MBEDTLS_USE_PSA_CRYPTO)
1304 handshake->fin_sha256_psa = psa_hash_operation_init();
1305 psa_hash_setup( &handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
1306#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001307 mbedtls_sha256_init( &handshake->fin_sha256 );
TRodziewicz26371e42021-06-08 16:45:41 +02001308 mbedtls_sha256_starts( &handshake->fin_sha256, 0 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001309#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05001310#endif
Mateusz Starzykc6d94ab2021-05-19 13:31:59 +02001311#if defined(MBEDTLS_SHA384_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05001312#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05001313 handshake->fin_sha384_psa = psa_hash_operation_init();
1314 psa_hash_setup( &handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001315#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001316 mbedtls_sha512_init( &handshake->fin_sha512 );
TRodziewicz26371e42021-06-08 16:45:41 +02001317 mbedtls_sha512_starts( &handshake->fin_sha512, 1 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001318#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05001319#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001320
1321 handshake->update_checksum = ssl_update_checksum_start;
Hanno Becker7e5437a2017-04-28 17:15:26 +01001322
1323#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01001324 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01001325 mbedtls_ssl_sig_hash_set_init( &handshake->hash_algs );
1326#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001327
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001328#if defined(MBEDTLS_DHM_C)
1329 mbedtls_dhm_init( &handshake->dhm_ctx );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001330#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001331#if defined(MBEDTLS_ECDH_C)
1332 mbedtls_ecdh_init( &handshake->ecdh_ctx );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001333#endif
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02001334#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02001335 mbedtls_ecjpake_init( &handshake->ecjpake_ctx );
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02001336#if defined(MBEDTLS_SSL_CLI_C)
1337 handshake->ecjpake_cache = NULL;
1338 handshake->ecjpake_cache_len = 0;
1339#endif
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02001340#endif
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02001341
Gilles Peskineeccd8882020-03-10 12:19:08 +01001342#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard6b7301c2017-08-15 12:08:45 +02001343 mbedtls_x509_crt_restart_init( &handshake->ecrs_ctx );
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02001344#endif
1345
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02001346#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1347 handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
1348#endif
Hanno Becker75173122019-02-06 16:18:31 +00001349
1350#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
1351 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1352 mbedtls_pk_init( &handshake->peer_pubkey );
1353#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001354}
1355
Hanno Beckera18d1322018-01-03 14:27:32 +00001356void mbedtls_ssl_transform_init( mbedtls_ssl_transform *transform )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001357{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001358 memset( transform, 0, sizeof(mbedtls_ssl_transform) );
Paul Bakker84bbeb52014-07-01 14:53:22 +02001359
Przemyslaw Stekiel8f80fb92022-01-11 08:28:13 +01001360#if defined(MBEDTLS_USE_PSA_CRYPTO)
1361 transform->psa_key_enc = MBEDTLS_SVC_KEY_ID_INIT;
1362 transform->psa_key_dec = MBEDTLS_SVC_KEY_ID_INIT;
Przemyslaw Stekiel6be9cf52022-01-19 16:00:22 +01001363#else
1364 mbedtls_cipher_init( &transform->cipher_ctx_enc );
1365 mbedtls_cipher_init( &transform->cipher_ctx_dec );
Przemyslaw Stekiel8f80fb92022-01-11 08:28:13 +01001366#endif
1367
Hanno Beckerfd86ca82020-11-30 08:54:23 +00001368#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001369 mbedtls_md_init( &transform->md_ctx_enc );
1370 mbedtls_md_init( &transform->md_ctx_dec );
Hanno Beckerd56ed242018-01-03 15:32:51 +00001371#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001372}
1373
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001374void mbedtls_ssl_session_init( mbedtls_ssl_session *session )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001375{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001376 memset( session, 0, sizeof(mbedtls_ssl_session) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001377}
1378
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001379static int ssl_handshake_init( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00001380{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001381 /* Clear old handshake information if present */
Paul Bakker48916f92012-09-16 19:57:18 +00001382 if( ssl->transform_negotiate )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001383 mbedtls_ssl_transform_free( ssl->transform_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001384 if( ssl->session_negotiate )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001385 mbedtls_ssl_session_free( ssl->session_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001386 if( ssl->handshake )
Gilles Peskine9b562d52018-04-25 20:32:43 +02001387 mbedtls_ssl_handshake_free( ssl );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001388
1389 /*
1390 * Either the pointers are now NULL or cleared properly and can be freed.
1391 * Now allocate missing structures.
1392 */
1393 if( ssl->transform_negotiate == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02001394 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001395 ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02001396 }
Paul Bakker48916f92012-09-16 19:57:18 +00001397
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001398 if( ssl->session_negotiate == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02001399 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001400 ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02001401 }
Paul Bakker48916f92012-09-16 19:57:18 +00001402
Paul Bakker82788fb2014-10-20 13:59:19 +02001403 if( ssl->handshake == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02001404 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001405 ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02001406 }
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001407#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1408 /* If the buffers are too small - reallocate */
Andrzej Kurek8ea68722020-04-03 06:40:47 -04001409
Andrzej Kurek4a063792020-10-21 15:08:44 +02001410 handle_buffer_resizing( ssl, 0, MBEDTLS_SSL_IN_BUFFER_LEN,
1411 MBEDTLS_SSL_OUT_BUFFER_LEN );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05001412#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001413
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001414 /* All pointers should exist and can be directly freed without issue */
Paul Bakker48916f92012-09-16 19:57:18 +00001415 if( ssl->handshake == NULL ||
1416 ssl->transform_negotiate == NULL ||
1417 ssl->session_negotiate == NULL )
1418 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02001419 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc() of ssl sub-contexts failed" ) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001420
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001421 mbedtls_free( ssl->handshake );
1422 mbedtls_free( ssl->transform_negotiate );
1423 mbedtls_free( ssl->session_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001424
1425 ssl->handshake = NULL;
1426 ssl->transform_negotiate = NULL;
1427 ssl->session_negotiate = NULL;
1428
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02001429 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker48916f92012-09-16 19:57:18 +00001430 }
1431
Paul Bakkeraccaffe2014-06-26 13:37:14 +02001432 /* Initialize structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001433 mbedtls_ssl_session_init( ssl->session_negotiate );
Hanno Beckera18d1322018-01-03 14:27:32 +00001434 mbedtls_ssl_transform_init( ssl->transform_negotiate );
Paul Bakker968afaa2014-07-09 11:09:24 +02001435 ssl_handshake_params_init( ssl->handshake );
1436
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001437#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02001438 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
1439 {
1440 ssl->handshake->alt_transform_out = ssl->transform_out;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001441
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02001442 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
1443 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
1444 else
1445 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02001446
Hanno Becker0f57a652020-02-05 10:37:26 +00001447 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02001448 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001449#endif
1450
Brett Warrene0edc842021-08-17 09:53:13 +01001451/*
1452 * curve_list is translated to IANA TLS group identifiers here because
1453 * mbedtls_ssl_conf_curves returns void and so can't return
1454 * any error codes.
1455 */
1456#if defined(MBEDTLS_ECP_C)
1457#if !defined(MBEDTLS_DEPRECATED_REMOVED)
1458 /* Heap allocate and translate curve_list from internal to IANA group ids */
1459 if ( ssl->conf->curve_list != NULL )
1460 {
1461 size_t length;
1462 const mbedtls_ecp_group_id *curve_list = ssl->conf->curve_list;
1463
1464 for( length = 0; ( curve_list[length] != MBEDTLS_ECP_DP_NONE ) &&
1465 ( length < MBEDTLS_ECP_DP_MAX ); length++ ) {}
1466
1467 /* Leave room for zero termination */
1468 uint16_t *group_list = mbedtls_calloc( length + 1, sizeof(uint16_t) );
1469 if ( group_list == NULL )
1470 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
1471
1472 for( size_t i = 0; i < length; i++ )
1473 {
1474 const mbedtls_ecp_curve_info *info =
1475 mbedtls_ecp_curve_info_from_grp_id( curve_list[i] );
1476 if ( info == NULL )
1477 {
1478 mbedtls_free( group_list );
1479 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
1480 }
1481 group_list[i] = info->tls_id;
1482 }
1483
1484 group_list[length] = 0;
1485
1486 ssl->handshake->group_list = group_list;
1487 ssl->handshake->group_list_heap_allocated = 1;
1488 }
1489 else
1490 {
1491 ssl->handshake->group_list = ssl->conf->group_list;
1492 ssl->handshake->group_list_heap_allocated = 0;
1493 }
1494#endif /* MBEDTLS_DEPRECATED_REMOVED */
1495#endif /* MBEDTLS_ECP_C */
1496
Jerry Yuf017ee42022-01-12 15:49:48 +08001497#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
1498#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Jerry Yua69269a2022-01-17 21:06:01 +08001499#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yu713013f2022-01-17 18:16:35 +08001500 /* Heap allocate and translate sig_hashes from internal hash identifiers to
1501 signature algorithms IANA identifiers. */
1502 if ( mbedtls_ssl_conf_is_tls12_only( ssl->conf ) &&
Jerry Yuf017ee42022-01-12 15:49:48 +08001503 ssl->conf->sig_hashes != NULL )
1504 {
1505 const int *md;
1506 const int *sig_hashes = ssl->conf->sig_hashes;
Jerry Yub476a442022-01-21 18:14:45 +08001507 size_t sig_algs_len = 0;
Jerry Yuf017ee42022-01-12 15:49:48 +08001508 uint16_t *p;
1509
Jerry Yub476a442022-01-21 18:14:45 +08001510#if defined(static_assert)
1511 static_assert( MBEDTLS_SSL_MAX_SIG_ALG_LIST_LEN
1512 <= ( SIZE_MAX - ( 2 * sizeof(uint16_t) ) ),
1513 "MBEDTLS_SSL_MAX_SIG_ALG_LIST_LEN too big" );
Jerry Yua68dca22022-01-20 16:28:27 +08001514#endif
1515
Jerry Yuf017ee42022-01-12 15:49:48 +08001516 for( md = sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
1517 {
1518 if( mbedtls_ssl_hash_from_md_alg( *md ) == MBEDTLS_SSL_HASH_NONE )
1519 continue;
Jerry Yub476a442022-01-21 18:14:45 +08001520#if defined(MBEDTLS_ECDSA_C)
1521 sig_algs_len += sizeof( uint16_t );
1522#endif
Jerry Yua68dca22022-01-20 16:28:27 +08001523
Jerry Yub476a442022-01-21 18:14:45 +08001524#if defined(MBEDTLS_RSA_C)
1525 sig_algs_len += sizeof( uint16_t );
1526#endif
1527 if( sig_algs_len > MBEDTLS_SSL_MAX_SIG_ALG_LIST_LEN )
1528 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
Jerry Yuf017ee42022-01-12 15:49:48 +08001529 }
1530
Jerry Yub476a442022-01-21 18:14:45 +08001531 if( sig_algs_len < MBEDTLS_SSL_MIN_SIG_ALG_LIST_LEN )
Jerry Yuf017ee42022-01-12 15:49:48 +08001532 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
1533
Jerry Yub476a442022-01-21 18:14:45 +08001534 ssl->handshake->sig_algs = mbedtls_calloc( 1, sig_algs_len +
1535 sizeof( uint16_t ));
Jerry Yuf017ee42022-01-12 15:49:48 +08001536 if( ssl->handshake->sig_algs == NULL )
1537 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
1538
1539 p = (uint16_t *)ssl->handshake->sig_algs;
1540 for( md = sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
1541 {
1542 unsigned char hash = mbedtls_ssl_hash_from_md_alg( *md );
1543 if( hash == MBEDTLS_SSL_HASH_NONE )
1544 continue;
Jerry Yu6106fdc2022-01-12 16:36:14 +08001545#if defined(MBEDTLS_ECDSA_C)
Jerry Yuf017ee42022-01-12 15:49:48 +08001546 *p = (( hash << 8 ) | MBEDTLS_SSL_SIG_ECDSA);
1547 p++;
Jerry Yu6106fdc2022-01-12 16:36:14 +08001548#endif
1549#if defined(MBEDTLS_RSA_C)
Jerry Yuf017ee42022-01-12 15:49:48 +08001550 *p = (( hash << 8 ) | MBEDTLS_SSL_SIG_RSA);
1551 p++;
Jerry Yu6106fdc2022-01-12 16:36:14 +08001552#endif
Jerry Yuf017ee42022-01-12 15:49:48 +08001553 }
1554 *p = MBEDTLS_TLS1_3_SIG_NONE;
1555 ssl->handshake->sig_algs_heap_allocated = 1;
1556 }
1557 else
Jerry Yua69269a2022-01-17 21:06:01 +08001558#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Jerry Yuf017ee42022-01-12 15:49:48 +08001559 {
1560 ssl->handshake->sig_algs = ssl->conf->sig_algs;
1561 ssl->handshake->sig_algs_heap_allocated = 0;
1562 }
1563#endif /* MBEDTLS_DEPRECATED_REMOVED */
1564#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker48916f92012-09-16 19:57:18 +00001565 return( 0 );
1566}
1567
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02001568#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001569/* Dummy cookie callbacks for defaults */
1570static int ssl_cookie_write_dummy( void *ctx,
1571 unsigned char **p, unsigned char *end,
1572 const unsigned char *cli_id, size_t cli_id_len )
1573{
1574 ((void) ctx);
1575 ((void) p);
1576 ((void) end);
1577 ((void) cli_id);
1578 ((void) cli_id_len);
1579
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001580 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001581}
1582
1583static int ssl_cookie_check_dummy( void *ctx,
1584 const unsigned char *cookie, size_t cookie_len,
1585 const unsigned char *cli_id, size_t cli_id_len )
1586{
1587 ((void) ctx);
1588 ((void) cookie);
1589 ((void) cookie_len);
1590 ((void) cli_id);
1591 ((void) cli_id_len);
1592
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001593 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001594}
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02001595#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02001596
Paul Bakker5121ce52009-01-03 21:22:43 +00001597/*
1598 * Initialize an SSL context
1599 */
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02001600void mbedtls_ssl_init( mbedtls_ssl_context *ssl )
1601{
1602 memset( ssl, 0, sizeof( mbedtls_ssl_context ) );
1603}
1604
Jerry Yu60835a82021-08-04 10:13:52 +08001605static int ssl_conf_version_check( const mbedtls_ssl_context *ssl )
1606{
Ronald Cron6f135e12021-12-08 16:57:54 +01001607#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu60835a82021-08-04 10:13:52 +08001608 if( mbedtls_ssl_conf_is_tls13_only( ssl->conf ) )
1609 {
1610 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
1611 {
1612 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS 1.3 is not yet supported" ) );
1613 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
1614 }
1615 MBEDTLS_SSL_DEBUG_MSG( 4, ( "The SSL configuration is tls13 only." ) );
1616 return( 0 );
1617 }
1618#endif
1619
1620#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1621 if( mbedtls_ssl_conf_is_tls12_only( ssl->conf ) )
1622 {
1623 MBEDTLS_SSL_DEBUG_MSG( 4, ( "The SSL configuration is tls12 only." ) );
1624 return( 0 );
1625 }
1626#endif
1627
Ronald Cron6f135e12021-12-08 16:57:54 +01001628#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yu60835a82021-08-04 10:13:52 +08001629 if( mbedtls_ssl_conf_is_hybrid_tls12_tls13( ssl->conf ) )
1630 {
1631 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Hybrid TLS 1.2 + TLS 1.3 configurations are not yet supported" ) );
1632 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
1633 }
1634#endif
1635
1636 MBEDTLS_SSL_DEBUG_MSG( 1, ( "The SSL configuration is invalid." ) );
1637 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
1638}
1639
1640static int ssl_conf_check(const mbedtls_ssl_context *ssl)
1641{
1642 int ret;
1643 ret = ssl_conf_version_check( ssl );
1644 if( ret != 0 )
1645 return( ret );
1646
1647 /* Space for further checks */
1648
1649 return( 0 );
1650}
1651
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02001652/*
1653 * Setup an SSL context
1654 */
Hanno Becker2a43f6f2018-08-10 11:12:52 +01001655
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02001656int mbedtls_ssl_setup( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +02001657 const mbedtls_ssl_config *conf )
Paul Bakker5121ce52009-01-03 21:22:43 +00001658{
Janos Follath865b3eb2019-12-16 11:46:15 +00001659 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Darryl Greenb33cc762019-11-28 14:29:44 +00001660 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
1661 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
Paul Bakker5121ce52009-01-03 21:22:43 +00001662
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02001663 ssl->conf = conf;
Paul Bakker62f2dee2012-09-28 07:31:51 +00001664
Jerry Yu60835a82021-08-04 10:13:52 +08001665 if( ( ret = ssl_conf_check( ssl ) ) != 0 )
1666 return( ret );
1667
Paul Bakker62f2dee2012-09-28 07:31:51 +00001668 /*
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01001669 * Prepare base structures
Paul Bakker62f2dee2012-09-28 07:31:51 +00001670 */
k-stachowiakc9a5f022018-07-24 13:53:31 +02001671
1672 /* Set to NULL in case of an error condition */
1673 ssl->out_buf = NULL;
k-stachowiaka47911c2018-07-04 17:41:58 +02001674
Darryl Greenb33cc762019-11-28 14:29:44 +00001675#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1676 ssl->in_buf_len = in_buf_len;
1677#endif
1678 ssl->in_buf = mbedtls_calloc( 1, in_buf_len );
Angus Grattond8213d02016-05-25 20:56:48 +10001679 if( ssl->in_buf == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001680 {
Paul Elliottd48d5c62021-01-07 14:47:05 +00001681 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", in_buf_len ) );
k-stachowiak9f7798e2018-07-31 16:52:32 +02001682 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02001683 goto error;
Angus Grattond8213d02016-05-25 20:56:48 +10001684 }
1685
Darryl Greenb33cc762019-11-28 14:29:44 +00001686#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1687 ssl->out_buf_len = out_buf_len;
1688#endif
1689 ssl->out_buf = mbedtls_calloc( 1, out_buf_len );
Angus Grattond8213d02016-05-25 20:56:48 +10001690 if( ssl->out_buf == NULL )
1691 {
Paul Elliottd48d5c62021-01-07 14:47:05 +00001692 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", out_buf_len ) );
k-stachowiak9f7798e2018-07-31 16:52:32 +02001693 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02001694 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00001695 }
1696
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00001697 mbedtls_ssl_reset_in_out_pointers( ssl );
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02001698
Johan Pascalb62bb512015-12-03 21:56:45 +01001699#if defined(MBEDTLS_SSL_DTLS_SRTP)
Ron Eldor3adb9922017-12-21 10:15:08 +02001700 memset( &ssl->dtls_srtp_info, 0, sizeof(ssl->dtls_srtp_info) );
Johan Pascalb62bb512015-12-03 21:56:45 +01001701#endif
1702
Paul Bakker48916f92012-09-16 19:57:18 +00001703 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
k-stachowiaka47911c2018-07-04 17:41:58 +02001704 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00001705
1706 return( 0 );
k-stachowiaka47911c2018-07-04 17:41:58 +02001707
1708error:
1709 mbedtls_free( ssl->in_buf );
1710 mbedtls_free( ssl->out_buf );
1711
1712 ssl->conf = NULL;
1713
Darryl Greenb33cc762019-11-28 14:29:44 +00001714#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1715 ssl->in_buf_len = 0;
1716 ssl->out_buf_len = 0;
1717#endif
k-stachowiaka47911c2018-07-04 17:41:58 +02001718 ssl->in_buf = NULL;
1719 ssl->out_buf = NULL;
1720
1721 ssl->in_hdr = NULL;
1722 ssl->in_ctr = NULL;
1723 ssl->in_len = NULL;
1724 ssl->in_iv = NULL;
1725 ssl->in_msg = NULL;
1726
1727 ssl->out_hdr = NULL;
1728 ssl->out_ctr = NULL;
1729 ssl->out_len = NULL;
1730 ssl->out_iv = NULL;
1731 ssl->out_msg = NULL;
1732
k-stachowiak9f7798e2018-07-31 16:52:32 +02001733 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001734}
1735
1736/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00001737 * Reset an initialized and used SSL context for re-use while retaining
1738 * all application-set variables, function pointers and data.
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02001739 *
1740 * If partial is non-zero, keep data in the input buffer and client ID.
1741 * (Use when a DTLS client reconnects from the same port.)
Paul Bakker7eb013f2011-10-06 12:37:39 +00001742 */
XiaokangQian78b1fa72022-01-19 06:56:30 +00001743void mbedtls_ssl_session_reset_msg_layer( mbedtls_ssl_context *ssl,
1744 int partial )
Paul Bakker7eb013f2011-10-06 12:37:39 +00001745{
Darryl Greenb33cc762019-11-28 14:29:44 +00001746#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
1747 size_t in_buf_len = ssl->in_buf_len;
1748 size_t out_buf_len = ssl->out_buf_len;
1749#else
1750 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
1751 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
1752#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001753
Hanno Beckerb0302c42021-08-03 09:39:42 +01001754#if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || !defined(MBEDTLS_SSL_SRV_C)
1755 partial = 0;
Hanno Becker7e772132018-08-10 12:38:21 +01001756#endif
1757
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02001758 /* Cancel any possibly running timer */
Hanno Becker0f57a652020-02-05 10:37:26 +00001759 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02001760
Hanno Beckerb0302c42021-08-03 09:39:42 +01001761 mbedtls_ssl_reset_in_out_pointers( ssl );
1762
1763 /* Reset incoming message parsing */
1764 ssl->in_offt = NULL;
1765 ssl->nb_zero = 0;
1766 ssl->in_msgtype = 0;
1767 ssl->in_msglen = 0;
1768 ssl->in_hslen = 0;
1769 ssl->keep_current_message = 0;
1770 ssl->transform_in = NULL;
1771
1772#if defined(MBEDTLS_SSL_PROTO_DTLS)
1773 ssl->next_record_offset = 0;
1774 ssl->in_epoch = 0;
1775#endif
1776
1777 /* Keep current datagram if partial == 1 */
1778 if( partial == 0 )
1779 {
1780 ssl->in_left = 0;
1781 memset( ssl->in_buf, 0, in_buf_len );
1782 }
1783
1784 /* Reset outgoing message writing */
1785 ssl->out_msgtype = 0;
1786 ssl->out_msglen = 0;
1787 ssl->out_left = 0;
1788 memset( ssl->out_buf, 0, out_buf_len );
1789 memset( ssl->cur_out_ctr, 0, sizeof( ssl->cur_out_ctr ) );
1790 ssl->transform_out = NULL;
1791
1792#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
1793 mbedtls_ssl_dtls_replay_reset( ssl );
1794#endif
1795
XiaokangQian2b01dc32022-01-21 02:53:13 +00001796#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Beckerb0302c42021-08-03 09:39:42 +01001797 if( ssl->transform )
1798 {
1799 mbedtls_ssl_transform_free( ssl->transform );
1800 mbedtls_free( ssl->transform );
1801 ssl->transform = NULL;
1802 }
XiaokangQian2b01dc32022-01-21 02:53:13 +00001803#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1804
XiaokangQian2b01dc32022-01-21 02:53:13 +00001805#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
1806 mbedtls_ssl_transform_free( ssl->transform_application );
1807 mbedtls_free( ssl->transform_application );
1808 ssl->transform_application = NULL;
1809
1810 if( ssl->handshake != NULL )
1811 {
1812 mbedtls_ssl_transform_free( ssl->handshake->transform_earlydata );
1813 mbedtls_free( ssl->handshake->transform_earlydata );
1814 ssl->handshake->transform_earlydata = NULL;
1815
1816 mbedtls_ssl_transform_free( ssl->handshake->transform_handshake );
1817 mbedtls_free( ssl->handshake->transform_handshake );
1818 ssl->handshake->transform_handshake = NULL;
1819 }
1820
XiaokangQian2b01dc32022-01-21 02:53:13 +00001821#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Beckerb0302c42021-08-03 09:39:42 +01001822}
1823
1824int mbedtls_ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial )
1825{
1826 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1827
1828 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
1829
XiaokangQian78b1fa72022-01-19 06:56:30 +00001830 mbedtls_ssl_session_reset_msg_layer( ssl, partial );
Hanno Beckerb0302c42021-08-03 09:39:42 +01001831
1832 /* Reset renegotiation state */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001833#if defined(MBEDTLS_SSL_RENEGOTIATION)
1834 ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001835 ssl->renego_records_seen = 0;
Paul Bakker48916f92012-09-16 19:57:18 +00001836
1837 ssl->verify_data_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001838 memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
1839 memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001840#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001841 ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +00001842
Hanno Beckerb0302c42021-08-03 09:39:42 +01001843 ssl->session_in = NULL;
Hanno Becker78640902018-08-13 16:35:15 +01001844 ssl->session_out = NULL;
Paul Bakkerc0463502013-02-14 11:19:38 +01001845 if( ssl->session )
1846 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001847 mbedtls_ssl_session_free( ssl->session );
1848 mbedtls_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01001849 ssl->session = NULL;
1850 }
1851
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001852#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02001853 ssl->alpn_chosen = NULL;
1854#endif
1855
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02001856#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Hanno Becker4ccbf062018-08-10 11:20:38 +01001857#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE)
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02001858 if( partial == 0 )
Hanno Becker4ccbf062018-08-10 11:20:38 +01001859#endif
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02001860 {
1861 mbedtls_free( ssl->cli_id );
1862 ssl->cli_id = NULL;
1863 ssl->cli_id_len = 0;
1864 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02001865#endif
1866
Paul Bakker48916f92012-09-16 19:57:18 +00001867 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
1868 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001869
1870 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00001871}
1872
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02001873/*
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02001874 * Reset an initialized and used SSL context for re-use while retaining
1875 * all application-set variables, function pointers and data.
1876 */
1877int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl )
1878{
Hanno Becker43aefe22020-02-05 10:44:56 +00001879 return( mbedtls_ssl_session_reset_int( ssl, 0 ) );
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02001880}
1881
1882/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001883 * SSL set accessors
1884 */
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001885void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint )
Paul Bakker5121ce52009-01-03 21:22:43 +00001886{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001887 conf->endpoint = endpoint;
Paul Bakker5121ce52009-01-03 21:22:43 +00001888}
1889
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02001890void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport )
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01001891{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001892 conf->transport = transport;
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01001893}
1894
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001895#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001896void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode )
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02001897{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001898 conf->anti_replay = mode;
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02001899}
1900#endif
1901
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001902void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit )
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02001903{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001904 conf->badmac_limit = limit;
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02001905}
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02001906
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001907#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker04da1892018-08-14 13:22:10 +01001908
Hanno Becker1841b0a2018-08-24 11:13:57 +01001909void mbedtls_ssl_set_datagram_packing( mbedtls_ssl_context *ssl,
1910 unsigned allow_packing )
Hanno Becker04da1892018-08-14 13:22:10 +01001911{
1912 ssl->disable_datagram_packing = !allow_packing;
1913}
1914
1915void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf,
1916 uint32_t min, uint32_t max )
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02001917{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001918 conf->hs_timeout_min = min;
1919 conf->hs_timeout_max = max;
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02001920}
1921#endif
1922
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001923void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode )
Paul Bakker5121ce52009-01-03 21:22:43 +00001924{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001925 conf->authmode = authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00001926}
1927
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001928#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001929void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02001930 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00001931 void *p_vrfy )
1932{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001933 conf->f_vrfy = f_vrfy;
1934 conf->p_vrfy = p_vrfy;
Paul Bakkerb63b0af2011-01-13 17:54:59 +00001935}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001936#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00001937
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001938void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf,
Paul Bakkera3d195c2011-11-27 21:07:34 +00001939 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00001940 void *p_rng )
1941{
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01001942 conf->f_rng = f_rng;
1943 conf->p_rng = p_rng;
Paul Bakker5121ce52009-01-03 21:22:43 +00001944}
1945
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001946void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardfd474232015-06-23 16:34:24 +02001947 void (*f_dbg)(void *, int, const char *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00001948 void *p_dbg )
1949{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001950 conf->f_dbg = f_dbg;
1951 conf->p_dbg = p_dbg;
Paul Bakker5121ce52009-01-03 21:22:43 +00001952}
1953
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001954void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02001955 void *p_bio,
Simon Butchere846b512016-03-01 17:31:49 +00001956 mbedtls_ssl_send_t *f_send,
1957 mbedtls_ssl_recv_t *f_recv,
1958 mbedtls_ssl_recv_timeout_t *f_recv_timeout )
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02001959{
1960 ssl->p_bio = p_bio;
1961 ssl->f_send = f_send;
1962 ssl->f_recv = f_recv;
1963 ssl->f_recv_timeout = f_recv_timeout;
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01001964}
1965
Manuel Pégourié-Gonnard6e7aaca2018-08-20 10:37:23 +02001966#if defined(MBEDTLS_SSL_PROTO_DTLS)
1967void mbedtls_ssl_set_mtu( mbedtls_ssl_context *ssl, uint16_t mtu )
1968{
1969 ssl->mtu = mtu;
1970}
1971#endif
1972
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001973void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout )
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01001974{
1975 conf->read_timeout = timeout;
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02001976}
1977
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02001978void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl,
1979 void *p_timer,
Simon Butchere846b512016-03-01 17:31:49 +00001980 mbedtls_ssl_set_timer_t *f_set_timer,
1981 mbedtls_ssl_get_timer_t *f_get_timer )
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02001982{
1983 ssl->p_timer = p_timer;
1984 ssl->f_set_timer = f_set_timer;
1985 ssl->f_get_timer = f_get_timer;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02001986
1987 /* Make sure we start with no timer running */
Hanno Becker0f57a652020-02-05 10:37:26 +00001988 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02001989}
1990
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001991#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02001992void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf,
Hanno Beckera637ff62021-04-15 08:42:48 +01001993 void *p_cache,
1994 mbedtls_ssl_cache_get_t *f_get_cache,
1995 mbedtls_ssl_cache_set_t *f_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00001996{
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01001997 conf->p_cache = p_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001998 conf->f_get_cache = f_get_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02001999 conf->f_set_cache = f_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00002000}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002001#endif /* MBEDTLS_SSL_SRV_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00002002
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002003#if defined(MBEDTLS_SSL_CLI_C)
2004int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00002005{
Janos Follath865b3eb2019-12-16 11:46:15 +00002006 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02002007
2008 if( ssl == NULL ||
2009 session == NULL ||
2010 ssl->session_negotiate == NULL ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002011 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02002012 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002013 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02002014 }
2015
Hanno Beckere810bbc2021-05-14 16:01:05 +01002016 if( ssl->handshake->resume == 1 )
2017 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
2018
Hanno Becker52055ae2019-02-06 14:30:46 +00002019 if( ( ret = mbedtls_ssl_session_copy( ssl->session_negotiate,
2020 session ) ) != 0 )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02002021 return( ret );
2022
Paul Bakker0a597072012-09-25 21:55:46 +00002023 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02002024
2025 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002026}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002027#endif /* MBEDTLS_SSL_CLI_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00002028
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002029void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf,
2030 const int *ciphersuites )
2031{
Hanno Beckerd60b6c62021-04-29 12:04:11 +01002032 conf->ciphersuite_list = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00002033}
2034
Ronald Cron6f135e12021-12-08 16:57:54 +01002035#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yucadebe52021-08-24 10:36:45 +08002036void mbedtls_ssl_conf_tls13_key_exchange_modes( mbedtls_ssl_config *conf,
Hanno Becker71f1ed62021-07-24 06:01:47 +01002037 const int kex_modes )
2038{
Xiaofei Bai746f9482021-11-12 08:53:56 +00002039 conf->tls13_kex_modes = kex_modes & MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL;
Hanno Becker71f1ed62021-07-24 06:01:47 +01002040}
Ronald Cron6f135e12021-12-08 16:57:54 +01002041#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Becker71f1ed62021-07-24 06:01:47 +01002042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002043#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02002044void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf,
Nicholas Wilson2088e2e2015-09-08 16:53:18 +01002045 const mbedtls_x509_crt_profile *profile )
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02002046{
2047 conf->cert_profile = profile;
2048}
2049
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02002050/* Append a new keycert entry to a (possibly empty) list */
2051static int ssl_append_key_cert( mbedtls_ssl_key_cert **head,
2052 mbedtls_x509_crt *cert,
2053 mbedtls_pk_context *key )
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002054{
niisato8ee24222018-06-25 19:05:48 +09002055 mbedtls_ssl_key_cert *new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002056
niisato8ee24222018-06-25 19:05:48 +09002057 new_cert = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) );
2058 if( new_cert == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02002059 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002060
niisato8ee24222018-06-25 19:05:48 +09002061 new_cert->cert = cert;
2062 new_cert->key = key;
2063 new_cert->next = NULL;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002064
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02002065 /* Update head is the list was null, else add to the end */
2066 if( *head == NULL )
Paul Bakker0333b972013-11-04 17:08:28 +01002067 {
niisato8ee24222018-06-25 19:05:48 +09002068 *head = new_cert;
Paul Bakker0333b972013-11-04 17:08:28 +01002069 }
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002070 else
2071 {
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02002072 mbedtls_ssl_key_cert *cur = *head;
2073 while( cur->next != NULL )
2074 cur = cur->next;
niisato8ee24222018-06-25 19:05:48 +09002075 cur->next = new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002076 }
2077
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02002078 return( 0 );
2079}
2080
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002081int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02002082 mbedtls_x509_crt *own_cert,
2083 mbedtls_pk_context *pk_key )
2084{
Manuel Pégourié-Gonnard17a40cd2015-05-10 23:17:17 +02002085 return( ssl_append_key_cert( &conf->key_cert, own_cert, pk_key ) );
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002086}
2087
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002088void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01002089 mbedtls_x509_crt *ca_chain,
2090 mbedtls_x509_crl *ca_crl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002091{
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01002092 conf->ca_chain = ca_chain;
2093 conf->ca_crl = ca_crl;
Hanno Becker5adaad92019-03-27 16:54:37 +00002094
2095#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
2096 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
2097 * cannot be used together. */
2098 conf->f_ca_cb = NULL;
2099 conf->p_ca_cb = NULL;
2100#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
Paul Bakker5121ce52009-01-03 21:22:43 +00002101}
Hanno Becker5adaad92019-03-27 16:54:37 +00002102
2103#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
2104void mbedtls_ssl_conf_ca_cb( mbedtls_ssl_config *conf,
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002105 mbedtls_x509_crt_ca_cb_t f_ca_cb,
Hanno Becker5adaad92019-03-27 16:54:37 +00002106 void *p_ca_cb )
2107{
2108 conf->f_ca_cb = f_ca_cb;
2109 conf->p_ca_cb = p_ca_cb;
2110
2111 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
2112 * cannot be used together. */
2113 conf->ca_chain = NULL;
2114 conf->ca_crl = NULL;
2115}
2116#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002117#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00002118
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02002119#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2120int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl,
2121 mbedtls_x509_crt *own_cert,
2122 mbedtls_pk_context *pk_key )
2123{
2124 return( ssl_append_key_cert( &ssl->handshake->sni_key_cert,
2125 own_cert, pk_key ) );
2126}
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02002127
2128void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl,
2129 mbedtls_x509_crt *ca_chain,
2130 mbedtls_x509_crl *ca_crl )
2131{
2132 ssl->handshake->sni_ca_chain = ca_chain;
2133 ssl->handshake->sni_ca_crl = ca_crl;
2134}
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002135
2136void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl,
2137 int authmode )
2138{
2139 ssl->handshake->sni_authmode = authmode;
2140}
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02002141#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
2142
Hanno Becker8927c832019-04-03 12:52:50 +01002143#if defined(MBEDTLS_X509_CRT_PARSE_C)
2144void mbedtls_ssl_set_verify( mbedtls_ssl_context *ssl,
2145 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
2146 void *p_vrfy )
2147{
2148 ssl->f_vrfy = f_vrfy;
2149 ssl->p_vrfy = p_vrfy;
2150}
2151#endif
2152
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02002153#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02002154/*
2155 * Set EC J-PAKE password for current handshake
2156 */
2157int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,
2158 const unsigned char *pw,
2159 size_t pw_len )
2160{
2161 mbedtls_ecjpake_role role;
2162
Janos Follath8eb64132016-06-03 15:40:57 +01002163 if( ssl->handshake == NULL || ssl->conf == NULL )
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02002164 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2165
2166 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
2167 role = MBEDTLS_ECJPAKE_SERVER;
2168 else
2169 role = MBEDTLS_ECJPAKE_CLIENT;
2170
2171 return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx,
2172 role,
2173 MBEDTLS_MD_SHA256,
2174 MBEDTLS_ECP_DP_SECP256R1,
2175 pw, pw_len ) );
2176}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02002177#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02002178
Gilles Peskineeccd8882020-03-10 12:19:08 +01002179#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002180
Hanno Becker2ed3dce2021-04-19 21:59:14 +01002181static int ssl_conf_psk_is_configured( mbedtls_ssl_config const *conf )
2182{
2183#if defined(MBEDTLS_USE_PSA_CRYPTO)
2184 if( !mbedtls_svc_key_id_is_null( conf->psk_opaque ) )
2185 return( 1 );
2186#endif /* MBEDTLS_USE_PSA_CRYPTO */
2187
2188 if( conf->psk != NULL )
2189 return( 1 );
2190
2191 return( 0 );
2192}
2193
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002194static void ssl_conf_remove_psk( mbedtls_ssl_config *conf )
2195{
2196 /* Remove reference to existing PSK, if any. */
2197#if defined(MBEDTLS_USE_PSA_CRYPTO)
Ronald Croncf56a0a2020-08-04 09:51:30 +02002198 if( ! mbedtls_svc_key_id_is_null( conf->psk_opaque ) )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002199 {
2200 /* The maintenance of the PSK key slot is the
2201 * user's responsibility. */
Ronald Croncf56a0a2020-08-04 09:51:30 +02002202 conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002203 }
Hanno Beckera63ac3f2018-11-05 12:47:16 +00002204 /* This and the following branch should never
2205 * be taken simultaenously as we maintain the
2206 * invariant that raw and opaque PSKs are never
2207 * configured simultaneously. As a safeguard,
2208 * though, `else` is omitted here. */
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002209#endif /* MBEDTLS_USE_PSA_CRYPTO */
2210 if( conf->psk != NULL )
2211 {
2212 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
2213
2214 mbedtls_free( conf->psk );
2215 conf->psk = NULL;
2216 conf->psk_len = 0;
2217 }
2218
2219 /* Remove reference to PSK identity, if any. */
2220 if( conf->psk_identity != NULL )
2221 {
2222 mbedtls_free( conf->psk_identity );
2223 conf->psk_identity = NULL;
2224 conf->psk_identity_len = 0;
2225 }
2226}
2227
Hanno Becker7390c712018-11-15 13:33:04 +00002228/* This function assumes that PSK identity in the SSL config is unset.
2229 * It checks that the provided identity is well-formed and attempts
2230 * to make a copy of it in the SSL config.
2231 * On failure, the PSK identity in the config remains unset. */
2232static int ssl_conf_set_psk_identity( mbedtls_ssl_config *conf,
2233 unsigned char const *psk_identity,
2234 size_t psk_identity_len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002235{
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02002236 /* Identity len will be encoded on two bytes */
Hanno Becker7390c712018-11-15 13:33:04 +00002237 if( psk_identity == NULL ||
2238 ( psk_identity_len >> 16 ) != 0 ||
Angus Grattond8213d02016-05-25 20:56:48 +10002239 psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02002240 {
2241 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2242 }
2243
Hanno Becker7390c712018-11-15 13:33:04 +00002244 conf->psk_identity = mbedtls_calloc( 1, psk_identity_len );
2245 if( conf->psk_identity == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02002246 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker6db455e2013-09-18 17:29:31 +02002247
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01002248 conf->psk_identity_len = psk_identity_len;
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01002249 memcpy( conf->psk_identity, psk_identity, conf->psk_identity_len );
Paul Bakker5ad403f2013-09-18 21:21:30 +02002250
2251 return( 0 );
Paul Bakker6db455e2013-09-18 17:29:31 +02002252}
2253
Hanno Becker7390c712018-11-15 13:33:04 +00002254int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
2255 const unsigned char *psk, size_t psk_len,
2256 const unsigned char *psk_identity, size_t psk_identity_len )
2257{
Janos Follath865b3eb2019-12-16 11:46:15 +00002258 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker2ed3dce2021-04-19 21:59:14 +01002259
2260 /* We currently only support one PSK, raw or opaque. */
2261 if( ssl_conf_psk_is_configured( conf ) )
2262 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Hanno Becker7390c712018-11-15 13:33:04 +00002263
2264 /* Check and set raw PSK */
Piotr Nowicki9926eaf2019-11-20 14:54:36 +01002265 if( psk == NULL )
Hanno Becker7390c712018-11-15 13:33:04 +00002266 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Piotr Nowicki9926eaf2019-11-20 14:54:36 +01002267 if( psk_len == 0 )
2268 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2269 if( psk_len > MBEDTLS_PSK_MAX_LEN )
2270 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2271
Hanno Becker7390c712018-11-15 13:33:04 +00002272 if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
2273 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
2274 conf->psk_len = psk_len;
2275 memcpy( conf->psk, psk, conf->psk_len );
2276
2277 /* Check and set PSK Identity */
2278 ret = ssl_conf_set_psk_identity( conf, psk_identity, psk_identity_len );
2279 if( ret != 0 )
2280 ssl_conf_remove_psk( conf );
2281
2282 return( ret );
2283}
2284
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002285static void ssl_remove_psk( mbedtls_ssl_context *ssl )
2286{
2287#if defined(MBEDTLS_USE_PSA_CRYPTO)
Ronald Croncf56a0a2020-08-04 09:51:30 +02002288 if( ! mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002289 {
Ronald Croncf56a0a2020-08-04 09:51:30 +02002290 ssl->handshake->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002291 }
2292 else
2293#endif /* MBEDTLS_USE_PSA_CRYPTO */
2294 if( ssl->handshake->psk != NULL )
2295 {
2296 mbedtls_platform_zeroize( ssl->handshake->psk,
2297 ssl->handshake->psk_len );
2298 mbedtls_free( ssl->handshake->psk );
2299 ssl->handshake->psk_len = 0;
2300 }
2301}
2302
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01002303int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl,
2304 const unsigned char *psk, size_t psk_len )
2305{
2306 if( psk == NULL || ssl->handshake == NULL )
2307 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2308
2309 if( psk_len > MBEDTLS_PSK_MAX_LEN )
2310 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2311
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002312 ssl_remove_psk( ssl );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01002313
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02002314 if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02002315 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01002316
2317 ssl->handshake->psk_len = psk_len;
2318 memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len );
2319
2320 return( 0 );
2321}
2322
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002323#if defined(MBEDTLS_USE_PSA_CRYPTO)
2324int mbedtls_ssl_conf_psk_opaque( mbedtls_ssl_config *conf,
Andrzej Kurek03e01462022-01-03 12:53:24 +01002325 mbedtls_svc_key_id_t psk,
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002326 const unsigned char *psk_identity,
2327 size_t psk_identity_len )
2328{
Janos Follath865b3eb2019-12-16 11:46:15 +00002329 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker2ed3dce2021-04-19 21:59:14 +01002330
2331 /* We currently only support one PSK, raw or opaque. */
2332 if( ssl_conf_psk_is_configured( conf ) )
2333 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002334
Hanno Becker7390c712018-11-15 13:33:04 +00002335 /* Check and set opaque PSK */
Ronald Croncf56a0a2020-08-04 09:51:30 +02002336 if( mbedtls_svc_key_id_is_null( psk ) )
Hanno Becker7390c712018-11-15 13:33:04 +00002337 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Ronald Croncf56a0a2020-08-04 09:51:30 +02002338 conf->psk_opaque = psk;
Hanno Becker7390c712018-11-15 13:33:04 +00002339
2340 /* Check and set PSK Identity */
2341 ret = ssl_conf_set_psk_identity( conf, psk_identity,
2342 psk_identity_len );
2343 if( ret != 0 )
2344 ssl_conf_remove_psk( conf );
2345
2346 return( ret );
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002347}
2348
Przemyslaw Stekiel6928a512022-02-03 13:50:35 +01002349int mbedtls_ssl_set_hs_psk_opaque( mbedtls_ssl_context *ssl,
2350 mbedtls_svc_key_id_t psk )
2351{
2352 if( ( mbedtls_svc_key_id_is_null( psk ) ) ||
2353 ( ssl->handshake == NULL ) )
2354 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2355
2356 ssl_remove_psk( ssl );
2357 ssl->handshake->psk_opaque = psk;
2358 return( 0 );
2359}
2360#endif /* MBEDTLS_USE_PSA_CRYPTO */
2361
2362void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,
2363 int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *,
2364 size_t),
2365 void *p_psk )
2366{
2367 conf->f_psk = f_psk;
2368 conf->p_psk = p_psk;
2369}
2370#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
2371
2372#if defined(MBEDTLS_USE_PSA_CRYPTO)
Przemyslaw Stekielf57b4562022-01-25 00:04:18 +01002373psa_status_t mbedtls_ssl_cipher_to_psa( mbedtls_cipher_type_t mbedtls_cipher_type,
Przemyslaw Stekiel430f3372022-01-10 11:55:46 +01002374 size_t taglen,
2375 psa_algorithm_t *alg,
2376 psa_key_type_t *key_type,
2377 size_t *key_size )
2378{
2379 switch ( mbedtls_cipher_type )
2380 {
2381 case MBEDTLS_CIPHER_AES_128_CBC:
2382 *alg = PSA_ALG_CBC_NO_PADDING;
2383 *key_type = PSA_KEY_TYPE_AES;
2384 *key_size = 128;
2385 break;
2386 case MBEDTLS_CIPHER_AES_128_CCM:
2387 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2388 *key_type = PSA_KEY_TYPE_AES;
2389 *key_size = 128;
2390 break;
2391 case MBEDTLS_CIPHER_AES_128_GCM:
2392 *alg = PSA_ALG_GCM;
2393 *key_type = PSA_KEY_TYPE_AES;
2394 *key_size = 128;
2395 break;
2396 case MBEDTLS_CIPHER_AES_192_CCM:
2397 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2398 *key_type = PSA_KEY_TYPE_AES;
2399 *key_size = 192;
2400 break;
2401 case MBEDTLS_CIPHER_AES_192_GCM:
2402 *alg = PSA_ALG_GCM;
2403 *key_type = PSA_KEY_TYPE_AES;
2404 *key_size = 192;
2405 break;
2406 case MBEDTLS_CIPHER_AES_256_CBC:
2407 *alg = PSA_ALG_CBC_NO_PADDING;
2408 *key_type = PSA_KEY_TYPE_AES;
2409 *key_size = 256;
2410 break;
2411 case MBEDTLS_CIPHER_AES_256_CCM:
2412 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2413 *key_type = PSA_KEY_TYPE_AES;
2414 *key_size = 256;
2415 break;
2416 case MBEDTLS_CIPHER_AES_256_GCM:
2417 *alg = PSA_ALG_GCM;
2418 *key_type = PSA_KEY_TYPE_AES;
2419 *key_size = 256;
2420 break;
2421 case MBEDTLS_CIPHER_ARIA_128_CBC:
2422 *alg = PSA_ALG_CBC_NO_PADDING;
2423 *key_type = PSA_KEY_TYPE_ARIA;
2424 *key_size = 128;
2425 break;
2426 case MBEDTLS_CIPHER_ARIA_128_CCM:
2427 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2428 *key_type = PSA_KEY_TYPE_ARIA;
2429 *key_size = 128;
2430 break;
2431 case MBEDTLS_CIPHER_ARIA_128_GCM:
2432 *alg = PSA_ALG_GCM;
2433 *key_type = PSA_KEY_TYPE_ARIA;
2434 *key_size = 128;
2435 break;
2436 case MBEDTLS_CIPHER_ARIA_192_CCM:
2437 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2438 *key_type = PSA_KEY_TYPE_ARIA;
2439 *key_size = 192;
2440 break;
2441 case MBEDTLS_CIPHER_ARIA_192_GCM:
2442 *alg = PSA_ALG_GCM;
2443 *key_type = PSA_KEY_TYPE_ARIA;
2444 *key_size = 192;
2445 break;
2446 case MBEDTLS_CIPHER_ARIA_256_CBC:
2447 *alg = PSA_ALG_CBC_NO_PADDING;
2448 *key_type = PSA_KEY_TYPE_ARIA;
2449 *key_size = 256;
2450 break;
2451 case MBEDTLS_CIPHER_ARIA_256_CCM:
2452 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2453 *key_type = PSA_KEY_TYPE_ARIA;
2454 *key_size = 256;
2455 break;
2456 case MBEDTLS_CIPHER_ARIA_256_GCM:
2457 *alg = PSA_ALG_GCM;
2458 *key_type = PSA_KEY_TYPE_ARIA;
2459 *key_size = 256;
2460 break;
2461 case MBEDTLS_CIPHER_CAMELLIA_128_CBC:
2462 *alg = PSA_ALG_CBC_NO_PADDING;
2463 *key_type = PSA_KEY_TYPE_CAMELLIA;
2464 *key_size = 128;
2465 break;
2466 case MBEDTLS_CIPHER_CAMELLIA_128_CCM:
2467 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2468 *key_type = PSA_KEY_TYPE_CAMELLIA;
2469 *key_size = 128;
2470 break;
2471 case MBEDTLS_CIPHER_CAMELLIA_128_GCM:
2472 *alg = PSA_ALG_GCM;
2473 *key_type = PSA_KEY_TYPE_CAMELLIA;
2474 *key_size = 128;
2475 break;
2476 case MBEDTLS_CIPHER_CAMELLIA_192_CCM:
2477 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2478 *key_type = PSA_KEY_TYPE_CAMELLIA;
2479 *key_size = 192;
2480 break;
2481 case MBEDTLS_CIPHER_CAMELLIA_192_GCM:
2482 *alg = PSA_ALG_GCM;
2483 *key_type = PSA_KEY_TYPE_CAMELLIA;
2484 *key_size = 192;
2485 break;
2486 case MBEDTLS_CIPHER_CAMELLIA_256_CBC:
2487 *alg = PSA_ALG_CBC_NO_PADDING;
2488 *key_type = PSA_KEY_TYPE_CAMELLIA;
2489 *key_size = 256;
2490 break;
2491 case MBEDTLS_CIPHER_CAMELLIA_256_CCM:
2492 *alg = taglen ? PSA_ALG_AEAD_WITH_SHORTENED_TAG( PSA_ALG_CCM, taglen ) : PSA_ALG_CCM;
2493 *key_type = PSA_KEY_TYPE_CAMELLIA;
2494 *key_size = 256;
2495 break;
2496 case MBEDTLS_CIPHER_CAMELLIA_256_GCM:
2497 *alg = PSA_ALG_GCM;
2498 *key_type = PSA_KEY_TYPE_CAMELLIA;
2499 *key_size = 256;
2500 break;
2501 case MBEDTLS_CIPHER_CHACHA20_POLY1305:
2502 *alg = PSA_ALG_CHACHA20_POLY1305;
2503 *key_type = PSA_KEY_TYPE_CHACHA20;
2504 *key_size = 256;
2505 break;
2506 case MBEDTLS_CIPHER_NULL:
2507 *alg = MBEDTLS_SSL_NULL_CIPHER;
2508 *key_type = 0;
2509 *key_size = 0;
2510 break;
2511 default:
2512 return PSA_ERROR_NOT_SUPPORTED;
2513 }
2514
2515 return PSA_SUCCESS;
2516}
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01002517#endif /* MBEDTLS_USE_PSA_CRYPTO */
2518
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02002519#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Hanno Beckera90658f2017-10-04 15:29:08 +01002520int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf,
2521 const unsigned char *dhm_P, size_t P_len,
2522 const unsigned char *dhm_G, size_t G_len )
2523{
Janos Follath865b3eb2019-12-16 11:46:15 +00002524 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Beckera90658f2017-10-04 15:29:08 +01002525
Glenn Strausscee11292021-12-20 01:43:17 -05002526 mbedtls_mpi_free( &conf->dhm_P );
2527 mbedtls_mpi_free( &conf->dhm_G );
2528
Hanno Beckera90658f2017-10-04 15:29:08 +01002529 if( ( ret = mbedtls_mpi_read_binary( &conf->dhm_P, dhm_P, P_len ) ) != 0 ||
2530 ( ret = mbedtls_mpi_read_binary( &conf->dhm_G, dhm_G, G_len ) ) != 0 )
2531 {
2532 mbedtls_mpi_free( &conf->dhm_P );
2533 mbedtls_mpi_free( &conf->dhm_G );
2534 return( ret );
2535 }
2536
2537 return( 0 );
2538}
Paul Bakker5121ce52009-01-03 21:22:43 +00002539
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002540int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx )
Paul Bakker1b57b062011-01-06 15:48:19 +00002541{
Janos Follath865b3eb2019-12-16 11:46:15 +00002542 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker1b57b062011-01-06 15:48:19 +00002543
Glenn Strausscee11292021-12-20 01:43:17 -05002544 mbedtls_mpi_free( &conf->dhm_P );
2545 mbedtls_mpi_free( &conf->dhm_G );
2546
Gilles Peskinee5702482021-06-11 21:59:08 +02002547 if( ( ret = mbedtls_dhm_get_value( dhm_ctx, MBEDTLS_DHM_PARAM_P,
2548 &conf->dhm_P ) ) != 0 ||
2549 ( ret = mbedtls_dhm_get_value( dhm_ctx, MBEDTLS_DHM_PARAM_G,
2550 &conf->dhm_G ) ) != 0 )
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002551 {
2552 mbedtls_mpi_free( &conf->dhm_P );
2553 mbedtls_mpi_free( &conf->dhm_G );
Paul Bakker1b57b062011-01-06 15:48:19 +00002554 return( ret );
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01002555 }
Paul Bakker1b57b062011-01-06 15:48:19 +00002556
2557 return( 0 );
2558}
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02002559#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00002560
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02002561#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
2562/*
2563 * Set the minimum length for Diffie-Hellman parameters
2564 */
2565void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf,
2566 unsigned int bitlen )
2567{
2568 conf->dhm_min_bitlen = bitlen;
2569}
2570#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */
2571
Gilles Peskineeccd8882020-03-10 12:19:08 +01002572#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yu7ddc38c2022-01-19 11:08:05 +08002573#if !defined(MBEDTLS_DEPRECATED_REMOVED) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02002574/*
2575 * Set allowed/preferred hashes for handshake signatures
2576 */
2577void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf,
2578 const int *hashes )
2579{
2580 conf->sig_hashes = hashes;
2581}
Jerry Yu7ddc38c2022-01-19 11:08:05 +08002582#endif /* !MBEDTLS_DEPRECATED_REMOVED && MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Becker1cd6e002021-08-10 13:27:10 +01002583
Jerry Yuf017ee42022-01-12 15:49:48 +08002584/* Configure allowed signature algorithms for handshake */
Hanno Becker1cd6e002021-08-10 13:27:10 +01002585void mbedtls_ssl_conf_sig_algs( mbedtls_ssl_config *conf,
2586 const uint16_t* sig_algs )
2587{
Jerry Yuf017ee42022-01-12 15:49:48 +08002588#if !defined(MBEDTLS_DEPRECATED_REMOVED)
2589 conf->sig_hashes = NULL;
2590#endif /* !MBEDTLS_DEPRECATED_REMOVED */
2591 conf->sig_algs = sig_algs;
Hanno Becker1cd6e002021-08-10 13:27:10 +01002592}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002593#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02002594
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02002595#if defined(MBEDTLS_ECP_C)
Brett Warrene0edc842021-08-17 09:53:13 +01002596#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01002597/*
2598 * Set the allowed elliptic curves
Brett Warrene0edc842021-08-17 09:53:13 +01002599 *
2600 * mbedtls_ssl_setup() takes the provided list
2601 * and translates it to a list of IANA TLS group identifiers,
2602 * stored in ssl->handshake->group_list.
2603 *
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01002604 */
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002605void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002606 const mbedtls_ecp_group_id *curve_list )
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01002607{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002608 conf->curve_list = curve_list;
Brett Warrene0edc842021-08-17 09:53:13 +01002609 conf->group_list = NULL;
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01002610}
Brett Warrene0edc842021-08-17 09:53:13 +01002611#endif /* MBEDTLS_DEPRECATED_REMOVED */
Hanno Becker947194e2017-04-07 13:25:49 +01002612#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01002613
Brett Warrene0edc842021-08-17 09:53:13 +01002614/*
2615 * Set the allowed groups
2616 */
2617void mbedtls_ssl_conf_groups( mbedtls_ssl_config *conf,
2618 const uint16_t *group_list )
2619{
2620#if defined(MBEDTLS_ECP_C) && !defined(MBEDTLS_DEPRECATED_REMOVED)
2621 conf->curve_list = NULL;
2622#endif
2623 conf->group_list = group_list;
2624}
2625
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01002626#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002627int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00002628{
Hanno Becker947194e2017-04-07 13:25:49 +01002629 /* Initialize to suppress unnecessary compiler warning */
2630 size_t hostname_len = 0;
2631
2632 /* Check if new hostname is valid before
2633 * making any change to current one */
Hanno Becker947194e2017-04-07 13:25:49 +01002634 if( hostname != NULL )
2635 {
2636 hostname_len = strlen( hostname );
2637
2638 if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN )
2639 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2640 }
2641
2642 /* Now it's clear that we will overwrite the old hostname,
2643 * so we can free it safely */
2644
2645 if( ssl->hostname != NULL )
2646 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05002647 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
Hanno Becker947194e2017-04-07 13:25:49 +01002648 mbedtls_free( ssl->hostname );
2649 }
2650
2651 /* Passing NULL as hostname shall clear the old one */
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +01002652
Paul Bakker5121ce52009-01-03 21:22:43 +00002653 if( hostname == NULL )
Hanno Becker947194e2017-04-07 13:25:49 +01002654 {
2655 ssl->hostname = NULL;
2656 }
2657 else
2658 {
2659 ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 );
Hanno Becker947194e2017-04-07 13:25:49 +01002660 if( ssl->hostname == NULL )
2661 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02002662
Hanno Becker947194e2017-04-07 13:25:49 +01002663 memcpy( ssl->hostname, hostname, hostname_len );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02002664
Hanno Becker947194e2017-04-07 13:25:49 +01002665 ssl->hostname[hostname_len] = '\0';
2666 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002667
2668 return( 0 );
2669}
Hanno Becker1a9a51c2017-04-07 13:02:16 +01002670#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00002671
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01002672#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002673void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002674 int (*f_sni)(void *, mbedtls_ssl_context *,
Paul Bakker5701cdc2012-09-27 21:49:42 +00002675 const unsigned char *, size_t),
2676 void *p_sni )
2677{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002678 conf->f_sni = f_sni;
2679 conf->p_sni = p_sni;
Paul Bakker5701cdc2012-09-27 21:49:42 +00002680}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002681#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00002682
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002683#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002684int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos )
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02002685{
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002686 size_t cur_len, tot_len;
2687 const char **p;
2688
2689 /*
Brian J Murray1903fb32016-11-06 04:45:15 -08002690 * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings
2691 * MUST NOT be truncated."
2692 * We check lengths now rather than later.
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002693 */
2694 tot_len = 0;
2695 for( p = protos; *p != NULL; p++ )
2696 {
2697 cur_len = strlen( *p );
2698 tot_len += cur_len;
2699
Ronald Cron8216dd32020-04-23 16:41:44 +02002700 if( ( cur_len == 0 ) ||
2701 ( cur_len > MBEDTLS_SSL_MAX_ALPN_NAME_LEN ) ||
2702 ( tot_len > MBEDTLS_SSL_MAX_ALPN_LIST_LEN ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002703 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002704 }
2705
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002706 conf->alpn_list = protos;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02002707
2708 return( 0 );
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02002709}
2710
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002711const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02002712{
Paul Bakkerd8bb8262014-06-17 14:06:49 +02002713 return( ssl->alpn_chosen );
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02002714}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002715#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02002716
Johan Pascalb62bb512015-12-03 21:56:45 +01002717#if defined(MBEDTLS_SSL_DTLS_SRTP)
Ron Eldoref72faf2018-07-12 11:54:20 +03002718void mbedtls_ssl_conf_srtp_mki_value_supported( mbedtls_ssl_config *conf,
2719 int support_mki_value )
Ron Eldor591f1622018-01-22 12:30:04 +02002720{
2721 conf->dtls_srtp_mki_support = support_mki_value;
2722}
2723
Ron Eldoref72faf2018-07-12 11:54:20 +03002724int mbedtls_ssl_dtls_srtp_set_mki_value( mbedtls_ssl_context *ssl,
2725 unsigned char *mki_value,
Johan Pascalf6417ec2020-09-22 15:15:19 +02002726 uint16_t mki_len )
Ron Eldor591f1622018-01-22 12:30:04 +02002727{
Johan Pascal5ef72d22020-10-28 17:05:47 +01002728 if( mki_len > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH )
Ron Eldora9788042018-12-05 11:04:31 +02002729 {
Johan Pascald576fdb2020-09-22 10:39:53 +02002730 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Ron Eldora9788042018-12-05 11:04:31 +02002731 }
Ron Eldor591f1622018-01-22 12:30:04 +02002732
2733 if( ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED )
Ron Eldora9788042018-12-05 11:04:31 +02002734 {
Johan Pascald576fdb2020-09-22 10:39:53 +02002735 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Ron Eldora9788042018-12-05 11:04:31 +02002736 }
Ron Eldor591f1622018-01-22 12:30:04 +02002737
2738 memcpy( ssl->dtls_srtp_info.mki_value, mki_value, mki_len );
2739 ssl->dtls_srtp_info.mki_len = mki_len;
Ron Eldora9788042018-12-05 11:04:31 +02002740 return( 0 );
Ron Eldor591f1622018-01-22 12:30:04 +02002741}
2742
Ron Eldoref72faf2018-07-12 11:54:20 +03002743int mbedtls_ssl_conf_dtls_srtp_protection_profiles( mbedtls_ssl_config *conf,
Johan Pascal253d0262020-09-22 13:04:45 +02002744 const mbedtls_ssl_srtp_profile *profiles )
Johan Pascalb62bb512015-12-03 21:56:45 +01002745{
Johan Pascal253d0262020-09-22 13:04:45 +02002746 const mbedtls_ssl_srtp_profile *p;
2747 size_t list_size = 0;
Johan Pascalb62bb512015-12-03 21:56:45 +01002748
Johan Pascal253d0262020-09-22 13:04:45 +02002749 /* check the profiles list: all entry must be valid,
2750 * its size cannot be more than the total number of supported profiles, currently 4 */
Johan Pascald387aa02020-09-23 18:47:56 +02002751 for( p = profiles; *p != MBEDTLS_TLS_SRTP_UNSET &&
2752 list_size <= MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH;
2753 p++ )
Johan Pascald576fdb2020-09-22 10:39:53 +02002754 {
Johan Pascal5ef72d22020-10-28 17:05:47 +01002755 if( mbedtls_ssl_check_srtp_profile_value( *p ) != MBEDTLS_TLS_SRTP_UNSET )
Johan Pascald576fdb2020-09-22 10:39:53 +02002756 {
Johan Pascal76fdf1d2020-10-22 23:31:00 +02002757 list_size++;
2758 }
2759 else
2760 {
2761 /* unsupported value, stop parsing and set the size to an error value */
2762 list_size = MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH + 1;
Johan Pascalb62bb512015-12-03 21:56:45 +01002763 }
2764 }
2765
Johan Pascal5ef72d22020-10-28 17:05:47 +01002766 if( list_size > MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH )
Johan Pascald387aa02020-09-23 18:47:56 +02002767 {
Johan Pascal253d0262020-09-22 13:04:45 +02002768 conf->dtls_srtp_profile_list = NULL;
2769 conf->dtls_srtp_profile_list_len = 0;
2770 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2771 }
2772
Johan Pascal9bc97ca2020-09-21 23:44:45 +02002773 conf->dtls_srtp_profile_list = profiles;
Johan Pascal253d0262020-09-22 13:04:45 +02002774 conf->dtls_srtp_profile_list_len = list_size;
Johan Pascalb62bb512015-12-03 21:56:45 +01002775
2776 return( 0 );
2777}
2778
Johan Pascal5ef72d22020-10-28 17:05:47 +01002779void mbedtls_ssl_get_dtls_srtp_negotiation_result( const mbedtls_ssl_context *ssl,
2780 mbedtls_dtls_srtp_info *dtls_srtp_info )
Johan Pascalb62bb512015-12-03 21:56:45 +01002781{
Johan Pascal2258a4f2020-10-28 13:53:09 +01002782 dtls_srtp_info->chosen_dtls_srtp_profile = ssl->dtls_srtp_info.chosen_dtls_srtp_profile;
2783 /* do not copy the mki value if there is no chosen profile */
Johan Pascal5ef72d22020-10-28 17:05:47 +01002784 if( dtls_srtp_info->chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET )
Johan Pascal0dbcd1d2020-10-28 11:03:07 +01002785 {
Johan Pascal2258a4f2020-10-28 13:53:09 +01002786 dtls_srtp_info->mki_len = 0;
Johan Pascal0dbcd1d2020-10-28 11:03:07 +01002787 }
Johan Pascal2258a4f2020-10-28 13:53:09 +01002788 else
2789 {
2790 dtls_srtp_info->mki_len = ssl->dtls_srtp_info.mki_len;
Johan Pascal5ef72d22020-10-28 17:05:47 +01002791 memcpy( dtls_srtp_info->mki_value, ssl->dtls_srtp_info.mki_value,
2792 ssl->dtls_srtp_info.mki_len );
Johan Pascal2258a4f2020-10-28 13:53:09 +01002793 }
Johan Pascalb62bb512015-12-03 21:56:45 +01002794}
Johan Pascalb62bb512015-12-03 21:56:45 +01002795#endif /* MBEDTLS_SSL_DTLS_SRTP */
2796
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02002797void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor )
Paul Bakker490ecc82011-10-06 13:04:09 +00002798{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002799 conf->max_major_ver = major;
2800 conf->max_minor_ver = minor;
Paul Bakker490ecc82011-10-06 13:04:09 +00002801}
2802
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02002803void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor )
Paul Bakker1d29fb52012-09-28 13:28:45 +00002804{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002805 conf->min_major_ver = major;
2806 conf->min_minor_ver = minor;
Paul Bakker1d29fb52012-09-28 13:28:45 +00002807}
2808
Janos Follath088ce432017-04-10 12:42:31 +01002809#if defined(MBEDTLS_SSL_SRV_C)
2810void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf,
2811 char cert_req_ca_list )
2812{
2813 conf->cert_req_ca_list = cert_req_ca_list;
2814}
2815#endif
2816
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002817#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002818void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002819{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002820 conf->encrypt_then_mac = etm;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01002821}
2822#endif
2823
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002824#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002825void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002826{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002827 conf->extended_ms = ems;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02002828}
2829#endif
2830
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002831#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002832int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02002833{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002834 if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ||
Angus Grattond8213d02016-05-25 20:56:48 +10002835 ssl_mfl_code_to_length( mfl_code ) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02002836 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002837 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02002838 }
2839
Manuel Pégourié-Gonnard6bf89d62015-05-05 17:01:57 +01002840 conf->mfl_code = mfl_code;
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02002841
2842 return( 0 );
2843}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002844#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02002845
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002846void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy )
Paul Bakker48916f92012-09-16 19:57:18 +00002847{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002848 conf->allow_legacy_renegotiation = allow_legacy;
Paul Bakker48916f92012-09-16 19:57:18 +00002849}
2850
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002851#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002852void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002853{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002854 conf->disable_renegotiation = renegotiation;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01002855}
2856
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002857void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records )
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02002858{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002859 conf->renego_max_records = max_records;
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02002860}
2861
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02002862void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01002863 const unsigned char period[8] )
2864{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02002865 memcpy( conf->renego_period, period, 8 );
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01002866}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002867#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker5121ce52009-01-03 21:22:43 +00002868
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002869#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02002870#if defined(MBEDTLS_SSL_CLI_C)
2871void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets )
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02002872{
Manuel Pégourié-Gonnard2b494452015-05-06 10:05:11 +01002873 conf->session_tickets = use_tickets;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02002874}
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02002875#endif
Paul Bakker606b4ba2013-08-14 16:52:14 +02002876
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02002877#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02002878void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,
2879 mbedtls_ssl_ticket_write_t *f_ticket_write,
2880 mbedtls_ssl_ticket_parse_t *f_ticket_parse,
2881 void *p_ticket )
Paul Bakker606b4ba2013-08-14 16:52:14 +02002882{
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02002883 conf->f_ticket_write = f_ticket_write;
2884 conf->f_ticket_parse = f_ticket_parse;
2885 conf->p_ticket = p_ticket;
Paul Bakker606b4ba2013-08-14 16:52:14 +02002886}
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02002887#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002888#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02002889
Hanno Becker7e6c1782021-06-08 09:24:55 +01002890void mbedtls_ssl_set_export_keys_cb( mbedtls_ssl_context *ssl,
2891 mbedtls_ssl_export_keys_t *f_export_keys,
2892 void *p_export_keys )
Robert Cragie4feb7ae2015-10-02 13:33:37 +01002893{
Hanno Becker7e6c1782021-06-08 09:24:55 +01002894 ssl->f_export_keys = f_export_keys;
2895 ssl->p_export_keys = p_export_keys;
Ron Eldorf5cc10d2019-05-07 18:33:40 +03002896}
Robert Cragie4feb7ae2015-10-02 13:33:37 +01002897
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002898#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine8bf79f62018-01-05 21:11:53 +01002899void mbedtls_ssl_conf_async_private_cb(
2900 mbedtls_ssl_config *conf,
2901 mbedtls_ssl_async_sign_t *f_async_sign,
2902 mbedtls_ssl_async_decrypt_t *f_async_decrypt,
2903 mbedtls_ssl_async_resume_t *f_async_resume,
2904 mbedtls_ssl_async_cancel_t *f_async_cancel,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002905 void *async_config_data )
Gilles Peskine8bf79f62018-01-05 21:11:53 +01002906{
2907 conf->f_async_sign_start = f_async_sign;
2908 conf->f_async_decrypt_start = f_async_decrypt;
2909 conf->f_async_resume = f_async_resume;
2910 conf->f_async_cancel = f_async_cancel;
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002911 conf->p_async_config_data = async_config_data;
2912}
2913
Gilles Peskine8f97af72018-04-26 11:46:10 +02002914void *mbedtls_ssl_conf_get_async_config_data( const mbedtls_ssl_config *conf )
2915{
2916 return( conf->p_async_config_data );
2917}
2918
Gilles Peskine1febfef2018-04-30 11:54:39 +02002919void *mbedtls_ssl_get_async_operation_data( const mbedtls_ssl_context *ssl )
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002920{
2921 if( ssl->handshake == NULL )
2922 return( NULL );
2923 else
2924 return( ssl->handshake->user_async_ctx );
2925}
2926
Gilles Peskine1febfef2018-04-30 11:54:39 +02002927void mbedtls_ssl_set_async_operation_data( mbedtls_ssl_context *ssl,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02002928 void *ctx )
2929{
2930 if( ssl->handshake != NULL )
2931 ssl->handshake->user_async_ctx = ctx;
Gilles Peskine8bf79f62018-01-05 21:11:53 +01002932}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02002933#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine8bf79f62018-01-05 21:11:53 +01002934
Paul Bakker5121ce52009-01-03 21:22:43 +00002935/*
2936 * SSL get accessors
2937 */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02002938uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002939{
Manuel Pégourié-Gonnarde89163c2015-01-23 14:30:57 +00002940 if( ssl->session != NULL )
2941 return( ssl->session->verify_result );
2942
2943 if( ssl->session_negotiate != NULL )
2944 return( ssl->session_negotiate->verify_result );
2945
Manuel Pégourié-Gonnard6ab9b002015-05-14 11:25:04 +02002946 return( 0xFFFFFFFF );
Paul Bakker5121ce52009-01-03 21:22:43 +00002947}
2948
Glenn Strauss8f526902022-01-13 00:04:49 -05002949int mbedtls_ssl_get_ciphersuite_id_from_ssl( const mbedtls_ssl_context *ssl )
2950{
2951 if( ssl == NULL || ssl->session == NULL )
2952 return( 0 );
2953
2954 return( ssl->session->ciphersuite );
2955}
2956
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002957const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00002958{
Paul Bakker926c8e42013-03-06 10:23:34 +01002959 if( ssl == NULL || ssl->session == NULL )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02002960 return( NULL );
Paul Bakker926c8e42013-03-06 10:23:34 +01002961
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002962 return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00002963}
2964
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002965const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl )
Paul Bakker43ca69c2011-01-15 17:35:19 +00002966{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002967#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002968 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01002969 {
2970 switch( ssl->minor_ver )
2971 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002972 case MBEDTLS_SSL_MINOR_VERSION_3:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01002973 return( "DTLSv1.2" );
2974
2975 default:
2976 return( "unknown (DTLS)" );
2977 }
2978 }
2979#endif
2980
Paul Bakker43ca69c2011-01-15 17:35:19 +00002981 switch( ssl->minor_ver )
2982 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002983 case MBEDTLS_SSL_MINOR_VERSION_3:
Paul Bakker1ef83d62012-04-11 12:09:53 +00002984 return( "TLSv1.2" );
2985
Paul Bakker43ca69c2011-01-15 17:35:19 +00002986 default:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01002987 return( "unknown" );
Paul Bakker43ca69c2011-01-15 17:35:19 +00002988 }
Paul Bakker43ca69c2011-01-15 17:35:19 +00002989}
2990
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02002991#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Andrzej Kurek90c6e842020-04-03 05:25:29 -04002992size_t mbedtls_ssl_get_input_max_frag_len( const mbedtls_ssl_context *ssl )
2993{
David Horstmann95d516f2021-05-04 18:36:56 +01002994 size_t max_len = MBEDTLS_SSL_IN_CONTENT_LEN;
Andrzej Kurek90c6e842020-04-03 05:25:29 -04002995 size_t read_mfl;
2996
2997 /* Use the configured MFL for the client if we're past SERVER_HELLO_DONE */
2998 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
2999 ssl->state >= MBEDTLS_SSL_SERVER_HELLO_DONE )
3000 {
3001 return ssl_mfl_code_to_length( ssl->conf->mfl_code );
3002 }
3003
3004 /* Check if a smaller max length was negotiated */
3005 if( ssl->session_out != NULL )
3006 {
3007 read_mfl = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
3008 if( read_mfl < max_len )
3009 {
3010 max_len = read_mfl;
3011 }
3012 }
3013
3014 // During a handshake, use the value being negotiated
3015 if( ssl->session_negotiate != NULL )
3016 {
3017 read_mfl = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
3018 if( read_mfl < max_len )
3019 {
3020 max_len = read_mfl;
3021 }
3022 }
3023
3024 return( max_len );
3025}
3026
3027size_t mbedtls_ssl_get_output_max_frag_len( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02003028{
3029 size_t max_len;
3030
3031 /*
3032 * Assume mfl_code is correct since it was checked when set
3033 */
Angus Grattond8213d02016-05-25 20:56:48 +10003034 max_len = ssl_mfl_code_to_length( ssl->conf->mfl_code );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02003035
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02003036 /* Check if a smaller max length was negotiated */
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02003037 if( ssl->session_out != NULL &&
Angus Grattond8213d02016-05-25 20:56:48 +10003038 ssl_mfl_code_to_length( ssl->session_out->mfl_code ) < max_len )
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02003039 {
Angus Grattond8213d02016-05-25 20:56:48 +10003040 max_len = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02003041 }
3042
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02003043 /* During a handshake, use the value being negotiated */
3044 if( ssl->session_negotiate != NULL &&
3045 ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code ) < max_len )
3046 {
3047 max_len = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
3048 }
3049
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02003050 return( max_len );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02003051}
3052#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
3053
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02003054#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker89490712020-02-05 10:50:12 +00003055size_t mbedtls_ssl_get_current_mtu( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02003056{
Andrzej Kurekef43ce62018-10-09 08:24:12 -04003057 /* Return unlimited mtu for client hello messages to avoid fragmentation. */
3058 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
3059 ( ssl->state == MBEDTLS_SSL_CLIENT_HELLO ||
3060 ssl->state == MBEDTLS_SSL_SERVER_HELLO ) )
3061 return ( 0 );
3062
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02003063 if( ssl->handshake == NULL || ssl->handshake->mtu == 0 )
3064 return( ssl->mtu );
3065
3066 if( ssl->mtu == 0 )
3067 return( ssl->handshake->mtu );
3068
3069 return( ssl->mtu < ssl->handshake->mtu ?
3070 ssl->mtu : ssl->handshake->mtu );
3071}
3072#endif /* MBEDTLS_SSL_PROTO_DTLS */
3073
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02003074int mbedtls_ssl_get_max_out_record_payload( const mbedtls_ssl_context *ssl )
3075{
3076 size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
3077
Manuel Pégourié-Gonnard000281e2018-08-21 11:20:58 +02003078#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
3079 !defined(MBEDTLS_SSL_PROTO_DTLS)
3080 (void) ssl;
3081#endif
3082
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02003083#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Andrzej Kurek90c6e842020-04-03 05:25:29 -04003084 const size_t mfl = mbedtls_ssl_get_output_max_frag_len( ssl );
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02003085
3086 if( max_len > mfl )
3087 max_len = mfl;
3088#endif
3089
3090#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker89490712020-02-05 10:50:12 +00003091 if( mbedtls_ssl_get_current_mtu( ssl ) != 0 )
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02003092 {
Hanno Becker89490712020-02-05 10:50:12 +00003093 const size_t mtu = mbedtls_ssl_get_current_mtu( ssl );
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02003094 const int ret = mbedtls_ssl_get_record_expansion( ssl );
3095 const size_t overhead = (size_t) ret;
3096
3097 if( ret < 0 )
3098 return( ret );
3099
3100 if( mtu <= overhead )
3101 {
3102 MBEDTLS_SSL_DEBUG_MSG( 1, ( "MTU too low for record expansion" ) );
3103 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3104 }
3105
3106 if( max_len > mtu - overhead )
3107 max_len = mtu - overhead;
3108 }
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02003109#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02003110
Hanno Becker0defedb2018-08-10 12:35:02 +01003111#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
3112 !defined(MBEDTLS_SSL_PROTO_DTLS)
3113 ((void) ssl);
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02003114#endif
3115
3116 return( (int) max_len );
3117}
3118
Hanno Becker2d8e99b2021-04-21 06:19:50 +01003119int mbedtls_ssl_get_max_in_record_payload( const mbedtls_ssl_context *ssl )
3120{
3121 size_t max_len = MBEDTLS_SSL_IN_CONTENT_LEN;
3122
3123#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3124 (void) ssl;
3125#endif
3126
3127#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3128 const size_t mfl = mbedtls_ssl_get_input_max_frag_len( ssl );
3129
3130 if( max_len > mfl )
3131 max_len = mfl;
3132#endif
3133
3134 return( (int) max_len );
3135}
3136
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003137#if defined(MBEDTLS_X509_CRT_PARSE_C)
3138const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl )
Paul Bakkerb0550d92012-10-30 07:51:03 +00003139{
3140 if( ssl == NULL || ssl->session == NULL )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02003141 return( NULL );
Paul Bakkerb0550d92012-10-30 07:51:03 +00003142
Hanno Beckere6824572019-02-07 13:18:46 +00003143#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Paul Bakkerd8bb8262014-06-17 14:06:49 +02003144 return( ssl->session->peer_cert );
Hanno Beckere6824572019-02-07 13:18:46 +00003145#else
3146 return( NULL );
3147#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakkerb0550d92012-10-30 07:51:03 +00003148}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003149#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00003150
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003151#if defined(MBEDTLS_SSL_CLI_C)
Hanno Beckerf852b1c2019-02-05 11:42:30 +00003152int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl,
3153 mbedtls_ssl_session *dst )
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003154{
Hanno Beckere810bbc2021-05-14 16:01:05 +01003155 int ret;
3156
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003157 if( ssl == NULL ||
3158 dst == NULL ||
3159 ssl->session == NULL ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003160 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003161 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003162 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003163 }
3164
Hanno Beckere810bbc2021-05-14 16:01:05 +01003165 /* Since Mbed TLS 3.0, mbedtls_ssl_get_session() is no longer
3166 * idempotent: Each session can only be exported once.
3167 *
3168 * (This is in preparation for TLS 1.3 support where we will
3169 * need the ability to export multiple sessions (aka tickets),
3170 * which will be achieved by calling mbedtls_ssl_get_session()
3171 * multiple times until it fails.)
3172 *
3173 * Check whether we have already exported the current session,
3174 * and fail if so.
3175 */
3176 if( ssl->session->exported == 1 )
3177 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3178
3179 ret = mbedtls_ssl_session_copy( dst, ssl->session );
3180 if( ret != 0 )
3181 return( ret );
3182
3183 /* Remember that we've exported the session. */
3184 ssl->session->exported = 1;
3185 return( 0 );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003186}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003187#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003188
Paul Bakker5121ce52009-01-03 21:22:43 +00003189/*
Hanno Beckera835da52019-05-16 12:39:07 +01003190 * Define ticket header determining Mbed TLS version
3191 * and structure of the ticket.
3192 */
3193
Hanno Becker94ef3b32019-05-16 12:50:45 +01003194/*
Hanno Becker50b59662019-05-28 14:30:45 +01003195 * Define bitflag determining compile-time settings influencing
3196 * structure of serialized SSL sessions.
Hanno Becker94ef3b32019-05-16 12:50:45 +01003197 */
3198
Hanno Becker50b59662019-05-28 14:30:45 +01003199#if defined(MBEDTLS_HAVE_TIME)
Hanno Becker3e088662019-05-29 11:10:18 +01003200#define SSL_SERIALIZED_SESSION_CONFIG_TIME 1
Hanno Becker50b59662019-05-28 14:30:45 +01003201#else
Hanno Becker3e088662019-05-29 11:10:18 +01003202#define SSL_SERIALIZED_SESSION_CONFIG_TIME 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01003203#endif /* MBEDTLS_HAVE_TIME */
3204
3205#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker3e088662019-05-29 11:10:18 +01003206#define SSL_SERIALIZED_SESSION_CONFIG_CRT 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01003207#else
Hanno Becker3e088662019-05-29 11:10:18 +01003208#define SSL_SERIALIZED_SESSION_CONFIG_CRT 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01003209#endif /* MBEDTLS_X509_CRT_PARSE_C */
3210
3211#if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_SESSION_TICKETS)
Hanno Becker3e088662019-05-29 11:10:18 +01003212#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01003213#else
Hanno Becker3e088662019-05-29 11:10:18 +01003214#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01003215#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_SESSION_TICKETS */
3216
3217#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Hanno Becker3e088662019-05-29 11:10:18 +01003218#define SSL_SERIALIZED_SESSION_CONFIG_MFL 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01003219#else
Hanno Becker3e088662019-05-29 11:10:18 +01003220#define SSL_SERIALIZED_SESSION_CONFIG_MFL 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01003221#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
3222
Hanno Becker94ef3b32019-05-16 12:50:45 +01003223#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker3e088662019-05-29 11:10:18 +01003224#define SSL_SERIALIZED_SESSION_CONFIG_ETM 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01003225#else
Hanno Becker3e088662019-05-29 11:10:18 +01003226#define SSL_SERIALIZED_SESSION_CONFIG_ETM 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01003227#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
3228
Hanno Becker94ef3b32019-05-16 12:50:45 +01003229#if defined(MBEDTLS_SSL_SESSION_TICKETS)
3230#define SSL_SERIALIZED_SESSION_CONFIG_TICKET 1
3231#else
3232#define SSL_SERIALIZED_SESSION_CONFIG_TICKET 0
3233#endif /* MBEDTLS_SSL_SESSION_TICKETS */
3234
Hanno Becker3e088662019-05-29 11:10:18 +01003235#define SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT 0
3236#define SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT 1
3237#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT 2
3238#define SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT 3
Hanno Becker37bdbe62021-08-01 05:38:58 +01003239#define SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT 4
3240#define SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT 5
Hanno Becker3e088662019-05-29 11:10:18 +01003241
Hanno Becker50b59662019-05-28 14:30:45 +01003242#define SSL_SERIALIZED_SESSION_CONFIG_BITFLAG \
Hanno Becker3e088662019-05-29 11:10:18 +01003243 ( (uint16_t) ( \
3244 ( SSL_SERIALIZED_SESSION_CONFIG_TIME << SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT ) | \
3245 ( SSL_SERIALIZED_SESSION_CONFIG_CRT << SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT ) | \
3246 ( SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET << SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT ) | \
3247 ( SSL_SERIALIZED_SESSION_CONFIG_MFL << SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT ) | \
Hanno Becker3e088662019-05-29 11:10:18 +01003248 ( SSL_SERIALIZED_SESSION_CONFIG_ETM << SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT ) | \
Hanno Beckerbe34e8e2019-06-04 09:43:16 +01003249 ( SSL_SERIALIZED_SESSION_CONFIG_TICKET << SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT ) ) )
Hanno Becker94ef3b32019-05-16 12:50:45 +01003250
Hanno Beckerf8787072019-05-16 12:41:07 +01003251static unsigned char ssl_serialized_session_header[] = {
Hanno Becker94ef3b32019-05-16 12:50:45 +01003252 MBEDTLS_VERSION_MAJOR,
3253 MBEDTLS_VERSION_MINOR,
3254 MBEDTLS_VERSION_PATCH,
Joe Subbiani2194dc42021-07-14 12:31:31 +01003255 MBEDTLS_BYTE_1( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
3256 MBEDTLS_BYTE_0( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
Hanno Beckerf8787072019-05-16 12:41:07 +01003257};
Hanno Beckera835da52019-05-16 12:39:07 +01003258
3259/*
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003260 * Serialize a session in the following format:
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003261 * (in the presentation language of TLS, RFC 8446 section 3)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003262 *
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003263 * struct {
Hanno Beckerdc28b6c2019-05-29 11:08:00 +01003264 *
Hanno Beckerdce50972021-08-01 05:39:23 +01003265 * opaque mbedtls_version[3]; // library version: major, minor, patch
3266 * opaque session_format[2]; // library-version specific 16-bit field
3267 * // determining the format of the remaining
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003268 * // serialized data.
Hanno Beckerdc28b6c2019-05-29 11:08:00 +01003269 *
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003270 * Note: When updating the format, remember to keep
3271 * these version+format bytes.
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003272 *
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003273 * // In this version, `session_format` determines
3274 * // the setting of those compile-time
3275 * // configuration options which influence
3276 * // the structure of mbedtls_ssl_session.
3277 *
Hanno Beckerfa0d61e2021-08-02 08:56:14 +01003278 * uint8_t minor_ver; // Protocol-version. Possible values:
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003279 * // - TLS 1.2 (MBEDTLS_SSL_MINOR_VERSION_3)
3280 *
3281 * select (serialized_session.minor_ver) {
3282 *
3283 * case MBEDTLS_SSL_MINOR_VERSION_3: // TLS 1.2
3284 * serialized_session_tls12 data;
3285 *
3286 * };
3287 *
3288 * } serialized_session;
3289 *
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003290 */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003291
3292#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3293/* Serialization of TLS 1.2 sessions:
3294 *
3295 * struct {
3296 * uint64 start_time;
3297 * uint8 ciphersuite[2]; // defined by the standard
3298 * uint8 compression; // 0 or 1
3299 * uint8 session_id_len; // at most 32
3300 * opaque session_id[32];
3301 * opaque master[48]; // fixed length in the standard
3302 * uint32 verify_result;
3303 * opaque peer_cert<0..2^24-1>; // length 0 means no peer cert
3304 * opaque ticket<0..2^24-1>; // length 0 means no ticket
3305 * uint32 ticket_lifetime;
3306 * uint8 mfl_code; // up to 255 according to standard
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003307 * uint8 encrypt_then_mac; // 0 or 1
3308 * } serialized_session_tls12;
3309 *
3310 */
3311static size_t ssl_session_save_tls12( const mbedtls_ssl_session *session,
3312 unsigned char *buf,
3313 size_t buf_len )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003314{
3315 unsigned char *p = buf;
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003316 size_t used = 0;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003317
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003318#if defined(MBEDTLS_HAVE_TIME)
3319 uint64_t start;
3320#endif
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003321#if defined(MBEDTLS_X509_CRT_PARSE_C)
3322#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3323 size_t cert_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003324#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3325#endif /* MBEDTLS_X509_CRT_PARSE_C */
3326
Hanno Beckera835da52019-05-16 12:39:07 +01003327 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003328 * Time
3329 */
3330#if defined(MBEDTLS_HAVE_TIME)
3331 used += 8;
3332
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003333 if( used <= buf_len )
3334 {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003335 start = (uint64_t) session->start;
3336
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01003337 MBEDTLS_PUT_UINT64_BE( start, p, 0 );
3338 p += 8;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003339 }
3340#endif /* MBEDTLS_HAVE_TIME */
3341
3342 /*
3343 * Basic mandatory fields
3344 */
3345 used += 2 /* ciphersuite */
3346 + 1 /* compression */
3347 + 1 /* id_len */
3348 + sizeof( session->id )
3349 + sizeof( session->master )
3350 + 4; /* verify_result */
3351
3352 if( used <= buf_len )
3353 {
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01003354 MBEDTLS_PUT_UINT16_BE( session->ciphersuite, p, 0 );
3355 p += 2;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003356
Joe Subbiani2194dc42021-07-14 12:31:31 +01003357 *p++ = MBEDTLS_BYTE_0( session->compression );
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003358
Joe Subbiani2194dc42021-07-14 12:31:31 +01003359 *p++ = MBEDTLS_BYTE_0( session->id_len );
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003360 memcpy( p, session->id, 32 );
3361 p += 32;
3362
3363 memcpy( p, session->master, 48 );
3364 p += 48;
3365
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01003366 MBEDTLS_PUT_UINT32_BE( session->verify_result, p, 0 );
3367 p += 4;
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003368 }
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003369
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003370 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003371 * Peer's end-entity certificate
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003372 */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003373#if defined(MBEDTLS_X509_CRT_PARSE_C)
3374#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3375 if( session->peer_cert == NULL )
3376 cert_len = 0;
3377 else
3378 cert_len = session->peer_cert->raw.len;
3379
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003380 used += 3 + cert_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003381
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003382 if( used <= buf_len )
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003383 {
Joe Subbiani2194dc42021-07-14 12:31:31 +01003384 *p++ = MBEDTLS_BYTE_2( cert_len );
3385 *p++ = MBEDTLS_BYTE_1( cert_len );
3386 *p++ = MBEDTLS_BYTE_0( cert_len );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003387
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003388 if( session->peer_cert != NULL )
3389 {
3390 memcpy( p, session->peer_cert->raw.p, cert_len );
3391 p += cert_len;
3392 }
3393 }
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003394#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003395 if( session->peer_cert_digest != NULL )
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003396 {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003397 used += 1 /* type */ + 1 /* length */ + session->peer_cert_digest_len;
3398 if( used <= buf_len )
3399 {
3400 *p++ = (unsigned char) session->peer_cert_digest_type;
3401 *p++ = (unsigned char) session->peer_cert_digest_len;
3402 memcpy( p, session->peer_cert_digest,
3403 session->peer_cert_digest_len );
3404 p += session->peer_cert_digest_len;
3405 }
3406 }
3407 else
3408 {
3409 used += 2;
3410 if( used <= buf_len )
3411 {
3412 *p++ = (unsigned char) MBEDTLS_MD_NONE;
3413 *p++ = 0;
3414 }
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003415 }
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003416#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3417#endif /* MBEDTLS_X509_CRT_PARSE_C */
3418
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003419 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003420 * Session ticket if any, plus associated data
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003421 */
3422#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003423 used += 3 + session->ticket_len + 4; /* len + ticket + lifetime */
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003424
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003425 if( used <= buf_len )
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003426 {
Joe Subbiani2194dc42021-07-14 12:31:31 +01003427 *p++ = MBEDTLS_BYTE_2( session->ticket_len );
3428 *p++ = MBEDTLS_BYTE_1( session->ticket_len );
3429 *p++ = MBEDTLS_BYTE_0( session->ticket_len );
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003430
3431 if( session->ticket != NULL )
3432 {
3433 memcpy( p, session->ticket, session->ticket_len );
3434 p += session->ticket_len;
3435 }
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003436
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01003437 MBEDTLS_PUT_UINT32_BE( session->ticket_lifetime, p, 0 );
3438 p += 4;
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003439 }
3440#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
3441
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003442 /*
3443 * Misc extension-related info
3444 */
3445#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3446 used += 1;
3447
3448 if( used <= buf_len )
3449 *p++ = session->mfl_code;
3450#endif
3451
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003452#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
3453 used += 1;
3454
3455 if( used <= buf_len )
Joe Subbiani2194dc42021-07-14 12:31:31 +01003456 *p++ = MBEDTLS_BYTE_0( session->encrypt_then_mac );
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003457#endif
3458
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003459 return( used );
3460}
3461#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003462
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003463static int ssl_session_save( const mbedtls_ssl_session *session,
3464 unsigned char omit_header,
3465 unsigned char *buf,
3466 size_t buf_len,
3467 size_t *olen )
3468{
3469 unsigned char *p = buf;
3470 size_t used = 0;
3471
3472 if( !omit_header )
3473 {
3474 /*
3475 * Add Mbed TLS version identifier
3476 */
3477
3478 used += sizeof( ssl_serialized_session_header );
3479
3480 if( used <= buf_len )
3481 {
3482 memcpy( p, ssl_serialized_session_header,
3483 sizeof( ssl_serialized_session_header ) );
3484 p += sizeof( ssl_serialized_session_header );
3485 }
3486 }
3487
3488 /*
3489 * TLS version identifier
3490 */
3491 used += 1;
3492 if( used <= buf_len )
3493 {
3494 *p++ = session->minor_ver;
3495 }
3496
3497 /* Forward to version-specific serialization routine. */
3498 switch( session->minor_ver )
3499 {
3500#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3501 case MBEDTLS_SSL_MINOR_VERSION_3:
3502 {
3503 size_t remaining_len = used <= buf_len ? buf_len - used : 0;
3504 used += ssl_session_save_tls12( session, p, remaining_len );
3505 break;
3506 }
3507#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3508
3509 default:
3510 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3511 }
3512
3513 *olen = used;
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02003514 if( used > buf_len )
3515 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003516
3517 return( 0 );
3518}
3519
3520/*
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003521 * Public wrapper for ssl_session_save()
3522 */
3523int mbedtls_ssl_session_save( const mbedtls_ssl_session *session,
3524 unsigned char *buf,
3525 size_t buf_len,
3526 size_t *olen )
3527{
3528 return( ssl_session_save( session, 0, buf, buf_len, olen ) );
3529}
Jerry Yuc3091b12021-12-23 14:57:39 +08003530#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003531/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02003532 * Deserialize session, see mbedtls_ssl_session_save() for format.
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003533 *
3534 * This internal version is wrapped by a public function that cleans up in
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003535 * case of error, and has an extra option omit_header.
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003536 */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003537static int ssl_session_load_tls12( mbedtls_ssl_session *session,
3538 const unsigned char *buf,
3539 size_t len )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003540{
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003541#if defined(MBEDTLS_HAVE_TIME)
3542 uint64_t start;
3543#endif
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003544#if defined(MBEDTLS_X509_CRT_PARSE_C)
3545#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3546 size_t cert_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003547#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3548#endif /* MBEDTLS_X509_CRT_PARSE_C */
3549
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003550 const unsigned char *p = buf;
3551 const unsigned char * const end = buf + len;
Hanno Beckera835da52019-05-16 12:39:07 +01003552
3553 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003554 * Time
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003555 */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003556#if defined(MBEDTLS_HAVE_TIME)
3557 if( 8 > (size_t)( end - p ) )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003558 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3559
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003560 start = ( (uint64_t) p[0] << 56 ) |
3561 ( (uint64_t) p[1] << 48 ) |
3562 ( (uint64_t) p[2] << 40 ) |
3563 ( (uint64_t) p[3] << 32 ) |
3564 ( (uint64_t) p[4] << 24 ) |
3565 ( (uint64_t) p[5] << 16 ) |
3566 ( (uint64_t) p[6] << 8 ) |
3567 ( (uint64_t) p[7] );
3568 p += 8;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003569
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003570 session->start = (time_t) start;
3571#endif /* MBEDTLS_HAVE_TIME */
3572
3573 /*
3574 * Basic mandatory fields
3575 */
3576 if( 2 + 1 + 1 + 32 + 48 + 4 > (size_t)( end - p ) )
3577 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3578
3579 session->ciphersuite = ( p[0] << 8 ) | p[1];
3580 p += 2;
3581
3582 session->compression = *p++;
3583
3584 session->id_len = *p++;
3585 memcpy( session->id, p, 32 );
3586 p += 32;
3587
3588 memcpy( session->master, p, 48 );
3589 p += 48;
3590
3591 session->verify_result = ( (uint32_t) p[0] << 24 ) |
3592 ( (uint32_t) p[1] << 16 ) |
3593 ( (uint32_t) p[2] << 8 ) |
3594 ( (uint32_t) p[3] );
3595 p += 4;
3596
3597 /* Immediately clear invalid pointer values that have been read, in case
3598 * we exit early before we replaced them with valid ones. */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003599#if defined(MBEDTLS_X509_CRT_PARSE_C)
3600#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3601 session->peer_cert = NULL;
3602#else
3603 session->peer_cert_digest = NULL;
3604#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3605#endif /* MBEDTLS_X509_CRT_PARSE_C */
3606#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
3607 session->ticket = NULL;
3608#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
3609
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003610 /*
3611 * Peer certificate
3612 */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003613#if defined(MBEDTLS_X509_CRT_PARSE_C)
3614#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3615 /* Deserialize CRT from the end of the ticket. */
3616 if( 3 > (size_t)( end - p ) )
3617 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3618
3619 cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
3620 p += 3;
3621
3622 if( cert_len != 0 )
3623 {
Janos Follath865b3eb2019-12-16 11:46:15 +00003624 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003625
3626 if( cert_len > (size_t)( end - p ) )
3627 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3628
3629 session->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
3630
3631 if( session->peer_cert == NULL )
3632 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
3633
3634 mbedtls_x509_crt_init( session->peer_cert );
3635
3636 if( ( ret = mbedtls_x509_crt_parse_der( session->peer_cert,
3637 p, cert_len ) ) != 0 )
3638 {
3639 mbedtls_x509_crt_free( session->peer_cert );
3640 mbedtls_free( session->peer_cert );
3641 session->peer_cert = NULL;
3642 return( ret );
3643 }
3644
3645 p += cert_len;
3646 }
3647#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3648 /* Deserialize CRT digest from the end of the ticket. */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003649 if( 2 > (size_t)( end - p ) )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003650 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3651
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003652 session->peer_cert_digest_type = (mbedtls_md_type_t) *p++;
3653 session->peer_cert_digest_len = (size_t) *p++;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003654
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003655 if( session->peer_cert_digest_len != 0 )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003656 {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003657 const mbedtls_md_info_t *md_info =
3658 mbedtls_md_info_from_type( session->peer_cert_digest_type );
3659 if( md_info == NULL )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003660 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003661 if( session->peer_cert_digest_len != mbedtls_md_get_size( md_info ) )
3662 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003663
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003664 if( session->peer_cert_digest_len > (size_t)( end - p ) )
3665 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3666
3667 session->peer_cert_digest =
3668 mbedtls_calloc( 1, session->peer_cert_digest_len );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003669 if( session->peer_cert_digest == NULL )
3670 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
3671
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003672 memcpy( session->peer_cert_digest, p,
3673 session->peer_cert_digest_len );
3674 p += session->peer_cert_digest_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003675 }
3676#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
3677#endif /* MBEDTLS_X509_CRT_PARSE_C */
3678
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003679 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003680 * Session ticket and associated data
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003681 */
3682#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
3683 if( 3 > (size_t)( end - p ) )
3684 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3685
3686 session->ticket_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
3687 p += 3;
3688
3689 if( session->ticket_len != 0 )
3690 {
3691 if( session->ticket_len > (size_t)( end - p ) )
3692 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3693
3694 session->ticket = mbedtls_calloc( 1, session->ticket_len );
3695 if( session->ticket == NULL )
3696 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
3697
3698 memcpy( session->ticket, p, session->ticket_len );
3699 p += session->ticket_len;
3700 }
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003701
3702 if( 4 > (size_t)( end - p ) )
3703 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3704
3705 session->ticket_lifetime = ( (uint32_t) p[0] << 24 ) |
3706 ( (uint32_t) p[1] << 16 ) |
3707 ( (uint32_t) p[2] << 8 ) |
3708 ( (uint32_t) p[3] );
3709 p += 4;
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003710#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
3711
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003712 /*
3713 * Misc extension-related info
3714 */
3715#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3716 if( 1 > (size_t)( end - p ) )
3717 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3718
3719 session->mfl_code = *p++;
3720#endif
3721
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02003722#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
3723 if( 1 > (size_t)( end - p ) )
3724 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3725
3726 session->encrypt_then_mac = *p++;
3727#endif
3728
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02003729 /* Done, should have consumed entire buffer */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003730 if( p != end )
3731 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3732
3733 return( 0 );
3734}
Jerry Yuc5aef882021-12-23 20:15:02 +08003735#endif /*MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01003736static int ssl_session_load( mbedtls_ssl_session *session,
3737 unsigned char omit_header,
3738 const unsigned char *buf,
3739 size_t len )
3740{
3741 const unsigned char *p = buf;
3742 const unsigned char * const end = buf + len;
3743
3744 if( !omit_header )
3745 {
3746 /*
3747 * Check Mbed TLS version identifier
3748 */
3749
3750 if( (size_t)( end - p ) < sizeof( ssl_serialized_session_header ) )
3751 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3752
3753 if( memcmp( p, ssl_serialized_session_header,
3754 sizeof( ssl_serialized_session_header ) ) != 0 )
3755 {
3756 return( MBEDTLS_ERR_SSL_VERSION_MISMATCH );
3757 }
3758 p += sizeof( ssl_serialized_session_header );
3759 }
3760
3761 /*
3762 * TLS version identifier
3763 */
3764 if( 1 > (size_t)( end - p ) )
3765 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3766 session->minor_ver = *p++;
3767
3768 /* Dispatch according to TLS version. */
3769 switch( session->minor_ver )
3770 {
3771#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3772 case MBEDTLS_SSL_MINOR_VERSION_3: /* TLS 1.2 */
3773 {
3774 size_t remaining_len = ( end - p );
3775 return( ssl_session_load_tls12( session, p, remaining_len ) );
3776 }
3777#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3778
3779 default:
3780 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3781 }
3782}
3783
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02003784/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02003785 * Deserialize session: public wrapper for error cleaning
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003786 */
3787int mbedtls_ssl_session_load( mbedtls_ssl_session *session,
3788 const unsigned char *buf,
3789 size_t len )
3790{
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02003791 int ret = ssl_session_load( session, 0, buf, len );
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02003792
3793 if( ret != 0 )
3794 mbedtls_ssl_session_free( session );
3795
3796 return( ret );
3797}
3798
3799/*
Paul Bakker1961b702013-01-25 14:49:24 +01003800 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003801 */
Hanno Becker41934dd2021-08-07 19:13:43 +01003802static int ssl_prepare_handshake_step( mbedtls_ssl_context *ssl )
3803{
3804 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3805
3806 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
3807 return( ret );
3808
3809#if defined(MBEDTLS_SSL_PROTO_DTLS)
3810 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3811 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
3812 {
3813 if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
3814 return( ret );
3815 }
3816#endif /* MBEDTLS_SSL_PROTO_DTLS */
3817
3818 return( ret );
3819}
3820
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003821int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003822{
Hanno Becker41934dd2021-08-07 19:13:43 +01003823 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003824
Hanno Becker41934dd2021-08-07 19:13:43 +01003825 if( ssl == NULL ||
3826 ssl->conf == NULL ||
3827 ssl->handshake == NULL ||
3828 ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
3829 {
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02003830 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Hanno Becker41934dd2021-08-07 19:13:43 +01003831 }
3832
3833 ret = ssl_prepare_handshake_step( ssl );
3834 if( ret != 0 )
3835 return( ret );
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02003836
Jerry Yue7047812021-09-13 19:26:39 +08003837 ret = mbedtls_ssl_handle_pending_alert( ssl );
3838 if( ret != 0 )
3839 goto cleanup;
3840
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003841#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003842 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Jerry Yub9930e72021-08-06 17:11:51 +08003843 {
Ronald Cron6f135e12021-12-08 16:57:54 +01003844#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yub9930e72021-08-06 17:11:51 +08003845 if( mbedtls_ssl_conf_is_tls13_only( ssl->conf ) )
Jerry Yuf4436812021-08-26 22:59:56 +08003846 ret = mbedtls_ssl_tls13_handshake_client_step( ssl );
Ronald Cron6f135e12021-12-08 16:57:54 +01003847#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Jerry Yub9930e72021-08-06 17:11:51 +08003848
3849#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3850 if( mbedtls_ssl_conf_is_tls12_only( ssl->conf ) )
3851 ret = mbedtls_ssl_handshake_client_step( ssl );
3852#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3853 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003854#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003855#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003856 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Jerry Yub9930e72021-08-06 17:11:51 +08003857 {
Ronald Cron6f135e12021-12-08 16:57:54 +01003858#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yub9930e72021-08-06 17:11:51 +08003859 if( mbedtls_ssl_conf_is_tls13_only( ssl->conf ) )
Jerry Yu27561932021-08-27 17:07:38 +08003860 ret = mbedtls_ssl_tls13_handshake_server_step( ssl );
Ronald Cron6f135e12021-12-08 16:57:54 +01003861#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Jerry Yub9930e72021-08-06 17:11:51 +08003862
3863#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3864 if( mbedtls_ssl_conf_is_tls12_only( ssl->conf ) )
3865 ret = mbedtls_ssl_handshake_server_step( ssl );
3866#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3867 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003868#endif
3869
Jerry Yue7047812021-09-13 19:26:39 +08003870 if( ret != 0 )
3871 {
Jerry Yubbd5a3f2021-09-18 20:50:22 +08003872 /* handshake_step return error. And it is same
3873 * with alert_reason.
3874 */
Jerry Yu3bf1f972021-09-22 21:37:18 +08003875 if( ssl->send_alert )
Jerry Yue7047812021-09-13 19:26:39 +08003876 {
Jerry Yu3bf1f972021-09-22 21:37:18 +08003877 ret = mbedtls_ssl_handle_pending_alert( ssl );
Jerry Yue7047812021-09-13 19:26:39 +08003878 goto cleanup;
3879 }
3880 }
3881
3882cleanup:
Paul Bakker1961b702013-01-25 14:49:24 +01003883 return( ret );
3884}
3885
3886/*
3887 * Perform the SSL handshake
3888 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003889int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl )
Paul Bakker1961b702013-01-25 14:49:24 +01003890{
3891 int ret = 0;
3892
Hanno Beckera817ea42020-10-20 15:20:23 +01003893 /* Sanity checks */
3894
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02003895 if( ssl == NULL || ssl->conf == NULL )
3896 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3897
Hanno Beckera817ea42020-10-20 15:20:23 +01003898#if defined(MBEDTLS_SSL_PROTO_DTLS)
3899 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3900 ( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL ) )
3901 {
3902 MBEDTLS_SSL_DEBUG_MSG( 1, ( "You must use "
3903 "mbedtls_ssl_set_timer_cb() for DTLS" ) );
3904 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3905 }
3906#endif /* MBEDTLS_SSL_PROTO_DTLS */
3907
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003908 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
Paul Bakker1961b702013-01-25 14:49:24 +01003909
Hanno Beckera817ea42020-10-20 15:20:23 +01003910 /* Main handshake loop */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003911 while( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Paul Bakker1961b702013-01-25 14:49:24 +01003912 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003913 ret = mbedtls_ssl_handshake_step( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01003914
3915 if( ret != 0 )
3916 break;
3917 }
3918
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003919 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003920
3921 return( ret );
3922}
3923
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003924#if defined(MBEDTLS_SSL_RENEGOTIATION)
3925#if defined(MBEDTLS_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003926/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003927 * Write HelloRequest to request renegotiation on server
Paul Bakker48916f92012-09-16 19:57:18 +00003928 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003929static int ssl_write_hello_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003930{
Janos Follath865b3eb2019-12-16 11:46:15 +00003931 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003932
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003933 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello request" ) );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003934
3935 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003936 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3937 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003938
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003939 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003940 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003941 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003942 return( ret );
3943 }
3944
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003945 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello request" ) );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003946
3947 return( 0 );
3948}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003949#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003950
3951/*
3952 * Actually renegotiate current connection, triggered by either:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003953 * - any side: calling mbedtls_ssl_renegotiate(),
3954 * - client: receiving a HelloRequest during mbedtls_ssl_read(),
3955 * - server: receiving any handshake message on server during mbedtls_ssl_read() after
Manuel Pégourié-Gonnard55e4ff22014-08-19 11:16:35 +02003956 * the initial handshake is completed.
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003957 * If the handshake doesn't complete due to waiting for I/O, it will continue
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003958 * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively.
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003959 */
Hanno Becker40cdaa12020-02-05 10:48:27 +00003960int mbedtls_ssl_start_renegotiation( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00003961{
Janos Follath865b3eb2019-12-16 11:46:15 +00003962 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker48916f92012-09-16 19:57:18 +00003963
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003964 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003965
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01003966 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3967 return( ret );
Paul Bakker48916f92012-09-16 19:57:18 +00003968
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02003969 /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and
3970 * the ServerHello will have message_seq = 1" */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003971#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003972 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003973 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02003974 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003975 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02003976 ssl->handshake->out_msg_seq = 1;
3977 else
3978 ssl->handshake->in_msg_seq = 1;
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02003979 }
3980#endif
3981
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003982 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
3983 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS;
Paul Bakker48916f92012-09-16 19:57:18 +00003984
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003985 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00003986 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003987 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Paul Bakker48916f92012-09-16 19:57:18 +00003988 return( ret );
3989 }
3990
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003991 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003992
3993 return( 0 );
3994}
3995
3996/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01003997 * Renegotiate current connection on client,
3998 * or request renegotiation on server
3999 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004000int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004001{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004002 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004003
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02004004 if( ssl == NULL || ssl->conf == NULL )
4005 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4006
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004007#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004008 /* On server, just send the request */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02004009 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004010 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004011 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
4012 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004014 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02004015
4016 /* Did we already try/start sending HelloRequest? */
4017 if( ssl->out_left != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004018 return( mbedtls_ssl_flush_output( ssl ) );
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02004019
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004020 return( ssl_write_hello_request( ssl ) );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004021 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004022#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004023
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004024#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004025 /*
4026 * On client, either start the renegotiation process or,
4027 * if already in progress, continue the handshake
4028 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004029 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004030 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004031 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
4032 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004033
Hanno Becker40cdaa12020-02-05 10:48:27 +00004034 if( ( ret = mbedtls_ssl_start_renegotiation( ssl ) ) != 0 )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004035 {
Hanno Becker40cdaa12020-02-05 10:48:27 +00004036 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_start_renegotiation", ret );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004037 return( ret );
4038 }
4039 }
4040 else
4041 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004042 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004043 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004044 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004045 return( ret );
4046 }
4047 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004048#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004049
Paul Bakker37ce0ff2013-10-31 14:32:04 +01004050 return( ret );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004051}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004052#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004053
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004054#if defined(MBEDTLS_X509_CRT_PARSE_C)
4055static void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert )
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02004056{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004057 mbedtls_ssl_key_cert *cur = key_cert, *next;
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02004058
4059 while( cur != NULL )
4060 {
4061 next = cur->next;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004062 mbedtls_free( cur );
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02004063 cur = next;
4064 }
4065}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004066#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02004067
Gilles Peskine9b562d52018-04-25 20:32:43 +02004068void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00004069{
Gilles Peskine9b562d52018-04-25 20:32:43 +02004070 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
4071
Paul Bakkeraccaffe2014-06-26 13:37:14 +02004072 if( handshake == NULL )
4073 return;
4074
Brett Warrene0edc842021-08-17 09:53:13 +01004075#if defined(MBEDTLS_ECP_C)
4076#if !defined(MBEDTLS_DEPRECATED_REMOVED)
4077 if ( ssl->handshake->group_list_heap_allocated )
4078 mbedtls_free( (void*) handshake->group_list );
4079 handshake->group_list = NULL;
4080#endif /* MBEDTLS_DEPRECATED_REMOVED */
4081#endif /* MBEDTLS_ECP_C */
4082
Jerry Yuf017ee42022-01-12 15:49:48 +08004083#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
4084#if !defined(MBEDTLS_DEPRECATED_REMOVED)
4085 if ( ssl->handshake->sig_algs_heap_allocated )
4086 mbedtls_free( (void*) handshake->sig_algs );
4087 handshake->sig_algs = NULL;
4088#endif /* MBEDTLS_DEPRECATED_REMOVED */
Xiaofei Baic234ecf2022-02-08 09:59:23 +00004089#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
4090 if( ssl->handshake->certificate_request_context )
4091 {
4092 mbedtls_free( (void*) handshake->certificate_request_context );
4093 }
4094#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Jerry Yuf017ee42022-01-12 15:49:48 +08004095#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
4096
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004097#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
4098 if( ssl->conf->f_async_cancel != NULL && handshake->async_in_progress != 0 )
4099 {
Gilles Peskine8f97af72018-04-26 11:46:10 +02004100 ssl->conf->f_async_cancel( ssl );
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004101 handshake->async_in_progress = 0;
4102 }
4103#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
4104
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02004105#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05004106#if defined(MBEDTLS_USE_PSA_CRYPTO)
4107 psa_hash_abort( &handshake->fin_sha256_psa );
4108#else
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02004109 mbedtls_sha256_free( &handshake->fin_sha256 );
4110#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05004111#endif
Mateusz Starzykc6d94ab2021-05-19 13:31:59 +02004112#if defined(MBEDTLS_SHA384_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05004113#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05004114 psa_hash_abort( &handshake->fin_sha384_psa );
Andrzej Kurekeb342242019-01-29 09:14:33 -05004115#else
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02004116 mbedtls_sha512_free( &handshake->fin_sha512 );
4117#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05004118#endif
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02004119
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004120#if defined(MBEDTLS_DHM_C)
4121 mbedtls_dhm_free( &handshake->dhm_ctx );
Paul Bakker48916f92012-09-16 19:57:18 +00004122#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004123#if defined(MBEDTLS_ECDH_C)
4124 mbedtls_ecdh_free( &handshake->ecdh_ctx );
Paul Bakker61d113b2013-07-04 11:51:43 +02004125#endif
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02004126#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02004127 mbedtls_ecjpake_free( &handshake->ecjpake_ctx );
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02004128#if defined(MBEDTLS_SSL_CLI_C)
4129 mbedtls_free( handshake->ecjpake_cache );
4130 handshake->ecjpake_cache = NULL;
4131 handshake->ecjpake_cache_len = 0;
4132#endif
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02004133#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02004134
Janos Follath4ae5c292016-02-10 11:27:43 +00004135#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
4136 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Paul Bakker9af723c2014-05-01 13:03:14 +02004137 /* explicit void pointer cast for buggy MS compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004138 mbedtls_free( (void *) handshake->curves );
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +02004139#endif
4140
Gilles Peskineeccd8882020-03-10 12:19:08 +01004141#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01004142 if( handshake->psk != NULL )
4143 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004144 mbedtls_platform_zeroize( handshake->psk, handshake->psk_len );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01004145 mbedtls_free( handshake->psk );
4146 }
4147#endif
4148
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004149#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
4150 defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02004151 /*
4152 * Free only the linked list wrapper, not the keys themselves
4153 * since the belong to the SNI callback
4154 */
4155 if( handshake->sni_key_cert != NULL )
4156 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004157 mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next;
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02004158
4159 while( cur != NULL )
4160 {
4161 next = cur->next;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004162 mbedtls_free( cur );
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02004163 cur = next;
4164 }
4165 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004166#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02004167
Gilles Peskineeccd8882020-03-10 12:19:08 +01004168#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard6b7301c2017-08-15 12:08:45 +02004169 mbedtls_x509_crt_restart_free( &handshake->ecrs_ctx );
Hanno Becker3dad3112019-02-05 17:19:52 +00004170 if( handshake->ecrs_peer_cert != NULL )
4171 {
4172 mbedtls_x509_crt_free( handshake->ecrs_peer_cert );
4173 mbedtls_free( handshake->ecrs_peer_cert );
4174 }
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02004175#endif
4176
Hanno Becker75173122019-02-06 16:18:31 +00004177#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
4178 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4179 mbedtls_pk_free( &handshake->peer_pubkey );
4180#endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4181
XiaokangQian34909742022-01-27 02:25:04 +00004182#if defined(MBEDTLS_SSL_PROTO_DTLS) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004183 mbedtls_free( handshake->verify_cookie );
XiaokangQian8499b6c2022-01-27 09:00:11 +00004184#endif /* MBEDTLS_SSL_PROTO_DTLS || MBEDTLS_SSL_PROTO_TLS1_3 */
4185
4186#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker533ab5f2020-02-05 10:49:13 +00004187 mbedtls_ssl_flight_free( handshake->flight );
4188 mbedtls_ssl_buffering_free( ssl );
XiaokangQian8499b6c2022-01-27 09:00:11 +00004189#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02004190
Hanno Becker4a63ed42019-01-08 11:39:35 +00004191#if defined(MBEDTLS_ECDH_C) && \
4192 defined(MBEDTLS_USE_PSA_CRYPTO)
4193 psa_destroy_key( handshake->ecdh_psa_privkey );
4194#endif /* MBEDTLS_ECDH_C && MBEDTLS_USE_PSA_CRYPTO */
4195
Ronald Cron6f135e12021-12-08 16:57:54 +01004196#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Jerry Yua1a568c2021-11-09 10:17:21 +08004197 mbedtls_ssl_transform_free( handshake->transform_handshake );
4198 mbedtls_ssl_transform_free( handshake->transform_earlydata );
Jerry Yuba9c7272021-10-30 11:54:10 +08004199 mbedtls_free( handshake->transform_earlydata );
4200 mbedtls_free( handshake->transform_handshake );
Ronald Cron6f135e12021-12-08 16:57:54 +01004201#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Jerry Yuba9c7272021-10-30 11:54:10 +08004202
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004203
4204#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
4205 /* If the buffers are too big - reallocate. Because of the way Mbed TLS
4206 * processes datagrams and the fact that a datagram is allowed to have
4207 * several records in it, it is possible that the I/O buffers are not
4208 * empty at this stage */
Andrzej Kurek4a063792020-10-21 15:08:44 +02004209 handle_buffer_resizing( ssl, 1, mbedtls_ssl_get_input_buflen( ssl ),
4210 mbedtls_ssl_get_output_buflen( ssl ) );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004211#endif
Hanno Becker3aa186f2021-08-10 09:24:19 +01004212
Jerry Yuba9c7272021-10-30 11:54:10 +08004213 /* mbedtls_platform_zeroize MUST be last one in this function */
4214 mbedtls_platform_zeroize( handshake,
4215 sizeof( mbedtls_ssl_handshake_params ) );
Paul Bakker48916f92012-09-16 19:57:18 +00004216}
4217
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004218void mbedtls_ssl_session_free( mbedtls_ssl_session *session )
Paul Bakker48916f92012-09-16 19:57:18 +00004219{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02004220 if( session == NULL )
4221 return;
4222
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004223#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker1294a0b2019-02-05 12:38:15 +00004224 ssl_clear_peer_cert( session );
Paul Bakkered27a042013-04-18 22:46:23 +02004225#endif
Paul Bakker0a597072012-09-25 21:55:46 +00004226
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02004227#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004228 mbedtls_free( session->ticket );
Paul Bakkera503a632013-08-14 13:48:06 +02004229#endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02004230
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004231 mbedtls_platform_zeroize( session, sizeof( mbedtls_ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00004232}
4233
Manuel Pégourié-Gonnard5c0e3772019-07-23 16:13:17 +02004234#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02004235
4236#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
4237#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 1u
4238#else
4239#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 0u
4240#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
4241
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02004242#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 1u
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02004243
4244#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
4245#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 1u
4246#else
4247#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 0u
4248#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
4249
4250#if defined(MBEDTLS_SSL_ALPN)
4251#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 1u
4252#else
4253#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 0u
4254#endif /* MBEDTLS_SSL_ALPN */
4255
4256#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT 0
4257#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT 1
4258#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT 2
4259#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT 3
4260
4261#define SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG \
4262 ( (uint32_t) ( \
4263 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT ) | \
4264 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT ) | \
4265 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT ) | \
4266 ( SSL_SERIALIZED_CONTEXT_CONFIG_ALPN << SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT ) | \
4267 0u ) )
4268
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004269static unsigned char ssl_serialized_context_header[] = {
4270 MBEDTLS_VERSION_MAJOR,
4271 MBEDTLS_VERSION_MINOR,
4272 MBEDTLS_VERSION_PATCH,
Joe Subbiani2194dc42021-07-14 12:31:31 +01004273 MBEDTLS_BYTE_1( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
4274 MBEDTLS_BYTE_0( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
4275 MBEDTLS_BYTE_2( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
4276 MBEDTLS_BYTE_1( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
4277 MBEDTLS_BYTE_0( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004278};
4279
Paul Bakker5121ce52009-01-03 21:22:43 +00004280/*
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02004281 * Serialize a full SSL context
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02004282 *
4283 * The format of the serialized data is:
4284 * (in the presentation language of TLS, RFC 8446 section 3)
4285 *
4286 * // header
4287 * opaque mbedtls_version[3]; // major, minor, patch
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004288 * opaque context_format[5]; // version-specific field determining
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02004289 * // the format of the remaining
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004290 * // serialized data.
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02004291 * Note: When updating the format, remember to keep these
4292 * version+format bytes. (We may make their size part of the API.)
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02004293 *
4294 * // session sub-structure
4295 * opaque session<1..2^32-1>; // see mbedtls_ssl_session_save()
4296 * // transform sub-structure
4297 * uint8 random[64]; // ServerHello.random+ClientHello.random
4298 * uint8 in_cid<0..2^8-1> // Connection ID: expected incoming value
4299 * uint8 out_cid<0..2^8-1> // Connection ID: outgoing value to use
4300 * // fields from ssl_context
4301 * uint32 badmac_seen; // DTLS: number of records with failing MAC
4302 * uint64 in_window_top; // DTLS: last validated record seq_num
4303 * uint64 in_window; // DTLS: bitmask for replay protection
4304 * uint8 disable_datagram_packing; // DTLS: only one record per datagram
4305 * uint64 cur_out_ctr; // Record layer: outgoing sequence number
4306 * uint16 mtu; // DTLS: path mtu (max outgoing fragment size)
4307 * uint8 alpn_chosen<0..2^8-1> // ALPN: negotiated application protocol
4308 *
4309 * Note that many fields of the ssl_context or sub-structures are not
4310 * serialized, as they fall in one of the following categories:
4311 *
4312 * 1. forced value (eg in_left must be 0)
4313 * 2. pointer to dynamically-allocated memory (eg session, transform)
4314 * 3. value can be re-derived from other data (eg session keys from MS)
4315 * 4. value was temporary (eg content of input buffer)
4316 * 5. value will be provided by the user again (eg I/O callbacks and context)
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02004317 */
4318int mbedtls_ssl_context_save( mbedtls_ssl_context *ssl,
4319 unsigned char *buf,
4320 size_t buf_len,
4321 size_t *olen )
4322{
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004323 unsigned char *p = buf;
4324 size_t used = 0;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004325 size_t session_len;
4326 int ret = 0;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004327
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02004328 /*
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004329 * Enforce usage restrictions, see "return BAD_INPUT_DATA" in
4330 * this function's documentation.
4331 *
4332 * These are due to assumptions/limitations in the implementation. Some of
4333 * them are likely to stay (no handshake in progress) some might go away
4334 * (only DTLS) but are currently used to simplify the implementation.
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02004335 */
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004336 /* The initial handshake must be over */
4337 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004338 {
4339 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Initial handshake isn't over" ) );
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02004340 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004341 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004342 if( ssl->handshake != NULL )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004343 {
4344 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Handshake isn't completed" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004345 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004346 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004347 /* Double-check that sub-structures are indeed ready */
4348 if( ssl->transform == NULL || ssl->session == NULL )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004349 {
4350 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Serialised structures aren't ready" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004351 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004352 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004353 /* There must be no pending incoming or outgoing data */
4354 if( mbedtls_ssl_check_pending( ssl ) != 0 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004355 {
4356 MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending incoming data" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004357 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004358 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004359 if( ssl->out_left != 0 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004360 {
4361 MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending outgoing data" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004362 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004363 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004364 /* Protocol must be DLTS, not TLS */
4365 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004366 {
4367 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only DTLS is supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004368 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004369 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004370 /* Version must be 1.2 */
4371 if( ssl->major_ver != MBEDTLS_SSL_MAJOR_VERSION_3 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004372 {
4373 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only version 1.2 supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004374 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004375 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004376 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004377 {
4378 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only version 1.2 supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004379 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004380 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004381 /* We must be using an AEAD ciphersuite */
4382 if( mbedtls_ssl_transform_uses_aead( ssl->transform ) != 1 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004383 {
4384 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only AEAD ciphersuites supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004385 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004386 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004387 /* Renegotiation must not be enabled */
4388#if defined(MBEDTLS_SSL_RENEGOTIATION)
4389 if( ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004390 {
4391 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Renegotiation must not be enabled" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004392 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03004393 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02004394#endif
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02004395
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004396 /*
4397 * Version and format identifier
4398 */
4399 used += sizeof( ssl_serialized_context_header );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02004400
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004401 if( used <= buf_len )
4402 {
4403 memcpy( p, ssl_serialized_context_header,
4404 sizeof( ssl_serialized_context_header ) );
4405 p += sizeof( ssl_serialized_context_header );
4406 }
4407
4408 /*
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004409 * Session (length + data)
4410 */
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02004411 ret = ssl_session_save( ssl->session, 1, NULL, 0, &session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004412 if( ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL )
4413 return( ret );
4414
4415 used += 4 + session_len;
4416 if( used <= buf_len )
4417 {
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01004418 MBEDTLS_PUT_UINT32_BE( session_len, p, 0 );
4419 p += 4;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004420
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02004421 ret = ssl_session_save( ssl->session, 1,
4422 p, session_len, &session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004423 if( ret != 0 )
4424 return( ret );
4425
4426 p += session_len;
4427 }
4428
4429 /*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004430 * Transform
4431 */
4432 used += sizeof( ssl->transform->randbytes );
4433 if( used <= buf_len )
4434 {
4435 memcpy( p, ssl->transform->randbytes,
4436 sizeof( ssl->transform->randbytes ) );
4437 p += sizeof( ssl->transform->randbytes );
4438 }
4439
4440#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
4441 used += 2 + ssl->transform->in_cid_len + ssl->transform->out_cid_len;
4442 if( used <= buf_len )
4443 {
4444 *p++ = ssl->transform->in_cid_len;
4445 memcpy( p, ssl->transform->in_cid, ssl->transform->in_cid_len );
4446 p += ssl->transform->in_cid_len;
4447
4448 *p++ = ssl->transform->out_cid_len;
4449 memcpy( p, ssl->transform->out_cid, ssl->transform->out_cid_len );
4450 p += ssl->transform->out_cid_len;
4451 }
4452#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
4453
4454 /*
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004455 * Saved fields from top-level ssl_context structure
4456 */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004457 used += 4;
4458 if( used <= buf_len )
4459 {
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01004460 MBEDTLS_PUT_UINT32_BE( ssl->badmac_seen, p, 0 );
4461 p += 4;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004462 }
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004463
4464#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
4465 used += 16;
4466 if( used <= buf_len )
4467 {
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01004468 MBEDTLS_PUT_UINT64_BE( ssl->in_window_top, p, 0 );
4469 p += 8;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004470
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01004471 MBEDTLS_PUT_UINT64_BE( ssl->in_window, p, 0 );
4472 p += 8;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004473 }
4474#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
4475
4476#if defined(MBEDTLS_SSL_PROTO_DTLS)
4477 used += 1;
4478 if( used <= buf_len )
4479 {
4480 *p++ = ssl->disable_datagram_packing;
4481 }
4482#endif /* MBEDTLS_SSL_PROTO_DTLS */
4483
Jerry Yuae0b2e22021-10-08 15:21:19 +08004484 used += MBEDTLS_SSL_SEQUENCE_NUMBER_LEN;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004485 if( used <= buf_len )
4486 {
Jerry Yuae0b2e22021-10-08 15:21:19 +08004487 memcpy( p, ssl->cur_out_ctr, MBEDTLS_SSL_SEQUENCE_NUMBER_LEN );
4488 p += MBEDTLS_SSL_SEQUENCE_NUMBER_LEN;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004489 }
4490
4491#if defined(MBEDTLS_SSL_PROTO_DTLS)
4492 used += 2;
4493 if( used <= buf_len )
4494 {
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +01004495 MBEDTLS_PUT_UINT16_BE( ssl->mtu, p, 0 );
4496 p += 2;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004497 }
4498#endif /* MBEDTLS_SSL_PROTO_DTLS */
4499
4500#if defined(MBEDTLS_SSL_ALPN)
4501 {
4502 const uint8_t alpn_len = ssl->alpn_chosen
Manuel Pégourié-Gonnardf041f4e2019-07-24 00:58:27 +02004503 ? (uint8_t) strlen( ssl->alpn_chosen )
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004504 : 0;
4505
4506 used += 1 + alpn_len;
4507 if( used <= buf_len )
4508 {
4509 *p++ = alpn_len;
4510
4511 if( ssl->alpn_chosen != NULL )
4512 {
4513 memcpy( p, ssl->alpn_chosen, alpn_len );
4514 p += alpn_len;
4515 }
4516 }
4517 }
4518#endif /* MBEDTLS_SSL_ALPN */
4519
4520 /*
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004521 * Done
4522 */
4523 *olen = used;
4524
4525 if( used > buf_len )
4526 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02004527
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004528 MBEDTLS_SSL_DEBUG_BUF( 4, "saved context", buf, used );
4529
Hanno Becker43aefe22020-02-05 10:44:56 +00004530 return( mbedtls_ssl_session_reset_int( ssl, 0 ) );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02004531}
4532
4533/*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004534 * Helper to get TLS 1.2 PRF from ciphersuite
4535 * (Duplicates bits of logic from ssl_set_handshake_prfs().)
4536 */
4537typedef int (*tls_prf_fn)( const unsigned char *secret, size_t slen,
4538 const char *label,
4539 const unsigned char *random, size_t rlen,
4540 unsigned char *dstbuf, size_t dlen );
4541static tls_prf_fn ssl_tls12prf_from_cs( int ciphersuite_id )
4542{
Jerry Yuc3091b12021-12-23 14:57:39 +08004543#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Mateusz Starzykc6d94ab2021-05-19 13:31:59 +02004544#if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004545 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
4546 mbedtls_ssl_ciphersuite_from_id( ciphersuite_id );
4547
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02004548 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
4549 return( tls_prf_sha384 );
Jarno Lamsab7b486c2019-08-21 15:30:44 +03004550#else
4551 (void) ciphersuite_id;
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02004552#endif
4553 return( tls_prf_sha256 );
Jerry Yu53d23e22022-02-09 16:25:09 +08004554#else /* MBEDTLS_SSL_PROTO_TLS1_2 */
Jerry Yuc5aef882021-12-23 20:15:02 +08004555 (void) ciphersuite_id;
4556 return( NULL );
Jerry Yu53d23e22022-02-09 16:25:09 +08004557#endif /* !MBEDTLS_SSL_PROTO_TLS1_2 */
Jerry Yuc3091b12021-12-23 14:57:39 +08004558
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004559}
4560
4561/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02004562 * Deserialize context, see mbedtls_ssl_context_save() for format.
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004563 *
4564 * This internal version is wrapped by a public function that cleans up in
4565 * case of error.
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02004566 */
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004567static int ssl_context_load( mbedtls_ssl_context *ssl,
4568 const unsigned char *buf,
4569 size_t len )
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02004570{
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004571 const unsigned char *p = buf;
4572 const unsigned char * const end = buf + len;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004573 size_t session_len;
Janos Follath865b3eb2019-12-16 11:46:15 +00004574 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004575
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02004576 /*
4577 * The context should have been freshly setup or reset.
4578 * Give the user an error in case of obvious misuse.
Manuel Pégourié-Gonnard4ca930f2019-07-26 16:31:53 +02004579 * (Checking session is useful because it won't be NULL if we're
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02004580 * renegotiating, or if the user mistakenly loaded a session first.)
4581 */
4582 if( ssl->state != MBEDTLS_SSL_HELLO_REQUEST ||
4583 ssl->session != NULL )
4584 {
4585 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4586 }
4587
4588 /*
4589 * We can't check that the config matches the initial one, but we can at
4590 * least check it matches the requirements for serializing.
4591 */
4592 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
4593 ssl->conf->max_major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
4594 ssl->conf->min_major_ver > MBEDTLS_SSL_MAJOR_VERSION_3 ||
4595 ssl->conf->max_minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ||
4596 ssl->conf->min_minor_ver > MBEDTLS_SSL_MINOR_VERSION_3 ||
4597#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02004598 ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED ||
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02004599#endif
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02004600 0 )
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02004601 {
4602 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4603 }
4604
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004605 MBEDTLS_SSL_DEBUG_BUF( 4, "context to load", buf, len );
4606
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004607 /*
4608 * Check version identifier
4609 */
4610 if( (size_t)( end - p ) < sizeof( ssl_serialized_context_header ) )
4611 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4612
4613 if( memcmp( p, ssl_serialized_context_header,
4614 sizeof( ssl_serialized_context_header ) ) != 0 )
4615 {
4616 return( MBEDTLS_ERR_SSL_VERSION_MISMATCH );
4617 }
4618 p += sizeof( ssl_serialized_context_header );
4619
4620 /*
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004621 * Session
4622 */
4623 if( (size_t)( end - p ) < 4 )
4624 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4625
4626 session_len = ( (size_t) p[0] << 24 ) |
4627 ( (size_t) p[1] << 16 ) |
4628 ( (size_t) p[2] << 8 ) |
4629 ( (size_t) p[3] );
4630 p += 4;
4631
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02004632 /* This has been allocated by ssl_handshake_init(), called by
Hanno Becker43aefe22020-02-05 10:44:56 +00004633 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02004634 ssl->session = ssl->session_negotiate;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004635 ssl->session_in = ssl->session;
4636 ssl->session_out = ssl->session;
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02004637 ssl->session_negotiate = NULL;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004638
4639 if( (size_t)( end - p ) < session_len )
4640 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4641
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02004642 ret = ssl_session_load( ssl->session, 1, p, session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004643 if( ret != 0 )
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02004644 {
4645 mbedtls_ssl_session_free( ssl->session );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004646 return( ret );
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02004647 }
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004648
4649 p += session_len;
4650
4651 /*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004652 * Transform
4653 */
4654
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02004655 /* This has been allocated by ssl_handshake_init(), called by
Hanno Becker43aefe22020-02-05 10:44:56 +00004656 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02004657 ssl->transform = ssl->transform_negotiate;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004658 ssl->transform_in = ssl->transform;
4659 ssl->transform_out = ssl->transform;
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02004660 ssl->transform_negotiate = NULL;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004661
4662 /* Read random bytes and populate structure */
4663 if( (size_t)( end - p ) < sizeof( ssl->transform->randbytes ) )
4664 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4665
Hanno Beckerbd257552021-03-22 06:59:27 +00004666 ret = ssl_tls12_populate_transform( ssl->transform,
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004667 ssl->session->ciphersuite,
4668 ssl->session->master,
Hanno Beckerbd257552021-03-22 06:59:27 +00004669#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC) && \
4670 defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004671 ssl->session->encrypt_then_mac,
Hanno Beckerbd257552021-03-22 06:59:27 +00004672#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC &&
4673 MBEDTLS_SSL_SOME_SUITES_USE_MAC */
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004674 ssl_tls12prf_from_cs( ssl->session->ciphersuite ),
4675 p, /* currently pointing to randbytes */
4676 MBEDTLS_SSL_MINOR_VERSION_3, /* (D)TLS 1.2 is forced */
4677 ssl->conf->endpoint,
4678 ssl );
4679 if( ret != 0 )
4680 return( ret );
4681
4682 p += sizeof( ssl->transform->randbytes );
4683
4684#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
4685 /* Read connection IDs and store them */
4686 if( (size_t)( end - p ) < 1 )
4687 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4688
4689 ssl->transform->in_cid_len = *p++;
4690
Manuel Pégourié-Gonnard5ea13b82019-07-23 15:02:54 +02004691 if( (size_t)( end - p ) < ssl->transform->in_cid_len + 1u )
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02004692 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4693
4694 memcpy( ssl->transform->in_cid, p, ssl->transform->in_cid_len );
4695 p += ssl->transform->in_cid_len;
4696
4697 ssl->transform->out_cid_len = *p++;
4698
4699 if( (size_t)( end - p ) < ssl->transform->out_cid_len )
4700 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4701
4702 memcpy( ssl->transform->out_cid, p, ssl->transform->out_cid_len );
4703 p += ssl->transform->out_cid_len;
4704#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
4705
4706 /*
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004707 * Saved fields from top-level ssl_context structure
4708 */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004709 if( (size_t)( end - p ) < 4 )
4710 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4711
4712 ssl->badmac_seen = ( (uint32_t) p[0] << 24 ) |
4713 ( (uint32_t) p[1] << 16 ) |
4714 ( (uint32_t) p[2] << 8 ) |
4715 ( (uint32_t) p[3] );
4716 p += 4;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004717
4718#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
4719 if( (size_t)( end - p ) < 16 )
4720 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4721
4722 ssl->in_window_top = ( (uint64_t) p[0] << 56 ) |
4723 ( (uint64_t) p[1] << 48 ) |
4724 ( (uint64_t) p[2] << 40 ) |
4725 ( (uint64_t) p[3] << 32 ) |
4726 ( (uint64_t) p[4] << 24 ) |
4727 ( (uint64_t) p[5] << 16 ) |
4728 ( (uint64_t) p[6] << 8 ) |
4729 ( (uint64_t) p[7] );
4730 p += 8;
4731
4732 ssl->in_window = ( (uint64_t) p[0] << 56 ) |
4733 ( (uint64_t) p[1] << 48 ) |
4734 ( (uint64_t) p[2] << 40 ) |
4735 ( (uint64_t) p[3] << 32 ) |
4736 ( (uint64_t) p[4] << 24 ) |
4737 ( (uint64_t) p[5] << 16 ) |
4738 ( (uint64_t) p[6] << 8 ) |
4739 ( (uint64_t) p[7] );
4740 p += 8;
4741#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
4742
4743#if defined(MBEDTLS_SSL_PROTO_DTLS)
4744 if( (size_t)( end - p ) < 1 )
4745 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4746
4747 ssl->disable_datagram_packing = *p++;
4748#endif /* MBEDTLS_SSL_PROTO_DTLS */
4749
Jerry Yud9a94fe2021-09-28 18:58:59 +08004750 if( (size_t)( end - p ) < sizeof( ssl->cur_out_ctr ) )
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004751 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jerry Yud9a94fe2021-09-28 18:58:59 +08004752 memcpy( ssl->cur_out_ctr, p, sizeof( ssl->cur_out_ctr ) );
4753 p += sizeof( ssl->cur_out_ctr );
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02004754
4755#if defined(MBEDTLS_SSL_PROTO_DTLS)
4756 if( (size_t)( end - p ) < 2 )
4757 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4758
4759 ssl->mtu = ( p[0] << 8 ) | p[1];
4760 p += 2;
4761#endif /* MBEDTLS_SSL_PROTO_DTLS */
4762
4763#if defined(MBEDTLS_SSL_ALPN)
4764 {
4765 uint8_t alpn_len;
4766 const char **cur;
4767
4768 if( (size_t)( end - p ) < 1 )
4769 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4770
4771 alpn_len = *p++;
4772
4773 if( alpn_len != 0 && ssl->conf->alpn_list != NULL )
4774 {
4775 /* alpn_chosen should point to an item in the configured list */
4776 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
4777 {
4778 if( strlen( *cur ) == alpn_len &&
4779 memcmp( p, cur, alpn_len ) == 0 )
4780 {
4781 ssl->alpn_chosen = *cur;
4782 break;
4783 }
4784 }
4785 }
4786
4787 /* can only happen on conf mismatch */
4788 if( alpn_len != 0 && ssl->alpn_chosen == NULL )
4789 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4790
4791 p += alpn_len;
4792 }
4793#endif /* MBEDTLS_SSL_ALPN */
4794
4795 /*
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02004796 * Forced fields from top-level ssl_context structure
4797 *
4798 * Most of them already set to the correct value by mbedtls_ssl_init() and
4799 * mbedtls_ssl_reset(), so we only need to set the remaining ones.
4800 */
4801 ssl->state = MBEDTLS_SSL_HANDSHAKE_OVER;
4802
4803 ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
4804 ssl->minor_ver = MBEDTLS_SSL_MINOR_VERSION_3;
4805
Hanno Becker361b10d2019-08-30 10:42:49 +01004806 /* Adjust pointers for header fields of outgoing records to
4807 * the given transform, accounting for explicit IV and CID. */
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00004808 mbedtls_ssl_update_out_pointers( ssl, ssl->transform );
Hanno Becker361b10d2019-08-30 10:42:49 +01004809
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02004810#if defined(MBEDTLS_SSL_PROTO_DTLS)
4811 ssl->in_epoch = 1;
4812#endif
4813
4814 /* mbedtls_ssl_reset() leaves the handshake sub-structure allocated,
4815 * which we don't want - otherwise we'd end up freeing the wrong transform
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00004816 * by calling mbedtls_ssl_handshake_wrapup_free_hs_transform()
4817 * inappropriately. */
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02004818 if( ssl->handshake != NULL )
4819 {
4820 mbedtls_ssl_handshake_free( ssl );
4821 mbedtls_free( ssl->handshake );
4822 ssl->handshake = NULL;
4823 }
4824
4825 /*
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02004826 * Done - should have consumed entire buffer
4827 */
4828 if( p != end )
4829 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02004830
4831 return( 0 );
4832}
4833
4834/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02004835 * Deserialize context: public wrapper for error cleaning
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004836 */
4837int mbedtls_ssl_context_load( mbedtls_ssl_context *context,
4838 const unsigned char *buf,
4839 size_t len )
4840{
4841 int ret = ssl_context_load( context, buf, len );
4842
4843 if( ret != 0 )
4844 mbedtls_ssl_free( context );
4845
4846 return( ret );
4847}
Manuel Pégourié-Gonnard5c0e3772019-07-23 16:13:17 +02004848#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02004849
4850/*
Paul Bakker5121ce52009-01-03 21:22:43 +00004851 * Free an SSL context
4852 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004853void mbedtls_ssl_free( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004854{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02004855 if( ssl == NULL )
4856 return;
4857
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004858 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> free" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004859
Manuel Pégourié-Gonnard7ee6f0e2014-02-13 10:54:07 +01004860 if( ssl->out_buf != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00004861 {
sander-visserb8aa2072020-05-06 22:05:13 +02004862#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
4863 size_t out_buf_len = ssl->out_buf_len;
4864#else
4865 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
4866#endif
4867
Darryl Greenb33cc762019-11-28 14:29:44 +00004868 mbedtls_platform_zeroize( ssl->out_buf, out_buf_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004869 mbedtls_free( ssl->out_buf );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004870 ssl->out_buf = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00004871 }
4872
Manuel Pégourié-Gonnard7ee6f0e2014-02-13 10:54:07 +01004873 if( ssl->in_buf != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00004874 {
sander-visserb8aa2072020-05-06 22:05:13 +02004875#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
4876 size_t in_buf_len = ssl->in_buf_len;
4877#else
4878 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
4879#endif
4880
Darryl Greenb33cc762019-11-28 14:29:44 +00004881 mbedtls_platform_zeroize( ssl->in_buf, in_buf_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004882 mbedtls_free( ssl->in_buf );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05004883 ssl->in_buf = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00004884 }
4885
Paul Bakker48916f92012-09-16 19:57:18 +00004886 if( ssl->transform )
4887 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004888 mbedtls_ssl_transform_free( ssl->transform );
4889 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00004890 }
4891
4892 if( ssl->handshake )
4893 {
Gilles Peskine9b562d52018-04-25 20:32:43 +02004894 mbedtls_ssl_handshake_free( ssl );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004895 mbedtls_ssl_transform_free( ssl->transform_negotiate );
4896 mbedtls_ssl_session_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00004897
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004898 mbedtls_free( ssl->handshake );
4899 mbedtls_free( ssl->transform_negotiate );
4900 mbedtls_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00004901 }
4902
Ronald Cron6f135e12021-12-08 16:57:54 +01004903#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Hanno Becker3aa186f2021-08-10 09:24:19 +01004904 mbedtls_ssl_transform_free( ssl->transform_application );
4905 mbedtls_free( ssl->transform_application );
Ronald Cron6f135e12021-12-08 16:57:54 +01004906#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Becker3aa186f2021-08-10 09:24:19 +01004907
Paul Bakkerc0463502013-02-14 11:19:38 +01004908 if( ssl->session )
4909 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004910 mbedtls_ssl_session_free( ssl->session );
4911 mbedtls_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01004912 }
4913
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +02004914#if defined(MBEDTLS_X509_CRT_PARSE_C)
Paul Bakker66d5d072014-06-17 16:39:18 +02004915 if( ssl->hostname != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00004916 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004917 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004918 mbedtls_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00004919 }
Paul Bakker0be444a2013-08-27 21:55:01 +02004920#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00004921
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02004922#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004923 mbedtls_free( ssl->cli_id );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02004924#endif
4925
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004926 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00004927
Paul Bakker86f04f42013-02-14 11:20:09 +01004928 /* Actually clear after last debug message */
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004929 mbedtls_platform_zeroize( ssl, sizeof( mbedtls_ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004930}
4931
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02004932/*
4933 * Initialze mbedtls_ssl_config
4934 */
4935void mbedtls_ssl_config_init( mbedtls_ssl_config *conf )
4936{
4937 memset( conf, 0, sizeof( mbedtls_ssl_config ) );
4938}
4939
Gilles Peskineeccd8882020-03-10 12:19:08 +01004940#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yuf017ee42022-01-12 15:49:48 +08004941#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Gilles Peskineae270bf2021-06-02 00:05:29 +02004942/* The selection should be the same as mbedtls_x509_crt_profile_default in
Gilles Peskinea28f0f52021-06-02 15:29:38 +02004943 * x509_crt.c. Here, the order matters. Currently we favor stronger hashes,
4944 * for no fundamental reason.
Gilles Peskineae270bf2021-06-02 00:05:29 +02004945 * See the documentation of mbedtls_ssl_conf_curves() for what we promise
4946 * about this list. */
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01004947static int ssl_preset_default_hashes[] = {
4948#if defined(MBEDTLS_SHA512_C)
4949 MBEDTLS_MD_SHA512,
Mateusz Starzyk3352a532021-04-06 14:28:22 +02004950#endif
4951#if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01004952 MBEDTLS_MD_SHA384,
4953#endif
4954#if defined(MBEDTLS_SHA256_C)
4955 MBEDTLS_MD_SHA256,
Mateusz Starzyke3c48b42021-04-19 16:46:28 +02004956#endif
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01004957 MBEDTLS_MD_NONE
4958};
Jerry Yuf017ee42022-01-12 15:49:48 +08004959#endif /* !MBEDTLS_DEPRECATED_REMOVED */
4960#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01004961
Gilles Peskineae270bf2021-06-02 00:05:29 +02004962/* The selection should be the same as mbedtls_x509_crt_profile_default in
4963 * x509_crt.c, plus Montgomery curves for ECDHE. Here, the order matters:
Gilles Peskineb1940a72021-06-02 15:18:12 +02004964 * curves with a lower resource usage come first.
Gilles Peskineae270bf2021-06-02 00:05:29 +02004965 * See the documentation of mbedtls_ssl_conf_curves() for what we promise
Gilles Peskineb1940a72021-06-02 15:18:12 +02004966 * about this list.
4967 */
Brett Warrene0edc842021-08-17 09:53:13 +01004968static uint16_t ssl_preset_default_groups[] = {
Gilles Peskineae270bf2021-06-02 00:05:29 +02004969#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004970 MBEDTLS_SSL_IANA_TLS_GROUP_X25519,
Gilles Peskineae270bf2021-06-02 00:05:29 +02004971#endif
4972#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004973 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
Gilles Peskineae270bf2021-06-02 00:05:29 +02004974#endif
Gilles Peskineb1940a72021-06-02 15:18:12 +02004975#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004976 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
Gilles Peskineb1940a72021-06-02 15:18:12 +02004977#endif
4978#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004979 MBEDTLS_SSL_IANA_TLS_GROUP_X448,
Gilles Peskineb1940a72021-06-02 15:18:12 +02004980#endif
4981#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004982 MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1,
Gilles Peskineb1940a72021-06-02 15:18:12 +02004983#endif
Gilles Peskineae270bf2021-06-02 00:05:29 +02004984#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004985 MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1,
Gilles Peskineae270bf2021-06-02 00:05:29 +02004986#endif
Gilles Peskineb1940a72021-06-02 15:18:12 +02004987#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004988 MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1,
Gilles Peskineb1940a72021-06-02 15:18:12 +02004989#endif
4990#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01004991 MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1,
Gilles Peskineb1940a72021-06-02 15:18:12 +02004992#endif
Brett Warrene0edc842021-08-17 09:53:13 +01004993 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
Gilles Peskineae270bf2021-06-02 00:05:29 +02004994};
Gilles Peskineae270bf2021-06-02 00:05:29 +02004995
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02004996static int ssl_preset_suiteb_ciphersuites[] = {
4997 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
4998 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
4999 0
5000};
5001
Gilles Peskineeccd8882020-03-10 12:19:08 +01005002#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yuf017ee42022-01-12 15:49:48 +08005003#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005004static int ssl_preset_suiteb_hashes[] = {
Jerry Yuf017ee42022-01-12 15:49:48 +08005005#if defined(MBEDTLS_SHA256_C)
5006 MBEDTLS_MD_SHA256,
5007#endif
Jerry Yu713013f2022-01-17 18:16:35 +08005008#if defined(MBEDTLS_SHA384_C)
5009 MBEDTLS_MD_SHA384,
5010#endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005011 MBEDTLS_MD_NONE
5012};
Jerry Yuf017ee42022-01-12 15:49:48 +08005013#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Hanno Becker9c6aa7b2021-08-10 13:50:43 +01005014
Jerry Yu909df7b2022-01-22 11:56:27 +08005015/* NOTICE:
Jerry Yu0b994b82022-01-25 17:22:12 +08005016 * For ssl_preset_*_sig_algs and ssl_tls12_preset_*_sig_algs, the following
Jerry Yu370e1462022-01-25 10:36:53 +08005017 * rules SHOULD be upheld.
5018 * - No duplicate entries.
5019 * - But if there is a good reason, do not change the order of the algorithms.
5020 * - ssl_tls12_present* is for TLS 1.2 use only.
5021 * - ssl_preset_* is for TLS 1.3 only or hybrid TLS 1.3/1.2 handshakes.
Jerry Yu1a8b4812022-01-20 17:56:50 +08005022 */
Hanno Becker9c6aa7b2021-08-10 13:50:43 +01005023static uint16_t ssl_preset_default_sig_algs[] = {
Jerry Yu1a8b4812022-01-20 17:56:50 +08005024
Jerry Yued5e9f42022-01-26 11:21:34 +08005025#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C) && \
5026 defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
5027 MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256,
5028#endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA256_C &&
5029 MBEDTLS_ECP_DP_SECP256R1_ENABLED */
Jerry Yu909df7b2022-01-22 11:56:27 +08005030
Jerry Yu909df7b2022-01-22 11:56:27 +08005031#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA384_C) && \
5032 defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
5033 MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384,
5034#endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA384_C &&
5035 MBEDTLS_ECP_DP_SECP384R1_ENABLED */
5036
Jerry Yued5e9f42022-01-26 11:21:34 +08005037#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA512_C) && \
5038 defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
5039 MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512,
5040#endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA384_C &&
5041 MBEDTLS_ECP_DP_SECP521R1_ENABLED */
Jerry Yu909df7b2022-01-22 11:56:27 +08005042
Jerry Yu909df7b2022-01-22 11:56:27 +08005043#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && defined(MBEDTLS_SHA256_C)
5044 MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256,
5045#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT && MBEDTLS_SHA256_C */
5046
Jerry Yu53037892022-01-25 11:02:06 +08005047#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA256_C)
5048 MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256,
5049#endif /* MBEDTLS_RSA_C && MBEDTLS_SHA256_C */
5050
Jerry Yu909df7b2022-01-22 11:56:27 +08005051 MBEDTLS_TLS1_3_SIG_NONE
5052};
5053
5054/* NOTICE: see above */
5055#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5056static uint16_t ssl_tls12_preset_default_sig_algs[] = {
Jerry Yu713013f2022-01-17 18:16:35 +08005057#if defined(MBEDTLS_SHA512_C)
5058 MBEDTLS_SSL_SIG_ALG( MBEDTLS_SSL_HASH_SHA512 )
5059#endif
Jerry Yu11f0a9c2022-01-12 18:43:08 +08005060#if defined(MBEDTLS_SHA384_C)
5061 MBEDTLS_SSL_SIG_ALG( MBEDTLS_SSL_HASH_SHA384 )
5062#endif
5063#if defined(MBEDTLS_SHA256_C)
5064 MBEDTLS_SSL_SIG_ALG( MBEDTLS_SSL_HASH_SHA256 )
5065#endif
Jerry Yu909df7b2022-01-22 11:56:27 +08005066 MBEDTLS_TLS1_3_SIG_NONE
5067};
5068#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5069/* NOTICE: see above */
5070static uint16_t ssl_preset_suiteb_sig_algs[] = {
5071
Jerry Yu909df7b2022-01-22 11:56:27 +08005072#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C) && \
5073 defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
5074 MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256,
5075#endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA256_C &&
5076 MBEDTLS_ECP_DP_SECP256R1_ENABLED */
5077
Jerry Yu53037892022-01-25 11:02:06 +08005078#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA384_C) && \
5079 defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
5080 MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384,
5081#endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA384_C &&
5082 MBEDTLS_ECP_DP_SECP384R1_ENABLED */
Jerry Yu909df7b2022-01-22 11:56:27 +08005083
5084#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && defined(MBEDTLS_SHA256_C)
5085 MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256,
5086#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT && MBEDTLS_SHA256_C */
Jerry Yu1a8b4812022-01-20 17:56:50 +08005087
Jerry Yu53037892022-01-25 11:02:06 +08005088#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA256_C)
5089 MBEDTLS_TLS1_3_SIG_RSA_PKCS1_SHA256,
5090#endif /* MBEDTLS_RSA_C && MBEDTLS_SHA256_C */
5091
Jerry Yu713013f2022-01-17 18:16:35 +08005092 MBEDTLS_TLS1_3_SIG_NONE
5093};
Jerry Yu6106fdc2022-01-12 16:36:14 +08005094
Jerry Yu909df7b2022-01-22 11:56:27 +08005095/* NOTICE: see above */
5096#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5097static uint16_t ssl_tls12_preset_suiteb_sig_algs[] = {
Jerry Yu713013f2022-01-17 18:16:35 +08005098#if defined(MBEDTLS_SHA256_C)
5099 MBEDTLS_SSL_SIG_ALG( MBEDTLS_SSL_HASH_SHA256 )
5100#endif
Jerry Yu18c833e2022-01-25 10:55:47 +08005101#if defined(MBEDTLS_SHA384_C)
5102 MBEDTLS_SSL_SIG_ALG( MBEDTLS_SSL_HASH_SHA384 )
5103#endif
Xiaofei Bai95395012021-11-25 08:51:30 +00005104 MBEDTLS_TLS1_3_SIG_NONE
Hanno Becker9c6aa7b2021-08-10 13:50:43 +01005105};
Jerry Yu909df7b2022-01-22 11:56:27 +08005106#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5107
Jerry Yu1a8b4812022-01-20 17:56:50 +08005108#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005109
Brett Warrene0edc842021-08-17 09:53:13 +01005110static uint16_t ssl_preset_suiteb_groups[] = {
Jaeden Amerod4311042019-06-03 08:27:16 +01005111#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01005112 MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1,
Jaeden Amerod4311042019-06-03 08:27:16 +01005113#endif
5114#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
Brett Warrene0edc842021-08-17 09:53:13 +01005115 MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1,
Jaeden Amerod4311042019-06-03 08:27:16 +01005116#endif
Brett Warrene0edc842021-08-17 09:53:13 +01005117 MBEDTLS_SSL_IANA_TLS_GROUP_NONE
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005118};
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005119
Jerry Yu1a8b4812022-01-20 17:56:50 +08005120#if defined(MBEDTLS_DEBUG_C) && defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yu909df7b2022-01-22 11:56:27 +08005121/* Function for checking `ssl_preset_*_sig_algs` and `ssl_tls12_preset_*_sig_algs`
Jerry Yu370e1462022-01-25 10:36:53 +08005122 * to make sure there are no duplicated signature algorithm entries. */
Jerry Yuf377d642022-01-25 10:43:59 +08005123static int ssl_check_no_sig_alg_duplication( uint16_t * sig_algs )
Jerry Yu1a8b4812022-01-20 17:56:50 +08005124{
5125 size_t i, j;
5126 int ret = 0;
Jerry Yu909df7b2022-01-22 11:56:27 +08005127
Jerry Yuf377d642022-01-25 10:43:59 +08005128 for( i = 0; sig_algs[i] != MBEDTLS_TLS1_3_SIG_NONE; i++ )
Jerry Yu1a8b4812022-01-20 17:56:50 +08005129 {
Jerry Yuf377d642022-01-25 10:43:59 +08005130 for( j = 0; j < i; j++ )
Jerry Yu1a8b4812022-01-20 17:56:50 +08005131 {
Jerry Yuf377d642022-01-25 10:43:59 +08005132 if( sig_algs[i] != sig_algs[j] )
5133 continue;
5134 mbedtls_printf( " entry(%04x,%" MBEDTLS_PRINTF_SIZET
5135 ") is duplicated at %" MBEDTLS_PRINTF_SIZET "\n",
5136 sig_algs[i], j, i );
5137 ret = -1;
Jerry Yu1a8b4812022-01-20 17:56:50 +08005138 }
5139 }
5140 return( ret );
5141}
5142
5143#endif /* MBEDTLS_DEBUG_C && MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
5144
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005145/*
Tillmann Karras588ad502015-09-25 04:27:22 +02005146 * Load default in mbedtls_ssl_config
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005147 */
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02005148int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005149 int endpoint, int transport, int preset )
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005150{
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02005151#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Janos Follath865b3eb2019-12-16 11:46:15 +00005152 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02005153#endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005154
Jerry Yu1a8b4812022-01-20 17:56:50 +08005155#if defined(MBEDTLS_DEBUG_C) && defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yuf377d642022-01-25 10:43:59 +08005156 if( ssl_check_no_sig_alg_duplication( ssl_preset_suiteb_sig_algs ) )
Jerry Yu1a8b4812022-01-20 17:56:50 +08005157 {
5158 mbedtls_printf( "ssl_preset_suiteb_sig_algs has duplicated entries\n" );
5159 return( MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED );
5160 }
5161
Jerry Yuf377d642022-01-25 10:43:59 +08005162 if( ssl_check_no_sig_alg_duplication( ssl_preset_default_sig_algs ) )
Jerry Yu1a8b4812022-01-20 17:56:50 +08005163 {
5164 mbedtls_printf( "ssl_preset_default_sig_algs has duplicated entries\n" );
5165 return( MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED );
5166 }
Jerry Yu909df7b2022-01-22 11:56:27 +08005167
5168#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yuf377d642022-01-25 10:43:59 +08005169 if( ssl_check_no_sig_alg_duplication( ssl_tls12_preset_suiteb_sig_algs ) )
Jerry Yu909df7b2022-01-22 11:56:27 +08005170 {
Jerry Yu909df7b2022-01-22 11:56:27 +08005171 mbedtls_printf( "ssl_tls12_preset_suiteb_sig_algs has duplicated entries\n" );
Jerry Yu909df7b2022-01-22 11:56:27 +08005172 return( MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED );
5173 }
5174
Jerry Yuf377d642022-01-25 10:43:59 +08005175 if( ssl_check_no_sig_alg_duplication( ssl_tls12_preset_default_sig_algs ) )
Jerry Yu909df7b2022-01-22 11:56:27 +08005176 {
Jerry Yu909df7b2022-01-22 11:56:27 +08005177 mbedtls_printf( "ssl_tls12_preset_default_sig_algs has duplicated entries\n" );
Jerry Yu909df7b2022-01-22 11:56:27 +08005178 return( MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED );
5179 }
5180#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Jerry Yu1a8b4812022-01-20 17:56:50 +08005181#endif /* MBEDTLS_DEBUG_C && MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
5182
Manuel Pégourié-Gonnard0de074f2015-05-14 12:58:01 +02005183 /* Use the functions here so that they are covered in tests,
5184 * but otherwise access member directly for efficiency */
5185 mbedtls_ssl_conf_endpoint( conf, endpoint );
5186 mbedtls_ssl_conf_transport( conf, transport );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005187
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005188 /*
5189 * Things that are common to all presets
5190 */
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02005191#if defined(MBEDTLS_SSL_CLI_C)
5192 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
5193 {
5194 conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
5195#if defined(MBEDTLS_SSL_SESSION_TICKETS)
5196 conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED;
5197#endif
5198 }
5199#endif
5200
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005201#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
5202 conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
5203#endif
5204
5205#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
5206 conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
5207#endif
5208
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02005209#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005210 conf->f_cookie_write = ssl_cookie_write_dummy;
5211 conf->f_cookie_check = ssl_cookie_check_dummy;
5212#endif
5213
5214#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
5215 conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
5216#endif
5217
Janos Follath088ce432017-04-10 12:42:31 +01005218#if defined(MBEDTLS_SSL_SRV_C)
5219 conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED;
TRodziewicz3946f792021-06-14 12:11:18 +02005220 conf->respect_cli_pref = MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_SERVER;
Janos Follath088ce432017-04-10 12:42:31 +01005221#endif
5222
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005223#if defined(MBEDTLS_SSL_PROTO_DTLS)
5224 conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
5225 conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
5226#endif
5227
5228#if defined(MBEDTLS_SSL_RENEGOTIATION)
5229 conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
Andres AG2196c7f2016-12-15 17:01:16 +00005230 memset( conf->renego_period, 0x00, 2 );
5231 memset( conf->renego_period + 2, 0xFF, 6 );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005232#endif
5233
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005234#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Hanno Beckere2defad2021-07-24 05:59:17 +01005235 if( endpoint == MBEDTLS_SSL_IS_SERVER )
5236 {
5237 const unsigned char dhm_p[] =
5238 MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN;
5239 const unsigned char dhm_g[] =
5240 MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN;
Hanno Becker00d0a682017-10-04 13:14:29 +01005241
Hanno Beckere2defad2021-07-24 05:59:17 +01005242 if ( ( ret = mbedtls_ssl_conf_dh_param_bin( conf,
5243 dhm_p, sizeof( dhm_p ),
5244 dhm_g, sizeof( dhm_g ) ) ) != 0 )
5245 {
5246 return( ret );
5247 }
5248 }
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02005249#endif
5250
Ronald Cron6f135e12021-12-08 16:57:54 +01005251#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
Hanno Becker71f1ed62021-07-24 06:01:47 +01005252 /*
5253 * Allow all TLS 1.3 key exchange modes by default.
5254 */
Xiaofei Bai746f9482021-11-12 08:53:56 +00005255 conf->tls13_kex_modes = MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_ALL;
Ronald Cron6f135e12021-12-08 16:57:54 +01005256#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
Hanno Becker71f1ed62021-07-24 06:01:47 +01005257
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005258 /*
5259 * Preset-specific defaults
5260 */
5261 switch( preset )
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005262 {
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005263 /*
5264 * NSA Suite B
5265 */
5266 case MBEDTLS_SSL_PRESET_SUITEB:
5267 conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
5268 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */
5269 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
Jerry Yu7d239632022-01-27 14:16:44 +08005270#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
5271 /* Hybrid TLS 1.2/1.3 is not supported yet */
5272 conf->max_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3;
5273#else
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005274 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
Jerry Yu7d239632022-01-27 14:16:44 +08005275#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_SSL_PROTO_TLS1_3 */
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005276
Hanno Beckerd60b6c62021-04-29 12:04:11 +01005277 conf->ciphersuite_list = ssl_preset_suiteb_ciphersuites;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005278
5279#if defined(MBEDTLS_X509_CRT_PARSE_C)
5280 conf->cert_profile = &mbedtls_x509_crt_profile_suiteb;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005281#endif
5282
Gilles Peskineeccd8882020-03-10 12:19:08 +01005283#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yuf017ee42022-01-12 15:49:48 +08005284#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005285 conf->sig_hashes = ssl_preset_suiteb_hashes;
Jerry Yuf017ee42022-01-12 15:49:48 +08005286#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Jerry Yu909df7b2022-01-22 11:56:27 +08005287#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5288 if( mbedtls_ssl_conf_is_tls12_only( conf ) )
5289 conf->sig_algs = ssl_tls12_preset_suiteb_sig_algs;
5290 else
5291#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5292 conf->sig_algs = ssl_preset_suiteb_sig_algs;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005293#endif
5294
Brett Warrene0edc842021-08-17 09:53:13 +01005295#if defined(MBEDTLS_ECP_C) && !defined(MBEDTLS_DEPRECATED_REMOVED)
5296 conf->curve_list = NULL;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005297#endif
Brett Warrene0edc842021-08-17 09:53:13 +01005298 conf->group_list = ssl_preset_suiteb_groups;
Manuel Pégourié-Gonnardc98204e2015-08-11 04:21:01 +02005299 break;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005300
5301 /*
5302 * Default
5303 */
5304 default:
Ron Eldor5e9f14d2017-05-28 10:46:38 +03005305 conf->min_major_ver = ( MBEDTLS_SSL_MIN_MAJOR_VERSION >
5306 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION ) ?
5307 MBEDTLS_SSL_MIN_MAJOR_VERSION :
5308 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION;
5309 conf->min_minor_ver = ( MBEDTLS_SSL_MIN_MINOR_VERSION >
5310 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION ) ?
5311 MBEDTLS_SSL_MIN_MINOR_VERSION :
5312 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005313 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
Jerry Yu7d239632022-01-27 14:16:44 +08005314#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
5315 /* Hybrid TLS 1.2/1.3 is not supported yet */
5316 conf->max_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3;
5317#else
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005318 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
Jerry Yu7d239632022-01-27 14:16:44 +08005319#endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_SSL_PROTO_TLS1_3 */
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005320
5321#if defined(MBEDTLS_SSL_PROTO_DTLS)
5322 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
TRodziewiczef73f012021-05-13 14:53:36 +02005323 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005324#endif
Hanno Beckerd60b6c62021-04-29 12:04:11 +01005325 conf->ciphersuite_list = mbedtls_ssl_list_ciphersuites();
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005326
5327#if defined(MBEDTLS_X509_CRT_PARSE_C)
5328 conf->cert_profile = &mbedtls_x509_crt_profile_default;
5329#endif
5330
Gilles Peskineeccd8882020-03-10 12:19:08 +01005331#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Jerry Yuf017ee42022-01-12 15:49:48 +08005332#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01005333 conf->sig_hashes = ssl_preset_default_hashes;
Jerry Yuf017ee42022-01-12 15:49:48 +08005334#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Jerry Yu909df7b2022-01-22 11:56:27 +08005335#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5336 if( mbedtls_ssl_conf_is_tls12_only( conf ) )
5337 conf->sig_algs = ssl_tls12_preset_default_sig_algs;
5338 else
5339#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5340 conf->sig_algs = ssl_preset_default_sig_algs;
Hanno Beckerdeb68ce2021-08-10 16:04:05 +01005341#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005342
Brett Warrene0edc842021-08-17 09:53:13 +01005343#if defined(MBEDTLS_ECP_C) && !defined(MBEDTLS_DEPRECATED_REMOVED)
5344 conf->curve_list = NULL;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005345#endif
Brett Warrene0edc842021-08-17 09:53:13 +01005346 conf->group_list = ssl_preset_default_groups;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005347
5348#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
5349 conf->dhm_min_bitlen = 1024;
5350#endif
5351 }
5352
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005353 return( 0 );
5354}
5355
5356/*
5357 * Free mbedtls_ssl_config
5358 */
5359void mbedtls_ssl_config_free( mbedtls_ssl_config *conf )
5360{
5361#if defined(MBEDTLS_DHM_C)
5362 mbedtls_mpi_free( &conf->dhm_P );
5363 mbedtls_mpi_free( &conf->dhm_G );
5364#endif
5365
Gilles Peskineeccd8882020-03-10 12:19:08 +01005366#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005367 if( conf->psk != NULL )
5368 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05005369 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005370 mbedtls_free( conf->psk );
Azim Khan27e8a122018-03-21 14:24:11 +00005371 conf->psk = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005372 conf->psk_len = 0;
junyeonLEE316b1622017-12-20 16:29:30 +09005373 }
5374
5375 if( conf->psk_identity != NULL )
5376 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05005377 mbedtls_platform_zeroize( conf->psk_identity, conf->psk_identity_len );
junyeonLEE316b1622017-12-20 16:29:30 +09005378 mbedtls_free( conf->psk_identity );
Azim Khan27e8a122018-03-21 14:24:11 +00005379 conf->psk_identity = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005380 conf->psk_identity_len = 0;
5381 }
5382#endif
5383
5384#if defined(MBEDTLS_X509_CRT_PARSE_C)
5385 ssl_key_cert_free( conf->key_cert );
5386#endif
5387
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05005388 mbedtls_platform_zeroize( conf, sizeof( mbedtls_ssl_config ) );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005389}
5390
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02005391#if defined(MBEDTLS_PK_C) && \
5392 ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02005393/*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005394 * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02005395 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005396unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02005397{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005398#if defined(MBEDTLS_RSA_C)
5399 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) )
5400 return( MBEDTLS_SSL_SIG_RSA );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02005401#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005402#if defined(MBEDTLS_ECDSA_C)
5403 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) )
5404 return( MBEDTLS_SSL_SIG_ECDSA );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02005405#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005406 return( MBEDTLS_SSL_SIG_ANON );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02005407}
5408
Hanno Becker7e5437a2017-04-28 17:15:26 +01005409unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type )
5410{
5411 switch( type ) {
5412 case MBEDTLS_PK_RSA:
5413 return( MBEDTLS_SSL_SIG_RSA );
5414 case MBEDTLS_PK_ECDSA:
5415 case MBEDTLS_PK_ECKEY:
5416 return( MBEDTLS_SSL_SIG_ECDSA );
5417 default:
5418 return( MBEDTLS_SSL_SIG_ANON );
5419 }
5420}
5421
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005422mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig )
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005423{
5424 switch( sig )
5425 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005426#if defined(MBEDTLS_RSA_C)
5427 case MBEDTLS_SSL_SIG_RSA:
5428 return( MBEDTLS_PK_RSA );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005429#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005430#if defined(MBEDTLS_ECDSA_C)
5431 case MBEDTLS_SSL_SIG_ECDSA:
5432 return( MBEDTLS_PK_ECDSA );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005433#endif
5434 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005435 return( MBEDTLS_PK_NONE );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005436 }
5437}
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02005438#endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005439
Hanno Becker7e5437a2017-04-28 17:15:26 +01005440#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01005441 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01005442
5443/* Find an entry in a signature-hash set matching a given hash algorithm. */
5444mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set,
5445 mbedtls_pk_type_t sig_alg )
5446{
5447 switch( sig_alg )
5448 {
5449 case MBEDTLS_PK_RSA:
5450 return( set->rsa );
5451 case MBEDTLS_PK_ECDSA:
5452 return( set->ecdsa );
5453 default:
5454 return( MBEDTLS_MD_NONE );
5455 }
5456}
5457
5458/* Add a signature-hash-pair to a signature-hash set */
5459void mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set,
5460 mbedtls_pk_type_t sig_alg,
5461 mbedtls_md_type_t md_alg )
5462{
5463 switch( sig_alg )
5464 {
5465 case MBEDTLS_PK_RSA:
5466 if( set->rsa == MBEDTLS_MD_NONE )
5467 set->rsa = md_alg;
5468 break;
5469
5470 case MBEDTLS_PK_ECDSA:
5471 if( set->ecdsa == MBEDTLS_MD_NONE )
5472 set->ecdsa = md_alg;
5473 break;
5474
5475 default:
5476 break;
5477 }
5478}
5479
5480/* Allow exactly one hash algorithm for each signature. */
5481void mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set,
5482 mbedtls_md_type_t md_alg )
5483{
5484 set->rsa = md_alg;
5485 set->ecdsa = md_alg;
5486}
5487
5488#endif /* MBEDTLS_SSL_PROTO_TLS1_2) &&
Gilles Peskineeccd8882020-03-10 12:19:08 +01005489 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01005490
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02005491/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02005492 * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02005493 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005494mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash )
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005495{
5496 switch( hash )
5497 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005498#if defined(MBEDTLS_MD5_C)
5499 case MBEDTLS_SSL_HASH_MD5:
5500 return( MBEDTLS_MD_MD5 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005501#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005502#if defined(MBEDTLS_SHA1_C)
5503 case MBEDTLS_SSL_HASH_SHA1:
5504 return( MBEDTLS_MD_SHA1 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005505#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +02005506#if defined(MBEDTLS_SHA224_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005507 case MBEDTLS_SSL_HASH_SHA224:
5508 return( MBEDTLS_MD_SHA224 );
Mateusz Starzyke3c48b42021-04-19 16:46:28 +02005509#endif
5510#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005511 case MBEDTLS_SSL_HASH_SHA256:
5512 return( MBEDTLS_MD_SHA256 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005513#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +02005514#if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005515 case MBEDTLS_SSL_HASH_SHA384:
5516 return( MBEDTLS_MD_SHA384 );
Mateusz Starzyk3352a532021-04-06 14:28:22 +02005517#endif
5518#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005519 case MBEDTLS_SSL_HASH_SHA512:
5520 return( MBEDTLS_MD_SHA512 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005521#endif
5522 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005523 return( MBEDTLS_MD_NONE );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02005524 }
5525}
5526
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02005527/*
5528 * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX
5529 */
5530unsigned char mbedtls_ssl_hash_from_md_alg( int md )
5531{
5532 switch( md )
5533 {
5534#if defined(MBEDTLS_MD5_C)
5535 case MBEDTLS_MD_MD5:
5536 return( MBEDTLS_SSL_HASH_MD5 );
5537#endif
5538#if defined(MBEDTLS_SHA1_C)
5539 case MBEDTLS_MD_SHA1:
5540 return( MBEDTLS_SSL_HASH_SHA1 );
5541#endif
Mateusz Starzyke3c48b42021-04-19 16:46:28 +02005542#if defined(MBEDTLS_SHA224_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02005543 case MBEDTLS_MD_SHA224:
5544 return( MBEDTLS_SSL_HASH_SHA224 );
Mateusz Starzyke3c48b42021-04-19 16:46:28 +02005545#endif
5546#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02005547 case MBEDTLS_MD_SHA256:
5548 return( MBEDTLS_SSL_HASH_SHA256 );
5549#endif
Mateusz Starzyk3352a532021-04-06 14:28:22 +02005550#if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02005551 case MBEDTLS_MD_SHA384:
5552 return( MBEDTLS_SSL_HASH_SHA384 );
Mateusz Starzyk3352a532021-04-06 14:28:22 +02005553#endif
5554#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02005555 case MBEDTLS_MD_SHA512:
5556 return( MBEDTLS_SSL_HASH_SHA512 );
5557#endif
5558 default:
5559 return( MBEDTLS_SSL_HASH_NONE );
5560 }
5561}
5562
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005563/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02005564 * Check if a curve proposed by the peer is in our list.
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02005565 * Return 0 if we're willing to use it, -1 otherwise.
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005566 */
Manuel Pégourié-Gonnard0d63b842022-01-18 13:10:56 +01005567int mbedtls_ssl_check_curve_tls_id( const mbedtls_ssl_context *ssl, uint16_t tls_id )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005568{
Brett Warrene0edc842021-08-17 09:53:13 +01005569 const uint16_t *group_list = mbedtls_ssl_get_groups( ssl );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005570
Brett Warrene0edc842021-08-17 09:53:13 +01005571 if( group_list == NULL )
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02005572 return( -1 );
5573
Brett Warrene0edc842021-08-17 09:53:13 +01005574 for( ; *group_list != 0; group_list++ )
5575 {
5576 if( *group_list == tls_id )
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02005577 return( 0 );
Brett Warrene0edc842021-08-17 09:53:13 +01005578 }
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005579
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02005580 return( -1 );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005581}
Manuel Pégourié-Gonnard0d63b842022-01-18 13:10:56 +01005582
5583#if defined(MBEDTLS_ECP_C)
5584/*
5585 * Same as mbedtls_ssl_check_curve_tls_id() but with a mbedtls_ecp_group_id.
5586 */
5587int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id )
5588{
Manuel Pégourié-Gonnard422370d2022-02-07 11:55:21 +01005589 uint16_t tls_id = mbedtls_ecp_curve_info_from_grp_id( grp_id )->tls_id;
Manuel Pégourié-Gonnard0d63b842022-01-18 13:10:56 +01005590 return mbedtls_ssl_check_curve_tls_id( ssl, tls_id );
5591}
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02005592#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005593
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005594#if defined(MBEDTLS_X509_CRT_PARSE_C)
5595int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,
5596 const mbedtls_ssl_ciphersuite_t *ciphersuite,
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01005597 int cert_endpoint,
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02005598 uint32_t *flags )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005599{
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01005600 int ret = 0;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005601 int usage = 0;
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02005602 const char *ext_oid;
5603 size_t ext_len;
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02005604
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005605 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005606 {
5607 /* Server part of the key exchange */
5608 switch( ciphersuite->key_exchange )
5609 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005610 case MBEDTLS_KEY_EXCHANGE_RSA:
5611 case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01005612 usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005613 break;
5614
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005615 case MBEDTLS_KEY_EXCHANGE_DHE_RSA:
5616 case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
5617 case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
5618 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005619 break;
5620
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005621 case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
5622 case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01005623 usage = MBEDTLS_X509_KU_KEY_AGREEMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005624 break;
5625
5626 /* Don't use default: we want warnings when adding new values */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005627 case MBEDTLS_KEY_EXCHANGE_NONE:
5628 case MBEDTLS_KEY_EXCHANGE_PSK:
5629 case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
5630 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
Manuel Pégourié-Gonnard557535d2015-09-15 17:53:32 +02005631 case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005632 usage = 0;
5633 }
5634 }
5635 else
5636 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005637 /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */
5638 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005639 }
5640
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005641 if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 )
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01005642 {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01005643 *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01005644 ret = -1;
5645 }
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005646
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005647 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02005648 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005649 ext_oid = MBEDTLS_OID_SERVER_AUTH;
5650 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH );
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02005651 }
5652 else
5653 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005654 ext_oid = MBEDTLS_OID_CLIENT_AUTH;
5655 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH );
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02005656 }
5657
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005658 if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 )
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01005659 {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01005660 *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01005661 ret = -1;
5662 }
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02005663
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01005664 return( ret );
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005665}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005666#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3a306b92014-04-29 15:11:17 +02005667
Simon Butcher99000142016-10-13 17:21:01 +01005668int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md )
5669{
5670#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5671 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Hanno Becker541af852021-05-14 16:49:01 +01005672 return( -1 );
Simon Butcher99000142016-10-13 17:21:01 +01005673
5674 switch( md )
5675 {
Mateusz Starzykc6d94ab2021-05-19 13:31:59 +02005676#if defined(MBEDTLS_SHA384_C)
Simon Butcher99000142016-10-13 17:21:01 +01005677 case MBEDTLS_SSL_HASH_SHA384:
5678 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384;
5679 break;
5680#endif
5681#if defined(MBEDTLS_SHA256_C)
5682 case MBEDTLS_SSL_HASH_SHA256:
5683 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256;
5684 break;
5685#endif
5686 default:
Hanno Becker541af852021-05-14 16:49:01 +01005687 return( -1 );
Simon Butcher99000142016-10-13 17:21:01 +01005688 }
5689
5690 return 0;
5691#else /* !MBEDTLS_SSL_PROTO_TLS1_2 */
5692 (void) ssl;
5693 (void) md;
5694
Hanno Becker541af852021-05-14 16:49:01 +01005695 return( -1 );
Simon Butcher99000142016-10-13 17:21:01 +01005696#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5697}
5698
TRodziewicz0f82ec62021-05-12 17:49:18 +02005699#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005700
5701#if defined(MBEDTLS_USE_PSA_CRYPTO)
5702int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
5703 unsigned char *hash, size_t *hashlen,
5704 unsigned char *data, size_t data_len,
5705 mbedtls_md_type_t md_alg )
5706{
Andrzej Kurek814feff2019-01-14 04:35:19 -05005707 psa_status_t status;
Jaeden Amero34973232019-02-20 10:32:28 +00005708 psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT;
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005709 psa_algorithm_t hash_alg = mbedtls_psa_translate_md( md_alg );
5710
Hanno Becker4c8c7aa2019-04-10 09:25:41 +01005711 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Perform PSA-based computation of digest of ServerKeyExchange" ) );
Andrzej Kurek814feff2019-01-14 04:35:19 -05005712
5713 if( ( status = psa_hash_setup( &hash_operation,
5714 hash_alg ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005715 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05005716 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_setup", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005717 goto exit;
5718 }
5719
Andrzej Kurek814feff2019-01-14 04:35:19 -05005720 if( ( status = psa_hash_update( &hash_operation, ssl->handshake->randbytes,
5721 64 ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005722 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05005723 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_update", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005724 goto exit;
5725 }
5726
Andrzej Kurek814feff2019-01-14 04:35:19 -05005727 if( ( status = psa_hash_update( &hash_operation,
5728 data, data_len ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005729 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05005730 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_update", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005731 goto exit;
5732 }
5733
Ronald Cron69a63422021-10-18 09:47:58 +02005734 if( ( status = psa_hash_finish( &hash_operation, hash, PSA_HASH_MAX_SIZE,
Andrzej Kurek814feff2019-01-14 04:35:19 -05005735 hashlen ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005736 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05005737 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_finish", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005738 goto exit;
5739 }
5740
5741exit:
Andrzej Kurek814feff2019-01-14 04:35:19 -05005742 if( status != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005743 {
5744 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5745 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Andrzej Kurek814feff2019-01-14 04:35:19 -05005746 switch( status )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005747 {
5748 case PSA_ERROR_NOT_SUPPORTED:
5749 return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE );
Andrzej Kurek814feff2019-01-14 04:35:19 -05005750 case PSA_ERROR_BAD_STATE: /* Intentional fallthrough */
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005751 case PSA_ERROR_BUFFER_TOO_SMALL:
5752 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
5753 case PSA_ERROR_INSUFFICIENT_MEMORY:
5754 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
5755 default:
TRodziewiczb579ccd2021-04-13 14:28:28 +02005756 return( MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005757 }
5758 }
5759 return( 0 );
5760}
5761
5762#else
5763
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01005764int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
Gilles Peskineca1d7422018-04-24 11:53:22 +02005765 unsigned char *hash, size_t *hashlen,
5766 unsigned char *data, size_t data_len,
5767 mbedtls_md_type_t md_alg )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01005768{
5769 int ret = 0;
5770 mbedtls_md_context_t ctx;
5771 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );
Gilles Peskineca1d7422018-04-24 11:53:22 +02005772 *hashlen = mbedtls_md_get_size( md_info );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01005773
Hanno Becker4c8c7aa2019-04-10 09:25:41 +01005774 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Perform mbedtls-based computation of digest of ServerKeyExchange" ) );
Andrzej Kurek814feff2019-01-14 04:35:19 -05005775
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01005776 mbedtls_md_init( &ctx );
5777
5778 /*
5779 * digitally-signed struct {
5780 * opaque client_random[32];
5781 * opaque server_random[32];
5782 * ServerDHParams params;
5783 * };
5784 */
5785 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
5786 {
5787 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
5788 goto exit;
5789 }
5790 if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 )
5791 {
5792 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_starts", ret );
5793 goto exit;
5794 }
5795 if( ( ret = mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 ) ) != 0 )
5796 {
5797 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
5798 goto exit;
5799 }
5800 if( ( ret = mbedtls_md_update( &ctx, data, data_len ) ) != 0 )
5801 {
5802 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
5803 goto exit;
5804 }
Gilles Peskineca1d7422018-04-24 11:53:22 +02005805 if( ( ret = mbedtls_md_finish( &ctx, hash ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01005806 {
5807 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_finish", ret );
5808 goto exit;
5809 }
5810
5811exit:
5812 mbedtls_md_free( &ctx );
5813
5814 if( ret != 0 )
5815 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5816 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
5817
5818 return( ret );
5819}
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05005820#endif /* MBEDTLS_USE_PSA_CRYPTO */
5821
TRodziewicz0f82ec62021-05-12 17:49:18 +02005822#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01005823
Jerry Yu148165c2021-09-24 23:20:59 +08005824#if defined(MBEDTLS_USE_PSA_CRYPTO)
5825int mbedtls_ssl_get_handshake_transcript( mbedtls_ssl_context *ssl,
5826 const mbedtls_md_type_t md,
5827 unsigned char *dst,
5828 size_t dst_len,
5829 size_t *olen )
5830{
Ronald Cronf6893e12022-01-07 22:09:01 +01005831 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
5832 psa_hash_operation_t *hash_operation_to_clone;
5833 psa_hash_operation_t hash_operation = psa_hash_operation_init();
5834
Jerry Yu148165c2021-09-24 23:20:59 +08005835 *olen = 0;
Ronald Cronf6893e12022-01-07 22:09:01 +01005836
5837 switch( md )
5838 {
5839#if defined(MBEDTLS_SHA384_C)
5840 case MBEDTLS_MD_SHA384:
5841 hash_operation_to_clone = &ssl->handshake->fin_sha384_psa;
5842 break;
5843#endif
5844
5845#if defined(MBEDTLS_SHA256_C)
5846 case MBEDTLS_MD_SHA256:
5847 hash_operation_to_clone = &ssl->handshake->fin_sha256_psa;
5848 break;
5849#endif
5850
5851 default:
5852 goto exit;
5853 }
5854
5855 status = psa_hash_clone( hash_operation_to_clone, &hash_operation );
5856 if( status != PSA_SUCCESS )
5857 goto exit;
5858
5859 status = psa_hash_finish( &hash_operation, dst, dst_len, olen );
5860 if( status != PSA_SUCCESS )
5861 goto exit;
5862
5863exit:
Ronald Cronb788c042022-02-15 09:14:15 +01005864 return( psa_ssl_status_to_mbedtls( status ) );
Jerry Yu148165c2021-09-24 23:20:59 +08005865}
5866#else /* MBEDTLS_USE_PSA_CRYPTO */
5867
Jerry Yu24c0ec32021-09-09 14:21:07 +08005868#if defined(MBEDTLS_SHA384_C)
Jerry Yu000f9762021-09-14 11:12:51 +08005869static int ssl_get_handshake_transcript_sha384( mbedtls_ssl_context *ssl,
5870 unsigned char *dst,
5871 size_t dst_len,
5872 size_t *olen )
Jerry Yu24c0ec32021-09-09 14:21:07 +08005873{
Jerry Yu24c0ec32021-09-09 14:21:07 +08005874 int ret;
5875 mbedtls_sha512_context sha512;
5876
5877 if( dst_len < 48 )
5878 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
5879
5880 mbedtls_sha512_init( &sha512 );
5881 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
5882
5883 if( ( ret = mbedtls_sha512_finish( &sha512, dst ) ) != 0 )
5884 {
5885 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha512_finish", ret );
5886 goto exit;
5887 }
5888
5889 *olen = 48;
5890
5891exit:
5892
5893 mbedtls_sha512_free( &sha512 );
5894 return( ret );
Jerry Yu24c0ec32021-09-09 14:21:07 +08005895}
5896#endif /* MBEDTLS_SHA384_C */
5897
5898#if defined(MBEDTLS_SHA256_C)
Jerry Yu000f9762021-09-14 11:12:51 +08005899static int ssl_get_handshake_transcript_sha256( mbedtls_ssl_context *ssl,
5900 unsigned char *dst,
5901 size_t dst_len,
5902 size_t *olen )
Jerry Yu24c0ec32021-09-09 14:21:07 +08005903{
Jerry Yu24c0ec32021-09-09 14:21:07 +08005904 int ret;
5905 mbedtls_sha256_context sha256;
5906
5907 if( dst_len < 32 )
5908 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
5909
5910 mbedtls_sha256_init( &sha256 );
5911 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
Jerry Yuc5aef882021-12-23 20:15:02 +08005912
Jerry Yu24c0ec32021-09-09 14:21:07 +08005913 if( ( ret = mbedtls_sha256_finish( &sha256, dst ) ) != 0 )
5914 {
5915 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha256_finish", ret );
5916 goto exit;
5917 }
5918
5919 *olen = 32;
5920
5921exit:
5922
5923 mbedtls_sha256_free( &sha256 );
5924 return( ret );
Jerry Yu24c0ec32021-09-09 14:21:07 +08005925}
5926#endif /* MBEDTLS_SHA256_C */
5927
Jerry Yu000f9762021-09-14 11:12:51 +08005928int mbedtls_ssl_get_handshake_transcript( mbedtls_ssl_context *ssl,
5929 const mbedtls_md_type_t md,
5930 unsigned char *dst,
5931 size_t dst_len,
5932 size_t *olen )
Jerry Yu24c0ec32021-09-09 14:21:07 +08005933{
Jerry Yuc1ddeef2021-10-08 15:14:45 +08005934 switch( md )
5935 {
5936
Jerry Yu24c0ec32021-09-09 14:21:07 +08005937#if defined(MBEDTLS_SHA384_C)
Jerry Yuc1ddeef2021-10-08 15:14:45 +08005938 case MBEDTLS_MD_SHA384:
Jerry Yuc5aef882021-12-23 20:15:02 +08005939 return( ssl_get_handshake_transcript_sha384( ssl, dst, dst_len, olen ) );
Jerry Yuc10f6b42021-12-23 17:16:42 +08005940#endif /* MBEDTLS_SHA384_C */
Jerry Yuc1ddeef2021-10-08 15:14:45 +08005941
Jerry Yu24c0ec32021-09-09 14:21:07 +08005942#if defined(MBEDTLS_SHA256_C)
Jerry Yuc1ddeef2021-10-08 15:14:45 +08005943 case MBEDTLS_MD_SHA256:
Jerry Yuc5aef882021-12-23 20:15:02 +08005944 return( ssl_get_handshake_transcript_sha256( ssl, dst, dst_len, olen ) );
Jerry Yuc10f6b42021-12-23 17:16:42 +08005945#endif /* MBEDTLS_SHA256_C */
Jerry Yuc1ddeef2021-10-08 15:14:45 +08005946
5947 default:
5948 break;
5949 }
Jerry Yuc5aef882021-12-23 20:15:02 +08005950 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Jerry Yu24c0ec32021-09-09 14:21:07 +08005951}
XiaokangQian647719a2021-12-07 09:16:29 +00005952
Jerry Yu148165c2021-09-24 23:20:59 +08005953#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Jerry Yu24c0ec32021-09-09 14:21:07 +08005954
Jerry Yu1ea9d102021-12-21 13:41:49 +08005955#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED) || \
5956 defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
5957 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Jerry Yuba073422021-12-20 22:22:15 +08005958/*
Jerry Yub925f212022-01-12 11:17:02 +08005959 * Function for writing a supported groups (TLS 1.3) or supported elliptic
5960 * curves (TLS 1.2) extension.
Jerry Yuba073422021-12-20 22:22:15 +08005961 *
Jerry Yub925f212022-01-12 11:17:02 +08005962 * The "extension_data" field of a supported groups extension contains a
5963 * "NamedGroupList" value (TLS 1.3 RFC8446):
Jerry Yuba073422021-12-20 22:22:15 +08005964 * enum {
5965 * secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
5966 * x25519(0x001D), x448(0x001E),
5967 * ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
5968 * ffdhe6144(0x0103), ffdhe8192(0x0104),
5969 * ffdhe_private_use(0x01FC..0x01FF),
5970 * ecdhe_private_use(0xFE00..0xFEFF),
5971 * (0xFFFF)
5972 * } NamedGroup;
5973 * struct {
5974 * NamedGroup named_group_list<2..2^16-1>;
5975 * } NamedGroupList;
Jerry Yub925f212022-01-12 11:17:02 +08005976 *
5977 * The "extension_data" field of a supported elliptic curves extension contains
5978 * a "NamedCurveList" value (TLS 1.2 RFC 8422):
Jerry Yu63282b42022-01-11 15:43:53 +08005979 * enum {
5980 * deprecated(1..22),
5981 * secp256r1 (23), secp384r1 (24), secp521r1 (25),
5982 * x25519(29), x448(30),
5983 * reserved (0xFE00..0xFEFF),
5984 * deprecated(0xFF01..0xFF02),
5985 * (0xFFFF)
5986 * } NamedCurve;
5987 * struct {
5988 * NamedCurve named_curve_list<2..2^16-1>
5989 * } NamedCurveList;
5990 *
Jerry Yub925f212022-01-12 11:17:02 +08005991 * The TLS 1.3 supported groups extension was defined to be a compatible
5992 * generalization of the TLS 1.2 supported elliptic curves extension. They both
5993 * share the same extension identifier.
Jerry Yu63282b42022-01-11 15:43:53 +08005994 *
Jerry Yub925f212022-01-12 11:17:02 +08005995 * DHE groups are not supported yet.
Jerry Yuba073422021-12-20 22:22:15 +08005996 */
Jerry Yuba073422021-12-20 22:22:15 +08005997int mbedtls_ssl_write_supported_groups_ext( mbedtls_ssl_context *ssl,
5998 unsigned char *buf,
Jerry Yu17532612021-12-20 22:32:09 +08005999 const unsigned char *end,
Jerry Yuba073422021-12-20 22:22:15 +08006000 size_t *out_len )
6001{
6002 unsigned char *p = buf ;
6003 unsigned char *named_group_list; /* Start of named_group_list */
6004 size_t named_group_list_len; /* Length of named_group_list */
6005 const uint16_t *group_list = mbedtls_ssl_get_groups( ssl );
6006
6007 *out_len = 0;
Jerry Yuf46b0162022-01-11 16:28:00 +08006008
Jerry Yuba073422021-12-20 22:22:15 +08006009 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_groups extension" ) );
6010
6011 /* Check if we have space for header and length fields:
6012 * - extension_type (2 bytes)
6013 * - extension_data_length (2 bytes)
6014 * - named_group_list_length (2 bytes)
6015 */
6016 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
6017 p += 6;
6018
6019 named_group_list = p;
6020
6021 if( group_list == NULL )
6022 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
6023
Jerry Yu1510cea2022-01-12 10:56:49 +08006024 for( ; *group_list != 0; group_list++ )
Jerry Yuba073422021-12-20 22:22:15 +08006025 {
Jerry Yu1510cea2022-01-12 10:56:49 +08006026 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got supported group(%04x)", *group_list ) );
Jerry Yu63282b42022-01-11 15:43:53 +08006027
Jerry Yu1ea9d102021-12-21 13:41:49 +08006028#if defined(MBEDTLS_ECP_C)
Jerry Yu1510cea2022-01-12 10:56:49 +08006029 if( ( mbedtls_ssl_conf_is_tls13_enabled( ssl->conf ) &&
Jerry Yu3ad14ac2022-01-11 17:13:16 +08006030 mbedtls_ssl_tls13_named_group_is_ecdhe( *group_list ) ) ||
Jerry Yu1510cea2022-01-12 10:56:49 +08006031 ( mbedtls_ssl_conf_is_tls12_enabled( ssl->conf ) &&
Jerry Yu3ad14ac2022-01-11 17:13:16 +08006032 mbedtls_ssl_tls12_named_group_is_ecdhe( *group_list ) ) )
Jerry Yuba073422021-12-20 22:22:15 +08006033 {
Jerry Yu3ad14ac2022-01-11 17:13:16 +08006034 const mbedtls_ecp_curve_info *curve_info;
6035 curve_info = mbedtls_ecp_curve_info_from_tls_id( *group_list );
Jerry Yub925f212022-01-12 11:17:02 +08006036 if( curve_info == NULL )
Jerry Yu3ad14ac2022-01-11 17:13:16 +08006037 continue;
Jerry Yub925f212022-01-12 11:17:02 +08006038 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
6039 MBEDTLS_PUT_UINT16_BE( *group_list, p, 0 );
6040 p += 2;
6041 MBEDTLS_SSL_DEBUG_MSG( 3, ( "NamedGroup: %s ( %x )",
6042 curve_info->name, *group_list ) );
Jerry Yuba073422021-12-20 22:22:15 +08006043 }
Jerry Yu63282b42022-01-11 15:43:53 +08006044#endif /* MBEDTLS_ECP_C */
6045 /* Add DHE groups here */
Jerry Yuba073422021-12-20 22:22:15 +08006046
6047 }
6048
Jerry Yu1510cea2022-01-12 10:56:49 +08006049 /* Length of named_group_list */
Jerry Yuba073422021-12-20 22:22:15 +08006050 named_group_list_len = p - named_group_list;
6051 if( named_group_list_len == 0 )
6052 {
6053 MBEDTLS_SSL_DEBUG_MSG( 1, ( "No group available." ) );
6054 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
6055 }
6056
6057 /* Write extension_type */
6058 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SUPPORTED_GROUPS, buf, 0 );
6059 /* Write extension_data_length */
6060 MBEDTLS_PUT_UINT16_BE( named_group_list_len + 2, buf, 2 );
6061 /* Write length of named_group_list */
6062 MBEDTLS_PUT_UINT16_BE( named_group_list_len, buf, 4 );
6063
Jerry Yu7f029d82022-01-11 11:08:53 +08006064 MBEDTLS_SSL_DEBUG_BUF( 3, "Supported groups extension",
6065 buf + 4, named_group_list_len + 2 );
Jerry Yuba073422021-12-20 22:22:15 +08006066
6067 *out_len = p - buf;
6068
6069#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
6070 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SUPPORTED_GROUPS;
6071#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
6072
6073 return( 0 );
6074}
6075
Jerry Yu1ea9d102021-12-21 13:41:49 +08006076#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED ||
6077 MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
6078 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Jerry Yuba073422021-12-20 22:22:15 +08006079
Jerry Yuf017ee42022-01-12 15:49:48 +08006080#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
6081/*
Jerry Yu7ddc38c2022-01-19 11:08:05 +08006082 * Function for writing a signature algorithm extension.
Jerry Yuf017ee42022-01-12 15:49:48 +08006083 *
Jerry Yu8afd6e42022-01-20 15:54:26 +08006084 * The `extension_data` field of signature algorithm contains a `SignatureSchemeList`
Jerry Yu7ddc38c2022-01-19 11:08:05 +08006085 * value (TLS 1.3 RFC8446):
6086 * enum {
6087 * ....
6088 * ecdsa_secp256r1_sha256( 0x0403 ),
6089 * ecdsa_secp384r1_sha384( 0x0503 ),
6090 * ecdsa_secp521r1_sha512( 0x0603 ),
6091 * ....
6092 * } SignatureScheme;
Jerry Yuf017ee42022-01-12 15:49:48 +08006093 *
Jerry Yu7ddc38c2022-01-19 11:08:05 +08006094 * struct {
6095 * SignatureScheme supported_signature_algorithms<2..2^16-2>;
6096 * } SignatureSchemeList;
Jerry Yuf017ee42022-01-12 15:49:48 +08006097 *
Jerry Yu8afd6e42022-01-20 15:54:26 +08006098 * The `extension_data` field of signature algorithm contains a `SignatureAndHashAlgorithm`
6099 * value (TLS 1.2 RFC5246):
Jerry Yu7ddc38c2022-01-19 11:08:05 +08006100 * enum {
6101 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
6102 * sha512(6), (255)
6103 * } HashAlgorithm;
6104 *
6105 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
6106 * SignatureAlgorithm;
6107 *
6108 * struct {
6109 * HashAlgorithm hash;
6110 * SignatureAlgorithm signature;
6111 * } SignatureAndHashAlgorithm;
6112 *
6113 * SignatureAndHashAlgorithm
6114 * supported_signature_algorithms<2..2^16-2>;
6115 *
6116 * The TLS 1.3 signature algorithm extension was defined to be a compatible
6117 * generalization of the TLS 1.2 signature algorithm extension.
6118 * `SignatureAndHashAlgorithm` field of TLS 1.2 can be represented by
6119 * `SignatureScheme` field of TLS 1.3
6120 *
Jerry Yuf017ee42022-01-12 15:49:48 +08006121 */
6122int mbedtls_ssl_write_sig_alg_ext( mbedtls_ssl_context *ssl, unsigned char *buf,
6123 const unsigned char *end, size_t *out_len )
6124{
6125 unsigned char *p = buf;
6126 unsigned char *supported_sig_alg; /* Start of supported_signature_algorithms */
6127 size_t supported_sig_alg_len = 0; /* Length of supported_signature_algorithms */
6128
6129 *out_len = 0;
6130
6131 MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding signature_algorithms extension" ) );
6132
6133 /* Check if we have space for header and length field:
6134 * - extension_type (2 bytes)
6135 * - extension_data_length (2 bytes)
6136 * - supported_signature_algorithms_length (2 bytes)
6137 */
6138 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 6 );
6139 p += 6;
6140
6141 /*
6142 * Write supported_signature_algorithms
6143 */
6144 supported_sig_alg = p;
Jerry Yu6106fdc2022-01-12 16:36:14 +08006145 const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs( ssl );
6146 if( sig_alg == NULL )
6147 return( MBEDTLS_ERR_SSL_BAD_CONFIG );
6148
6149 for( ; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++ )
Jerry Yuf017ee42022-01-12 15:49:48 +08006150 {
Jerry Yu1bab3012022-01-19 17:43:22 +08006151 if( ! mbedtls_ssl_sig_alg_is_supported( ssl, *sig_alg ) )
6152 continue;
Jerry Yuf017ee42022-01-12 15:49:48 +08006153 MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 );
6154 MBEDTLS_PUT_UINT16_BE( *sig_alg, p, 0 );
6155 p += 2;
6156 MBEDTLS_SSL_DEBUG_MSG( 3, ( "signature scheme [%x]", *sig_alg ) );
6157 }
6158
6159 /* Length of supported_signature_algorithms */
6160 supported_sig_alg_len = p - supported_sig_alg;
6161 if( supported_sig_alg_len == 0 )
6162 {
6163 MBEDTLS_SSL_DEBUG_MSG( 1, ( "No signature algorithms defined." ) );
6164 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
6165 }
6166
6167 /* Write extension_type */
6168 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SIG_ALG, buf, 0 );
6169 /* Write extension_data_length */
6170 MBEDTLS_PUT_UINT16_BE( supported_sig_alg_len + 2, buf, 2 );
6171 /* Write length of supported_signature_algorithms */
6172 MBEDTLS_PUT_UINT16_BE( supported_sig_alg_len, buf, 4 );
6173
6174 /* Output the total length of signature algorithms extension. */
6175 *out_len = p - buf;
6176
6177#if defined(MBEDTLS_SSL_PROTO_TLS1_3)
6178 ssl->handshake->extensions_present |= MBEDTLS_SSL_EXT_SIG_ALG;
6179#endif /* MBEDTLS_SSL_PROTO_TLS1_3 */
6180 return( 0 );
6181}
6182#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Jerry Yuc73c6182022-02-08 20:29:25 +08006183
Jerry Yuc5aef882021-12-23 20:15:02 +08006184#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
6185int mbedtls_ssl_write_hostname_ext( mbedtls_ssl_context *ssl,
6186 unsigned char *buf,
6187 const unsigned char *end,
6188 size_t *olen )
6189{
6190 unsigned char *p = buf;
6191 size_t hostname_len;
6192
6193 *olen = 0;
6194
6195 if( ssl->hostname == NULL )
6196 return( 0 );
6197
6198 MBEDTLS_SSL_DEBUG_MSG( 3,
6199 ( "client hello, adding server name extension: %s",
6200 ssl->hostname ) );
6201
6202 hostname_len = strlen( ssl->hostname );
6203
6204 MBEDTLS_SSL_CHK_BUF_PTR( p, end, hostname_len + 9 );
6205
6206 /*
6207 * Sect. 3, RFC 6066 (TLS Extensions Definitions)
6208 *
6209 * In order to provide any of the server names, clients MAY include an
6210 * extension of type "server_name" in the (extended) client hello. The
6211 * "extension_data" field of this extension SHALL contain
6212 * "ServerNameList" where:
6213 *
6214 * struct {
6215 * NameType name_type;
6216 * select (name_type) {
6217 * case host_name: HostName;
6218 * } name;
6219 * } ServerName;
6220 *
6221 * enum {
6222 * host_name(0), (255)
6223 * } NameType;
6224 *
6225 * opaque HostName<1..2^16-1>;
6226 *
6227 * struct {
6228 * ServerName server_name_list<1..2^16-1>
6229 * } ServerNameList;
6230 *
6231 */
6232 MBEDTLS_PUT_UINT16_BE( MBEDTLS_TLS_EXT_SERVERNAME, p, 0 );
6233 p += 2;
6234
6235 MBEDTLS_PUT_UINT16_BE( hostname_len + 5, p, 0 );
6236 p += 2;
6237
6238 MBEDTLS_PUT_UINT16_BE( hostname_len + 3, p, 0 );
6239 p += 2;
6240
6241 *p++ = MBEDTLS_BYTE_0( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME );
6242
6243 MBEDTLS_PUT_UINT16_BE( hostname_len, p, 0 );
6244 p += 2;
6245
6246 memcpy( p, ssl->hostname, hostname_len );
6247
6248 *olen = hostname_len + 9;
6249
6250 return( 0 );
6251}
6252#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Jerry Yuf017ee42022-01-12 15:49:48 +08006253
Jerry Yudc7bd172022-02-17 13:44:15 +08006254
6255#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
6256
6257#if defined(MBEDTLS_USE_PSA_CRYPTO)
6258
6259static psa_status_t setup_psa_key_derivation( psa_key_derivation_operation_t* derivation,
6260 mbedtls_svc_key_id_t key,
6261 psa_algorithm_t alg,
6262 const unsigned char* seed, size_t seed_length,
6263 const unsigned char* label, size_t label_length,
6264 size_t capacity )
6265{
6266 psa_status_t status;
6267
6268 status = psa_key_derivation_setup( derivation, alg );
6269 if( status != PSA_SUCCESS )
6270 return( status );
6271
6272 if( PSA_ALG_IS_TLS12_PRF( alg ) || PSA_ALG_IS_TLS12_PSK_TO_MS( alg ) )
6273 {
6274 status = psa_key_derivation_input_bytes( derivation,
6275 PSA_KEY_DERIVATION_INPUT_SEED,
6276 seed, seed_length );
6277 if( status != PSA_SUCCESS )
6278 return( status );
6279
6280 if( mbedtls_svc_key_id_is_null( key ) )
6281 {
6282 status = psa_key_derivation_input_bytes(
6283 derivation, PSA_KEY_DERIVATION_INPUT_SECRET,
6284 NULL, 0 );
6285 }
6286 else
6287 {
6288 status = psa_key_derivation_input_key(
6289 derivation, PSA_KEY_DERIVATION_INPUT_SECRET, key );
6290 }
6291 if( status != PSA_SUCCESS )
6292 return( status );
6293
6294 status = psa_key_derivation_input_bytes( derivation,
6295 PSA_KEY_DERIVATION_INPUT_LABEL,
6296 label, label_length );
6297 if( status != PSA_SUCCESS )
6298 return( status );
6299 }
6300 else
6301 {
6302 return( PSA_ERROR_NOT_SUPPORTED );
6303 }
6304
6305 status = psa_key_derivation_set_capacity( derivation, capacity );
6306 if( status != PSA_SUCCESS )
6307 return( status );
6308
6309 return( PSA_SUCCESS );
6310}
6311
6312static int tls_prf_generic( mbedtls_md_type_t md_type,
6313 const unsigned char *secret, size_t slen,
6314 const char *label,
6315 const unsigned char *random, size_t rlen,
6316 unsigned char *dstbuf, size_t dlen )
6317{
6318 psa_status_t status;
6319 psa_algorithm_t alg;
6320 mbedtls_svc_key_id_t master_key = MBEDTLS_SVC_KEY_ID_INIT;
6321 psa_key_derivation_operation_t derivation =
6322 PSA_KEY_DERIVATION_OPERATION_INIT;
6323
6324 if( md_type == MBEDTLS_MD_SHA384 )
6325 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_384);
6326 else
6327 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256);
6328
6329 /* Normally a "secret" should be long enough to be impossible to
6330 * find by brute force, and in particular should not be empty. But
6331 * this PRF is also used to derive an IV, in particular in EAP-TLS,
6332 * and for this use case it makes sense to have a 0-length "secret".
6333 * Since the key API doesn't allow importing a key of length 0,
6334 * keep master_key=0, which setup_psa_key_derivation() understands
6335 * to mean a 0-length "secret" input. */
6336 if( slen != 0 )
6337 {
6338 psa_key_attributes_t key_attributes = psa_key_attributes_init();
6339 psa_set_key_usage_flags( &key_attributes, PSA_KEY_USAGE_DERIVE );
6340 psa_set_key_algorithm( &key_attributes, alg );
6341 psa_set_key_type( &key_attributes, PSA_KEY_TYPE_DERIVE );
6342
6343 status = psa_import_key( &key_attributes, secret, slen, &master_key );
6344 if( status != PSA_SUCCESS )
6345 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
6346 }
6347
6348 status = setup_psa_key_derivation( &derivation,
6349 master_key, alg,
6350 random, rlen,
6351 (unsigned char const *) label,
6352 (size_t) strlen( label ),
6353 dlen );
6354 if( status != PSA_SUCCESS )
6355 {
6356 psa_key_derivation_abort( &derivation );
6357 psa_destroy_key( master_key );
6358 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
6359 }
6360
6361 status = psa_key_derivation_output_bytes( &derivation, dstbuf, dlen );
6362 if( status != PSA_SUCCESS )
6363 {
6364 psa_key_derivation_abort( &derivation );
6365 psa_destroy_key( master_key );
6366 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
6367 }
6368
6369 status = psa_key_derivation_abort( &derivation );
6370 if( status != PSA_SUCCESS )
6371 {
6372 psa_destroy_key( master_key );
6373 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
6374 }
6375
6376 if( ! mbedtls_svc_key_id_is_null( master_key ) )
6377 status = psa_destroy_key( master_key );
6378 if( status != PSA_SUCCESS )
6379 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
6380
6381 return( 0 );
6382}
6383
6384#else /* MBEDTLS_USE_PSA_CRYPTO */
6385
6386static int tls_prf_generic( mbedtls_md_type_t md_type,
6387 const unsigned char *secret, size_t slen,
6388 const char *label,
6389 const unsigned char *random, size_t rlen,
6390 unsigned char *dstbuf, size_t dlen )
6391{
6392 size_t nb;
6393 size_t i, j, k, md_len;
6394 unsigned char *tmp;
6395 size_t tmp_len = 0;
6396 unsigned char h_i[MBEDTLS_MD_MAX_SIZE];
6397 const mbedtls_md_info_t *md_info;
6398 mbedtls_md_context_t md_ctx;
6399 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6400
6401 mbedtls_md_init( &md_ctx );
6402
6403 if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL )
6404 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
6405
6406 md_len = mbedtls_md_get_size( md_info );
6407
6408 tmp_len = md_len + strlen( label ) + rlen;
6409 tmp = mbedtls_calloc( 1, tmp_len );
6410 if( tmp == NULL )
6411 {
6412 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
6413 goto exit;
6414 }
6415
6416 nb = strlen( label );
6417 memcpy( tmp + md_len, label, nb );
6418 memcpy( tmp + md_len + nb, random, rlen );
6419 nb += rlen;
6420
6421 /*
6422 * Compute P_<hash>(secret, label + random)[0..dlen]
6423 */
6424 if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
6425 goto exit;
6426
6427 ret = mbedtls_md_hmac_starts( &md_ctx, secret, slen );
6428 if( ret != 0 )
6429 goto exit;
6430 ret = mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb );
6431 if( ret != 0 )
6432 goto exit;
6433 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
6434 if( ret != 0 )
6435 goto exit;
6436
6437 for( i = 0; i < dlen; i += md_len )
6438 {
6439 ret = mbedtls_md_hmac_reset ( &md_ctx );
6440 if( ret != 0 )
6441 goto exit;
6442 ret = mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb );
6443 if( ret != 0 )
6444 goto exit;
6445 ret = mbedtls_md_hmac_finish( &md_ctx, h_i );
6446 if( ret != 0 )
6447 goto exit;
6448
6449 ret = mbedtls_md_hmac_reset ( &md_ctx );
6450 if( ret != 0 )
6451 goto exit;
6452 ret = mbedtls_md_hmac_update( &md_ctx, tmp, md_len );
6453 if( ret != 0 )
6454 goto exit;
6455 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
6456 if( ret != 0 )
6457 goto exit;
6458
6459 k = ( i + md_len > dlen ) ? dlen % md_len : md_len;
6460
6461 for( j = 0; j < k; j++ )
6462 dstbuf[i + j] = h_i[j];
6463 }
6464
6465exit:
6466 mbedtls_md_free( &md_ctx );
6467
6468 mbedtls_platform_zeroize( tmp, tmp_len );
6469 mbedtls_platform_zeroize( h_i, sizeof( h_i ) );
6470
6471 mbedtls_free( tmp );
6472
6473 return( ret );
6474}
6475#endif /* MBEDTLS_USE_PSA_CRYPTO */
6476
6477#if defined(MBEDTLS_SHA256_C)
6478static int tls_prf_sha256( const unsigned char *secret, size_t slen,
6479 const char *label,
6480 const unsigned char *random, size_t rlen,
6481 unsigned char *dstbuf, size_t dlen )
6482{
6483 return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen,
6484 label, random, rlen, dstbuf, dlen ) );
6485}
6486#endif /* MBEDTLS_SHA256_C */
6487
6488#if defined(MBEDTLS_SHA384_C)
6489static int tls_prf_sha384( const unsigned char *secret, size_t slen,
6490 const char *label,
6491 const unsigned char *random, size_t rlen,
6492 unsigned char *dstbuf, size_t dlen )
6493{
6494 return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen,
6495 label, random, rlen, dstbuf, dlen ) );
6496}
6497#endif /* MBEDTLS_SHA384_C */
6498
Jerry Yuf009d862022-02-17 14:01:37 +08006499/*
6500 * Set appropriate PRF function and other SSL / TLS1.2 functions
6501 *
6502 * Inputs:
6503 * - SSL/TLS minor version
6504 * - hash associated with the ciphersuite (only used by TLS 1.2)
6505 *
6506 * Outputs:
6507 * - the tls_prf, calc_verify and calc_finished members of handshake structure
6508 */
6509static int ssl_set_handshake_prfs( mbedtls_ssl_handshake_params *handshake,
6510 int minor_ver,
6511 mbedtls_md_type_t hash )
6512{
6513
6514#if defined(MBEDTLS_SHA384_C)
6515 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
6516 hash == MBEDTLS_MD_SHA384 )
6517 {
6518 handshake->tls_prf = tls_prf_sha384;
6519 handshake->calc_verify = ssl_calc_verify_tls_sha384;
6520 handshake->calc_finished = ssl_calc_finished_tls_sha384;
6521 }
6522 else
6523#endif
6524#if defined(MBEDTLS_SHA256_C)
6525 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
6526 {
6527 handshake->tls_prf = tls_prf_sha256;
6528 handshake->calc_verify = ssl_calc_verify_tls_sha256;
6529 handshake->calc_finished = ssl_calc_finished_tls_sha256;
6530 }
6531 else
6532#endif
6533 {
6534 (void) hash;
6535 (void) minor_ver;
6536 (void) handshake;
6537 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
6538 }
6539
6540 return( 0 );
6541}
Jerry Yud6ab2352022-02-17 14:03:43 +08006542
6543#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) && \
6544 defined(MBEDTLS_USE_PSA_CRYPTO)
6545static int ssl_use_opaque_psk( mbedtls_ssl_context const *ssl )
6546{
6547 if( ssl->conf->f_psk != NULL )
6548 {
6549 /* If we've used a callback to select the PSK,
6550 * the static configuration is irrelevant. */
6551 if( ! mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
6552 return( 1 );
6553
6554 return( 0 );
6555 }
6556
6557 if( ! mbedtls_svc_key_id_is_null( ssl->conf->psk_opaque ) )
6558 return( 1 );
6559
6560 return( 0 );
6561}
6562#endif /* MBEDTLS_USE_PSA_CRYPTO &&
6563 MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
6564
Jerry Yu2a7b5ac2022-02-17 14:07:00 +08006565/*
6566 * Compute master secret if needed
6567 *
6568 * Parameters:
6569 * [in/out] handshake
6570 * [in] resume, premaster, extended_ms, calc_verify, tls_prf
6571 * (PSA-PSK) ciphersuite_info, psk_opaque
6572 * [out] premaster (cleared)
6573 * [out] master
6574 * [in] ssl: optionally used for debugging, EMS and PSA-PSK
6575 * debug: conf->f_dbg, conf->p_dbg
6576 * EMS: passed to calc_verify (debug + session_negotiate)
6577 * PSA-PSA: minor_ver, conf
6578 */
6579static int ssl_compute_master( mbedtls_ssl_handshake_params *handshake,
6580 unsigned char *master,
6581 const mbedtls_ssl_context *ssl )
6582{
6583 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6584
6585 /* cf. RFC 5246, Section 8.1:
6586 * "The master secret is always exactly 48 bytes in length." */
6587 size_t const master_secret_len = 48;
6588
6589#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
6590 unsigned char session_hash[48];
6591#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
6592
6593 /* The label for the KDF used for key expansion.
6594 * This is either "master secret" or "extended master secret"
6595 * depending on whether the Extended Master Secret extension
6596 * is used. */
6597 char const *lbl = "master secret";
6598
6599 /* The salt for the KDF used for key expansion.
6600 * - If the Extended Master Secret extension is not used,
6601 * this is ClientHello.Random + ServerHello.Random
6602 * (see Sect. 8.1 in RFC 5246).
6603 * - If the Extended Master Secret extension is used,
6604 * this is the transcript of the handshake so far.
6605 * (see Sect. 4 in RFC 7627). */
6606 unsigned char const *salt = handshake->randbytes;
6607 size_t salt_len = 64;
6608
6609#if !defined(MBEDTLS_DEBUG_C) && \
6610 !defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \
6611 !(defined(MBEDTLS_USE_PSA_CRYPTO) && \
6612 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED))
6613 ssl = NULL; /* make sure we don't use it except for those cases */
6614 (void) ssl;
6615#endif
6616
6617 if( handshake->resume != 0 )
6618 {
6619 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
6620 return( 0 );
6621 }
6622
6623#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
6624 if( handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED )
6625 {
6626 lbl = "extended master secret";
6627 salt = session_hash;
6628 handshake->calc_verify( ssl, session_hash, &salt_len );
6629
6630 MBEDTLS_SSL_DEBUG_BUF( 3, "session hash for extended master secret",
6631 session_hash, salt_len );
6632 }
6633#endif /* MBEDTLS_SSL_EXTENDED_MS_ENABLED */
6634
6635#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
6636 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
6637 if( handshake->ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK &&
6638 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
6639 ssl_use_opaque_psk( ssl ) == 1 )
6640 {
6641 /* Perform PSK-to-MS expansion in a single step. */
6642 psa_status_t status;
6643 psa_algorithm_t alg;
6644 mbedtls_svc_key_id_t psk;
6645 psa_key_derivation_operation_t derivation =
6646 PSA_KEY_DERIVATION_OPERATION_INIT;
6647 mbedtls_md_type_t hash_alg = handshake->ciphersuite_info->mac;
6648
6649 MBEDTLS_SSL_DEBUG_MSG( 2, ( "perform PSA-based PSK-to-MS expansion" ) );
6650
6651 psk = mbedtls_ssl_get_opaque_psk( ssl );
6652
6653 if( hash_alg == MBEDTLS_MD_SHA384 )
6654 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
6655 else
6656 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
6657
6658 status = setup_psa_key_derivation( &derivation, psk, alg,
6659 salt, salt_len,
6660 (unsigned char const *) lbl,
6661 (size_t) strlen( lbl ),
6662 master_secret_len );
6663 if( status != PSA_SUCCESS )
6664 {
6665 psa_key_derivation_abort( &derivation );
6666 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
6667 }
6668
6669 status = psa_key_derivation_output_bytes( &derivation,
6670 master,
6671 master_secret_len );
6672 if( status != PSA_SUCCESS )
6673 {
6674 psa_key_derivation_abort( &derivation );
6675 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
6676 }
6677
6678 status = psa_key_derivation_abort( &derivation );
6679 if( status != PSA_SUCCESS )
6680 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
6681 }
6682 else
6683#endif
6684 {
6685 ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,
6686 lbl, salt, salt_len,
6687 master,
6688 master_secret_len );
6689 if( ret != 0 )
6690 {
6691 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
6692 return( ret );
6693 }
6694
6695 MBEDTLS_SSL_DEBUG_BUF( 3, "premaster secret",
6696 handshake->premaster,
6697 handshake->pmslen );
6698
6699 mbedtls_platform_zeroize( handshake->premaster,
6700 sizeof(handshake->premaster) );
6701 }
6702
6703 return( 0 );
6704}
6705
Jerry Yud62f87e2022-02-17 14:09:02 +08006706int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
6707{
6708 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6709 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
6710 ssl->handshake->ciphersuite_info;
6711
6712 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
6713
6714 /* Set PRF, calc_verify and calc_finished function pointers */
6715 ret = ssl_set_handshake_prfs( ssl->handshake,
6716 ssl->minor_ver,
6717 ciphersuite_info->mac );
6718 if( ret != 0 )
6719 {
6720 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_set_handshake_prfs", ret );
6721 return( ret );
6722 }
6723
6724 /* Compute master secret if needed */
6725 ret = ssl_compute_master( ssl->handshake,
6726 ssl->session_negotiate->master,
6727 ssl );
6728 if( ret != 0 )
6729 {
6730 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_compute_master", ret );
6731 return( ret );
6732 }
6733
6734 /* Swap the client and server random values:
6735 * - MS derivation wanted client+server (RFC 5246 8.1)
6736 * - key derivation wants server+client (RFC 5246 6.3) */
6737 {
6738 unsigned char tmp[64];
6739 memcpy( tmp, ssl->handshake->randbytes, 64 );
6740 memcpy( ssl->handshake->randbytes, tmp + 32, 32 );
6741 memcpy( ssl->handshake->randbytes + 32, tmp, 32 );
6742 mbedtls_platform_zeroize( tmp, sizeof( tmp ) );
6743 }
6744
6745 /* Populate transform structure */
6746 ret = ssl_tls12_populate_transform( ssl->transform_negotiate,
6747 ssl->session_negotiate->ciphersuite,
6748 ssl->session_negotiate->master,
6749#if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC) && \
6750 defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
6751 ssl->session_negotiate->encrypt_then_mac,
6752#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC &&
6753 MBEDTLS_SSL_SOME_SUITES_USE_MAC */
6754 ssl->handshake->tls_prf,
6755 ssl->handshake->randbytes,
6756 ssl->minor_ver,
6757 ssl->conf->endpoint,
6758 ssl );
6759 if( ret != 0 )
6760 {
6761 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_tls12_populate_transform", ret );
6762 return( ret );
6763 }
6764
6765 /* We no longer need Server/ClientHello.random values */
6766 mbedtls_platform_zeroize( ssl->handshake->randbytes,
6767 sizeof( ssl->handshake->randbytes ) );
6768
6769 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
6770
6771 return( 0 );
6772}
Jerry Yu8392e0d2022-02-17 14:10:24 +08006773
6774#if defined(MBEDTLS_SHA256_C)
6775void ssl_calc_verify_tls_sha256( const mbedtls_ssl_context *ssl,
6776 unsigned char *hash,
6777 size_t *hlen )
6778{
6779#if defined(MBEDTLS_USE_PSA_CRYPTO)
6780 size_t hash_size;
6781 psa_status_t status;
6782 psa_hash_operation_t sha256_psa = psa_hash_operation_init();
6783
6784 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> PSA calc verify sha256" ) );
6785 status = psa_hash_clone( &ssl->handshake->fin_sha256_psa, &sha256_psa );
6786 if( status != PSA_SUCCESS )
6787 {
6788 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
6789 return;
6790 }
6791
6792 status = psa_hash_finish( &sha256_psa, hash, 32, &hash_size );
6793 if( status != PSA_SUCCESS )
6794 {
6795 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
6796 return;
6797 }
6798
6799 *hlen = 32;
6800 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated verify result", hash, *hlen );
6801 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= PSA calc verify" ) );
6802#else
6803 mbedtls_sha256_context sha256;
6804
6805 mbedtls_sha256_init( &sha256 );
6806
6807 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
6808
6809 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
6810 mbedtls_sha256_finish( &sha256, hash );
6811
6812 *hlen = 32;
6813
6814 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
6815 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
6816
6817 mbedtls_sha256_free( &sha256 );
6818#endif /* MBEDTLS_USE_PSA_CRYPTO */
6819 return;
6820}
6821#endif /* MBEDTLS_SHA256_C */
6822
Jerry Yuc1cb3842022-02-17 14:13:48 +08006823#if defined(MBEDTLS_SHA384_C)
6824void ssl_calc_verify_tls_sha384( const mbedtls_ssl_context *ssl,
6825 unsigned char *hash,
6826 size_t *hlen )
6827{
6828#if defined(MBEDTLS_USE_PSA_CRYPTO)
6829 size_t hash_size;
6830 psa_status_t status;
6831 psa_hash_operation_t sha384_psa = psa_hash_operation_init();
6832
6833 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> PSA calc verify sha384" ) );
6834 status = psa_hash_clone( &ssl->handshake->fin_sha384_psa, &sha384_psa );
6835 if( status != PSA_SUCCESS )
6836 {
6837 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
6838 return;
6839 }
6840
6841 status = psa_hash_finish( &sha384_psa, hash, 48, &hash_size );
6842 if( status != PSA_SUCCESS )
6843 {
6844 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
6845 return;
6846 }
6847
6848 *hlen = 48;
6849 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated verify result", hash, *hlen );
6850 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= PSA calc verify" ) );
6851#else
6852 mbedtls_sha512_context sha512;
6853
6854 mbedtls_sha512_init( &sha512 );
6855
6856 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
6857
6858 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
6859 mbedtls_sha512_finish( &sha512, hash );
6860
6861 *hlen = 48;
6862
6863 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
6864 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
6865
6866 mbedtls_sha512_free( &sha512 );
6867#endif /* MBEDTLS_USE_PSA_CRYPTO */
6868 return;
6869}
6870#endif /* MBEDTLS_SHA384_C */
6871
Jerry Yuce3dca42022-02-17 14:16:37 +08006872#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
6873int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex )
6874{
6875 unsigned char *p = ssl->handshake->premaster;
6876 unsigned char *end = p + sizeof( ssl->handshake->premaster );
6877 const unsigned char *psk = NULL;
6878 size_t psk_len = 0;
6879
6880 if( mbedtls_ssl_get_psk( ssl, &psk, &psk_len )
6881 == MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED )
6882 {
6883 /*
6884 * This should never happen because the existence of a PSK is always
6885 * checked before calling this function
6886 */
6887 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
6888 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
6889 }
6890
6891 /*
6892 * PMS = struct {
6893 * opaque other_secret<0..2^16-1>;
6894 * opaque psk<0..2^16-1>;
6895 * };
6896 * with "other_secret" depending on the particular key exchange
6897 */
6898#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
6899 if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK )
6900 {
6901 if( end - p < 2 )
6902 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6903
6904 MBEDTLS_PUT_UINT16_BE( psk_len, p, 0 );
6905 p += 2;
6906
6907 if( end < p || (size_t)( end - p ) < psk_len )
6908 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6909
6910 memset( p, 0, psk_len );
6911 p += psk_len;
6912 }
6913 else
6914#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
6915#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
6916 if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
6917 {
6918 /*
6919 * other_secret already set by the ClientKeyExchange message,
6920 * and is 48 bytes long
6921 */
6922 if( end - p < 2 )
6923 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6924
6925 *p++ = 0;
6926 *p++ = 48;
6927 p += 48;
6928 }
6929 else
6930#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
6931#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
6932 if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
6933 {
6934 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6935 size_t len;
6936
6937 /* Write length only when we know the actual value */
6938 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
6939 p + 2, end - ( p + 2 ), &len,
6940 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
6941 {
6942 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
6943 return( ret );
6944 }
6945 MBEDTLS_PUT_UINT16_BE( len, p, 0 );
6946 p += 2 + len;
6947
6948 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
6949 }
6950 else
6951#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
6952#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
6953 if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
6954 {
6955 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6956 size_t zlen;
6957
6958 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen,
6959 p + 2, end - ( p + 2 ),
6960 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
6961 {
6962 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
6963 return( ret );
6964 }
6965
6966 MBEDTLS_PUT_UINT16_BE( zlen, p, 0 );
6967 p += 2 + zlen;
6968
6969 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
6970 MBEDTLS_DEBUG_ECDH_Z );
6971 }
6972 else
6973#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
6974 {
6975 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
6976 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
6977 }
6978
6979 /* opaque psk<0..2^16-1>; */
6980 if( end - p < 2 )
6981 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6982
6983 MBEDTLS_PUT_UINT16_BE( psk_len, p, 0 );
6984 p += 2;
6985
6986 if( end < p || (size_t)( end - p ) < psk_len )
6987 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6988
6989 memcpy( p, psk, psk_len );
6990 p += psk_len;
6991
6992 ssl->handshake->pmslen = p - ssl->handshake->premaster;
6993
6994 return( 0 );
6995}
6996#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Jerry Yuc2c673d2022-02-17 14:20:39 +08006997
6998#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
6999static int ssl_write_hello_request( mbedtls_ssl_context *ssl );
7000
7001#if defined(MBEDTLS_SSL_PROTO_DTLS)
7002int mbedtls_ssl_resend_hello_request( mbedtls_ssl_context *ssl )
7003{
7004 /* If renegotiation is not enforced, retransmit until we would reach max
7005 * timeout if we were using the usual handshake doubling scheme */
7006 if( ssl->conf->renego_max_records < 0 )
7007 {
7008 uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1;
7009 unsigned char doublings = 1;
7010
7011 while( ratio != 0 )
7012 {
7013 ++doublings;
7014 ratio >>= 1;
7015 }
7016
7017 if( ++ssl->renego_records_seen > doublings )
7018 {
7019 MBEDTLS_SSL_DEBUG_MSG( 2, ( "no longer retransmitting hello request" ) );
7020 return( 0 );
7021 }
7022 }
7023
7024 return( ssl_write_hello_request( ssl ) );
7025}
7026#endif
7027#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
Jerry Yud9526692022-02-17 14:23:47 +08007028
7029
7030/*
7031 * Handshake functions
7032 */
7033#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
7034/* No certificate support -> dummy functions */
7035int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
7036{
7037 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
7038 ssl->handshake->ciphersuite_info;
7039
7040 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
7041
7042 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
7043 {
7044 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
7045 ssl->state++;
7046 return( 0 );
7047 }
7048
7049 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
7050 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
7051}
7052
7053int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
7054{
7055 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
7056 ssl->handshake->ciphersuite_info;
7057
7058 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
7059
7060 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
7061 {
7062 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
7063 ssl->state++;
7064 return( 0 );
7065 }
7066
7067 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
7068 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
7069}
7070
7071#else /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
7072/* Some certificate support -> implement write and parse */
7073
7074int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
7075{
7076 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
7077 size_t i, n;
7078 const mbedtls_x509_crt *crt;
7079 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
7080 ssl->handshake->ciphersuite_info;
7081
7082 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
7083
7084 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
7085 {
7086 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
7087 ssl->state++;
7088 return( 0 );
7089 }
7090
7091#if defined(MBEDTLS_SSL_CLI_C)
7092 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
7093 {
7094 if( ssl->handshake->client_auth == 0 )
7095 {
7096 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
7097 ssl->state++;
7098 return( 0 );
7099 }
7100 }
7101#endif /* MBEDTLS_SSL_CLI_C */
7102#if defined(MBEDTLS_SSL_SRV_C)
7103 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
7104 {
7105 if( mbedtls_ssl_own_cert( ssl ) == NULL )
7106 {
7107 /* Should never happen because we shouldn't have picked the
7108 * ciphersuite if we don't have a certificate. */
7109 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
7110 }
7111 }
7112#endif
7113
7114 MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", mbedtls_ssl_own_cert( ssl ) );
7115
7116 /*
7117 * 0 . 0 handshake type
7118 * 1 . 3 handshake length
7119 * 4 . 6 length of all certs
7120 * 7 . 9 length of cert. 1
7121 * 10 . n-1 peer certificate
7122 * n . n+2 length of cert. 2
7123 * n+3 . ... upper level cert, etc.
7124 */
7125 i = 7;
7126 crt = mbedtls_ssl_own_cert( ssl );
7127
7128 while( crt != NULL )
7129 {
7130 n = crt->raw.len;
7131 if( n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i )
7132 {
7133 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate too large, %" MBEDTLS_PRINTF_SIZET
7134 " > %" MBEDTLS_PRINTF_SIZET,
7135 i + 3 + n, (size_t) MBEDTLS_SSL_OUT_CONTENT_LEN ) );
7136 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
7137 }
7138
7139 ssl->out_msg[i ] = MBEDTLS_BYTE_2( n );
7140 ssl->out_msg[i + 1] = MBEDTLS_BYTE_1( n );
7141 ssl->out_msg[i + 2] = MBEDTLS_BYTE_0( n );
7142
7143 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
7144 i += n; crt = crt->next;
7145 }
7146
7147 ssl->out_msg[4] = MBEDTLS_BYTE_2( i - 7 );
7148 ssl->out_msg[5] = MBEDTLS_BYTE_1( i - 7 );
7149 ssl->out_msg[6] = MBEDTLS_BYTE_0( i - 7 );
7150
7151 ssl->out_msglen = i;
7152 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
7153 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE;
7154
7155 ssl->state++;
7156
7157 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
7158 {
7159 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
7160 return( ret );
7161 }
7162
7163 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
7164
7165 return( ret );
7166}
7167
7168#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
7169
7170#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
7171static int ssl_check_peer_crt_unchanged( mbedtls_ssl_context *ssl,
7172 unsigned char *crt_buf,
7173 size_t crt_buf_len )
7174{
7175 mbedtls_x509_crt const * const peer_crt = ssl->session->peer_cert;
7176
7177 if( peer_crt == NULL )
7178 return( -1 );
7179
7180 if( peer_crt->raw.len != crt_buf_len )
7181 return( -1 );
7182
7183 return( memcmp( peer_crt->raw.p, crt_buf, peer_crt->raw.len ) );
7184}
7185#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7186static int ssl_check_peer_crt_unchanged( mbedtls_ssl_context *ssl,
7187 unsigned char *crt_buf,
7188 size_t crt_buf_len )
7189{
7190 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7191 unsigned char const * const peer_cert_digest =
7192 ssl->session->peer_cert_digest;
7193 mbedtls_md_type_t const peer_cert_digest_type =
7194 ssl->session->peer_cert_digest_type;
7195 mbedtls_md_info_t const * const digest_info =
7196 mbedtls_md_info_from_type( peer_cert_digest_type );
7197 unsigned char tmp_digest[MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN];
7198 size_t digest_len;
7199
7200 if( peer_cert_digest == NULL || digest_info == NULL )
7201 return( -1 );
7202
7203 digest_len = mbedtls_md_get_size( digest_info );
7204 if( digest_len > MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN )
7205 return( -1 );
7206
7207 ret = mbedtls_md( digest_info, crt_buf, crt_buf_len, tmp_digest );
7208 if( ret != 0 )
7209 return( -1 );
7210
7211 return( memcmp( tmp_digest, peer_cert_digest, digest_len ) );
7212}
7213#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7214#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
7215
7216/*
7217 * Once the certificate message is read, parse it into a cert chain and
7218 * perform basic checks, but leave actual verification to the caller
7219 */
7220static int ssl_parse_certificate_chain( mbedtls_ssl_context *ssl,
7221 mbedtls_x509_crt *chain )
7222{
7223 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7224#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
7225 int crt_cnt=0;
7226#endif
7227 size_t i, n;
7228 uint8_t alert;
7229
7230 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
7231 {
7232 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
7233 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7234 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
7235 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
7236 }
7237
7238 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE )
7239 {
7240 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7241 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
7242 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
7243 }
7244
7245 if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 )
7246 {
7247 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
7248 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7249 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
7250 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
7251 }
7252
7253 i = mbedtls_ssl_hs_hdr_len( ssl );
7254
7255 /*
7256 * Same message structure as in mbedtls_ssl_write_certificate()
7257 */
7258 n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2];
7259
7260 if( ssl->in_msg[i] != 0 ||
7261 ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) )
7262 {
7263 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
7264 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7265 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
7266 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
7267 }
7268
7269 /* Make &ssl->in_msg[i] point to the beginning of the CRT chain. */
7270 i += 3;
7271
7272 /* Iterate through and parse the CRTs in the provided chain. */
7273 while( i < ssl->in_hslen )
7274 {
7275 /* Check that there's room for the next CRT's length fields. */
7276 if ( i + 3 > ssl->in_hslen ) {
7277 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
7278 mbedtls_ssl_send_alert_message( ssl,
7279 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7280 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
7281 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
7282 }
7283 /* In theory, the CRT can be up to 2**24 Bytes, but we don't support
7284 * anything beyond 2**16 ~ 64K. */
7285 if( ssl->in_msg[i] != 0 )
7286 {
7287 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
7288 mbedtls_ssl_send_alert_message( ssl,
7289 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7290 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT );
7291 return( MBEDTLS_ERR_SSL_BAD_CERTIFICATE );
7292 }
7293
7294 /* Read length of the next CRT in the chain. */
7295 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
7296 | (unsigned int) ssl->in_msg[i + 2];
7297 i += 3;
7298
7299 if( n < 128 || i + n > ssl->in_hslen )
7300 {
7301 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
7302 mbedtls_ssl_send_alert_message( ssl,
7303 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7304 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
7305 return( MBEDTLS_ERR_SSL_DECODE_ERROR );
7306 }
7307
7308 /* Check if we're handling the first CRT in the chain. */
7309#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
7310 if( crt_cnt++ == 0 &&
7311 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
7312 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
7313 {
7314 /* During client-side renegotiation, check that the server's
7315 * end-CRTs hasn't changed compared to the initial handshake,
7316 * mitigating the triple handshake attack. On success, reuse
7317 * the original end-CRT instead of parsing it again. */
7318 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Check that peer CRT hasn't changed during renegotiation" ) );
7319 if( ssl_check_peer_crt_unchanged( ssl,
7320 &ssl->in_msg[i],
7321 n ) != 0 )
7322 {
7323 MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) );
7324 mbedtls_ssl_send_alert_message( ssl,
7325 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7326 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED );
7327 return( MBEDTLS_ERR_SSL_BAD_CERTIFICATE );
7328 }
7329
7330 /* Now we can safely free the original chain. */
7331 ssl_clear_peer_cert( ssl->session );
7332 }
7333#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
7334
7335 /* Parse the next certificate in the chain. */
7336#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
7337 ret = mbedtls_x509_crt_parse_der( chain, ssl->in_msg + i, n );
7338#else
7339 /* If we don't need to store the CRT chain permanently, parse
7340 * it in-place from the input buffer instead of making a copy. */
7341 ret = mbedtls_x509_crt_parse_der_nocopy( chain, ssl->in_msg + i, n );
7342#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7343 switch( ret )
7344 {
7345 case 0: /*ok*/
7346 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
7347 /* Ignore certificate with an unknown algorithm: maybe a
7348 prior certificate was already trusted. */
7349 break;
7350
7351 case MBEDTLS_ERR_X509_ALLOC_FAILED:
7352 alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR;
7353 goto crt_parse_der_failed;
7354
7355 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
7356 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7357 goto crt_parse_der_failed;
7358
7359 default:
7360 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
7361 crt_parse_der_failed:
7362 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert );
7363 MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret );
7364 return( ret );
7365 }
7366
7367 i += n;
7368 }
7369
7370 MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", chain );
7371 return( 0 );
7372}
7373
7374#if defined(MBEDTLS_SSL_SRV_C)
7375static int ssl_srv_check_client_no_crt_notification( mbedtls_ssl_context *ssl )
7376{
7377 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
7378 return( -1 );
7379
7380 if( ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len( ssl ) &&
7381 ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
7382 ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE &&
7383 memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), "\0\0\0", 3 ) == 0 )
7384 {
7385 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
7386 return( 0 );
7387 }
7388 return( -1 );
7389}
7390#endif /* MBEDTLS_SSL_SRV_C */
7391
7392/* Check if a certificate message is expected.
7393 * Return either
7394 * - SSL_CERTIFICATE_EXPECTED, or
7395 * - SSL_CERTIFICATE_SKIP
7396 * indicating whether a Certificate message is expected or not.
7397 */
7398#define SSL_CERTIFICATE_EXPECTED 0
7399#define SSL_CERTIFICATE_SKIP 1
7400static int ssl_parse_certificate_coordinate( mbedtls_ssl_context *ssl,
7401 int authmode )
7402{
7403 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
7404 ssl->handshake->ciphersuite_info;
7405
7406 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
7407 return( SSL_CERTIFICATE_SKIP );
7408
7409#if defined(MBEDTLS_SSL_SRV_C)
7410 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
7411 {
7412 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
7413 return( SSL_CERTIFICATE_SKIP );
7414
7415 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
7416 {
7417 ssl->session_negotiate->verify_result =
7418 MBEDTLS_X509_BADCERT_SKIP_VERIFY;
7419 return( SSL_CERTIFICATE_SKIP );
7420 }
7421 }
7422#else
7423 ((void) authmode);
7424#endif /* MBEDTLS_SSL_SRV_C */
7425
7426 return( SSL_CERTIFICATE_EXPECTED );
7427}
7428
7429static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl,
7430 int authmode,
7431 mbedtls_x509_crt *chain,
7432 void *rs_ctx )
7433{
7434 int ret = 0;
7435 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
7436 ssl->handshake->ciphersuite_info;
7437 int have_ca_chain = 0;
7438
7439 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *);
7440 void *p_vrfy;
7441
7442 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
7443 return( 0 );
7444
7445 if( ssl->f_vrfy != NULL )
7446 {
7447 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use context-specific verification callback" ) );
7448 f_vrfy = ssl->f_vrfy;
7449 p_vrfy = ssl->p_vrfy;
7450 }
7451 else
7452 {
7453 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use configuration-specific verification callback" ) );
7454 f_vrfy = ssl->conf->f_vrfy;
7455 p_vrfy = ssl->conf->p_vrfy;
7456 }
7457
7458 /*
7459 * Main check: verify certificate
7460 */
7461#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
7462 if( ssl->conf->f_ca_cb != NULL )
7463 {
7464 ((void) rs_ctx);
7465 have_ca_chain = 1;
7466
7467 MBEDTLS_SSL_DEBUG_MSG( 3, ( "use CA callback for X.509 CRT verification" ) );
7468 ret = mbedtls_x509_crt_verify_with_ca_cb(
7469 chain,
7470 ssl->conf->f_ca_cb,
7471 ssl->conf->p_ca_cb,
7472 ssl->conf->cert_profile,
7473 ssl->hostname,
7474 &ssl->session_negotiate->verify_result,
7475 f_vrfy, p_vrfy );
7476 }
7477 else
7478#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
7479 {
7480 mbedtls_x509_crt *ca_chain;
7481 mbedtls_x509_crl *ca_crl;
7482
7483#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
7484 if( ssl->handshake->sni_ca_chain != NULL )
7485 {
7486 ca_chain = ssl->handshake->sni_ca_chain;
7487 ca_crl = ssl->handshake->sni_ca_crl;
7488 }
7489 else
7490#endif
7491 {
7492 ca_chain = ssl->conf->ca_chain;
7493 ca_crl = ssl->conf->ca_crl;
7494 }
7495
7496 if( ca_chain != NULL )
7497 have_ca_chain = 1;
7498
7499 ret = mbedtls_x509_crt_verify_restartable(
7500 chain,
7501 ca_chain, ca_crl,
7502 ssl->conf->cert_profile,
7503 ssl->hostname,
7504 &ssl->session_negotiate->verify_result,
7505 f_vrfy, p_vrfy, rs_ctx );
7506 }
7507
7508 if( ret != 0 )
7509 {
7510 MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
7511 }
7512
7513#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
7514 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
7515 return( MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS );
7516#endif
7517
7518 /*
7519 * Secondary checks: always done, but change 'ret' only if it was 0
7520 */
7521
7522#if defined(MBEDTLS_ECP_C)
7523 {
7524 const mbedtls_pk_context *pk = &chain->pk;
7525
7526 /* If certificate uses an EC key, make sure the curve is OK */
7527 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) &&
7528 mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 )
7529 {
7530 ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY;
7531
7532 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) );
7533 if( ret == 0 )
7534 ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
7535 }
7536 }
7537#endif /* MBEDTLS_ECP_C */
7538
7539 if( mbedtls_ssl_check_cert_usage( chain,
7540 ciphersuite_info,
7541 ! ssl->conf->endpoint,
7542 &ssl->session_negotiate->verify_result ) != 0 )
7543 {
7544 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) );
7545 if( ret == 0 )
7546 ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
7547 }
7548
7549 /* mbedtls_x509_crt_verify_with_profile is supposed to report a
7550 * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
7551 * with details encoded in the verification flags. All other kinds
7552 * of error codes, including those from the user provided f_vrfy
7553 * functions, are treated as fatal and lead to a failure of
7554 * ssl_parse_certificate even if verification was optional. */
7555 if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
7556 ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
7557 ret == MBEDTLS_ERR_SSL_BAD_CERTIFICATE ) )
7558 {
7559 ret = 0;
7560 }
7561
7562 if( have_ca_chain == 0 && authmode == MBEDTLS_SSL_VERIFY_REQUIRED )
7563 {
7564 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
7565 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
7566 }
7567
7568 if( ret != 0 )
7569 {
7570 uint8_t alert;
7571
7572 /* The certificate may have been rejected for several reasons.
7573 Pick one and send the corresponding alert. Which alert to send
7574 may be a subject of debate in some cases. */
7575 if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER )
7576 alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED;
7577 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH )
7578 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
7579 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE )
7580 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7581 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE )
7582 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7583 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE )
7584 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7585 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK )
7586 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7587 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY )
7588 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
7589 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED )
7590 alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED;
7591 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED )
7592 alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED;
7593 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED )
7594 alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA;
7595 else
7596 alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN;
7597 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7598 alert );
7599 }
7600
7601#if defined(MBEDTLS_DEBUG_C)
7602 if( ssl->session_negotiate->verify_result != 0 )
7603 {
7604 MBEDTLS_SSL_DEBUG_MSG( 3, ( "! Certificate verification flags %08x",
7605 (unsigned int) ssl->session_negotiate->verify_result ) );
7606 }
7607 else
7608 {
7609 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate verification flags clear" ) );
7610 }
7611#endif /* MBEDTLS_DEBUG_C */
7612
7613 return( ret );
7614}
7615
7616#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
7617static int ssl_remember_peer_crt_digest( mbedtls_ssl_context *ssl,
7618 unsigned char *start, size_t len )
7619{
7620 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7621 /* Remember digest of the peer's end-CRT. */
7622 ssl->session_negotiate->peer_cert_digest =
7623 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
7624 if( ssl->session_negotiate->peer_cert_digest == NULL )
7625 {
7626 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
7627 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN ) );
7628 mbedtls_ssl_send_alert_message( ssl,
7629 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7630 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7631
7632 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
7633 }
7634
7635 ret = mbedtls_md( mbedtls_md_info_from_type(
7636 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
7637 start, len,
7638 ssl->session_negotiate->peer_cert_digest );
7639
7640 ssl->session_negotiate->peer_cert_digest_type =
7641 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
7642 ssl->session_negotiate->peer_cert_digest_len =
7643 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
7644
7645 return( ret );
7646}
7647
7648static int ssl_remember_peer_pubkey( mbedtls_ssl_context *ssl,
7649 unsigned char *start, size_t len )
7650{
7651 unsigned char *end = start + len;
7652 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
7653
7654 /* Make a copy of the peer's raw public key. */
7655 mbedtls_pk_init( &ssl->handshake->peer_pubkey );
7656 ret = mbedtls_pk_parse_subpubkey( &start, end,
7657 &ssl->handshake->peer_pubkey );
7658 if( ret != 0 )
7659 {
7660 /* We should have parsed the public key before. */
7661 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
7662 }
7663
7664 return( 0 );
7665}
7666#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7667
7668int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
7669{
7670 int ret = 0;
7671 int crt_expected;
7672#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
7673 const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET
7674 ? ssl->handshake->sni_authmode
7675 : ssl->conf->authmode;
7676#else
7677 const int authmode = ssl->conf->authmode;
7678#endif
7679 void *rs_ctx = NULL;
7680 mbedtls_x509_crt *chain = NULL;
7681
7682 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
7683
7684 crt_expected = ssl_parse_certificate_coordinate( ssl, authmode );
7685 if( crt_expected == SSL_CERTIFICATE_SKIP )
7686 {
7687 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
7688 goto exit;
7689 }
7690
7691#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
7692 if( ssl->handshake->ecrs_enabled &&
7693 ssl->handshake->ecrs_state == ssl_ecrs_crt_verify )
7694 {
7695 chain = ssl->handshake->ecrs_peer_cert;
7696 ssl->handshake->ecrs_peer_cert = NULL;
7697 goto crt_verify;
7698 }
7699#endif
7700
7701 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
7702 {
7703 /* mbedtls_ssl_read_record may have sent an alert already. We
7704 let it decide whether to alert. */
7705 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
7706 goto exit;
7707 }
7708
7709#if defined(MBEDTLS_SSL_SRV_C)
7710 if( ssl_srv_check_client_no_crt_notification( ssl ) == 0 )
7711 {
7712 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
7713
7714 if( authmode != MBEDTLS_SSL_VERIFY_OPTIONAL )
7715 ret = MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
7716
7717 goto exit;
7718 }
7719#endif /* MBEDTLS_SSL_SRV_C */
7720
7721 /* Clear existing peer CRT structure in case we tried to
7722 * reuse a session but it failed, and allocate a new one. */
7723 ssl_clear_peer_cert( ssl->session_negotiate );
7724
7725 chain = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
7726 if( chain == NULL )
7727 {
7728 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed",
7729 sizeof( mbedtls_x509_crt ) ) );
7730 mbedtls_ssl_send_alert_message( ssl,
7731 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7732 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7733
7734 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
7735 goto exit;
7736 }
7737 mbedtls_x509_crt_init( chain );
7738
7739 ret = ssl_parse_certificate_chain( ssl, chain );
7740 if( ret != 0 )
7741 goto exit;
7742
7743#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
7744 if( ssl->handshake->ecrs_enabled)
7745 ssl->handshake->ecrs_state = ssl_ecrs_crt_verify;
7746
7747crt_verify:
7748 if( ssl->handshake->ecrs_enabled)
7749 rs_ctx = &ssl->handshake->ecrs_ctx;
7750#endif
7751
7752 ret = ssl_parse_certificate_verify( ssl, authmode,
7753 chain, rs_ctx );
7754 if( ret != 0 )
7755 goto exit;
7756
7757#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
7758 {
7759 unsigned char *crt_start, *pk_start;
7760 size_t crt_len, pk_len;
7761
7762 /* We parse the CRT chain without copying, so
7763 * these pointers point into the input buffer,
7764 * and are hence still valid after freeing the
7765 * CRT chain. */
7766
7767 crt_start = chain->raw.p;
7768 crt_len = chain->raw.len;
7769
7770 pk_start = chain->pk_raw.p;
7771 pk_len = chain->pk_raw.len;
7772
7773 /* Free the CRT structures before computing
7774 * digest and copying the peer's public key. */
7775 mbedtls_x509_crt_free( chain );
7776 mbedtls_free( chain );
7777 chain = NULL;
7778
7779 ret = ssl_remember_peer_crt_digest( ssl, crt_start, crt_len );
7780 if( ret != 0 )
7781 goto exit;
7782
7783 ret = ssl_remember_peer_pubkey( ssl, pk_start, pk_len );
7784 if( ret != 0 )
7785 goto exit;
7786 }
7787#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7788 /* Pass ownership to session structure. */
7789 ssl->session_negotiate->peer_cert = chain;
7790 chain = NULL;
7791#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
7792
7793 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
7794
7795exit:
7796
7797 if( ret == 0 )
7798 ssl->state++;
7799
7800#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
7801 if( ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS )
7802 {
7803 ssl->handshake->ecrs_peer_cert = chain;
7804 chain = NULL;
7805 }
7806#endif
7807
7808 if( chain != NULL )
7809 {
7810 mbedtls_x509_crt_free( chain );
7811 mbedtls_free( chain );
7812 }
7813
7814 return( ret );
7815}
7816#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
7817
Jerry Yu615bd6f2022-02-17 14:25:15 +08007818
7819#if defined(MBEDTLS_SHA256_C)
7820static void ssl_calc_finished_tls_sha256(
7821 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
7822{
7823 int len = 12;
7824 const char *sender;
7825 unsigned char padbuf[32];
7826#if defined(MBEDTLS_USE_PSA_CRYPTO)
7827 size_t hash_size;
7828 psa_hash_operation_t sha256_psa = PSA_HASH_OPERATION_INIT;
7829 psa_status_t status;
7830#else
7831 mbedtls_sha256_context sha256;
7832#endif
7833
7834 mbedtls_ssl_session *session = ssl->session_negotiate;
7835 if( !session )
7836 session = ssl->session;
7837
7838 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
7839 ? "client finished"
7840 : "server finished";
7841
7842#if defined(MBEDTLS_USE_PSA_CRYPTO)
7843 sha256_psa = psa_hash_operation_init();
7844
7845 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc PSA finished tls sha256" ) );
7846
7847 status = psa_hash_clone( &ssl->handshake->fin_sha256_psa, &sha256_psa );
7848 if( status != PSA_SUCCESS )
7849 {
7850 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
7851 return;
7852 }
7853
7854 status = psa_hash_finish( &sha256_psa, padbuf, sizeof( padbuf ), &hash_size );
7855 if( status != PSA_SUCCESS )
7856 {
7857 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
7858 return;
7859 }
7860 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated padbuf", padbuf, 32 );
7861#else
7862
7863 mbedtls_sha256_init( &sha256 );
7864
7865 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
7866
7867 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
7868
7869 /*
7870 * TLSv1.2:
7871 * hash = PRF( master, finished_label,
7872 * Hash( handshake ) )[0.11]
7873 */
7874
7875#if !defined(MBEDTLS_SHA256_ALT)
7876 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
7877 sha256.state, sizeof( sha256.state ) );
7878#endif
7879
7880 mbedtls_sha256_finish( &sha256, padbuf );
7881 mbedtls_sha256_free( &sha256 );
7882#endif /* MBEDTLS_USE_PSA_CRYPTO */
7883
7884 ssl->handshake->tls_prf( session->master, 48, sender,
7885 padbuf, 32, buf, len );
7886
7887 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
7888
7889 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
7890
7891 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
7892}
7893#endif /* MBEDTLS_SHA256_C */
7894
Jerry Yub7ba49e2022-02-17 14:25:53 +08007895
7896#if defined(MBEDTLS_SHA384_C)
7897
7898static void ssl_calc_finished_tls_sha384(
7899 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
7900{
7901 int len = 12;
7902 const char *sender;
7903 unsigned char padbuf[48];
7904#if defined(MBEDTLS_USE_PSA_CRYPTO)
7905 size_t hash_size;
7906 psa_hash_operation_t sha384_psa = PSA_HASH_OPERATION_INIT;
7907 psa_status_t status;
7908#else
7909 mbedtls_sha512_context sha512;
7910#endif
7911
7912 mbedtls_ssl_session *session = ssl->session_negotiate;
7913 if( !session )
7914 session = ssl->session;
7915
7916 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
7917 ? "client finished"
7918 : "server finished";
7919
7920#if defined(MBEDTLS_USE_PSA_CRYPTO)
7921 sha384_psa = psa_hash_operation_init();
7922
7923 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc PSA finished tls sha384" ) );
7924
7925 status = psa_hash_clone( &ssl->handshake->fin_sha384_psa, &sha384_psa );
7926 if( status != PSA_SUCCESS )
7927 {
7928 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
7929 return;
7930 }
7931
7932 status = psa_hash_finish( &sha384_psa, padbuf, sizeof( padbuf ), &hash_size );
7933 if( status != PSA_SUCCESS )
7934 {
7935 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
7936 return;
7937 }
7938 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated padbuf", padbuf, 48 );
7939#else
7940 mbedtls_sha512_init( &sha512 );
7941
7942 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
7943
7944 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
7945
7946 /*
7947 * TLSv1.2:
7948 * hash = PRF( master, finished_label,
7949 * Hash( handshake ) )[0.11]
7950 */
7951
7952#if !defined(MBEDTLS_SHA512_ALT)
7953 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
7954 sha512.state, sizeof( sha512.state ) );
7955#endif
7956 mbedtls_sha512_finish( &sha512, padbuf );
7957
7958 mbedtls_sha512_free( &sha512 );
7959#endif
7960
7961 ssl->handshake->tls_prf( session->master, 48, sender,
7962 padbuf, 48, buf, len );
7963
7964 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
7965
7966 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
7967
7968 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
7969}
7970#endif /* MBEDTLS_SHA384_C */
7971
Jerry Yudc7bd172022-02-17 13:44:15 +08007972#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
7973
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007974#endif /* MBEDTLS_SSL_TLS_C */