blob: 2e4eedcac0351cd4204833c3be8463276a7a084b [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 shared functions
3 *
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/*
20 * The SSL 3.0 specification was drafted by Netscape in 1996,
21 * and became an IETF standard in 1999.
22 *
23 * http://wp.netscape.com/eng/ssl3/
24 * http://www.ietf.org/rfc/rfc2246.txt
25 * http://www.ietf.org/rfc/rfc4346.txt
26 */
27
Gilles Peskinedb09ef62020-06-03 01:43:33 +020028#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020030#if defined(MBEDTLS_SSL_TLS_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000031
SimonBd5800b72016-04-26 07:43:27 +010032#include "mbedtls/platform.h"
SimonBd5800b72016-04-26 07:43:27 +010033
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000034#include "mbedtls/ssl.h"
Manuel Pégourié-Gonnard5e94dde2015-05-26 11:57:05 +020035#include "mbedtls/ssl_internal.h"
Janos Follath73c616b2019-12-18 15:07:04 +000036#include "mbedtls/debug.h"
37#include "mbedtls/error.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050038#include "mbedtls/platform_util.h"
Hanno Beckera835da52019-05-16 12:39:07 +010039#include "mbedtls/version.h"
Gabor Mezeie24dea82021-10-19 12:22:25 +020040#include "mbedtls/constant_time.h"
Paul Bakker0be444a2013-08-27 21:55:01 +020041
Rich Evans00ab4702015-02-06 13:43:58 +000042#include <string.h>
43
Andrzej Kurekd6db9be2019-01-10 05:27:10 -050044#if defined(MBEDTLS_USE_PSA_CRYPTO)
45#include "mbedtls/psa_util.h"
46#include "psa/crypto.h"
47#endif
48
Janos Follath23bdca02016-10-07 14:47:14 +010049#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000050#include "mbedtls/oid.h"
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +020051#endif
52
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +020053#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker2b1e3542018-08-06 11:19:13 +010054
Hanno Beckera0e20d02019-05-15 14:03:01 +010055#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerf8542cf2019-04-09 15:22:03 +010056/* Top-level Connection ID API */
57
Hanno Becker8367ccc2019-05-14 11:30:10 +010058int mbedtls_ssl_conf_cid( mbedtls_ssl_config *conf,
59 size_t len,
60 int ignore_other_cid )
Hanno Beckerad4a1372019-05-03 13:06:44 +010061{
62 if( len > MBEDTLS_SSL_CID_IN_LEN_MAX )
63 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
64
Hanno Becker611ac772019-05-14 11:45:26 +010065 if( ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_FAIL &&
66 ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_IGNORE )
67 {
68 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
69 }
70
71 conf->ignore_unexpected_cid = ignore_other_cid;
Hanno Beckerad4a1372019-05-03 13:06:44 +010072 conf->cid_len = len;
73 return( 0 );
74}
75
Hanno Beckerf8542cf2019-04-09 15:22:03 +010076int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
77 int enable,
78 unsigned char const *own_cid,
79 size_t own_cid_len )
80{
Hanno Becker76a79ab2019-05-03 14:38:32 +010081 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
82 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
83
Hanno Beckerca092242019-04-25 16:01:49 +010084 ssl->negotiate_cid = enable;
85 if( enable == MBEDTLS_SSL_CID_DISABLED )
86 {
87 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Disable use of CID extension." ) );
88 return( 0 );
89 }
90 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Enable use of CID extension." ) );
Hanno Beckerad4a1372019-05-03 13:06:44 +010091 MBEDTLS_SSL_DEBUG_BUF( 3, "Own CID", own_cid, own_cid_len );
Hanno Beckerca092242019-04-25 16:01:49 +010092
Hanno Beckerad4a1372019-05-03 13:06:44 +010093 if( own_cid_len != ssl->conf->cid_len )
Hanno Beckerca092242019-04-25 16:01:49 +010094 {
Hanno Beckerad4a1372019-05-03 13:06:44 +010095 MBEDTLS_SSL_DEBUG_MSG( 3, ( "CID length %u does not match CID length %u in config",
96 (unsigned) own_cid_len,
97 (unsigned) ssl->conf->cid_len ) );
Hanno Beckerca092242019-04-25 16:01:49 +010098 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
99 }
100
101 memcpy( ssl->own_cid, own_cid, own_cid_len );
Hanno Beckerb7ee0cf2019-04-30 14:07:31 +0100102 /* Truncation is not an issue here because
103 * MBEDTLS_SSL_CID_IN_LEN_MAX at most 255. */
104 ssl->own_cid_len = (uint8_t) own_cid_len;
Hanno Beckerca092242019-04-25 16:01:49 +0100105
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100106 return( 0 );
107}
108
109int mbedtls_ssl_get_peer_cid( mbedtls_ssl_context *ssl,
110 int *enabled,
111 unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ],
112 size_t *peer_cid_len )
113{
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100114 *enabled = MBEDTLS_SSL_CID_DISABLED;
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100115
Hanno Becker76a79ab2019-05-03 14:38:32 +0100116 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
117 ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
118 {
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100119 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Hanno Becker76a79ab2019-05-03 14:38:32 +0100120 }
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100121
Hanno Beckerc5f24222019-05-03 12:54:52 +0100122 /* We report MBEDTLS_SSL_CID_DISABLED in case the CID extensions
123 * were used, but client and server requested the empty CID.
124 * This is indistinguishable from not using the CID extension
125 * in the first place. */
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100126 if( ssl->transform_in->in_cid_len == 0 &&
127 ssl->transform_in->out_cid_len == 0 )
128 {
129 return( 0 );
130 }
131
Hanno Becker615ef172019-05-22 16:50:35 +0100132 if( peer_cid_len != NULL )
133 {
134 *peer_cid_len = ssl->transform_in->out_cid_len;
135 if( peer_cid != NULL )
136 {
137 memcpy( peer_cid, ssl->transform_in->out_cid,
138 ssl->transform_in->out_cid_len );
139 }
140 }
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100141
142 *enabled = MBEDTLS_SSL_CID_ENABLED;
143
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100144 return( 0 );
145}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100146#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100147
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200148#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200149
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200150#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200151/*
152 * Convert max_fragment_length codes to length.
153 * RFC 6066 says:
154 * enum{
155 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
156 * } MaxFragmentLength;
157 * and we add 0 -> extension unused
158 */
Angus Grattond8213d02016-05-25 20:56:48 +1000159static unsigned int ssl_mfl_code_to_length( int mfl )
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200160{
Angus Grattond8213d02016-05-25 20:56:48 +1000161 switch( mfl )
162 {
163 case MBEDTLS_SSL_MAX_FRAG_LEN_NONE:
164 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
165 case MBEDTLS_SSL_MAX_FRAG_LEN_512:
166 return 512;
167 case MBEDTLS_SSL_MAX_FRAG_LEN_1024:
168 return 1024;
169 case MBEDTLS_SSL_MAX_FRAG_LEN_2048:
170 return 2048;
171 case MBEDTLS_SSL_MAX_FRAG_LEN_4096:
172 return 4096;
173 default:
174 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
175 }
176}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200177#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200178
Hanno Becker52055ae2019-02-06 14:30:46 +0000179int mbedtls_ssl_session_copy( mbedtls_ssl_session *dst,
180 const mbedtls_ssl_session *src )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200181{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200182 mbedtls_ssl_session_free( dst );
183 memcpy( dst, src, sizeof( mbedtls_ssl_session ) );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200184
吴敬辉0f6c6bc2021-11-29 10:46:35 +0800185#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
186 dst->ticket = NULL;
187#endif
188
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200189#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker6d1986e2019-02-07 12:27:42 +0000190
191#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200192 if( src->peer_cert != NULL )
193 {
Janos Follath865b3eb2019-12-16 11:46:15 +0000194 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker2292d1f2013-09-15 17:06:49 +0200195
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200196 dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200197 if( dst->peer_cert == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200198 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200199
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200200 mbedtls_x509_crt_init( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200201
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200202 if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p,
Manuel Pégourié-Gonnard4d2a8eb2014-06-13 20:33:27 +0200203 src->peer_cert->raw.len ) ) != 0 )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200204 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200205 mbedtls_free( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200206 dst->peer_cert = NULL;
207 return( ret );
208 }
209 }
Hanno Becker6d1986e2019-02-07 12:27:42 +0000210#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker9198ad12019-02-05 17:00:50 +0000211 if( src->peer_cert_digest != NULL )
212 {
Hanno Becker9198ad12019-02-05 17:00:50 +0000213 dst->peer_cert_digest =
Hanno Beckeraccc5992019-02-25 10:06:59 +0000214 mbedtls_calloc( 1, src->peer_cert_digest_len );
Hanno Becker9198ad12019-02-05 17:00:50 +0000215 if( dst->peer_cert_digest == NULL )
216 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
217
218 memcpy( dst->peer_cert_digest, src->peer_cert_digest,
219 src->peer_cert_digest_len );
220 dst->peer_cert_digest_type = src->peer_cert_digest_type;
Hanno Beckeraccc5992019-02-25 10:06:59 +0000221 dst->peer_cert_digest_len = src->peer_cert_digest_len;
Hanno Becker9198ad12019-02-05 17:00:50 +0000222 }
223#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
224
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200225#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200226
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +0200227#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200228 if( src->ticket != NULL )
229 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200230 dst->ticket = mbedtls_calloc( 1, src->ticket_len );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200231 if( dst->ticket == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200232 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200233
234 memcpy( dst->ticket, src->ticket, src->ticket_len );
235 }
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +0200236#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200237
238 return( 0 );
239}
240
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500241#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +0200242MBEDTLS_CHECK_RETURN_CRITICAL
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500243static int resize_buffer( unsigned char **buffer, size_t len_new, size_t *len_old )
244{
245 unsigned char* resized_buffer = mbedtls_calloc( 1, len_new );
246 if( resized_buffer == NULL )
247 return -1;
248
249 /* We want to copy len_new bytes when downsizing the buffer, and
250 * len_old bytes when upsizing, so we choose the smaller of two sizes,
251 * to fit one buffer into another. Size checks, ensuring that no data is
252 * lost, are done outside of this function. */
253 memcpy( resized_buffer, *buffer,
254 ( len_new < *len_old ) ? len_new : *len_old );
255 mbedtls_platform_zeroize( *buffer, *len_old );
256 mbedtls_free( *buffer );
257
258 *buffer = resized_buffer;
259 *len_old = len_new;
260
261 return 0;
262}
Andrzej Kurek4a063792020-10-21 15:08:44 +0200263
264static void handle_buffer_resizing( mbedtls_ssl_context *ssl, int downsizing,
Andrzej Kurek069fa962021-01-07 08:02:15 -0500265 size_t in_buf_new_len,
266 size_t out_buf_new_len )
Andrzej Kurek4a063792020-10-21 15:08:44 +0200267{
268 int modified = 0;
269 size_t written_in = 0, iv_offset_in = 0, len_offset_in = 0;
270 size_t written_out = 0, iv_offset_out = 0, len_offset_out = 0;
271 if( ssl->in_buf != NULL )
272 {
273 written_in = ssl->in_msg - ssl->in_buf;
274 iv_offset_in = ssl->in_iv - ssl->in_buf;
275 len_offset_in = ssl->in_len - ssl->in_buf;
276 if( downsizing ?
277 ssl->in_buf_len > in_buf_new_len && ssl->in_left < in_buf_new_len :
278 ssl->in_buf_len < in_buf_new_len )
279 {
280 if( resize_buffer( &ssl->in_buf, in_buf_new_len, &ssl->in_buf_len ) != 0 )
281 {
282 MBEDTLS_SSL_DEBUG_MSG( 1, ( "input buffer resizing failed - out of memory" ) );
283 }
284 else
285 {
Paul Elliottb7449902021-03-10 18:14:58 +0000286 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating in_buf to %" MBEDTLS_PRINTF_SIZET,
287 in_buf_new_len ) );
Andrzej Kurek4a063792020-10-21 15:08:44 +0200288 modified = 1;
289 }
290 }
291 }
292
293 if( ssl->out_buf != NULL )
294 {
295 written_out = ssl->out_msg - ssl->out_buf;
296 iv_offset_out = ssl->out_iv - ssl->out_buf;
297 len_offset_out = ssl->out_len - ssl->out_buf;
298 if( downsizing ?
299 ssl->out_buf_len > out_buf_new_len && ssl->out_left < out_buf_new_len :
300 ssl->out_buf_len < out_buf_new_len )
301 {
302 if( resize_buffer( &ssl->out_buf, out_buf_new_len, &ssl->out_buf_len ) != 0 )
303 {
304 MBEDTLS_SSL_DEBUG_MSG( 1, ( "output buffer resizing failed - out of memory" ) );
305 }
306 else
307 {
Paul Elliottb7449902021-03-10 18:14:58 +0000308 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating out_buf to %" MBEDTLS_PRINTF_SIZET,
309 out_buf_new_len ) );
Andrzej Kurek4a063792020-10-21 15:08:44 +0200310 modified = 1;
311 }
312 }
313 }
314 if( modified )
315 {
316 /* Update pointers here to avoid doing it twice. */
317 mbedtls_ssl_reset_in_out_pointers( ssl );
318 /* Fields below might not be properly updated with record
319 * splitting or with CID, so they are manually updated here. */
320 ssl->out_msg = ssl->out_buf + written_out;
321 ssl->out_len = ssl->out_buf + len_offset_out;
322 ssl->out_iv = ssl->out_buf + iv_offset_out;
323
324 ssl->in_msg = ssl->in_buf + written_in;
325 ssl->in_len = ssl->in_buf + len_offset_in;
326 ssl->in_iv = ssl->in_buf + iv_offset_in;
327 }
328}
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500329#endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
330
Paul Bakker5121ce52009-01-03 21:22:43 +0000331/*
332 * Key material generation
333 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200334#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +0200335MBEDTLS_CHECK_RETURN_CRITICAL
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200336static int ssl3_prf( const unsigned char *secret, size_t slen,
337 const char *label,
338 const unsigned char *random, size_t rlen,
Paul Bakker5f70b252012-09-13 14:23:06 +0000339 unsigned char *dstbuf, size_t dlen )
340{
Andres Amaya Garcia33952502017-07-20 16:29:16 +0100341 int ret = 0;
Paul Bakker5f70b252012-09-13 14:23:06 +0000342 size_t i;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +0200343 mbedtls_md5_context md5;
344 mbedtls_sha1_context sha1;
Paul Bakker5f70b252012-09-13 14:23:06 +0000345 unsigned char padding[16];
346 unsigned char sha1sum[20];
347 ((void)label);
348
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +0200349 mbedtls_md5_init( &md5 );
350 mbedtls_sha1_init( &sha1 );
Paul Bakker5b4af392014-06-26 12:09:34 +0200351
Paul Bakker5f70b252012-09-13 14:23:06 +0000352 /*
353 * SSLv3:
354 * block =
355 * MD5( secret + SHA1( 'A' + secret + random ) ) +
356 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
357 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
358 * ...
359 */
360 for( i = 0; i < dlen / 16; i++ )
361 {
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200362 memset( padding, (unsigned char) ('A' + i), 1 + i );
Paul Bakker5f70b252012-09-13 14:23:06 +0000363
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100364 if( ( ret = mbedtls_sha1_starts_ret( &sha1 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100365 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100366 if( ( ret = mbedtls_sha1_update_ret( &sha1, padding, 1 + i ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100367 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100368 if( ( ret = mbedtls_sha1_update_ret( &sha1, secret, slen ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100369 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100370 if( ( ret = mbedtls_sha1_update_ret( &sha1, random, rlen ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100371 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100372 if( ( ret = mbedtls_sha1_finish_ret( &sha1, sha1sum ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100373 goto exit;
Paul Bakker5f70b252012-09-13 14:23:06 +0000374
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100375 if( ( ret = mbedtls_md5_starts_ret( &md5 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100376 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100377 if( ( ret = mbedtls_md5_update_ret( &md5, secret, slen ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100378 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100379 if( ( ret = mbedtls_md5_update_ret( &md5, sha1sum, 20 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100380 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100381 if( ( ret = mbedtls_md5_finish_ret( &md5, dstbuf + i * 16 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100382 goto exit;
Paul Bakker5f70b252012-09-13 14:23:06 +0000383 }
384
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100385exit:
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +0200386 mbedtls_md5_free( &md5 );
387 mbedtls_sha1_free( &sha1 );
Paul Bakker5f70b252012-09-13 14:23:06 +0000388
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500389 mbedtls_platform_zeroize( padding, sizeof( padding ) );
390 mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) );
Paul Bakker5f70b252012-09-13 14:23:06 +0000391
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100392 return( ret );
Paul Bakker5f70b252012-09-13 14:23:06 +0000393}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200394#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5f70b252012-09-13 14:23:06 +0000395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200396#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +0200397MBEDTLS_CHECK_RETURN_CRITICAL
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200398static int tls1_prf( const unsigned char *secret, size_t slen,
399 const char *label,
400 const unsigned char *random, size_t rlen,
Paul Bakker23986e52011-04-24 08:57:21 +0000401 unsigned char *dstbuf, size_t dlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000402{
Paul Bakker23986e52011-04-24 08:57:21 +0000403 size_t nb, hs;
404 size_t i, j, k;
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200405 const unsigned char *S1, *S2;
Ron Eldor3b350852019-05-07 18:31:49 +0300406 unsigned char *tmp;
407 size_t tmp_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000408 unsigned char h_i[20];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 const mbedtls_md_info_t *md_info;
410 mbedtls_md_context_t md_ctx;
Janos Follath865b3eb2019-12-16 11:46:15 +0000411 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200413 mbedtls_md_init( &md_ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000414
Ron Eldor3b350852019-05-07 18:31:49 +0300415 tmp_len = 20 + strlen( label ) + rlen;
416 tmp = mbedtls_calloc( 1, tmp_len );
417 if( tmp == NULL )
418 {
419 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
420 goto exit;
421 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000422
423 hs = ( slen + 1 ) / 2;
424 S1 = secret;
425 S2 = secret + slen - hs;
426
427 nb = strlen( label );
428 memcpy( tmp + 20, label, nb );
429 memcpy( tmp + 20 + nb, random, rlen );
430 nb += rlen;
431
432 /*
433 * First compute P_md5(secret,label+random)[0..dlen]
434 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200435 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ) ) == NULL )
Ron Eldor3b350852019-05-07 18:31:49 +0300436 {
437 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
438 goto exit;
439 }
Manuel Pégourié-Gonnard7da726b2015-03-24 18:08:19 +0100440
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200441 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
Ron Eldor3b350852019-05-07 18:31:49 +0300442 {
443 goto exit;
444 }
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100445
Gilles Peskine2b3f21d2021-12-10 21:35:10 +0100446 ret = mbedtls_md_hmac_starts( &md_ctx, S1, hs );
447 if( ret != 0 )
448 goto exit;
449 ret = mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );
450 if( ret != 0 )
451 goto exit;
452 ret = mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );
453 if( ret != 0 )
454 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000455
456 for( i = 0; i < dlen; i += 16 )
457 {
Gilles Peskine2b3f21d2021-12-10 21:35:10 +0100458 ret = mbedtls_md_hmac_reset ( &md_ctx );
459 if( ret != 0 )
460 goto exit;
461 ret = mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 + nb );
462 if( ret != 0 )
463 goto exit;
464 ret = mbedtls_md_hmac_finish( &md_ctx, h_i );
465 if( ret != 0 )
466 goto exit;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100467
Gilles Peskine2b3f21d2021-12-10 21:35:10 +0100468 ret = mbedtls_md_hmac_reset ( &md_ctx );
469 if( ret != 0 )
470 goto exit;
471 ret = mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 );
472 if( ret != 0 )
473 goto exit;
474 ret = mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );
475 if( ret != 0 )
476 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000477
478 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
479
480 for( j = 0; j < k; j++ )
481 dstbuf[i + j] = h_i[j];
482 }
483
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200484 mbedtls_md_free( &md_ctx );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100485
Paul Bakker5121ce52009-01-03 21:22:43 +0000486 /*
487 * XOR out with P_sha1(secret,label+random)[0..dlen]
488 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200489 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL )
Ron Eldor3b350852019-05-07 18:31:49 +0300490 {
491 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
492 goto exit;
493 }
Manuel Pégourié-Gonnard7da726b2015-03-24 18:08:19 +0100494
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200495 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
Ron Eldor3b350852019-05-07 18:31:49 +0300496 {
497 goto exit;
498 }
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100499
Gilles Peskine2b3f21d2021-12-10 21:35:10 +0100500 ret = mbedtls_md_hmac_starts( &md_ctx, S2, hs );
501 if( ret != 0 )
502 goto exit;
503 ret = mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );
504 if( ret != 0 )
505 goto exit;
506 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
507 if( ret != 0 )
508 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000509
510 for( i = 0; i < dlen; i += 20 )
511 {
Gilles Peskine2b3f21d2021-12-10 21:35:10 +0100512 ret = mbedtls_md_hmac_reset ( &md_ctx );
513 if( ret != 0 )
514 goto exit;
515 ret = mbedtls_md_hmac_update( &md_ctx, tmp, 20 + nb );
516 if( ret != 0 )
517 goto exit;
518 ret = mbedtls_md_hmac_finish( &md_ctx, h_i );
519 if( ret != 0 )
520 goto exit;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100521
Gilles Peskine2b3f21d2021-12-10 21:35:10 +0100522 ret = mbedtls_md_hmac_reset ( &md_ctx );
523 if( ret != 0 )
524 goto exit;
525 ret = mbedtls_md_hmac_update( &md_ctx, tmp, 20 );
526 if( ret != 0 )
527 goto exit;
528 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
529 if( ret != 0 )
530 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +0000531
532 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
533
534 for( j = 0; j < k; j++ )
535 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
536 }
537
Ron Eldor3b350852019-05-07 18:31:49 +0300538exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200539 mbedtls_md_free( &md_ctx );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100540
Ron Eldor3b350852019-05-07 18:31:49 +0300541 mbedtls_platform_zeroize( tmp, tmp_len );
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500542 mbedtls_platform_zeroize( h_i, sizeof( h_i ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000543
Ron Eldor3b350852019-05-07 18:31:49 +0300544 mbedtls_free( tmp );
545 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000546}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200547#endif /* MBEDTLS_SSL_PROTO_TLS1) || MBEDTLS_SSL_PROTO_TLS1_1 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000548
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200549#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Andrzej Kurekc929a822019-01-14 03:51:11 -0500550#if defined(MBEDTLS_USE_PSA_CRYPTO)
k-stachowiak81053a52019-08-17 10:30:28 +0200551
552static psa_status_t setup_psa_key_derivation( psa_key_derivation_operation_t* derivation,
Ronald Croncf56a0a2020-08-04 09:51:30 +0200553 psa_key_id_t key,
k-stachowiak81053a52019-08-17 10:30:28 +0200554 psa_algorithm_t alg,
555 const unsigned char* seed, size_t seed_length,
556 const unsigned char* label, size_t label_length,
557 size_t capacity )
558{
559 psa_status_t status;
560
561 status = psa_key_derivation_setup( derivation, alg );
562 if( status != PSA_SUCCESS )
563 return( status );
564
565 if( PSA_ALG_IS_TLS12_PRF( alg ) || PSA_ALG_IS_TLS12_PSK_TO_MS( alg ) )
566 {
567 status = psa_key_derivation_input_bytes( derivation,
568 PSA_KEY_DERIVATION_INPUT_SEED,
569 seed, seed_length );
570 if( status != PSA_SUCCESS )
571 return( status );
572
Ronald Croncf56a0a2020-08-04 09:51:30 +0200573 if( mbedtls_svc_key_id_is_null( key ) )
Gilles Peskine311f54d2019-09-23 18:19:22 +0200574 {
575 status = psa_key_derivation_input_bytes(
576 derivation, PSA_KEY_DERIVATION_INPUT_SECRET,
577 NULL, 0 );
578 }
579 else
580 {
581 status = psa_key_derivation_input_key(
Ronald Croncf56a0a2020-08-04 09:51:30 +0200582 derivation, PSA_KEY_DERIVATION_INPUT_SECRET, key );
Gilles Peskine311f54d2019-09-23 18:19:22 +0200583 }
k-stachowiak81053a52019-08-17 10:30:28 +0200584 if( status != PSA_SUCCESS )
585 return( status );
586
587 status = psa_key_derivation_input_bytes( derivation,
588 PSA_KEY_DERIVATION_INPUT_LABEL,
589 label, label_length );
590 if( status != PSA_SUCCESS )
591 return( status );
592 }
593 else
594 {
595 return( PSA_ERROR_NOT_SUPPORTED );
596 }
597
598 status = psa_key_derivation_set_capacity( derivation, capacity );
599 if( status != PSA_SUCCESS )
600 return( status );
601
602 return( PSA_SUCCESS );
603}
604
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +0200605MBEDTLS_CHECK_RETURN_CRITICAL
Andrzej Kurekc929a822019-01-14 03:51:11 -0500606static int tls_prf_generic( mbedtls_md_type_t md_type,
607 const unsigned char *secret, size_t slen,
608 const char *label,
609 const unsigned char *random, size_t rlen,
610 unsigned char *dstbuf, size_t dlen )
611{
612 psa_status_t status;
613 psa_algorithm_t alg;
Ronald Croncf56a0a2020-08-04 09:51:30 +0200614 psa_key_id_t master_key = MBEDTLS_SVC_KEY_ID_INIT;
Janos Follathda6ac012019-08-16 13:47:29 +0100615 psa_key_derivation_operation_t derivation =
Janos Follath8dee8772019-07-30 12:53:32 +0100616 PSA_KEY_DERIVATION_OPERATION_INIT;
Andrzej Kurekc929a822019-01-14 03:51:11 -0500617
Andrzej Kurekc929a822019-01-14 03:51:11 -0500618 if( md_type == MBEDTLS_MD_SHA384 )
619 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_384);
620 else
621 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256);
622
Gilles Peskine311f54d2019-09-23 18:19:22 +0200623 /* Normally a "secret" should be long enough to be impossible to
624 * find by brute force, and in particular should not be empty. But
625 * this PRF is also used to derive an IV, in particular in EAP-TLS,
626 * and for this use case it makes sense to have a 0-length "secret".
627 * Since the key API doesn't allow importing a key of length 0,
Ronald Croncf56a0a2020-08-04 09:51:30 +0200628 * keep master_key=0, which setup_psa_key_derivation() understands
Gilles Peskine311f54d2019-09-23 18:19:22 +0200629 * to mean a 0-length "secret" input. */
630 if( slen != 0 )
631 {
632 psa_key_attributes_t key_attributes = psa_key_attributes_init();
633 psa_set_key_usage_flags( &key_attributes, PSA_KEY_USAGE_DERIVE );
634 psa_set_key_algorithm( &key_attributes, alg );
635 psa_set_key_type( &key_attributes, PSA_KEY_TYPE_DERIVE );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500636
Ronald Croncf56a0a2020-08-04 09:51:30 +0200637 status = psa_import_key( &key_attributes, secret, slen, &master_key );
Gilles Peskine311f54d2019-09-23 18:19:22 +0200638 if( status != PSA_SUCCESS )
639 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
640 }
Andrzej Kurekc929a822019-01-14 03:51:11 -0500641
k-stachowiak81053a52019-08-17 10:30:28 +0200642 status = setup_psa_key_derivation( &derivation,
Ronald Croncf56a0a2020-08-04 09:51:30 +0200643 master_key, alg,
k-stachowiak81053a52019-08-17 10:30:28 +0200644 random, rlen,
645 (unsigned char const *) label,
646 (size_t) strlen( label ),
647 dlen );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500648 if( status != PSA_SUCCESS )
649 {
Janos Follathda6ac012019-08-16 13:47:29 +0100650 psa_key_derivation_abort( &derivation );
Ronald Croncf56a0a2020-08-04 09:51:30 +0200651 psa_destroy_key( master_key );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500652 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
653 }
654
Janos Follathda6ac012019-08-16 13:47:29 +0100655 status = psa_key_derivation_output_bytes( &derivation, dstbuf, dlen );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500656 if( status != PSA_SUCCESS )
657 {
Janos Follathda6ac012019-08-16 13:47:29 +0100658 psa_key_derivation_abort( &derivation );
Ronald Croncf56a0a2020-08-04 09:51:30 +0200659 psa_destroy_key( master_key );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500660 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
661 }
662
Janos Follathda6ac012019-08-16 13:47:29 +0100663 status = psa_key_derivation_abort( &derivation );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500664 if( status != PSA_SUCCESS )
Andrzej Kurek70737ca2019-01-14 05:37:13 -0500665 {
Ronald Croncf56a0a2020-08-04 09:51:30 +0200666 psa_destroy_key( master_key );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500667 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Andrzej Kurek70737ca2019-01-14 05:37:13 -0500668 }
Andrzej Kurekc929a822019-01-14 03:51:11 -0500669
Ronald Croncf56a0a2020-08-04 09:51:30 +0200670 if( ! mbedtls_svc_key_id_is_null( master_key ) )
671 status = psa_destroy_key( master_key );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500672 if( status != PSA_SUCCESS )
673 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
674
Andrzej Kurek33171262019-01-15 03:25:18 -0500675 return( 0 );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500676}
677
678#else /* MBEDTLS_USE_PSA_CRYPTO */
679
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +0200680MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200681static int tls_prf_generic( mbedtls_md_type_t md_type,
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100682 const unsigned char *secret, size_t slen,
683 const char *label,
684 const unsigned char *random, size_t rlen,
685 unsigned char *dstbuf, size_t dlen )
Paul Bakker1ef83d62012-04-11 12:09:53 +0000686{
687 size_t nb;
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100688 size_t i, j, k, md_len;
Ron Eldor3b350852019-05-07 18:31:49 +0300689 unsigned char *tmp;
690 size_t tmp_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200691 unsigned char h_i[MBEDTLS_MD_MAX_SIZE];
692 const mbedtls_md_info_t *md_info;
693 mbedtls_md_context_t md_ctx;
Janos Follath865b3eb2019-12-16 11:46:15 +0000694 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100695
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200696 mbedtls_md_init( &md_ctx );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000697
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200698 if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL )
699 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100700
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200701 md_len = mbedtls_md_get_size( md_info );
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100702
Ron Eldor3b350852019-05-07 18:31:49 +0300703 tmp_len = md_len + strlen( label ) + rlen;
704 tmp = mbedtls_calloc( 1, tmp_len );
705 if( tmp == NULL )
706 {
707 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
708 goto exit;
709 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000710
711 nb = strlen( label );
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100712 memcpy( tmp + md_len, label, nb );
713 memcpy( tmp + md_len + nb, random, rlen );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000714 nb += rlen;
715
716 /*
717 * Compute P_<hash>(secret, label + random)[0..dlen]
718 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200719 if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
Ron Eldor3b350852019-05-07 18:31:49 +0300720 goto exit;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100721
Gilles Peskine2b3f21d2021-12-10 21:35:10 +0100722 ret = mbedtls_md_hmac_starts( &md_ctx, secret, slen );
723 if( ret != 0 )
724 goto exit;
725 ret = mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb );
726 if( ret != 0 )
727 goto exit;
728 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
729 if( ret != 0 )
730 goto exit;
Manuel Pégourié-Gonnard7da726b2015-03-24 18:08:19 +0100731
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100732 for( i = 0; i < dlen; i += md_len )
Paul Bakker1ef83d62012-04-11 12:09:53 +0000733 {
Gilles Peskine2b3f21d2021-12-10 21:35:10 +0100734 ret = mbedtls_md_hmac_reset ( &md_ctx );
735 if( ret != 0 )
736 goto exit;
737 ret = mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb );
738 if( ret != 0 )
739 goto exit;
740 ret = mbedtls_md_hmac_finish( &md_ctx, h_i );
741 if( ret != 0 )
742 goto exit;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100743
Gilles Peskine2b3f21d2021-12-10 21:35:10 +0100744 ret = mbedtls_md_hmac_reset ( &md_ctx );
745 if( ret != 0 )
746 goto exit;
747 ret = mbedtls_md_hmac_update( &md_ctx, tmp, md_len );
748 if( ret != 0 )
749 goto exit;
750 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
751 if( ret != 0 )
752 goto exit;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000753
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100754 k = ( i + md_len > dlen ) ? dlen % md_len : md_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000755
756 for( j = 0; j < k; j++ )
757 dstbuf[i + j] = h_i[j];
758 }
759
Ron Eldor3b350852019-05-07 18:31:49 +0300760exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200761 mbedtls_md_free( &md_ctx );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100762
Ron Eldor3b350852019-05-07 18:31:49 +0300763 mbedtls_platform_zeroize( tmp, tmp_len );
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500764 mbedtls_platform_zeroize( h_i, sizeof( h_i ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000765
Ron Eldor3b350852019-05-07 18:31:49 +0300766 mbedtls_free( tmp );
767
768 return( ret );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000769}
Andrzej Kurekc929a822019-01-14 03:51:11 -0500770#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200771#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +0200772MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100773static int tls_prf_sha256( const unsigned char *secret, size_t slen,
774 const char *label,
775 const unsigned char *random, size_t rlen,
776 unsigned char *dstbuf, size_t dlen )
777{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200778 return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen,
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100779 label, random, rlen, dstbuf, dlen ) );
780}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200781#endif /* MBEDTLS_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000782
Gilles Peskined2d59372021-05-12 22:43:27 +0200783#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +0200784MBEDTLS_CHECK_RETURN_CRITICAL
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200785static int tls_prf_sha384( const unsigned char *secret, size_t slen,
786 const char *label,
787 const unsigned char *random, size_t rlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000788 unsigned char *dstbuf, size_t dlen )
789{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200790 return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen,
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100791 label, random, rlen, dstbuf, dlen ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000792}
Gilles Peskined2d59372021-05-12 22:43:27 +0200793#endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200794#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +0000795
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200796static void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200797
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200798#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
799 defined(MBEDTLS_SSL_PROTO_TLS1_1)
800static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *, const unsigned char *, size_t );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200801#endif
Paul Bakker380da532012-04-18 16:10:25 +0000802
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200803#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +0200804static void ssl_calc_verify_ssl( const mbedtls_ssl_context *, unsigned char *, size_t * );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200805static void ssl_calc_finished_ssl( mbedtls_ssl_context *, unsigned char *, int );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200806#endif
807
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200808#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Rodrigo Dias Correa2c424572020-11-10 01:38:00 -0300809static void ssl_calc_verify_tls( const mbedtls_ssl_context *, unsigned char*, size_t * );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200810static void ssl_calc_finished_tls( mbedtls_ssl_context *, unsigned char *, int );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200811#endif
812
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200813#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
814#if defined(MBEDTLS_SHA256_C)
815static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t );
Rodrigo Dias Correa2c424572020-11-10 01:38:00 -0300816static void ssl_calc_verify_tls_sha256( const mbedtls_ssl_context *,unsigned char*, size_t * );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200817static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200818#endif
Paul Bakker769075d2012-11-24 11:26:46 +0100819
Gilles Peskined2d59372021-05-12 22:43:27 +0200820#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200821static void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t );
Rodrigo Dias Correa2c424572020-11-10 01:38:00 -0300822static void ssl_calc_verify_tls_sha384( const mbedtls_ssl_context *, unsigned char*, size_t * );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200823static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int );
Paul Bakker769075d2012-11-24 11:26:46 +0100824#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200825#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000826
Manuel Pégourié-Gonnard45be3d82019-02-18 23:35:14 +0100827#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) && \
Hanno Becker7d0a5692018-10-23 15:26:22 +0100828 defined(MBEDTLS_USE_PSA_CRYPTO)
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +0200829MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker7d0a5692018-10-23 15:26:22 +0100830static int ssl_use_opaque_psk( mbedtls_ssl_context const *ssl )
831{
832 if( ssl->conf->f_psk != NULL )
833 {
834 /* If we've used a callback to select the PSK,
835 * the static configuration is irrelevant. */
Ronald Croncf56a0a2020-08-04 09:51:30 +0200836 if( ! mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
Hanno Becker7d0a5692018-10-23 15:26:22 +0100837 return( 1 );
838
839 return( 0 );
840 }
841
Ronald Croncf56a0a2020-08-04 09:51:30 +0200842 if( ! mbedtls_svc_key_id_is_null( ssl->conf->psk_opaque ) )
Hanno Becker7d0a5692018-10-23 15:26:22 +0100843 return( 1 );
844
845 return( 0 );
846}
847#endif /* MBEDTLS_USE_PSA_CRYPTO &&
Manuel Pégourié-Gonnard45be3d82019-02-18 23:35:14 +0100848 MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Hanno Becker7d0a5692018-10-23 15:26:22 +0100849
Ron Eldorcf280092019-05-14 20:19:13 +0300850#if defined(MBEDTLS_SSL_EXPORT_KEYS)
851static mbedtls_tls_prf_types tls_prf_get_type( mbedtls_ssl_tls_prf_cb *tls_prf )
852{
853#if defined(MBEDTLS_SSL_PROTO_SSL3)
854 if( tls_prf == ssl3_prf )
855 {
Ron Eldor0810f0b2019-05-15 12:32:32 +0300856 return( MBEDTLS_SSL_TLS_PRF_SSL3 );
Ron Eldorcf280092019-05-14 20:19:13 +0300857 }
858 else
859#endif
860#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
861 if( tls_prf == tls1_prf )
862 {
863 return( MBEDTLS_SSL_TLS_PRF_TLS1 );
864 }
865 else
866#endif
867#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Gilles Peskined2d59372021-05-12 22:43:27 +0200868#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Ron Eldorcf280092019-05-14 20:19:13 +0300869 if( tls_prf == tls_prf_sha384 )
870 {
871 return( MBEDTLS_SSL_TLS_PRF_SHA384 );
872 }
873 else
874#endif
875#if defined(MBEDTLS_SHA256_C)
876 if( tls_prf == tls_prf_sha256 )
877 {
878 return( MBEDTLS_SSL_TLS_PRF_SHA256 );
879 }
880 else
881#endif
882#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
883 return( MBEDTLS_SSL_TLS_PRF_NONE );
884}
885#endif /* MBEDTLS_SSL_EXPORT_KEYS */
886
Ron Eldor51d3ab52019-05-12 14:54:30 +0300887int mbedtls_ssl_tls_prf( const mbedtls_tls_prf_types prf,
888 const unsigned char *secret, size_t slen,
889 const char *label,
890 const unsigned char *random, size_t rlen,
891 unsigned char *dstbuf, size_t dlen )
892{
893 mbedtls_ssl_tls_prf_cb *tls_prf = NULL;
894
895 switch( prf )
896 {
897#if defined(MBEDTLS_SSL_PROTO_SSL3)
898 case MBEDTLS_SSL_TLS_PRF_SSL3:
899 tls_prf = ssl3_prf;
900 break;
Ron Eldord2f25f72019-05-15 14:54:22 +0300901#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Ron Eldor51d3ab52019-05-12 14:54:30 +0300902#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
903 case MBEDTLS_SSL_TLS_PRF_TLS1:
904 tls_prf = tls1_prf;
905 break;
Ron Eldord2f25f72019-05-15 14:54:22 +0300906#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
907
908#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Gilles Peskined2d59372021-05-12 22:43:27 +0200909#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Ron Eldor51d3ab52019-05-12 14:54:30 +0300910 case MBEDTLS_SSL_TLS_PRF_SHA384:
911 tls_prf = tls_prf_sha384;
912 break;
Gilles Peskined2d59372021-05-12 22:43:27 +0200913#endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */
Ron Eldor51d3ab52019-05-12 14:54:30 +0300914#if defined(MBEDTLS_SHA256_C)
915 case MBEDTLS_SSL_TLS_PRF_SHA256:
916 tls_prf = tls_prf_sha256;
917 break;
Ron Eldord2f25f72019-05-15 14:54:22 +0300918#endif /* MBEDTLS_SHA256_C */
919#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Ron Eldor51d3ab52019-05-12 14:54:30 +0300920 default:
921 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
922 }
923
924 return( tls_prf( secret, slen, label, random, rlen, dstbuf, dlen ) );
925}
926
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200927/* Type for the TLS PRF */
928typedef int ssl_tls_prf_t(const unsigned char *, size_t, const char *,
929 const unsigned char *, size_t,
930 unsigned char *, size_t);
931
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200932/*
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +0200933 * Populate a transform structure with session keys and all the other
934 * necessary information.
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200935 *
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +0200936 * Parameters:
937 * - [in/out]: transform: structure to populate
938 * [in] must be just initialised with mbedtls_ssl_transform_init()
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200939 * [out] fully populated, ready for use by mbedtls_ssl_{en,de}crypt_buf()
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200940 * - [in] ciphersuite
941 * - [in] master
942 * - [in] encrypt_then_mac
943 * - [in] trunc_hmac
944 * - [in] compression
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200945 * - [in] tls_prf: pointer to PRF to use for key derivation
946 * - [in] randbytes: buffer holding ServerHello.random + ClientHello.random
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200947 * - [in] minor_ver: SSL/TLS minor version
948 * - [in] endpoint: client or server
949 * - [in] ssl: optionally used for:
Manuel Pégourié-Gonnarde07bc202020-02-26 09:53:42 +0100950 * - MBEDTLS_SSL_HW_RECORD_ACCEL: whole context (non-const)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200951 * - MBEDTLS_SSL_EXPORT_KEYS: ssl->conf->{f,p}_export_keys
952 * - MBEDTLS_DEBUG_C: ssl->conf->{f,p}_dbg
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200953 */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +0200954MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +0200955static int ssl_populate_transform( mbedtls_ssl_transform *transform,
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200956 int ciphersuite,
957 const unsigned char master[48],
Jarno Lamsac84bd242019-08-16 12:06:56 +0300958#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200959#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
960 int encrypt_then_mac,
Jarno Lamsac84bd242019-08-16 12:06:56 +0300961#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200962#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
963 int trunc_hmac,
Jarno Lamsac84bd242019-08-16 12:06:56 +0300964#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
965#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200966#if defined(MBEDTLS_ZLIB_SUPPORT)
967 int compression,
968#endif
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200969 ssl_tls_prf_t tls_prf,
970 const unsigned char randbytes[64],
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200971 int minor_ver,
972 unsigned endpoint,
Manuel Pégourié-Gonnard7ae6ed42020-03-13 11:28:19 +0100973#if !defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
974 const
975#endif
Manuel Pégourié-Gonnarde07bc202020-02-26 09:53:42 +0100976 mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +0000977{
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200978 int ret = 0;
Hanno Beckercb1cc802018-11-17 22:27:38 +0000979#if defined(MBEDTLS_USE_PSA_CRYPTO)
980 int psa_fallthrough;
981#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000982 unsigned char keyblk[256];
983 unsigned char *key1;
984 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100985 unsigned char *mac_enc;
986 unsigned char *mac_dec;
sander-visser3888b032020-05-06 21:49:46 +0200987 size_t mac_key_len = 0;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200988 size_t iv_copy_len;
Hanno Becker88aaf652017-12-27 08:17:40 +0000989 unsigned keylen;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000990 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200991 const mbedtls_cipher_info_t *cipher_info;
992 const mbedtls_md_info_t *md_info;
Paul Bakker68884e32013-01-07 18:20:04 +0100993
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200994#if !defined(MBEDTLS_SSL_HW_RECORD_ACCEL) && \
995 !defined(MBEDTLS_SSL_EXPORT_KEYS) && \
Gilles Peskinea6f99a12022-04-13 13:24:56 +0200996 !defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) && \
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200997 !defined(MBEDTLS_DEBUG_C)
Manuel Pégourié-Gonnarda7505d12019-05-07 10:17:56 +0200998 ssl = NULL; /* make sure we don't use it except for those cases */
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200999 (void) ssl;
1000#endif
1001
Manuel Pégourié-Gonnard96fb0ee2019-07-09 12:54:17 +02001002 /*
1003 * Some data just needs copying into the structure
1004 */
Jaeden Amero2de07f12019-06-05 13:32:08 +01001005#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
1006 defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001007 transform->encrypt_then_mac = encrypt_then_mac;
Hanno Becker9eddaeb2017-12-27 21:37:21 +00001008#endif
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001009 transform->minor_ver = minor_ver;
Hanno Beckere694c3e2017-12-27 21:34:08 +00001010
Manuel Pégourié-Gonnard96fb0ee2019-07-09 12:54:17 +02001011#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
1012 memcpy( transform->randbytes, randbytes, sizeof( transform->randbytes ) );
1013#endif
1014
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +02001015 /*
1016 * Get various info structures
1017 */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001018 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuite );
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +02001019 if( ciphersuite_info == NULL )
1020 {
1021 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %d not found",
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001022 ciphersuite ) );
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +02001023 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1024 }
1025
Hanno Beckere694c3e2017-12-27 21:34:08 +00001026 cipher_info = mbedtls_cipher_info_from_type( ciphersuite_info->cipher );
Paul Bakker68884e32013-01-07 18:20:04 +01001027 if( cipher_info == NULL )
1028 {
Paul Elliott9f352112020-12-09 14:55:45 +00001029 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %u not found",
Hanno Beckere694c3e2017-12-27 21:34:08 +00001030 ciphersuite_info->cipher ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001031 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +01001032 }
1033
Hanno Beckere694c3e2017-12-27 21:34:08 +00001034 md_info = mbedtls_md_info_from_type( ciphersuite_info->mac );
Paul Bakker68884e32013-01-07 18:20:04 +01001035 if( md_info == NULL )
1036 {
Paul Elliott9f352112020-12-09 14:55:45 +00001037 MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_md info for %u not found",
Paul Elliott3891caf2020-12-17 18:42:40 +00001038 (unsigned) ciphersuite_info->mac ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001039 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +01001040 }
1041
Hanno Beckera0e20d02019-05-15 14:03:01 +01001042#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker4bf74652019-04-26 16:22:27 +01001043 /* Copy own and peer's CID if the use of the CID
1044 * extension has been negotiated. */
1045 if( ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_ENABLED )
1046 {
1047 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Copy CIDs into SSL transform" ) );
Hanno Becker8a7f9722019-04-30 13:52:29 +01001048
Hanno Becker05154c32019-05-03 15:23:51 +01001049 transform->in_cid_len = ssl->own_cid_len;
Hanno Becker05154c32019-05-03 15:23:51 +01001050 memcpy( transform->in_cid, ssl->own_cid, ssl->own_cid_len );
Hanno Becker1c1f0462019-05-03 12:55:51 +01001051 MBEDTLS_SSL_DEBUG_BUF( 3, "Incoming CID", transform->in_cid,
Hanno Becker4bf74652019-04-26 16:22:27 +01001052 transform->in_cid_len );
Hanno Beckerd1f20352019-05-15 10:21:55 +01001053
1054 transform->out_cid_len = ssl->handshake->peer_cid_len;
1055 memcpy( transform->out_cid, ssl->handshake->peer_cid,
1056 ssl->handshake->peer_cid_len );
1057 MBEDTLS_SSL_DEBUG_BUF( 3, "Outgoing CID", transform->out_cid,
1058 transform->out_cid_len );
Hanno Becker4bf74652019-04-26 16:22:27 +01001059 }
Hanno Beckera0e20d02019-05-15 14:03:01 +01001060#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker4bf74652019-04-26 16:22:27 +01001061
Paul Bakker5121ce52009-01-03 21:22:43 +00001062 /*
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +02001063 * Compute key block using the PRF
Paul Bakker5121ce52009-01-03 21:22:43 +00001064 */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001065 ret = tls_prf( master, 48, "key expansion", randbytes, 64, keyblk, 256 );
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +01001066 if( ret != 0 )
1067 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001068 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +01001069 return( ret );
1070 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001071
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001072 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
Manuel Pégourié-Gonnardd91efa42019-05-20 10:27:20 +02001073 mbedtls_ssl_get_ciphersuite_name( ciphersuite ) ) );
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001074 MBEDTLS_SSL_DEBUG_BUF( 3, "master secret", master, 48 );
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +02001075 MBEDTLS_SSL_DEBUG_BUF( 4, "random bytes", randbytes, 64 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001076 MBEDTLS_SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001077
Paul Bakker5121ce52009-01-03 21:22:43 +00001078 /*
1079 * Determine the appropriate key, IV and MAC length.
1080 */
Paul Bakker68884e32013-01-07 18:20:04 +01001081
Hanno Becker88aaf652017-12-27 08:17:40 +00001082 keylen = cipher_info->key_bitlen / 8;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001083
Hanno Becker8031d062018-01-03 15:32:31 +00001084#if defined(MBEDTLS_GCM_C) || \
1085 defined(MBEDTLS_CCM_C) || \
1086 defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001087 if( cipher_info->mode == MBEDTLS_MODE_GCM ||
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001088 cipher_info->mode == MBEDTLS_MODE_CCM ||
1089 cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY )
Paul Bakker5121ce52009-01-03 21:22:43 +00001090 {
Hanno Beckerf704bef2018-11-16 15:21:18 +00001091 size_t explicit_ivlen;
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001092
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001093 transform->maclen = 0;
Hanno Becker81c7b182017-11-09 18:39:33 +00001094 mac_key_len = 0;
Hanno Beckere694c3e2017-12-27 21:34:08 +00001095 transform->taglen =
1096 ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001097
Hanno Becker447558d2020-05-28 07:36:33 +01001098 /* All modes haves 96-bit IVs, but the length of the static parts vary
1099 * with mode and version:
1100 * - For GCM and CCM in TLS 1.2, there's a static IV of 4 Bytes
1101 * (to be concatenated with a dynamically chosen IV of 8 Bytes)
Hanno Beckerf93c2d72020-05-28 07:39:43 +01001102 * - For ChaChaPoly in TLS 1.2, and all modes in TLS 1.3, there's
1103 * a static IV of 12 Bytes (to be XOR'ed with the 8 Byte record
1104 * sequence number).
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001105 */
Paul Bakker68884e32013-01-07 18:20:04 +01001106 transform->ivlen = 12;
Hanno Beckerf93c2d72020-05-28 07:39:43 +01001107#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
1108 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_4 )
1109 {
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001110 transform->fixed_ivlen = 12;
Hanno Beckerf93c2d72020-05-28 07:39:43 +01001111 }
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001112 else
Hanno Beckerf93c2d72020-05-28 07:39:43 +01001113#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
1114 {
1115 if( cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY )
1116 transform->fixed_ivlen = 12;
1117 else
1118 transform->fixed_ivlen = 4;
1119 }
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001120
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001121 /* Minimum length of encrypted record */
1122 explicit_ivlen = transform->ivlen - transform->fixed_ivlen;
Hanno Beckere694c3e2017-12-27 21:34:08 +00001123 transform->minlen = explicit_ivlen + transform->taglen;
Paul Bakker68884e32013-01-07 18:20:04 +01001124 }
1125 else
Hanno Becker8031d062018-01-03 15:32:31 +00001126#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */
1127#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
1128 if( cipher_info->mode == MBEDTLS_MODE_STREAM ||
1129 cipher_info->mode == MBEDTLS_MODE_CBC )
Paul Bakker68884e32013-01-07 18:20:04 +01001130 {
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001131 /* Initialize HMAC contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001132 if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 ||
1133 ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 )
Paul Bakker68884e32013-01-07 18:20:04 +01001134 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001135 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001136 goto end;
Paul Bakker68884e32013-01-07 18:20:04 +01001137 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001138
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001139 /* Get MAC length */
Hanno Becker81c7b182017-11-09 18:39:33 +00001140 mac_key_len = mbedtls_md_get_size( md_info );
1141 transform->maclen = mac_key_len;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001142
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001143#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001144 /*
1145 * If HMAC is to be truncated, we shall keep the leftmost bytes,
1146 * (rfc 6066 page 13 or rfc 2104 section 4),
1147 * so we only need to adjust the length here.
1148 */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001149 if( trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED )
Hanno Beckere89353a2017-11-20 16:36:41 +00001150 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001151 transform->maclen = MBEDTLS_SSL_TRUNCATED_HMAC_LEN;
Hanno Beckere89353a2017-11-20 16:36:41 +00001152
1153#if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT)
1154 /* Fall back to old, non-compliant version of the truncated
Hanno Becker563423f2017-11-21 17:20:17 +00001155 * HMAC implementation which also truncates the key
1156 * (Mbed TLS versions from 1.3 to 2.6.0) */
Hanno Beckere89353a2017-11-20 16:36:41 +00001157 mac_key_len = transform->maclen;
1158#endif
1159 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001160#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001161
1162 /* IV length */
Paul Bakker68884e32013-01-07 18:20:04 +01001163 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +00001164
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001165 /* Minimum length */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001166 if( cipher_info->mode == MBEDTLS_MODE_STREAM )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001167 transform->minlen = transform->maclen;
1168 else
Paul Bakker68884e32013-01-07 18:20:04 +01001169 {
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001170 /*
1171 * GenericBlockCipher:
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +01001172 * 1. if EtM is in use: one block plus MAC
1173 * otherwise: * first multiple of blocklen greater than maclen
1174 * 2. IV except for SSL3 and TLS 1.0
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001175 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001176#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001177 if( encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED )
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +01001178 {
1179 transform->minlen = transform->maclen
1180 + cipher_info->block_size;
1181 }
1182 else
1183#endif
1184 {
1185 transform->minlen = transform->maclen
1186 + cipher_info->block_size
1187 - transform->maclen % cipher_info->block_size;
1188 }
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001189
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001190#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001191 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
1192 minor_ver == MBEDTLS_SSL_MINOR_VERSION_1 )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001193 ; /* No need to adjust minlen */
Paul Bakker68884e32013-01-07 18:20:04 +01001194 else
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001195#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001196#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001197 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_2 ||
1198 minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001199 {
1200 transform->minlen += transform->ivlen;
1201 }
1202 else
1203#endif
1204 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001205 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Ron Eldore6992702019-05-07 18:27:13 +03001206 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1207 goto end;
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001208 }
Paul Bakker68884e32013-01-07 18:20:04 +01001209 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001210 }
Hanno Becker8031d062018-01-03 15:32:31 +00001211 else
1212#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1213 {
1214 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1215 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1216 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001217
Hanno Becker88aaf652017-12-27 08:17:40 +00001218 MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %u, minlen: %u, ivlen: %u, maclen: %u",
1219 (unsigned) keylen,
1220 (unsigned) transform->minlen,
1221 (unsigned) transform->ivlen,
1222 (unsigned) transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001223
1224 /*
1225 * Finally setup the cipher contexts, IVs and MAC secrets.
1226 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001227#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001228 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001229 {
Hanno Becker81c7b182017-11-09 18:39:33 +00001230 key1 = keyblk + mac_key_len * 2;
Hanno Becker88aaf652017-12-27 08:17:40 +00001231 key2 = keyblk + mac_key_len * 2 + keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001232
Paul Bakker68884e32013-01-07 18:20:04 +01001233 mac_enc = keyblk;
Hanno Becker81c7b182017-11-09 18:39:33 +00001234 mac_dec = keyblk + mac_key_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001235
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001236 /*
1237 * This is not used in TLS v1.1.
1238 */
Paul Bakker48916f92012-09-16 19:57:18 +00001239 iv_copy_len = ( transform->fixed_ivlen ) ?
1240 transform->fixed_ivlen : transform->ivlen;
Hanno Becker88aaf652017-12-27 08:17:40 +00001241 memcpy( transform->iv_enc, key2 + keylen, iv_copy_len );
1242 memcpy( transform->iv_dec, key2 + keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001243 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001244 }
1245 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001246#endif /* MBEDTLS_SSL_CLI_C */
1247#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001248 if( endpoint == MBEDTLS_SSL_IS_SERVER )
Paul Bakker5121ce52009-01-03 21:22:43 +00001249 {
Hanno Becker88aaf652017-12-27 08:17:40 +00001250 key1 = keyblk + mac_key_len * 2 + keylen;
Hanno Becker81c7b182017-11-09 18:39:33 +00001251 key2 = keyblk + mac_key_len * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00001252
Hanno Becker81c7b182017-11-09 18:39:33 +00001253 mac_enc = keyblk + mac_key_len;
Paul Bakker68884e32013-01-07 18:20:04 +01001254 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +00001255
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001256 /*
1257 * This is not used in TLS v1.1.
1258 */
Paul Bakker48916f92012-09-16 19:57:18 +00001259 iv_copy_len = ( transform->fixed_ivlen ) ?
1260 transform->fixed_ivlen : transform->ivlen;
Hanno Becker88aaf652017-12-27 08:17:40 +00001261 memcpy( transform->iv_dec, key1 + keylen, iv_copy_len );
1262 memcpy( transform->iv_enc, key1 + keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001263 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001264 }
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001265 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001266#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001267 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001268 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Ron Eldore6992702019-05-07 18:27:13 +03001269 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1270 goto end;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001271 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001272
Hanno Beckerd56ed242018-01-03 15:32:51 +00001273#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001274#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001275 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker68884e32013-01-07 18:20:04 +01001276 {
Hanno Beckerd56ed242018-01-03 15:32:51 +00001277 if( mac_key_len > sizeof( transform->mac_enc ) )
Manuel Pégourié-Gonnard7cfdcb82014-01-18 18:22:55 +01001278 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001279 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Ron Eldore6992702019-05-07 18:27:13 +03001280 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1281 goto end;
Manuel Pégourié-Gonnard7cfdcb82014-01-18 18:22:55 +01001282 }
1283
Hanno Becker81c7b182017-11-09 18:39:33 +00001284 memcpy( transform->mac_enc, mac_enc, mac_key_len );
1285 memcpy( transform->mac_dec, mac_dec, mac_key_len );
Paul Bakker68884e32013-01-07 18:20:04 +01001286 }
1287 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001288#endif /* MBEDTLS_SSL_PROTO_SSL3 */
1289#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
1290 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001291 if( minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )
Paul Bakker68884e32013-01-07 18:20:04 +01001292 {
Gilles Peskine039fd122018-03-19 19:06:08 +01001293 /* For HMAC-based ciphersuites, initialize the HMAC transforms.
1294 For AEAD-based ciphersuites, there is nothing to do here. */
1295 if( mac_key_len != 0 )
1296 {
Gilles Peskine2b3f21d2021-12-10 21:35:10 +01001297 ret = mbedtls_md_hmac_starts( &transform->md_ctx_enc,
1298 mac_enc, mac_key_len );
1299 if( ret != 0 )
1300 goto end;
1301 ret = mbedtls_md_hmac_starts( &transform->md_ctx_dec,
1302 mac_dec, mac_key_len );
1303 if( ret != 0 )
1304 goto end;
Gilles Peskine039fd122018-03-19 19:06:08 +01001305 }
Paul Bakker68884e32013-01-07 18:20:04 +01001306 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001307 else
1308#endif
Paul Bakker577e0062013-08-28 11:57:20 +02001309 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001310 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Ron Eldore6992702019-05-07 18:27:13 +03001311 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1312 goto end;
Paul Bakker577e0062013-08-28 11:57:20 +02001313 }
Hanno Beckerd56ed242018-01-03 15:32:51 +00001314#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
Paul Bakker68884e32013-01-07 18:20:04 +01001315
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001316#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
1317 if( mbedtls_ssl_hw_record_init != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001318 {
sander-visser1abe8ee2020-05-06 21:27:14 +02001319 ret = 0;
Paul Bakker05ef8352012-05-08 09:17:57 +00001320
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001321 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) );
Paul Bakker05ef8352012-05-08 09:17:57 +00001322
Hanno Becker88aaf652017-12-27 08:17:40 +00001323 if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, keylen,
Paul Bakker07eb38b2012-12-19 14:42:06 +01001324 transform->iv_enc, transform->iv_dec,
1325 iv_copy_len,
Paul Bakker68884e32013-01-07 18:20:04 +01001326 mac_enc, mac_dec,
Hanno Becker81c7b182017-11-09 18:39:33 +00001327 mac_key_len ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +00001328 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001329 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_init", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001330 ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
1331 goto end;
Paul Bakker05ef8352012-05-08 09:17:57 +00001332 }
1333 }
Hanno Beckerd56ed242018-01-03 15:32:51 +00001334#else
1335 ((void) mac_dec);
1336 ((void) mac_enc);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001337#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
Paul Bakker05ef8352012-05-08 09:17:57 +00001338
Manuel Pégourié-Gonnard024b6df2015-10-19 13:52:53 +02001339#if defined(MBEDTLS_SSL_EXPORT_KEYS)
1340 if( ssl->conf->f_export_keys != NULL )
Robert Cragie4feb7ae2015-10-02 13:33:37 +01001341 {
Manuel Pégourié-Gonnard024b6df2015-10-19 13:52:53 +02001342 ssl->conf->f_export_keys( ssl->conf->p_export_keys,
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001343 master, keyblk,
Hanno Becker88aaf652017-12-27 08:17:40 +00001344 mac_key_len, keylen,
Robert Cragie4feb7ae2015-10-02 13:33:37 +01001345 iv_copy_len );
1346 }
Ron Eldorf5cc10d2019-05-07 18:33:40 +03001347
1348 if( ssl->conf->f_export_keys_ext != NULL )
1349 {
1350 ssl->conf->f_export_keys_ext( ssl->conf->p_export_keys,
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001351 master, keyblk,
Ron Eldorb7fd64c2019-05-12 11:03:32 +03001352 mac_key_len, keylen,
Ron Eldor51d3ab52019-05-12 14:54:30 +03001353 iv_copy_len,
Jaeden Amerofa636452019-09-12 10:47:37 +01001354 randbytes + 32,
1355 randbytes,
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +02001356 tls_prf_get_type( tls_prf ) );
Ron Eldorf5cc10d2019-05-07 18:33:40 +03001357 }
Robert Cragie4feb7ae2015-10-02 13:33:37 +01001358#endif
1359
Hanno Beckerf704bef2018-11-16 15:21:18 +00001360#if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckercb1cc802018-11-17 22:27:38 +00001361
1362 /* Only use PSA-based ciphers for TLS-1.2.
1363 * That's relevant at least for TLS-1.0, where
1364 * we assume that mbedtls_cipher_crypt() updates
1365 * the structure field for the IV, which the PSA-based
1366 * implementation currently doesn't. */
1367#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Ronald Crone7dad1f2022-03-28 10:19:54 +02001368 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Hanno Beckerf704bef2018-11-16 15:21:18 +00001369 {
Hanno Beckercb1cc802018-11-17 22:27:38 +00001370 ret = mbedtls_cipher_setup_psa( &transform->cipher_ctx_enc,
Hanno Becker22bf1452019-04-05 11:21:08 +01001371 cipher_info, transform->taglen );
Hanno Beckercb1cc802018-11-17 22:27:38 +00001372 if( ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE )
1373 {
1374 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup_psa", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001375 goto end;
Hanno Beckercb1cc802018-11-17 22:27:38 +00001376 }
1377
1378 if( ret == 0 )
1379 {
Hanno Becker4c8c7aa2019-04-10 09:25:41 +01001380 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Successfully setup PSA-based encryption cipher context" ) );
Hanno Beckercb1cc802018-11-17 22:27:38 +00001381 psa_fallthrough = 0;
1382 }
1383 else
1384 {
1385 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to setup PSA-based cipher context for record encryption - fall through to default setup." ) );
1386 psa_fallthrough = 1;
1387 }
Hanno Beckerf704bef2018-11-16 15:21:18 +00001388 }
Hanno Beckerf704bef2018-11-16 15:21:18 +00001389 else
Hanno Beckercb1cc802018-11-17 22:27:38 +00001390 psa_fallthrough = 1;
1391#else
1392 psa_fallthrough = 1;
1393#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Beckerf704bef2018-11-16 15:21:18 +00001394
Hanno Beckercb1cc802018-11-17 22:27:38 +00001395 if( psa_fallthrough == 1 )
Hanno Beckerf704bef2018-11-16 15:21:18 +00001396#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001397 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001398 cipher_info ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001399 {
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001400 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001401 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001402 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001403
Hanno Beckerf704bef2018-11-16 15:21:18 +00001404#if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckercb1cc802018-11-17 22:27:38 +00001405 /* Only use PSA-based ciphers for TLS-1.2.
1406 * That's relevant at least for TLS-1.0, where
1407 * we assume that mbedtls_cipher_crypt() updates
1408 * the structure field for the IV, which the PSA-based
1409 * implementation currently doesn't. */
1410#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Ronald Crone7dad1f2022-03-28 10:19:54 +02001411 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Hanno Beckerf704bef2018-11-16 15:21:18 +00001412 {
Hanno Beckercb1cc802018-11-17 22:27:38 +00001413 ret = mbedtls_cipher_setup_psa( &transform->cipher_ctx_dec,
Hanno Becker22bf1452019-04-05 11:21:08 +01001414 cipher_info, transform->taglen );
Hanno Beckercb1cc802018-11-17 22:27:38 +00001415 if( ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE )
1416 {
1417 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup_psa", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001418 goto end;
Hanno Beckercb1cc802018-11-17 22:27:38 +00001419 }
1420
1421 if( ret == 0 )
1422 {
Hanno Becker4c8c7aa2019-04-10 09:25:41 +01001423 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Successfully setup PSA-based decryption cipher context" ) );
Hanno Beckercb1cc802018-11-17 22:27:38 +00001424 psa_fallthrough = 0;
1425 }
1426 else
1427 {
1428 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to setup PSA-based cipher context for record decryption - fall through to default setup." ) );
1429 psa_fallthrough = 1;
1430 }
Hanno Beckerf704bef2018-11-16 15:21:18 +00001431 }
Hanno Beckerf704bef2018-11-16 15:21:18 +00001432 else
Hanno Beckercb1cc802018-11-17 22:27:38 +00001433 psa_fallthrough = 1;
1434#else
1435 psa_fallthrough = 1;
1436#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Beckerf704bef2018-11-16 15:21:18 +00001437
Hanno Beckercb1cc802018-11-17 22:27:38 +00001438 if( psa_fallthrough == 1 )
Hanno Beckerf704bef2018-11-16 15:21:18 +00001439#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001440 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec,
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001441 cipher_info ) ) != 0 )
1442 {
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001443 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001444 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001445 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001446
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001447 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001448 cipher_info->key_bitlen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001449 MBEDTLS_ENCRYPT ) ) != 0 )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001450 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001451 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001452 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001453 }
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001454
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001455 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001456 cipher_info->key_bitlen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001457 MBEDTLS_DECRYPT ) ) != 0 )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001458 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001459 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001460 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001461 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001462
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001463#if defined(MBEDTLS_CIPHER_MODE_CBC)
1464 if( cipher_info->mode == MBEDTLS_MODE_CBC )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001465 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001466 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc,
1467 MBEDTLS_PADDING_NONE ) ) != 0 )
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001468 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001469 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001470 goto end;
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001471 }
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001472
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001473 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec,
1474 MBEDTLS_PADDING_NONE ) ) != 0 )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001475 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001476 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001477 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001478 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001479 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001480#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001481
Paul Bakker5121ce52009-01-03 21:22:43 +00001482
Manuel Pégourié-Gonnardd73b47f2019-05-06 12:44:24 +02001483 /* Initialize Zlib contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001484#if defined(MBEDTLS_ZLIB_SUPPORT)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001485 if( compression == MBEDTLS_SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001486 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001487 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001488
Paul Bakker48916f92012-09-16 19:57:18 +00001489 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
1490 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001491
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001492 if( deflateInit( &transform->ctx_deflate,
1493 Z_DEFAULT_COMPRESSION ) != Z_OK ||
Paul Bakker48916f92012-09-16 19:57:18 +00001494 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001495 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001496 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
Ron Eldore6992702019-05-07 18:27:13 +03001497 ret = MBEDTLS_ERR_SSL_COMPRESSION_FAILED;
1498 goto end;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001499 }
1500 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001501#endif /* MBEDTLS_ZLIB_SUPPORT */
Paul Bakker2770fbd2012-07-03 13:30:23 +00001502
Ron Eldore6992702019-05-07 18:27:13 +03001503end:
Ron Eldora9f9a732019-05-07 18:29:02 +03001504 mbedtls_platform_zeroize( keyblk, sizeof( keyblk ) );
Ron Eldore6992702019-05-07 18:27:13 +03001505 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001506}
1507
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001508/*
Manuel Pégourié-Gonnard47e33e12019-05-20 10:10:17 +02001509 * Set appropriate PRF function and other SSL / TLS 1.0/1.1 / TLS1.2 functions
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001510 *
1511 * Inputs:
1512 * - SSL/TLS minor version
1513 * - hash associated with the ciphersuite (only used by TLS 1.2)
1514 *
Manuel Pégourié-Gonnard31d3ef12019-05-10 10:25:00 +02001515 * Outputs:
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001516 * - the tls_prf, calc_verify and calc_finished members of handshake structure
1517 */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02001518MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001519static int ssl_set_handshake_prfs( mbedtls_ssl_handshake_params *handshake,
1520 int minor_ver,
1521 mbedtls_md_type_t hash )
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001522{
Gilles Peskinefc9c07f2021-05-12 22:51:53 +02001523#if !defined(MBEDTLS_SSL_PROTO_TLS1_2) || \
1524 !( defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) )
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001525 (void) hash;
1526#endif
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001527
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001528#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001529 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001530 {
1531 handshake->tls_prf = ssl3_prf;
1532 handshake->calc_verify = ssl_calc_verify_ssl;
1533 handshake->calc_finished = ssl_calc_finished_ssl;
1534 }
1535 else
1536#endif
1537#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001538 if( minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001539 {
1540 handshake->tls_prf = tls1_prf;
1541 handshake->calc_verify = ssl_calc_verify_tls;
1542 handshake->calc_finished = ssl_calc_finished_tls;
1543 }
1544 else
1545#endif
1546#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Gilles Peskined2d59372021-05-12 22:43:27 +02001547#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001548 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
1549 hash == MBEDTLS_MD_SHA384 )
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001550 {
1551 handshake->tls_prf = tls_prf_sha384;
1552 handshake->calc_verify = ssl_calc_verify_tls_sha384;
1553 handshake->calc_finished = ssl_calc_finished_tls_sha384;
1554 }
1555 else
1556#endif
1557#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001558 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001559 {
1560 handshake->tls_prf = tls_prf_sha256;
1561 handshake->calc_verify = ssl_calc_verify_tls_sha256;
1562 handshake->calc_finished = ssl_calc_finished_tls_sha256;
1563 }
1564 else
1565#endif
1566#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1567 {
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001568 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1569 }
1570
1571 return( 0 );
1572}
1573
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001574/*
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001575 * Compute master secret if needed
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001576 *
1577 * Parameters:
1578 * [in/out] handshake
1579 * [in] resume, premaster, extended_ms, calc_verify, tls_prf
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001580 * (PSA-PSK) ciphersuite_info, psk_opaque
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001581 * [out] premaster (cleared)
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001582 * [out] master
1583 * [in] ssl: optionally used for debugging, EMS and PSA-PSK
1584 * debug: conf->f_dbg, conf->p_dbg
1585 * EMS: passed to calc_verify (debug + (SSL3) session_negotiate)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001586 * PSA-PSA: minor_ver, conf
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001587 */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02001588MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001589static int ssl_compute_master( mbedtls_ssl_handshake_params *handshake,
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001590 unsigned char *master,
Manuel Pégourié-Gonnard0d56aaa2019-05-03 09:58:33 +02001591 const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001592{
Janos Follath865b3eb2019-12-16 11:46:15 +00001593 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001594
1595 /* cf. RFC 5246, Section 8.1:
1596 * "The master secret is always exactly 48 bytes in length." */
1597 size_t const master_secret_len = 48;
1598
1599#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1600 unsigned char session_hash[48];
1601#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
1602
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001603 /* The label for the KDF used for key expansion.
1604 * This is either "master secret" or "extended master secret"
1605 * depending on whether the Extended Master Secret extension
1606 * is used. */
1607 char const *lbl = "master secret";
1608
1609 /* The salt for the KDF used for key expansion.
1610 * - If the Extended Master Secret extension is not used,
1611 * this is ClientHello.Random + ServerHello.Random
1612 * (see Sect. 8.1 in RFC 5246).
1613 * - If the Extended Master Secret extension is used,
1614 * this is the transcript of the handshake so far.
1615 * (see Sect. 4 in RFC 7627). */
1616 unsigned char const *salt = handshake->randbytes;
1617 size_t salt_len = 64;
1618
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001619#if !defined(MBEDTLS_DEBUG_C) && \
1620 !defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \
1621 !(defined(MBEDTLS_USE_PSA_CRYPTO) && \
1622 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED))
Manuel Pégourié-Gonnarda7505d12019-05-07 10:17:56 +02001623 ssl = NULL; /* make sure we don't use it except for those cases */
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001624 (void) ssl;
1625#endif
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001626
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001627 if( handshake->resume != 0 )
1628 {
1629 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001630 return( 0 );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001631 }
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001632
1633#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001634 if( handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED )
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001635 {
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001636 lbl = "extended master secret";
1637 salt = session_hash;
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001638 handshake->calc_verify( ssl, session_hash, &salt_len );
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001639
Manuel Pégourié-Gonnard8faa70e2019-05-20 12:09:50 +02001640 MBEDTLS_SSL_DEBUG_BUF( 3, "session hash for extended master secret",
1641 session_hash, salt_len );
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001642 }
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001643#endif /* MBEDTLS_SSL_EXTENDED_MS_ENABLED */
1644
1645#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001646 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
1647 if( handshake->ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK &&
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001648 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001649 ssl_use_opaque_psk( ssl ) == 1 )
1650 {
1651 /* Perform PSK-to-MS expansion in a single step. */
1652 psa_status_t status;
1653 psa_algorithm_t alg;
Ronald Croncf56a0a2020-08-04 09:51:30 +02001654 psa_key_id_t psk;
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001655 psa_key_derivation_operation_t derivation =
1656 PSA_KEY_DERIVATION_OPERATION_INIT;
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001657 mbedtls_md_type_t hash_alg = handshake->ciphersuite_info->mac;
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001658
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001659 MBEDTLS_SSL_DEBUG_MSG( 2, ( "perform PSA-based PSK-to-MS expansion" ) );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001660
Guilhem Bryantc5285d82020-03-25 17:08:15 +00001661 psk = mbedtls_ssl_get_opaque_psk( ssl );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001662
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001663 if( hash_alg == MBEDTLS_MD_SHA384 )
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001664 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001665 else
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001666 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
1667
k-stachowiak81053a52019-08-17 10:30:28 +02001668 status = setup_psa_key_derivation( &derivation, psk, alg,
1669 salt, salt_len,
1670 (unsigned char const *) lbl,
1671 (size_t) strlen( lbl ),
1672 master_secret_len );
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001673 if( status != PSA_SUCCESS )
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001674 {
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001675 psa_key_derivation_abort( &derivation );
1676 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001677 }
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001678
1679 status = psa_key_derivation_output_bytes( &derivation,
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001680 master,
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001681 master_secret_len );
1682 if( status != PSA_SUCCESS )
1683 {
1684 psa_key_derivation_abort( &derivation );
1685 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
1686 }
1687
1688 status = psa_key_derivation_abort( &derivation );
1689 if( status != PSA_SUCCESS )
1690 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
1691 }
1692 else
1693#endif
1694 {
1695 ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,
1696 lbl, salt, salt_len,
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001697 master,
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001698 master_secret_len );
1699 if( ret != 0 )
1700 {
1701 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
1702 return( ret );
1703 }
1704
1705 MBEDTLS_SSL_DEBUG_BUF( 3, "premaster secret",
1706 handshake->premaster,
1707 handshake->pmslen );
1708
1709 mbedtls_platform_zeroize( handshake->premaster,
1710 sizeof(handshake->premaster) );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001711 }
1712
1713 return( 0 );
1714}
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001715
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +02001716int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
1717{
Janos Follath865b3eb2019-12-16 11:46:15 +00001718 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001719 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
1720 ssl->handshake->ciphersuite_info;
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001721
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001722 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
1723
1724 /* Set PRF, calc_verify and calc_finished function pointers */
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001725 ret = ssl_set_handshake_prfs( ssl->handshake,
1726 ssl->minor_ver,
1727 ciphersuite_info->mac );
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001728 if( ret != 0 )
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001729 {
1730 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_set_handshake_prfs", ret );
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001731 return( ret );
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001732 }
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001733
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001734 /* Compute master secret if needed */
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001735 ret = ssl_compute_master( ssl->handshake,
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001736 ssl->session_negotiate->master,
1737 ssl );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001738 if( ret != 0 )
1739 {
1740 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_compute_master", ret );
1741 return( ret );
1742 }
1743
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001744 /* Swap the client and server random values:
1745 * - MS derivation wanted client+server (RFC 5246 8.1)
1746 * - key derivation wants server+client (RFC 5246 6.3) */
1747 {
1748 unsigned char tmp[64];
1749 memcpy( tmp, ssl->handshake->randbytes, 64 );
1750 memcpy( ssl->handshake->randbytes, tmp + 32, 32 );
1751 memcpy( ssl->handshake->randbytes + 32, tmp, 32 );
1752 mbedtls_platform_zeroize( tmp, sizeof( tmp ) );
1753 }
1754
1755 /* Populate transform structure */
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +02001756 ret = ssl_populate_transform( ssl->transform_negotiate,
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001757 ssl->session_negotiate->ciphersuite,
1758 ssl->session_negotiate->master,
Jarno Lamsac84bd242019-08-16 12:06:56 +03001759#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001760#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1761 ssl->session_negotiate->encrypt_then_mac,
Jarno Lamsac84bd242019-08-16 12:06:56 +03001762#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001763#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1764 ssl->session_negotiate->trunc_hmac,
Jarno Lamsac84bd242019-08-16 12:06:56 +03001765#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
1766#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001767#if defined(MBEDTLS_ZLIB_SUPPORT)
1768 ssl->session_negotiate->compression,
1769#endif
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +02001770 ssl->handshake->tls_prf,
1771 ssl->handshake->randbytes,
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001772 ssl->minor_ver,
1773 ssl->conf->endpoint,
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +02001774 ssl );
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001775 if( ret != 0 )
1776 {
1777 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_populate_transform", ret );
1778 return( ret );
1779 }
1780
1781 /* We no longer need Server/ClientHello.random values */
1782 mbedtls_platform_zeroize( ssl->handshake->randbytes,
1783 sizeof( ssl->handshake->randbytes ) );
1784
Manuel Pégourié-Gonnardd73b47f2019-05-06 12:44:24 +02001785 /* Allocate compression buffer */
1786#if defined(MBEDTLS_ZLIB_SUPPORT)
jiblime9f25b8d2019-12-18 21:40:01 -08001787 if( ssl->session_negotiate->compression == MBEDTLS_SSL_COMPRESS_DEFLATE &&
Manuel Pégourié-Gonnardd73b47f2019-05-06 12:44:24 +02001788 ssl->compress_buf == NULL )
1789 {
1790 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Allocating compression buffer" ) );
1791 ssl->compress_buf = mbedtls_calloc( 1, MBEDTLS_SSL_COMPRESS_BUFFER_LEN );
1792 if( ssl->compress_buf == NULL )
1793 {
1794 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
Manuel Pégourié-Gonnardd91efa42019-05-20 10:27:20 +02001795 MBEDTLS_SSL_COMPRESS_BUFFER_LEN ) );
Manuel Pégourié-Gonnardd73b47f2019-05-06 12:44:24 +02001796 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
1797 }
1798 }
1799#endif
1800
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001801 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
1802
1803 return( 0 );
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +02001804}
1805
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001806#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001807void ssl_calc_verify_ssl( const mbedtls_ssl_context *ssl,
Rodrigo Dias Correa2c424572020-11-10 01:38:00 -03001808 unsigned char *hash,
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001809 size_t *hlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001810{
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001811 mbedtls_md5_context md5;
1812 mbedtls_sha1_context sha1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001813 unsigned char pad_1[48];
1814 unsigned char pad_2[48];
1815
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001816 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001817
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001818 mbedtls_md5_init( &md5 );
1819 mbedtls_sha1_init( &sha1 );
1820
1821 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
1822 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001823
Paul Bakker380da532012-04-18 16:10:25 +00001824 memset( pad_1, 0x36, 48 );
1825 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001826
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001827 mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 );
1828 mbedtls_md5_update_ret( &md5, pad_1, 48 );
1829 mbedtls_md5_finish_ret( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001830
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001831 mbedtls_md5_starts_ret( &md5 );
1832 mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 );
1833 mbedtls_md5_update_ret( &md5, pad_2, 48 );
1834 mbedtls_md5_update_ret( &md5, hash, 16 );
1835 mbedtls_md5_finish_ret( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001836
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001837 mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 );
1838 mbedtls_sha1_update_ret( &sha1, pad_1, 40 );
1839 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
Paul Bakker380da532012-04-18 16:10:25 +00001840
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001841 mbedtls_sha1_starts_ret( &sha1 );
1842 mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 );
1843 mbedtls_sha1_update_ret( &sha1, pad_2, 40 );
1844 mbedtls_sha1_update_ret( &sha1, hash + 16, 20 );
1845 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
Paul Bakker380da532012-04-18 16:10:25 +00001846
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001847 *hlen = 36;
1848
1849 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001850 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001851
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001852 mbedtls_md5_free( &md5 );
1853 mbedtls_sha1_free( &sha1 );
Paul Bakker5b4af392014-06-26 12:09:34 +02001854
Paul Bakker380da532012-04-18 16:10:25 +00001855 return;
1856}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001857#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker380da532012-04-18 16:10:25 +00001858
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001859#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001860void ssl_calc_verify_tls( const mbedtls_ssl_context *ssl,
Rodrigo Dias Correa2c424572020-11-10 01:38:00 -03001861 unsigned char *hash,
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001862 size_t *hlen )
Paul Bakker380da532012-04-18 16:10:25 +00001863{
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001864 mbedtls_md5_context md5;
1865 mbedtls_sha1_context sha1;
Paul Bakker380da532012-04-18 16:10:25 +00001866
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001867 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001868
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001869 mbedtls_md5_init( &md5 );
1870 mbedtls_sha1_init( &sha1 );
1871
1872 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
1873 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker380da532012-04-18 16:10:25 +00001874
Andrzej Kurekeb342242019-01-29 09:14:33 -05001875 mbedtls_md5_finish_ret( &md5, hash );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001876 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
Paul Bakker380da532012-04-18 16:10:25 +00001877
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001878 *hlen = 36;
1879
1880 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001881 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001882
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001883 mbedtls_md5_free( &md5 );
1884 mbedtls_sha1_free( &sha1 );
Paul Bakker5b4af392014-06-26 12:09:34 +02001885
Paul Bakker380da532012-04-18 16:10:25 +00001886 return;
1887}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001888#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
Paul Bakker380da532012-04-18 16:10:25 +00001889
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001890#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1891#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001892void ssl_calc_verify_tls_sha256( const mbedtls_ssl_context *ssl,
Rodrigo Dias Correa2c424572020-11-10 01:38:00 -03001893 unsigned char *hash,
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001894 size_t *hlen )
Paul Bakker380da532012-04-18 16:10:25 +00001895{
Andrzej Kurekeb342242019-01-29 09:14:33 -05001896#if defined(MBEDTLS_USE_PSA_CRYPTO)
1897 size_t hash_size;
1898 psa_status_t status;
1899 psa_hash_operation_t sha256_psa = psa_hash_operation_init();
1900
1901 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> PSA calc verify sha256" ) );
1902 status = psa_hash_clone( &ssl->handshake->fin_sha256_psa, &sha256_psa );
1903 if( status != PSA_SUCCESS )
1904 {
1905 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
1906 return;
1907 }
1908
1909 status = psa_hash_finish( &sha256_psa, hash, 32, &hash_size );
1910 if( status != PSA_SUCCESS )
1911 {
1912 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
1913 return;
1914 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001915
1916 *hlen = 32;
1917 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated verify result", hash, *hlen );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001918 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= PSA calc verify" ) );
1919#else
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001920 mbedtls_sha256_context sha256;
Paul Bakker380da532012-04-18 16:10:25 +00001921
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001922 mbedtls_sha256_init( &sha256 );
1923
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001924 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001925
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001926 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001927 mbedtls_sha256_finish_ret( &sha256, hash );
Paul Bakker380da532012-04-18 16:10:25 +00001928
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001929 *hlen = 32;
1930
1931 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001932 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001933
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001934 mbedtls_sha256_free( &sha256 );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001935#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker380da532012-04-18 16:10:25 +00001936 return;
1937}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001938#endif /* MBEDTLS_SHA256_C */
Paul Bakker380da532012-04-18 16:10:25 +00001939
Gilles Peskined2d59372021-05-12 22:43:27 +02001940#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001941void ssl_calc_verify_tls_sha384( const mbedtls_ssl_context *ssl,
Rodrigo Dias Correa2c424572020-11-10 01:38:00 -03001942 unsigned char *hash,
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001943 size_t *hlen )
Paul Bakker380da532012-04-18 16:10:25 +00001944{
Andrzej Kurekeb342242019-01-29 09:14:33 -05001945#if defined(MBEDTLS_USE_PSA_CRYPTO)
1946 size_t hash_size;
1947 psa_status_t status;
Andrzej Kurek972fba52019-01-30 03:29:12 -05001948 psa_hash_operation_t sha384_psa = psa_hash_operation_init();
Andrzej Kurekeb342242019-01-29 09:14:33 -05001949
1950 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> PSA calc verify sha384" ) );
Andrzej Kurek972fba52019-01-30 03:29:12 -05001951 status = psa_hash_clone( &ssl->handshake->fin_sha384_psa, &sha384_psa );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001952 if( status != PSA_SUCCESS )
1953 {
1954 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
1955 return;
1956 }
1957
Andrzej Kurek972fba52019-01-30 03:29:12 -05001958 status = psa_hash_finish( &sha384_psa, hash, 48, &hash_size );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001959 if( status != PSA_SUCCESS )
1960 {
1961 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
1962 return;
1963 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001964
1965 *hlen = 48;
1966 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated verify result", hash, *hlen );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001967 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= PSA calc verify" ) );
1968#else
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001969 mbedtls_sha512_context sha512;
Paul Bakker380da532012-04-18 16:10:25 +00001970
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001971 mbedtls_sha512_init( &sha512 );
1972
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001973 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001974
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001975 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001976 mbedtls_sha512_finish_ret( &sha512, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001977
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001978 *hlen = 48;
1979
1980 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001981 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001982
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001983 mbedtls_sha512_free( &sha512 );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001984#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker5121ce52009-01-03 21:22:43 +00001985 return;
1986}
Gilles Peskined2d59372021-05-12 22:43:27 +02001987#endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001988#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001989
Gilles Peskineeccd8882020-03-10 12:19:08 +01001990#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001991int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001992{
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001993 unsigned char *p = ssl->handshake->premaster;
1994 unsigned char *end = p + sizeof( ssl->handshake->premaster );
Guilhem Bryantb5f04e42020-04-01 11:23:58 +01001995 const unsigned char *psk = NULL;
Guilhem Bryant61b0fe62020-03-27 11:12:12 +00001996 size_t psk_len = 0;
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001997
Guilhem Bryantc5285d82020-03-25 17:08:15 +00001998 if( mbedtls_ssl_get_psk( ssl, &psk, &psk_len )
1999 == MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED )
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01002000 {
Guilhem Bryantc5285d82020-03-25 17:08:15 +00002001 /*
2002 * This should never happen because the existence of a PSK is always
2003 * checked before calling this function
2004 */
Guilhem Bryant82194c82020-03-26 17:04:31 +00002005 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Guilhem Bryant0c9b1952020-04-08 11:02:38 +01002006 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01002007 }
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002008
2009 /*
2010 * PMS = struct {
2011 * opaque other_secret<0..2^16-1>;
2012 * opaque psk<0..2^16-1>;
2013 * };
2014 * with "other_secret" depending on the particular key exchange
2015 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002016#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
2017 if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002018 {
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02002019 if( end - p < 2 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002020 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002021
Joe Subbiania651e6f2021-08-23 11:35:25 +01002022 MBEDTLS_PUT_UINT16_BE( psk_len, p, 0 );
2023 p += 2;
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02002024
2025 if( end < p || (size_t)( end - p ) < psk_len )
2026 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2027
2028 memset( p, 0, psk_len );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01002029 p += psk_len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002030 }
2031 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002032#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
2033#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
2034 if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002035 {
2036 /*
2037 * other_secret already set by the ClientKeyExchange message,
2038 * and is 48 bytes long
2039 */
Philippe Antoine747fd532018-05-30 09:13:21 +02002040 if( end - p < 2 )
2041 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2042
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002043 *p++ = 0;
2044 *p++ = 48;
2045 p += 48;
2046 }
2047 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002048#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
2049#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
2050 if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002051 {
Janos Follath865b3eb2019-12-16 11:46:15 +00002052 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +01002053 size_t len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002054
Manuel Pégourié-Gonnard8df68632014-06-23 17:56:08 +02002055 /* Write length only when we know the actual value */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002056 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +01002057 p + 2, end - ( p + 2 ), &len,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002058 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002059 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002060 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002061 return( ret );
2062 }
Joe Subbiania651e6f2021-08-23 11:35:25 +01002063 MBEDTLS_PUT_UINT16_BE( len, p, 0 );
2064 p += 2 + len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002065
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002066 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002067 }
2068 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002069#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
2070#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2071 if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002072 {
Janos Follath865b3eb2019-12-16 11:46:15 +00002073 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002074 size_t zlen;
2075
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002076 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen,
Paul Bakker66d5d072014-06-17 16:39:18 +02002077 p + 2, end - ( p + 2 ),
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01002078 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002079 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002080 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002081 return( ret );
2082 }
2083
Joe Subbiania651e6f2021-08-23 11:35:25 +01002084 MBEDTLS_PUT_UINT16_BE( zlen, p, 0 );
2085 p += 2 + zlen;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002086
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05002087 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
2088 MBEDTLS_DEBUG_ECDH_Z );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002089 }
2090 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002091#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002092 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002093 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2094 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002095 }
2096
2097 /* opaque psk<0..2^16-1>; */
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02002098 if( end - p < 2 )
2099 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardb2bf5a12014-03-25 16:28:12 +01002100
Joe Subbiania651e6f2021-08-23 11:35:25 +01002101 MBEDTLS_PUT_UINT16_BE( psk_len, p, 0 );
2102 p += 2;
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02002103
2104 if( end < p || (size_t)( end - p ) < psk_len )
2105 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2106
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01002107 memcpy( p, psk, psk_len );
2108 p += psk_len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002109
2110 ssl->handshake->pmslen = p - ssl->handshake->premaster;
2111
2112 return( 0 );
2113}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002114#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002116#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02002117MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002118static int ssl_write_hello_request( mbedtls_ssl_context *ssl );
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002119
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002120#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker786300f2020-02-05 10:46:40 +00002121int mbedtls_ssl_resend_hello_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002122{
2123 /* If renegotiation is not enforced, retransmit until we would reach max
2124 * timeout if we were using the usual handshake doubling scheme */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002125 if( ssl->conf->renego_max_records < 0 )
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002126 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002127 uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1;
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002128 unsigned char doublings = 1;
2129
2130 while( ratio != 0 )
2131 {
2132 ++doublings;
2133 ratio >>= 1;
2134 }
2135
2136 if( ++ssl->renego_records_seen > doublings )
2137 {
Manuel Pégourié-Gonnardcb0d2122015-07-22 11:52:11 +02002138 MBEDTLS_SSL_DEBUG_MSG( 2, ( "no longer retransmitting hello request" ) );
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002139 return( 0 );
2140 }
2141 }
2142
2143 return( ssl_write_hello_request( ssl ) );
2144}
2145#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002146#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02002147
Hanno Beckerb9d44792019-02-08 07:19:04 +00002148#if defined(MBEDTLS_X509_CRT_PARSE_C)
2149static void ssl_clear_peer_cert( mbedtls_ssl_session *session )
2150{
2151#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2152 if( session->peer_cert != NULL )
2153 {
2154 mbedtls_x509_crt_free( session->peer_cert );
2155 mbedtls_free( session->peer_cert );
2156 session->peer_cert = NULL;
2157 }
2158#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2159 if( session->peer_cert_digest != NULL )
2160 {
2161 /* Zeroization is not necessary. */
2162 mbedtls_free( session->peer_cert_digest );
2163 session->peer_cert_digest = NULL;
2164 session->peer_cert_digest_type = MBEDTLS_MD_NONE;
2165 session->peer_cert_digest_len = 0;
2166 }
2167#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2168}
2169#endif /* MBEDTLS_X509_CRT_PARSE_C */
2170
Paul Bakker5121ce52009-01-03 21:22:43 +00002171/*
2172 * Handshake functions
2173 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002174#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskinef9828522017-05-03 12:28:43 +02002175/* No certificate support -> dummy functions */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002176int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002177{
Hanno Beckere694c3e2017-12-27 21:34:08 +00002178 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2179 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002180
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002181 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002182
Hanno Becker7177a882019-02-05 13:36:46 +00002183 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002184 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002185 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002186 ssl->state++;
2187 return( 0 );
2188 }
2189
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002190 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2191 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002192}
2193
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002194int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002195{
Hanno Beckere694c3e2017-12-27 21:34:08 +00002196 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2197 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002198
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002199 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002200
Hanno Becker7177a882019-02-05 13:36:46 +00002201 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002202 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002203 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002204 ssl->state++;
2205 return( 0 );
2206 }
2207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002208 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2209 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002210}
Gilles Peskinef9828522017-05-03 12:28:43 +02002211
Gilles Peskineeccd8882020-03-10 12:19:08 +01002212#else /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Gilles Peskinef9828522017-05-03 12:28:43 +02002213/* Some certificate support -> implement write and parse */
2214
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002215int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002216{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002217 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002218 size_t i, n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002219 const mbedtls_x509_crt *crt;
Hanno Beckere694c3e2017-12-27 21:34:08 +00002220 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2221 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002222
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002223 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002224
Hanno Becker7177a882019-02-05 13:36:46 +00002225 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002226 {
Johan Pascal4f099262020-09-22 10:59:26 +02002227 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2228 ssl->state++;
2229 return( 0 );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002230 }
2231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002232#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002233 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002234 {
2235 if( ssl->client_auth == 0 )
2236 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002237 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002238 ssl->state++;
2239 return( 0 );
2240 }
2241
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002242#if defined(MBEDTLS_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00002243 /*
2244 * If using SSLv3 and got no cert, send an Alert message
2245 * (otherwise an empty Certificate message will be sent).
2246 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002247 if( mbedtls_ssl_own_cert( ssl ) == NULL &&
2248 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002249 {
2250 ssl->out_msglen = 2;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002251 ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT;
2252 ssl->out_msg[0] = MBEDTLS_SSL_ALERT_LEVEL_WARNING;
2253 ssl->out_msg[1] = MBEDTLS_SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00002254
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002255 MBEDTLS_SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002256 goto write_msg;
2257 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002258#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002259 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002260#endif /* MBEDTLS_SSL_CLI_C */
2261#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002262 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Paul Bakker5121ce52009-01-03 21:22:43 +00002263 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002264 if( mbedtls_ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002265 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002266 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
2267 return( MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002268 }
2269 }
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01002270#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002271
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002272 MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", mbedtls_ssl_own_cert( ssl ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002273
2274 /*
2275 * 0 . 0 handshake type
2276 * 1 . 3 handshake length
2277 * 4 . 6 length of all certs
2278 * 7 . 9 length of cert. 1
2279 * 10 . n-1 peer certificate
2280 * n . n+2 length of cert. 2
2281 * n+3 . ... upper level cert, etc.
2282 */
2283 i = 7;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002284 crt = mbedtls_ssl_own_cert( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00002285
Paul Bakker29087132010-03-21 21:03:34 +00002286 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002287 {
2288 n = crt->raw.len;
Angus Grattond8213d02016-05-25 20:56:48 +10002289 if( n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i )
Paul Bakker5121ce52009-01-03 21:22:43 +00002290 {
Paul Elliottd48d5c62021-01-07 14:47:05 +00002291 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate too large, %" MBEDTLS_PRINTF_SIZET
2292 " > %" MBEDTLS_PRINTF_SIZET,
Paul Elliott3891caf2020-12-17 18:42:40 +00002293 i + 3 + n, (size_t) MBEDTLS_SSL_OUT_CONTENT_LEN ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002294 return( MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002295 }
2296
Joe Subbianiad1115a2021-07-16 14:27:50 +01002297 ssl->out_msg[i ] = MBEDTLS_BYTE_2( n );
2298 ssl->out_msg[i + 1] = MBEDTLS_BYTE_1( n );
2299 ssl->out_msg[i + 2] = MBEDTLS_BYTE_0( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002300
2301 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
2302 i += n; crt = crt->next;
2303 }
2304
Joe Subbianiad1115a2021-07-16 14:27:50 +01002305 ssl->out_msg[4] = MBEDTLS_BYTE_2( i - 7 );
2306 ssl->out_msg[5] = MBEDTLS_BYTE_1( i - 7 );
2307 ssl->out_msg[6] = MBEDTLS_BYTE_0( i - 7 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002308
2309 ssl->out_msglen = i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002310 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2311 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002312
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02002313#if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00002314write_msg:
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002315#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002316
2317 ssl->state++;
2318
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02002319 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002320 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02002321 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002322 return( ret );
2323 }
2324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002325 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002326
Paul Bakkered27a042013-04-18 22:46:23 +02002327 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002328}
2329
Hanno Becker84879e32019-01-31 07:44:03 +00002330#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
Hanno Becker177475a2019-02-05 17:02:46 +00002331
2332#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02002333MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002334static int ssl_check_peer_crt_unchanged( mbedtls_ssl_context *ssl,
2335 unsigned char *crt_buf,
2336 size_t crt_buf_len )
2337{
2338 mbedtls_x509_crt const * const peer_crt = ssl->session->peer_cert;
2339
2340 if( peer_crt == NULL )
2341 return( -1 );
2342
2343 if( peer_crt->raw.len != crt_buf_len )
2344 return( -1 );
2345
k-stachowiak95b68ef2019-09-16 12:21:00 +02002346 return( memcmp( peer_crt->raw.p, crt_buf, peer_crt->raw.len ) );
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002347}
Hanno Becker177475a2019-02-05 17:02:46 +00002348#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02002349MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker177475a2019-02-05 17:02:46 +00002350static int ssl_check_peer_crt_unchanged( mbedtls_ssl_context *ssl,
2351 unsigned char *crt_buf,
2352 size_t crt_buf_len )
2353{
Janos Follath865b3eb2019-12-16 11:46:15 +00002354 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker177475a2019-02-05 17:02:46 +00002355 unsigned char const * const peer_cert_digest =
2356 ssl->session->peer_cert_digest;
2357 mbedtls_md_type_t const peer_cert_digest_type =
2358 ssl->session->peer_cert_digest_type;
2359 mbedtls_md_info_t const * const digest_info =
2360 mbedtls_md_info_from_type( peer_cert_digest_type );
2361 unsigned char tmp_digest[MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN];
2362 size_t digest_len;
2363
2364 if( peer_cert_digest == NULL || digest_info == NULL )
2365 return( -1 );
2366
2367 digest_len = mbedtls_md_get_size( digest_info );
2368 if( digest_len > MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN )
2369 return( -1 );
2370
2371 ret = mbedtls_md( digest_info, crt_buf, crt_buf_len, tmp_digest );
2372 if( ret != 0 )
2373 return( -1 );
2374
2375 return( memcmp( tmp_digest, peer_cert_digest, digest_len ) );
2376}
2377#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker84879e32019-01-31 07:44:03 +00002378#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002379
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002380/*
2381 * Once the certificate message is read, parse it into a cert chain and
2382 * perform basic checks, but leave actual verification to the caller
2383 */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02002384MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002385static int ssl_parse_certificate_chain( mbedtls_ssl_context *ssl,
2386 mbedtls_x509_crt *chain )
Paul Bakker5121ce52009-01-03 21:22:43 +00002387{
Janos Follath865b3eb2019-12-16 11:46:15 +00002388 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002389#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
2390 int crt_cnt=0;
2391#endif
Paul Bakker23986e52011-04-24 08:57:21 +00002392 size_t i, n;
Gilles Peskine064a85c2017-05-10 10:46:40 +02002393 uint8_t alert;
Paul Bakker5121ce52009-01-03 21:22:43 +00002394
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002395 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002396 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002397 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002398 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2399 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002400 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002401 }
2402
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002403 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE ||
2404 ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002405 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002406 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002407 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2408 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002409 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002410 }
2411
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002412 i = mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00002413
Paul Bakker5121ce52009-01-03 21:22:43 +00002414 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002415 * Same message structure as in mbedtls_ssl_write_certificate()
Paul Bakker5121ce52009-01-03 21:22:43 +00002416 */
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00002417 n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2];
Paul Bakker5121ce52009-01-03 21:22:43 +00002418
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00002419 if( ssl->in_msg[i] != 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002420 ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002421 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002422 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002423 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2424 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002425 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002426 }
2427
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002428 /* Make &ssl->in_msg[i] point to the beginning of the CRT chain. */
2429 i += 3;
2430
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002431 /* Iterate through and parse the CRTs in the provided chain. */
Paul Bakker5121ce52009-01-03 21:22:43 +00002432 while( i < ssl->in_hslen )
2433 {
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002434 /* Check that there's room for the next CRT's length fields. */
Philippe Antoine747fd532018-05-30 09:13:21 +02002435 if ( i + 3 > ssl->in_hslen ) {
2436 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Hanno Beckere2734e22019-01-31 07:44:17 +00002437 mbedtls_ssl_send_alert_message( ssl,
2438 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2439 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Philippe Antoine747fd532018-05-30 09:13:21 +02002440 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
2441 }
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002442 /* In theory, the CRT can be up to 2**24 Bytes, but we don't support
2443 * anything beyond 2**16 ~ 64K. */
Paul Bakker5121ce52009-01-03 21:22:43 +00002444 if( ssl->in_msg[i] != 0 )
2445 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002446 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Hanno Beckere2734e22019-01-31 07:44:17 +00002447 mbedtls_ssl_send_alert_message( ssl,
2448 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2449 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002450 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002451 }
2452
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002453 /* Read length of the next CRT in the chain. */
Paul Bakker5121ce52009-01-03 21:22:43 +00002454 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2455 | (unsigned int) ssl->in_msg[i + 2];
2456 i += 3;
2457
2458 if( n < 128 || i + n > ssl->in_hslen )
2459 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002460 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Hanno Beckere2734e22019-01-31 07:44:17 +00002461 mbedtls_ssl_send_alert_message( ssl,
2462 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2463 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002464 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002465 }
2466
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002467 /* Check if we're handling the first CRT in the chain. */
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002468#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
2469 if( crt_cnt++ == 0 &&
2470 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
2471 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002472 {
Hanno Becker46f34d02019-02-08 14:00:04 +00002473 /* During client-side renegotiation, check that the server's
2474 * end-CRTs hasn't changed compared to the initial handshake,
2475 * mitigating the triple handshake attack. On success, reuse
2476 * the original end-CRT instead of parsing it again. */
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002477 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Check that peer CRT hasn't changed during renegotiation" ) );
2478 if( ssl_check_peer_crt_unchanged( ssl,
2479 &ssl->in_msg[i],
2480 n ) != 0 )
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002481 {
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002482 MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) );
2483 mbedtls_ssl_send_alert_message( ssl,
2484 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2485 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED );
2486 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002487 }
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002488
2489 /* Now we can safely free the original chain. */
2490 ssl_clear_peer_cert( ssl->session );
2491 }
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002492#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
2493
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002494 /* Parse the next certificate in the chain. */
Hanno Becker0056eab2019-02-08 14:39:16 +00002495#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002496 ret = mbedtls_x509_crt_parse_der( chain, ssl->in_msg + i, n );
Hanno Becker0056eab2019-02-08 14:39:16 +00002497#else
Hanno Becker353a6f02019-02-26 11:51:34 +00002498 /* If we don't need to store the CRT chain permanently, parse
Hanno Becker0056eab2019-02-08 14:39:16 +00002499 * it in-place from the input buffer instead of making a copy. */
2500 ret = mbedtls_x509_crt_parse_der_nocopy( chain, ssl->in_msg + i, n );
2501#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002502 switch( ret )
Paul Bakker5121ce52009-01-03 21:22:43 +00002503 {
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002504 case 0: /*ok*/
2505 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
2506 /* Ignore certificate with an unknown algorithm: maybe a
2507 prior certificate was already trusted. */
2508 break;
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002509
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002510 case MBEDTLS_ERR_X509_ALLOC_FAILED:
2511 alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR;
2512 goto crt_parse_der_failed;
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002513
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002514 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
2515 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2516 goto crt_parse_der_failed;
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002517
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002518 default:
2519 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
2520 crt_parse_der_failed:
2521 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert );
2522 MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret );
2523 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002524 }
2525
2526 i += n;
2527 }
2528
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002529 MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", chain );
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002530 return( 0 );
2531}
2532
Hanno Becker4a55f632019-02-05 12:49:06 +00002533#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02002534MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker4a55f632019-02-05 12:49:06 +00002535static int ssl_srv_check_client_no_crt_notification( mbedtls_ssl_context *ssl )
2536{
2537 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
2538 return( -1 );
2539
2540#if defined(MBEDTLS_SSL_PROTO_SSL3)
2541 /*
2542 * Check if the client sent an empty certificate
2543 */
2544 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
2545 {
2546 if( ssl->in_msglen == 2 &&
2547 ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT &&
2548 ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
2549 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT )
2550 {
2551 MBEDTLS_SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2552 return( 0 );
2553 }
2554
2555 return( -1 );
2556 }
2557#endif /* MBEDTLS_SSL_PROTO_SSL3 */
2558
2559#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2560 defined(MBEDTLS_SSL_PROTO_TLS1_2)
2561 if( ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len( ssl ) &&
2562 ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
2563 ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE &&
2564 memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), "\0\0\0", 3 ) == 0 )
2565 {
2566 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2567 return( 0 );
2568 }
2569
2570 return( -1 );
2571#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
2572 MBEDTLS_SSL_PROTO_TLS1_2 */
2573}
2574#endif /* MBEDTLS_SSL_SRV_C */
2575
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002576/* Check if a certificate message is expected.
2577 * Return either
2578 * - SSL_CERTIFICATE_EXPECTED, or
2579 * - SSL_CERTIFICATE_SKIP
2580 * indicating whether a Certificate message is expected or not.
2581 */
2582#define SSL_CERTIFICATE_EXPECTED 0
2583#define SSL_CERTIFICATE_SKIP 1
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02002584MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002585static int ssl_parse_certificate_coordinate( mbedtls_ssl_context *ssl,
2586 int authmode )
2587{
2588 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002589 ssl->handshake->ciphersuite_info;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002590
2591 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
2592 return( SSL_CERTIFICATE_SKIP );
2593
2594#if defined(MBEDTLS_SSL_SRV_C)
2595 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
2596 {
2597 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2598 return( SSL_CERTIFICATE_SKIP );
2599
2600 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
2601 {
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002602 ssl->session_negotiate->verify_result =
2603 MBEDTLS_X509_BADCERT_SKIP_VERIFY;
2604 return( SSL_CERTIFICATE_SKIP );
2605 }
2606 }
Hanno Becker84d9d272019-03-01 08:10:46 +00002607#else
2608 ((void) authmode);
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002609#endif /* MBEDTLS_SSL_SRV_C */
2610
2611 return( SSL_CERTIFICATE_EXPECTED );
2612}
2613
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02002614MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker68636192019-02-05 14:36:34 +00002615static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl,
2616 int authmode,
2617 mbedtls_x509_crt *chain,
2618 void *rs_ctx )
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002619{
Hanno Becker6bdfab22019-02-05 13:11:17 +00002620 int ret = 0;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002621 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002622 ssl->handshake->ciphersuite_info;
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002623 int have_ca_chain = 0;
Hanno Becker68636192019-02-05 14:36:34 +00002624
Hanno Becker8927c832019-04-03 12:52:50 +01002625 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *);
2626 void *p_vrfy;
2627
Hanno Becker68636192019-02-05 14:36:34 +00002628 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
2629 return( 0 );
2630
Hanno Becker8927c832019-04-03 12:52:50 +01002631 if( ssl->f_vrfy != NULL )
2632 {
Hanno Beckerefb440a2019-04-03 13:04:33 +01002633 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use context-specific verification callback" ) );
Hanno Becker8927c832019-04-03 12:52:50 +01002634 f_vrfy = ssl->f_vrfy;
2635 p_vrfy = ssl->p_vrfy;
2636 }
2637 else
2638 {
Hanno Beckerefb440a2019-04-03 13:04:33 +01002639 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use configuration-specific verification callback" ) );
Hanno Becker8927c832019-04-03 12:52:50 +01002640 f_vrfy = ssl->conf->f_vrfy;
2641 p_vrfy = ssl->conf->p_vrfy;
2642 }
2643
Hanno Becker68636192019-02-05 14:36:34 +00002644 /*
2645 * Main check: verify certificate
2646 */
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002647#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
2648 if( ssl->conf->f_ca_cb != NULL )
2649 {
2650 ((void) rs_ctx);
2651 have_ca_chain = 1;
2652
2653 MBEDTLS_SSL_DEBUG_MSG( 3, ( "use CA callback for X.509 CRT verification" ) );
Jarno Lamsa9822c0d2019-04-01 16:59:48 +03002654 ret = mbedtls_x509_crt_verify_with_ca_cb(
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002655 chain,
2656 ssl->conf->f_ca_cb,
2657 ssl->conf->p_ca_cb,
2658 ssl->conf->cert_profile,
2659 ssl->hostname,
2660 &ssl->session_negotiate->verify_result,
Jaeden Amerofe710672019-04-16 15:03:12 +01002661 f_vrfy, p_vrfy );
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002662 }
2663 else
2664#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
2665 {
2666 mbedtls_x509_crt *ca_chain;
2667 mbedtls_x509_crl *ca_crl;
2668
2669#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2670 if( ssl->handshake->sni_ca_chain != NULL )
2671 {
2672 ca_chain = ssl->handshake->sni_ca_chain;
2673 ca_crl = ssl->handshake->sni_ca_crl;
2674 }
2675 else
2676#endif
2677 {
2678 ca_chain = ssl->conf->ca_chain;
2679 ca_crl = ssl->conf->ca_crl;
2680 }
2681
2682 if( ca_chain != NULL )
2683 have_ca_chain = 1;
2684
2685 ret = mbedtls_x509_crt_verify_restartable(
2686 chain,
2687 ca_chain, ca_crl,
2688 ssl->conf->cert_profile,
2689 ssl->hostname,
2690 &ssl->session_negotiate->verify_result,
Jaeden Amerofe710672019-04-16 15:03:12 +01002691 f_vrfy, p_vrfy, rs_ctx );
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002692 }
Hanno Becker68636192019-02-05 14:36:34 +00002693
2694 if( ret != 0 )
2695 {
2696 MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2697 }
2698
Gilles Peskineeccd8882020-03-10 12:19:08 +01002699#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Hanno Becker68636192019-02-05 14:36:34 +00002700 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
2701 return( MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS );
2702#endif
2703
2704 /*
2705 * Secondary checks: always done, but change 'ret' only if it was 0
2706 */
2707
2708#if defined(MBEDTLS_ECP_C)
2709 {
2710 const mbedtls_pk_context *pk = &chain->pk;
2711
Manuel Pégourié-Gonnard06e1fcd2022-06-16 10:48:06 +02002712 /* If certificate uses an EC key, make sure the curve is OK.
2713 * This is a public key, so it can't be opaque, so can_do() is a good
2714 * enough check to ensure pk_ec() is safe to use here. */
Hanno Becker68636192019-02-05 14:36:34 +00002715 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) &&
2716 mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 )
2717 {
2718 ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY;
2719
2720 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) );
2721 if( ret == 0 )
2722 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
2723 }
2724 }
2725#endif /* MBEDTLS_ECP_C */
2726
2727 if( mbedtls_ssl_check_cert_usage( chain,
2728 ciphersuite_info,
2729 ! ssl->conf->endpoint,
2730 &ssl->session_negotiate->verify_result ) != 0 )
2731 {
2732 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) );
2733 if( ret == 0 )
2734 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
2735 }
2736
2737 /* mbedtls_x509_crt_verify_with_profile is supposed to report a
2738 * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
2739 * with details encoded in the verification flags. All other kinds
2740 * of error codes, including those from the user provided f_vrfy
2741 * functions, are treated as fatal and lead to a failure of
2742 * ssl_parse_certificate even if verification was optional. */
2743 if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
2744 ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
2745 ret == MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ) )
2746 {
2747 ret = 0;
2748 }
2749
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002750 if( have_ca_chain == 0 && authmode == MBEDTLS_SSL_VERIFY_REQUIRED )
Hanno Becker68636192019-02-05 14:36:34 +00002751 {
2752 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
2753 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
2754 }
2755
2756 if( ret != 0 )
2757 {
2758 uint8_t alert;
2759
2760 /* The certificate may have been rejected for several reasons.
2761 Pick one and send the corresponding alert. Which alert to send
2762 may be a subject of debate in some cases. */
2763 if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER )
2764 alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED;
2765 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH )
2766 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
2767 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE )
2768 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2769 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE )
2770 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2771 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE )
2772 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2773 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK )
2774 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2775 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY )
2776 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2777 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED )
2778 alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED;
2779 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED )
2780 alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED;
2781 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED )
2782 alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA;
2783 else
2784 alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN;
2785 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2786 alert );
2787 }
2788
2789#if defined(MBEDTLS_DEBUG_C)
2790 if( ssl->session_negotiate->verify_result != 0 )
2791 {
Paul Elliott3891caf2020-12-17 18:42:40 +00002792 MBEDTLS_SSL_DEBUG_MSG( 3, ( "! Certificate verification flags %08x",
Paul Elliott9f352112020-12-09 14:55:45 +00002793 (unsigned int) ssl->session_negotiate->verify_result ) );
Hanno Becker68636192019-02-05 14:36:34 +00002794 }
2795 else
2796 {
2797 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate verification flags clear" ) );
2798 }
2799#endif /* MBEDTLS_DEBUG_C */
2800
2801 return( ret );
2802}
2803
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002804#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02002805MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002806static int ssl_remember_peer_crt_digest( mbedtls_ssl_context *ssl,
2807 unsigned char *start, size_t len )
2808{
Janos Follath865b3eb2019-12-16 11:46:15 +00002809 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002810 /* Remember digest of the peer's end-CRT. */
2811 ssl->session_negotiate->peer_cert_digest =
2812 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
2813 if( ssl->session_negotiate->peer_cert_digest == NULL )
2814 {
2815 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
irwir40883e92019-09-21 17:55:33 +03002816 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN ) );
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002817 mbedtls_ssl_send_alert_message( ssl,
2818 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2819 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
2820
2821 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
2822 }
2823
2824 ret = mbedtls_md( mbedtls_md_info_from_type(
2825 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
2826 start, len,
2827 ssl->session_negotiate->peer_cert_digest );
2828
2829 ssl->session_negotiate->peer_cert_digest_type =
2830 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
2831 ssl->session_negotiate->peer_cert_digest_len =
2832 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
2833
2834 return( ret );
2835}
2836
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02002837MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002838static int ssl_remember_peer_pubkey( mbedtls_ssl_context *ssl,
2839 unsigned char *start, size_t len )
2840{
2841 unsigned char *end = start + len;
Janos Follath865b3eb2019-12-16 11:46:15 +00002842 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002843
2844 /* Make a copy of the peer's raw public key. */
2845 mbedtls_pk_init( &ssl->handshake->peer_pubkey );
2846 ret = mbedtls_pk_parse_subpubkey( &start, end,
2847 &ssl->handshake->peer_pubkey );
2848 if( ret != 0 )
2849 {
2850 /* We should have parsed the public key before. */
2851 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2852 }
2853
2854 return( 0 );
2855}
2856#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2857
Hanno Becker68636192019-02-05 14:36:34 +00002858int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
2859{
2860 int ret = 0;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002861 int crt_expected;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002862#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2863 const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET
2864 ? ssl->handshake->sni_authmode
2865 : ssl->conf->authmode;
2866#else
Johan Pascal4f099262020-09-22 10:59:26 +02002867 const int authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002868#endif
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002869 void *rs_ctx = NULL;
Hanno Becker3dad3112019-02-05 17:19:52 +00002870 mbedtls_x509_crt *chain = NULL;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002871
2872 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2873
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002874 crt_expected = ssl_parse_certificate_coordinate( ssl, authmode );
2875 if( crt_expected == SSL_CERTIFICATE_SKIP )
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002876 {
2877 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
Hanno Becker6bdfab22019-02-05 13:11:17 +00002878 goto exit;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002879 }
2880
Gilles Peskineeccd8882020-03-10 12:19:08 +01002881#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002882 if( ssl->handshake->ecrs_enabled &&
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002883 ssl->handshake->ecrs_state == ssl_ecrs_crt_verify )
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002884 {
Hanno Becker3dad3112019-02-05 17:19:52 +00002885 chain = ssl->handshake->ecrs_peer_cert;
2886 ssl->handshake->ecrs_peer_cert = NULL;
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002887 goto crt_verify;
2888 }
2889#endif
2890
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +02002891 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002892 {
2893 /* mbedtls_ssl_read_record may have sent an alert already. We
2894 let it decide whether to alert. */
2895 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Hanno Becker3dad3112019-02-05 17:19:52 +00002896 goto exit;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002897 }
2898
Hanno Becker4a55f632019-02-05 12:49:06 +00002899#if defined(MBEDTLS_SSL_SRV_C)
2900 if( ssl_srv_check_client_no_crt_notification( ssl ) == 0 )
2901 {
2902 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
Hanno Becker4a55f632019-02-05 12:49:06 +00002903
irwird3085ab2020-04-21 22:26:05 +03002904 if( authmode != MBEDTLS_SSL_VERIFY_OPTIONAL )
Hanno Becker6bdfab22019-02-05 13:11:17 +00002905 ret = MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Hanno Becker4a55f632019-02-05 12:49:06 +00002906
Hanno Becker6bdfab22019-02-05 13:11:17 +00002907 goto exit;
Hanno Becker4a55f632019-02-05 12:49:06 +00002908 }
2909#endif /* MBEDTLS_SSL_SRV_C */
2910
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002911 /* Clear existing peer CRT structure in case we tried to
2912 * reuse a session but it failed, and allocate a new one. */
Hanno Becker7a955a02019-02-05 13:08:01 +00002913 ssl_clear_peer_cert( ssl->session_negotiate );
Hanno Becker3dad3112019-02-05 17:19:52 +00002914
2915 chain = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
2916 if( chain == NULL )
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002917 {
Paul Elliottd48d5c62021-01-07 14:47:05 +00002918 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed",
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002919 sizeof( mbedtls_x509_crt ) ) );
2920 mbedtls_ssl_send_alert_message( ssl,
2921 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2922 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Hanno Becker7a955a02019-02-05 13:08:01 +00002923
Hanno Becker3dad3112019-02-05 17:19:52 +00002924 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
2925 goto exit;
2926 }
2927 mbedtls_x509_crt_init( chain );
2928
2929 ret = ssl_parse_certificate_chain( ssl, chain );
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002930 if( ret != 0 )
Hanno Becker3dad3112019-02-05 17:19:52 +00002931 goto exit;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002932
Gilles Peskineeccd8882020-03-10 12:19:08 +01002933#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002934 if( ssl->handshake->ecrs_enabled)
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002935 ssl->handshake->ecrs_state = ssl_ecrs_crt_verify;
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002936
2937crt_verify:
2938 if( ssl->handshake->ecrs_enabled)
2939 rs_ctx = &ssl->handshake->ecrs_ctx;
2940#endif
2941
Hanno Becker68636192019-02-05 14:36:34 +00002942 ret = ssl_parse_certificate_verify( ssl, authmode,
Hanno Becker3dad3112019-02-05 17:19:52 +00002943 chain, rs_ctx );
Hanno Becker68636192019-02-05 14:36:34 +00002944 if( ret != 0 )
Hanno Becker3dad3112019-02-05 17:19:52 +00002945 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002946
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002947#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002948 {
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002949 unsigned char *crt_start, *pk_start;
2950 size_t crt_len, pk_len;
Hanno Becker3dad3112019-02-05 17:19:52 +00002951
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002952 /* We parse the CRT chain without copying, so
2953 * these pointers point into the input buffer,
2954 * and are hence still valid after freeing the
2955 * CRT chain. */
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002956
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002957 crt_start = chain->raw.p;
2958 crt_len = chain->raw.len;
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002959
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002960 pk_start = chain->pk_raw.p;
2961 pk_len = chain->pk_raw.len;
2962
2963 /* Free the CRT structures before computing
2964 * digest and copying the peer's public key. */
2965 mbedtls_x509_crt_free( chain );
2966 mbedtls_free( chain );
2967 chain = NULL;
2968
2969 ret = ssl_remember_peer_crt_digest( ssl, crt_start, crt_len );
Hanno Beckera2747532019-02-06 16:19:04 +00002970 if( ret != 0 )
Hanno Beckera2747532019-02-06 16:19:04 +00002971 goto exit;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002972
2973 ret = ssl_remember_peer_pubkey( ssl, pk_start, pk_len );
2974 if( ret != 0 )
2975 goto exit;
Hanno Beckera2747532019-02-06 16:19:04 +00002976 }
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002977#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2978 /* Pass ownership to session structure. */
Hanno Becker3dad3112019-02-05 17:19:52 +00002979 ssl->session_negotiate->peer_cert = chain;
2980 chain = NULL;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002981#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker3dad3112019-02-05 17:19:52 +00002982
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002983 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002984
Hanno Becker6bdfab22019-02-05 13:11:17 +00002985exit:
2986
Hanno Becker3dad3112019-02-05 17:19:52 +00002987 if( ret == 0 )
2988 ssl->state++;
2989
Gilles Peskineeccd8882020-03-10 12:19:08 +01002990#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Hanno Becker3dad3112019-02-05 17:19:52 +00002991 if( ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS )
2992 {
2993 ssl->handshake->ecrs_peer_cert = chain;
2994 chain = NULL;
2995 }
2996#endif
2997
2998 if( chain != NULL )
2999 {
3000 mbedtls_x509_crt_free( chain );
3001 mbedtls_free( chain );
3002 }
3003
Paul Bakker5121ce52009-01-03 21:22:43 +00003004 return( ret );
3005}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003006#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003007
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003008void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl,
3009 const mbedtls_ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00003010{
Paul Bakkerfb08fd22013-08-27 15:06:26 +02003011 ((void) ciphersuite_info);
Paul Bakker769075d2012-11-24 11:26:46 +01003012
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003013#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3014 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3015 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00003016 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker380da532012-04-18 16:10:25 +00003017 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003018#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003019#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Gilles Peskined2d59372021-05-12 22:43:27 +02003020#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003021 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003022 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
3023 else
3024#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003025#if defined(MBEDTLS_SHA256_C)
3026 if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 )
Paul Bakker48916f92012-09-16 19:57:18 +00003027 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003028 else
3029#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003030#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02003031 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003032 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003033 return;
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02003034 }
Paul Bakker380da532012-04-18 16:10:25 +00003035}
Paul Bakkerf7abd422013-04-16 13:15:56 +02003036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003037void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02003038{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003039#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3040 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003041 mbedtls_md5_starts_ret( &ssl->handshake->fin_md5 );
3042 mbedtls_sha1_starts_ret( &ssl->handshake->fin_sha1 );
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02003043#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003044#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3045#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05003046#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek2ad22972019-01-30 03:32:12 -05003047 psa_hash_abort( &ssl->handshake->fin_sha256_psa );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003048 psa_hash_setup( &ssl->handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
3049#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003050 mbedtls_sha256_starts_ret( &ssl->handshake->fin_sha256, 0 );
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02003051#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05003052#endif
Gilles Peskined2d59372021-05-12 22:43:27 +02003053#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Andrzej Kurekeb342242019-01-29 09:14:33 -05003054#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek2ad22972019-01-30 03:32:12 -05003055 psa_hash_abort( &ssl->handshake->fin_sha384_psa );
Andrzej Kurek972fba52019-01-30 03:29:12 -05003056 psa_hash_setup( &ssl->handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003057#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003058 mbedtls_sha512_starts_ret( &ssl->handshake->fin_sha512, 1 );
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02003059#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05003060#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003061#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02003062}
3063
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003064static void ssl_update_checksum_start( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003065 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00003066{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003067#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3068 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003069 mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len );
3070 mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003071#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003072#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3073#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05003074#if defined(MBEDTLS_USE_PSA_CRYPTO)
3075 psa_hash_update( &ssl->handshake->fin_sha256_psa, buf, len );
3076#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003077 mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003078#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05003079#endif
Gilles Peskined2d59372021-05-12 22:43:27 +02003080#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Andrzej Kurekeb342242019-01-29 09:14:33 -05003081#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05003082 psa_hash_update( &ssl->handshake->fin_sha384_psa, buf, len );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003083#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003084 mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01003085#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05003086#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003087#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00003088}
3089
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003090#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3091 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3092static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003093 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00003094{
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003095 mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len );
3096 mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00003097}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003098#endif
Paul Bakker380da532012-04-18 16:10:25 +00003099
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003100#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3101#if defined(MBEDTLS_SHA256_C)
3102static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003103 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00003104{
Andrzej Kurekeb342242019-01-29 09:14:33 -05003105#if defined(MBEDTLS_USE_PSA_CRYPTO)
3106 psa_hash_update( &ssl->handshake->fin_sha256_psa, buf, len );
3107#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003108 mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003109#endif
Paul Bakker380da532012-04-18 16:10:25 +00003110}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003111#endif
Paul Bakker380da532012-04-18 16:10:25 +00003112
Gilles Peskined2d59372021-05-12 22:43:27 +02003113#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003114static void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003115 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00003116{
Andrzej Kurekeb342242019-01-29 09:14:33 -05003117#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05003118 psa_hash_update( &ssl->handshake->fin_sha384_psa, buf, len );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003119#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003120 mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003121#endif
Paul Bakker380da532012-04-18 16:10:25 +00003122}
Paul Bakker769075d2012-11-24 11:26:46 +01003123#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003124#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00003125
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003126#if defined(MBEDTLS_SSL_PROTO_SSL3)
Paul Bakker1ef83d62012-04-11 12:09:53 +00003127static void ssl_calc_finished_ssl(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003128 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00003129{
Paul Bakker3c2122f2013-06-24 19:03:14 +02003130 const char *sender;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003131 mbedtls_md5_context md5;
3132 mbedtls_sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003133
Paul Bakker5121ce52009-01-03 21:22:43 +00003134 unsigned char padbuf[48];
3135 unsigned char md5sum[16];
3136 unsigned char sha1sum[20];
3137
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003138 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00003139 if( !session )
3140 session = ssl->session;
3141
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003142 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003143
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003144 mbedtls_md5_init( &md5 );
3145 mbedtls_sha1_init( &sha1 );
3146
3147 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
3148 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003149
3150 /*
3151 * SSLv3:
3152 * hash =
3153 * MD5( master + pad2 +
3154 * MD5( handshake + sender + master + pad1 ) )
3155 * + SHA1( master + pad2 +
3156 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00003157 */
3158
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003159#if !defined(MBEDTLS_MD5_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003160 MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
3161 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003162#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003163
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003164#if !defined(MBEDTLS_SHA1_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003165 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
3166 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003167#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003168
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003169 sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "CLNT"
Paul Bakker3c2122f2013-06-24 19:03:14 +02003170 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00003171
Paul Bakker1ef83d62012-04-11 12:09:53 +00003172 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003173
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003174 mbedtls_md5_update_ret( &md5, (const unsigned char *) sender, 4 );
3175 mbedtls_md5_update_ret( &md5, session->master, 48 );
3176 mbedtls_md5_update_ret( &md5, padbuf, 48 );
3177 mbedtls_md5_finish_ret( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00003178
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003179 mbedtls_sha1_update_ret( &sha1, (const unsigned char *) sender, 4 );
3180 mbedtls_sha1_update_ret( &sha1, session->master, 48 );
3181 mbedtls_sha1_update_ret( &sha1, padbuf, 40 );
3182 mbedtls_sha1_finish_ret( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00003183
Paul Bakker1ef83d62012-04-11 12:09:53 +00003184 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003185
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003186 mbedtls_md5_starts_ret( &md5 );
3187 mbedtls_md5_update_ret( &md5, session->master, 48 );
3188 mbedtls_md5_update_ret( &md5, padbuf, 48 );
3189 mbedtls_md5_update_ret( &md5, md5sum, 16 );
3190 mbedtls_md5_finish_ret( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00003191
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003192 mbedtls_sha1_starts_ret( &sha1 );
3193 mbedtls_sha1_update_ret( &sha1, session->master, 48 );
3194 mbedtls_sha1_update_ret( &sha1, padbuf , 40 );
3195 mbedtls_sha1_update_ret( &sha1, sha1sum, 20 );
3196 mbedtls_sha1_finish_ret( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003197
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003198 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003199
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003200 mbedtls_md5_free( &md5 );
3201 mbedtls_sha1_free( &sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003202
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003203 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
3204 mbedtls_platform_zeroize( md5sum, sizeof( md5sum ) );
3205 mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003206
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003207 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003208}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003209#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00003210
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003211#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Paul Bakker1ef83d62012-04-11 12:09:53 +00003212static void ssl_calc_finished_tls(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003213 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00003214{
Paul Bakker1ef83d62012-04-11 12:09:53 +00003215 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02003216 const char *sender;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003217 mbedtls_md5_context md5;
3218 mbedtls_sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003219 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00003220
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003221 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00003222 if( !session )
3223 session = ssl->session;
3224
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003225 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003226
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003227 mbedtls_md5_init( &md5 );
3228 mbedtls_sha1_init( &sha1 );
3229
3230 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
3231 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003232
Paul Bakker1ef83d62012-04-11 12:09:53 +00003233 /*
3234 * TLSv1:
3235 * hash = PRF( master, finished_label,
3236 * MD5( handshake ) + SHA1( handshake ) )[0..11]
3237 */
Paul Bakker5121ce52009-01-03 21:22:43 +00003238
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003239#if !defined(MBEDTLS_MD5_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003240 MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
3241 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003242#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00003243
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003244#if !defined(MBEDTLS_SHA1_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003245 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
3246 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003247#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00003248
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003249 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02003250 ? "client finished"
3251 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00003252
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003253 mbedtls_md5_finish_ret( &md5, padbuf );
3254 mbedtls_sha1_finish_ret( &sha1, padbuf + 16 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003255
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003256 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00003257 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003258
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003259 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003260
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003261 mbedtls_md5_free( &md5 );
3262 mbedtls_sha1_free( &sha1 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003263
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003264 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003265
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003266 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003267}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003268#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003269
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003270#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3271#if defined(MBEDTLS_SHA256_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00003272static void ssl_calc_finished_tls_sha256(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003273 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003274{
3275 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02003276 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003277 unsigned char padbuf[32];
Andrzej Kurekeb342242019-01-29 09:14:33 -05003278#if defined(MBEDTLS_USE_PSA_CRYPTO)
3279 size_t hash_size;
Jaeden Amero34973232019-02-20 10:32:28 +00003280 psa_hash_operation_t sha256_psa = PSA_HASH_OPERATION_INIT;
Andrzej Kurekeb342242019-01-29 09:14:33 -05003281 psa_status_t status;
3282#else
3283 mbedtls_sha256_context sha256;
3284#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00003285
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003286 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00003287 if( !session )
3288 session = ssl->session;
3289
Andrzej Kurekeb342242019-01-29 09:14:33 -05003290 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
3291 ? "client finished"
3292 : "server finished";
3293
3294#if defined(MBEDTLS_USE_PSA_CRYPTO)
3295 sha256_psa = psa_hash_operation_init();
3296
3297 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc PSA finished tls sha256" ) );
3298
3299 status = psa_hash_clone( &ssl->handshake->fin_sha256_psa, &sha256_psa );
3300 if( status != PSA_SUCCESS )
3301 {
3302 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
3303 return;
3304 }
3305
3306 status = psa_hash_finish( &sha256_psa, padbuf, sizeof( padbuf ), &hash_size );
3307 if( status != PSA_SUCCESS )
3308 {
3309 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
3310 return;
3311 }
3312 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated padbuf", padbuf, 32 );
3313#else
3314
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003315 mbedtls_sha256_init( &sha256 );
3316
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003317 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003318
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003319 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003320
3321 /*
3322 * TLSv1.2:
3323 * hash = PRF( master, finished_label,
3324 * Hash( handshake ) )[0.11]
3325 */
3326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003327#if !defined(MBEDTLS_SHA256_ALT)
3328 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003329 sha256.state, sizeof( sha256.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003330#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00003331
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003332 mbedtls_sha256_finish_ret( &sha256, padbuf );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003333 mbedtls_sha256_free( &sha256 );
3334#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003335
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003336 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00003337 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003338
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003339 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003340
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003341 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003342
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003343 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003344}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003345#endif /* MBEDTLS_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003346
Gilles Peskined2d59372021-05-12 22:43:27 +02003347#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Rodrigo Dias Corread596ca82020-11-25 00:42:28 -03003348
Paul Bakkerca4ab492012-04-18 14:23:57 +00003349static void ssl_calc_finished_tls_sha384(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003350 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakkerca4ab492012-04-18 14:23:57 +00003351{
3352 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02003353 const char *sender;
Rodrigo Dias Corread596ca82020-11-25 00:42:28 -03003354 unsigned char padbuf[48];
Andrzej Kurekeb342242019-01-29 09:14:33 -05003355#if defined(MBEDTLS_USE_PSA_CRYPTO)
3356 size_t hash_size;
Jaeden Amero34973232019-02-20 10:32:28 +00003357 psa_hash_operation_t sha384_psa = PSA_HASH_OPERATION_INIT;
Andrzej Kurekeb342242019-01-29 09:14:33 -05003358 psa_status_t status;
3359#else
3360 mbedtls_sha512_context sha512;
3361#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00003362
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003363 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00003364 if( !session )
3365 session = ssl->session;
3366
Andrzej Kurekeb342242019-01-29 09:14:33 -05003367 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
3368 ? "client finished"
3369 : "server finished";
3370
3371#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05003372 sha384_psa = psa_hash_operation_init();
Andrzej Kurekeb342242019-01-29 09:14:33 -05003373
3374 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc PSA finished tls sha384" ) );
3375
Andrzej Kurek972fba52019-01-30 03:29:12 -05003376 status = psa_hash_clone( &ssl->handshake->fin_sha384_psa, &sha384_psa );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003377 if( status != PSA_SUCCESS )
3378 {
3379 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
3380 return;
3381 }
3382
Andrzej Kurek972fba52019-01-30 03:29:12 -05003383 status = psa_hash_finish( &sha384_psa, padbuf, sizeof( padbuf ), &hash_size );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003384 if( status != PSA_SUCCESS )
3385 {
3386 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
3387 return;
3388 }
3389 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated padbuf", padbuf, 48 );
3390#else
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003391 mbedtls_sha512_init( &sha512 );
3392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003393 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003394
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003395 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003396
3397 /*
3398 * TLSv1.2:
3399 * hash = PRF( master, finished_label,
3400 * Hash( handshake ) )[0.11]
3401 */
3402
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003403#if !defined(MBEDTLS_SHA512_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003404 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
3405 sha512.state, sizeof( sha512.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003406#endif
Gilles Peskinebb66dac2021-05-13 00:00:45 +02003407 /* mbedtls_sha512_finish_ret's output parameter is declared as a
3408 * 64-byte buffer, but sice we're using SHA-384, we know that the
3409 * output fits in 48 bytes. This is correct C, but GCC 11.1 warns
3410 * about it.
Rodrigo Dias Corread596ca82020-11-25 00:42:28 -03003411 */
Gilles Peskinebb66dac2021-05-13 00:00:45 +02003412#if defined(__GNUC__) && __GNUC__ >= 11
3413#pragma GCC diagnostic push
3414#pragma GCC diagnostic ignored "-Wstringop-overflow"
3415#endif
3416 mbedtls_sha512_finish_ret( &sha512, padbuf );
3417#if defined(__GNUC__) && __GNUC__ >= 11
3418#pragma GCC diagnostic pop
3419#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00003420
Andrzej Kurekeb342242019-01-29 09:14:33 -05003421 mbedtls_sha512_free( &sha512 );
3422#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00003423
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003424 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00003425 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003426
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003427 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003428
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003429 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003430
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003431 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003432}
Gilles Peskined2d59372021-05-12 22:43:27 +02003433#endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003434#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +00003435
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00003436void mbedtls_ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00003437{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003438 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup: final free" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003439
3440 /*
3441 * Free our handshake params
3442 */
Gilles Peskine9b562d52018-04-25 20:32:43 +02003443 mbedtls_ssl_handshake_free( ssl );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003444 mbedtls_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00003445 ssl->handshake = NULL;
3446
3447 /*
Shaun Case0e7791f2021-12-20 21:14:10 -08003448 * Free the previous transform and switch in the current one
Paul Bakker48916f92012-09-16 19:57:18 +00003449 */
3450 if( ssl->transform )
3451 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003452 mbedtls_ssl_transform_free( ssl->transform );
3453 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003454 }
3455 ssl->transform = ssl->transform_negotiate;
3456 ssl->transform_negotiate = NULL;
3457
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003458 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup: final free" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003459}
3460
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003461void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003462{
3463 int resume = ssl->handshake->resume;
3464
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003465 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003467#if defined(MBEDTLS_SSL_RENEGOTIATION)
3468 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003469 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003470 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE;
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003471 ssl->renego_records_seen = 0;
3472 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003473#endif
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003474
3475 /*
3476 * Free the previous session and switch in the current one
3477 */
Paul Bakker0a597072012-09-25 21:55:46 +00003478 if( ssl->session )
3479 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003480#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard1a034732014-11-04 17:36:18 +01003481 /* RFC 7366 3.1: keep the EtM state */
3482 ssl->session_negotiate->encrypt_then_mac =
3483 ssl->session->encrypt_then_mac;
3484#endif
3485
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003486 mbedtls_ssl_session_free( ssl->session );
3487 mbedtls_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00003488 }
3489 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00003490 ssl->session_negotiate = NULL;
3491
Paul Bakker0a597072012-09-25 21:55:46 +00003492 /*
3493 * Add cache entry
3494 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003495 if( ssl->conf->f_set_cache != NULL &&
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02003496 ssl->session->id_len != 0 &&
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02003497 resume == 0 )
3498 {
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01003499 if( ssl->conf->f_set_cache( ssl->conf->p_cache, ssl->session ) != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003500 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02003501 }
Paul Bakker0a597072012-09-25 21:55:46 +00003502
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003503#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003504 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003505 ssl->handshake->flight != NULL )
3506 {
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02003507 /* Cancel handshake timer */
Hanno Becker0f57a652020-02-05 10:37:26 +00003508 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02003509
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003510 /* Keep last flight around in case we need to resend it:
3511 * we need the handshake and transform structures for that */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003512 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip freeing handshake and transform" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003513 }
3514 else
3515#endif
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00003516 mbedtls_ssl_handshake_wrapup_free_hs_transform( ssl );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003517
Paul Bakker48916f92012-09-16 19:57:18 +00003518 ssl->state++;
3519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003520 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003521}
3522
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003523int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003524{
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003525 int ret, hash_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003526
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003527 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003528
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00003529 mbedtls_ssl_update_out_pointers( ssl, ssl->transform_negotiate );
Paul Bakker92be97b2013-01-02 17:30:03 +01003530
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003531 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003532
Manuel Pégourié-Gonnard214a8482016-02-22 11:27:26 +01003533 /*
3534 * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites
3535 * may define some other value. Currently (early 2016), no defined
3536 * ciphersuite does this (and this is unlikely to change as activity has
3537 * moved to TLS 1.3 now) so we can keep the hardcoded 12 here.
3538 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003539 hash_len = ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) ? 36 : 12;
Paul Bakker5121ce52009-01-03 21:22:43 +00003540
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003541#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00003542 ssl->verify_data_len = hash_len;
3543 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003544#endif
Paul Bakker48916f92012-09-16 19:57:18 +00003545
Paul Bakker5121ce52009-01-03 21:22:43 +00003546 ssl->out_msglen = 4 + hash_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003547 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3548 ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003549
3550 /*
3551 * In case of session resuming, invert the client and server
3552 * ChangeCipherSpec messages order.
3553 */
Paul Bakker0a597072012-09-25 21:55:46 +00003554 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003555 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003556#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003557 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003558 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01003559#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003560#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003561 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003562 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01003563#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003564 }
3565 else
3566 ssl->state++;
3567
Paul Bakker48916f92012-09-16 19:57:18 +00003568 /*
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02003569 * Switch to our negotiated transform and session parameters for outbound
3570 * data.
Paul Bakker48916f92012-09-16 19:57:18 +00003571 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003572 MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
Manuel Pégourié-Gonnard5afb1672014-02-16 18:33:22 +01003573
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003574#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003575 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003576 {
3577 unsigned char i;
3578
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003579 /* Remember current epoch settings for resending */
3580 ssl->handshake->alt_transform_out = ssl->transform_out;
Hanno Becker19859472018-08-06 09:40:20 +01003581 memcpy( ssl->handshake->alt_out_ctr, ssl->cur_out_ctr, 8 );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003582
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003583 /* Set sequence_number to zero */
Hanno Becker19859472018-08-06 09:40:20 +01003584 memset( ssl->cur_out_ctr + 2, 0, 6 );
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003585
3586 /* Increment epoch */
3587 for( i = 2; i > 0; i-- )
Hanno Becker19859472018-08-06 09:40:20 +01003588 if( ++ssl->cur_out_ctr[i - 1] != 0 )
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003589 break;
3590
3591 /* The loop goes to its end iff the counter is wrapping */
3592 if( i == 0 )
3593 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003594 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) );
3595 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003596 }
3597 }
3598 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003599#endif /* MBEDTLS_SSL_PROTO_DTLS */
Hanno Becker19859472018-08-06 09:40:20 +01003600 memset( ssl->cur_out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003601
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003602 ssl->transform_out = ssl->transform_negotiate;
3603 ssl->session_out = ssl->session_negotiate;
3604
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003605#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
3606 if( mbedtls_ssl_hw_record_activate != NULL )
Paul Bakker07eb38b2012-12-19 14:42:06 +01003607 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003608 if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 )
Paul Bakker07eb38b2012-12-19 14:42:06 +01003609 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003610 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret );
3611 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Paul Bakker07eb38b2012-12-19 14:42:06 +01003612 }
3613 }
3614#endif
3615
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003616#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003617 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003618 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003619#endif
3620
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003621 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003622 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003623 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003624 return( ret );
3625 }
3626
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003627#if defined(MBEDTLS_SSL_PROTO_DTLS)
3628 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3629 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
3630 {
3631 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
3632 return( ret );
3633 }
3634#endif
3635
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003636 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003637
3638 return( 0 );
3639}
3640
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003641#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00003642#define SSL_MAX_HASH_LEN 36
3643#else
3644#define SSL_MAX_HASH_LEN 12
3645#endif
3646
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003647int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003648{
Janos Follath865b3eb2019-12-16 11:46:15 +00003649 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003650 unsigned int hash_len;
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00003651 unsigned char buf[SSL_MAX_HASH_LEN];
Paul Bakker5121ce52009-01-03 21:22:43 +00003652
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003653 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003654
Gilles Peskine622d8042021-12-13 14:38:40 +01003655 /* There is currently no ciphersuite using another length with TLS 1.2 */
3656#if defined(MBEDTLS_SSL_PROTO_SSL3)
3657 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
3658 hash_len = 36;
3659 else
3660#endif
3661 hash_len = 12;
3662
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003663 ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003664
Hanno Becker327c93b2018-08-15 13:56:18 +01003665 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003666 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003667 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Gilles Peskinef91b2e52021-12-13 12:36:15 +01003668 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00003669 }
3670
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003671 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003672 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003673 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003674 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3675 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Gilles Peskinef91b2e52021-12-13 12:36:15 +01003676 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
3677 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00003678 }
3679
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003680 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED ||
3681 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003682 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003683 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003684 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3685 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Gilles Peskinef91b2e52021-12-13 12:36:15 +01003686 ret = MBEDTLS_ERR_SSL_BAD_HS_FINISHED;
3687 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00003688 }
3689
Gabor Mezei18a44942021-10-20 11:59:27 +02003690 if( mbedtls_ct_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ),
Manuel Pégourié-Gonnard4abc3272014-09-10 12:02:46 +00003691 buf, hash_len ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003692 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003693 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003694 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Dave Rodgmandd5f6242021-06-28 21:58:56 +01003695 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );
Gilles Peskinef91b2e52021-12-13 12:36:15 +01003696 ret = MBEDTLS_ERR_SSL_BAD_HS_FINISHED;
3697 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00003698 }
3699
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003700#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00003701 ssl->verify_data_len = hash_len;
3702 memcpy( ssl->peer_verify_data, buf, hash_len );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003703#endif
Paul Bakker48916f92012-09-16 19:57:18 +00003704
Paul Bakker0a597072012-09-25 21:55:46 +00003705 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003706 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003707#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003708 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003709 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01003710#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003711#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003712 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003713 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01003714#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003715 }
3716 else
3717 ssl->state++;
3718
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003719#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003720 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003721 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003722#endif
3723
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003724 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003725
Gilles Peskinef91b2e52021-12-13 12:36:15 +01003726exit:
3727 mbedtls_platform_zeroize( buf, hash_len );
3728 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003729}
3730
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003731static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003732{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003733 memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003734
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003735#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3736 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3737 mbedtls_md5_init( &handshake->fin_md5 );
3738 mbedtls_sha1_init( &handshake->fin_sha1 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003739 mbedtls_md5_starts_ret( &handshake->fin_md5 );
3740 mbedtls_sha1_starts_ret( &handshake->fin_sha1 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003741#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003742#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3743#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05003744#if defined(MBEDTLS_USE_PSA_CRYPTO)
3745 handshake->fin_sha256_psa = psa_hash_operation_init();
3746 psa_hash_setup( &handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
3747#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003748 mbedtls_sha256_init( &handshake->fin_sha256 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003749 mbedtls_sha256_starts_ret( &handshake->fin_sha256, 0 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003750#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05003751#endif
Gilles Peskined2d59372021-05-12 22:43:27 +02003752#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Andrzej Kurekeb342242019-01-29 09:14:33 -05003753#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05003754 handshake->fin_sha384_psa = psa_hash_operation_init();
3755 psa_hash_setup( &handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003756#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003757 mbedtls_sha512_init( &handshake->fin_sha512 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003758 mbedtls_sha512_starts_ret( &handshake->fin_sha512, 1 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003759#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05003760#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003761#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003762
3763 handshake->update_checksum = ssl_update_checksum_start;
Hanno Becker7e5437a2017-04-28 17:15:26 +01003764
3765#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01003766 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01003767 mbedtls_ssl_sig_hash_set_init( &handshake->hash_algs );
3768#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003769
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003770#if defined(MBEDTLS_DHM_C)
3771 mbedtls_dhm_init( &handshake->dhm_ctx );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003772#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003773#if defined(MBEDTLS_ECDH_C)
3774 mbedtls_ecdh_init( &handshake->ecdh_ctx );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003775#endif
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02003776#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02003777 mbedtls_ecjpake_init( &handshake->ecjpake_ctx );
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02003778#if defined(MBEDTLS_SSL_CLI_C)
3779 handshake->ecjpake_cache = NULL;
3780 handshake->ecjpake_cache_len = 0;
3781#endif
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02003782#endif
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02003783
Gilles Peskineeccd8882020-03-10 12:19:08 +01003784#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard6b7301c2017-08-15 12:08:45 +02003785 mbedtls_x509_crt_restart_init( &handshake->ecrs_ctx );
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003786#endif
3787
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02003788#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
3789 handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
3790#endif
Hanno Becker75173122019-02-06 16:18:31 +00003791
3792#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
3793 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3794 mbedtls_pk_init( &handshake->peer_pubkey );
3795#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003796}
3797
Hanno Beckera18d1322018-01-03 14:27:32 +00003798void mbedtls_ssl_transform_init( mbedtls_ssl_transform *transform )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003799{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003800 memset( transform, 0, sizeof(mbedtls_ssl_transform) );
Paul Bakker84bbeb52014-07-01 14:53:22 +02003801
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003802 mbedtls_cipher_init( &transform->cipher_ctx_enc );
3803 mbedtls_cipher_init( &transform->cipher_ctx_dec );
Paul Bakker84bbeb52014-07-01 14:53:22 +02003804
Hanno Beckerd56ed242018-01-03 15:32:51 +00003805#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003806 mbedtls_md_init( &transform->md_ctx_enc );
3807 mbedtls_md_init( &transform->md_ctx_dec );
Hanno Beckerd56ed242018-01-03 15:32:51 +00003808#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003809}
3810
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003811void mbedtls_ssl_session_init( mbedtls_ssl_session *session )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003812{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003813 memset( session, 0, sizeof(mbedtls_ssl_session) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003814}
3815
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02003816MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003817static int ssl_handshake_init( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00003818{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003819 /* Clear old handshake information if present */
Paul Bakker48916f92012-09-16 19:57:18 +00003820 if( ssl->transform_negotiate )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003821 mbedtls_ssl_transform_free( ssl->transform_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003822 if( ssl->session_negotiate )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003823 mbedtls_ssl_session_free( ssl->session_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003824 if( ssl->handshake )
Gilles Peskine9b562d52018-04-25 20:32:43 +02003825 mbedtls_ssl_handshake_free( ssl );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003826
3827 /*
3828 * Either the pointers are now NULL or cleared properly and can be freed.
3829 * Now allocate missing structures.
3830 */
3831 if( ssl->transform_negotiate == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003832 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02003833 ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003834 }
Paul Bakker48916f92012-09-16 19:57:18 +00003835
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003836 if( ssl->session_negotiate == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003837 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02003838 ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003839 }
Paul Bakker48916f92012-09-16 19:57:18 +00003840
Paul Bakker82788fb2014-10-20 13:59:19 +02003841 if( ssl->handshake == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003842 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02003843 ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003844 }
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003845#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3846 /* If the buffers are too small - reallocate */
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003847
Andrzej Kurek4a063792020-10-21 15:08:44 +02003848 handle_buffer_resizing( ssl, 0, MBEDTLS_SSL_IN_BUFFER_LEN,
3849 MBEDTLS_SSL_OUT_BUFFER_LEN );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003850#endif
Paul Bakker48916f92012-09-16 19:57:18 +00003851
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003852 /* All pointers should exist and can be directly freed without issue */
Paul Bakker48916f92012-09-16 19:57:18 +00003853 if( ssl->handshake == NULL ||
3854 ssl->transform_negotiate == NULL ||
3855 ssl->session_negotiate == NULL )
3856 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02003857 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc() of ssl sub-contexts failed" ) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003858
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003859 mbedtls_free( ssl->handshake );
3860 mbedtls_free( ssl->transform_negotiate );
3861 mbedtls_free( ssl->session_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003862
3863 ssl->handshake = NULL;
3864 ssl->transform_negotiate = NULL;
3865 ssl->session_negotiate = NULL;
3866
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02003867 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker48916f92012-09-16 19:57:18 +00003868 }
3869
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003870 /* Initialize structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003871 mbedtls_ssl_session_init( ssl->session_negotiate );
Hanno Beckera18d1322018-01-03 14:27:32 +00003872 mbedtls_ssl_transform_init( ssl->transform_negotiate );
Paul Bakker968afaa2014-07-09 11:09:24 +02003873 ssl_handshake_params_init( ssl->handshake );
3874
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003875#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02003876 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
3877 {
3878 ssl->handshake->alt_transform_out = ssl->transform_out;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003879
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02003880 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
3881 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
3882 else
3883 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02003884
Hanno Becker0f57a652020-02-05 10:37:26 +00003885 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02003886 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003887#endif
3888
Paul Bakker48916f92012-09-16 19:57:18 +00003889 return( 0 );
3890}
3891
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02003892#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02003893/* Dummy cookie callbacks for defaults */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02003894MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02003895static int ssl_cookie_write_dummy( void *ctx,
3896 unsigned char **p, unsigned char *end,
3897 const unsigned char *cli_id, size_t cli_id_len )
3898{
3899 ((void) ctx);
3900 ((void) p);
3901 ((void) end);
3902 ((void) cli_id);
3903 ((void) cli_id_len);
3904
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003905 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02003906}
3907
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02003908MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02003909static int ssl_cookie_check_dummy( void *ctx,
3910 const unsigned char *cookie, size_t cookie_len,
3911 const unsigned char *cli_id, size_t cli_id_len )
3912{
3913 ((void) ctx);
3914 ((void) cookie);
3915 ((void) cookie_len);
3916 ((void) cli_id);
3917 ((void) cli_id_len);
3918
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003919 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02003920}
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02003921#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02003922
Paul Bakker5121ce52009-01-03 21:22:43 +00003923/*
3924 * Initialize an SSL context
3925 */
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02003926void mbedtls_ssl_init( mbedtls_ssl_context *ssl )
3927{
3928 memset( ssl, 0, sizeof( mbedtls_ssl_context ) );
3929}
3930
3931/*
3932 * Setup an SSL context
3933 */
Hanno Becker2a43f6f2018-08-10 11:12:52 +01003934
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02003935int mbedtls_ssl_setup( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +02003936 const mbedtls_ssl_config *conf )
Paul Bakker5121ce52009-01-03 21:22:43 +00003937{
Janos Follath865b3eb2019-12-16 11:46:15 +00003938 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Darryl Greenb33cc762019-11-28 14:29:44 +00003939 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
3940 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
Paul Bakker5121ce52009-01-03 21:22:43 +00003941
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02003942 ssl->conf = conf;
Paul Bakker62f2dee2012-09-28 07:31:51 +00003943
3944 /*
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01003945 * Prepare base structures
Paul Bakker62f2dee2012-09-28 07:31:51 +00003946 */
k-stachowiakc9a5f022018-07-24 13:53:31 +02003947
3948 /* Set to NULL in case of an error condition */
3949 ssl->out_buf = NULL;
k-stachowiaka47911c2018-07-04 17:41:58 +02003950
Darryl Greenb33cc762019-11-28 14:29:44 +00003951#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3952 ssl->in_buf_len = in_buf_len;
3953#endif
3954 ssl->in_buf = mbedtls_calloc( 1, in_buf_len );
Angus Grattond8213d02016-05-25 20:56:48 +10003955 if( ssl->in_buf == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003956 {
Paul Elliottd48d5c62021-01-07 14:47:05 +00003957 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", in_buf_len ) );
k-stachowiak9f7798e2018-07-31 16:52:32 +02003958 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02003959 goto error;
Angus Grattond8213d02016-05-25 20:56:48 +10003960 }
3961
Darryl Greenb33cc762019-11-28 14:29:44 +00003962#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3963 ssl->out_buf_len = out_buf_len;
3964#endif
3965 ssl->out_buf = mbedtls_calloc( 1, out_buf_len );
Angus Grattond8213d02016-05-25 20:56:48 +10003966 if( ssl->out_buf == NULL )
3967 {
Paul Elliottd48d5c62021-01-07 14:47:05 +00003968 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", out_buf_len ) );
k-stachowiak9f7798e2018-07-31 16:52:32 +02003969 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02003970 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00003971 }
3972
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00003973 mbedtls_ssl_reset_in_out_pointers( ssl );
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02003974
Johan Pascalb62bb512015-12-03 21:56:45 +01003975#if defined(MBEDTLS_SSL_DTLS_SRTP)
Ron Eldor3adb9922017-12-21 10:15:08 +02003976 memset( &ssl->dtls_srtp_info, 0, sizeof(ssl->dtls_srtp_info) );
Johan Pascalb62bb512015-12-03 21:56:45 +01003977#endif
3978
Paul Bakker48916f92012-09-16 19:57:18 +00003979 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
k-stachowiaka47911c2018-07-04 17:41:58 +02003980 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00003981
3982 return( 0 );
k-stachowiaka47911c2018-07-04 17:41:58 +02003983
3984error:
3985 mbedtls_free( ssl->in_buf );
3986 mbedtls_free( ssl->out_buf );
3987
3988 ssl->conf = NULL;
3989
Darryl Greenb33cc762019-11-28 14:29:44 +00003990#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3991 ssl->in_buf_len = 0;
3992 ssl->out_buf_len = 0;
3993#endif
k-stachowiaka47911c2018-07-04 17:41:58 +02003994 ssl->in_buf = NULL;
3995 ssl->out_buf = NULL;
3996
3997 ssl->in_hdr = NULL;
3998 ssl->in_ctr = NULL;
3999 ssl->in_len = NULL;
4000 ssl->in_iv = NULL;
4001 ssl->in_msg = NULL;
4002
4003 ssl->out_hdr = NULL;
4004 ssl->out_ctr = NULL;
4005 ssl->out_len = NULL;
4006 ssl->out_iv = NULL;
4007 ssl->out_msg = NULL;
4008
k-stachowiak9f7798e2018-07-31 16:52:32 +02004009 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004010}
4011
4012/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00004013 * Reset an initialized and used SSL context for re-use while retaining
4014 * all application-set variables, function pointers and data.
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02004015 *
4016 * If partial is non-zero, keep data in the input buffer and client ID.
4017 * (Use when a DTLS client reconnects from the same port.)
Paul Bakker7eb013f2011-10-06 12:37:39 +00004018 */
Hanno Becker43aefe22020-02-05 10:44:56 +00004019int mbedtls_ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial )
Paul Bakker7eb013f2011-10-06 12:37:39 +00004020{
Janos Follath865b3eb2019-12-16 11:46:15 +00004021 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Darryl Greenb33cc762019-11-28 14:29:44 +00004022#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
4023 size_t in_buf_len = ssl->in_buf_len;
4024 size_t out_buf_len = ssl->out_buf_len;
4025#else
4026 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
4027 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
4028#endif
Paul Bakker48916f92012-09-16 19:57:18 +00004029
Hanno Becker7e772132018-08-10 12:38:21 +01004030#if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || \
4031 !defined(MBEDTLS_SSL_SRV_C)
4032 ((void) partial);
4033#endif
4034
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004035 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01004036
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02004037 /* Cancel any possibly running timer */
Hanno Becker0f57a652020-02-05 10:37:26 +00004038 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02004039
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004040#if defined(MBEDTLS_SSL_RENEGOTIATION)
4041 ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01004042 ssl->renego_records_seen = 0;
Paul Bakker48916f92012-09-16 19:57:18 +00004043
4044 ssl->verify_data_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004045 memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
4046 memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01004047#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004048 ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +00004049
Paul Bakker7eb013f2011-10-06 12:37:39 +00004050 ssl->in_offt = NULL;
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00004051 mbedtls_ssl_reset_in_out_pointers( ssl );
Paul Bakker7eb013f2011-10-06 12:37:39 +00004052
4053 ssl->in_msgtype = 0;
4054 ssl->in_msglen = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004055#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02004056 ssl->next_record_offset = 0;
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02004057 ssl->in_epoch = 0;
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02004058#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004059#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Hanno Becker7e8e6a62020-02-05 10:45:48 +00004060 mbedtls_ssl_dtls_replay_reset( ssl );
Manuel Pégourié-Gonnardb47368a2014-09-24 13:29:58 +02004061#endif
Paul Bakker7eb013f2011-10-06 12:37:39 +00004062
4063 ssl->in_hslen = 0;
4064 ssl->nb_zero = 0;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01004065
4066 ssl->keep_current_message = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00004067
4068 ssl->out_msgtype = 0;
4069 ssl->out_msglen = 0;
4070 ssl->out_left = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004071#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
4072 if( ssl->split_done != MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED )
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01004073 ssl->split_done = 0;
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01004074#endif
Paul Bakker7eb013f2011-10-06 12:37:39 +00004075
Hanno Becker19859472018-08-06 09:40:20 +01004076 memset( ssl->cur_out_ctr, 0, sizeof( ssl->cur_out_ctr ) );
4077
Paul Bakker48916f92012-09-16 19:57:18 +00004078 ssl->transform_in = NULL;
4079 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00004080
Hanno Becker78640902018-08-13 16:35:15 +01004081 ssl->session_in = NULL;
4082 ssl->session_out = NULL;
4083
Darryl Greenb33cc762019-11-28 14:29:44 +00004084 memset( ssl->out_buf, 0, out_buf_len );
Hanno Becker4ccbf062018-08-10 11:20:38 +01004085
4086#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02004087 if( partial == 0 )
Hanno Becker4ccbf062018-08-10 11:20:38 +01004088#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */
4089 {
4090 ssl->in_left = 0;
Darryl Greenb33cc762019-11-28 14:29:44 +00004091 memset( ssl->in_buf, 0, in_buf_len );
Hanno Becker4ccbf062018-08-10 11:20:38 +01004092 }
Paul Bakker05ef8352012-05-08 09:17:57 +00004093
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004094#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
4095 if( mbedtls_ssl_hw_record_reset != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00004096 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004097 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_reset()" ) );
4098 if( ( ret = mbedtls_ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00004099 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004100 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_reset", ret );
4101 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Paul Bakker2770fbd2012-07-03 13:30:23 +00004102 }
Paul Bakker05ef8352012-05-08 09:17:57 +00004103 }
4104#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00004105
Paul Bakker48916f92012-09-16 19:57:18 +00004106 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00004107 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004108 mbedtls_ssl_transform_free( ssl->transform );
4109 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00004110 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00004111 }
Paul Bakker48916f92012-09-16 19:57:18 +00004112
Paul Bakkerc0463502013-02-14 11:19:38 +01004113 if( ssl->session )
4114 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004115 mbedtls_ssl_session_free( ssl->session );
4116 mbedtls_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01004117 ssl->session = NULL;
4118 }
4119
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004120#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004121 ssl->alpn_chosen = NULL;
4122#endif
4123
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02004124#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Hanno Becker4ccbf062018-08-10 11:20:38 +01004125#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE)
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02004126 if( partial == 0 )
Hanno Becker4ccbf062018-08-10 11:20:38 +01004127#endif
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02004128 {
4129 mbedtls_free( ssl->cli_id );
4130 ssl->cli_id = NULL;
4131 ssl->cli_id_len = 0;
4132 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02004133#endif
4134
Paul Bakker48916f92012-09-16 19:57:18 +00004135 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
4136 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00004137
4138 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00004139}
4140
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02004141/*
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02004142 * Reset an initialized and used SSL context for re-use while retaining
4143 * all application-set variables, function pointers and data.
4144 */
4145int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl )
4146{
Hanno Becker43aefe22020-02-05 10:44:56 +00004147 return( mbedtls_ssl_session_reset_int( ssl, 0 ) );
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02004148}
4149
4150/*
Paul Bakker5121ce52009-01-03 21:22:43 +00004151 * SSL set accessors
4152 */
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004153void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint )
Paul Bakker5121ce52009-01-03 21:22:43 +00004154{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004155 conf->endpoint = endpoint;
Paul Bakker5121ce52009-01-03 21:22:43 +00004156}
4157
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02004158void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport )
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01004159{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004160 conf->transport = transport;
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01004161}
4162
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004163#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004164void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode )
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02004165{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004166 conf->anti_replay = mode;
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02004167}
4168#endif
4169
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004170#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004171void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit )
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02004172{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004173 conf->badmac_limit = limit;
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02004174}
4175#endif
4176
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004177#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker04da1892018-08-14 13:22:10 +01004178
Hanno Becker1841b0a2018-08-24 11:13:57 +01004179void mbedtls_ssl_set_datagram_packing( mbedtls_ssl_context *ssl,
4180 unsigned allow_packing )
Hanno Becker04da1892018-08-14 13:22:10 +01004181{
4182 ssl->disable_datagram_packing = !allow_packing;
4183}
4184
4185void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf,
4186 uint32_t min, uint32_t max )
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02004187{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004188 conf->hs_timeout_min = min;
4189 conf->hs_timeout_max = max;
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02004190}
4191#endif
4192
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004193void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode )
Paul Bakker5121ce52009-01-03 21:22:43 +00004194{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004195 conf->authmode = authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00004196}
4197
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004198#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004199void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02004200 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00004201 void *p_vrfy )
4202{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004203 conf->f_vrfy = f_vrfy;
4204 conf->p_vrfy = p_vrfy;
Paul Bakkerb63b0af2011-01-13 17:54:59 +00004205}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004206#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00004207
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004208void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf,
Paul Bakkera3d195c2011-11-27 21:07:34 +00004209 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00004210 void *p_rng )
4211{
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01004212 conf->f_rng = f_rng;
4213 conf->p_rng = p_rng;
Paul Bakker5121ce52009-01-03 21:22:43 +00004214}
4215
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004216void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardfd474232015-06-23 16:34:24 +02004217 void (*f_dbg)(void *, int, const char *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00004218 void *p_dbg )
4219{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004220 conf->f_dbg = f_dbg;
4221 conf->p_dbg = p_dbg;
Paul Bakker5121ce52009-01-03 21:22:43 +00004222}
4223
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004224void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02004225 void *p_bio,
Simon Butchere846b512016-03-01 17:31:49 +00004226 mbedtls_ssl_send_t *f_send,
4227 mbedtls_ssl_recv_t *f_recv,
4228 mbedtls_ssl_recv_timeout_t *f_recv_timeout )
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02004229{
4230 ssl->p_bio = p_bio;
4231 ssl->f_send = f_send;
4232 ssl->f_recv = f_recv;
4233 ssl->f_recv_timeout = f_recv_timeout;
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01004234}
4235
Manuel Pégourié-Gonnard6e7aaca2018-08-20 10:37:23 +02004236#if defined(MBEDTLS_SSL_PROTO_DTLS)
4237void mbedtls_ssl_set_mtu( mbedtls_ssl_context *ssl, uint16_t mtu )
4238{
4239 ssl->mtu = mtu;
4240}
4241#endif
4242
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004243void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout )
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01004244{
4245 conf->read_timeout = timeout;
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02004246}
4247
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02004248void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl,
4249 void *p_timer,
Simon Butchere846b512016-03-01 17:31:49 +00004250 mbedtls_ssl_set_timer_t *f_set_timer,
4251 mbedtls_ssl_get_timer_t *f_get_timer )
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02004252{
4253 ssl->p_timer = p_timer;
4254 ssl->f_set_timer = f_set_timer;
4255 ssl->f_get_timer = f_get_timer;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02004256
4257 /* Make sure we start with no timer running */
Hanno Becker0f57a652020-02-05 10:37:26 +00004258 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02004259}
4260
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004261#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004262void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01004263 void *p_cache,
4264 int (*f_get_cache)(void *, mbedtls_ssl_session *),
4265 int (*f_set_cache)(void *, const mbedtls_ssl_session *) )
Paul Bakker5121ce52009-01-03 21:22:43 +00004266{
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01004267 conf->p_cache = p_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004268 conf->f_get_cache = f_get_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004269 conf->f_set_cache = f_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00004270}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004271#endif /* MBEDTLS_SSL_SRV_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00004272
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004273#if defined(MBEDTLS_SSL_CLI_C)
4274int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00004275{
Janos Follath865b3eb2019-12-16 11:46:15 +00004276 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02004277
4278 if( ssl == NULL ||
4279 session == NULL ||
4280 ssl->session_negotiate == NULL ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02004281 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02004282 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004283 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02004284 }
4285
Hanno Becker52055ae2019-02-06 14:30:46 +00004286 if( ( ret = mbedtls_ssl_session_copy( ssl->session_negotiate,
4287 session ) ) != 0 )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02004288 return( ret );
4289
Paul Bakker0a597072012-09-25 21:55:46 +00004290 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02004291
4292 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00004293}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004294#endif /* MBEDTLS_SSL_CLI_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00004295
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004296void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004297 const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00004298{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004299 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = ciphersuites;
4300 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = ciphersuites;
4301 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = ciphersuites;
4302 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ciphersuites;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02004303}
4304
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004305void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02004306 const int *ciphersuites,
Paul Bakker8f4ddae2013-04-15 15:09:54 +02004307 int major, int minor )
4308{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004309 if( major != MBEDTLS_SSL_MAJOR_VERSION_3 )
Paul Bakker8f4ddae2013-04-15 15:09:54 +02004310 return;
4311
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004312 if( minor < MBEDTLS_SSL_MINOR_VERSION_0 || minor > MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker8f4ddae2013-04-15 15:09:54 +02004313 return;
4314
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004315 conf->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00004316}
4317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004318#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02004319void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf,
Nicholas Wilson2088e2e2015-09-08 16:53:18 +01004320 const mbedtls_x509_crt_profile *profile )
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02004321{
4322 conf->cert_profile = profile;
4323}
4324
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004325/* Append a new keycert entry to a (possibly empty) list */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02004326MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004327static int ssl_append_key_cert( mbedtls_ssl_key_cert **head,
4328 mbedtls_x509_crt *cert,
4329 mbedtls_pk_context *key )
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004330{
niisato8ee24222018-06-25 19:05:48 +09004331 mbedtls_ssl_key_cert *new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004332
niisato8ee24222018-06-25 19:05:48 +09004333 new_cert = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) );
4334 if( new_cert == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02004335 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004336
niisato8ee24222018-06-25 19:05:48 +09004337 new_cert->cert = cert;
4338 new_cert->key = key;
4339 new_cert->next = NULL;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004340
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004341 /* Update head is the list was null, else add to the end */
4342 if( *head == NULL )
Paul Bakker0333b972013-11-04 17:08:28 +01004343 {
niisato8ee24222018-06-25 19:05:48 +09004344 *head = new_cert;
Paul Bakker0333b972013-11-04 17:08:28 +01004345 }
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004346 else
4347 {
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004348 mbedtls_ssl_key_cert *cur = *head;
4349 while( cur->next != NULL )
4350 cur = cur->next;
niisato8ee24222018-06-25 19:05:48 +09004351 cur->next = new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004352 }
4353
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004354 return( 0 );
4355}
4356
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004357int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004358 mbedtls_x509_crt *own_cert,
4359 mbedtls_pk_context *pk_key )
4360{
Manuel Pégourié-Gonnard17a40cd2015-05-10 23:17:17 +02004361 return( ssl_append_key_cert( &conf->key_cert, own_cert, pk_key ) );
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004362}
4363
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004364void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01004365 mbedtls_x509_crt *ca_chain,
4366 mbedtls_x509_crl *ca_crl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004367{
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01004368 conf->ca_chain = ca_chain;
4369 conf->ca_crl = ca_crl;
Hanno Becker5adaad92019-03-27 16:54:37 +00004370
4371#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
4372 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
4373 * cannot be used together. */
4374 conf->f_ca_cb = NULL;
4375 conf->p_ca_cb = NULL;
4376#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
Paul Bakker5121ce52009-01-03 21:22:43 +00004377}
Hanno Becker5adaad92019-03-27 16:54:37 +00004378
4379#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
4380void mbedtls_ssl_conf_ca_cb( mbedtls_ssl_config *conf,
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00004381 mbedtls_x509_crt_ca_cb_t f_ca_cb,
Hanno Becker5adaad92019-03-27 16:54:37 +00004382 void *p_ca_cb )
4383{
4384 conf->f_ca_cb = f_ca_cb;
4385 conf->p_ca_cb = p_ca_cb;
4386
4387 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
4388 * cannot be used together. */
4389 conf->ca_chain = NULL;
4390 conf->ca_crl = NULL;
4391}
4392#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004393#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00004394
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02004395#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
4396int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl,
4397 mbedtls_x509_crt *own_cert,
4398 mbedtls_pk_context *pk_key )
4399{
4400 return( ssl_append_key_cert( &ssl->handshake->sni_key_cert,
4401 own_cert, pk_key ) );
4402}
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02004403
4404void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl,
4405 mbedtls_x509_crt *ca_chain,
4406 mbedtls_x509_crl *ca_crl )
4407{
4408 ssl->handshake->sni_ca_chain = ca_chain;
4409 ssl->handshake->sni_ca_crl = ca_crl;
4410}
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02004411
4412void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl,
4413 int authmode )
4414{
4415 ssl->handshake->sni_authmode = authmode;
4416}
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02004417#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
4418
Hanno Becker8927c832019-04-03 12:52:50 +01004419#if defined(MBEDTLS_X509_CRT_PARSE_C)
4420void mbedtls_ssl_set_verify( mbedtls_ssl_context *ssl,
4421 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
4422 void *p_vrfy )
4423{
4424 ssl->f_vrfy = f_vrfy;
4425 ssl->p_vrfy = p_vrfy;
4426}
4427#endif
4428
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02004429#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02004430/*
4431 * Set EC J-PAKE password for current handshake
4432 */
4433int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,
4434 const unsigned char *pw,
4435 size_t pw_len )
4436{
4437 mbedtls_ecjpake_role role;
4438
Janos Follath8eb64132016-06-03 15:40:57 +01004439 if( ssl->handshake == NULL || ssl->conf == NULL )
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02004440 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4441
4442 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
4443 role = MBEDTLS_ECJPAKE_SERVER;
4444 else
4445 role = MBEDTLS_ECJPAKE_CLIENT;
4446
4447 return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx,
4448 role,
4449 MBEDTLS_MD_SHA256,
4450 MBEDTLS_ECP_DP_SECP256R1,
4451 pw, pw_len ) );
4452}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02004453#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02004454
Gilles Peskineeccd8882020-03-10 12:19:08 +01004455#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004456
4457static void ssl_conf_remove_psk( mbedtls_ssl_config *conf )
4458{
4459 /* Remove reference to existing PSK, if any. */
4460#if defined(MBEDTLS_USE_PSA_CRYPTO)
Ronald Croncf56a0a2020-08-04 09:51:30 +02004461 if( ! mbedtls_svc_key_id_is_null( conf->psk_opaque ) )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004462 {
4463 /* The maintenance of the PSK key slot is the
4464 * user's responsibility. */
Ronald Croncf56a0a2020-08-04 09:51:30 +02004465 conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004466 }
Hanno Beckera63ac3f2018-11-05 12:47:16 +00004467 /* This and the following branch should never
4468 * be taken simultaenously as we maintain the
4469 * invariant that raw and opaque PSKs are never
4470 * configured simultaneously. As a safeguard,
4471 * though, `else` is omitted here. */
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004472#endif /* MBEDTLS_USE_PSA_CRYPTO */
4473 if( conf->psk != NULL )
4474 {
4475 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
4476
4477 mbedtls_free( conf->psk );
4478 conf->psk = NULL;
4479 conf->psk_len = 0;
4480 }
4481
4482 /* Remove reference to PSK identity, if any. */
4483 if( conf->psk_identity != NULL )
4484 {
4485 mbedtls_free( conf->psk_identity );
4486 conf->psk_identity = NULL;
4487 conf->psk_identity_len = 0;
4488 }
4489}
4490
Hanno Becker7390c712018-11-15 13:33:04 +00004491/* This function assumes that PSK identity in the SSL config is unset.
4492 * It checks that the provided identity is well-formed and attempts
4493 * to make a copy of it in the SSL config.
4494 * On failure, the PSK identity in the config remains unset. */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02004495MBEDTLS_CHECK_RETURN_CRITICAL
Hanno Becker7390c712018-11-15 13:33:04 +00004496static int ssl_conf_set_psk_identity( mbedtls_ssl_config *conf,
4497 unsigned char const *psk_identity,
4498 size_t psk_identity_len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02004499{
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02004500 /* Identity len will be encoded on two bytes */
Hanno Becker7390c712018-11-15 13:33:04 +00004501 if( psk_identity == NULL ||
4502 ( psk_identity_len >> 16 ) != 0 ||
Angus Grattond8213d02016-05-25 20:56:48 +10004503 psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02004504 {
4505 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4506 }
4507
Hanno Becker7390c712018-11-15 13:33:04 +00004508 conf->psk_identity = mbedtls_calloc( 1, psk_identity_len );
4509 if( conf->psk_identity == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02004510 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker6db455e2013-09-18 17:29:31 +02004511
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01004512 conf->psk_identity_len = psk_identity_len;
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01004513 memcpy( conf->psk_identity, psk_identity, conf->psk_identity_len );
Paul Bakker5ad403f2013-09-18 21:21:30 +02004514
4515 return( 0 );
Paul Bakker6db455e2013-09-18 17:29:31 +02004516}
4517
Hanno Becker7390c712018-11-15 13:33:04 +00004518int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
4519 const unsigned char *psk, size_t psk_len,
4520 const unsigned char *psk_identity, size_t psk_identity_len )
4521{
Janos Follath865b3eb2019-12-16 11:46:15 +00004522 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker7390c712018-11-15 13:33:04 +00004523 /* Remove opaque/raw PSK + PSK Identity */
4524 ssl_conf_remove_psk( conf );
4525
4526 /* Check and set raw PSK */
Piotr Nowicki9926eaf2019-11-20 14:54:36 +01004527 if( psk == NULL )
Hanno Becker7390c712018-11-15 13:33:04 +00004528 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Piotr Nowicki9926eaf2019-11-20 14:54:36 +01004529 if( psk_len == 0 )
4530 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4531 if( psk_len > MBEDTLS_PSK_MAX_LEN )
4532 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4533
Hanno Becker7390c712018-11-15 13:33:04 +00004534 if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
4535 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
4536 conf->psk_len = psk_len;
4537 memcpy( conf->psk, psk, conf->psk_len );
4538
4539 /* Check and set PSK Identity */
4540 ret = ssl_conf_set_psk_identity( conf, psk_identity, psk_identity_len );
4541 if( ret != 0 )
4542 ssl_conf_remove_psk( conf );
4543
4544 return( ret );
4545}
4546
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004547static void ssl_remove_psk( mbedtls_ssl_context *ssl )
4548{
4549#if defined(MBEDTLS_USE_PSA_CRYPTO)
Ronald Croncf56a0a2020-08-04 09:51:30 +02004550 if( ! mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004551 {
Ronald Croncf56a0a2020-08-04 09:51:30 +02004552 ssl->handshake->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004553 }
4554 else
4555#endif /* MBEDTLS_USE_PSA_CRYPTO */
4556 if( ssl->handshake->psk != NULL )
4557 {
4558 mbedtls_platform_zeroize( ssl->handshake->psk,
4559 ssl->handshake->psk_len );
4560 mbedtls_free( ssl->handshake->psk );
4561 ssl->handshake->psk_len = 0;
4562 }
4563}
4564
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01004565int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl,
4566 const unsigned char *psk, size_t psk_len )
4567{
4568 if( psk == NULL || ssl->handshake == NULL )
4569 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4570
4571 if( psk_len > MBEDTLS_PSK_MAX_LEN )
4572 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4573
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004574 ssl_remove_psk( ssl );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01004575
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02004576 if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02004577 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01004578
4579 ssl->handshake->psk_len = psk_len;
4580 memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len );
4581
4582 return( 0 );
4583}
4584
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004585#if defined(MBEDTLS_USE_PSA_CRYPTO)
4586int mbedtls_ssl_conf_psk_opaque( mbedtls_ssl_config *conf,
Ronald Croncf56a0a2020-08-04 09:51:30 +02004587 psa_key_id_t psk,
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004588 const unsigned char *psk_identity,
4589 size_t psk_identity_len )
4590{
Janos Follath865b3eb2019-12-16 11:46:15 +00004591 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker7390c712018-11-15 13:33:04 +00004592 /* Clear opaque/raw PSK + PSK Identity, if present. */
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004593 ssl_conf_remove_psk( conf );
4594
Hanno Becker7390c712018-11-15 13:33:04 +00004595 /* Check and set opaque PSK */
Ronald Croncf56a0a2020-08-04 09:51:30 +02004596 if( mbedtls_svc_key_id_is_null( psk ) )
Hanno Becker7390c712018-11-15 13:33:04 +00004597 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Ronald Croncf56a0a2020-08-04 09:51:30 +02004598 conf->psk_opaque = psk;
Hanno Becker7390c712018-11-15 13:33:04 +00004599
4600 /* Check and set PSK Identity */
4601 ret = ssl_conf_set_psk_identity( conf, psk_identity,
4602 psk_identity_len );
4603 if( ret != 0 )
4604 ssl_conf_remove_psk( conf );
4605
4606 return( ret );
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004607}
4608
4609int mbedtls_ssl_set_hs_psk_opaque( mbedtls_ssl_context *ssl,
Ronald Croncf56a0a2020-08-04 09:51:30 +02004610 psa_key_id_t psk )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004611{
Ronald Croncf56a0a2020-08-04 09:51:30 +02004612 if( ( mbedtls_svc_key_id_is_null( psk ) ) ||
Ronald Cronc26f8d42020-09-01 10:51:51 +02004613 ( ssl->handshake == NULL ) )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004614 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4615
4616 ssl_remove_psk( ssl );
Ronald Croncf56a0a2020-08-04 09:51:30 +02004617 ssl->handshake->psk_opaque = psk;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004618 return( 0 );
4619}
4620#endif /* MBEDTLS_USE_PSA_CRYPTO */
4621
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004622void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004623 int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *,
Paul Bakker6db455e2013-09-18 17:29:31 +02004624 size_t),
4625 void *p_psk )
4626{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004627 conf->f_psk = f_psk;
4628 conf->p_psk = p_psk;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02004629}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004630#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00004631
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02004632#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Hanno Becker470a8c42017-10-04 15:28:46 +01004633
4634#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004635int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00004636{
Janos Follath865b3eb2019-12-16 11:46:15 +00004637 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00004638
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01004639 if( ( ret = mbedtls_mpi_read_string( &conf->dhm_P, 16, dhm_P ) ) != 0 ||
4640 ( ret = mbedtls_mpi_read_string( &conf->dhm_G, 16, dhm_G ) ) != 0 )
4641 {
4642 mbedtls_mpi_free( &conf->dhm_P );
4643 mbedtls_mpi_free( &conf->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00004644 return( ret );
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01004645 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004646
4647 return( 0 );
4648}
Hanno Becker470a8c42017-10-04 15:28:46 +01004649#endif /* MBEDTLS_DEPRECATED_REMOVED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004650
Hanno Beckera90658f2017-10-04 15:29:08 +01004651int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf,
4652 const unsigned char *dhm_P, size_t P_len,
4653 const unsigned char *dhm_G, size_t G_len )
4654{
Janos Follath865b3eb2019-12-16 11:46:15 +00004655 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Beckera90658f2017-10-04 15:29:08 +01004656
Glenn Straussde081ce2021-12-20 01:43:17 -05004657 mbedtls_mpi_free( &conf->dhm_P );
4658 mbedtls_mpi_free( &conf->dhm_G );
4659
Hanno Beckera90658f2017-10-04 15:29:08 +01004660 if( ( ret = mbedtls_mpi_read_binary( &conf->dhm_P, dhm_P, P_len ) ) != 0 ||
4661 ( ret = mbedtls_mpi_read_binary( &conf->dhm_G, dhm_G, G_len ) ) != 0 )
4662 {
4663 mbedtls_mpi_free( &conf->dhm_P );
4664 mbedtls_mpi_free( &conf->dhm_G );
4665 return( ret );
4666 }
4667
4668 return( 0 );
4669}
Paul Bakker5121ce52009-01-03 21:22:43 +00004670
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004671int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx )
Paul Bakker1b57b062011-01-06 15:48:19 +00004672{
Janos Follath865b3eb2019-12-16 11:46:15 +00004673 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker1b57b062011-01-06 15:48:19 +00004674
Glenn Straussde081ce2021-12-20 01:43:17 -05004675 mbedtls_mpi_free( &conf->dhm_P );
4676 mbedtls_mpi_free( &conf->dhm_G );
4677
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01004678 if( ( ret = mbedtls_mpi_copy( &conf->dhm_P, &dhm_ctx->P ) ) != 0 ||
4679 ( ret = mbedtls_mpi_copy( &conf->dhm_G, &dhm_ctx->G ) ) != 0 )
4680 {
4681 mbedtls_mpi_free( &conf->dhm_P );
4682 mbedtls_mpi_free( &conf->dhm_G );
Paul Bakker1b57b062011-01-06 15:48:19 +00004683 return( ret );
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01004684 }
Paul Bakker1b57b062011-01-06 15:48:19 +00004685
4686 return( 0 );
4687}
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02004688#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00004689
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02004690#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
4691/*
4692 * Set the minimum length for Diffie-Hellman parameters
4693 */
4694void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf,
4695 unsigned int bitlen )
4696{
4697 conf->dhm_min_bitlen = bitlen;
4698}
4699#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */
4700
Gilles Peskineeccd8882020-03-10 12:19:08 +01004701#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02004702/*
4703 * Set allowed/preferred hashes for handshake signatures
4704 */
4705void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf,
4706 const int *hashes )
4707{
4708 conf->sig_hashes = hashes;
4709}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004710#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02004711
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02004712#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01004713/*
4714 * Set the allowed elliptic curves
4715 */
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004716void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004717 const mbedtls_ecp_group_id *curve_list )
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01004718{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004719 conf->curve_list = curve_list;
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01004720}
Hanno Becker947194e2017-04-07 13:25:49 +01004721#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01004722
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01004723#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004724int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00004725{
Hanno Becker947194e2017-04-07 13:25:49 +01004726 /* Initialize to suppress unnecessary compiler warning */
4727 size_t hostname_len = 0;
4728
4729 /* Check if new hostname is valid before
4730 * making any change to current one */
Hanno Becker947194e2017-04-07 13:25:49 +01004731 if( hostname != NULL )
4732 {
4733 hostname_len = strlen( hostname );
4734
4735 if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN )
4736 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4737 }
4738
4739 /* Now it's clear that we will overwrite the old hostname,
4740 * so we can free it safely */
4741
4742 if( ssl->hostname != NULL )
4743 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004744 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
Hanno Becker947194e2017-04-07 13:25:49 +01004745 mbedtls_free( ssl->hostname );
4746 }
4747
4748 /* Passing NULL as hostname shall clear the old one */
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +01004749
Paul Bakker5121ce52009-01-03 21:22:43 +00004750 if( hostname == NULL )
Hanno Becker947194e2017-04-07 13:25:49 +01004751 {
4752 ssl->hostname = NULL;
4753 }
4754 else
4755 {
4756 ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 );
Hanno Becker947194e2017-04-07 13:25:49 +01004757 if( ssl->hostname == NULL )
4758 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02004759
Hanno Becker947194e2017-04-07 13:25:49 +01004760 memcpy( ssl->hostname, hostname, hostname_len );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02004761
Hanno Becker947194e2017-04-07 13:25:49 +01004762 ssl->hostname[hostname_len] = '\0';
4763 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004764
4765 return( 0 );
4766}
Hanno Becker1a9a51c2017-04-07 13:02:16 +01004767#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00004768
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01004769#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004770void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004771 int (*f_sni)(void *, mbedtls_ssl_context *,
Paul Bakker5701cdc2012-09-27 21:49:42 +00004772 const unsigned char *, size_t),
4773 void *p_sni )
4774{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004775 conf->f_sni = f_sni;
4776 conf->p_sni = p_sni;
Paul Bakker5701cdc2012-09-27 21:49:42 +00004777}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004778#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00004779
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004780#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004781int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos )
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004782{
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02004783 size_t cur_len, tot_len;
4784 const char **p;
4785
4786 /*
Brian J Murray1903fb32016-11-06 04:45:15 -08004787 * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings
4788 * MUST NOT be truncated."
4789 * We check lengths now rather than later.
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02004790 */
4791 tot_len = 0;
4792 for( p = protos; *p != NULL; p++ )
4793 {
4794 cur_len = strlen( *p );
4795 tot_len += cur_len;
4796
Ronald Cron8216dd32020-04-23 16:41:44 +02004797 if( ( cur_len == 0 ) ||
4798 ( cur_len > MBEDTLS_SSL_MAX_ALPN_NAME_LEN ) ||
4799 ( tot_len > MBEDTLS_SSL_MAX_ALPN_LIST_LEN ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004800 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02004801 }
4802
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004803 conf->alpn_list = protos;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02004804
4805 return( 0 );
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004806}
4807
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004808const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004809{
Paul Bakkerd8bb8262014-06-17 14:06:49 +02004810 return( ssl->alpn_chosen );
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004811}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004812#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004813
Johan Pascalb62bb512015-12-03 21:56:45 +01004814#if defined(MBEDTLS_SSL_DTLS_SRTP)
Ron Eldoref72faf2018-07-12 11:54:20 +03004815void mbedtls_ssl_conf_srtp_mki_value_supported( mbedtls_ssl_config *conf,
4816 int support_mki_value )
Ron Eldor591f1622018-01-22 12:30:04 +02004817{
4818 conf->dtls_srtp_mki_support = support_mki_value;
4819}
4820
Ron Eldoref72faf2018-07-12 11:54:20 +03004821int mbedtls_ssl_dtls_srtp_set_mki_value( mbedtls_ssl_context *ssl,
4822 unsigned char *mki_value,
Johan Pascalf6417ec2020-09-22 15:15:19 +02004823 uint16_t mki_len )
Ron Eldor591f1622018-01-22 12:30:04 +02004824{
Johan Pascal5ef72d22020-10-28 17:05:47 +01004825 if( mki_len > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH )
Ron Eldora9788042018-12-05 11:04:31 +02004826 {
Johan Pascald576fdb2020-09-22 10:39:53 +02004827 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Ron Eldora9788042018-12-05 11:04:31 +02004828 }
Ron Eldor591f1622018-01-22 12:30:04 +02004829
4830 if( ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED )
Ron Eldora9788042018-12-05 11:04:31 +02004831 {
Johan Pascald576fdb2020-09-22 10:39:53 +02004832 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Ron Eldora9788042018-12-05 11:04:31 +02004833 }
Ron Eldor591f1622018-01-22 12:30:04 +02004834
4835 memcpy( ssl->dtls_srtp_info.mki_value, mki_value, mki_len );
4836 ssl->dtls_srtp_info.mki_len = mki_len;
Ron Eldora9788042018-12-05 11:04:31 +02004837 return( 0 );
Ron Eldor591f1622018-01-22 12:30:04 +02004838}
4839
Ron Eldoref72faf2018-07-12 11:54:20 +03004840int mbedtls_ssl_conf_dtls_srtp_protection_profiles( mbedtls_ssl_config *conf,
Johan Pascal253d0262020-09-22 13:04:45 +02004841 const mbedtls_ssl_srtp_profile *profiles )
Johan Pascalb62bb512015-12-03 21:56:45 +01004842{
Johan Pascal253d0262020-09-22 13:04:45 +02004843 const mbedtls_ssl_srtp_profile *p;
4844 size_t list_size = 0;
Johan Pascalb62bb512015-12-03 21:56:45 +01004845
Johan Pascal253d0262020-09-22 13:04:45 +02004846 /* check the profiles list: all entry must be valid,
4847 * its size cannot be more than the total number of supported profiles, currently 4 */
Johan Pascald387aa02020-09-23 18:47:56 +02004848 for( p = profiles; *p != MBEDTLS_TLS_SRTP_UNSET &&
4849 list_size <= MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH;
4850 p++ )
Johan Pascald576fdb2020-09-22 10:39:53 +02004851 {
Johan Pascal5ef72d22020-10-28 17:05:47 +01004852 if( mbedtls_ssl_check_srtp_profile_value( *p ) != MBEDTLS_TLS_SRTP_UNSET )
Johan Pascald576fdb2020-09-22 10:39:53 +02004853 {
Johan Pascal76fdf1d2020-10-22 23:31:00 +02004854 list_size++;
4855 }
4856 else
4857 {
4858 /* unsupported value, stop parsing and set the size to an error value */
4859 list_size = MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH + 1;
Johan Pascalb62bb512015-12-03 21:56:45 +01004860 }
4861 }
4862
Johan Pascal5ef72d22020-10-28 17:05:47 +01004863 if( list_size > MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH )
Johan Pascald387aa02020-09-23 18:47:56 +02004864 {
Johan Pascal253d0262020-09-22 13:04:45 +02004865 conf->dtls_srtp_profile_list = NULL;
4866 conf->dtls_srtp_profile_list_len = 0;
4867 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4868 }
4869
Johan Pascal9bc97ca2020-09-21 23:44:45 +02004870 conf->dtls_srtp_profile_list = profiles;
Johan Pascal253d0262020-09-22 13:04:45 +02004871 conf->dtls_srtp_profile_list_len = list_size;
Johan Pascalb62bb512015-12-03 21:56:45 +01004872
4873 return( 0 );
4874}
4875
Johan Pascal5ef72d22020-10-28 17:05:47 +01004876void mbedtls_ssl_get_dtls_srtp_negotiation_result( const mbedtls_ssl_context *ssl,
4877 mbedtls_dtls_srtp_info *dtls_srtp_info )
Johan Pascalb62bb512015-12-03 21:56:45 +01004878{
Johan Pascal2258a4f2020-10-28 13:53:09 +01004879 dtls_srtp_info->chosen_dtls_srtp_profile = ssl->dtls_srtp_info.chosen_dtls_srtp_profile;
4880 /* do not copy the mki value if there is no chosen profile */
Johan Pascal5ef72d22020-10-28 17:05:47 +01004881 if( dtls_srtp_info->chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET )
Johan Pascal0dbcd1d2020-10-28 11:03:07 +01004882 {
Johan Pascal2258a4f2020-10-28 13:53:09 +01004883 dtls_srtp_info->mki_len = 0;
Johan Pascal0dbcd1d2020-10-28 11:03:07 +01004884 }
Johan Pascal2258a4f2020-10-28 13:53:09 +01004885 else
4886 {
4887 dtls_srtp_info->mki_len = ssl->dtls_srtp_info.mki_len;
Johan Pascal5ef72d22020-10-28 17:05:47 +01004888 memcpy( dtls_srtp_info->mki_value, ssl->dtls_srtp_info.mki_value,
4889 ssl->dtls_srtp_info.mki_len );
Johan Pascal2258a4f2020-10-28 13:53:09 +01004890 }
Johan Pascalb62bb512015-12-03 21:56:45 +01004891}
Johan Pascalb62bb512015-12-03 21:56:45 +01004892#endif /* MBEDTLS_SSL_DTLS_SRTP */
4893
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02004894void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor )
Paul Bakker490ecc82011-10-06 13:04:09 +00004895{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004896 conf->max_major_ver = major;
4897 conf->max_minor_ver = minor;
Paul Bakker490ecc82011-10-06 13:04:09 +00004898}
4899
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02004900void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor )
Paul Bakker1d29fb52012-09-28 13:28:45 +00004901{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004902 conf->min_major_ver = major;
4903 conf->min_minor_ver = minor;
Paul Bakker1d29fb52012-09-28 13:28:45 +00004904}
4905
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004906#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004907void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback )
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02004908{
Manuel Pégourié-Gonnard684b0592015-05-06 09:27:31 +01004909 conf->fallback = fallback;
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02004910}
4911#endif
4912
Janos Follath088ce432017-04-10 12:42:31 +01004913#if defined(MBEDTLS_SSL_SRV_C)
4914void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf,
4915 char cert_req_ca_list )
4916{
4917 conf->cert_req_ca_list = cert_req_ca_list;
4918}
4919#endif
4920
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004921#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004922void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01004923{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004924 conf->encrypt_then_mac = etm;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01004925}
4926#endif
4927
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004928#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004929void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02004930{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004931 conf->extended_ms = ems;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02004932}
4933#endif
4934
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02004935#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004936void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 )
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01004937{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004938 conf->arc4_disabled = arc4;
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01004939}
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02004940#endif
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01004941
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004942#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004943int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02004944{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004945 if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ||
Angus Grattond8213d02016-05-25 20:56:48 +10004946 ssl_mfl_code_to_length( mfl_code ) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02004947 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004948 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02004949 }
4950
Manuel Pégourié-Gonnard6bf89d62015-05-05 17:01:57 +01004951 conf->mfl_code = mfl_code;
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02004952
4953 return( 0 );
4954}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004955#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02004956
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004957#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02004958void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate )
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02004959{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004960 conf->trunc_hmac = truncate;
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02004961}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004962#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02004963
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004964#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004965void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split )
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01004966{
Manuel Pégourié-Gonnard17eab2b2015-05-05 16:34:53 +01004967 conf->cbc_record_splitting = split;
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01004968}
4969#endif
4970
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004971void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy )
Paul Bakker48916f92012-09-16 19:57:18 +00004972{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004973 conf->allow_legacy_renegotiation = allow_legacy;
Paul Bakker48916f92012-09-16 19:57:18 +00004974}
4975
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004976#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004977void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01004978{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004979 conf->disable_renegotiation = renegotiation;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01004980}
4981
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004982void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records )
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02004983{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004984 conf->renego_max_records = max_records;
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02004985}
4986
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004987void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01004988 const unsigned char period[8] )
4989{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004990 memcpy( conf->renego_period, period, 8 );
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01004991}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004992#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker5121ce52009-01-03 21:22:43 +00004993
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004994#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02004995#if defined(MBEDTLS_SSL_CLI_C)
4996void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets )
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02004997{
Manuel Pégourié-Gonnard2b494452015-05-06 10:05:11 +01004998 conf->session_tickets = use_tickets;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02004999}
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02005000#endif
Paul Bakker606b4ba2013-08-14 16:52:14 +02005001
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02005002#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02005003void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,
5004 mbedtls_ssl_ticket_write_t *f_ticket_write,
5005 mbedtls_ssl_ticket_parse_t *f_ticket_parse,
5006 void *p_ticket )
Paul Bakker606b4ba2013-08-14 16:52:14 +02005007{
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02005008 conf->f_ticket_write = f_ticket_write;
5009 conf->f_ticket_parse = f_ticket_parse;
5010 conf->p_ticket = p_ticket;
Paul Bakker606b4ba2013-08-14 16:52:14 +02005011}
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02005012#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005013#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02005014
Robert Cragie4feb7ae2015-10-02 13:33:37 +01005015#if defined(MBEDTLS_SSL_EXPORT_KEYS)
5016void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf,
5017 mbedtls_ssl_export_keys_t *f_export_keys,
5018 void *p_export_keys )
5019{
5020 conf->f_export_keys = f_export_keys;
5021 conf->p_export_keys = p_export_keys;
5022}
Ron Eldorf5cc10d2019-05-07 18:33:40 +03005023
5024void mbedtls_ssl_conf_export_keys_ext_cb( mbedtls_ssl_config *conf,
5025 mbedtls_ssl_export_keys_ext_t *f_export_keys_ext,
5026 void *p_export_keys )
5027{
5028 conf->f_export_keys_ext = f_export_keys_ext;
5029 conf->p_export_keys = p_export_keys;
5030}
Robert Cragie4feb7ae2015-10-02 13:33:37 +01005031#endif
5032
Gilles Peskineb74a1c72018-04-24 13:09:22 +02005033#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine8bf79f62018-01-05 21:11:53 +01005034void mbedtls_ssl_conf_async_private_cb(
5035 mbedtls_ssl_config *conf,
5036 mbedtls_ssl_async_sign_t *f_async_sign,
5037 mbedtls_ssl_async_decrypt_t *f_async_decrypt,
5038 mbedtls_ssl_async_resume_t *f_async_resume,
5039 mbedtls_ssl_async_cancel_t *f_async_cancel,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02005040 void *async_config_data )
Gilles Peskine8bf79f62018-01-05 21:11:53 +01005041{
5042 conf->f_async_sign_start = f_async_sign;
5043 conf->f_async_decrypt_start = f_async_decrypt;
5044 conf->f_async_resume = f_async_resume;
5045 conf->f_async_cancel = f_async_cancel;
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02005046 conf->p_async_config_data = async_config_data;
5047}
5048
Gilles Peskine8f97af72018-04-26 11:46:10 +02005049void *mbedtls_ssl_conf_get_async_config_data( const mbedtls_ssl_config *conf )
5050{
5051 return( conf->p_async_config_data );
5052}
5053
Gilles Peskine1febfef2018-04-30 11:54:39 +02005054void *mbedtls_ssl_get_async_operation_data( const mbedtls_ssl_context *ssl )
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02005055{
5056 if( ssl->handshake == NULL )
5057 return( NULL );
5058 else
5059 return( ssl->handshake->user_async_ctx );
5060}
5061
Gilles Peskine1febfef2018-04-30 11:54:39 +02005062void mbedtls_ssl_set_async_operation_data( mbedtls_ssl_context *ssl,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02005063 void *ctx )
5064{
5065 if( ssl->handshake != NULL )
5066 ssl->handshake->user_async_ctx = ctx;
Gilles Peskine8bf79f62018-01-05 21:11:53 +01005067}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02005068#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine8bf79f62018-01-05 21:11:53 +01005069
Paul Bakker5121ce52009-01-03 21:22:43 +00005070/*
5071 * SSL get accessors
5072 */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02005073uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00005074{
Manuel Pégourié-Gonnarde89163c2015-01-23 14:30:57 +00005075 if( ssl->session != NULL )
5076 return( ssl->session->verify_result );
5077
5078 if( ssl->session_negotiate != NULL )
5079 return( ssl->session_negotiate->verify_result );
5080
Manuel Pégourié-Gonnard6ab9b002015-05-14 11:25:04 +02005081 return( 0xFFFFFFFF );
Paul Bakker5121ce52009-01-03 21:22:43 +00005082}
5083
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005084const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00005085{
Paul Bakker926c8e42013-03-06 10:23:34 +01005086 if( ssl == NULL || ssl->session == NULL )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02005087 return( NULL );
Paul Bakker926c8e42013-03-06 10:23:34 +01005088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005089 return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00005090}
5091
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005092const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl )
Paul Bakker43ca69c2011-01-15 17:35:19 +00005093{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005094#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005095 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01005096 {
5097 switch( ssl->minor_ver )
5098 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005099 case MBEDTLS_SSL_MINOR_VERSION_2:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01005100 return( "DTLSv1.0" );
5101
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005102 case MBEDTLS_SSL_MINOR_VERSION_3:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01005103 return( "DTLSv1.2" );
5104
5105 default:
5106 return( "unknown (DTLS)" );
5107 }
5108 }
5109#endif
5110
Paul Bakker43ca69c2011-01-15 17:35:19 +00005111 switch( ssl->minor_ver )
5112 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005113 case MBEDTLS_SSL_MINOR_VERSION_0:
Paul Bakker43ca69c2011-01-15 17:35:19 +00005114 return( "SSLv3.0" );
5115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005116 case MBEDTLS_SSL_MINOR_VERSION_1:
Paul Bakker43ca69c2011-01-15 17:35:19 +00005117 return( "TLSv1.0" );
5118
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005119 case MBEDTLS_SSL_MINOR_VERSION_2:
Paul Bakker43ca69c2011-01-15 17:35:19 +00005120 return( "TLSv1.1" );
5121
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005122 case MBEDTLS_SSL_MINOR_VERSION_3:
Paul Bakker1ef83d62012-04-11 12:09:53 +00005123 return( "TLSv1.2" );
5124
Paul Bakker43ca69c2011-01-15 17:35:19 +00005125 default:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01005126 return( "unknown" );
Paul Bakker43ca69c2011-01-15 17:35:19 +00005127 }
Paul Bakker43ca69c2011-01-15 17:35:19 +00005128}
5129
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005130#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Andrzej Kurek90c6e842020-04-03 05:25:29 -04005131size_t mbedtls_ssl_get_input_max_frag_len( const mbedtls_ssl_context *ssl )
5132{
5133 size_t max_len = MBEDTLS_SSL_MAX_CONTENT_LEN;
5134 size_t read_mfl;
5135
5136 /* Use the configured MFL for the client if we're past SERVER_HELLO_DONE */
5137 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
5138 ssl->state >= MBEDTLS_SSL_SERVER_HELLO_DONE )
5139 {
5140 return ssl_mfl_code_to_length( ssl->conf->mfl_code );
5141 }
5142
5143 /* Check if a smaller max length was negotiated */
5144 if( ssl->session_out != NULL )
5145 {
5146 read_mfl = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
5147 if( read_mfl < max_len )
5148 {
5149 max_len = read_mfl;
5150 }
5151 }
5152
5153 // During a handshake, use the value being negotiated
5154 if( ssl->session_negotiate != NULL )
5155 {
5156 read_mfl = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
5157 if( read_mfl < max_len )
5158 {
5159 max_len = read_mfl;
5160 }
5161 }
5162
5163 return( max_len );
5164}
5165
5166size_t mbedtls_ssl_get_output_max_frag_len( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005167{
5168 size_t max_len;
5169
5170 /*
5171 * Assume mfl_code is correct since it was checked when set
5172 */
Angus Grattond8213d02016-05-25 20:56:48 +10005173 max_len = ssl_mfl_code_to_length( ssl->conf->mfl_code );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005174
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02005175 /* Check if a smaller max length was negotiated */
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005176 if( ssl->session_out != NULL &&
Angus Grattond8213d02016-05-25 20:56:48 +10005177 ssl_mfl_code_to_length( ssl->session_out->mfl_code ) < max_len )
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005178 {
Angus Grattond8213d02016-05-25 20:56:48 +10005179 max_len = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005180 }
5181
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02005182 /* During a handshake, use the value being negotiated */
5183 if( ssl->session_negotiate != NULL &&
5184 ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code ) < max_len )
5185 {
5186 max_len = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
5187 }
5188
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005189 return( max_len );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005190}
Andrzej Kurek90c6e842020-04-03 05:25:29 -04005191
5192#if !defined(MBEDTLS_DEPRECATED_REMOVED)
5193size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl )
5194{
5195 return mbedtls_ssl_get_output_max_frag_len( ssl );
5196}
5197#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005198#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
5199
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02005200#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker89490712020-02-05 10:50:12 +00005201size_t mbedtls_ssl_get_current_mtu( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02005202{
Andrzej Kurekef43ce62018-10-09 08:24:12 -04005203 /* Return unlimited mtu for client hello messages to avoid fragmentation. */
5204 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
5205 ( ssl->state == MBEDTLS_SSL_CLIENT_HELLO ||
5206 ssl->state == MBEDTLS_SSL_SERVER_HELLO ) )
5207 return ( 0 );
5208
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02005209 if( ssl->handshake == NULL || ssl->handshake->mtu == 0 )
5210 return( ssl->mtu );
5211
5212 if( ssl->mtu == 0 )
5213 return( ssl->handshake->mtu );
5214
5215 return( ssl->mtu < ssl->handshake->mtu ?
5216 ssl->mtu : ssl->handshake->mtu );
5217}
5218#endif /* MBEDTLS_SSL_PROTO_DTLS */
5219
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005220int mbedtls_ssl_get_max_out_record_payload( const mbedtls_ssl_context *ssl )
5221{
5222 size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
5223
Manuel Pégourié-Gonnard000281e2018-08-21 11:20:58 +02005224#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
5225 !defined(MBEDTLS_SSL_PROTO_DTLS)
5226 (void) ssl;
5227#endif
5228
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005229#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Andrzej Kurek90c6e842020-04-03 05:25:29 -04005230 const size_t mfl = mbedtls_ssl_get_output_max_frag_len( ssl );
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005231
5232 if( max_len > mfl )
5233 max_len = mfl;
5234#endif
5235
5236#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker89490712020-02-05 10:50:12 +00005237 if( mbedtls_ssl_get_current_mtu( ssl ) != 0 )
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005238 {
Hanno Becker89490712020-02-05 10:50:12 +00005239 const size_t mtu = mbedtls_ssl_get_current_mtu( ssl );
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005240 const int ret = mbedtls_ssl_get_record_expansion( ssl );
5241 const size_t overhead = (size_t) ret;
5242
5243 if( ret < 0 )
5244 return( ret );
5245
5246 if( mtu <= overhead )
5247 {
5248 MBEDTLS_SSL_DEBUG_MSG( 1, ( "MTU too low for record expansion" ) );
5249 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
5250 }
5251
5252 if( max_len > mtu - overhead )
5253 max_len = mtu - overhead;
5254 }
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02005255#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005256
Hanno Becker0defedb2018-08-10 12:35:02 +01005257#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
5258 !defined(MBEDTLS_SSL_PROTO_DTLS)
5259 ((void) ssl);
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005260#endif
5261
5262 return( (int) max_len );
5263}
5264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005265#if defined(MBEDTLS_X509_CRT_PARSE_C)
5266const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl )
Paul Bakkerb0550d92012-10-30 07:51:03 +00005267{
5268 if( ssl == NULL || ssl->session == NULL )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02005269 return( NULL );
Paul Bakkerb0550d92012-10-30 07:51:03 +00005270
Hanno Beckere6824572019-02-07 13:18:46 +00005271#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Paul Bakkerd8bb8262014-06-17 14:06:49 +02005272 return( ssl->session->peer_cert );
Hanno Beckere6824572019-02-07 13:18:46 +00005273#else
5274 return( NULL );
5275#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakkerb0550d92012-10-30 07:51:03 +00005276}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005277#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00005278
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005279#if defined(MBEDTLS_SSL_CLI_C)
Hanno Beckerf852b1c2019-02-05 11:42:30 +00005280int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl,
5281 mbedtls_ssl_session *dst )
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005282{
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005283 if( ssl == NULL ||
5284 dst == NULL ||
5285 ssl->session == NULL ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005286 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005287 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005288 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005289 }
5290
Hanno Becker52055ae2019-02-06 14:30:46 +00005291 return( mbedtls_ssl_session_copy( dst, ssl->session ) );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005292}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005293#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005294
Manuel Pégourié-Gonnardb5e4e0a2019-05-20 11:12:28 +02005295const mbedtls_ssl_session *mbedtls_ssl_get_session_pointer( const mbedtls_ssl_context *ssl )
5296{
5297 if( ssl == NULL )
5298 return( NULL );
5299
5300 return( ssl->session );
5301}
5302
Paul Bakker5121ce52009-01-03 21:22:43 +00005303/*
Hanno Beckera835da52019-05-16 12:39:07 +01005304 * Define ticket header determining Mbed TLS version
5305 * and structure of the ticket.
5306 */
5307
Hanno Becker94ef3b32019-05-16 12:50:45 +01005308/*
Hanno Becker50b59662019-05-28 14:30:45 +01005309 * Define bitflag determining compile-time settings influencing
5310 * structure of serialized SSL sessions.
Hanno Becker94ef3b32019-05-16 12:50:45 +01005311 */
5312
Hanno Becker50b59662019-05-28 14:30:45 +01005313#if defined(MBEDTLS_HAVE_TIME)
Hanno Becker3e088662019-05-29 11:10:18 +01005314#define SSL_SERIALIZED_SESSION_CONFIG_TIME 1
Hanno Becker50b59662019-05-28 14:30:45 +01005315#else
Hanno Becker3e088662019-05-29 11:10:18 +01005316#define SSL_SERIALIZED_SESSION_CONFIG_TIME 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005317#endif /* MBEDTLS_HAVE_TIME */
5318
5319#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker3e088662019-05-29 11:10:18 +01005320#define SSL_SERIALIZED_SESSION_CONFIG_CRT 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01005321#else
Hanno Becker3e088662019-05-29 11:10:18 +01005322#define SSL_SERIALIZED_SESSION_CONFIG_CRT 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005323#endif /* MBEDTLS_X509_CRT_PARSE_C */
5324
5325#if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_SESSION_TICKETS)
Hanno Becker3e088662019-05-29 11:10:18 +01005326#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01005327#else
Hanno Becker3e088662019-05-29 11:10:18 +01005328#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005329#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_SESSION_TICKETS */
5330
5331#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Hanno Becker3e088662019-05-29 11:10:18 +01005332#define SSL_SERIALIZED_SESSION_CONFIG_MFL 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01005333#else
Hanno Becker3e088662019-05-29 11:10:18 +01005334#define SSL_SERIALIZED_SESSION_CONFIG_MFL 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005335#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
5336
5337#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Hanno Becker3e088662019-05-29 11:10:18 +01005338#define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01005339#else
Hanno Becker3e088662019-05-29 11:10:18 +01005340#define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005341#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
5342
5343#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker3e088662019-05-29 11:10:18 +01005344#define SSL_SERIALIZED_SESSION_CONFIG_ETM 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01005345#else
Hanno Becker3e088662019-05-29 11:10:18 +01005346#define SSL_SERIALIZED_SESSION_CONFIG_ETM 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005347#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
5348
Hanno Becker94ef3b32019-05-16 12:50:45 +01005349#if defined(MBEDTLS_SSL_SESSION_TICKETS)
5350#define SSL_SERIALIZED_SESSION_CONFIG_TICKET 1
5351#else
5352#define SSL_SERIALIZED_SESSION_CONFIG_TICKET 0
5353#endif /* MBEDTLS_SSL_SESSION_TICKETS */
5354
Hanno Becker3e088662019-05-29 11:10:18 +01005355#define SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT 0
5356#define SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT 1
5357#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT 2
5358#define SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT 3
5359#define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC_BIT 4
5360#define SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT 5
5361#define SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT 6
Hanno Becker3e088662019-05-29 11:10:18 +01005362
Hanno Becker50b59662019-05-28 14:30:45 +01005363#define SSL_SERIALIZED_SESSION_CONFIG_BITFLAG \
Hanno Becker3e088662019-05-29 11:10:18 +01005364 ( (uint16_t) ( \
5365 ( SSL_SERIALIZED_SESSION_CONFIG_TIME << SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT ) | \
5366 ( SSL_SERIALIZED_SESSION_CONFIG_CRT << SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT ) | \
5367 ( SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET << SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT ) | \
5368 ( SSL_SERIALIZED_SESSION_CONFIG_MFL << SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT ) | \
5369 ( SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC << SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC_BIT ) | \
5370 ( SSL_SERIALIZED_SESSION_CONFIG_ETM << SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT ) | \
Hanno Beckerbe34e8e2019-06-04 09:43:16 +01005371 ( SSL_SERIALIZED_SESSION_CONFIG_TICKET << SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT ) ) )
Hanno Becker94ef3b32019-05-16 12:50:45 +01005372
Hanno Beckerf8787072019-05-16 12:41:07 +01005373static unsigned char ssl_serialized_session_header[] = {
Hanno Becker94ef3b32019-05-16 12:50:45 +01005374 MBEDTLS_VERSION_MAJOR,
5375 MBEDTLS_VERSION_MINOR,
5376 MBEDTLS_VERSION_PATCH,
Joe Subbianic045dc12021-07-14 12:31:31 +01005377 MBEDTLS_BYTE_1( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
5378 MBEDTLS_BYTE_0( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
Hanno Beckerf8787072019-05-16 12:41:07 +01005379};
Hanno Beckera835da52019-05-16 12:39:07 +01005380
5381/*
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005382 * Serialize a session in the following format:
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005383 * (in the presentation language of TLS, RFC 8446 section 3)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005384 *
Hanno Becker50b59662019-05-28 14:30:45 +01005385 * opaque mbedtls_version[3]; // major, minor, patch
5386 * opaque session_format[2]; // version-specific 16-bit field determining
5387 * // the format of the remaining
5388 * // serialized data.
Hanno Beckerdc28b6c2019-05-29 11:08:00 +01005389 *
5390 * Note: When updating the format, remember to keep
5391 * these version+format bytes.
5392 *
Hanno Beckerbe34e8e2019-06-04 09:43:16 +01005393 * // In this version, `session_format` determines
5394 * // the setting of those compile-time
5395 * // configuration options which influence
Hanno Becker50b59662019-05-28 14:30:45 +01005396 * // the structure of mbedtls_ssl_session.
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005397 * uint64 start_time;
Hanno Becker50b59662019-05-28 14:30:45 +01005398 * uint8 ciphersuite[2]; // defined by the standard
5399 * uint8 compression; // 0 or 1
5400 * uint8 session_id_len; // at most 32
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005401 * opaque session_id[32];
Hanno Becker50b59662019-05-28 14:30:45 +01005402 * opaque master[48]; // fixed length in the standard
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005403 * uint32 verify_result;
Hanno Becker50b59662019-05-28 14:30:45 +01005404 * opaque peer_cert<0..2^24-1>; // length 0 means no peer cert
5405 * opaque ticket<0..2^24-1>; // length 0 means no ticket
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005406 * uint32 ticket_lifetime;
Hanno Becker50b59662019-05-28 14:30:45 +01005407 * uint8 mfl_code; // up to 255 according to standard
5408 * uint8 trunc_hmac; // 0 or 1
5409 * uint8 encrypt_then_mac; // 0 or 1
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005410 *
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005411 * The order is the same as in the definition of the structure, except
5412 * verify_result is put before peer_cert so that all mandatory fields come
5413 * together in one block.
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005414 */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02005415MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005416static int ssl_session_save( const mbedtls_ssl_session *session,
5417 unsigned char omit_header,
5418 unsigned char *buf,
5419 size_t buf_len,
5420 size_t *olen )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005421{
5422 unsigned char *p = buf;
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005423 size_t used = 0;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005424#if defined(MBEDTLS_HAVE_TIME)
5425 uint64_t start;
5426#endif
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005427#if defined(MBEDTLS_X509_CRT_PARSE_C)
5428#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5429 size_t cert_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005430#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5431#endif /* MBEDTLS_X509_CRT_PARSE_C */
5432
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005433
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005434 if( !omit_header )
Hanno Beckera835da52019-05-16 12:39:07 +01005435 {
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005436 /*
5437 * Add version identifier
5438 */
5439
5440 used += sizeof( ssl_serialized_session_header );
5441
5442 if( used <= buf_len )
5443 {
5444 memcpy( p, ssl_serialized_session_header,
5445 sizeof( ssl_serialized_session_header ) );
5446 p += sizeof( ssl_serialized_session_header );
5447 }
Hanno Beckera835da52019-05-16 12:39:07 +01005448 }
5449
5450 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005451 * Time
5452 */
5453#if defined(MBEDTLS_HAVE_TIME)
5454 used += 8;
5455
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005456 if( used <= buf_len )
5457 {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005458 start = (uint64_t) session->start;
5459
Joe Subbiani2f98d792021-08-20 11:44:44 +01005460 MBEDTLS_PUT_UINT64_BE( start, p, 0 );
5461 p += 8;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005462 }
5463#endif /* MBEDTLS_HAVE_TIME */
5464
5465 /*
5466 * Basic mandatory fields
5467 */
5468 used += 2 /* ciphersuite */
5469 + 1 /* compression */
5470 + 1 /* id_len */
5471 + sizeof( session->id )
5472 + sizeof( session->master )
5473 + 4; /* verify_result */
5474
5475 if( used <= buf_len )
5476 {
Joe Subbiani2f98d792021-08-20 11:44:44 +01005477 MBEDTLS_PUT_UINT16_BE( session->ciphersuite, p, 0 );
5478 p += 2;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005479
Joe Subbianic045dc12021-07-14 12:31:31 +01005480 *p++ = MBEDTLS_BYTE_0( session->compression );
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005481
Joe Subbianic045dc12021-07-14 12:31:31 +01005482 *p++ = MBEDTLS_BYTE_0( session->id_len );
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005483 memcpy( p, session->id, 32 );
5484 p += 32;
5485
5486 memcpy( p, session->master, 48 );
5487 p += 48;
5488
Joe Subbiani2f98d792021-08-20 11:44:44 +01005489 MBEDTLS_PUT_UINT32_BE( session->verify_result, p, 0 );
5490 p += 4;
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005491 }
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005492
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005493 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005494 * Peer's end-entity certificate
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005495 */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005496#if defined(MBEDTLS_X509_CRT_PARSE_C)
5497#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5498 if( session->peer_cert == NULL )
5499 cert_len = 0;
5500 else
5501 cert_len = session->peer_cert->raw.len;
5502
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005503 used += 3 + cert_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005504
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005505 if( used <= buf_len )
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005506 {
Joe Subbianic045dc12021-07-14 12:31:31 +01005507 *p++ = MBEDTLS_BYTE_2( cert_len );
5508 *p++ = MBEDTLS_BYTE_1( cert_len );
5509 *p++ = MBEDTLS_BYTE_0( cert_len );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005510
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005511 if( session->peer_cert != NULL )
5512 {
5513 memcpy( p, session->peer_cert->raw.p, cert_len );
5514 p += cert_len;
5515 }
5516 }
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005517#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005518 if( session->peer_cert_digest != NULL )
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005519 {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005520 used += 1 /* type */ + 1 /* length */ + session->peer_cert_digest_len;
5521 if( used <= buf_len )
5522 {
5523 *p++ = (unsigned char) session->peer_cert_digest_type;
5524 *p++ = (unsigned char) session->peer_cert_digest_len;
5525 memcpy( p, session->peer_cert_digest,
5526 session->peer_cert_digest_len );
5527 p += session->peer_cert_digest_len;
5528 }
5529 }
5530 else
5531 {
5532 used += 2;
5533 if( used <= buf_len )
5534 {
5535 *p++ = (unsigned char) MBEDTLS_MD_NONE;
5536 *p++ = 0;
5537 }
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005538 }
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005539#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5540#endif /* MBEDTLS_X509_CRT_PARSE_C */
5541
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005542 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005543 * Session ticket if any, plus associated data
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005544 */
5545#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005546 used += 3 + session->ticket_len + 4; /* len + ticket + lifetime */
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005547
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005548 if( used <= buf_len )
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005549 {
Joe Subbianic045dc12021-07-14 12:31:31 +01005550 *p++ = MBEDTLS_BYTE_2( session->ticket_len );
5551 *p++ = MBEDTLS_BYTE_1( session->ticket_len );
5552 *p++ = MBEDTLS_BYTE_0( session->ticket_len );
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005553
5554 if( session->ticket != NULL )
5555 {
5556 memcpy( p, session->ticket, session->ticket_len );
5557 p += session->ticket_len;
5558 }
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005559
Joe Subbiani2f98d792021-08-20 11:44:44 +01005560 MBEDTLS_PUT_UINT32_BE( session->ticket_lifetime, p, 0 );
5561 p += 4;
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005562 }
5563#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
5564
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005565 /*
5566 * Misc extension-related info
5567 */
5568#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
5569 used += 1;
5570
5571 if( used <= buf_len )
5572 *p++ = session->mfl_code;
5573#endif
5574
5575#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
5576 used += 1;
5577
5578 if( used <= buf_len )
5579 *p++ = (unsigned char)( ( session->trunc_hmac ) & 0xFF );
5580#endif
5581
5582#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
5583 used += 1;
5584
5585 if( used <= buf_len )
Joe Subbianic045dc12021-07-14 12:31:31 +01005586 *p++ = MBEDTLS_BYTE_0( session->encrypt_then_mac );
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005587#endif
5588
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005589 /* Done */
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005590 *olen = used;
5591
5592 if( used > buf_len )
5593 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005594
5595 return( 0 );
5596}
5597
5598/*
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005599 * Public wrapper for ssl_session_save()
5600 */
5601int mbedtls_ssl_session_save( const mbedtls_ssl_session *session,
5602 unsigned char *buf,
5603 size_t buf_len,
5604 size_t *olen )
5605{
5606 return( ssl_session_save( session, 0, buf, buf_len, olen ) );
5607}
5608
5609/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02005610 * Deserialize session, see mbedtls_ssl_session_save() for format.
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02005611 *
5612 * This internal version is wrapped by a public function that cleans up in
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005613 * case of error, and has an extra option omit_header.
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005614 */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02005615MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02005616static int ssl_session_load( mbedtls_ssl_session *session,
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005617 unsigned char omit_header,
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02005618 const unsigned char *buf,
5619 size_t len )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005620{
5621 const unsigned char *p = buf;
5622 const unsigned char * const end = buf + len;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005623#if defined(MBEDTLS_HAVE_TIME)
5624 uint64_t start;
5625#endif
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005626#if defined(MBEDTLS_X509_CRT_PARSE_C)
5627#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5628 size_t cert_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005629#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5630#endif /* MBEDTLS_X509_CRT_PARSE_C */
5631
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005632 if( !omit_header )
Hanno Beckera835da52019-05-16 12:39:07 +01005633 {
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005634 /*
5635 * Check version identifier
5636 */
5637
5638 if( (size_t)( end - p ) < sizeof( ssl_serialized_session_header ) )
5639 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5640
5641 if( memcmp( p, ssl_serialized_session_header,
5642 sizeof( ssl_serialized_session_header ) ) != 0 )
5643 {
5644 return( MBEDTLS_ERR_SSL_VERSION_MISMATCH );
5645 }
5646 p += sizeof( ssl_serialized_session_header );
Hanno Beckera835da52019-05-16 12:39:07 +01005647 }
Hanno Beckera835da52019-05-16 12:39:07 +01005648
5649 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005650 * Time
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005651 */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005652#if defined(MBEDTLS_HAVE_TIME)
5653 if( 8 > (size_t)( end - p ) )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005654 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5655
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005656 start = ( (uint64_t) p[0] << 56 ) |
5657 ( (uint64_t) p[1] << 48 ) |
5658 ( (uint64_t) p[2] << 40 ) |
5659 ( (uint64_t) p[3] << 32 ) |
5660 ( (uint64_t) p[4] << 24 ) |
5661 ( (uint64_t) p[5] << 16 ) |
5662 ( (uint64_t) p[6] << 8 ) |
5663 ( (uint64_t) p[7] );
5664 p += 8;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005665
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005666 session->start = (time_t) start;
5667#endif /* MBEDTLS_HAVE_TIME */
5668
5669 /*
5670 * Basic mandatory fields
5671 */
5672 if( 2 + 1 + 1 + 32 + 48 + 4 > (size_t)( end - p ) )
5673 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5674
5675 session->ciphersuite = ( p[0] << 8 ) | p[1];
5676 p += 2;
5677
5678 session->compression = *p++;
5679
5680 session->id_len = *p++;
5681 memcpy( session->id, p, 32 );
5682 p += 32;
5683
5684 memcpy( session->master, p, 48 );
5685 p += 48;
5686
5687 session->verify_result = ( (uint32_t) p[0] << 24 ) |
5688 ( (uint32_t) p[1] << 16 ) |
5689 ( (uint32_t) p[2] << 8 ) |
5690 ( (uint32_t) p[3] );
5691 p += 4;
5692
5693 /* Immediately clear invalid pointer values that have been read, in case
5694 * we exit early before we replaced them with valid ones. */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005695#if defined(MBEDTLS_X509_CRT_PARSE_C)
5696#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5697 session->peer_cert = NULL;
5698#else
5699 session->peer_cert_digest = NULL;
5700#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5701#endif /* MBEDTLS_X509_CRT_PARSE_C */
5702#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
5703 session->ticket = NULL;
5704#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
5705
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005706 /*
5707 * Peer certificate
5708 */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005709#if defined(MBEDTLS_X509_CRT_PARSE_C)
5710#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5711 /* Deserialize CRT from the end of the ticket. */
5712 if( 3 > (size_t)( end - p ) )
5713 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5714
5715 cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
5716 p += 3;
5717
5718 if( cert_len != 0 )
5719 {
Janos Follath865b3eb2019-12-16 11:46:15 +00005720 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005721
5722 if( cert_len > (size_t)( end - p ) )
5723 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5724
5725 session->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
5726
5727 if( session->peer_cert == NULL )
5728 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
5729
5730 mbedtls_x509_crt_init( session->peer_cert );
5731
5732 if( ( ret = mbedtls_x509_crt_parse_der( session->peer_cert,
5733 p, cert_len ) ) != 0 )
5734 {
5735 mbedtls_x509_crt_free( session->peer_cert );
5736 mbedtls_free( session->peer_cert );
5737 session->peer_cert = NULL;
5738 return( ret );
5739 }
5740
5741 p += cert_len;
5742 }
5743#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5744 /* Deserialize CRT digest from the end of the ticket. */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005745 if( 2 > (size_t)( end - p ) )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005746 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5747
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005748 session->peer_cert_digest_type = (mbedtls_md_type_t) *p++;
5749 session->peer_cert_digest_len = (size_t) *p++;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005750
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005751 if( session->peer_cert_digest_len != 0 )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005752 {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005753 const mbedtls_md_info_t *md_info =
5754 mbedtls_md_info_from_type( session->peer_cert_digest_type );
5755 if( md_info == NULL )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005756 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005757 if( session->peer_cert_digest_len != mbedtls_md_get_size( md_info ) )
5758 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005759
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005760 if( session->peer_cert_digest_len > (size_t)( end - p ) )
5761 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5762
5763 session->peer_cert_digest =
5764 mbedtls_calloc( 1, session->peer_cert_digest_len );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005765 if( session->peer_cert_digest == NULL )
5766 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
5767
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005768 memcpy( session->peer_cert_digest, p,
5769 session->peer_cert_digest_len );
5770 p += session->peer_cert_digest_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005771 }
5772#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5773#endif /* MBEDTLS_X509_CRT_PARSE_C */
5774
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005775 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005776 * Session ticket and associated data
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005777 */
5778#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
5779 if( 3 > (size_t)( end - p ) )
5780 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5781
5782 session->ticket_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
5783 p += 3;
5784
5785 if( session->ticket_len != 0 )
5786 {
5787 if( session->ticket_len > (size_t)( end - p ) )
5788 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5789
5790 session->ticket = mbedtls_calloc( 1, session->ticket_len );
5791 if( session->ticket == NULL )
5792 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
5793
5794 memcpy( session->ticket, p, session->ticket_len );
5795 p += session->ticket_len;
5796 }
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005797
5798 if( 4 > (size_t)( end - p ) )
5799 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5800
5801 session->ticket_lifetime = ( (uint32_t) p[0] << 24 ) |
5802 ( (uint32_t) p[1] << 16 ) |
5803 ( (uint32_t) p[2] << 8 ) |
5804 ( (uint32_t) p[3] );
5805 p += 4;
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005806#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
5807
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005808 /*
5809 * Misc extension-related info
5810 */
5811#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
5812 if( 1 > (size_t)( end - p ) )
5813 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5814
5815 session->mfl_code = *p++;
5816#endif
5817
5818#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
5819 if( 1 > (size_t)( end - p ) )
5820 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5821
5822 session->trunc_hmac = *p++;
5823#endif
5824
5825#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
5826 if( 1 > (size_t)( end - p ) )
5827 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5828
5829 session->encrypt_then_mac = *p++;
5830#endif
5831
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005832 /* Done, should have consumed entire buffer */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005833 if( p != end )
5834 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5835
5836 return( 0 );
5837}
5838
5839/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02005840 * Deserialize session: public wrapper for error cleaning
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02005841 */
5842int mbedtls_ssl_session_load( mbedtls_ssl_session *session,
5843 const unsigned char *buf,
5844 size_t len )
5845{
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005846 int ret = ssl_session_load( session, 0, buf, len );
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02005847
5848 if( ret != 0 )
5849 mbedtls_ssl_session_free( session );
5850
5851 return( ret );
5852}
5853
5854/*
Paul Bakker1961b702013-01-25 14:49:24 +01005855 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00005856 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005857int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00005858{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005859 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00005860
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02005861 if( ssl == NULL || ssl->conf == NULL )
5862 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5863
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005864#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005865 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005866 ret = mbedtls_ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00005867#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005868#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005869 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005870 ret = mbedtls_ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00005871#endif
5872
Paul Bakker1961b702013-01-25 14:49:24 +01005873 return( ret );
5874}
5875
5876/*
5877 * Perform the SSL handshake
5878 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005879int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl )
Paul Bakker1961b702013-01-25 14:49:24 +01005880{
5881 int ret = 0;
5882
Hanno Beckera817ea42020-10-20 15:20:23 +01005883 /* Sanity checks */
5884
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02005885 if( ssl == NULL || ssl->conf == NULL )
5886 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5887
Hanno Beckera817ea42020-10-20 15:20:23 +01005888#if defined(MBEDTLS_SSL_PROTO_DTLS)
5889 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
5890 ( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL ) )
5891 {
5892 MBEDTLS_SSL_DEBUG_MSG( 1, ( "You must use "
5893 "mbedtls_ssl_set_timer_cb() for DTLS" ) );
5894 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5895 }
5896#endif /* MBEDTLS_SSL_PROTO_DTLS */
5897
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005898 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
Paul Bakker1961b702013-01-25 14:49:24 +01005899
Hanno Beckera817ea42020-10-20 15:20:23 +01005900 /* Main handshake loop */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005901 while( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Paul Bakker1961b702013-01-25 14:49:24 +01005902 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005903 ret = mbedtls_ssl_handshake_step( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01005904
5905 if( ret != 0 )
5906 break;
5907 }
5908
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005909 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00005910
5911 return( ret );
5912}
5913
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005914#if defined(MBEDTLS_SSL_RENEGOTIATION)
5915#if defined(MBEDTLS_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00005916/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005917 * Write HelloRequest to request renegotiation on server
Paul Bakker48916f92012-09-16 19:57:18 +00005918 */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02005919MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005920static int ssl_write_hello_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005921{
Janos Follath865b3eb2019-12-16 11:46:15 +00005922 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005923
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005924 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello request" ) );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005925
5926 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005927 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
5928 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005929
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02005930 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005931 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02005932 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005933 return( ret );
5934 }
5935
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005936 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello request" ) );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005937
5938 return( 0 );
5939}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005940#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005941
5942/*
5943 * Actually renegotiate current connection, triggered by either:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005944 * - any side: calling mbedtls_ssl_renegotiate(),
5945 * - client: receiving a HelloRequest during mbedtls_ssl_read(),
5946 * - server: receiving any handshake message on server during mbedtls_ssl_read() after
Manuel Pégourié-Gonnard55e4ff22014-08-19 11:16:35 +02005947 * the initial handshake is completed.
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005948 * If the handshake doesn't complete due to waiting for I/O, it will continue
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005949 * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively.
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005950 */
Hanno Becker40cdaa12020-02-05 10:48:27 +00005951int mbedtls_ssl_start_renegotiation( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00005952{
Janos Follath865b3eb2019-12-16 11:46:15 +00005953 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker48916f92012-09-16 19:57:18 +00005954
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005955 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00005956
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005957 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
5958 return( ret );
Paul Bakker48916f92012-09-16 19:57:18 +00005959
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02005960 /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and
5961 * the ServerHello will have message_seq = 1" */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005962#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005963 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005964 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02005965 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005966 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02005967 ssl->handshake->out_msg_seq = 1;
5968 else
5969 ssl->handshake->in_msg_seq = 1;
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02005970 }
5971#endif
5972
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005973 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
5974 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS;
Paul Bakker48916f92012-09-16 19:57:18 +00005975
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005976 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00005977 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005978 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Paul Bakker48916f92012-09-16 19:57:18 +00005979 return( ret );
5980 }
5981
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005982 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00005983
5984 return( 0 );
5985}
5986
5987/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005988 * Renegotiate current connection on client,
5989 * or request renegotiation on server
5990 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005991int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005992{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005993 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005994
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02005995 if( ssl == NULL || ssl->conf == NULL )
5996 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5997
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005998#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005999 /* On server, just send the request */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006000 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006001 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006002 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
6003 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006004
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006005 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02006006
6007 /* Did we already try/start sending HelloRequest? */
6008 if( ssl->out_left != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006009 return( mbedtls_ssl_flush_output( ssl ) );
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02006010
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01006011 return( ssl_write_hello_request( ssl ) );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006012 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006013#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006014
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006015#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006016 /*
6017 * On client, either start the renegotiation process or,
6018 * if already in progress, continue the handshake
6019 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006020 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006021 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006022 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
6023 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006024
Hanno Becker40cdaa12020-02-05 10:48:27 +00006025 if( ( ret = mbedtls_ssl_start_renegotiation( ssl ) ) != 0 )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006026 {
Hanno Becker40cdaa12020-02-05 10:48:27 +00006027 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_start_renegotiation", ret );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006028 return( ret );
6029 }
6030 }
6031 else
6032 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006033 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006034 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006035 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006036 return( ret );
6037 }
6038 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006039#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01006040
Paul Bakker37ce0ff2013-10-31 14:32:04 +01006041 return( ret );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01006042}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006043#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01006044
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006045#if defined(MBEDTLS_X509_CRT_PARSE_C)
6046static void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert )
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02006047{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006048 mbedtls_ssl_key_cert *cur = key_cert, *next;
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02006049
6050 while( cur != NULL )
6051 {
6052 next = cur->next;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006053 mbedtls_free( cur );
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02006054 cur = next;
6055 }
6056}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006057#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02006058
Gilles Peskine9b562d52018-04-25 20:32:43 +02006059void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00006060{
Gilles Peskine9b562d52018-04-25 20:32:43 +02006061 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
6062
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006063 if( handshake == NULL )
6064 return;
6065
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02006066#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
6067 if( ssl->conf->f_async_cancel != NULL && handshake->async_in_progress != 0 )
6068 {
Gilles Peskine8f97af72018-04-26 11:46:10 +02006069 ssl->conf->f_async_cancel( ssl );
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02006070 handshake->async_in_progress = 0;
6071 }
6072#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
6073
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02006074#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
6075 defined(MBEDTLS_SSL_PROTO_TLS1_1)
6076 mbedtls_md5_free( &handshake->fin_md5 );
6077 mbedtls_sha1_free( &handshake->fin_sha1 );
6078#endif
6079#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
6080#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05006081#if defined(MBEDTLS_USE_PSA_CRYPTO)
6082 psa_hash_abort( &handshake->fin_sha256_psa );
6083#else
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02006084 mbedtls_sha256_free( &handshake->fin_sha256 );
6085#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05006086#endif
Gilles Peskined2d59372021-05-12 22:43:27 +02006087#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Andrzej Kurekeb342242019-01-29 09:14:33 -05006088#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05006089 psa_hash_abort( &handshake->fin_sha384_psa );
Andrzej Kurekeb342242019-01-29 09:14:33 -05006090#else
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02006091 mbedtls_sha512_free( &handshake->fin_sha512 );
6092#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05006093#endif
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02006094#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
6095
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006096#if defined(MBEDTLS_DHM_C)
6097 mbedtls_dhm_free( &handshake->dhm_ctx );
Paul Bakker48916f92012-09-16 19:57:18 +00006098#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006099#if defined(MBEDTLS_ECDH_C)
6100 mbedtls_ecdh_free( &handshake->ecdh_ctx );
Paul Bakker61d113b2013-07-04 11:51:43 +02006101#endif
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02006102#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02006103 mbedtls_ecjpake_free( &handshake->ecjpake_ctx );
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02006104#if defined(MBEDTLS_SSL_CLI_C)
6105 mbedtls_free( handshake->ecjpake_cache );
6106 handshake->ecjpake_cache = NULL;
6107 handshake->ecjpake_cache_len = 0;
6108#endif
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02006109#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02006110
Janos Follath4ae5c292016-02-10 11:27:43 +00006111#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
6112 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Paul Bakker9af723c2014-05-01 13:03:14 +02006113 /* explicit void pointer cast for buggy MS compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006114 mbedtls_free( (void *) handshake->curves );
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +02006115#endif
6116
Gilles Peskineeccd8882020-03-10 12:19:08 +01006117#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01006118 if( handshake->psk != NULL )
6119 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006120 mbedtls_platform_zeroize( handshake->psk, handshake->psk_len );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01006121 mbedtls_free( handshake->psk );
6122 }
6123#endif
6124
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006125#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
6126 defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02006127 /*
6128 * Free only the linked list wrapper, not the keys themselves
6129 * since the belong to the SNI callback
6130 */
6131 if( handshake->sni_key_cert != NULL )
6132 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006133 mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next;
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02006134
6135 while( cur != NULL )
6136 {
6137 next = cur->next;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006138 mbedtls_free( cur );
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02006139 cur = next;
6140 }
6141 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006142#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02006143
Gilles Peskineeccd8882020-03-10 12:19:08 +01006144#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard6b7301c2017-08-15 12:08:45 +02006145 mbedtls_x509_crt_restart_free( &handshake->ecrs_ctx );
Hanno Becker3dad3112019-02-05 17:19:52 +00006146 if( handshake->ecrs_peer_cert != NULL )
6147 {
6148 mbedtls_x509_crt_free( handshake->ecrs_peer_cert );
6149 mbedtls_free( handshake->ecrs_peer_cert );
6150 }
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02006151#endif
6152
Hanno Becker75173122019-02-06 16:18:31 +00006153#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
6154 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
6155 mbedtls_pk_free( &handshake->peer_pubkey );
6156#endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
6157
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006158#if defined(MBEDTLS_SSL_PROTO_DTLS)
6159 mbedtls_free( handshake->verify_cookie );
Hanno Becker533ab5f2020-02-05 10:49:13 +00006160 mbedtls_ssl_flight_free( handshake->flight );
6161 mbedtls_ssl_buffering_free( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02006162#endif
6163
Hanno Becker4a63ed42019-01-08 11:39:35 +00006164#if defined(MBEDTLS_ECDH_C) && \
6165 defined(MBEDTLS_USE_PSA_CRYPTO)
6166 psa_destroy_key( handshake->ecdh_psa_privkey );
6167#endif /* MBEDTLS_ECDH_C && MBEDTLS_USE_PSA_CRYPTO */
6168
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006169 mbedtls_platform_zeroize( handshake,
6170 sizeof( mbedtls_ssl_handshake_params ) );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006171
6172#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
6173 /* If the buffers are too big - reallocate. Because of the way Mbed TLS
6174 * processes datagrams and the fact that a datagram is allowed to have
6175 * several records in it, it is possible that the I/O buffers are not
6176 * empty at this stage */
Andrzej Kurek4a063792020-10-21 15:08:44 +02006177 handle_buffer_resizing( ssl, 1, mbedtls_ssl_get_input_buflen( ssl ),
6178 mbedtls_ssl_get_output_buflen( ssl ) );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006179#endif
Paul Bakker48916f92012-09-16 19:57:18 +00006180}
6181
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006182void mbedtls_ssl_session_free( mbedtls_ssl_session *session )
Paul Bakker48916f92012-09-16 19:57:18 +00006183{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006184 if( session == NULL )
6185 return;
6186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006187#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker1294a0b2019-02-05 12:38:15 +00006188 ssl_clear_peer_cert( session );
Paul Bakkered27a042013-04-18 22:46:23 +02006189#endif
Paul Bakker0a597072012-09-25 21:55:46 +00006190
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02006191#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006192 mbedtls_free( session->ticket );
Paul Bakkera503a632013-08-14 13:48:06 +02006193#endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02006194
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006195 mbedtls_platform_zeroize( session, sizeof( mbedtls_ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00006196}
6197
Manuel Pégourié-Gonnard5c0e3772019-07-23 16:13:17 +02006198#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02006199
6200#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
6201#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 1u
6202#else
6203#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 0u
6204#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
6205
6206#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
6207#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 1u
6208#else
6209#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 0u
6210#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */
6211
6212#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6213#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 1u
6214#else
6215#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 0u
6216#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
6217
6218#if defined(MBEDTLS_SSL_ALPN)
6219#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 1u
6220#else
6221#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 0u
6222#endif /* MBEDTLS_SSL_ALPN */
6223
6224#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT 0
6225#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT 1
6226#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT 2
6227#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT 3
6228
6229#define SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG \
6230 ( (uint32_t) ( \
6231 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT ) | \
6232 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT ) | \
6233 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT ) | \
6234 ( SSL_SERIALIZED_CONTEXT_CONFIG_ALPN << SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT ) | \
6235 0u ) )
6236
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006237static unsigned char ssl_serialized_context_header[] = {
6238 MBEDTLS_VERSION_MAJOR,
6239 MBEDTLS_VERSION_MINOR,
6240 MBEDTLS_VERSION_PATCH,
Joe Subbianic045dc12021-07-14 12:31:31 +01006241 MBEDTLS_BYTE_1( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
6242 MBEDTLS_BYTE_0( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
6243 MBEDTLS_BYTE_2( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
6244 MBEDTLS_BYTE_1( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
6245 MBEDTLS_BYTE_0( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006246};
6247
Paul Bakker5121ce52009-01-03 21:22:43 +00006248/*
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006249 * Serialize a full SSL context
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02006250 *
6251 * The format of the serialized data is:
6252 * (in the presentation language of TLS, RFC 8446 section 3)
6253 *
6254 * // header
6255 * opaque mbedtls_version[3]; // major, minor, patch
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006256 * opaque context_format[5]; // version-specific field determining
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02006257 * // the format of the remaining
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006258 * // serialized data.
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02006259 * Note: When updating the format, remember to keep these
6260 * version+format bytes. (We may make their size part of the API.)
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02006261 *
6262 * // session sub-structure
6263 * opaque session<1..2^32-1>; // see mbedtls_ssl_session_save()
6264 * // transform sub-structure
6265 * uint8 random[64]; // ServerHello.random+ClientHello.random
6266 * uint8 in_cid<0..2^8-1> // Connection ID: expected incoming value
6267 * uint8 out_cid<0..2^8-1> // Connection ID: outgoing value to use
6268 * // fields from ssl_context
6269 * uint32 badmac_seen; // DTLS: number of records with failing MAC
6270 * uint64 in_window_top; // DTLS: last validated record seq_num
6271 * uint64 in_window; // DTLS: bitmask for replay protection
6272 * uint8 disable_datagram_packing; // DTLS: only one record per datagram
6273 * uint64 cur_out_ctr; // Record layer: outgoing sequence number
6274 * uint16 mtu; // DTLS: path mtu (max outgoing fragment size)
6275 * uint8 alpn_chosen<0..2^8-1> // ALPN: negotiated application protocol
6276 *
6277 * Note that many fields of the ssl_context or sub-structures are not
6278 * serialized, as they fall in one of the following categories:
6279 *
6280 * 1. forced value (eg in_left must be 0)
6281 * 2. pointer to dynamically-allocated memory (eg session, transform)
6282 * 3. value can be re-derived from other data (eg session keys from MS)
6283 * 4. value was temporary (eg content of input buffer)
6284 * 5. value will be provided by the user again (eg I/O callbacks and context)
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006285 */
6286int mbedtls_ssl_context_save( mbedtls_ssl_context *ssl,
6287 unsigned char *buf,
6288 size_t buf_len,
6289 size_t *olen )
6290{
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006291 unsigned char *p = buf;
6292 size_t used = 0;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006293 size_t session_len;
6294 int ret = 0;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006295
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02006296 /*
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006297 * Enforce usage restrictions, see "return BAD_INPUT_DATA" in
6298 * this function's documentation.
6299 *
6300 * These are due to assumptions/limitations in the implementation. Some of
6301 * them are likely to stay (no handshake in progress) some might go away
6302 * (only DTLS) but are currently used to simplify the implementation.
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02006303 */
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006304 /* The initial handshake must be over */
6305 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006306 {
6307 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Initial handshake isn't over" ) );
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02006308 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006309 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006310 if( ssl->handshake != NULL )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006311 {
6312 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Handshake isn't completed" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006313 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006314 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006315 /* Double-check that sub-structures are indeed ready */
6316 if( ssl->transform == NULL || ssl->session == NULL )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006317 {
6318 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Serialised structures aren't ready" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006319 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006320 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006321 /* There must be no pending incoming or outgoing data */
6322 if( mbedtls_ssl_check_pending( ssl ) != 0 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006323 {
6324 MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending incoming data" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006325 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006326 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006327 if( ssl->out_left != 0 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006328 {
6329 MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending outgoing data" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006330 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006331 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006332 /* Protocol must be DLTS, not TLS */
6333 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006334 {
6335 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only DTLS is supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006336 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006337 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006338 /* Version must be 1.2 */
6339 if( ssl->major_ver != MBEDTLS_SSL_MAJOR_VERSION_3 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006340 {
6341 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only version 1.2 supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006342 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006343 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006344 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006345 {
6346 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only version 1.2 supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006347 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006348 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006349 /* We must be using an AEAD ciphersuite */
6350 if( mbedtls_ssl_transform_uses_aead( ssl->transform ) != 1 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006351 {
6352 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only AEAD ciphersuites supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006353 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006354 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006355 /* Renegotiation must not be enabled */
6356#if defined(MBEDTLS_SSL_RENEGOTIATION)
6357 if( ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006358 {
6359 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Renegotiation must not be enabled" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006360 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006361 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006362#endif
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006363
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006364 /*
6365 * Version and format identifier
6366 */
6367 used += sizeof( ssl_serialized_context_header );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006368
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006369 if( used <= buf_len )
6370 {
6371 memcpy( p, ssl_serialized_context_header,
6372 sizeof( ssl_serialized_context_header ) );
6373 p += sizeof( ssl_serialized_context_header );
6374 }
6375
6376 /*
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006377 * Session (length + data)
6378 */
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02006379 ret = ssl_session_save( ssl->session, 1, NULL, 0, &session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006380 if( ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL )
6381 return( ret );
6382
6383 used += 4 + session_len;
6384 if( used <= buf_len )
6385 {
Joe Subbiani2f98d792021-08-20 11:44:44 +01006386 MBEDTLS_PUT_UINT32_BE( session_len, p, 0 );
6387 p += 4;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006388
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02006389 ret = ssl_session_save( ssl->session, 1,
6390 p, session_len, &session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006391 if( ret != 0 )
6392 return( ret );
6393
6394 p += session_len;
6395 }
6396
6397 /*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006398 * Transform
6399 */
6400 used += sizeof( ssl->transform->randbytes );
6401 if( used <= buf_len )
6402 {
6403 memcpy( p, ssl->transform->randbytes,
6404 sizeof( ssl->transform->randbytes ) );
6405 p += sizeof( ssl->transform->randbytes );
6406 }
6407
6408#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
6409 used += 2 + ssl->transform->in_cid_len + ssl->transform->out_cid_len;
6410 if( used <= buf_len )
6411 {
6412 *p++ = ssl->transform->in_cid_len;
6413 memcpy( p, ssl->transform->in_cid, ssl->transform->in_cid_len );
6414 p += ssl->transform->in_cid_len;
6415
6416 *p++ = ssl->transform->out_cid_len;
6417 memcpy( p, ssl->transform->out_cid, ssl->transform->out_cid_len );
6418 p += ssl->transform->out_cid_len;
6419 }
6420#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
6421
6422 /*
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02006423 * Saved fields from top-level ssl_context structure
6424 */
6425#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
6426 used += 4;
6427 if( used <= buf_len )
6428 {
Joe Subbiani2f98d792021-08-20 11:44:44 +01006429 MBEDTLS_PUT_UINT32_BE( ssl->badmac_seen, p, 0 );
6430 p += 4;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02006431 }
6432#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */
6433
6434#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6435 used += 16;
6436 if( used <= buf_len )
6437 {
Joe Subbiani2f98d792021-08-20 11:44:44 +01006438 MBEDTLS_PUT_UINT64_BE( ssl->in_window_top, p, 0 );
6439 p += 8;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02006440
Joe Subbiani2f98d792021-08-20 11:44:44 +01006441 MBEDTLS_PUT_UINT64_BE( ssl->in_window, p, 0 );
6442 p += 8;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02006443 }
6444#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
6445
6446#if defined(MBEDTLS_SSL_PROTO_DTLS)
6447 used += 1;
6448 if( used <= buf_len )
6449 {
6450 *p++ = ssl->disable_datagram_packing;
6451 }
6452#endif /* MBEDTLS_SSL_PROTO_DTLS */
6453
6454 used += 8;
6455 if( used <= buf_len )
6456 {
6457 memcpy( p, ssl->cur_out_ctr, 8 );
6458 p += 8;
6459 }
6460
6461#if defined(MBEDTLS_SSL_PROTO_DTLS)
6462 used += 2;
6463 if( used <= buf_len )
6464 {
Joe Subbiani2f98d792021-08-20 11:44:44 +01006465 MBEDTLS_PUT_UINT16_BE( ssl->mtu, p, 0 );
6466 p += 2;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02006467 }
6468#endif /* MBEDTLS_SSL_PROTO_DTLS */
6469
6470#if defined(MBEDTLS_SSL_ALPN)
6471 {
6472 const uint8_t alpn_len = ssl->alpn_chosen
Manuel Pégourié-Gonnardf041f4e2019-07-24 00:58:27 +02006473 ? (uint8_t) strlen( ssl->alpn_chosen )
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02006474 : 0;
6475
6476 used += 1 + alpn_len;
6477 if( used <= buf_len )
6478 {
6479 *p++ = alpn_len;
6480
6481 if( ssl->alpn_chosen != NULL )
6482 {
6483 memcpy( p, ssl->alpn_chosen, alpn_len );
6484 p += alpn_len;
6485 }
6486 }
6487 }
6488#endif /* MBEDTLS_SSL_ALPN */
6489
6490 /*
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006491 * Done
6492 */
6493 *olen = used;
6494
6495 if( used > buf_len )
6496 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006497
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006498 MBEDTLS_SSL_DEBUG_BUF( 4, "saved context", buf, used );
6499
Hanno Becker43aefe22020-02-05 10:44:56 +00006500 return( mbedtls_ssl_session_reset_int( ssl, 0 ) );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006501}
6502
6503/*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006504 * Helper to get TLS 1.2 PRF from ciphersuite
6505 * (Duplicates bits of logic from ssl_set_handshake_prfs().)
6506 */
Andrzej Kurekf9412f72022-10-18 07:30:19 -04006507#if defined(MBEDTLS_SHA256_C) || \
6508 (defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384))
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006509typedef int (*tls_prf_fn)( const unsigned char *secret, size_t slen,
6510 const char *label,
6511 const unsigned char *random, size_t rlen,
6512 unsigned char *dstbuf, size_t dlen );
6513static tls_prf_fn ssl_tls12prf_from_cs( int ciphersuite_id )
6514{
6515 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
6516 mbedtls_ssl_ciphersuite_from_id( ciphersuite_id );
6517
Andrzej Kurek84fc52c2022-10-25 04:18:30 -04006518 if( ciphersuite_info == NULL )
6519 return( NULL );
6520
6521#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02006522 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
6523 return( tls_prf_sha384 );
Andrzej Kurekf9412f72022-10-18 07:30:19 -04006524 else
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02006525#endif
Andrzej Kurekf9412f72022-10-18 07:30:19 -04006526#if defined(MBEDTLS_SHA256_C)
6527 {
Andrzej Kurek84fc52c2022-10-25 04:18:30 -04006528 if( ciphersuite_info->mac == MBEDTLS_MD_SHA256 )
Andrzej Kurekf9412f72022-10-18 07:30:19 -04006529 return( tls_prf_sha256 );
6530 }
6531#endif
6532#if !defined(MBEDTLS_SHA256_C) && \
6533 (!defined(MBEDTLS_SHA512_C) || defined(MBEDTLS_SHA512_NO_SHA384))
6534 (void) ciphersuite_info;
6535#endif
6536 return( NULL );
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006537}
6538
Andrzej Kurekf9412f72022-10-18 07:30:19 -04006539#endif /* MBEDTLS_SHA256_C ||
6540 (MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384) */
6541
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006542/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02006543 * Deserialize context, see mbedtls_ssl_context_save() for format.
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006544 *
6545 * This internal version is wrapped by a public function that cleans up in
6546 * case of error.
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006547 */
Manuel Pégourié-Gonnardd904d662022-06-17 10:24:00 +02006548MBEDTLS_CHECK_RETURN_CRITICAL
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006549static int ssl_context_load( mbedtls_ssl_context *ssl,
6550 const unsigned char *buf,
6551 size_t len )
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006552{
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006553 const unsigned char *p = buf;
6554 const unsigned char * const end = buf + len;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006555 size_t session_len;
Janos Follath865b3eb2019-12-16 11:46:15 +00006556 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Andrzej Kurekf9412f72022-10-18 07:30:19 -04006557 tls_prf_fn prf_func = NULL;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006558
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02006559 /*
6560 * The context should have been freshly setup or reset.
6561 * Give the user an error in case of obvious misuse.
Manuel Pégourié-Gonnard4ca930f2019-07-26 16:31:53 +02006562 * (Checking session is useful because it won't be NULL if we're
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02006563 * renegotiating, or if the user mistakenly loaded a session first.)
6564 */
6565 if( ssl->state != MBEDTLS_SSL_HELLO_REQUEST ||
6566 ssl->session != NULL )
6567 {
6568 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6569 }
6570
6571 /*
6572 * We can't check that the config matches the initial one, but we can at
6573 * least check it matches the requirements for serializing.
6574 */
6575 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
6576 ssl->conf->max_major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
6577 ssl->conf->min_major_ver > MBEDTLS_SSL_MAJOR_VERSION_3 ||
6578 ssl->conf->max_minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ||
6579 ssl->conf->min_minor_ver > MBEDTLS_SSL_MINOR_VERSION_3 ||
6580#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02006581 ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED ||
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02006582#endif
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02006583 0 )
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02006584 {
6585 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6586 }
6587
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006588 MBEDTLS_SSL_DEBUG_BUF( 4, "context to load", buf, len );
6589
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006590 /*
6591 * Check version identifier
6592 */
6593 if( (size_t)( end - p ) < sizeof( ssl_serialized_context_header ) )
6594 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6595
6596 if( memcmp( p, ssl_serialized_context_header,
6597 sizeof( ssl_serialized_context_header ) ) != 0 )
6598 {
6599 return( MBEDTLS_ERR_SSL_VERSION_MISMATCH );
6600 }
6601 p += sizeof( ssl_serialized_context_header );
6602
6603 /*
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006604 * Session
6605 */
6606 if( (size_t)( end - p ) < 4 )
6607 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6608
6609 session_len = ( (size_t) p[0] << 24 ) |
6610 ( (size_t) p[1] << 16 ) |
6611 ( (size_t) p[2] << 8 ) |
6612 ( (size_t) p[3] );
6613 p += 4;
6614
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006615 /* This has been allocated by ssl_handshake_init(), called by
Hanno Becker43aefe22020-02-05 10:44:56 +00006616 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006617 ssl->session = ssl->session_negotiate;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006618 ssl->session_in = ssl->session;
6619 ssl->session_out = ssl->session;
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006620 ssl->session_negotiate = NULL;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006621
6622 if( (size_t)( end - p ) < session_len )
6623 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6624
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02006625 ret = ssl_session_load( ssl->session, 1, p, session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006626 if( ret != 0 )
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02006627 {
6628 mbedtls_ssl_session_free( ssl->session );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006629 return( ret );
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02006630 }
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006631
6632 p += session_len;
6633
6634 /*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006635 * Transform
6636 */
6637
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006638 /* This has been allocated by ssl_handshake_init(), called by
Hanno Becker43aefe22020-02-05 10:44:56 +00006639 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006640 ssl->transform = ssl->transform_negotiate;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006641 ssl->transform_in = ssl->transform;
6642 ssl->transform_out = ssl->transform;
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006643 ssl->transform_negotiate = NULL;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006644
Andrzej Kurekf9412f72022-10-18 07:30:19 -04006645 prf_func = ssl_tls12prf_from_cs( ssl->session->ciphersuite );
6646 if( prf_func == NULL )
6647 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6648
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006649 /* Read random bytes and populate structure */
6650 if( (size_t)( end - p ) < sizeof( ssl->transform->randbytes ) )
6651 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6652
6653 ret = ssl_populate_transform( ssl->transform,
6654 ssl->session->ciphersuite,
6655 ssl->session->master,
6656#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
6657#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
6658 ssl->session->encrypt_then_mac,
6659#endif
6660#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
6661 ssl->session->trunc_hmac,
6662#endif
6663#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
6664#if defined(MBEDTLS_ZLIB_SUPPORT)
6665 ssl->session->compression,
6666#endif
Andrzej Kurekf9412f72022-10-18 07:30:19 -04006667 prf_func,
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006668 p, /* currently pointing to randbytes */
6669 MBEDTLS_SSL_MINOR_VERSION_3, /* (D)TLS 1.2 is forced */
6670 ssl->conf->endpoint,
6671 ssl );
6672 if( ret != 0 )
6673 return( ret );
6674
6675 p += sizeof( ssl->transform->randbytes );
6676
6677#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
6678 /* Read connection IDs and store them */
6679 if( (size_t)( end - p ) < 1 )
6680 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6681
6682 ssl->transform->in_cid_len = *p++;
6683
Manuel Pégourié-Gonnard5ea13b82019-07-23 15:02:54 +02006684 if( (size_t)( end - p ) < ssl->transform->in_cid_len + 1u )
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006685 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6686
6687 memcpy( ssl->transform->in_cid, p, ssl->transform->in_cid_len );
6688 p += ssl->transform->in_cid_len;
6689
6690 ssl->transform->out_cid_len = *p++;
6691
6692 if( (size_t)( end - p ) < ssl->transform->out_cid_len )
6693 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6694
6695 memcpy( ssl->transform->out_cid, p, ssl->transform->out_cid_len );
6696 p += ssl->transform->out_cid_len;
6697#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
6698
6699 /*
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02006700 * Saved fields from top-level ssl_context structure
6701 */
6702#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
6703 if( (size_t)( end - p ) < 4 )
6704 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6705
6706 ssl->badmac_seen = ( (uint32_t) p[0] << 24 ) |
6707 ( (uint32_t) p[1] << 16 ) |
6708 ( (uint32_t) p[2] << 8 ) |
6709 ( (uint32_t) p[3] );
6710 p += 4;
6711#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */
6712
6713#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6714 if( (size_t)( end - p ) < 16 )
6715 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6716
6717 ssl->in_window_top = ( (uint64_t) p[0] << 56 ) |
6718 ( (uint64_t) p[1] << 48 ) |
6719 ( (uint64_t) p[2] << 40 ) |
6720 ( (uint64_t) p[3] << 32 ) |
6721 ( (uint64_t) p[4] << 24 ) |
6722 ( (uint64_t) p[5] << 16 ) |
6723 ( (uint64_t) p[6] << 8 ) |
6724 ( (uint64_t) p[7] );
6725 p += 8;
6726
6727 ssl->in_window = ( (uint64_t) p[0] << 56 ) |
6728 ( (uint64_t) p[1] << 48 ) |
6729 ( (uint64_t) p[2] << 40 ) |
6730 ( (uint64_t) p[3] << 32 ) |
6731 ( (uint64_t) p[4] << 24 ) |
6732 ( (uint64_t) p[5] << 16 ) |
6733 ( (uint64_t) p[6] << 8 ) |
6734 ( (uint64_t) p[7] );
6735 p += 8;
6736#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
6737
6738#if defined(MBEDTLS_SSL_PROTO_DTLS)
6739 if( (size_t)( end - p ) < 1 )
6740 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6741
6742 ssl->disable_datagram_packing = *p++;
6743#endif /* MBEDTLS_SSL_PROTO_DTLS */
6744
6745 if( (size_t)( end - p ) < 8 )
6746 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6747
6748 memcpy( ssl->cur_out_ctr, p, 8 );
6749 p += 8;
6750
6751#if defined(MBEDTLS_SSL_PROTO_DTLS)
6752 if( (size_t)( end - p ) < 2 )
6753 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6754
6755 ssl->mtu = ( p[0] << 8 ) | p[1];
6756 p += 2;
6757#endif /* MBEDTLS_SSL_PROTO_DTLS */
6758
6759#if defined(MBEDTLS_SSL_ALPN)
6760 {
6761 uint8_t alpn_len;
6762 const char **cur;
6763
6764 if( (size_t)( end - p ) < 1 )
6765 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6766
6767 alpn_len = *p++;
6768
6769 if( alpn_len != 0 && ssl->conf->alpn_list != NULL )
6770 {
6771 /* alpn_chosen should point to an item in the configured list */
6772 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
6773 {
6774 if( strlen( *cur ) == alpn_len &&
6775 memcmp( p, cur, alpn_len ) == 0 )
6776 {
6777 ssl->alpn_chosen = *cur;
6778 break;
6779 }
6780 }
6781 }
6782
6783 /* can only happen on conf mismatch */
6784 if( alpn_len != 0 && ssl->alpn_chosen == NULL )
6785 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6786
6787 p += alpn_len;
6788 }
6789#endif /* MBEDTLS_SSL_ALPN */
6790
6791 /*
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02006792 * Forced fields from top-level ssl_context structure
6793 *
6794 * Most of them already set to the correct value by mbedtls_ssl_init() and
6795 * mbedtls_ssl_reset(), so we only need to set the remaining ones.
6796 */
6797 ssl->state = MBEDTLS_SSL_HANDSHAKE_OVER;
6798
6799 ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
6800 ssl->minor_ver = MBEDTLS_SSL_MINOR_VERSION_3;
6801
Hanno Becker361b10d2019-08-30 10:42:49 +01006802 /* Adjust pointers for header fields of outgoing records to
6803 * the given transform, accounting for explicit IV and CID. */
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00006804 mbedtls_ssl_update_out_pointers( ssl, ssl->transform );
Hanno Becker361b10d2019-08-30 10:42:49 +01006805
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02006806#if defined(MBEDTLS_SSL_PROTO_DTLS)
6807 ssl->in_epoch = 1;
6808#endif
6809
6810 /* mbedtls_ssl_reset() leaves the handshake sub-structure allocated,
6811 * which we don't want - otherwise we'd end up freeing the wrong transform
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00006812 * by calling mbedtls_ssl_handshake_wrapup_free_hs_transform()
6813 * inappropriately. */
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02006814 if( ssl->handshake != NULL )
6815 {
6816 mbedtls_ssl_handshake_free( ssl );
6817 mbedtls_free( ssl->handshake );
6818 ssl->handshake = NULL;
6819 }
6820
6821 /*
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006822 * Done - should have consumed entire buffer
6823 */
6824 if( p != end )
6825 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006826
6827 return( 0 );
6828}
6829
6830/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02006831 * Deserialize context: public wrapper for error cleaning
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006832 */
6833int mbedtls_ssl_context_load( mbedtls_ssl_context *context,
6834 const unsigned char *buf,
6835 size_t len )
6836{
6837 int ret = ssl_context_load( context, buf, len );
6838
6839 if( ret != 0 )
6840 mbedtls_ssl_free( context );
6841
6842 return( ret );
6843}
Manuel Pégourié-Gonnard5c0e3772019-07-23 16:13:17 +02006844#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006845
6846/*
Paul Bakker5121ce52009-01-03 21:22:43 +00006847 * Free an SSL context
6848 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006849void mbedtls_ssl_free( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00006850{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006851 if( ssl == NULL )
6852 return;
6853
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006854 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> free" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006855
Manuel Pégourié-Gonnard7ee6f0e2014-02-13 10:54:07 +01006856 if( ssl->out_buf != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00006857 {
sander-visserb8aa2072020-05-06 22:05:13 +02006858#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
6859 size_t out_buf_len = ssl->out_buf_len;
6860#else
6861 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
6862#endif
6863
Darryl Greenb33cc762019-11-28 14:29:44 +00006864 mbedtls_platform_zeroize( ssl->out_buf, out_buf_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006865 mbedtls_free( ssl->out_buf );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006866 ssl->out_buf = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00006867 }
6868
Manuel Pégourié-Gonnard7ee6f0e2014-02-13 10:54:07 +01006869 if( ssl->in_buf != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00006870 {
sander-visserb8aa2072020-05-06 22:05:13 +02006871#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
6872 size_t in_buf_len = ssl->in_buf_len;
6873#else
6874 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
6875#endif
6876
Darryl Greenb33cc762019-11-28 14:29:44 +00006877 mbedtls_platform_zeroize( ssl->in_buf, in_buf_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006878 mbedtls_free( ssl->in_buf );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006879 ssl->in_buf = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00006880 }
6881
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006882#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakker16770332013-10-11 09:59:44 +02006883 if( ssl->compress_buf != NULL )
6884 {
Angus Grattond8213d02016-05-25 20:56:48 +10006885 mbedtls_platform_zeroize( ssl->compress_buf, MBEDTLS_SSL_COMPRESS_BUFFER_LEN );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006886 mbedtls_free( ssl->compress_buf );
Paul Bakker16770332013-10-11 09:59:44 +02006887 }
6888#endif
6889
Paul Bakker48916f92012-09-16 19:57:18 +00006890 if( ssl->transform )
6891 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006892 mbedtls_ssl_transform_free( ssl->transform );
6893 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00006894 }
6895
6896 if( ssl->handshake )
6897 {
Gilles Peskine9b562d52018-04-25 20:32:43 +02006898 mbedtls_ssl_handshake_free( ssl );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006899 mbedtls_ssl_transform_free( ssl->transform_negotiate );
6900 mbedtls_ssl_session_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00006901
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006902 mbedtls_free( ssl->handshake );
6903 mbedtls_free( ssl->transform_negotiate );
6904 mbedtls_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00006905 }
6906
Paul Bakkerc0463502013-02-14 11:19:38 +01006907 if( ssl->session )
6908 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006909 mbedtls_ssl_session_free( ssl->session );
6910 mbedtls_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01006911 }
6912
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +02006913#if defined(MBEDTLS_X509_CRT_PARSE_C)
Paul Bakker66d5d072014-06-17 16:39:18 +02006914 if( ssl->hostname != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00006915 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006916 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006917 mbedtls_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00006918 }
Paul Bakker0be444a2013-08-27 21:55:01 +02006919#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00006920
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006921#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
6922 if( mbedtls_ssl_hw_record_finish != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00006923 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006924 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_finish()" ) );
6925 mbedtls_ssl_hw_record_finish( ssl );
Paul Bakker05ef8352012-05-08 09:17:57 +00006926 }
6927#endif
6928
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02006929#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006930 mbedtls_free( ssl->cli_id );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02006931#endif
6932
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006933 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00006934
Paul Bakker86f04f42013-02-14 11:20:09 +01006935 /* Actually clear after last debug message */
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006936 mbedtls_platform_zeroize( ssl, sizeof( mbedtls_ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006937}
6938
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006939/*
6940 * Initialze mbedtls_ssl_config
6941 */
6942void mbedtls_ssl_config_init( mbedtls_ssl_config *conf )
6943{
6944 memset( conf, 0, sizeof( mbedtls_ssl_config ) );
6945}
6946
Gilles Peskineeccd8882020-03-10 12:19:08 +01006947#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01006948static int ssl_preset_default_hashes[] = {
Gilles Peskinec54010c2021-05-12 22:52:09 +02006949#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01006950 MBEDTLS_MD_SHA512,
Gilles Peskinec54010c2021-05-12 22:52:09 +02006951#endif
6952#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01006953 MBEDTLS_MD_SHA384,
6954#endif
6955#if defined(MBEDTLS_SHA256_C)
6956 MBEDTLS_MD_SHA256,
6957 MBEDTLS_MD_SHA224,
6958#endif
Gilles Peskine5d2511c2017-05-12 13:16:40 +02006959#if defined(MBEDTLS_SHA1_C) && defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01006960 MBEDTLS_MD_SHA1,
6961#endif
6962 MBEDTLS_MD_NONE
6963};
Simon Butcherc97b6972015-12-27 23:48:17 +00006964#endif
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01006965
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006966static int ssl_preset_suiteb_ciphersuites[] = {
6967 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
6968 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
6969 0
6970};
6971
Gilles Peskineeccd8882020-03-10 12:19:08 +01006972#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006973static int ssl_preset_suiteb_hashes[] = {
6974 MBEDTLS_MD_SHA256,
6975 MBEDTLS_MD_SHA384,
6976 MBEDTLS_MD_NONE
6977};
6978#endif
6979
6980#if defined(MBEDTLS_ECP_C)
6981static mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = {
Jaeden Amerod4311042019-06-03 08:27:16 +01006982#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006983 MBEDTLS_ECP_DP_SECP256R1,
Jaeden Amerod4311042019-06-03 08:27:16 +01006984#endif
6985#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006986 MBEDTLS_ECP_DP_SECP384R1,
Jaeden Amerod4311042019-06-03 08:27:16 +01006987#endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006988 MBEDTLS_ECP_DP_NONE
6989};
6990#endif
6991
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006992/*
Tillmann Karras588ad502015-09-25 04:27:22 +02006993 * Load default in mbedtls_ssl_config
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006994 */
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02006995int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006996 int endpoint, int transport, int preset )
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006997{
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02006998#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Janos Follath865b3eb2019-12-16 11:46:15 +00006999 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02007000#endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007001
Manuel Pégourié-Gonnard0de074f2015-05-14 12:58:01 +02007002 /* Use the functions here so that they are covered in tests,
7003 * but otherwise access member directly for efficiency */
7004 mbedtls_ssl_conf_endpoint( conf, endpoint );
7005 mbedtls_ssl_conf_transport( conf, transport );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007006
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007007 /*
7008 * Things that are common to all presets
7009 */
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02007010#if defined(MBEDTLS_SSL_CLI_C)
7011 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
7012 {
7013 conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
7014#if defined(MBEDTLS_SSL_SESSION_TICKETS)
7015 conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED;
7016#endif
7017 }
7018#endif
7019
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02007020#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007021 conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED;
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02007022#endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007023
7024#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
7025 conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
7026#endif
7027
7028#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
7029 conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
7030#endif
7031
Manuel Pégourié-Gonnard17eab2b2015-05-05 16:34:53 +01007032#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
7033 conf->cbc_record_splitting = MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED;
7034#endif
7035
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02007036#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007037 conf->f_cookie_write = ssl_cookie_write_dummy;
7038 conf->f_cookie_check = ssl_cookie_check_dummy;
7039#endif
7040
7041#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
7042 conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
7043#endif
7044
Janos Follath088ce432017-04-10 12:42:31 +01007045#if defined(MBEDTLS_SSL_SRV_C)
7046 conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED;
7047#endif
7048
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007049#if defined(MBEDTLS_SSL_PROTO_DTLS)
7050 conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
7051 conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
7052#endif
7053
7054#if defined(MBEDTLS_SSL_RENEGOTIATION)
7055 conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
Andres AG2196c7f2016-12-15 17:01:16 +00007056 memset( conf->renego_period, 0x00, 2 );
7057 memset( conf->renego_period + 2, 0xFF, 6 );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007058#endif
7059
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007060#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
7061 if( endpoint == MBEDTLS_SSL_IS_SERVER )
7062 {
Hanno Becker00d0a682017-10-04 13:14:29 +01007063 const unsigned char dhm_p[] =
7064 MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN;
7065 const unsigned char dhm_g[] =
7066 MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN;
7067
Hanno Beckera90658f2017-10-04 15:29:08 +01007068 if ( ( ret = mbedtls_ssl_conf_dh_param_bin( conf,
7069 dhm_p, sizeof( dhm_p ),
7070 dhm_g, sizeof( dhm_g ) ) ) != 0 )
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007071 {
7072 return( ret );
7073 }
7074 }
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02007075#endif
7076
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007077 /*
7078 * Preset-specific defaults
7079 */
7080 switch( preset )
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007081 {
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007082 /*
7083 * NSA Suite B
7084 */
7085 case MBEDTLS_SSL_PRESET_SUITEB:
7086 conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
7087 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */
7088 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
7089 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
7090
7091 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
7092 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
7093 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
7094 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
7095 ssl_preset_suiteb_ciphersuites;
7096
7097#if defined(MBEDTLS_X509_CRT_PARSE_C)
7098 conf->cert_profile = &mbedtls_x509_crt_profile_suiteb;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007099#endif
7100
Gilles Peskineeccd8882020-03-10 12:19:08 +01007101#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007102 conf->sig_hashes = ssl_preset_suiteb_hashes;
7103#endif
7104
7105#if defined(MBEDTLS_ECP_C)
7106 conf->curve_list = ssl_preset_suiteb_curves;
7107#endif
Manuel Pégourié-Gonnardc98204e2015-08-11 04:21:01 +02007108 break;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007109
7110 /*
7111 * Default
7112 */
7113 default:
Ron Eldor5e9f14d2017-05-28 10:46:38 +03007114 conf->min_major_ver = ( MBEDTLS_SSL_MIN_MAJOR_VERSION >
7115 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION ) ?
7116 MBEDTLS_SSL_MIN_MAJOR_VERSION :
7117 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION;
7118 conf->min_minor_ver = ( MBEDTLS_SSL_MIN_MINOR_VERSION >
7119 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION ) ?
7120 MBEDTLS_SSL_MIN_MINOR_VERSION :
7121 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007122 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
7123 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
7124
7125#if defined(MBEDTLS_SSL_PROTO_DTLS)
7126 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
7127 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_2;
7128#endif
7129
7130 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
7131 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
7132 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
7133 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
7134 mbedtls_ssl_list_ciphersuites();
7135
7136#if defined(MBEDTLS_X509_CRT_PARSE_C)
7137 conf->cert_profile = &mbedtls_x509_crt_profile_default;
7138#endif
7139
Gilles Peskineeccd8882020-03-10 12:19:08 +01007140#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01007141 conf->sig_hashes = ssl_preset_default_hashes;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007142#endif
7143
7144#if defined(MBEDTLS_ECP_C)
7145 conf->curve_list = mbedtls_ecp_grp_id_list();
7146#endif
7147
7148#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
7149 conf->dhm_min_bitlen = 1024;
7150#endif
7151 }
7152
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007153 return( 0 );
7154}
7155
7156/*
7157 * Free mbedtls_ssl_config
7158 */
7159void mbedtls_ssl_config_free( mbedtls_ssl_config *conf )
7160{
7161#if defined(MBEDTLS_DHM_C)
7162 mbedtls_mpi_free( &conf->dhm_P );
7163 mbedtls_mpi_free( &conf->dhm_G );
7164#endif
7165
Gilles Peskineeccd8882020-03-10 12:19:08 +01007166#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007167 if( conf->psk != NULL )
7168 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05007169 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007170 mbedtls_free( conf->psk );
Azim Khan27e8a122018-03-21 14:24:11 +00007171 conf->psk = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007172 conf->psk_len = 0;
junyeonLEE316b1622017-12-20 16:29:30 +09007173 }
7174
7175 if( conf->psk_identity != NULL )
7176 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05007177 mbedtls_platform_zeroize( conf->psk_identity, conf->psk_identity_len );
junyeonLEE316b1622017-12-20 16:29:30 +09007178 mbedtls_free( conf->psk_identity );
Azim Khan27e8a122018-03-21 14:24:11 +00007179 conf->psk_identity = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007180 conf->psk_identity_len = 0;
7181 }
7182#endif
7183
7184#if defined(MBEDTLS_X509_CRT_PARSE_C)
7185 ssl_key_cert_free( conf->key_cert );
7186#endif
7187
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05007188 mbedtls_platform_zeroize( conf, sizeof( mbedtls_ssl_config ) );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007189}
7190
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02007191#if defined(MBEDTLS_PK_C) && \
7192 ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007193/*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007194 * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007195 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007196unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007197{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007198#if defined(MBEDTLS_RSA_C)
7199 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) )
7200 return( MBEDTLS_SSL_SIG_RSA );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007201#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007202#if defined(MBEDTLS_ECDSA_C)
7203 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) )
7204 return( MBEDTLS_SSL_SIG_ECDSA );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007205#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007206 return( MBEDTLS_SSL_SIG_ANON );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007207}
7208
Hanno Becker7e5437a2017-04-28 17:15:26 +01007209unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type )
7210{
7211 switch( type ) {
7212 case MBEDTLS_PK_RSA:
7213 return( MBEDTLS_SSL_SIG_RSA );
7214 case MBEDTLS_PK_ECDSA:
7215 case MBEDTLS_PK_ECKEY:
7216 return( MBEDTLS_SSL_SIG_ECDSA );
7217 default:
7218 return( MBEDTLS_SSL_SIG_ANON );
7219 }
7220}
7221
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007222mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig )
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007223{
7224 switch( sig )
7225 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007226#if defined(MBEDTLS_RSA_C)
7227 case MBEDTLS_SSL_SIG_RSA:
7228 return( MBEDTLS_PK_RSA );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007229#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007230#if defined(MBEDTLS_ECDSA_C)
7231 case MBEDTLS_SSL_SIG_ECDSA:
7232 return( MBEDTLS_PK_ECDSA );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007233#endif
7234 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007235 return( MBEDTLS_PK_NONE );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007236 }
7237}
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02007238#endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007239
Hanno Becker7e5437a2017-04-28 17:15:26 +01007240#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01007241 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01007242
7243/* Find an entry in a signature-hash set matching a given hash algorithm. */
7244mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set,
7245 mbedtls_pk_type_t sig_alg )
7246{
7247 switch( sig_alg )
7248 {
7249 case MBEDTLS_PK_RSA:
7250 return( set->rsa );
7251 case MBEDTLS_PK_ECDSA:
7252 return( set->ecdsa );
7253 default:
7254 return( MBEDTLS_MD_NONE );
7255 }
7256}
7257
7258/* Add a signature-hash-pair to a signature-hash set */
7259void mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set,
7260 mbedtls_pk_type_t sig_alg,
7261 mbedtls_md_type_t md_alg )
7262{
7263 switch( sig_alg )
7264 {
7265 case MBEDTLS_PK_RSA:
7266 if( set->rsa == MBEDTLS_MD_NONE )
7267 set->rsa = md_alg;
7268 break;
7269
7270 case MBEDTLS_PK_ECDSA:
7271 if( set->ecdsa == MBEDTLS_MD_NONE )
7272 set->ecdsa = md_alg;
7273 break;
7274
7275 default:
7276 break;
7277 }
7278}
7279
7280/* Allow exactly one hash algorithm for each signature. */
7281void mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set,
7282 mbedtls_md_type_t md_alg )
7283{
7284 set->rsa = md_alg;
7285 set->ecdsa = md_alg;
7286}
7287
7288#endif /* MBEDTLS_SSL_PROTO_TLS1_2) &&
Gilles Peskineeccd8882020-03-10 12:19:08 +01007289 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01007290
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02007291/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007292 * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02007293 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007294mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash )
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007295{
7296 switch( hash )
7297 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007298#if defined(MBEDTLS_MD5_C)
7299 case MBEDTLS_SSL_HASH_MD5:
7300 return( MBEDTLS_MD_MD5 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007301#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007302#if defined(MBEDTLS_SHA1_C)
7303 case MBEDTLS_SSL_HASH_SHA1:
7304 return( MBEDTLS_MD_SHA1 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007305#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007306#if defined(MBEDTLS_SHA256_C)
7307 case MBEDTLS_SSL_HASH_SHA224:
7308 return( MBEDTLS_MD_SHA224 );
7309 case MBEDTLS_SSL_HASH_SHA256:
7310 return( MBEDTLS_MD_SHA256 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007311#endif
Gilles Peskined2d59372021-05-12 22:43:27 +02007312#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007313 case MBEDTLS_SSL_HASH_SHA384:
7314 return( MBEDTLS_MD_SHA384 );
Gilles Peskinec54010c2021-05-12 22:52:09 +02007315#endif
7316#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007317 case MBEDTLS_SSL_HASH_SHA512:
7318 return( MBEDTLS_MD_SHA512 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007319#endif
7320 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007321 return( MBEDTLS_MD_NONE );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007322 }
7323}
7324
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007325/*
7326 * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX
7327 */
7328unsigned char mbedtls_ssl_hash_from_md_alg( int md )
7329{
7330 switch( md )
7331 {
7332#if defined(MBEDTLS_MD5_C)
7333 case MBEDTLS_MD_MD5:
7334 return( MBEDTLS_SSL_HASH_MD5 );
7335#endif
7336#if defined(MBEDTLS_SHA1_C)
7337 case MBEDTLS_MD_SHA1:
7338 return( MBEDTLS_SSL_HASH_SHA1 );
7339#endif
7340#if defined(MBEDTLS_SHA256_C)
7341 case MBEDTLS_MD_SHA224:
7342 return( MBEDTLS_SSL_HASH_SHA224 );
7343 case MBEDTLS_MD_SHA256:
7344 return( MBEDTLS_SSL_HASH_SHA256 );
7345#endif
Gilles Peskined2d59372021-05-12 22:43:27 +02007346#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007347 case MBEDTLS_MD_SHA384:
7348 return( MBEDTLS_SSL_HASH_SHA384 );
Gilles Peskinec54010c2021-05-12 22:52:09 +02007349#endif
7350#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007351 case MBEDTLS_MD_SHA512:
7352 return( MBEDTLS_SSL_HASH_SHA512 );
7353#endif
7354 default:
7355 return( MBEDTLS_SSL_HASH_NONE );
7356 }
7357}
7358
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02007359#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007360/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007361 * Check if a curve proposed by the peer is in our list.
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02007362 * Return 0 if we're willing to use it, -1 otherwise.
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007363 */
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02007364int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007365{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007366 const mbedtls_ecp_group_id *gid;
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007367
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02007368 if( ssl->conf->curve_list == NULL )
7369 return( -1 );
7370
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02007371 for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007372 if( *gid == grp_id )
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02007373 return( 0 );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007374
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02007375 return( -1 );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007376}
Manuel Pégourié-Gonnard298d6cc2022-02-14 11:34:47 +01007377
7378/*
7379 * Same as mbedtls_ssl_check_curve() but takes a TLS ID for the curve.
7380 */
7381int mbedtls_ssl_check_curve_tls_id( const mbedtls_ssl_context *ssl, uint16_t tls_id )
7382{
7383 const mbedtls_ecp_curve_info *curve_info =
7384 mbedtls_ecp_curve_info_from_tls_id( tls_id );
7385 if( curve_info == NULL )
7386 return( -1 );
7387 return( mbedtls_ssl_check_curve( ssl, curve_info->grp_id ) );
7388}
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02007389#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007390
Gilles Peskineeccd8882020-03-10 12:19:08 +01007391#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007392/*
7393 * Check if a hash proposed by the peer is in our list.
7394 * Return 0 if we're willing to use it, -1 otherwise.
7395 */
7396int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl,
7397 mbedtls_md_type_t md )
7398{
7399 const int *cur;
7400
7401 if( ssl->conf->sig_hashes == NULL )
7402 return( -1 );
7403
7404 for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ )
7405 if( *cur == (int) md )
7406 return( 0 );
7407
7408 return( -1 );
7409}
Gilles Peskineeccd8882020-03-10 12:19:08 +01007410#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007411
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007412#if defined(MBEDTLS_X509_CRT_PARSE_C)
7413int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,
7414 const mbedtls_ssl_ciphersuite_t *ciphersuite,
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007415 int cert_endpoint,
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02007416 uint32_t *flags )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007417{
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007418 int ret = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007419#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007420 int usage = 0;
7421#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007422#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007423 const char *ext_oid;
7424 size_t ext_len;
7425#endif
7426
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007427#if !defined(MBEDTLS_X509_CHECK_KEY_USAGE) && \
7428 !defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007429 ((void) cert);
7430 ((void) cert_endpoint);
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007431 ((void) flags);
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007432#endif
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007433
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007434#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
7435 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007436 {
7437 /* Server part of the key exchange */
7438 switch( ciphersuite->key_exchange )
7439 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007440 case MBEDTLS_KEY_EXCHANGE_RSA:
7441 case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01007442 usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007443 break;
7444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007445 case MBEDTLS_KEY_EXCHANGE_DHE_RSA:
7446 case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
7447 case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
7448 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007449 break;
7450
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007451 case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
7452 case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01007453 usage = MBEDTLS_X509_KU_KEY_AGREEMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007454 break;
7455
7456 /* Don't use default: we want warnings when adding new values */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007457 case MBEDTLS_KEY_EXCHANGE_NONE:
7458 case MBEDTLS_KEY_EXCHANGE_PSK:
7459 case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
7460 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
Manuel Pégourié-Gonnard557535d2015-09-15 17:53:32 +02007461 case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007462 usage = 0;
7463 }
7464 }
7465 else
7466 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007467 /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */
7468 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007469 }
7470
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007471 if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 )
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007472 {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01007473 *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007474 ret = -1;
7475 }
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007476#else
7477 ((void) ciphersuite);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007478#endif /* MBEDTLS_X509_CHECK_KEY_USAGE */
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007479
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007480#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
7481 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007482 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007483 ext_oid = MBEDTLS_OID_SERVER_AUTH;
7484 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH );
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007485 }
7486 else
7487 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007488 ext_oid = MBEDTLS_OID_CLIENT_AUTH;
7489 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH );
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007490 }
7491
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007492 if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 )
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007493 {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01007494 *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007495 ret = -1;
7496 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007497#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007498
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007499 return( ret );
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007500}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007501#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3a306b92014-04-29 15:11:17 +02007502
Simon Butcher99000142016-10-13 17:21:01 +01007503int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md )
7504{
7505#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
7506 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
7507 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
7508
7509 switch( md )
7510 {
7511#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
7512#if defined(MBEDTLS_MD5_C)
7513 case MBEDTLS_SSL_HASH_MD5:
Janos Follath182013f2016-10-25 10:50:22 +01007514 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
Simon Butcher99000142016-10-13 17:21:01 +01007515#endif
7516#if defined(MBEDTLS_SHA1_C)
7517 case MBEDTLS_SSL_HASH_SHA1:
7518 ssl->handshake->calc_verify = ssl_calc_verify_tls;
7519 break;
7520#endif
7521#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
Gilles Peskined2d59372021-05-12 22:43:27 +02007522#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
Simon Butcher99000142016-10-13 17:21:01 +01007523 case MBEDTLS_SSL_HASH_SHA384:
7524 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384;
7525 break;
7526#endif
7527#if defined(MBEDTLS_SHA256_C)
7528 case MBEDTLS_SSL_HASH_SHA256:
7529 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256;
7530 break;
7531#endif
7532 default:
7533 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
7534 }
7535
7536 return 0;
7537#else /* !MBEDTLS_SSL_PROTO_TLS1_2 */
7538 (void) ssl;
7539 (void) md;
7540
7541 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
7542#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
7543}
7544
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007545#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
7546 defined(MBEDTLS_SSL_PROTO_TLS1_1)
7547int mbedtls_ssl_get_key_exchange_md_ssl_tls( mbedtls_ssl_context *ssl,
7548 unsigned char *output,
7549 unsigned char *data, size_t data_len )
7550{
7551 int ret = 0;
7552 mbedtls_md5_context mbedtls_md5;
7553 mbedtls_sha1_context mbedtls_sha1;
7554
7555 mbedtls_md5_init( &mbedtls_md5 );
7556 mbedtls_sha1_init( &mbedtls_sha1 );
7557
7558 /*
7559 * digitally-signed struct {
7560 * opaque md5_hash[16];
7561 * opaque sha_hash[20];
7562 * };
7563 *
7564 * md5_hash
7565 * MD5(ClientHello.random + ServerHello.random
7566 * + ServerParams);
7567 * sha_hash
7568 * SHA(ClientHello.random + ServerHello.random
7569 * + ServerParams);
7570 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007571 if( ( ret = mbedtls_md5_starts_ret( &mbedtls_md5 ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007572 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007573 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_starts_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007574 goto exit;
7575 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007576 if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007577 ssl->handshake->randbytes, 64 ) ) != 0 )
7578 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007579 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007580 goto exit;
7581 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007582 if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5, data, data_len ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007583 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007584 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007585 goto exit;
7586 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007587 if( ( ret = mbedtls_md5_finish_ret( &mbedtls_md5, output ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007588 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007589 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_finish_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007590 goto exit;
7591 }
7592
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007593 if( ( ret = mbedtls_sha1_starts_ret( &mbedtls_sha1 ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007594 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007595 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_starts_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007596 goto exit;
7597 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007598 if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007599 ssl->handshake->randbytes, 64 ) ) != 0 )
7600 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007601 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007602 goto exit;
7603 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007604 if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1, data,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007605 data_len ) ) != 0 )
7606 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007607 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007608 goto exit;
7609 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007610 if( ( ret = mbedtls_sha1_finish_ret( &mbedtls_sha1,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007611 output + 16 ) ) != 0 )
7612 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007613 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_finish_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007614 goto exit;
7615 }
7616
7617exit:
7618 mbedtls_md5_free( &mbedtls_md5 );
7619 mbedtls_sha1_free( &mbedtls_sha1 );
7620
7621 if( ret != 0 )
7622 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7623 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7624
7625 return( ret );
7626
7627}
7628#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
7629 MBEDTLS_SSL_PROTO_TLS1_1 */
7630
7631#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
7632 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007633
7634#if defined(MBEDTLS_USE_PSA_CRYPTO)
7635int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
7636 unsigned char *hash, size_t *hashlen,
7637 unsigned char *data, size_t data_len,
7638 mbedtls_md_type_t md_alg )
7639{
Andrzej Kurek814feff2019-01-14 04:35:19 -05007640 psa_status_t status;
Jaeden Amero34973232019-02-20 10:32:28 +00007641 psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT;
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007642 psa_algorithm_t hash_alg = mbedtls_psa_translate_md( md_alg );
7643
Hanno Becker4c8c7aa2019-04-10 09:25:41 +01007644 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Perform PSA-based computation of digest of ServerKeyExchange" ) );
Andrzej Kurek814feff2019-01-14 04:35:19 -05007645
7646 if( ( status = psa_hash_setup( &hash_operation,
7647 hash_alg ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007648 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05007649 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_setup", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007650 goto exit;
7651 }
7652
Andrzej Kurek814feff2019-01-14 04:35:19 -05007653 if( ( status = psa_hash_update( &hash_operation, ssl->handshake->randbytes,
7654 64 ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007655 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05007656 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_update", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007657 goto exit;
7658 }
7659
Andrzej Kurek814feff2019-01-14 04:35:19 -05007660 if( ( status = psa_hash_update( &hash_operation,
7661 data, data_len ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007662 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05007663 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_update", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007664 goto exit;
7665 }
7666
Ronald Cron3a95d2b2021-10-18 09:47:58 +02007667 if( ( status = psa_hash_finish( &hash_operation, hash, PSA_HASH_MAX_SIZE,
Andrzej Kurek814feff2019-01-14 04:35:19 -05007668 hashlen ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007669 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05007670 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_finish", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007671 goto exit;
7672 }
7673
7674exit:
Andrzej Kurek814feff2019-01-14 04:35:19 -05007675 if( status != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007676 {
7677 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7678 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Andrzej Kurek814feff2019-01-14 04:35:19 -05007679 switch( status )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007680 {
7681 case PSA_ERROR_NOT_SUPPORTED:
7682 return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE );
Andrzej Kurek814feff2019-01-14 04:35:19 -05007683 case PSA_ERROR_BAD_STATE: /* Intentional fallthrough */
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007684 case PSA_ERROR_BUFFER_TOO_SMALL:
7685 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
7686 case PSA_ERROR_INSUFFICIENT_MEMORY:
7687 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
7688 default:
7689 return( MBEDTLS_ERR_MD_HW_ACCEL_FAILED );
7690 }
7691 }
7692 return( 0 );
7693}
7694
7695#else
7696
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007697int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
Gilles Peskineca1d7422018-04-24 11:53:22 +02007698 unsigned char *hash, size_t *hashlen,
7699 unsigned char *data, size_t data_len,
7700 mbedtls_md_type_t md_alg )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007701{
7702 int ret = 0;
7703 mbedtls_md_context_t ctx;
7704 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );
Gilles Peskineca1d7422018-04-24 11:53:22 +02007705 *hashlen = mbedtls_md_get_size( md_info );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007706
Hanno Becker4c8c7aa2019-04-10 09:25:41 +01007707 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Perform mbedtls-based computation of digest of ServerKeyExchange" ) );
Andrzej Kurek814feff2019-01-14 04:35:19 -05007708
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007709 mbedtls_md_init( &ctx );
7710
7711 /*
7712 * digitally-signed struct {
7713 * opaque client_random[32];
7714 * opaque server_random[32];
7715 * ServerDHParams params;
7716 * };
7717 */
7718 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
7719 {
7720 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
7721 goto exit;
7722 }
7723 if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 )
7724 {
7725 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_starts", ret );
7726 goto exit;
7727 }
7728 if( ( ret = mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 ) ) != 0 )
7729 {
7730 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
7731 goto exit;
7732 }
7733 if( ( ret = mbedtls_md_update( &ctx, data, data_len ) ) != 0 )
7734 {
7735 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
7736 goto exit;
7737 }
Gilles Peskineca1d7422018-04-24 11:53:22 +02007738 if( ( ret = mbedtls_md_finish( &ctx, hash ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007739 {
7740 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_finish", ret );
7741 goto exit;
7742 }
7743
7744exit:
7745 mbedtls_md_free( &ctx );
7746
7747 if( ret != 0 )
7748 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7749 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7750
7751 return( ret );
7752}
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007753#endif /* MBEDTLS_USE_PSA_CRYPTO */
7754
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007755#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
7756 MBEDTLS_SSL_PROTO_TLS1_2 */
7757
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007758#endif /* MBEDTLS_SSL_TLS_C */