blob: 041578e68f7041923b98388d00cdacf73116fb49 [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#if defined(MBEDTLS_PLATFORM_C)
33#include "mbedtls/platform.h"
34#else
35#include <stdlib.h>
36#define mbedtls_calloc calloc
37#define mbedtls_free free
SimonBd5800b72016-04-26 07:43:27 +010038#endif
39
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000040#include "mbedtls/ssl.h"
Manuel Pégourié-Gonnard5e94dde2015-05-26 11:57:05 +020041#include "mbedtls/ssl_internal.h"
Janos Follath73c616b2019-12-18 15:07:04 +000042#include "mbedtls/debug.h"
43#include "mbedtls/error.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050044#include "mbedtls/platform_util.h"
Hanno Beckera835da52019-05-16 12:39:07 +010045#include "mbedtls/version.h"
Paul Bakker0be444a2013-08-27 21:55:01 +020046
Rich Evans00ab4702015-02-06 13:43:58 +000047#include <string.h>
48
Andrzej Kurekd6db9be2019-01-10 05:27:10 -050049#if defined(MBEDTLS_USE_PSA_CRYPTO)
50#include "mbedtls/psa_util.h"
51#include "psa/crypto.h"
52#endif
53
Janos Follath23bdca02016-10-07 14:47:14 +010054#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000055#include "mbedtls/oid.h"
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +020056#endif
57
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +020058#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker2b1e3542018-08-06 11:19:13 +010059
Hanno Beckera0e20d02019-05-15 14:03:01 +010060#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerf8542cf2019-04-09 15:22:03 +010061/* Top-level Connection ID API */
62
Hanno Becker8367ccc2019-05-14 11:30:10 +010063int mbedtls_ssl_conf_cid( mbedtls_ssl_config *conf,
64 size_t len,
65 int ignore_other_cid )
Hanno Beckerad4a1372019-05-03 13:06:44 +010066{
67 if( len > MBEDTLS_SSL_CID_IN_LEN_MAX )
68 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
69
Hanno Becker611ac772019-05-14 11:45:26 +010070 if( ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_FAIL &&
71 ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_IGNORE )
72 {
73 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
74 }
75
76 conf->ignore_unexpected_cid = ignore_other_cid;
Hanno Beckerad4a1372019-05-03 13:06:44 +010077 conf->cid_len = len;
78 return( 0 );
79}
80
Hanno Beckerf8542cf2019-04-09 15:22:03 +010081int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
82 int enable,
83 unsigned char const *own_cid,
84 size_t own_cid_len )
85{
Hanno Becker76a79ab2019-05-03 14:38:32 +010086 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
87 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
88
Hanno Beckerca092242019-04-25 16:01:49 +010089 ssl->negotiate_cid = enable;
90 if( enable == MBEDTLS_SSL_CID_DISABLED )
91 {
92 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Disable use of CID extension." ) );
93 return( 0 );
94 }
95 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Enable use of CID extension." ) );
Hanno Beckerad4a1372019-05-03 13:06:44 +010096 MBEDTLS_SSL_DEBUG_BUF( 3, "Own CID", own_cid, own_cid_len );
Hanno Beckerca092242019-04-25 16:01:49 +010097
Hanno Beckerad4a1372019-05-03 13:06:44 +010098 if( own_cid_len != ssl->conf->cid_len )
Hanno Beckerca092242019-04-25 16:01:49 +010099 {
Hanno Beckerad4a1372019-05-03 13:06:44 +0100100 MBEDTLS_SSL_DEBUG_MSG( 3, ( "CID length %u does not match CID length %u in config",
101 (unsigned) own_cid_len,
102 (unsigned) ssl->conf->cid_len ) );
Hanno Beckerca092242019-04-25 16:01:49 +0100103 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
104 }
105
106 memcpy( ssl->own_cid, own_cid, own_cid_len );
Hanno Beckerb7ee0cf2019-04-30 14:07:31 +0100107 /* Truncation is not an issue here because
108 * MBEDTLS_SSL_CID_IN_LEN_MAX at most 255. */
109 ssl->own_cid_len = (uint8_t) own_cid_len;
Hanno Beckerca092242019-04-25 16:01:49 +0100110
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100111 return( 0 );
112}
113
114int mbedtls_ssl_get_peer_cid( mbedtls_ssl_context *ssl,
115 int *enabled,
116 unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ],
117 size_t *peer_cid_len )
118{
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100119 *enabled = MBEDTLS_SSL_CID_DISABLED;
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100120
Hanno Becker76a79ab2019-05-03 14:38:32 +0100121 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
122 ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
123 {
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100124 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Hanno Becker76a79ab2019-05-03 14:38:32 +0100125 }
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100126
Hanno Beckerc5f24222019-05-03 12:54:52 +0100127 /* We report MBEDTLS_SSL_CID_DISABLED in case the CID extensions
128 * were used, but client and server requested the empty CID.
129 * This is indistinguishable from not using the CID extension
130 * in the first place. */
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100131 if( ssl->transform_in->in_cid_len == 0 &&
132 ssl->transform_in->out_cid_len == 0 )
133 {
134 return( 0 );
135 }
136
Hanno Becker615ef172019-05-22 16:50:35 +0100137 if( peer_cid_len != NULL )
138 {
139 *peer_cid_len = ssl->transform_in->out_cid_len;
140 if( peer_cid != NULL )
141 {
142 memcpy( peer_cid, ssl->transform_in->out_cid,
143 ssl->transform_in->out_cid_len );
144 }
145 }
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100146
147 *enabled = MBEDTLS_SSL_CID_ENABLED;
148
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100149 return( 0 );
150}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100151#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100152
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200154
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200155#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200156/*
157 * Convert max_fragment_length codes to length.
158 * RFC 6066 says:
159 * enum{
160 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
161 * } MaxFragmentLength;
162 * and we add 0 -> extension unused
163 */
Angus Grattond8213d02016-05-25 20:56:48 +1000164static unsigned int ssl_mfl_code_to_length( int mfl )
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200165{
Angus Grattond8213d02016-05-25 20:56:48 +1000166 switch( mfl )
167 {
168 case MBEDTLS_SSL_MAX_FRAG_LEN_NONE:
169 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
170 case MBEDTLS_SSL_MAX_FRAG_LEN_512:
171 return 512;
172 case MBEDTLS_SSL_MAX_FRAG_LEN_1024:
173 return 1024;
174 case MBEDTLS_SSL_MAX_FRAG_LEN_2048:
175 return 2048;
176 case MBEDTLS_SSL_MAX_FRAG_LEN_4096:
177 return 4096;
178 default:
179 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
180 }
181}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200182#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200183
Hanno Becker52055ae2019-02-06 14:30:46 +0000184int mbedtls_ssl_session_copy( mbedtls_ssl_session *dst,
185 const mbedtls_ssl_session *src )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200186{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187 mbedtls_ssl_session_free( dst );
188 memcpy( dst, src, sizeof( mbedtls_ssl_session ) );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200189
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200190#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker6d1986e2019-02-07 12:27:42 +0000191
192#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200193 if( src->peer_cert != NULL )
194 {
Janos Follath865b3eb2019-12-16 11:46:15 +0000195 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker2292d1f2013-09-15 17:06:49 +0200196
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200197 dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200198 if( dst->peer_cert == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200199 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200201 mbedtls_x509_crt_init( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200202
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200203 if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p,
Manuel Pégourié-Gonnard4d2a8eb2014-06-13 20:33:27 +0200204 src->peer_cert->raw.len ) ) != 0 )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200205 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200206 mbedtls_free( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200207 dst->peer_cert = NULL;
208 return( ret );
209 }
210 }
Hanno Becker6d1986e2019-02-07 12:27:42 +0000211#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker9198ad12019-02-05 17:00:50 +0000212 if( src->peer_cert_digest != NULL )
213 {
Hanno Becker9198ad12019-02-05 17:00:50 +0000214 dst->peer_cert_digest =
Hanno Beckeraccc5992019-02-25 10:06:59 +0000215 mbedtls_calloc( 1, src->peer_cert_digest_len );
Hanno Becker9198ad12019-02-05 17:00:50 +0000216 if( dst->peer_cert_digest == NULL )
217 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
218
219 memcpy( dst->peer_cert_digest, src->peer_cert_digest,
220 src->peer_cert_digest_len );
221 dst->peer_cert_digest_type = src->peer_cert_digest_type;
Hanno Beckeraccc5992019-02-25 10:06:59 +0000222 dst->peer_cert_digest_len = src->peer_cert_digest_len;
Hanno Becker9198ad12019-02-05 17:00:50 +0000223 }
224#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
225
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200226#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200227
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +0200228#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200229 if( src->ticket != NULL )
230 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200231 dst->ticket = mbedtls_calloc( 1, src->ticket_len );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200232 if( dst->ticket == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200233 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200234
235 memcpy( dst->ticket, src->ticket, src->ticket_len );
236 }
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +0200237#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200238
239 return( 0 );
240}
241
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500242#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
243static 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}
263#endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
264
Paul Bakker5121ce52009-01-03 21:22:43 +0000265/*
266 * Key material generation
267 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268#if defined(MBEDTLS_SSL_PROTO_SSL3)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200269static int ssl3_prf( const unsigned char *secret, size_t slen,
270 const char *label,
271 const unsigned char *random, size_t rlen,
Paul Bakker5f70b252012-09-13 14:23:06 +0000272 unsigned char *dstbuf, size_t dlen )
273{
Andres Amaya Garcia33952502017-07-20 16:29:16 +0100274 int ret = 0;
Paul Bakker5f70b252012-09-13 14:23:06 +0000275 size_t i;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +0200276 mbedtls_md5_context md5;
277 mbedtls_sha1_context sha1;
Paul Bakker5f70b252012-09-13 14:23:06 +0000278 unsigned char padding[16];
279 unsigned char sha1sum[20];
280 ((void)label);
281
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +0200282 mbedtls_md5_init( &md5 );
283 mbedtls_sha1_init( &sha1 );
Paul Bakker5b4af392014-06-26 12:09:34 +0200284
Paul Bakker5f70b252012-09-13 14:23:06 +0000285 /*
286 * SSLv3:
287 * block =
288 * MD5( secret + SHA1( 'A' + secret + random ) ) +
289 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
290 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
291 * ...
292 */
293 for( i = 0; i < dlen / 16; i++ )
294 {
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200295 memset( padding, (unsigned char) ('A' + i), 1 + i );
Paul Bakker5f70b252012-09-13 14:23:06 +0000296
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100297 if( ( ret = mbedtls_sha1_starts_ret( &sha1 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100298 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100299 if( ( ret = mbedtls_sha1_update_ret( &sha1, padding, 1 + i ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100300 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100301 if( ( ret = mbedtls_sha1_update_ret( &sha1, secret, slen ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100302 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100303 if( ( ret = mbedtls_sha1_update_ret( &sha1, random, rlen ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100304 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100305 if( ( ret = mbedtls_sha1_finish_ret( &sha1, sha1sum ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100306 goto exit;
Paul Bakker5f70b252012-09-13 14:23:06 +0000307
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100308 if( ( ret = mbedtls_md5_starts_ret( &md5 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100309 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100310 if( ( ret = mbedtls_md5_update_ret( &md5, secret, slen ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100311 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100312 if( ( ret = mbedtls_md5_update_ret( &md5, sha1sum, 20 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100313 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100314 if( ( ret = mbedtls_md5_finish_ret( &md5, dstbuf + i * 16 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100315 goto exit;
Paul Bakker5f70b252012-09-13 14:23:06 +0000316 }
317
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100318exit:
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +0200319 mbedtls_md5_free( &md5 );
320 mbedtls_sha1_free( &sha1 );
Paul Bakker5f70b252012-09-13 14:23:06 +0000321
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500322 mbedtls_platform_zeroize( padding, sizeof( padding ) );
323 mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) );
Paul Bakker5f70b252012-09-13 14:23:06 +0000324
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100325 return( ret );
Paul Bakker5f70b252012-09-13 14:23:06 +0000326}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5f70b252012-09-13 14:23:06 +0000328
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200330static int tls1_prf( const unsigned char *secret, size_t slen,
331 const char *label,
332 const unsigned char *random, size_t rlen,
Paul Bakker23986e52011-04-24 08:57:21 +0000333 unsigned char *dstbuf, size_t dlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000334{
Paul Bakker23986e52011-04-24 08:57:21 +0000335 size_t nb, hs;
336 size_t i, j, k;
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200337 const unsigned char *S1, *S2;
Ron Eldor3b350852019-05-07 18:31:49 +0300338 unsigned char *tmp;
339 size_t tmp_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000340 unsigned char h_i[20];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200341 const mbedtls_md_info_t *md_info;
342 mbedtls_md_context_t md_ctx;
Janos Follath865b3eb2019-12-16 11:46:15 +0000343 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100344
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200345 mbedtls_md_init( &md_ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000346
Ron Eldor3b350852019-05-07 18:31:49 +0300347 tmp_len = 20 + strlen( label ) + rlen;
348 tmp = mbedtls_calloc( 1, tmp_len );
349 if( tmp == NULL )
350 {
351 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
352 goto exit;
353 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000354
355 hs = ( slen + 1 ) / 2;
356 S1 = secret;
357 S2 = secret + slen - hs;
358
359 nb = strlen( label );
360 memcpy( tmp + 20, label, nb );
361 memcpy( tmp + 20 + nb, random, rlen );
362 nb += rlen;
363
364 /*
365 * First compute P_md5(secret,label+random)[0..dlen]
366 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200367 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ) ) == NULL )
Ron Eldor3b350852019-05-07 18:31:49 +0300368 {
369 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
370 goto exit;
371 }
Manuel Pégourié-Gonnard7da726b2015-03-24 18:08:19 +0100372
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200373 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
Ron Eldor3b350852019-05-07 18:31:49 +0300374 {
375 goto exit;
376 }
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100377
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200378 mbedtls_md_hmac_starts( &md_ctx, S1, hs );
379 mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );
380 mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );
Paul Bakker5121ce52009-01-03 21:22:43 +0000381
382 for( i = 0; i < dlen; i += 16 )
383 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200384 mbedtls_md_hmac_reset ( &md_ctx );
385 mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 + nb );
386 mbedtls_md_hmac_finish( &md_ctx, h_i );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100387
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200388 mbedtls_md_hmac_reset ( &md_ctx );
389 mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 );
390 mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );
Paul Bakker5121ce52009-01-03 21:22:43 +0000391
392 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
393
394 for( j = 0; j < k; j++ )
395 dstbuf[i + j] = h_i[j];
396 }
397
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200398 mbedtls_md_free( &md_ctx );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100399
Paul Bakker5121ce52009-01-03 21:22:43 +0000400 /*
401 * XOR out with P_sha1(secret,label+random)[0..dlen]
402 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200403 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL )
Ron Eldor3b350852019-05-07 18:31:49 +0300404 {
405 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
406 goto exit;
407 }
Manuel Pégourié-Gonnard7da726b2015-03-24 18:08:19 +0100408
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200409 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
Ron Eldor3b350852019-05-07 18:31:49 +0300410 {
411 goto exit;
412 }
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100413
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414 mbedtls_md_hmac_starts( &md_ctx, S2, hs );
415 mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );
416 mbedtls_md_hmac_finish( &md_ctx, tmp );
Paul Bakker5121ce52009-01-03 21:22:43 +0000417
418 for( i = 0; i < dlen; i += 20 )
419 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200420 mbedtls_md_hmac_reset ( &md_ctx );
421 mbedtls_md_hmac_update( &md_ctx, tmp, 20 + nb );
422 mbedtls_md_hmac_finish( &md_ctx, h_i );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100423
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200424 mbedtls_md_hmac_reset ( &md_ctx );
425 mbedtls_md_hmac_update( &md_ctx, tmp, 20 );
426 mbedtls_md_hmac_finish( &md_ctx, tmp );
Paul Bakker5121ce52009-01-03 21:22:43 +0000427
428 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
429
430 for( j = 0; j < k; j++ )
431 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
432 }
433
Ron Eldor3b350852019-05-07 18:31:49 +0300434exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200435 mbedtls_md_free( &md_ctx );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100436
Ron Eldor3b350852019-05-07 18:31:49 +0300437 mbedtls_platform_zeroize( tmp, tmp_len );
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500438 mbedtls_platform_zeroize( h_i, sizeof( h_i ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000439
Ron Eldor3b350852019-05-07 18:31:49 +0300440 mbedtls_free( tmp );
441 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000442}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443#endif /* MBEDTLS_SSL_PROTO_TLS1) || MBEDTLS_SSL_PROTO_TLS1_1 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200445#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Andrzej Kurekc929a822019-01-14 03:51:11 -0500446#if defined(MBEDTLS_USE_PSA_CRYPTO)
k-stachowiak81053a52019-08-17 10:30:28 +0200447
448static psa_status_t setup_psa_key_derivation( psa_key_derivation_operation_t* derivation,
Ronald Croncf56a0a2020-08-04 09:51:30 +0200449 psa_key_id_t key,
k-stachowiak81053a52019-08-17 10:30:28 +0200450 psa_algorithm_t alg,
451 const unsigned char* seed, size_t seed_length,
452 const unsigned char* label, size_t label_length,
453 size_t capacity )
454{
455 psa_status_t status;
456
457 status = psa_key_derivation_setup( derivation, alg );
458 if( status != PSA_SUCCESS )
459 return( status );
460
461 if( PSA_ALG_IS_TLS12_PRF( alg ) || PSA_ALG_IS_TLS12_PSK_TO_MS( alg ) )
462 {
463 status = psa_key_derivation_input_bytes( derivation,
464 PSA_KEY_DERIVATION_INPUT_SEED,
465 seed, seed_length );
466 if( status != PSA_SUCCESS )
467 return( status );
468
Ronald Croncf56a0a2020-08-04 09:51:30 +0200469 if( mbedtls_svc_key_id_is_null( key ) )
Gilles Peskine311f54d2019-09-23 18:19:22 +0200470 {
471 status = psa_key_derivation_input_bytes(
472 derivation, PSA_KEY_DERIVATION_INPUT_SECRET,
473 NULL, 0 );
474 }
475 else
476 {
477 status = psa_key_derivation_input_key(
Ronald Croncf56a0a2020-08-04 09:51:30 +0200478 derivation, PSA_KEY_DERIVATION_INPUT_SECRET, key );
Gilles Peskine311f54d2019-09-23 18:19:22 +0200479 }
k-stachowiak81053a52019-08-17 10:30:28 +0200480 if( status != PSA_SUCCESS )
481 return( status );
482
483 status = psa_key_derivation_input_bytes( derivation,
484 PSA_KEY_DERIVATION_INPUT_LABEL,
485 label, label_length );
486 if( status != PSA_SUCCESS )
487 return( status );
488 }
489 else
490 {
491 return( PSA_ERROR_NOT_SUPPORTED );
492 }
493
494 status = psa_key_derivation_set_capacity( derivation, capacity );
495 if( status != PSA_SUCCESS )
496 return( status );
497
498 return( PSA_SUCCESS );
499}
500
Andrzej Kurekc929a822019-01-14 03:51:11 -0500501static int tls_prf_generic( mbedtls_md_type_t md_type,
502 const unsigned char *secret, size_t slen,
503 const char *label,
504 const unsigned char *random, size_t rlen,
505 unsigned char *dstbuf, size_t dlen )
506{
507 psa_status_t status;
508 psa_algorithm_t alg;
Ronald Croncf56a0a2020-08-04 09:51:30 +0200509 psa_key_id_t master_key = MBEDTLS_SVC_KEY_ID_INIT;
Janos Follathda6ac012019-08-16 13:47:29 +0100510 psa_key_derivation_operation_t derivation =
Janos Follath8dee8772019-07-30 12:53:32 +0100511 PSA_KEY_DERIVATION_OPERATION_INIT;
Andrzej Kurekc929a822019-01-14 03:51:11 -0500512
Andrzej Kurekc929a822019-01-14 03:51:11 -0500513 if( md_type == MBEDTLS_MD_SHA384 )
514 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_384);
515 else
516 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256);
517
Gilles Peskine311f54d2019-09-23 18:19:22 +0200518 /* Normally a "secret" should be long enough to be impossible to
519 * find by brute force, and in particular should not be empty. But
520 * this PRF is also used to derive an IV, in particular in EAP-TLS,
521 * and for this use case it makes sense to have a 0-length "secret".
522 * Since the key API doesn't allow importing a key of length 0,
Ronald Croncf56a0a2020-08-04 09:51:30 +0200523 * keep master_key=0, which setup_psa_key_derivation() understands
Gilles Peskine311f54d2019-09-23 18:19:22 +0200524 * to mean a 0-length "secret" input. */
525 if( slen != 0 )
526 {
527 psa_key_attributes_t key_attributes = psa_key_attributes_init();
528 psa_set_key_usage_flags( &key_attributes, PSA_KEY_USAGE_DERIVE );
529 psa_set_key_algorithm( &key_attributes, alg );
530 psa_set_key_type( &key_attributes, PSA_KEY_TYPE_DERIVE );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500531
Ronald Croncf56a0a2020-08-04 09:51:30 +0200532 status = psa_import_key( &key_attributes, secret, slen, &master_key );
Gilles Peskine311f54d2019-09-23 18:19:22 +0200533 if( status != PSA_SUCCESS )
534 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
535 }
Andrzej Kurekc929a822019-01-14 03:51:11 -0500536
k-stachowiak81053a52019-08-17 10:30:28 +0200537 status = setup_psa_key_derivation( &derivation,
Ronald Croncf56a0a2020-08-04 09:51:30 +0200538 master_key, alg,
k-stachowiak81053a52019-08-17 10:30:28 +0200539 random, rlen,
540 (unsigned char const *) label,
541 (size_t) strlen( label ),
542 dlen );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500543 if( status != PSA_SUCCESS )
544 {
Janos Follathda6ac012019-08-16 13:47:29 +0100545 psa_key_derivation_abort( &derivation );
Ronald Croncf56a0a2020-08-04 09:51:30 +0200546 psa_destroy_key( master_key );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500547 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
548 }
549
Janos Follathda6ac012019-08-16 13:47:29 +0100550 status = psa_key_derivation_output_bytes( &derivation, dstbuf, dlen );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500551 if( status != PSA_SUCCESS )
552 {
Janos Follathda6ac012019-08-16 13:47:29 +0100553 psa_key_derivation_abort( &derivation );
Ronald Croncf56a0a2020-08-04 09:51:30 +0200554 psa_destroy_key( master_key );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500555 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
556 }
557
Janos Follathda6ac012019-08-16 13:47:29 +0100558 status = psa_key_derivation_abort( &derivation );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500559 if( status != PSA_SUCCESS )
Andrzej Kurek70737ca2019-01-14 05:37:13 -0500560 {
Ronald Croncf56a0a2020-08-04 09:51:30 +0200561 psa_destroy_key( master_key );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500562 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Andrzej Kurek70737ca2019-01-14 05:37:13 -0500563 }
Andrzej Kurekc929a822019-01-14 03:51:11 -0500564
Ronald Croncf56a0a2020-08-04 09:51:30 +0200565 if( ! mbedtls_svc_key_id_is_null( master_key ) )
566 status = psa_destroy_key( master_key );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500567 if( status != PSA_SUCCESS )
568 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
569
Andrzej Kurek33171262019-01-15 03:25:18 -0500570 return( 0 );
Andrzej Kurekc929a822019-01-14 03:51:11 -0500571}
572
573#else /* MBEDTLS_USE_PSA_CRYPTO */
574
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200575static int tls_prf_generic( mbedtls_md_type_t md_type,
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100576 const unsigned char *secret, size_t slen,
577 const char *label,
578 const unsigned char *random, size_t rlen,
579 unsigned char *dstbuf, size_t dlen )
Paul Bakker1ef83d62012-04-11 12:09:53 +0000580{
581 size_t nb;
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100582 size_t i, j, k, md_len;
Ron Eldor3b350852019-05-07 18:31:49 +0300583 unsigned char *tmp;
584 size_t tmp_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200585 unsigned char h_i[MBEDTLS_MD_MAX_SIZE];
586 const mbedtls_md_info_t *md_info;
587 mbedtls_md_context_t md_ctx;
Janos Follath865b3eb2019-12-16 11:46:15 +0000588 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100589
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200590 mbedtls_md_init( &md_ctx );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000591
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200592 if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL )
593 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100594
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200595 md_len = mbedtls_md_get_size( md_info );
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100596
Ron Eldor3b350852019-05-07 18:31:49 +0300597 tmp_len = md_len + strlen( label ) + rlen;
598 tmp = mbedtls_calloc( 1, tmp_len );
599 if( tmp == NULL )
600 {
601 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
602 goto exit;
603 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000604
605 nb = strlen( label );
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100606 memcpy( tmp + md_len, label, nb );
607 memcpy( tmp + md_len + nb, random, rlen );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000608 nb += rlen;
609
610 /*
611 * Compute P_<hash>(secret, label + random)[0..dlen]
612 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200613 if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
Ron Eldor3b350852019-05-07 18:31:49 +0300614 goto exit;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100615
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200616 mbedtls_md_hmac_starts( &md_ctx, secret, slen );
617 mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb );
618 mbedtls_md_hmac_finish( &md_ctx, tmp );
Manuel Pégourié-Gonnard7da726b2015-03-24 18:08:19 +0100619
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100620 for( i = 0; i < dlen; i += md_len )
Paul Bakker1ef83d62012-04-11 12:09:53 +0000621 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200622 mbedtls_md_hmac_reset ( &md_ctx );
623 mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb );
624 mbedtls_md_hmac_finish( &md_ctx, h_i );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100625
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200626 mbedtls_md_hmac_reset ( &md_ctx );
627 mbedtls_md_hmac_update( &md_ctx, tmp, md_len );
628 mbedtls_md_hmac_finish( &md_ctx, tmp );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000629
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100630 k = ( i + md_len > dlen ) ? dlen % md_len : md_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000631
632 for( j = 0; j < k; j++ )
633 dstbuf[i + j] = h_i[j];
634 }
635
Ron Eldor3b350852019-05-07 18:31:49 +0300636exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200637 mbedtls_md_free( &md_ctx );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100638
Ron Eldor3b350852019-05-07 18:31:49 +0300639 mbedtls_platform_zeroize( tmp, tmp_len );
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500640 mbedtls_platform_zeroize( h_i, sizeof( h_i ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000641
Ron Eldor3b350852019-05-07 18:31:49 +0300642 mbedtls_free( tmp );
643
644 return( ret );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000645}
Andrzej Kurekc929a822019-01-14 03:51:11 -0500646#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200647#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100648static int tls_prf_sha256( const unsigned char *secret, size_t slen,
649 const char *label,
650 const unsigned char *random, size_t rlen,
651 unsigned char *dstbuf, size_t dlen )
652{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200653 return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen,
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100654 label, random, rlen, dstbuf, dlen ) );
655}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200656#endif /* MBEDTLS_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000657
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200658#if defined(MBEDTLS_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200659static int tls_prf_sha384( const unsigned char *secret, size_t slen,
660 const char *label,
661 const unsigned char *random, size_t rlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000662 unsigned char *dstbuf, size_t dlen )
663{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200664 return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen,
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100665 label, random, rlen, dstbuf, dlen ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000666}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200667#endif /* MBEDTLS_SHA512_C */
668#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +0000669
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200670static void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200671
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
673 defined(MBEDTLS_SSL_PROTO_TLS1_1)
674static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *, const unsigned char *, size_t );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200675#endif
Paul Bakker380da532012-04-18 16:10:25 +0000676
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200677#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +0200678static void ssl_calc_verify_ssl( const mbedtls_ssl_context *, unsigned char *, size_t * );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200679static void ssl_calc_finished_ssl( mbedtls_ssl_context *, unsigned char *, int );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200680#endif
681
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200682#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +0200683static void ssl_calc_verify_tls( const mbedtls_ssl_context *, unsigned char *, size_t * );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200684static void ssl_calc_finished_tls( mbedtls_ssl_context *, unsigned char *, int );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200685#endif
686
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200687#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
688#if defined(MBEDTLS_SHA256_C)
689static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t );
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +0200690static void ssl_calc_verify_tls_sha256( const mbedtls_ssl_context *,unsigned char *, size_t * );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200691static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200692#endif
Paul Bakker769075d2012-11-24 11:26:46 +0100693
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200694#if defined(MBEDTLS_SHA512_C)
695static void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t );
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +0200696static void ssl_calc_verify_tls_sha384( const mbedtls_ssl_context *, unsigned char *, size_t * );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200697static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int );
Paul Bakker769075d2012-11-24 11:26:46 +0100698#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200699#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000700
Manuel Pégourié-Gonnard45be3d82019-02-18 23:35:14 +0100701#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) && \
Hanno Becker7d0a5692018-10-23 15:26:22 +0100702 defined(MBEDTLS_USE_PSA_CRYPTO)
703static int ssl_use_opaque_psk( mbedtls_ssl_context const *ssl )
704{
705 if( ssl->conf->f_psk != NULL )
706 {
707 /* If we've used a callback to select the PSK,
708 * the static configuration is irrelevant. */
Ronald Croncf56a0a2020-08-04 09:51:30 +0200709 if( ! mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
Hanno Becker7d0a5692018-10-23 15:26:22 +0100710 return( 1 );
711
712 return( 0 );
713 }
714
Ronald Croncf56a0a2020-08-04 09:51:30 +0200715 if( ! mbedtls_svc_key_id_is_null( ssl->conf->psk_opaque ) )
Hanno Becker7d0a5692018-10-23 15:26:22 +0100716 return( 1 );
717
718 return( 0 );
719}
720#endif /* MBEDTLS_USE_PSA_CRYPTO &&
Manuel Pégourié-Gonnard45be3d82019-02-18 23:35:14 +0100721 MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Hanno Becker7d0a5692018-10-23 15:26:22 +0100722
Ron Eldorcf280092019-05-14 20:19:13 +0300723#if defined(MBEDTLS_SSL_EXPORT_KEYS)
724static mbedtls_tls_prf_types tls_prf_get_type( mbedtls_ssl_tls_prf_cb *tls_prf )
725{
726#if defined(MBEDTLS_SSL_PROTO_SSL3)
727 if( tls_prf == ssl3_prf )
728 {
Ron Eldor0810f0b2019-05-15 12:32:32 +0300729 return( MBEDTLS_SSL_TLS_PRF_SSL3 );
Ron Eldorcf280092019-05-14 20:19:13 +0300730 }
731 else
732#endif
733#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
734 if( tls_prf == tls1_prf )
735 {
736 return( MBEDTLS_SSL_TLS_PRF_TLS1 );
737 }
738 else
739#endif
740#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
741#if defined(MBEDTLS_SHA512_C)
742 if( tls_prf == tls_prf_sha384 )
743 {
744 return( MBEDTLS_SSL_TLS_PRF_SHA384 );
745 }
746 else
747#endif
748#if defined(MBEDTLS_SHA256_C)
749 if( tls_prf == tls_prf_sha256 )
750 {
751 return( MBEDTLS_SSL_TLS_PRF_SHA256 );
752 }
753 else
754#endif
755#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
756 return( MBEDTLS_SSL_TLS_PRF_NONE );
757}
758#endif /* MBEDTLS_SSL_EXPORT_KEYS */
759
Ron Eldor51d3ab52019-05-12 14:54:30 +0300760int mbedtls_ssl_tls_prf( const mbedtls_tls_prf_types prf,
761 const unsigned char *secret, size_t slen,
762 const char *label,
763 const unsigned char *random, size_t rlen,
764 unsigned char *dstbuf, size_t dlen )
765{
766 mbedtls_ssl_tls_prf_cb *tls_prf = NULL;
767
768 switch( prf )
769 {
770#if defined(MBEDTLS_SSL_PROTO_SSL3)
771 case MBEDTLS_SSL_TLS_PRF_SSL3:
772 tls_prf = ssl3_prf;
773 break;
Ron Eldord2f25f72019-05-15 14:54:22 +0300774#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Ron Eldor51d3ab52019-05-12 14:54:30 +0300775#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
776 case MBEDTLS_SSL_TLS_PRF_TLS1:
777 tls_prf = tls1_prf;
778 break;
Ron Eldord2f25f72019-05-15 14:54:22 +0300779#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
780
781#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Ron Eldor51d3ab52019-05-12 14:54:30 +0300782#if defined(MBEDTLS_SHA512_C)
783 case MBEDTLS_SSL_TLS_PRF_SHA384:
784 tls_prf = tls_prf_sha384;
785 break;
Ron Eldord2f25f72019-05-15 14:54:22 +0300786#endif /* MBEDTLS_SHA512_C */
Ron Eldor51d3ab52019-05-12 14:54:30 +0300787#if defined(MBEDTLS_SHA256_C)
788 case MBEDTLS_SSL_TLS_PRF_SHA256:
789 tls_prf = tls_prf_sha256;
790 break;
Ron Eldord2f25f72019-05-15 14:54:22 +0300791#endif /* MBEDTLS_SHA256_C */
792#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Ron Eldor51d3ab52019-05-12 14:54:30 +0300793 default:
794 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
795 }
796
797 return( tls_prf( secret, slen, label, random, rlen, dstbuf, dlen ) );
798}
799
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200800/* Type for the TLS PRF */
801typedef int ssl_tls_prf_t(const unsigned char *, size_t, const char *,
802 const unsigned char *, size_t,
803 unsigned char *, size_t);
804
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200805/*
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +0200806 * Populate a transform structure with session keys and all the other
807 * necessary information.
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200808 *
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +0200809 * Parameters:
810 * - [in/out]: transform: structure to populate
811 * [in] must be just initialised with mbedtls_ssl_transform_init()
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200812 * [out] fully populated, ready for use by mbedtls_ssl_{en,de}crypt_buf()
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200813 * - [in] ciphersuite
814 * - [in] master
815 * - [in] encrypt_then_mac
816 * - [in] trunc_hmac
817 * - [in] compression
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200818 * - [in] tls_prf: pointer to PRF to use for key derivation
819 * - [in] randbytes: buffer holding ServerHello.random + ClientHello.random
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200820 * - [in] minor_ver: SSL/TLS minor version
821 * - [in] endpoint: client or server
822 * - [in] ssl: optionally used for:
Manuel Pégourié-Gonnarde07bc202020-02-26 09:53:42 +0100823 * - MBEDTLS_SSL_HW_RECORD_ACCEL: whole context (non-const)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200824 * - MBEDTLS_SSL_EXPORT_KEYS: ssl->conf->{f,p}_export_keys
825 * - MBEDTLS_DEBUG_C: ssl->conf->{f,p}_dbg
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200826 */
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +0200827static int ssl_populate_transform( mbedtls_ssl_transform *transform,
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200828 int ciphersuite,
829 const unsigned char master[48],
Jarno Lamsac84bd242019-08-16 12:06:56 +0300830#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200831#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
832 int encrypt_then_mac,
Jarno Lamsac84bd242019-08-16 12:06:56 +0300833#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200834#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
835 int trunc_hmac,
Jarno Lamsac84bd242019-08-16 12:06:56 +0300836#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
837#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200838#if defined(MBEDTLS_ZLIB_SUPPORT)
839 int compression,
840#endif
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200841 ssl_tls_prf_t tls_prf,
842 const unsigned char randbytes[64],
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200843 int minor_ver,
844 unsigned endpoint,
Manuel Pégourié-Gonnard7ae6ed42020-03-13 11:28:19 +0100845#if !defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
846 const
847#endif
Manuel Pégourié-Gonnarde07bc202020-02-26 09:53:42 +0100848 mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +0000849{
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200850 int ret = 0;
Hanno Beckercb1cc802018-11-17 22:27:38 +0000851#if defined(MBEDTLS_USE_PSA_CRYPTO)
852 int psa_fallthrough;
853#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000854 unsigned char keyblk[256];
855 unsigned char *key1;
856 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100857 unsigned char *mac_enc;
858 unsigned char *mac_dec;
sander-visser3888b032020-05-06 21:49:46 +0200859 size_t mac_key_len = 0;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200860 size_t iv_copy_len;
Hanno Becker88aaf652017-12-27 08:17:40 +0000861 unsigned keylen;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000862 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200863 const mbedtls_cipher_info_t *cipher_info;
864 const mbedtls_md_info_t *md_info;
Paul Bakker68884e32013-01-07 18:20:04 +0100865
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200866#if !defined(MBEDTLS_SSL_HW_RECORD_ACCEL) && \
867 !defined(MBEDTLS_SSL_EXPORT_KEYS) && \
868 !defined(MBEDTLS_DEBUG_C)
Manuel Pégourié-Gonnarda7505d12019-05-07 10:17:56 +0200869 ssl = NULL; /* make sure we don't use it except for those cases */
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200870 (void) ssl;
871#endif
872
Manuel Pégourié-Gonnard96fb0ee2019-07-09 12:54:17 +0200873 /*
874 * Some data just needs copying into the structure
875 */
Jaeden Amero2de07f12019-06-05 13:32:08 +0100876#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
877 defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200878 transform->encrypt_then_mac = encrypt_then_mac;
Hanno Becker9eddaeb2017-12-27 21:37:21 +0000879#endif
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200880 transform->minor_ver = minor_ver;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000881
Manuel Pégourié-Gonnard96fb0ee2019-07-09 12:54:17 +0200882#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
883 memcpy( transform->randbytes, randbytes, sizeof( transform->randbytes ) );
884#endif
885
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200886 /*
887 * Get various info structures
888 */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200889 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuite );
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200890 if( ciphersuite_info == NULL )
891 {
892 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %d not found",
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200893 ciphersuite ) );
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200894 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
895 }
896
Hanno Beckere694c3e2017-12-27 21:34:08 +0000897 cipher_info = mbedtls_cipher_info_from_type( ciphersuite_info->cipher );
Paul Bakker68884e32013-01-07 18:20:04 +0100898 if( cipher_info == NULL )
899 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200900 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %d not found",
Hanno Beckere694c3e2017-12-27 21:34:08 +0000901 ciphersuite_info->cipher ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200902 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +0100903 }
904
Hanno Beckere694c3e2017-12-27 21:34:08 +0000905 md_info = mbedtls_md_info_from_type( ciphersuite_info->mac );
Paul Bakker68884e32013-01-07 18:20:04 +0100906 if( md_info == NULL )
907 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200908 MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_md info for %d not found",
Hanno Beckere694c3e2017-12-27 21:34:08 +0000909 ciphersuite_info->mac ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200910 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +0100911 }
912
Hanno Beckera0e20d02019-05-15 14:03:01 +0100913#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker4bf74652019-04-26 16:22:27 +0100914 /* Copy own and peer's CID if the use of the CID
915 * extension has been negotiated. */
916 if( ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_ENABLED )
917 {
918 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Copy CIDs into SSL transform" ) );
Hanno Becker8a7f9722019-04-30 13:52:29 +0100919
Hanno Becker05154c32019-05-03 15:23:51 +0100920 transform->in_cid_len = ssl->own_cid_len;
Hanno Becker05154c32019-05-03 15:23:51 +0100921 memcpy( transform->in_cid, ssl->own_cid, ssl->own_cid_len );
Hanno Becker1c1f0462019-05-03 12:55:51 +0100922 MBEDTLS_SSL_DEBUG_BUF( 3, "Incoming CID", transform->in_cid,
Hanno Becker4bf74652019-04-26 16:22:27 +0100923 transform->in_cid_len );
Hanno Beckerd1f20352019-05-15 10:21:55 +0100924
925 transform->out_cid_len = ssl->handshake->peer_cid_len;
926 memcpy( transform->out_cid, ssl->handshake->peer_cid,
927 ssl->handshake->peer_cid_len );
928 MBEDTLS_SSL_DEBUG_BUF( 3, "Outgoing CID", transform->out_cid,
929 transform->out_cid_len );
Hanno Becker4bf74652019-04-26 16:22:27 +0100930 }
Hanno Beckera0e20d02019-05-15 14:03:01 +0100931#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker4bf74652019-04-26 16:22:27 +0100932
Paul Bakker5121ce52009-01-03 21:22:43 +0000933 /*
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200934 * Compute key block using the PRF
Paul Bakker5121ce52009-01-03 21:22:43 +0000935 */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200936 ret = tls_prf( master, 48, "key expansion", randbytes, 64, keyblk, 256 );
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100937 if( ret != 0 )
938 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200939 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100940 return( ret );
941 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000942
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200943 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
Manuel Pégourié-Gonnardd91efa42019-05-20 10:27:20 +0200944 mbedtls_ssl_get_ciphersuite_name( ciphersuite ) ) );
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200945 MBEDTLS_SSL_DEBUG_BUF( 3, "master secret", master, 48 );
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200946 MBEDTLS_SSL_DEBUG_BUF( 4, "random bytes", randbytes, 64 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200947 MBEDTLS_SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000948
Paul Bakker5121ce52009-01-03 21:22:43 +0000949 /*
950 * Determine the appropriate key, IV and MAC length.
951 */
Paul Bakker68884e32013-01-07 18:20:04 +0100952
Hanno Becker88aaf652017-12-27 08:17:40 +0000953 keylen = cipher_info->key_bitlen / 8;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200954
Hanno Becker8031d062018-01-03 15:32:31 +0000955#if defined(MBEDTLS_GCM_C) || \
956 defined(MBEDTLS_CCM_C) || \
957 defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200958 if( cipher_info->mode == MBEDTLS_MODE_GCM ||
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200959 cipher_info->mode == MBEDTLS_MODE_CCM ||
960 cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY )
Paul Bakker5121ce52009-01-03 21:22:43 +0000961 {
Hanno Beckerf704bef2018-11-16 15:21:18 +0000962 size_t explicit_ivlen;
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200963
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200964 transform->maclen = 0;
Hanno Becker81c7b182017-11-09 18:39:33 +0000965 mac_key_len = 0;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000966 transform->taglen =
967 ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200968
Hanno Becker447558d2020-05-28 07:36:33 +0100969 /* All modes haves 96-bit IVs, but the length of the static parts vary
970 * with mode and version:
971 * - For GCM and CCM in TLS 1.2, there's a static IV of 4 Bytes
972 * (to be concatenated with a dynamically chosen IV of 8 Bytes)
Hanno Beckerf93c2d72020-05-28 07:39:43 +0100973 * - For ChaChaPoly in TLS 1.2, and all modes in TLS 1.3, there's
974 * a static IV of 12 Bytes (to be XOR'ed with the 8 Byte record
975 * sequence number).
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200976 */
Paul Bakker68884e32013-01-07 18:20:04 +0100977 transform->ivlen = 12;
Hanno Beckerf93c2d72020-05-28 07:39:43 +0100978#if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
979 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_4 )
980 {
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200981 transform->fixed_ivlen = 12;
Hanno Beckerf93c2d72020-05-28 07:39:43 +0100982 }
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200983 else
Hanno Beckerf93c2d72020-05-28 07:39:43 +0100984#endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
985 {
986 if( cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY )
987 transform->fixed_ivlen = 12;
988 else
989 transform->fixed_ivlen = 4;
990 }
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200991
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200992 /* Minimum length of encrypted record */
993 explicit_ivlen = transform->ivlen - transform->fixed_ivlen;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000994 transform->minlen = explicit_ivlen + transform->taglen;
Paul Bakker68884e32013-01-07 18:20:04 +0100995 }
996 else
Hanno Becker8031d062018-01-03 15:32:31 +0000997#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */
998#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
999 if( cipher_info->mode == MBEDTLS_MODE_STREAM ||
1000 cipher_info->mode == MBEDTLS_MODE_CBC )
Paul Bakker68884e32013-01-07 18:20:04 +01001001 {
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001002 /* Initialize HMAC contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001003 if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 ||
1004 ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 )
Paul Bakker68884e32013-01-07 18:20:04 +01001005 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001006 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001007 goto end;
Paul Bakker68884e32013-01-07 18:20:04 +01001008 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001009
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001010 /* Get MAC length */
Hanno Becker81c7b182017-11-09 18:39:33 +00001011 mac_key_len = mbedtls_md_get_size( md_info );
1012 transform->maclen = mac_key_len;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001014#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001015 /*
1016 * If HMAC is to be truncated, we shall keep the leftmost bytes,
1017 * (rfc 6066 page 13 or rfc 2104 section 4),
1018 * so we only need to adjust the length here.
1019 */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001020 if( trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED )
Hanno Beckere89353a2017-11-20 16:36:41 +00001021 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022 transform->maclen = MBEDTLS_SSL_TRUNCATED_HMAC_LEN;
Hanno Beckere89353a2017-11-20 16:36:41 +00001023
1024#if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT)
1025 /* Fall back to old, non-compliant version of the truncated
Hanno Becker563423f2017-11-21 17:20:17 +00001026 * HMAC implementation which also truncates the key
1027 * (Mbed TLS versions from 1.3 to 2.6.0) */
Hanno Beckere89353a2017-11-20 16:36:41 +00001028 mac_key_len = transform->maclen;
1029#endif
1030 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001031#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +02001032
1033 /* IV length */
Paul Bakker68884e32013-01-07 18:20:04 +01001034 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +00001035
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001036 /* Minimum length */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001037 if( cipher_info->mode == MBEDTLS_MODE_STREAM )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001038 transform->minlen = transform->maclen;
1039 else
Paul Bakker68884e32013-01-07 18:20:04 +01001040 {
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001041 /*
1042 * GenericBlockCipher:
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +01001043 * 1. if EtM is in use: one block plus MAC
1044 * otherwise: * first multiple of blocklen greater than maclen
1045 * 2. IV except for SSL3 and TLS 1.0
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001046 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001047#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001048 if( encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED )
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +01001049 {
1050 transform->minlen = transform->maclen
1051 + cipher_info->block_size;
1052 }
1053 else
1054#endif
1055 {
1056 transform->minlen = transform->maclen
1057 + cipher_info->block_size
1058 - transform->maclen % cipher_info->block_size;
1059 }
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001060
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001061#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001062 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
1063 minor_ver == MBEDTLS_SSL_MINOR_VERSION_1 )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001064 ; /* No need to adjust minlen */
Paul Bakker68884e32013-01-07 18:20:04 +01001065 else
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001066#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001067#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001068 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_2 ||
1069 minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001070 {
1071 transform->minlen += transform->ivlen;
1072 }
1073 else
1074#endif
1075 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001076 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Ron Eldore6992702019-05-07 18:27:13 +03001077 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1078 goto end;
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +02001079 }
Paul Bakker68884e32013-01-07 18:20:04 +01001080 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001081 }
Hanno Becker8031d062018-01-03 15:32:31 +00001082 else
1083#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1084 {
1085 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1086 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1087 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001088
Hanno Becker88aaf652017-12-27 08:17:40 +00001089 MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %u, minlen: %u, ivlen: %u, maclen: %u",
1090 (unsigned) keylen,
1091 (unsigned) transform->minlen,
1092 (unsigned) transform->ivlen,
1093 (unsigned) transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001094
1095 /*
1096 * Finally setup the cipher contexts, IVs and MAC secrets.
1097 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001098#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001099 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001100 {
Hanno Becker81c7b182017-11-09 18:39:33 +00001101 key1 = keyblk + mac_key_len * 2;
Hanno Becker88aaf652017-12-27 08:17:40 +00001102 key2 = keyblk + mac_key_len * 2 + keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001103
Paul Bakker68884e32013-01-07 18:20:04 +01001104 mac_enc = keyblk;
Hanno Becker81c7b182017-11-09 18:39:33 +00001105 mac_dec = keyblk + mac_key_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001106
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001107 /*
1108 * This is not used in TLS v1.1.
1109 */
Paul Bakker48916f92012-09-16 19:57:18 +00001110 iv_copy_len = ( transform->fixed_ivlen ) ?
1111 transform->fixed_ivlen : transform->ivlen;
Hanno Becker88aaf652017-12-27 08:17:40 +00001112 memcpy( transform->iv_enc, key2 + keylen, iv_copy_len );
1113 memcpy( transform->iv_dec, key2 + keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001114 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001115 }
1116 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001117#endif /* MBEDTLS_SSL_CLI_C */
1118#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001119 if( endpoint == MBEDTLS_SSL_IS_SERVER )
Paul Bakker5121ce52009-01-03 21:22:43 +00001120 {
Hanno Becker88aaf652017-12-27 08:17:40 +00001121 key1 = keyblk + mac_key_len * 2 + keylen;
Hanno Becker81c7b182017-11-09 18:39:33 +00001122 key2 = keyblk + mac_key_len * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00001123
Hanno Becker81c7b182017-11-09 18:39:33 +00001124 mac_enc = keyblk + mac_key_len;
Paul Bakker68884e32013-01-07 18:20:04 +01001125 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +00001126
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001127 /*
1128 * This is not used in TLS v1.1.
1129 */
Paul Bakker48916f92012-09-16 19:57:18 +00001130 iv_copy_len = ( transform->fixed_ivlen ) ?
1131 transform->fixed_ivlen : transform->ivlen;
Hanno Becker88aaf652017-12-27 08:17:40 +00001132 memcpy( transform->iv_dec, key1 + keylen, iv_copy_len );
1133 memcpy( transform->iv_enc, key1 + keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001134 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001135 }
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001136 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001137#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001138 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001139 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Ron Eldore6992702019-05-07 18:27:13 +03001140 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1141 goto end;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001142 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001143
Hanno Beckerd56ed242018-01-03 15:32:51 +00001144#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001145#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001146 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker68884e32013-01-07 18:20:04 +01001147 {
Hanno Beckerd56ed242018-01-03 15:32:51 +00001148 if( mac_key_len > sizeof( transform->mac_enc ) )
Manuel Pégourié-Gonnard7cfdcb82014-01-18 18:22:55 +01001149 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001150 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Ron Eldore6992702019-05-07 18:27:13 +03001151 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1152 goto end;
Manuel Pégourié-Gonnard7cfdcb82014-01-18 18:22:55 +01001153 }
1154
Hanno Becker81c7b182017-11-09 18:39:33 +00001155 memcpy( transform->mac_enc, mac_enc, mac_key_len );
1156 memcpy( transform->mac_dec, mac_dec, mac_key_len );
Paul Bakker68884e32013-01-07 18:20:04 +01001157 }
1158 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001159#endif /* MBEDTLS_SSL_PROTO_SSL3 */
1160#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
1161 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001162 if( minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )
Paul Bakker68884e32013-01-07 18:20:04 +01001163 {
Gilles Peskine039fd122018-03-19 19:06:08 +01001164 /* For HMAC-based ciphersuites, initialize the HMAC transforms.
1165 For AEAD-based ciphersuites, there is nothing to do here. */
1166 if( mac_key_len != 0 )
1167 {
1168 mbedtls_md_hmac_starts( &transform->md_ctx_enc, mac_enc, mac_key_len );
1169 mbedtls_md_hmac_starts( &transform->md_ctx_dec, mac_dec, mac_key_len );
1170 }
Paul Bakker68884e32013-01-07 18:20:04 +01001171 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001172 else
1173#endif
Paul Bakker577e0062013-08-28 11:57:20 +02001174 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001175 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Ron Eldore6992702019-05-07 18:27:13 +03001176 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1177 goto end;
Paul Bakker577e0062013-08-28 11:57:20 +02001178 }
Hanno Beckerd56ed242018-01-03 15:32:51 +00001179#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
Paul Bakker68884e32013-01-07 18:20:04 +01001180
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001181#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
1182 if( mbedtls_ssl_hw_record_init != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001183 {
sander-visser1abe8ee2020-05-06 21:27:14 +02001184 ret = 0;
Paul Bakker05ef8352012-05-08 09:17:57 +00001185
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001186 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) );
Paul Bakker05ef8352012-05-08 09:17:57 +00001187
Hanno Becker88aaf652017-12-27 08:17:40 +00001188 if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, keylen,
Paul Bakker07eb38b2012-12-19 14:42:06 +01001189 transform->iv_enc, transform->iv_dec,
1190 iv_copy_len,
Paul Bakker68884e32013-01-07 18:20:04 +01001191 mac_enc, mac_dec,
Hanno Becker81c7b182017-11-09 18:39:33 +00001192 mac_key_len ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +00001193 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001194 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_init", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001195 ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
1196 goto end;
Paul Bakker05ef8352012-05-08 09:17:57 +00001197 }
1198 }
Hanno Beckerd56ed242018-01-03 15:32:51 +00001199#else
1200 ((void) mac_dec);
1201 ((void) mac_enc);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001202#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
Paul Bakker05ef8352012-05-08 09:17:57 +00001203
Manuel Pégourié-Gonnard024b6df2015-10-19 13:52:53 +02001204#if defined(MBEDTLS_SSL_EXPORT_KEYS)
1205 if( ssl->conf->f_export_keys != NULL )
Robert Cragie4feb7ae2015-10-02 13:33:37 +01001206 {
Manuel Pégourié-Gonnard024b6df2015-10-19 13:52:53 +02001207 ssl->conf->f_export_keys( ssl->conf->p_export_keys,
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001208 master, keyblk,
Hanno Becker88aaf652017-12-27 08:17:40 +00001209 mac_key_len, keylen,
Robert Cragie4feb7ae2015-10-02 13:33:37 +01001210 iv_copy_len );
1211 }
Ron Eldorf5cc10d2019-05-07 18:33:40 +03001212
1213 if( ssl->conf->f_export_keys_ext != NULL )
1214 {
1215 ssl->conf->f_export_keys_ext( ssl->conf->p_export_keys,
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001216 master, keyblk,
Ron Eldorb7fd64c2019-05-12 11:03:32 +03001217 mac_key_len, keylen,
Ron Eldor51d3ab52019-05-12 14:54:30 +03001218 iv_copy_len,
Jaeden Amerofa636452019-09-12 10:47:37 +01001219 randbytes + 32,
1220 randbytes,
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +02001221 tls_prf_get_type( tls_prf ) );
Ron Eldorf5cc10d2019-05-07 18:33:40 +03001222 }
Robert Cragie4feb7ae2015-10-02 13:33:37 +01001223#endif
1224
Hanno Beckerf704bef2018-11-16 15:21:18 +00001225#if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckercb1cc802018-11-17 22:27:38 +00001226
1227 /* Only use PSA-based ciphers for TLS-1.2.
1228 * That's relevant at least for TLS-1.0, where
1229 * we assume that mbedtls_cipher_crypt() updates
1230 * the structure field for the IV, which the PSA-based
1231 * implementation currently doesn't. */
1232#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1233 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Hanno Beckerf704bef2018-11-16 15:21:18 +00001234 {
Hanno Beckercb1cc802018-11-17 22:27:38 +00001235 ret = mbedtls_cipher_setup_psa( &transform->cipher_ctx_enc,
Hanno Becker22bf1452019-04-05 11:21:08 +01001236 cipher_info, transform->taglen );
Hanno Beckercb1cc802018-11-17 22:27:38 +00001237 if( ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE )
1238 {
1239 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup_psa", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001240 goto end;
Hanno Beckercb1cc802018-11-17 22:27:38 +00001241 }
1242
1243 if( ret == 0 )
1244 {
Hanno Becker4c8c7aa2019-04-10 09:25:41 +01001245 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Successfully setup PSA-based encryption cipher context" ) );
Hanno Beckercb1cc802018-11-17 22:27:38 +00001246 psa_fallthrough = 0;
1247 }
1248 else
1249 {
1250 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to setup PSA-based cipher context for record encryption - fall through to default setup." ) );
1251 psa_fallthrough = 1;
1252 }
Hanno Beckerf704bef2018-11-16 15:21:18 +00001253 }
Hanno Beckerf704bef2018-11-16 15:21:18 +00001254 else
Hanno Beckercb1cc802018-11-17 22:27:38 +00001255 psa_fallthrough = 1;
1256#else
1257 psa_fallthrough = 1;
1258#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Beckerf704bef2018-11-16 15:21:18 +00001259
Hanno Beckercb1cc802018-11-17 22:27:38 +00001260 if( psa_fallthrough == 1 )
Hanno Beckerf704bef2018-11-16 15:21:18 +00001261#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001262 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001263 cipher_info ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001264 {
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001265 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001266 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001267 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001268
Hanno Beckerf704bef2018-11-16 15:21:18 +00001269#if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckercb1cc802018-11-17 22:27:38 +00001270 /* Only use PSA-based ciphers for TLS-1.2.
1271 * That's relevant at least for TLS-1.0, where
1272 * we assume that mbedtls_cipher_crypt() updates
1273 * the structure field for the IV, which the PSA-based
1274 * implementation currently doesn't. */
1275#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1276 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Hanno Beckerf704bef2018-11-16 15:21:18 +00001277 {
Hanno Beckercb1cc802018-11-17 22:27:38 +00001278 ret = mbedtls_cipher_setup_psa( &transform->cipher_ctx_dec,
Hanno Becker22bf1452019-04-05 11:21:08 +01001279 cipher_info, transform->taglen );
Hanno Beckercb1cc802018-11-17 22:27:38 +00001280 if( ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE )
1281 {
1282 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup_psa", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001283 goto end;
Hanno Beckercb1cc802018-11-17 22:27:38 +00001284 }
1285
1286 if( ret == 0 )
1287 {
Hanno Becker4c8c7aa2019-04-10 09:25:41 +01001288 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Successfully setup PSA-based decryption cipher context" ) );
Hanno Beckercb1cc802018-11-17 22:27:38 +00001289 psa_fallthrough = 0;
1290 }
1291 else
1292 {
1293 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to setup PSA-based cipher context for record decryption - fall through to default setup." ) );
1294 psa_fallthrough = 1;
1295 }
Hanno Beckerf704bef2018-11-16 15:21:18 +00001296 }
Hanno Beckerf704bef2018-11-16 15:21:18 +00001297 else
Hanno Beckercb1cc802018-11-17 22:27:38 +00001298 psa_fallthrough = 1;
1299#else
1300 psa_fallthrough = 1;
1301#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Beckerf704bef2018-11-16 15:21:18 +00001302
Hanno Beckercb1cc802018-11-17 22:27:38 +00001303 if( psa_fallthrough == 1 )
Hanno Beckerf704bef2018-11-16 15:21:18 +00001304#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001305 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec,
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001306 cipher_info ) ) != 0 )
1307 {
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001308 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001309 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001310 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001311
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001312 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001313 cipher_info->key_bitlen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001314 MBEDTLS_ENCRYPT ) ) != 0 )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001315 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001316 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001317 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001318 }
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001319
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001320 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001321 cipher_info->key_bitlen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001322 MBEDTLS_DECRYPT ) ) != 0 )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001323 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001324 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001325 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001326 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001327
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001328#if defined(MBEDTLS_CIPHER_MODE_CBC)
1329 if( cipher_info->mode == MBEDTLS_MODE_CBC )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001330 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001331 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc,
1332 MBEDTLS_PADDING_NONE ) ) != 0 )
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001333 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001334 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001335 goto end;
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001336 }
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001338 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec,
1339 MBEDTLS_PADDING_NONE ) ) != 0 )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001340 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001341 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
Ron Eldore6992702019-05-07 18:27:13 +03001342 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001343 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001344 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001345#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001346
Paul Bakker5121ce52009-01-03 21:22:43 +00001347
Manuel Pégourié-Gonnardd73b47f2019-05-06 12:44:24 +02001348 /* Initialize Zlib contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001349#if defined(MBEDTLS_ZLIB_SUPPORT)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001350 if( compression == MBEDTLS_SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001351 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001352 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001353
Paul Bakker48916f92012-09-16 19:57:18 +00001354 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
1355 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001356
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001357 if( deflateInit( &transform->ctx_deflate,
1358 Z_DEFAULT_COMPRESSION ) != Z_OK ||
Paul Bakker48916f92012-09-16 19:57:18 +00001359 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001360 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001361 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
Ron Eldore6992702019-05-07 18:27:13 +03001362 ret = MBEDTLS_ERR_SSL_COMPRESSION_FAILED;
1363 goto end;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001364 }
1365 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001366#endif /* MBEDTLS_ZLIB_SUPPORT */
Paul Bakker2770fbd2012-07-03 13:30:23 +00001367
Ron Eldore6992702019-05-07 18:27:13 +03001368end:
Ron Eldora9f9a732019-05-07 18:29:02 +03001369 mbedtls_platform_zeroize( keyblk, sizeof( keyblk ) );
Ron Eldore6992702019-05-07 18:27:13 +03001370 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001371}
1372
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001373/*
Manuel Pégourié-Gonnard47e33e12019-05-20 10:10:17 +02001374 * Set appropriate PRF function and other SSL / TLS 1.0/1.1 / TLS1.2 functions
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001375 *
1376 * Inputs:
1377 * - SSL/TLS minor version
1378 * - hash associated with the ciphersuite (only used by TLS 1.2)
1379 *
Manuel Pégourié-Gonnard31d3ef12019-05-10 10:25:00 +02001380 * Outputs:
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001381 * - the tls_prf, calc_verify and calc_finished members of handshake structure
1382 */
1383static int ssl_set_handshake_prfs( mbedtls_ssl_handshake_params *handshake,
1384 int minor_ver,
1385 mbedtls_md_type_t hash )
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001386{
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001387#if !defined(MBEDTLS_SSL_PROTO_TLS1_2) || !defined(MBEDTLS_SHA512_C)
1388 (void) hash;
1389#endif
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001390
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001391#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001392 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001393 {
1394 handshake->tls_prf = ssl3_prf;
1395 handshake->calc_verify = ssl_calc_verify_ssl;
1396 handshake->calc_finished = ssl_calc_finished_ssl;
1397 }
1398 else
1399#endif
1400#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001401 if( minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001402 {
1403 handshake->tls_prf = tls1_prf;
1404 handshake->calc_verify = ssl_calc_verify_tls;
1405 handshake->calc_finished = ssl_calc_finished_tls;
1406 }
1407 else
1408#endif
1409#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1410#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001411 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
1412 hash == MBEDTLS_MD_SHA384 )
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001413 {
1414 handshake->tls_prf = tls_prf_sha384;
1415 handshake->calc_verify = ssl_calc_verify_tls_sha384;
1416 handshake->calc_finished = ssl_calc_finished_tls_sha384;
1417 }
1418 else
1419#endif
1420#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001421 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001422 {
1423 handshake->tls_prf = tls_prf_sha256;
1424 handshake->calc_verify = ssl_calc_verify_tls_sha256;
1425 handshake->calc_finished = ssl_calc_finished_tls_sha256;
1426 }
1427 else
1428#endif
1429#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1430 {
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001431 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1432 }
1433
1434 return( 0 );
1435}
1436
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001437/*
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001438 * Compute master secret if needed
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001439 *
1440 * Parameters:
1441 * [in/out] handshake
1442 * [in] resume, premaster, extended_ms, calc_verify, tls_prf
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001443 * (PSA-PSK) ciphersuite_info, psk_opaque
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001444 * [out] premaster (cleared)
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001445 * [out] master
1446 * [in] ssl: optionally used for debugging, EMS and PSA-PSK
1447 * debug: conf->f_dbg, conf->p_dbg
1448 * EMS: passed to calc_verify (debug + (SSL3) session_negotiate)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001449 * PSA-PSA: minor_ver, conf
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001450 */
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001451static int ssl_compute_master( mbedtls_ssl_handshake_params *handshake,
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001452 unsigned char *master,
Manuel Pégourié-Gonnard0d56aaa2019-05-03 09:58:33 +02001453 const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001454{
Janos Follath865b3eb2019-12-16 11:46:15 +00001455 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001456
1457 /* cf. RFC 5246, Section 8.1:
1458 * "The master secret is always exactly 48 bytes in length." */
1459 size_t const master_secret_len = 48;
1460
1461#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1462 unsigned char session_hash[48];
1463#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
1464
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001465 /* The label for the KDF used for key expansion.
1466 * This is either "master secret" or "extended master secret"
1467 * depending on whether the Extended Master Secret extension
1468 * is used. */
1469 char const *lbl = "master secret";
1470
1471 /* The salt for the KDF used for key expansion.
1472 * - If the Extended Master Secret extension is not used,
1473 * this is ClientHello.Random + ServerHello.Random
1474 * (see Sect. 8.1 in RFC 5246).
1475 * - If the Extended Master Secret extension is used,
1476 * this is the transcript of the handshake so far.
1477 * (see Sect. 4 in RFC 7627). */
1478 unsigned char const *salt = handshake->randbytes;
1479 size_t salt_len = 64;
1480
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001481#if !defined(MBEDTLS_DEBUG_C) && \
1482 !defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \
1483 !(defined(MBEDTLS_USE_PSA_CRYPTO) && \
1484 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED))
Manuel Pégourié-Gonnarda7505d12019-05-07 10:17:56 +02001485 ssl = NULL; /* make sure we don't use it except for those cases */
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001486 (void) ssl;
1487#endif
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001488
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001489 if( handshake->resume != 0 )
1490 {
1491 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001492 return( 0 );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001493 }
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001494
1495#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001496 if( handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED )
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001497 {
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001498 lbl = "extended master secret";
1499 salt = session_hash;
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001500 handshake->calc_verify( ssl, session_hash, &salt_len );
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001501
Manuel Pégourié-Gonnard8faa70e2019-05-20 12:09:50 +02001502 MBEDTLS_SSL_DEBUG_BUF( 3, "session hash for extended master secret",
1503 session_hash, salt_len );
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001504 }
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001505#endif /* MBEDTLS_SSL_EXTENDED_MS_ENABLED */
1506
1507#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001508 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
1509 if( handshake->ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK &&
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001510 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001511 ssl_use_opaque_psk( ssl ) == 1 )
1512 {
1513 /* Perform PSK-to-MS expansion in a single step. */
1514 psa_status_t status;
1515 psa_algorithm_t alg;
Ronald Croncf56a0a2020-08-04 09:51:30 +02001516 psa_key_id_t psk;
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001517 psa_key_derivation_operation_t derivation =
1518 PSA_KEY_DERIVATION_OPERATION_INIT;
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001519 mbedtls_md_type_t hash_alg = handshake->ciphersuite_info->mac;
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001520
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001521 MBEDTLS_SSL_DEBUG_MSG( 2, ( "perform PSA-based PSK-to-MS expansion" ) );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001522
Guilhem Bryantc5285d82020-03-25 17:08:15 +00001523 psk = mbedtls_ssl_get_opaque_psk( ssl );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001524
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001525 if( hash_alg == MBEDTLS_MD_SHA384 )
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001526 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001527 else
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001528 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
1529
k-stachowiak81053a52019-08-17 10:30:28 +02001530 status = setup_psa_key_derivation( &derivation, psk, alg,
1531 salt, salt_len,
1532 (unsigned char const *) lbl,
1533 (size_t) strlen( lbl ),
1534 master_secret_len );
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001535 if( status != PSA_SUCCESS )
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001536 {
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001537 psa_key_derivation_abort( &derivation );
1538 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001539 }
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001540
1541 status = psa_key_derivation_output_bytes( &derivation,
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001542 master,
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001543 master_secret_len );
1544 if( status != PSA_SUCCESS )
1545 {
1546 psa_key_derivation_abort( &derivation );
1547 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
1548 }
1549
1550 status = psa_key_derivation_abort( &derivation );
1551 if( status != PSA_SUCCESS )
1552 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
1553 }
1554 else
1555#endif
1556 {
1557 ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,
1558 lbl, salt, salt_len,
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001559 master,
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001560 master_secret_len );
1561 if( ret != 0 )
1562 {
1563 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
1564 return( ret );
1565 }
1566
1567 MBEDTLS_SSL_DEBUG_BUF( 3, "premaster secret",
1568 handshake->premaster,
1569 handshake->pmslen );
1570
1571 mbedtls_platform_zeroize( handshake->premaster,
1572 sizeof(handshake->premaster) );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001573 }
1574
1575 return( 0 );
1576}
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001577
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +02001578int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
1579{
Janos Follath865b3eb2019-12-16 11:46:15 +00001580 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001581 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
1582 ssl->handshake->ciphersuite_info;
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001583
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001584 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
1585
1586 /* Set PRF, calc_verify and calc_finished function pointers */
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001587 ret = ssl_set_handshake_prfs( ssl->handshake,
1588 ssl->minor_ver,
1589 ciphersuite_info->mac );
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001590 if( ret != 0 )
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001591 {
1592 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_set_handshake_prfs", ret );
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001593 return( ret );
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001594 }
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001595
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001596 /* Compute master secret if needed */
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001597 ret = ssl_compute_master( ssl->handshake,
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001598 ssl->session_negotiate->master,
1599 ssl );
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001600 if( ret != 0 )
1601 {
1602 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_compute_master", ret );
1603 return( ret );
1604 }
1605
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001606 /* Swap the client and server random values:
1607 * - MS derivation wanted client+server (RFC 5246 8.1)
1608 * - key derivation wants server+client (RFC 5246 6.3) */
1609 {
1610 unsigned char tmp[64];
1611 memcpy( tmp, ssl->handshake->randbytes, 64 );
1612 memcpy( ssl->handshake->randbytes, tmp + 32, 32 );
1613 memcpy( ssl->handshake->randbytes + 32, tmp, 32 );
1614 mbedtls_platform_zeroize( tmp, sizeof( tmp ) );
1615 }
1616
1617 /* Populate transform structure */
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +02001618 ret = ssl_populate_transform( ssl->transform_negotiate,
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001619 ssl->session_negotiate->ciphersuite,
1620 ssl->session_negotiate->master,
Jarno Lamsac84bd242019-08-16 12:06:56 +03001621#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001622#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1623 ssl->session_negotiate->encrypt_then_mac,
Jarno Lamsac84bd242019-08-16 12:06:56 +03001624#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001625#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1626 ssl->session_negotiate->trunc_hmac,
Jarno Lamsac84bd242019-08-16 12:06:56 +03001627#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
1628#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +02001629#if defined(MBEDTLS_ZLIB_SUPPORT)
1630 ssl->session_negotiate->compression,
1631#endif
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +02001632 ssl->handshake->tls_prf,
1633 ssl->handshake->randbytes,
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +02001634 ssl->minor_ver,
1635 ssl->conf->endpoint,
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +02001636 ssl );
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001637 if( ret != 0 )
1638 {
1639 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_populate_transform", ret );
1640 return( ret );
1641 }
1642
1643 /* We no longer need Server/ClientHello.random values */
1644 mbedtls_platform_zeroize( ssl->handshake->randbytes,
1645 sizeof( ssl->handshake->randbytes ) );
1646
Manuel Pégourié-Gonnardd73b47f2019-05-06 12:44:24 +02001647 /* Allocate compression buffer */
1648#if defined(MBEDTLS_ZLIB_SUPPORT)
jiblime9f25b8d2019-12-18 21:40:01 -08001649 if( ssl->session_negotiate->compression == MBEDTLS_SSL_COMPRESS_DEFLATE &&
Manuel Pégourié-Gonnardd73b47f2019-05-06 12:44:24 +02001650 ssl->compress_buf == NULL )
1651 {
1652 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Allocating compression buffer" ) );
1653 ssl->compress_buf = mbedtls_calloc( 1, MBEDTLS_SSL_COMPRESS_BUFFER_LEN );
1654 if( ssl->compress_buf == NULL )
1655 {
1656 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
Manuel Pégourié-Gonnardd91efa42019-05-20 10:27:20 +02001657 MBEDTLS_SSL_COMPRESS_BUFFER_LEN ) );
Manuel Pégourié-Gonnardd73b47f2019-05-06 12:44:24 +02001658 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
1659 }
1660 }
1661#endif
1662
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001663 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
1664
1665 return( 0 );
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +02001666}
1667
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001668#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001669void ssl_calc_verify_ssl( const mbedtls_ssl_context *ssl,
1670 unsigned char hash[36],
1671 size_t *hlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001672{
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001673 mbedtls_md5_context md5;
1674 mbedtls_sha1_context sha1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001675 unsigned char pad_1[48];
1676 unsigned char pad_2[48];
1677
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001678 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001679
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001680 mbedtls_md5_init( &md5 );
1681 mbedtls_sha1_init( &sha1 );
1682
1683 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
1684 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001685
Paul Bakker380da532012-04-18 16:10:25 +00001686 memset( pad_1, 0x36, 48 );
1687 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001688
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001689 mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 );
1690 mbedtls_md5_update_ret( &md5, pad_1, 48 );
1691 mbedtls_md5_finish_ret( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001692
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001693 mbedtls_md5_starts_ret( &md5 );
1694 mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 );
1695 mbedtls_md5_update_ret( &md5, pad_2, 48 );
1696 mbedtls_md5_update_ret( &md5, hash, 16 );
1697 mbedtls_md5_finish_ret( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001698
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001699 mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 );
1700 mbedtls_sha1_update_ret( &sha1, pad_1, 40 );
1701 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
Paul Bakker380da532012-04-18 16:10:25 +00001702
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001703 mbedtls_sha1_starts_ret( &sha1 );
1704 mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 );
1705 mbedtls_sha1_update_ret( &sha1, pad_2, 40 );
1706 mbedtls_sha1_update_ret( &sha1, hash + 16, 20 );
1707 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
Paul Bakker380da532012-04-18 16:10:25 +00001708
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001709 *hlen = 36;
1710
1711 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001712 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001713
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001714 mbedtls_md5_free( &md5 );
1715 mbedtls_sha1_free( &sha1 );
Paul Bakker5b4af392014-06-26 12:09:34 +02001716
Paul Bakker380da532012-04-18 16:10:25 +00001717 return;
1718}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001719#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker380da532012-04-18 16:10:25 +00001720
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001721#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001722void ssl_calc_verify_tls( const mbedtls_ssl_context *ssl,
1723 unsigned char hash[36],
1724 size_t *hlen )
Paul Bakker380da532012-04-18 16:10:25 +00001725{
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001726 mbedtls_md5_context md5;
1727 mbedtls_sha1_context sha1;
Paul Bakker380da532012-04-18 16:10:25 +00001728
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001729 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001730
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001731 mbedtls_md5_init( &md5 );
1732 mbedtls_sha1_init( &sha1 );
1733
1734 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
1735 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker380da532012-04-18 16:10:25 +00001736
Andrzej Kurekeb342242019-01-29 09:14:33 -05001737 mbedtls_md5_finish_ret( &md5, hash );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001738 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
Paul Bakker380da532012-04-18 16:10:25 +00001739
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001740 *hlen = 36;
1741
1742 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001743 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001744
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001745 mbedtls_md5_free( &md5 );
1746 mbedtls_sha1_free( &sha1 );
Paul Bakker5b4af392014-06-26 12:09:34 +02001747
Paul Bakker380da532012-04-18 16:10:25 +00001748 return;
1749}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001750#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
Paul Bakker380da532012-04-18 16:10:25 +00001751
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001752#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1753#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001754void ssl_calc_verify_tls_sha256( const mbedtls_ssl_context *ssl,
1755 unsigned char hash[32],
1756 size_t *hlen )
Paul Bakker380da532012-04-18 16:10:25 +00001757{
Andrzej Kurekeb342242019-01-29 09:14:33 -05001758#if defined(MBEDTLS_USE_PSA_CRYPTO)
1759 size_t hash_size;
1760 psa_status_t status;
1761 psa_hash_operation_t sha256_psa = psa_hash_operation_init();
1762
1763 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> PSA calc verify sha256" ) );
1764 status = psa_hash_clone( &ssl->handshake->fin_sha256_psa, &sha256_psa );
1765 if( status != PSA_SUCCESS )
1766 {
1767 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
1768 return;
1769 }
1770
1771 status = psa_hash_finish( &sha256_psa, hash, 32, &hash_size );
1772 if( status != PSA_SUCCESS )
1773 {
1774 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
1775 return;
1776 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001777
1778 *hlen = 32;
1779 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated verify result", hash, *hlen );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001780 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= PSA calc verify" ) );
1781#else
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001782 mbedtls_sha256_context sha256;
Paul Bakker380da532012-04-18 16:10:25 +00001783
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001784 mbedtls_sha256_init( &sha256 );
1785
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001786 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001787
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001788 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001789 mbedtls_sha256_finish_ret( &sha256, hash );
Paul Bakker380da532012-04-18 16:10:25 +00001790
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001791 *hlen = 32;
1792
1793 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001794 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001795
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001796 mbedtls_sha256_free( &sha256 );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001797#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker380da532012-04-18 16:10:25 +00001798 return;
1799}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001800#endif /* MBEDTLS_SHA256_C */
Paul Bakker380da532012-04-18 16:10:25 +00001801
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001802#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001803void ssl_calc_verify_tls_sha384( const mbedtls_ssl_context *ssl,
1804 unsigned char hash[48],
1805 size_t *hlen )
Paul Bakker380da532012-04-18 16:10:25 +00001806{
Andrzej Kurekeb342242019-01-29 09:14:33 -05001807#if defined(MBEDTLS_USE_PSA_CRYPTO)
1808 size_t hash_size;
1809 psa_status_t status;
Andrzej Kurek972fba52019-01-30 03:29:12 -05001810 psa_hash_operation_t sha384_psa = psa_hash_operation_init();
Andrzej Kurekeb342242019-01-29 09:14:33 -05001811
1812 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> PSA calc verify sha384" ) );
Andrzej Kurek972fba52019-01-30 03:29:12 -05001813 status = psa_hash_clone( &ssl->handshake->fin_sha384_psa, &sha384_psa );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001814 if( status != PSA_SUCCESS )
1815 {
1816 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
1817 return;
1818 }
1819
Andrzej Kurek972fba52019-01-30 03:29:12 -05001820 status = psa_hash_finish( &sha384_psa, hash, 48, &hash_size );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001821 if( status != PSA_SUCCESS )
1822 {
1823 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
1824 return;
1825 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001826
1827 *hlen = 48;
1828 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated verify result", hash, *hlen );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001829 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= PSA calc verify" ) );
1830#else
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001831 mbedtls_sha512_context sha512;
Paul Bakker380da532012-04-18 16:10:25 +00001832
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001833 mbedtls_sha512_init( &sha512 );
1834
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001835 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001836
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001837 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001838 mbedtls_sha512_finish_ret( &sha512, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001839
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001840 *hlen = 48;
1841
1842 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001843 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001844
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001845 mbedtls_sha512_free( &sha512 );
Andrzej Kurekeb342242019-01-29 09:14:33 -05001846#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker5121ce52009-01-03 21:22:43 +00001847 return;
1848}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001849#endif /* MBEDTLS_SHA512_C */
1850#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001851
Gilles Peskineeccd8882020-03-10 12:19:08 +01001852#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001853int 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 +02001854{
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001855 unsigned char *p = ssl->handshake->premaster;
1856 unsigned char *end = p + sizeof( ssl->handshake->premaster );
Guilhem Bryantb5f04e42020-04-01 11:23:58 +01001857 const unsigned char *psk = NULL;
Guilhem Bryant61b0fe62020-03-27 11:12:12 +00001858 size_t psk_len = 0;
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001859
Guilhem Bryantc5285d82020-03-25 17:08:15 +00001860 if( mbedtls_ssl_get_psk( ssl, &psk, &psk_len )
1861 == MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED )
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001862 {
Guilhem Bryantc5285d82020-03-25 17:08:15 +00001863 /*
1864 * This should never happen because the existence of a PSK is always
1865 * checked before calling this function
1866 */
Guilhem Bryant82194c82020-03-26 17:04:31 +00001867 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Guilhem Bryant0c9b1952020-04-08 11:02:38 +01001868 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001869 }
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001870
1871 /*
1872 * PMS = struct {
1873 * opaque other_secret<0..2^16-1>;
1874 * opaque psk<0..2^16-1>;
1875 * };
1876 * with "other_secret" depending on the particular key exchange
1877 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001878#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
1879 if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001880 {
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001881 if( end - p < 2 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001882 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001883
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001884 *(p++) = (unsigned char)( psk_len >> 8 );
1885 *(p++) = (unsigned char)( psk_len );
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001886
1887 if( end < p || (size_t)( end - p ) < psk_len )
1888 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1889
1890 memset( p, 0, psk_len );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001891 p += psk_len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001892 }
1893 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001894#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
1895#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
1896 if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001897 {
1898 /*
1899 * other_secret already set by the ClientKeyExchange message,
1900 * and is 48 bytes long
1901 */
Philippe Antoine747fd532018-05-30 09:13:21 +02001902 if( end - p < 2 )
1903 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1904
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001905 *p++ = 0;
1906 *p++ = 48;
1907 p += 48;
1908 }
1909 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001910#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
1911#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
1912 if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001913 {
Janos Follath865b3eb2019-12-16 11:46:15 +00001914 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +01001915 size_t len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001916
Manuel Pégourié-Gonnard8df68632014-06-23 17:56:08 +02001917 /* Write length only when we know the actual value */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001918 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +01001919 p + 2, end - ( p + 2 ), &len,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01001920 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001921 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001922 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001923 return( ret );
1924 }
Manuel Pégourié-Gonnard8df68632014-06-23 17:56:08 +02001925 *(p++) = (unsigned char)( len >> 8 );
1926 *(p++) = (unsigned char)( len );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001927 p += len;
1928
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001929 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001930 }
1931 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001932#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
1933#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
1934 if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001935 {
Janos Follath865b3eb2019-12-16 11:46:15 +00001936 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001937 size_t zlen;
1938
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001939 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen,
Paul Bakker66d5d072014-06-17 16:39:18 +02001940 p + 2, end - ( p + 2 ),
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01001941 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001942 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001943 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001944 return( ret );
1945 }
1946
1947 *(p++) = (unsigned char)( zlen >> 8 );
1948 *(p++) = (unsigned char)( zlen );
1949 p += zlen;
1950
Andrzej Kurekc470b6b2019-01-31 08:20:20 -05001951 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
1952 MBEDTLS_DEBUG_ECDH_Z );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001953 }
1954 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001955#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001956 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001957 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1958 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001959 }
1960
1961 /* opaque psk<0..2^16-1>; */
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001962 if( end - p < 2 )
1963 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardb2bf5a12014-03-25 16:28:12 +01001964
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001965 *(p++) = (unsigned char)( psk_len >> 8 );
1966 *(p++) = (unsigned char)( psk_len );
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001967
1968 if( end < p || (size_t)( end - p ) < psk_len )
1969 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1970
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001971 memcpy( p, psk, psk_len );
1972 p += psk_len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001973
1974 ssl->handshake->pmslen = p - ssl->handshake->premaster;
1975
1976 return( 0 );
1977}
Gilles Peskineeccd8882020-03-10 12:19:08 +01001978#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001979
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001980#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
1981static int ssl_write_hello_request( mbedtls_ssl_context *ssl );
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02001982
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001983#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker786300f2020-02-05 10:46:40 +00001984int mbedtls_ssl_resend_hello_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02001985{
1986 /* If renegotiation is not enforced, retransmit until we would reach max
1987 * timeout if we were using the usual handshake doubling scheme */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001988 if( ssl->conf->renego_max_records < 0 )
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02001989 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001990 uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1;
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02001991 unsigned char doublings = 1;
1992
1993 while( ratio != 0 )
1994 {
1995 ++doublings;
1996 ratio >>= 1;
1997 }
1998
1999 if( ++ssl->renego_records_seen > doublings )
2000 {
Manuel Pégourié-Gonnardcb0d2122015-07-22 11:52:11 +02002001 MBEDTLS_SSL_DEBUG_MSG( 2, ( "no longer retransmitting hello request" ) );
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002002 return( 0 );
2003 }
2004 }
2005
2006 return( ssl_write_hello_request( ssl ) );
2007}
2008#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002009#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02002010
Hanno Beckerb9d44792019-02-08 07:19:04 +00002011#if defined(MBEDTLS_X509_CRT_PARSE_C)
2012static void ssl_clear_peer_cert( mbedtls_ssl_session *session )
2013{
2014#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2015 if( session->peer_cert != NULL )
2016 {
2017 mbedtls_x509_crt_free( session->peer_cert );
2018 mbedtls_free( session->peer_cert );
2019 session->peer_cert = NULL;
2020 }
2021#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2022 if( session->peer_cert_digest != NULL )
2023 {
2024 /* Zeroization is not necessary. */
2025 mbedtls_free( session->peer_cert_digest );
2026 session->peer_cert_digest = NULL;
2027 session->peer_cert_digest_type = MBEDTLS_MD_NONE;
2028 session->peer_cert_digest_len = 0;
2029 }
2030#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2031}
2032#endif /* MBEDTLS_X509_CRT_PARSE_C */
2033
Paul Bakker5121ce52009-01-03 21:22:43 +00002034/*
2035 * Handshake functions
2036 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002037#if !defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskinef9828522017-05-03 12:28:43 +02002038/* No certificate support -> dummy functions */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002039int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002040{
Hanno Beckere694c3e2017-12-27 21:34:08 +00002041 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2042 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002043
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002044 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002045
Hanno Becker7177a882019-02-05 13:36:46 +00002046 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002047 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002048 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002049 ssl->state++;
2050 return( 0 );
2051 }
2052
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002053 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2054 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002055}
2056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002057int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002058{
Hanno Beckere694c3e2017-12-27 21:34:08 +00002059 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2060 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002061
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002062 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002063
Hanno Becker7177a882019-02-05 13:36:46 +00002064 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002065 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002066 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002067 ssl->state++;
2068 return( 0 );
2069 }
2070
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002071 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2072 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002073}
Gilles Peskinef9828522017-05-03 12:28:43 +02002074
Gilles Peskineeccd8882020-03-10 12:19:08 +01002075#else /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Gilles Peskinef9828522017-05-03 12:28:43 +02002076/* Some certificate support -> implement write and parse */
2077
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002078int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002079{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002080 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002081 size_t i, n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002082 const mbedtls_x509_crt *crt;
Hanno Beckere694c3e2017-12-27 21:34:08 +00002083 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2084 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002085
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002086 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002087
Hanno Becker7177a882019-02-05 13:36:46 +00002088 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002089 {
Johan Pascal4f099262020-09-22 10:59:26 +02002090 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2091 ssl->state++;
2092 return( 0 );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002093 }
2094
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002095#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002096 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002097 {
2098 if( ssl->client_auth == 0 )
2099 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002100 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002101 ssl->state++;
2102 return( 0 );
2103 }
2104
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002105#if defined(MBEDTLS_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00002106 /*
2107 * If using SSLv3 and got no cert, send an Alert message
2108 * (otherwise an empty Certificate message will be sent).
2109 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002110 if( mbedtls_ssl_own_cert( ssl ) == NULL &&
2111 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002112 {
2113 ssl->out_msglen = 2;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002114 ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT;
2115 ssl->out_msg[0] = MBEDTLS_SSL_ALERT_LEVEL_WARNING;
2116 ssl->out_msg[1] = MBEDTLS_SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00002117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002118 MBEDTLS_SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002119 goto write_msg;
2120 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002121#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002122 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002123#endif /* MBEDTLS_SSL_CLI_C */
2124#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002125 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Paul Bakker5121ce52009-01-03 21:22:43 +00002126 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002127 if( mbedtls_ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002128 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002129 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
2130 return( MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002131 }
2132 }
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01002133#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002134
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002135 MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", mbedtls_ssl_own_cert( ssl ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002136
2137 /*
2138 * 0 . 0 handshake type
2139 * 1 . 3 handshake length
2140 * 4 . 6 length of all certs
2141 * 7 . 9 length of cert. 1
2142 * 10 . n-1 peer certificate
2143 * n . n+2 length of cert. 2
2144 * n+3 . ... upper level cert, etc.
2145 */
2146 i = 7;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002147 crt = mbedtls_ssl_own_cert( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00002148
Paul Bakker29087132010-03-21 21:03:34 +00002149 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002150 {
2151 n = crt->raw.len;
Angus Grattond8213d02016-05-25 20:56:48 +10002152 if( n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i )
Paul Bakker5121ce52009-01-03 21:22:43 +00002153 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002154 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
Angus Grattond8213d02016-05-25 20:56:48 +10002155 i + 3 + n, MBEDTLS_SSL_OUT_CONTENT_LEN ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002156 return( MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002157 }
2158
2159 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
2160 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
2161 ssl->out_msg[i + 2] = (unsigned char)( n );
2162
2163 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
2164 i += n; crt = crt->next;
2165 }
2166
2167 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
2168 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
2169 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
2170
2171 ssl->out_msglen = i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002172 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2173 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002174
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02002175#if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00002176write_msg:
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002177#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002178
2179 ssl->state++;
2180
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02002181 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002182 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02002183 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002184 return( ret );
2185 }
2186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002187 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002188
Paul Bakkered27a042013-04-18 22:46:23 +02002189 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002190}
2191
Hanno Becker84879e32019-01-31 07:44:03 +00002192#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
Hanno Becker177475a2019-02-05 17:02:46 +00002193
2194#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002195static int ssl_check_peer_crt_unchanged( mbedtls_ssl_context *ssl,
2196 unsigned char *crt_buf,
2197 size_t crt_buf_len )
2198{
2199 mbedtls_x509_crt const * const peer_crt = ssl->session->peer_cert;
2200
2201 if( peer_crt == NULL )
2202 return( -1 );
2203
2204 if( peer_crt->raw.len != crt_buf_len )
2205 return( -1 );
2206
k-stachowiak95b68ef2019-09-16 12:21:00 +02002207 return( memcmp( peer_crt->raw.p, crt_buf, peer_crt->raw.len ) );
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002208}
Hanno Becker177475a2019-02-05 17:02:46 +00002209#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2210static int ssl_check_peer_crt_unchanged( mbedtls_ssl_context *ssl,
2211 unsigned char *crt_buf,
2212 size_t crt_buf_len )
2213{
Janos Follath865b3eb2019-12-16 11:46:15 +00002214 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker177475a2019-02-05 17:02:46 +00002215 unsigned char const * const peer_cert_digest =
2216 ssl->session->peer_cert_digest;
2217 mbedtls_md_type_t const peer_cert_digest_type =
2218 ssl->session->peer_cert_digest_type;
2219 mbedtls_md_info_t const * const digest_info =
2220 mbedtls_md_info_from_type( peer_cert_digest_type );
2221 unsigned char tmp_digest[MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN];
2222 size_t digest_len;
2223
2224 if( peer_cert_digest == NULL || digest_info == NULL )
2225 return( -1 );
2226
2227 digest_len = mbedtls_md_get_size( digest_info );
2228 if( digest_len > MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN )
2229 return( -1 );
2230
2231 ret = mbedtls_md( digest_info, crt_buf, crt_buf_len, tmp_digest );
2232 if( ret != 0 )
2233 return( -1 );
2234
2235 return( memcmp( tmp_digest, peer_cert_digest, digest_len ) );
2236}
2237#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker84879e32019-01-31 07:44:03 +00002238#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002239
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002240/*
2241 * Once the certificate message is read, parse it into a cert chain and
2242 * perform basic checks, but leave actual verification to the caller
2243 */
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002244static int ssl_parse_certificate_chain( mbedtls_ssl_context *ssl,
2245 mbedtls_x509_crt *chain )
Paul Bakker5121ce52009-01-03 21:22:43 +00002246{
Janos Follath865b3eb2019-12-16 11:46:15 +00002247 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002248#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
2249 int crt_cnt=0;
2250#endif
Paul Bakker23986e52011-04-24 08:57:21 +00002251 size_t i, n;
Gilles Peskine064a85c2017-05-10 10:46:40 +02002252 uint8_t alert;
Paul Bakker5121ce52009-01-03 21:22:43 +00002253
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002254 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00002255 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002256 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002257 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2258 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002259 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002260 }
2261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002262 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE ||
2263 ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002264 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002265 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002266 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2267 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002268 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002269 }
2270
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002271 i = mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00002272
Paul Bakker5121ce52009-01-03 21:22:43 +00002273 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002274 * Same message structure as in mbedtls_ssl_write_certificate()
Paul Bakker5121ce52009-01-03 21:22:43 +00002275 */
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00002276 n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2];
Paul Bakker5121ce52009-01-03 21:22:43 +00002277
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00002278 if( ssl->in_msg[i] != 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002279 ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002280 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002281 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002282 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2283 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002284 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002285 }
2286
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002287 /* Make &ssl->in_msg[i] point to the beginning of the CRT chain. */
2288 i += 3;
2289
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002290 /* Iterate through and parse the CRTs in the provided chain. */
Paul Bakker5121ce52009-01-03 21:22:43 +00002291 while( i < ssl->in_hslen )
2292 {
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002293 /* Check that there's room for the next CRT's length fields. */
Philippe Antoine747fd532018-05-30 09:13:21 +02002294 if ( i + 3 > ssl->in_hslen ) {
2295 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Hanno Beckere2734e22019-01-31 07:44:17 +00002296 mbedtls_ssl_send_alert_message( ssl,
2297 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2298 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Philippe Antoine747fd532018-05-30 09:13:21 +02002299 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
2300 }
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002301 /* In theory, the CRT can be up to 2**24 Bytes, but we don't support
2302 * anything beyond 2**16 ~ 64K. */
Paul Bakker5121ce52009-01-03 21:22:43 +00002303 if( ssl->in_msg[i] != 0 )
2304 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002305 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Hanno Beckere2734e22019-01-31 07:44:17 +00002306 mbedtls_ssl_send_alert_message( ssl,
2307 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2308 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002309 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002310 }
2311
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002312 /* Read length of the next CRT in the chain. */
Paul Bakker5121ce52009-01-03 21:22:43 +00002313 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2314 | (unsigned int) ssl->in_msg[i + 2];
2315 i += 3;
2316
2317 if( n < 128 || i + n > ssl->in_hslen )
2318 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002319 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Hanno Beckere2734e22019-01-31 07:44:17 +00002320 mbedtls_ssl_send_alert_message( ssl,
2321 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2322 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002323 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002324 }
2325
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002326 /* Check if we're handling the first CRT in the chain. */
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002327#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
2328 if( crt_cnt++ == 0 &&
2329 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
2330 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002331 {
Hanno Becker46f34d02019-02-08 14:00:04 +00002332 /* During client-side renegotiation, check that the server's
2333 * end-CRTs hasn't changed compared to the initial handshake,
2334 * mitigating the triple handshake attack. On success, reuse
2335 * the original end-CRT instead of parsing it again. */
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002336 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Check that peer CRT hasn't changed during renegotiation" ) );
2337 if( ssl_check_peer_crt_unchanged( ssl,
2338 &ssl->in_msg[i],
2339 n ) != 0 )
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002340 {
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002341 MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) );
2342 mbedtls_ssl_send_alert_message( ssl,
2343 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2344 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED );
2345 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002346 }
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002347
2348 /* Now we can safely free the original chain. */
2349 ssl_clear_peer_cert( ssl->session );
2350 }
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002351#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
2352
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002353 /* Parse the next certificate in the chain. */
Hanno Becker0056eab2019-02-08 14:39:16 +00002354#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002355 ret = mbedtls_x509_crt_parse_der( chain, ssl->in_msg + i, n );
Hanno Becker0056eab2019-02-08 14:39:16 +00002356#else
Hanno Becker353a6f02019-02-26 11:51:34 +00002357 /* If we don't need to store the CRT chain permanently, parse
Hanno Becker0056eab2019-02-08 14:39:16 +00002358 * it in-place from the input buffer instead of making a copy. */
2359 ret = mbedtls_x509_crt_parse_der_nocopy( chain, ssl->in_msg + i, n );
2360#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002361 switch( ret )
Paul Bakker5121ce52009-01-03 21:22:43 +00002362 {
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002363 case 0: /*ok*/
2364 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
2365 /* Ignore certificate with an unknown algorithm: maybe a
2366 prior certificate was already trusted. */
2367 break;
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002368
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002369 case MBEDTLS_ERR_X509_ALLOC_FAILED:
2370 alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR;
2371 goto crt_parse_der_failed;
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002372
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002373 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
2374 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2375 goto crt_parse_der_failed;
Gilles Peskine1cc8e342017-05-03 16:28:34 +02002376
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00002377 default:
2378 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
2379 crt_parse_der_failed:
2380 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert );
2381 MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret );
2382 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002383 }
2384
2385 i += n;
2386 }
2387
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002388 MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", chain );
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002389 return( 0 );
2390}
2391
Hanno Becker4a55f632019-02-05 12:49:06 +00002392#if defined(MBEDTLS_SSL_SRV_C)
2393static int ssl_srv_check_client_no_crt_notification( mbedtls_ssl_context *ssl )
2394{
2395 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
2396 return( -1 );
2397
2398#if defined(MBEDTLS_SSL_PROTO_SSL3)
2399 /*
2400 * Check if the client sent an empty certificate
2401 */
2402 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
2403 {
2404 if( ssl->in_msglen == 2 &&
2405 ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT &&
2406 ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
2407 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT )
2408 {
2409 MBEDTLS_SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2410 return( 0 );
2411 }
2412
2413 return( -1 );
2414 }
2415#endif /* MBEDTLS_SSL_PROTO_SSL3 */
2416
2417#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2418 defined(MBEDTLS_SSL_PROTO_TLS1_2)
2419 if( ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len( ssl ) &&
2420 ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
2421 ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE &&
2422 memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), "\0\0\0", 3 ) == 0 )
2423 {
2424 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2425 return( 0 );
2426 }
2427
2428 return( -1 );
2429#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
2430 MBEDTLS_SSL_PROTO_TLS1_2 */
2431}
2432#endif /* MBEDTLS_SSL_SRV_C */
2433
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002434/* Check if a certificate message is expected.
2435 * Return either
2436 * - SSL_CERTIFICATE_EXPECTED, or
2437 * - SSL_CERTIFICATE_SKIP
2438 * indicating whether a Certificate message is expected or not.
2439 */
2440#define SSL_CERTIFICATE_EXPECTED 0
2441#define SSL_CERTIFICATE_SKIP 1
2442static int ssl_parse_certificate_coordinate( mbedtls_ssl_context *ssl,
2443 int authmode )
2444{
2445 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002446 ssl->handshake->ciphersuite_info;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002447
2448 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
2449 return( SSL_CERTIFICATE_SKIP );
2450
2451#if defined(MBEDTLS_SSL_SRV_C)
2452 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
2453 {
2454 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2455 return( SSL_CERTIFICATE_SKIP );
2456
2457 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
2458 {
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002459 ssl->session_negotiate->verify_result =
2460 MBEDTLS_X509_BADCERT_SKIP_VERIFY;
2461 return( SSL_CERTIFICATE_SKIP );
2462 }
2463 }
Hanno Becker84d9d272019-03-01 08:10:46 +00002464#else
2465 ((void) authmode);
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002466#endif /* MBEDTLS_SSL_SRV_C */
2467
2468 return( SSL_CERTIFICATE_EXPECTED );
2469}
2470
Hanno Becker68636192019-02-05 14:36:34 +00002471static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl,
2472 int authmode,
2473 mbedtls_x509_crt *chain,
2474 void *rs_ctx )
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002475{
Hanno Becker6bdfab22019-02-05 13:11:17 +00002476 int ret = 0;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002477 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002478 ssl->handshake->ciphersuite_info;
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002479 int have_ca_chain = 0;
Hanno Becker68636192019-02-05 14:36:34 +00002480
Hanno Becker8927c832019-04-03 12:52:50 +01002481 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *);
2482 void *p_vrfy;
2483
Hanno Becker68636192019-02-05 14:36:34 +00002484 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
2485 return( 0 );
2486
Hanno Becker8927c832019-04-03 12:52:50 +01002487 if( ssl->f_vrfy != NULL )
2488 {
Hanno Beckerefb440a2019-04-03 13:04:33 +01002489 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use context-specific verification callback" ) );
Hanno Becker8927c832019-04-03 12:52:50 +01002490 f_vrfy = ssl->f_vrfy;
2491 p_vrfy = ssl->p_vrfy;
2492 }
2493 else
2494 {
Hanno Beckerefb440a2019-04-03 13:04:33 +01002495 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use configuration-specific verification callback" ) );
Hanno Becker8927c832019-04-03 12:52:50 +01002496 f_vrfy = ssl->conf->f_vrfy;
2497 p_vrfy = ssl->conf->p_vrfy;
2498 }
2499
Hanno Becker68636192019-02-05 14:36:34 +00002500 /*
2501 * Main check: verify certificate
2502 */
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002503#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
2504 if( ssl->conf->f_ca_cb != NULL )
2505 {
2506 ((void) rs_ctx);
2507 have_ca_chain = 1;
2508
2509 MBEDTLS_SSL_DEBUG_MSG( 3, ( "use CA callback for X.509 CRT verification" ) );
Jarno Lamsa9822c0d2019-04-01 16:59:48 +03002510 ret = mbedtls_x509_crt_verify_with_ca_cb(
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002511 chain,
2512 ssl->conf->f_ca_cb,
2513 ssl->conf->p_ca_cb,
2514 ssl->conf->cert_profile,
2515 ssl->hostname,
2516 &ssl->session_negotiate->verify_result,
Jaeden Amerofe710672019-04-16 15:03:12 +01002517 f_vrfy, p_vrfy );
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002518 }
2519 else
2520#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
2521 {
2522 mbedtls_x509_crt *ca_chain;
2523 mbedtls_x509_crl *ca_crl;
2524
2525#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2526 if( ssl->handshake->sni_ca_chain != NULL )
2527 {
2528 ca_chain = ssl->handshake->sni_ca_chain;
2529 ca_crl = ssl->handshake->sni_ca_crl;
2530 }
2531 else
2532#endif
2533 {
2534 ca_chain = ssl->conf->ca_chain;
2535 ca_crl = ssl->conf->ca_crl;
2536 }
2537
2538 if( ca_chain != NULL )
2539 have_ca_chain = 1;
2540
2541 ret = mbedtls_x509_crt_verify_restartable(
2542 chain,
2543 ca_chain, ca_crl,
2544 ssl->conf->cert_profile,
2545 ssl->hostname,
2546 &ssl->session_negotiate->verify_result,
Jaeden Amerofe710672019-04-16 15:03:12 +01002547 f_vrfy, p_vrfy, rs_ctx );
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002548 }
Hanno Becker68636192019-02-05 14:36:34 +00002549
2550 if( ret != 0 )
2551 {
2552 MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2553 }
2554
Gilles Peskineeccd8882020-03-10 12:19:08 +01002555#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Hanno Becker68636192019-02-05 14:36:34 +00002556 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
2557 return( MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS );
2558#endif
2559
2560 /*
2561 * Secondary checks: always done, but change 'ret' only if it was 0
2562 */
2563
2564#if defined(MBEDTLS_ECP_C)
2565 {
2566 const mbedtls_pk_context *pk = &chain->pk;
2567
2568 /* If certificate uses an EC key, make sure the curve is OK */
2569 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) &&
2570 mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 )
2571 {
2572 ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY;
2573
2574 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) );
2575 if( ret == 0 )
2576 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
2577 }
2578 }
2579#endif /* MBEDTLS_ECP_C */
2580
2581 if( mbedtls_ssl_check_cert_usage( chain,
2582 ciphersuite_info,
2583 ! ssl->conf->endpoint,
2584 &ssl->session_negotiate->verify_result ) != 0 )
2585 {
2586 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) );
2587 if( ret == 0 )
2588 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
2589 }
2590
2591 /* mbedtls_x509_crt_verify_with_profile is supposed to report a
2592 * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
2593 * with details encoded in the verification flags. All other kinds
2594 * of error codes, including those from the user provided f_vrfy
2595 * functions, are treated as fatal and lead to a failure of
2596 * ssl_parse_certificate even if verification was optional. */
2597 if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
2598 ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
2599 ret == MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ) )
2600 {
2601 ret = 0;
2602 }
2603
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00002604 if( have_ca_chain == 0 && authmode == MBEDTLS_SSL_VERIFY_REQUIRED )
Hanno Becker68636192019-02-05 14:36:34 +00002605 {
2606 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
2607 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
2608 }
2609
2610 if( ret != 0 )
2611 {
2612 uint8_t alert;
2613
2614 /* The certificate may have been rejected for several reasons.
2615 Pick one and send the corresponding alert. Which alert to send
2616 may be a subject of debate in some cases. */
2617 if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER )
2618 alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED;
2619 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH )
2620 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
2621 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE )
2622 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2623 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE )
2624 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2625 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE )
2626 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2627 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK )
2628 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2629 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY )
2630 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2631 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED )
2632 alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED;
2633 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED )
2634 alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED;
2635 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED )
2636 alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA;
2637 else
2638 alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN;
2639 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2640 alert );
2641 }
2642
2643#if defined(MBEDTLS_DEBUG_C)
2644 if( ssl->session_negotiate->verify_result != 0 )
2645 {
2646 MBEDTLS_SSL_DEBUG_MSG( 3, ( "! Certificate verification flags %x",
2647 ssl->session_negotiate->verify_result ) );
2648 }
2649 else
2650 {
2651 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate verification flags clear" ) );
2652 }
2653#endif /* MBEDTLS_DEBUG_C */
2654
2655 return( ret );
2656}
2657
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002658#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2659static int ssl_remember_peer_crt_digest( mbedtls_ssl_context *ssl,
2660 unsigned char *start, size_t len )
2661{
Janos Follath865b3eb2019-12-16 11:46:15 +00002662 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002663 /* Remember digest of the peer's end-CRT. */
2664 ssl->session_negotiate->peer_cert_digest =
2665 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
2666 if( ssl->session_negotiate->peer_cert_digest == NULL )
2667 {
2668 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
irwir40883e92019-09-21 17:55:33 +03002669 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN ) );
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002670 mbedtls_ssl_send_alert_message( ssl,
2671 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2672 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
2673
2674 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
2675 }
2676
2677 ret = mbedtls_md( mbedtls_md_info_from_type(
2678 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
2679 start, len,
2680 ssl->session_negotiate->peer_cert_digest );
2681
2682 ssl->session_negotiate->peer_cert_digest_type =
2683 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
2684 ssl->session_negotiate->peer_cert_digest_len =
2685 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
2686
2687 return( ret );
2688}
2689
2690static int ssl_remember_peer_pubkey( mbedtls_ssl_context *ssl,
2691 unsigned char *start, size_t len )
2692{
2693 unsigned char *end = start + len;
Janos Follath865b3eb2019-12-16 11:46:15 +00002694 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002695
2696 /* Make a copy of the peer's raw public key. */
2697 mbedtls_pk_init( &ssl->handshake->peer_pubkey );
2698 ret = mbedtls_pk_parse_subpubkey( &start, end,
2699 &ssl->handshake->peer_pubkey );
2700 if( ret != 0 )
2701 {
2702 /* We should have parsed the public key before. */
2703 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2704 }
2705
2706 return( 0 );
2707}
2708#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2709
Hanno Becker68636192019-02-05 14:36:34 +00002710int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
2711{
2712 int ret = 0;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002713 int crt_expected;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002714#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2715 const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET
2716 ? ssl->handshake->sni_authmode
2717 : ssl->conf->authmode;
2718#else
Johan Pascal4f099262020-09-22 10:59:26 +02002719 const int authmode = ssl->conf->authmode;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002720#endif
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002721 void *rs_ctx = NULL;
Hanno Becker3dad3112019-02-05 17:19:52 +00002722 mbedtls_x509_crt *chain = NULL;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002723
2724 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2725
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002726 crt_expected = ssl_parse_certificate_coordinate( ssl, authmode );
2727 if( crt_expected == SSL_CERTIFICATE_SKIP )
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002728 {
2729 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
Hanno Becker6bdfab22019-02-05 13:11:17 +00002730 goto exit;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002731 }
2732
Gilles Peskineeccd8882020-03-10 12:19:08 +01002733#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002734 if( ssl->handshake->ecrs_enabled &&
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002735 ssl->handshake->ecrs_state == ssl_ecrs_crt_verify )
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002736 {
Hanno Becker3dad3112019-02-05 17:19:52 +00002737 chain = ssl->handshake->ecrs_peer_cert;
2738 ssl->handshake->ecrs_peer_cert = NULL;
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002739 goto crt_verify;
2740 }
2741#endif
2742
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +02002743 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002744 {
2745 /* mbedtls_ssl_read_record may have sent an alert already. We
2746 let it decide whether to alert. */
2747 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Hanno Becker3dad3112019-02-05 17:19:52 +00002748 goto exit;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002749 }
2750
Hanno Becker4a55f632019-02-05 12:49:06 +00002751#if defined(MBEDTLS_SSL_SRV_C)
2752 if( ssl_srv_check_client_no_crt_notification( ssl ) == 0 )
2753 {
2754 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
Hanno Becker4a55f632019-02-05 12:49:06 +00002755
irwird3085ab2020-04-21 22:26:05 +03002756 if( authmode != MBEDTLS_SSL_VERIFY_OPTIONAL )
Hanno Becker6bdfab22019-02-05 13:11:17 +00002757 ret = MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Hanno Becker4a55f632019-02-05 12:49:06 +00002758
Hanno Becker6bdfab22019-02-05 13:11:17 +00002759 goto exit;
Hanno Becker4a55f632019-02-05 12:49:06 +00002760 }
2761#endif /* MBEDTLS_SSL_SRV_C */
2762
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002763 /* Clear existing peer CRT structure in case we tried to
2764 * reuse a session but it failed, and allocate a new one. */
Hanno Becker7a955a02019-02-05 13:08:01 +00002765 ssl_clear_peer_cert( ssl->session_negotiate );
Hanno Becker3dad3112019-02-05 17:19:52 +00002766
2767 chain = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
2768 if( chain == NULL )
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002769 {
2770 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
2771 sizeof( mbedtls_x509_crt ) ) );
2772 mbedtls_ssl_send_alert_message( ssl,
2773 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2774 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Hanno Becker7a955a02019-02-05 13:08:01 +00002775
Hanno Becker3dad3112019-02-05 17:19:52 +00002776 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
2777 goto exit;
2778 }
2779 mbedtls_x509_crt_init( chain );
2780
2781 ret = ssl_parse_certificate_chain( ssl, chain );
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002782 if( ret != 0 )
Hanno Becker3dad3112019-02-05 17:19:52 +00002783 goto exit;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002784
Gilles Peskineeccd8882020-03-10 12:19:08 +01002785#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002786 if( ssl->handshake->ecrs_enabled)
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002787 ssl->handshake->ecrs_state = ssl_ecrs_crt_verify;
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002788
2789crt_verify:
2790 if( ssl->handshake->ecrs_enabled)
2791 rs_ctx = &ssl->handshake->ecrs_ctx;
2792#endif
2793
Hanno Becker68636192019-02-05 14:36:34 +00002794 ret = ssl_parse_certificate_verify( ssl, authmode,
Hanno Becker3dad3112019-02-05 17:19:52 +00002795 chain, rs_ctx );
Hanno Becker68636192019-02-05 14:36:34 +00002796 if( ret != 0 )
Hanno Becker3dad3112019-02-05 17:19:52 +00002797 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002798
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002799#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002800 {
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002801 unsigned char *crt_start, *pk_start;
2802 size_t crt_len, pk_len;
Hanno Becker3dad3112019-02-05 17:19:52 +00002803
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002804 /* We parse the CRT chain without copying, so
2805 * these pointers point into the input buffer,
2806 * and are hence still valid after freeing the
2807 * CRT chain. */
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002808
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002809 crt_start = chain->raw.p;
2810 crt_len = chain->raw.len;
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002811
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002812 pk_start = chain->pk_raw.p;
2813 pk_len = chain->pk_raw.len;
2814
2815 /* Free the CRT structures before computing
2816 * digest and copying the peer's public key. */
2817 mbedtls_x509_crt_free( chain );
2818 mbedtls_free( chain );
2819 chain = NULL;
2820
2821 ret = ssl_remember_peer_crt_digest( ssl, crt_start, crt_len );
Hanno Beckera2747532019-02-06 16:19:04 +00002822 if( ret != 0 )
Hanno Beckera2747532019-02-06 16:19:04 +00002823 goto exit;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002824
2825 ret = ssl_remember_peer_pubkey( ssl, pk_start, pk_len );
2826 if( ret != 0 )
2827 goto exit;
Hanno Beckera2747532019-02-06 16:19:04 +00002828 }
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002829#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2830 /* Pass ownership to session structure. */
Hanno Becker3dad3112019-02-05 17:19:52 +00002831 ssl->session_negotiate->peer_cert = chain;
2832 chain = NULL;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002833#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker3dad3112019-02-05 17:19:52 +00002834
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002835 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002836
Hanno Becker6bdfab22019-02-05 13:11:17 +00002837exit:
2838
Hanno Becker3dad3112019-02-05 17:19:52 +00002839 if( ret == 0 )
2840 ssl->state++;
2841
Gilles Peskineeccd8882020-03-10 12:19:08 +01002842#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Hanno Becker3dad3112019-02-05 17:19:52 +00002843 if( ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS )
2844 {
2845 ssl->handshake->ecrs_peer_cert = chain;
2846 chain = NULL;
2847 }
2848#endif
2849
2850 if( chain != NULL )
2851 {
2852 mbedtls_x509_crt_free( chain );
2853 mbedtls_free( chain );
2854 }
2855
Paul Bakker5121ce52009-01-03 21:22:43 +00002856 return( ret );
2857}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002858#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002859
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002860void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl,
2861 const mbedtls_ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00002862{
Paul Bakkerfb08fd22013-08-27 15:06:26 +02002863 ((void) ciphersuite_info);
Paul Bakker769075d2012-11-24 11:26:46 +01002864
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002865#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2866 defined(MBEDTLS_SSL_PROTO_TLS1_1)
2867 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00002868 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker380da532012-04-18 16:10:25 +00002869 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002870#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002871#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2872#if defined(MBEDTLS_SHA512_C)
2873 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002874 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
2875 else
2876#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002877#if defined(MBEDTLS_SHA256_C)
2878 if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 )
Paul Bakker48916f92012-09-16 19:57:18 +00002879 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002880 else
2881#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002882#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02002883 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002884 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002885 return;
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02002886 }
Paul Bakker380da532012-04-18 16:10:25 +00002887}
Paul Bakkerf7abd422013-04-16 13:15:56 +02002888
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002889void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02002890{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002891#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2892 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01002893 mbedtls_md5_starts_ret( &ssl->handshake->fin_md5 );
2894 mbedtls_sha1_starts_ret( &ssl->handshake->fin_sha1 );
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02002895#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002896#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2897#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05002898#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek2ad22972019-01-30 03:32:12 -05002899 psa_hash_abort( &ssl->handshake->fin_sha256_psa );
Andrzej Kurekeb342242019-01-29 09:14:33 -05002900 psa_hash_setup( &ssl->handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
2901#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01002902 mbedtls_sha256_starts_ret( &ssl->handshake->fin_sha256, 0 );
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02002903#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05002904#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002905#if defined(MBEDTLS_SHA512_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05002906#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek2ad22972019-01-30 03:32:12 -05002907 psa_hash_abort( &ssl->handshake->fin_sha384_psa );
Andrzej Kurek972fba52019-01-30 03:29:12 -05002908 psa_hash_setup( &ssl->handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
Andrzej Kurekeb342242019-01-29 09:14:33 -05002909#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01002910 mbedtls_sha512_starts_ret( &ssl->handshake->fin_sha512, 1 );
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02002911#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05002912#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002913#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02002914}
2915
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002916static void ssl_update_checksum_start( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002917 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002918{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002919#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2920 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01002921 mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len );
2922 mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002923#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002924#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2925#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05002926#if defined(MBEDTLS_USE_PSA_CRYPTO)
2927 psa_hash_update( &ssl->handshake->fin_sha256_psa, buf, len );
2928#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01002929 mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002930#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05002931#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002932#if defined(MBEDTLS_SHA512_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05002933#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05002934 psa_hash_update( &ssl->handshake->fin_sha384_psa, buf, len );
Andrzej Kurekeb342242019-01-29 09:14:33 -05002935#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01002936 mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002937#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05002938#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002939#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00002940}
2941
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002942#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2943 defined(MBEDTLS_SSL_PROTO_TLS1_1)
2944static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002945 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002946{
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01002947 mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len );
2948 mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002949}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002950#endif
Paul Bakker380da532012-04-18 16:10:25 +00002951
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002952#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2953#if defined(MBEDTLS_SHA256_C)
2954static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002955 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002956{
Andrzej Kurekeb342242019-01-29 09:14:33 -05002957#if defined(MBEDTLS_USE_PSA_CRYPTO)
2958 psa_hash_update( &ssl->handshake->fin_sha256_psa, buf, len );
2959#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01002960 mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len );
Andrzej Kurekeb342242019-01-29 09:14:33 -05002961#endif
Paul Bakker380da532012-04-18 16:10:25 +00002962}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002963#endif
Paul Bakker380da532012-04-18 16:10:25 +00002964
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002965#if defined(MBEDTLS_SHA512_C)
2966static void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002967 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002968{
Andrzej Kurekeb342242019-01-29 09:14:33 -05002969#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05002970 psa_hash_update( &ssl->handshake->fin_sha384_psa, buf, len );
Andrzej Kurekeb342242019-01-29 09:14:33 -05002971#else
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01002972 mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len );
Andrzej Kurekeb342242019-01-29 09:14:33 -05002973#endif
Paul Bakker380da532012-04-18 16:10:25 +00002974}
Paul Bakker769075d2012-11-24 11:26:46 +01002975#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002976#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00002977
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002978#if defined(MBEDTLS_SSL_PROTO_SSL3)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002979static void ssl_calc_finished_ssl(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002980 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002981{
Paul Bakker3c2122f2013-06-24 19:03:14 +02002982 const char *sender;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02002983 mbedtls_md5_context md5;
2984 mbedtls_sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002985
Paul Bakker5121ce52009-01-03 21:22:43 +00002986 unsigned char padbuf[48];
2987 unsigned char md5sum[16];
2988 unsigned char sha1sum[20];
2989
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002990 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00002991 if( !session )
2992 session = ssl->session;
2993
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002994 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002995
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02002996 mbedtls_md5_init( &md5 );
2997 mbedtls_sha1_init( &sha1 );
2998
2999 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
3000 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003001
3002 /*
3003 * SSLv3:
3004 * hash =
3005 * MD5( master + pad2 +
3006 * MD5( handshake + sender + master + pad1 ) )
3007 * + SHA1( master + pad2 +
3008 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00003009 */
3010
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003011#if !defined(MBEDTLS_MD5_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003012 MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
3013 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003014#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003015
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003016#if !defined(MBEDTLS_SHA1_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003017 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
3018 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003019#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003020
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003021 sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "CLNT"
Paul Bakker3c2122f2013-06-24 19:03:14 +02003022 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00003023
Paul Bakker1ef83d62012-04-11 12:09:53 +00003024 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003025
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003026 mbedtls_md5_update_ret( &md5, (const unsigned char *) sender, 4 );
3027 mbedtls_md5_update_ret( &md5, session->master, 48 );
3028 mbedtls_md5_update_ret( &md5, padbuf, 48 );
3029 mbedtls_md5_finish_ret( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00003030
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003031 mbedtls_sha1_update_ret( &sha1, (const unsigned char *) sender, 4 );
3032 mbedtls_sha1_update_ret( &sha1, session->master, 48 );
3033 mbedtls_sha1_update_ret( &sha1, padbuf, 40 );
3034 mbedtls_sha1_finish_ret( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00003035
Paul Bakker1ef83d62012-04-11 12:09:53 +00003036 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003037
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003038 mbedtls_md5_starts_ret( &md5 );
3039 mbedtls_md5_update_ret( &md5, session->master, 48 );
3040 mbedtls_md5_update_ret( &md5, padbuf, 48 );
3041 mbedtls_md5_update_ret( &md5, md5sum, 16 );
3042 mbedtls_md5_finish_ret( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00003043
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003044 mbedtls_sha1_starts_ret( &sha1 );
3045 mbedtls_sha1_update_ret( &sha1, session->master, 48 );
3046 mbedtls_sha1_update_ret( &sha1, padbuf , 40 );
3047 mbedtls_sha1_update_ret( &sha1, sha1sum, 20 );
3048 mbedtls_sha1_finish_ret( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003049
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003050 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003051
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003052 mbedtls_md5_free( &md5 );
3053 mbedtls_sha1_free( &sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003054
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003055 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
3056 mbedtls_platform_zeroize( md5sum, sizeof( md5sum ) );
3057 mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003059 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003060}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003061#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00003062
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003063#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Paul Bakker1ef83d62012-04-11 12:09:53 +00003064static void ssl_calc_finished_tls(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003065 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00003066{
Paul Bakker1ef83d62012-04-11 12:09:53 +00003067 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02003068 const char *sender;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003069 mbedtls_md5_context md5;
3070 mbedtls_sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003071 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00003072
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003073 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00003074 if( !session )
3075 session = ssl->session;
3076
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003077 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003078
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003079 mbedtls_md5_init( &md5 );
3080 mbedtls_sha1_init( &sha1 );
3081
3082 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
3083 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003084
Paul Bakker1ef83d62012-04-11 12:09:53 +00003085 /*
3086 * TLSv1:
3087 * hash = PRF( master, finished_label,
3088 * MD5( handshake ) + SHA1( handshake ) )[0..11]
3089 */
Paul Bakker5121ce52009-01-03 21:22:43 +00003090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003091#if !defined(MBEDTLS_MD5_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003092 MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
3093 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003094#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00003095
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003096#if !defined(MBEDTLS_SHA1_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003097 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
3098 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003099#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00003100
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003101 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02003102 ? "client finished"
3103 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00003104
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003105 mbedtls_md5_finish_ret( &md5, padbuf );
3106 mbedtls_sha1_finish_ret( &sha1, padbuf + 16 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003107
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003108 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00003109 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003110
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003111 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003112
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003113 mbedtls_md5_free( &md5 );
3114 mbedtls_sha1_free( &sha1 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003115
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003116 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003118 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003119}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003120#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003121
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003122#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3123#if defined(MBEDTLS_SHA256_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00003124static void ssl_calc_finished_tls_sha256(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003125 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003126{
3127 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02003128 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003129 unsigned char padbuf[32];
Andrzej Kurekeb342242019-01-29 09:14:33 -05003130#if defined(MBEDTLS_USE_PSA_CRYPTO)
3131 size_t hash_size;
Jaeden Amero34973232019-02-20 10:32:28 +00003132 psa_hash_operation_t sha256_psa = PSA_HASH_OPERATION_INIT;
Andrzej Kurekeb342242019-01-29 09:14:33 -05003133 psa_status_t status;
3134#else
3135 mbedtls_sha256_context sha256;
3136#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00003137
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
Andrzej Kurekeb342242019-01-29 09:14:33 -05003142 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
3143 ? "client finished"
3144 : "server finished";
3145
3146#if defined(MBEDTLS_USE_PSA_CRYPTO)
3147 sha256_psa = psa_hash_operation_init();
3148
3149 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc PSA finished tls sha256" ) );
3150
3151 status = psa_hash_clone( &ssl->handshake->fin_sha256_psa, &sha256_psa );
3152 if( status != PSA_SUCCESS )
3153 {
3154 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
3155 return;
3156 }
3157
3158 status = psa_hash_finish( &sha256_psa, padbuf, sizeof( padbuf ), &hash_size );
3159 if( status != PSA_SUCCESS )
3160 {
3161 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
3162 return;
3163 }
3164 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated padbuf", padbuf, 32 );
3165#else
3166
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003167 mbedtls_sha256_init( &sha256 );
3168
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003169 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003170
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003171 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003172
3173 /*
3174 * TLSv1.2:
3175 * hash = PRF( master, finished_label,
3176 * Hash( handshake ) )[0.11]
3177 */
3178
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003179#if !defined(MBEDTLS_SHA256_ALT)
3180 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003181 sha256.state, sizeof( sha256.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003182#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00003183
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003184 mbedtls_sha256_finish_ret( &sha256, padbuf );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003185 mbedtls_sha256_free( &sha256 );
3186#endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003187
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003188 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00003189 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003190
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003191 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003192
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003193 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003194
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003195 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003196}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003197#endif /* MBEDTLS_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +00003198
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003199#if defined(MBEDTLS_SHA512_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00003200static void ssl_calc_finished_tls_sha384(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003201 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakkerca4ab492012-04-18 14:23:57 +00003202{
3203 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02003204 const char *sender;
Paul Bakkerca4ab492012-04-18 14:23:57 +00003205 unsigned char padbuf[48];
Andrzej Kurekeb342242019-01-29 09:14:33 -05003206#if defined(MBEDTLS_USE_PSA_CRYPTO)
3207 size_t hash_size;
Jaeden Amero34973232019-02-20 10:32:28 +00003208 psa_hash_operation_t sha384_psa = PSA_HASH_OPERATION_INIT;
Andrzej Kurekeb342242019-01-29 09:14:33 -05003209 psa_status_t status;
3210#else
3211 mbedtls_sha512_context sha512;
3212#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00003213
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003214 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00003215 if( !session )
3216 session = ssl->session;
3217
Andrzej Kurekeb342242019-01-29 09:14:33 -05003218 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
3219 ? "client finished"
3220 : "server finished";
3221
3222#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05003223 sha384_psa = psa_hash_operation_init();
Andrzej Kurekeb342242019-01-29 09:14:33 -05003224
3225 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc PSA finished tls sha384" ) );
3226
Andrzej Kurek972fba52019-01-30 03:29:12 -05003227 status = psa_hash_clone( &ssl->handshake->fin_sha384_psa, &sha384_psa );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003228 if( status != PSA_SUCCESS )
3229 {
3230 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
3231 return;
3232 }
3233
Andrzej Kurek972fba52019-01-30 03:29:12 -05003234 status = psa_hash_finish( &sha384_psa, padbuf, sizeof( padbuf ), &hash_size );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003235 if( status != PSA_SUCCESS )
3236 {
3237 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
3238 return;
3239 }
3240 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated padbuf", padbuf, 48 );
3241#else
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003242 mbedtls_sha512_init( &sha512 );
3243
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003244 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003245
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02003246 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003247
3248 /*
3249 * TLSv1.2:
3250 * hash = PRF( master, finished_label,
3251 * Hash( handshake ) )[0.11]
3252 */
3253
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003254#if !defined(MBEDTLS_SHA512_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02003255 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
3256 sha512.state, sizeof( sha512.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02003257#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00003258
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003259 mbedtls_sha512_finish_ret( &sha512, padbuf );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003260 mbedtls_sha512_free( &sha512 );
3261#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00003262
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003263 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00003264 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003265
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003266 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003267
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05003268 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003269
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003270 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003271}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003272#endif /* MBEDTLS_SHA512_C */
3273#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +00003274
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00003275void mbedtls_ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00003276{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003277 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup: final free" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003278
3279 /*
3280 * Free our handshake params
3281 */
Gilles Peskine9b562d52018-04-25 20:32:43 +02003282 mbedtls_ssl_handshake_free( ssl );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003283 mbedtls_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00003284 ssl->handshake = NULL;
3285
3286 /*
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003287 * Free the previous transform and swith in the current one
Paul Bakker48916f92012-09-16 19:57:18 +00003288 */
3289 if( ssl->transform )
3290 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003291 mbedtls_ssl_transform_free( ssl->transform );
3292 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003293 }
3294 ssl->transform = ssl->transform_negotiate;
3295 ssl->transform_negotiate = NULL;
3296
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003297 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup: final free" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003298}
3299
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003300void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003301{
3302 int resume = ssl->handshake->resume;
3303
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003304 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003305
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003306#if defined(MBEDTLS_SSL_RENEGOTIATION)
3307 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003308 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003309 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE;
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003310 ssl->renego_records_seen = 0;
3311 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003312#endif
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003313
3314 /*
3315 * Free the previous session and switch in the current one
3316 */
Paul Bakker0a597072012-09-25 21:55:46 +00003317 if( ssl->session )
3318 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003319#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard1a034732014-11-04 17:36:18 +01003320 /* RFC 7366 3.1: keep the EtM state */
3321 ssl->session_negotiate->encrypt_then_mac =
3322 ssl->session->encrypt_then_mac;
3323#endif
3324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003325 mbedtls_ssl_session_free( ssl->session );
3326 mbedtls_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00003327 }
3328 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00003329 ssl->session_negotiate = NULL;
3330
Paul Bakker0a597072012-09-25 21:55:46 +00003331 /*
3332 * Add cache entry
3333 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003334 if( ssl->conf->f_set_cache != NULL &&
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02003335 ssl->session->id_len != 0 &&
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02003336 resume == 0 )
3337 {
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01003338 if( ssl->conf->f_set_cache( ssl->conf->p_cache, ssl->session ) != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003339 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02003340 }
Paul Bakker0a597072012-09-25 21:55:46 +00003341
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003342#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003343 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003344 ssl->handshake->flight != NULL )
3345 {
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02003346 /* Cancel handshake timer */
Hanno Becker0f57a652020-02-05 10:37:26 +00003347 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02003348
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003349 /* Keep last flight around in case we need to resend it:
3350 * we need the handshake and transform structures for that */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003351 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip freeing handshake and transform" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003352 }
3353 else
3354#endif
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00003355 mbedtls_ssl_handshake_wrapup_free_hs_transform( ssl );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02003356
Paul Bakker48916f92012-09-16 19:57:18 +00003357 ssl->state++;
3358
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003359 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003360}
3361
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003362int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl )
Paul Bakker1ef83d62012-04-11 12:09:53 +00003363{
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003364 int ret, hash_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003365
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003366 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003367
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00003368 mbedtls_ssl_update_out_pointers( ssl, ssl->transform_negotiate );
Paul Bakker92be97b2013-01-02 17:30:03 +01003369
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003370 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003371
Manuel Pégourié-Gonnard214a8482016-02-22 11:27:26 +01003372 /*
3373 * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites
3374 * may define some other value. Currently (early 2016), no defined
3375 * ciphersuite does this (and this is unlikely to change as activity has
3376 * moved to TLS 1.3 now) so we can keep the hardcoded 12 here.
3377 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003378 hash_len = ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) ? 36 : 12;
Paul Bakker5121ce52009-01-03 21:22:43 +00003379
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003380#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00003381 ssl->verify_data_len = hash_len;
3382 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003383#endif
Paul Bakker48916f92012-09-16 19:57:18 +00003384
Paul Bakker5121ce52009-01-03 21:22:43 +00003385 ssl->out_msglen = 4 + hash_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003386 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3387 ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003388
3389 /*
3390 * In case of session resuming, invert the client and server
3391 * ChangeCipherSpec messages order.
3392 */
Paul Bakker0a597072012-09-25 21:55:46 +00003393 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003394 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003395#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003396 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003397 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01003398#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003399#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003400 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003401 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01003402#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003403 }
3404 else
3405 ssl->state++;
3406
Paul Bakker48916f92012-09-16 19:57:18 +00003407 /*
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02003408 * Switch to our negotiated transform and session parameters for outbound
3409 * data.
Paul Bakker48916f92012-09-16 19:57:18 +00003410 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003411 MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
Manuel Pégourié-Gonnard5afb1672014-02-16 18:33:22 +01003412
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003413#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003414 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003415 {
3416 unsigned char i;
3417
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003418 /* Remember current epoch settings for resending */
3419 ssl->handshake->alt_transform_out = ssl->transform_out;
Hanno Becker19859472018-08-06 09:40:20 +01003420 memcpy( ssl->handshake->alt_out_ctr, ssl->cur_out_ctr, 8 );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003421
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003422 /* Set sequence_number to zero */
Hanno Becker19859472018-08-06 09:40:20 +01003423 memset( ssl->cur_out_ctr + 2, 0, 6 );
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003424
3425 /* Increment epoch */
3426 for( i = 2; i > 0; i-- )
Hanno Becker19859472018-08-06 09:40:20 +01003427 if( ++ssl->cur_out_ctr[i - 1] != 0 )
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003428 break;
3429
3430 /* The loop goes to its end iff the counter is wrapping */
3431 if( i == 0 )
3432 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003433 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) );
3434 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003435 }
3436 }
3437 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003438#endif /* MBEDTLS_SSL_PROTO_DTLS */
Hanno Becker19859472018-08-06 09:40:20 +01003439 memset( ssl->cur_out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003440
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003441 ssl->transform_out = ssl->transform_negotiate;
3442 ssl->session_out = ssl->session_negotiate;
3443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003444#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
3445 if( mbedtls_ssl_hw_record_activate != NULL )
Paul Bakker07eb38b2012-12-19 14:42:06 +01003446 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003447 if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 )
Paul Bakker07eb38b2012-12-19 14:42:06 +01003448 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003449 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret );
3450 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Paul Bakker07eb38b2012-12-19 14:42:06 +01003451 }
3452 }
3453#endif
3454
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003455#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003456 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003457 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003458#endif
3459
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003460 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003461 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003462 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003463 return( ret );
3464 }
3465
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003466#if defined(MBEDTLS_SSL_PROTO_DTLS)
3467 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3468 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
3469 {
3470 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
3471 return( ret );
3472 }
3473#endif
3474
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003475 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003476
3477 return( 0 );
3478}
3479
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003480#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00003481#define SSL_MAX_HASH_LEN 36
3482#else
3483#define SSL_MAX_HASH_LEN 12
3484#endif
3485
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003486int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003487{
Janos Follath865b3eb2019-12-16 11:46:15 +00003488 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02003489 unsigned int hash_len;
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00003490 unsigned char buf[SSL_MAX_HASH_LEN];
Paul Bakker5121ce52009-01-03 21:22:43 +00003491
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003492 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003493
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003494 ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003495
Hanno Becker327c93b2018-08-15 13:56:18 +01003496 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003497 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003498 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003499 return( ret );
3500 }
3501
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003502 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003503 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003504 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003505 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3506 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003507 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003508 }
3509
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00003510 /* There is currently no ciphersuite using another length with TLS 1.2 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003511#if defined(MBEDTLS_SSL_PROTO_SSL3)
3512 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00003513 hash_len = 36;
3514 else
3515#endif
3516 hash_len = 12;
Paul Bakker5121ce52009-01-03 21:22:43 +00003517
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003518 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED ||
3519 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003520 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003521 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003522 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3523 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003524 return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003525 }
3526
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003527 if( mbedtls_ssl_safer_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ),
Manuel Pégourié-Gonnard4abc3272014-09-10 12:02:46 +00003528 buf, hash_len ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003529 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003530 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02003531 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3532 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003533 return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003534 }
3535
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003536#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00003537 ssl->verify_data_len = hash_len;
3538 memcpy( ssl->peer_verify_data, buf, hash_len );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003539#endif
Paul Bakker48916f92012-09-16 19:57:18 +00003540
Paul Bakker0a597072012-09-25 21:55:46 +00003541 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003542 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003543#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003544 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003545 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01003546#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003547#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003548 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003549 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01003550#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003551 }
3552 else
3553 ssl->state++;
3554
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003555#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003556 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003557 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003558#endif
3559
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003560 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003561
3562 return( 0 );
3563}
3564
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003565static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003566{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003567 memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003568
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003569#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3570 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3571 mbedtls_md5_init( &handshake->fin_md5 );
3572 mbedtls_sha1_init( &handshake->fin_sha1 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003573 mbedtls_md5_starts_ret( &handshake->fin_md5 );
3574 mbedtls_sha1_starts_ret( &handshake->fin_sha1 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003575#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003576#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3577#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05003578#if defined(MBEDTLS_USE_PSA_CRYPTO)
3579 handshake->fin_sha256_psa = psa_hash_operation_init();
3580 psa_hash_setup( &handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
3581#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003582 mbedtls_sha256_init( &handshake->fin_sha256 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003583 mbedtls_sha256_starts_ret( &handshake->fin_sha256, 0 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003584#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05003585#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003586#if defined(MBEDTLS_SHA512_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05003587#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05003588 handshake->fin_sha384_psa = psa_hash_operation_init();
3589 psa_hash_setup( &handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
Andrzej Kurekeb342242019-01-29 09:14:33 -05003590#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003591 mbedtls_sha512_init( &handshake->fin_sha512 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01003592 mbedtls_sha512_starts_ret( &handshake->fin_sha512, 1 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003593#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05003594#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003595#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003596
3597 handshake->update_checksum = ssl_update_checksum_start;
Hanno Becker7e5437a2017-04-28 17:15:26 +01003598
3599#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01003600 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01003601 mbedtls_ssl_sig_hash_set_init( &handshake->hash_algs );
3602#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003603
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003604#if defined(MBEDTLS_DHM_C)
3605 mbedtls_dhm_init( &handshake->dhm_ctx );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003606#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003607#if defined(MBEDTLS_ECDH_C)
3608 mbedtls_ecdh_init( &handshake->ecdh_ctx );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003609#endif
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02003610#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02003611 mbedtls_ecjpake_init( &handshake->ecjpake_ctx );
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02003612#if defined(MBEDTLS_SSL_CLI_C)
3613 handshake->ecjpake_cache = NULL;
3614 handshake->ecjpake_cache_len = 0;
3615#endif
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02003616#endif
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02003617
Gilles Peskineeccd8882020-03-10 12:19:08 +01003618#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard6b7301c2017-08-15 12:08:45 +02003619 mbedtls_x509_crt_restart_init( &handshake->ecrs_ctx );
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003620#endif
3621
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02003622#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
3623 handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
3624#endif
Hanno Becker75173122019-02-06 16:18:31 +00003625
3626#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
3627 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3628 mbedtls_pk_init( &handshake->peer_pubkey );
3629#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003630}
3631
Hanno Beckera18d1322018-01-03 14:27:32 +00003632void mbedtls_ssl_transform_init( mbedtls_ssl_transform *transform )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003633{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003634 memset( transform, 0, sizeof(mbedtls_ssl_transform) );
Paul Bakker84bbeb52014-07-01 14:53:22 +02003635
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003636 mbedtls_cipher_init( &transform->cipher_ctx_enc );
3637 mbedtls_cipher_init( &transform->cipher_ctx_dec );
Paul Bakker84bbeb52014-07-01 14:53:22 +02003638
Hanno Beckerd56ed242018-01-03 15:32:51 +00003639#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003640 mbedtls_md_init( &transform->md_ctx_enc );
3641 mbedtls_md_init( &transform->md_ctx_dec );
Hanno Beckerd56ed242018-01-03 15:32:51 +00003642#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003643}
3644
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003645void mbedtls_ssl_session_init( mbedtls_ssl_session *session )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003646{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003647 memset( session, 0, sizeof(mbedtls_ssl_session) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003648}
3649
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003650static int ssl_handshake_init( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00003651{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003652 /* Clear old handshake information if present */
Paul Bakker48916f92012-09-16 19:57:18 +00003653 if( ssl->transform_negotiate )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003654 mbedtls_ssl_transform_free( ssl->transform_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003655 if( ssl->session_negotiate )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003656 mbedtls_ssl_session_free( ssl->session_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003657 if( ssl->handshake )
Gilles Peskine9b562d52018-04-25 20:32:43 +02003658 mbedtls_ssl_handshake_free( ssl );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003659
3660 /*
3661 * Either the pointers are now NULL or cleared properly and can be freed.
3662 * Now allocate missing structures.
3663 */
3664 if( ssl->transform_negotiate == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003665 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02003666 ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003667 }
Paul Bakker48916f92012-09-16 19:57:18 +00003668
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003669 if( ssl->session_negotiate == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003670 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02003671 ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003672 }
Paul Bakker48916f92012-09-16 19:57:18 +00003673
Paul Bakker82788fb2014-10-20 13:59:19 +02003674 if( ssl->handshake == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003675 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02003676 ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003677 }
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003678#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3679 /* If the buffers are too small - reallocate */
3680 {
3681 int modified = 0;
Andrzej Kurekb6577832020-06-08 07:08:03 -04003682 size_t written_in = 0, iv_offset_in = 0, len_offset_in = 0;
3683 size_t written_out = 0, iv_offset_out = 0, len_offset_out = 0;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003684 if( ssl->in_buf != NULL )
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003685 {
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003686 written_in = ssl->in_msg - ssl->in_buf;
Andrzej Kurekb6577832020-06-08 07:08:03 -04003687 iv_offset_in = ssl->in_iv - ssl->in_buf;
3688 len_offset_in = ssl->in_len - ssl->in_buf;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003689 if( ssl->in_buf_len < MBEDTLS_SSL_IN_BUFFER_LEN )
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003690 {
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003691 if( resize_buffer( &ssl->in_buf, MBEDTLS_SSL_IN_BUFFER_LEN,
3692 &ssl->in_buf_len ) != 0 )
3693 {
3694 MBEDTLS_SSL_DEBUG_MSG( 1, ( "input buffer resizing failed - out of memory" ) );
3695 }
3696 else
3697 {
3698 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating in_buf to %d", MBEDTLS_SSL_IN_BUFFER_LEN ) );
3699 modified = 1;
3700 }
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003701 }
3702 }
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003703
3704 if( ssl->out_buf != NULL )
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003705 {
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003706 written_out = ssl->out_msg - ssl->out_buf;
Andrzej Kurekb6577832020-06-08 07:08:03 -04003707 iv_offset_out = ssl->out_iv - ssl->out_buf;
3708 len_offset_out = ssl->out_len - ssl->out_buf;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003709 if( ssl->out_buf_len < MBEDTLS_SSL_OUT_BUFFER_LEN )
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003710 {
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003711 if( resize_buffer( &ssl->out_buf, MBEDTLS_SSL_OUT_BUFFER_LEN,
3712 &ssl->out_buf_len ) != 0 )
3713 {
3714 MBEDTLS_SSL_DEBUG_MSG( 1, ( "output buffer resizing failed - out of memory" ) );
3715 }
3716 else
3717 {
3718 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating out_buf to %d", MBEDTLS_SSL_OUT_BUFFER_LEN ) );
3719 modified = 1;
3720 }
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003721 }
3722 }
3723 if( modified )
3724 {
3725 /* Update pointers here to avoid doing it twice. */
3726 mbedtls_ssl_reset_in_out_pointers( ssl );
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003727 /* Fields below might not be properly updated with record
Andrzej Kurekb6577832020-06-08 07:08:03 -04003728 * splitting or with CID, so they are manually updated here. */
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003729 ssl->out_msg = ssl->out_buf + written_out;
Andrzej Kurekb6577832020-06-08 07:08:03 -04003730 ssl->out_len = ssl->out_buf + len_offset_out;
3731 ssl->out_iv = ssl->out_buf + iv_offset_out;
3732
Andrzej Kurek8ea68722020-04-03 06:40:47 -04003733 ssl->in_msg = ssl->in_buf + written_in;
Andrzej Kurekb6577832020-06-08 07:08:03 -04003734 ssl->in_len = ssl->in_buf + len_offset_in;
3735 ssl->in_iv = ssl->in_buf + iv_offset_in;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05003736 }
3737 }
3738#endif
Paul Bakker48916f92012-09-16 19:57:18 +00003739
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003740 /* All pointers should exist and can be directly freed without issue */
Paul Bakker48916f92012-09-16 19:57:18 +00003741 if( ssl->handshake == NULL ||
3742 ssl->transform_negotiate == NULL ||
3743 ssl->session_negotiate == NULL )
3744 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02003745 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc() of ssl sub-contexts failed" ) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003746
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003747 mbedtls_free( ssl->handshake );
3748 mbedtls_free( ssl->transform_negotiate );
3749 mbedtls_free( ssl->session_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003750
3751 ssl->handshake = NULL;
3752 ssl->transform_negotiate = NULL;
3753 ssl->session_negotiate = NULL;
3754
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02003755 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker48916f92012-09-16 19:57:18 +00003756 }
3757
Paul Bakkeraccaffe2014-06-26 13:37:14 +02003758 /* Initialize structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003759 mbedtls_ssl_session_init( ssl->session_negotiate );
Hanno Beckera18d1322018-01-03 14:27:32 +00003760 mbedtls_ssl_transform_init( ssl->transform_negotiate );
Paul Bakker968afaa2014-07-09 11:09:24 +02003761 ssl_handshake_params_init( ssl->handshake );
3762
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003763#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02003764 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
3765 {
3766 ssl->handshake->alt_transform_out = ssl->transform_out;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003767
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02003768 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
3769 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
3770 else
3771 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02003772
Hanno Becker0f57a652020-02-05 10:37:26 +00003773 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02003774 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003775#endif
3776
Paul Bakker48916f92012-09-16 19:57:18 +00003777 return( 0 );
3778}
3779
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02003780#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02003781/* Dummy cookie callbacks for defaults */
3782static int ssl_cookie_write_dummy( void *ctx,
3783 unsigned char **p, unsigned char *end,
3784 const unsigned char *cli_id, size_t cli_id_len )
3785{
3786 ((void) ctx);
3787 ((void) p);
3788 ((void) end);
3789 ((void) cli_id);
3790 ((void) cli_id_len);
3791
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003792 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02003793}
3794
3795static int ssl_cookie_check_dummy( void *ctx,
3796 const unsigned char *cookie, size_t cookie_len,
3797 const unsigned char *cli_id, size_t cli_id_len )
3798{
3799 ((void) ctx);
3800 ((void) cookie);
3801 ((void) cookie_len);
3802 ((void) cli_id);
3803 ((void) cli_id_len);
3804
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003805 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02003806}
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02003807#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02003808
Paul Bakker5121ce52009-01-03 21:22:43 +00003809/*
3810 * Initialize an SSL context
3811 */
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02003812void mbedtls_ssl_init( mbedtls_ssl_context *ssl )
3813{
3814 memset( ssl, 0, sizeof( mbedtls_ssl_context ) );
3815}
3816
3817/*
3818 * Setup an SSL context
3819 */
Hanno Becker2a43f6f2018-08-10 11:12:52 +01003820
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02003821int mbedtls_ssl_setup( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +02003822 const mbedtls_ssl_config *conf )
Paul Bakker5121ce52009-01-03 21:22:43 +00003823{
Janos Follath865b3eb2019-12-16 11:46:15 +00003824 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Darryl Greenb33cc762019-11-28 14:29:44 +00003825 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
3826 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
Paul Bakker5121ce52009-01-03 21:22:43 +00003827
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02003828 ssl->conf = conf;
Paul Bakker62f2dee2012-09-28 07:31:51 +00003829
3830 /*
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01003831 * Prepare base structures
Paul Bakker62f2dee2012-09-28 07:31:51 +00003832 */
k-stachowiakc9a5f022018-07-24 13:53:31 +02003833
3834 /* Set to NULL in case of an error condition */
3835 ssl->out_buf = NULL;
k-stachowiaka47911c2018-07-04 17:41:58 +02003836
Darryl Greenb33cc762019-11-28 14:29:44 +00003837#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3838 ssl->in_buf_len = in_buf_len;
3839#endif
3840 ssl->in_buf = mbedtls_calloc( 1, in_buf_len );
Angus Grattond8213d02016-05-25 20:56:48 +10003841 if( ssl->in_buf == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003842 {
Darryl Greenb33cc762019-11-28 14:29:44 +00003843 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", in_buf_len ) );
k-stachowiak9f7798e2018-07-31 16:52:32 +02003844 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02003845 goto error;
Angus Grattond8213d02016-05-25 20:56:48 +10003846 }
3847
Darryl Greenb33cc762019-11-28 14:29:44 +00003848#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3849 ssl->out_buf_len = out_buf_len;
3850#endif
3851 ssl->out_buf = mbedtls_calloc( 1, out_buf_len );
Angus Grattond8213d02016-05-25 20:56:48 +10003852 if( ssl->out_buf == NULL )
3853 {
Darryl Greenb33cc762019-11-28 14:29:44 +00003854 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", out_buf_len ) );
k-stachowiak9f7798e2018-07-31 16:52:32 +02003855 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02003856 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00003857 }
3858
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00003859 mbedtls_ssl_reset_in_out_pointers( ssl );
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02003860
Johan Pascalb62bb512015-12-03 21:56:45 +01003861#if defined(MBEDTLS_SSL_DTLS_SRTP)
Ron Eldor3adb9922017-12-21 10:15:08 +02003862 memset( &ssl->dtls_srtp_info, 0, sizeof(ssl->dtls_srtp_info) );
Johan Pascalb62bb512015-12-03 21:56:45 +01003863#endif
3864
Paul Bakker48916f92012-09-16 19:57:18 +00003865 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
k-stachowiaka47911c2018-07-04 17:41:58 +02003866 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00003867
3868 return( 0 );
k-stachowiaka47911c2018-07-04 17:41:58 +02003869
3870error:
3871 mbedtls_free( ssl->in_buf );
3872 mbedtls_free( ssl->out_buf );
3873
3874 ssl->conf = NULL;
3875
Darryl Greenb33cc762019-11-28 14:29:44 +00003876#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3877 ssl->in_buf_len = 0;
3878 ssl->out_buf_len = 0;
3879#endif
k-stachowiaka47911c2018-07-04 17:41:58 +02003880 ssl->in_buf = NULL;
3881 ssl->out_buf = NULL;
3882
3883 ssl->in_hdr = NULL;
3884 ssl->in_ctr = NULL;
3885 ssl->in_len = NULL;
3886 ssl->in_iv = NULL;
3887 ssl->in_msg = NULL;
3888
3889 ssl->out_hdr = NULL;
3890 ssl->out_ctr = NULL;
3891 ssl->out_len = NULL;
3892 ssl->out_iv = NULL;
3893 ssl->out_msg = NULL;
3894
k-stachowiak9f7798e2018-07-31 16:52:32 +02003895 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003896}
3897
3898/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00003899 * Reset an initialized and used SSL context for re-use while retaining
3900 * all application-set variables, function pointers and data.
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02003901 *
3902 * If partial is non-zero, keep data in the input buffer and client ID.
3903 * (Use when a DTLS client reconnects from the same port.)
Paul Bakker7eb013f2011-10-06 12:37:39 +00003904 */
Hanno Becker43aefe22020-02-05 10:44:56 +00003905int mbedtls_ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial )
Paul Bakker7eb013f2011-10-06 12:37:39 +00003906{
Janos Follath865b3eb2019-12-16 11:46:15 +00003907 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Darryl Greenb33cc762019-11-28 14:29:44 +00003908#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3909 size_t in_buf_len = ssl->in_buf_len;
3910 size_t out_buf_len = ssl->out_buf_len;
3911#else
3912 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
3913 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
3914#endif
Paul Bakker48916f92012-09-16 19:57:18 +00003915
Hanno Becker7e772132018-08-10 12:38:21 +01003916#if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || \
3917 !defined(MBEDTLS_SSL_SRV_C)
3918 ((void) partial);
3919#endif
3920
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003921 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003922
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02003923 /* Cancel any possibly running timer */
Hanno Becker0f57a652020-02-05 10:37:26 +00003924 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02003925
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003926#if defined(MBEDTLS_SSL_RENEGOTIATION)
3927 ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003928 ssl->renego_records_seen = 0;
Paul Bakker48916f92012-09-16 19:57:18 +00003929
3930 ssl->verify_data_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003931 memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
3932 memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003933#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003934 ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +00003935
Paul Bakker7eb013f2011-10-06 12:37:39 +00003936 ssl->in_offt = NULL;
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00003937 mbedtls_ssl_reset_in_out_pointers( ssl );
Paul Bakker7eb013f2011-10-06 12:37:39 +00003938
3939 ssl->in_msgtype = 0;
3940 ssl->in_msglen = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003941#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02003942 ssl->next_record_offset = 0;
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02003943 ssl->in_epoch = 0;
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02003944#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003945#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Hanno Becker7e8e6a62020-02-05 10:45:48 +00003946 mbedtls_ssl_dtls_replay_reset( ssl );
Manuel Pégourié-Gonnardb47368a2014-09-24 13:29:58 +02003947#endif
Paul Bakker7eb013f2011-10-06 12:37:39 +00003948
3949 ssl->in_hslen = 0;
3950 ssl->nb_zero = 0;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003951
3952 ssl->keep_current_message = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003953
3954 ssl->out_msgtype = 0;
3955 ssl->out_msglen = 0;
3956 ssl->out_left = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003957#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
3958 if( ssl->split_done != MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED )
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01003959 ssl->split_done = 0;
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01003960#endif
Paul Bakker7eb013f2011-10-06 12:37:39 +00003961
Hanno Becker19859472018-08-06 09:40:20 +01003962 memset( ssl->cur_out_ctr, 0, sizeof( ssl->cur_out_ctr ) );
3963
Paul Bakker48916f92012-09-16 19:57:18 +00003964 ssl->transform_in = NULL;
3965 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003966
Hanno Becker78640902018-08-13 16:35:15 +01003967 ssl->session_in = NULL;
3968 ssl->session_out = NULL;
3969
Darryl Greenb33cc762019-11-28 14:29:44 +00003970 memset( ssl->out_buf, 0, out_buf_len );
Hanno Becker4ccbf062018-08-10 11:20:38 +01003971
3972#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02003973 if( partial == 0 )
Hanno Becker4ccbf062018-08-10 11:20:38 +01003974#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */
3975 {
3976 ssl->in_left = 0;
Darryl Greenb33cc762019-11-28 14:29:44 +00003977 memset( ssl->in_buf, 0, in_buf_len );
Hanno Becker4ccbf062018-08-10 11:20:38 +01003978 }
Paul Bakker05ef8352012-05-08 09:17:57 +00003979
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003980#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
3981 if( mbedtls_ssl_hw_record_reset != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00003982 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003983 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_reset()" ) );
3984 if( ( ret = mbedtls_ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00003985 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003986 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_reset", ret );
3987 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Paul Bakker2770fbd2012-07-03 13:30:23 +00003988 }
Paul Bakker05ef8352012-05-08 09:17:57 +00003989 }
3990#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00003991
Paul Bakker48916f92012-09-16 19:57:18 +00003992 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00003993 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003994 mbedtls_ssl_transform_free( ssl->transform );
3995 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003996 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00003997 }
Paul Bakker48916f92012-09-16 19:57:18 +00003998
Paul Bakkerc0463502013-02-14 11:19:38 +01003999 if( ssl->session )
4000 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004001 mbedtls_ssl_session_free( ssl->session );
4002 mbedtls_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01004003 ssl->session = NULL;
4004 }
4005
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004006#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004007 ssl->alpn_chosen = NULL;
4008#endif
4009
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02004010#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Hanno Becker4ccbf062018-08-10 11:20:38 +01004011#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE)
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02004012 if( partial == 0 )
Hanno Becker4ccbf062018-08-10 11:20:38 +01004013#endif
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02004014 {
4015 mbedtls_free( ssl->cli_id );
4016 ssl->cli_id = NULL;
4017 ssl->cli_id_len = 0;
4018 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02004019#endif
4020
Paul Bakker48916f92012-09-16 19:57:18 +00004021 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
4022 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00004023
4024 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00004025}
4026
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02004027/*
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02004028 * Reset an initialized and used SSL context for re-use while retaining
4029 * all application-set variables, function pointers and data.
4030 */
4031int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl )
4032{
Hanno Becker43aefe22020-02-05 10:44:56 +00004033 return( mbedtls_ssl_session_reset_int( ssl, 0 ) );
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02004034}
4035
4036/*
Paul Bakker5121ce52009-01-03 21:22:43 +00004037 * SSL set accessors
4038 */
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004039void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint )
Paul Bakker5121ce52009-01-03 21:22:43 +00004040{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004041 conf->endpoint = endpoint;
Paul Bakker5121ce52009-01-03 21:22:43 +00004042}
4043
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02004044void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport )
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01004045{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004046 conf->transport = transport;
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01004047}
4048
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004049#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004050void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode )
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02004051{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004052 conf->anti_replay = mode;
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02004053}
4054#endif
4055
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004056#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004057void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit )
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02004058{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004059 conf->badmac_limit = limit;
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02004060}
4061#endif
4062
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004063#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker04da1892018-08-14 13:22:10 +01004064
Hanno Becker1841b0a2018-08-24 11:13:57 +01004065void mbedtls_ssl_set_datagram_packing( mbedtls_ssl_context *ssl,
4066 unsigned allow_packing )
Hanno Becker04da1892018-08-14 13:22:10 +01004067{
4068 ssl->disable_datagram_packing = !allow_packing;
4069}
4070
4071void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf,
4072 uint32_t min, uint32_t max )
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02004073{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004074 conf->hs_timeout_min = min;
4075 conf->hs_timeout_max = max;
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02004076}
4077#endif
4078
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004079void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode )
Paul Bakker5121ce52009-01-03 21:22:43 +00004080{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004081 conf->authmode = authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00004082}
4083
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004084#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004085void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02004086 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00004087 void *p_vrfy )
4088{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004089 conf->f_vrfy = f_vrfy;
4090 conf->p_vrfy = p_vrfy;
Paul Bakkerb63b0af2011-01-13 17:54:59 +00004091}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004092#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00004093
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004094void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf,
Paul Bakkera3d195c2011-11-27 21:07:34 +00004095 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00004096 void *p_rng )
4097{
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01004098 conf->f_rng = f_rng;
4099 conf->p_rng = p_rng;
Paul Bakker5121ce52009-01-03 21:22:43 +00004100}
4101
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004102void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardfd474232015-06-23 16:34:24 +02004103 void (*f_dbg)(void *, int, const char *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00004104 void *p_dbg )
4105{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004106 conf->f_dbg = f_dbg;
4107 conf->p_dbg = p_dbg;
Paul Bakker5121ce52009-01-03 21:22:43 +00004108}
4109
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004110void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02004111 void *p_bio,
Simon Butchere846b512016-03-01 17:31:49 +00004112 mbedtls_ssl_send_t *f_send,
4113 mbedtls_ssl_recv_t *f_recv,
4114 mbedtls_ssl_recv_timeout_t *f_recv_timeout )
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02004115{
4116 ssl->p_bio = p_bio;
4117 ssl->f_send = f_send;
4118 ssl->f_recv = f_recv;
4119 ssl->f_recv_timeout = f_recv_timeout;
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01004120}
4121
Manuel Pégourié-Gonnard6e7aaca2018-08-20 10:37:23 +02004122#if defined(MBEDTLS_SSL_PROTO_DTLS)
4123void mbedtls_ssl_set_mtu( mbedtls_ssl_context *ssl, uint16_t mtu )
4124{
4125 ssl->mtu = mtu;
4126}
4127#endif
4128
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004129void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout )
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01004130{
4131 conf->read_timeout = timeout;
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02004132}
4133
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02004134void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl,
4135 void *p_timer,
Simon Butchere846b512016-03-01 17:31:49 +00004136 mbedtls_ssl_set_timer_t *f_set_timer,
4137 mbedtls_ssl_get_timer_t *f_get_timer )
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02004138{
4139 ssl->p_timer = p_timer;
4140 ssl->f_set_timer = f_set_timer;
4141 ssl->f_get_timer = f_get_timer;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02004142
4143 /* Make sure we start with no timer running */
Hanno Becker0f57a652020-02-05 10:37:26 +00004144 mbedtls_ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02004145}
4146
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004147#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004148void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01004149 void *p_cache,
4150 int (*f_get_cache)(void *, mbedtls_ssl_session *),
4151 int (*f_set_cache)(void *, const mbedtls_ssl_session *) )
Paul Bakker5121ce52009-01-03 21:22:43 +00004152{
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01004153 conf->p_cache = p_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004154 conf->f_get_cache = f_get_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004155 conf->f_set_cache = f_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00004156}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004157#endif /* MBEDTLS_SSL_SRV_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00004158
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004159#if defined(MBEDTLS_SSL_CLI_C)
4160int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00004161{
Janos Follath865b3eb2019-12-16 11:46:15 +00004162 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02004163
4164 if( ssl == NULL ||
4165 session == NULL ||
4166 ssl->session_negotiate == NULL ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02004167 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02004168 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004169 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02004170 }
4171
Hanno Becker52055ae2019-02-06 14:30:46 +00004172 if( ( ret = mbedtls_ssl_session_copy( ssl->session_negotiate,
4173 session ) ) != 0 )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02004174 return( ret );
4175
Paul Bakker0a597072012-09-25 21:55:46 +00004176 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02004177
4178 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00004179}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004180#endif /* MBEDTLS_SSL_CLI_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00004181
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004182void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004183 const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00004184{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004185 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = ciphersuites;
4186 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = ciphersuites;
4187 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = ciphersuites;
4188 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ciphersuites;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02004189}
4190
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004191void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02004192 const int *ciphersuites,
Paul Bakker8f4ddae2013-04-15 15:09:54 +02004193 int major, int minor )
4194{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004195 if( major != MBEDTLS_SSL_MAJOR_VERSION_3 )
Paul Bakker8f4ddae2013-04-15 15:09:54 +02004196 return;
4197
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004198 if( minor < MBEDTLS_SSL_MINOR_VERSION_0 || minor > MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker8f4ddae2013-04-15 15:09:54 +02004199 return;
4200
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004201 conf->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00004202}
4203
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004204#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02004205void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf,
Nicholas Wilson2088e2e2015-09-08 16:53:18 +01004206 const mbedtls_x509_crt_profile *profile )
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02004207{
4208 conf->cert_profile = profile;
4209}
4210
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004211/* Append a new keycert entry to a (possibly empty) list */
4212static int ssl_append_key_cert( mbedtls_ssl_key_cert **head,
4213 mbedtls_x509_crt *cert,
4214 mbedtls_pk_context *key )
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004215{
niisato8ee24222018-06-25 19:05:48 +09004216 mbedtls_ssl_key_cert *new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004217
niisato8ee24222018-06-25 19:05:48 +09004218 new_cert = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) );
4219 if( new_cert == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02004220 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004221
niisato8ee24222018-06-25 19:05:48 +09004222 new_cert->cert = cert;
4223 new_cert->key = key;
4224 new_cert->next = NULL;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004225
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004226 /* Update head is the list was null, else add to the end */
4227 if( *head == NULL )
Paul Bakker0333b972013-11-04 17:08:28 +01004228 {
niisato8ee24222018-06-25 19:05:48 +09004229 *head = new_cert;
Paul Bakker0333b972013-11-04 17:08:28 +01004230 }
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004231 else
4232 {
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004233 mbedtls_ssl_key_cert *cur = *head;
4234 while( cur->next != NULL )
4235 cur = cur->next;
niisato8ee24222018-06-25 19:05:48 +09004236 cur->next = new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004237 }
4238
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004239 return( 0 );
4240}
4241
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004242int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02004243 mbedtls_x509_crt *own_cert,
4244 mbedtls_pk_context *pk_key )
4245{
Manuel Pégourié-Gonnard17a40cd2015-05-10 23:17:17 +02004246 return( ssl_append_key_cert( &conf->key_cert, own_cert, pk_key ) );
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004247}
4248
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004249void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01004250 mbedtls_x509_crt *ca_chain,
4251 mbedtls_x509_crl *ca_crl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004252{
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01004253 conf->ca_chain = ca_chain;
4254 conf->ca_crl = ca_crl;
Hanno Becker5adaad92019-03-27 16:54:37 +00004255
4256#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
4257 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
4258 * cannot be used together. */
4259 conf->f_ca_cb = NULL;
4260 conf->p_ca_cb = NULL;
4261#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
Paul Bakker5121ce52009-01-03 21:22:43 +00004262}
Hanno Becker5adaad92019-03-27 16:54:37 +00004263
4264#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
4265void mbedtls_ssl_conf_ca_cb( mbedtls_ssl_config *conf,
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00004266 mbedtls_x509_crt_ca_cb_t f_ca_cb,
Hanno Becker5adaad92019-03-27 16:54:37 +00004267 void *p_ca_cb )
4268{
4269 conf->f_ca_cb = f_ca_cb;
4270 conf->p_ca_cb = p_ca_cb;
4271
4272 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
4273 * cannot be used together. */
4274 conf->ca_chain = NULL;
4275 conf->ca_crl = NULL;
4276}
4277#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004278#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00004279
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02004280#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
4281int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl,
4282 mbedtls_x509_crt *own_cert,
4283 mbedtls_pk_context *pk_key )
4284{
4285 return( ssl_append_key_cert( &ssl->handshake->sni_key_cert,
4286 own_cert, pk_key ) );
4287}
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02004288
4289void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl,
4290 mbedtls_x509_crt *ca_chain,
4291 mbedtls_x509_crl *ca_crl )
4292{
4293 ssl->handshake->sni_ca_chain = ca_chain;
4294 ssl->handshake->sni_ca_crl = ca_crl;
4295}
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02004296
4297void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl,
4298 int authmode )
4299{
4300 ssl->handshake->sni_authmode = authmode;
4301}
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02004302#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
4303
Hanno Becker8927c832019-04-03 12:52:50 +01004304#if defined(MBEDTLS_X509_CRT_PARSE_C)
4305void mbedtls_ssl_set_verify( mbedtls_ssl_context *ssl,
4306 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
4307 void *p_vrfy )
4308{
4309 ssl->f_vrfy = f_vrfy;
4310 ssl->p_vrfy = p_vrfy;
4311}
4312#endif
4313
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02004314#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02004315/*
4316 * Set EC J-PAKE password for current handshake
4317 */
4318int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,
4319 const unsigned char *pw,
4320 size_t pw_len )
4321{
4322 mbedtls_ecjpake_role role;
4323
Janos Follath8eb64132016-06-03 15:40:57 +01004324 if( ssl->handshake == NULL || ssl->conf == NULL )
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02004325 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4326
4327 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
4328 role = MBEDTLS_ECJPAKE_SERVER;
4329 else
4330 role = MBEDTLS_ECJPAKE_CLIENT;
4331
4332 return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx,
4333 role,
4334 MBEDTLS_MD_SHA256,
4335 MBEDTLS_ECP_DP_SECP256R1,
4336 pw, pw_len ) );
4337}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02004338#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02004339
Gilles Peskineeccd8882020-03-10 12:19:08 +01004340#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004341
4342static void ssl_conf_remove_psk( mbedtls_ssl_config *conf )
4343{
4344 /* Remove reference to existing PSK, if any. */
4345#if defined(MBEDTLS_USE_PSA_CRYPTO)
Ronald Croncf56a0a2020-08-04 09:51:30 +02004346 if( ! mbedtls_svc_key_id_is_null( conf->psk_opaque ) )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004347 {
4348 /* The maintenance of the PSK key slot is the
4349 * user's responsibility. */
Ronald Croncf56a0a2020-08-04 09:51:30 +02004350 conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004351 }
Hanno Beckera63ac3f2018-11-05 12:47:16 +00004352 /* This and the following branch should never
4353 * be taken simultaenously as we maintain the
4354 * invariant that raw and opaque PSKs are never
4355 * configured simultaneously. As a safeguard,
4356 * though, `else` is omitted here. */
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004357#endif /* MBEDTLS_USE_PSA_CRYPTO */
4358 if( conf->psk != NULL )
4359 {
4360 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
4361
4362 mbedtls_free( conf->psk );
4363 conf->psk = NULL;
4364 conf->psk_len = 0;
4365 }
4366
4367 /* Remove reference to PSK identity, if any. */
4368 if( conf->psk_identity != NULL )
4369 {
4370 mbedtls_free( conf->psk_identity );
4371 conf->psk_identity = NULL;
4372 conf->psk_identity_len = 0;
4373 }
4374}
4375
Hanno Becker7390c712018-11-15 13:33:04 +00004376/* This function assumes that PSK identity in the SSL config is unset.
4377 * It checks that the provided identity is well-formed and attempts
4378 * to make a copy of it in the SSL config.
4379 * On failure, the PSK identity in the config remains unset. */
4380static int ssl_conf_set_psk_identity( mbedtls_ssl_config *conf,
4381 unsigned char const *psk_identity,
4382 size_t psk_identity_len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02004383{
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02004384 /* Identity len will be encoded on two bytes */
Hanno Becker7390c712018-11-15 13:33:04 +00004385 if( psk_identity == NULL ||
4386 ( psk_identity_len >> 16 ) != 0 ||
Angus Grattond8213d02016-05-25 20:56:48 +10004387 psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02004388 {
4389 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4390 }
4391
Hanno Becker7390c712018-11-15 13:33:04 +00004392 conf->psk_identity = mbedtls_calloc( 1, psk_identity_len );
4393 if( conf->psk_identity == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02004394 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker6db455e2013-09-18 17:29:31 +02004395
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01004396 conf->psk_identity_len = psk_identity_len;
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01004397 memcpy( conf->psk_identity, psk_identity, conf->psk_identity_len );
Paul Bakker5ad403f2013-09-18 21:21:30 +02004398
4399 return( 0 );
Paul Bakker6db455e2013-09-18 17:29:31 +02004400}
4401
Hanno Becker7390c712018-11-15 13:33:04 +00004402int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
4403 const unsigned char *psk, size_t psk_len,
4404 const unsigned char *psk_identity, size_t psk_identity_len )
4405{
Janos Follath865b3eb2019-12-16 11:46:15 +00004406 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker7390c712018-11-15 13:33:04 +00004407 /* Remove opaque/raw PSK + PSK Identity */
4408 ssl_conf_remove_psk( conf );
4409
4410 /* Check and set raw PSK */
Piotr Nowicki9926eaf2019-11-20 14:54:36 +01004411 if( psk == NULL )
Hanno Becker7390c712018-11-15 13:33:04 +00004412 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Piotr Nowicki9926eaf2019-11-20 14:54:36 +01004413 if( psk_len == 0 )
4414 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4415 if( psk_len > MBEDTLS_PSK_MAX_LEN )
4416 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4417
Hanno Becker7390c712018-11-15 13:33:04 +00004418 if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
4419 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
4420 conf->psk_len = psk_len;
4421 memcpy( conf->psk, psk, conf->psk_len );
4422
4423 /* Check and set PSK Identity */
4424 ret = ssl_conf_set_psk_identity( conf, psk_identity, psk_identity_len );
4425 if( ret != 0 )
4426 ssl_conf_remove_psk( conf );
4427
4428 return( ret );
4429}
4430
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004431static void ssl_remove_psk( mbedtls_ssl_context *ssl )
4432{
4433#if defined(MBEDTLS_USE_PSA_CRYPTO)
Ronald Croncf56a0a2020-08-04 09:51:30 +02004434 if( ! mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004435 {
Ronald Croncf56a0a2020-08-04 09:51:30 +02004436 ssl->handshake->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004437 }
4438 else
4439#endif /* MBEDTLS_USE_PSA_CRYPTO */
4440 if( ssl->handshake->psk != NULL )
4441 {
4442 mbedtls_platform_zeroize( ssl->handshake->psk,
4443 ssl->handshake->psk_len );
4444 mbedtls_free( ssl->handshake->psk );
4445 ssl->handshake->psk_len = 0;
4446 }
4447}
4448
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01004449int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl,
4450 const unsigned char *psk, size_t psk_len )
4451{
4452 if( psk == NULL || ssl->handshake == NULL )
4453 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4454
4455 if( psk_len > MBEDTLS_PSK_MAX_LEN )
4456 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4457
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004458 ssl_remove_psk( ssl );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01004459
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02004460 if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02004461 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01004462
4463 ssl->handshake->psk_len = psk_len;
4464 memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len );
4465
4466 return( 0 );
4467}
4468
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004469#if defined(MBEDTLS_USE_PSA_CRYPTO)
4470int mbedtls_ssl_conf_psk_opaque( mbedtls_ssl_config *conf,
Ronald Croncf56a0a2020-08-04 09:51:30 +02004471 psa_key_id_t psk,
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004472 const unsigned char *psk_identity,
4473 size_t psk_identity_len )
4474{
Janos Follath865b3eb2019-12-16 11:46:15 +00004475 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker7390c712018-11-15 13:33:04 +00004476 /* Clear opaque/raw PSK + PSK Identity, if present. */
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004477 ssl_conf_remove_psk( conf );
4478
Hanno Becker7390c712018-11-15 13:33:04 +00004479 /* Check and set opaque PSK */
Ronald Croncf56a0a2020-08-04 09:51:30 +02004480 if( mbedtls_svc_key_id_is_null( psk ) )
Hanno Becker7390c712018-11-15 13:33:04 +00004481 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Ronald Croncf56a0a2020-08-04 09:51:30 +02004482 conf->psk_opaque = psk;
Hanno Becker7390c712018-11-15 13:33:04 +00004483
4484 /* Check and set PSK Identity */
4485 ret = ssl_conf_set_psk_identity( conf, psk_identity,
4486 psk_identity_len );
4487 if( ret != 0 )
4488 ssl_conf_remove_psk( conf );
4489
4490 return( ret );
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004491}
4492
4493int mbedtls_ssl_set_hs_psk_opaque( mbedtls_ssl_context *ssl,
Ronald Croncf56a0a2020-08-04 09:51:30 +02004494 psa_key_id_t psk )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004495{
Ronald Croncf56a0a2020-08-04 09:51:30 +02004496 if( ( mbedtls_svc_key_id_is_null( psk ) ) ||
Ronald Cronc26f8d42020-09-01 10:51:51 +02004497 ( ssl->handshake == NULL ) )
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004498 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4499
4500 ssl_remove_psk( ssl );
Ronald Croncf56a0a2020-08-04 09:51:30 +02004501 ssl->handshake->psk_opaque = psk;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01004502 return( 0 );
4503}
4504#endif /* MBEDTLS_USE_PSA_CRYPTO */
4505
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004506void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004507 int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *,
Paul Bakker6db455e2013-09-18 17:29:31 +02004508 size_t),
4509 void *p_psk )
4510{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004511 conf->f_psk = f_psk;
4512 conf->p_psk = p_psk;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02004513}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004514#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00004515
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02004516#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Hanno Becker470a8c42017-10-04 15:28:46 +01004517
4518#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004519int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00004520{
Janos Follath865b3eb2019-12-16 11:46:15 +00004521 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00004522
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01004523 if( ( ret = mbedtls_mpi_read_string( &conf->dhm_P, 16, dhm_P ) ) != 0 ||
4524 ( ret = mbedtls_mpi_read_string( &conf->dhm_G, 16, dhm_G ) ) != 0 )
4525 {
4526 mbedtls_mpi_free( &conf->dhm_P );
4527 mbedtls_mpi_free( &conf->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00004528 return( ret );
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01004529 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004530
4531 return( 0 );
4532}
Hanno Becker470a8c42017-10-04 15:28:46 +01004533#endif /* MBEDTLS_DEPRECATED_REMOVED */
Paul Bakker5121ce52009-01-03 21:22:43 +00004534
Hanno Beckera90658f2017-10-04 15:29:08 +01004535int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf,
4536 const unsigned char *dhm_P, size_t P_len,
4537 const unsigned char *dhm_G, size_t G_len )
4538{
Janos Follath865b3eb2019-12-16 11:46:15 +00004539 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Beckera90658f2017-10-04 15:29:08 +01004540
4541 if( ( ret = mbedtls_mpi_read_binary( &conf->dhm_P, dhm_P, P_len ) ) != 0 ||
4542 ( ret = mbedtls_mpi_read_binary( &conf->dhm_G, dhm_G, G_len ) ) != 0 )
4543 {
4544 mbedtls_mpi_free( &conf->dhm_P );
4545 mbedtls_mpi_free( &conf->dhm_G );
4546 return( ret );
4547 }
4548
4549 return( 0 );
4550}
Paul Bakker5121ce52009-01-03 21:22:43 +00004551
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004552int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx )
Paul Bakker1b57b062011-01-06 15:48:19 +00004553{
Janos Follath865b3eb2019-12-16 11:46:15 +00004554 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker1b57b062011-01-06 15:48:19 +00004555
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01004556 if( ( ret = mbedtls_mpi_copy( &conf->dhm_P, &dhm_ctx->P ) ) != 0 ||
4557 ( ret = mbedtls_mpi_copy( &conf->dhm_G, &dhm_ctx->G ) ) != 0 )
4558 {
4559 mbedtls_mpi_free( &conf->dhm_P );
4560 mbedtls_mpi_free( &conf->dhm_G );
Paul Bakker1b57b062011-01-06 15:48:19 +00004561 return( ret );
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01004562 }
Paul Bakker1b57b062011-01-06 15:48:19 +00004563
4564 return( 0 );
4565}
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02004566#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00004567
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02004568#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
4569/*
4570 * Set the minimum length for Diffie-Hellman parameters
4571 */
4572void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf,
4573 unsigned int bitlen )
4574{
4575 conf->dhm_min_bitlen = bitlen;
4576}
4577#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */
4578
Gilles Peskineeccd8882020-03-10 12:19:08 +01004579#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02004580/*
4581 * Set allowed/preferred hashes for handshake signatures
4582 */
4583void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf,
4584 const int *hashes )
4585{
4586 conf->sig_hashes = hashes;
4587}
Gilles Peskineeccd8882020-03-10 12:19:08 +01004588#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02004589
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02004590#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01004591/*
4592 * Set the allowed elliptic curves
4593 */
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004594void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004595 const mbedtls_ecp_group_id *curve_list )
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01004596{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004597 conf->curve_list = curve_list;
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01004598}
Hanno Becker947194e2017-04-07 13:25:49 +01004599#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01004600
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01004601#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004602int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00004603{
Hanno Becker947194e2017-04-07 13:25:49 +01004604 /* Initialize to suppress unnecessary compiler warning */
4605 size_t hostname_len = 0;
4606
4607 /* Check if new hostname is valid before
4608 * making any change to current one */
Hanno Becker947194e2017-04-07 13:25:49 +01004609 if( hostname != NULL )
4610 {
4611 hostname_len = strlen( hostname );
4612
4613 if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN )
4614 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4615 }
4616
4617 /* Now it's clear that we will overwrite the old hostname,
4618 * so we can free it safely */
4619
4620 if( ssl->hostname != NULL )
4621 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05004622 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
Hanno Becker947194e2017-04-07 13:25:49 +01004623 mbedtls_free( ssl->hostname );
4624 }
4625
4626 /* Passing NULL as hostname shall clear the old one */
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +01004627
Paul Bakker5121ce52009-01-03 21:22:43 +00004628 if( hostname == NULL )
Hanno Becker947194e2017-04-07 13:25:49 +01004629 {
4630 ssl->hostname = NULL;
4631 }
4632 else
4633 {
4634 ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 );
Hanno Becker947194e2017-04-07 13:25:49 +01004635 if( ssl->hostname == NULL )
4636 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02004637
Hanno Becker947194e2017-04-07 13:25:49 +01004638 memcpy( ssl->hostname, hostname, hostname_len );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02004639
Hanno Becker947194e2017-04-07 13:25:49 +01004640 ssl->hostname[hostname_len] = '\0';
4641 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004642
4643 return( 0 );
4644}
Hanno Becker1a9a51c2017-04-07 13:02:16 +01004645#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00004646
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01004647#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004648void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004649 int (*f_sni)(void *, mbedtls_ssl_context *,
Paul Bakker5701cdc2012-09-27 21:49:42 +00004650 const unsigned char *, size_t),
4651 void *p_sni )
4652{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004653 conf->f_sni = f_sni;
4654 conf->p_sni = p_sni;
Paul Bakker5701cdc2012-09-27 21:49:42 +00004655}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004656#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00004657
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004658#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004659int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos )
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004660{
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02004661 size_t cur_len, tot_len;
4662 const char **p;
4663
4664 /*
Brian J Murray1903fb32016-11-06 04:45:15 -08004665 * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings
4666 * MUST NOT be truncated."
4667 * We check lengths now rather than later.
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02004668 */
4669 tot_len = 0;
4670 for( p = protos; *p != NULL; p++ )
4671 {
4672 cur_len = strlen( *p );
4673 tot_len += cur_len;
4674
Ronald Cron8216dd32020-04-23 16:41:44 +02004675 if( ( cur_len == 0 ) ||
4676 ( cur_len > MBEDTLS_SSL_MAX_ALPN_NAME_LEN ) ||
4677 ( tot_len > MBEDTLS_SSL_MAX_ALPN_LIST_LEN ) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004678 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02004679 }
4680
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004681 conf->alpn_list = protos;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02004682
4683 return( 0 );
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004684}
4685
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004686const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004687{
Paul Bakkerd8bb8262014-06-17 14:06:49 +02004688 return( ssl->alpn_chosen );
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004689}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004690#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02004691
Johan Pascalb62bb512015-12-03 21:56:45 +01004692#if defined(MBEDTLS_SSL_DTLS_SRTP)
Ron Eldoref72faf2018-07-12 11:54:20 +03004693void mbedtls_ssl_conf_srtp_mki_value_supported( mbedtls_ssl_config *conf,
4694 int support_mki_value )
Ron Eldor591f1622018-01-22 12:30:04 +02004695{
4696 conf->dtls_srtp_mki_support = support_mki_value;
4697}
4698
Ron Eldoref72faf2018-07-12 11:54:20 +03004699int mbedtls_ssl_dtls_srtp_set_mki_value( mbedtls_ssl_context *ssl,
4700 unsigned char *mki_value,
Johan Pascalf6417ec2020-09-22 15:15:19 +02004701 uint16_t mki_len )
Ron Eldor591f1622018-01-22 12:30:04 +02004702{
Johan Pascal5ef72d22020-10-28 17:05:47 +01004703 if( mki_len > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH )
Ron Eldora9788042018-12-05 11:04:31 +02004704 {
Johan Pascald576fdb2020-09-22 10:39:53 +02004705 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Ron Eldora9788042018-12-05 11:04:31 +02004706 }
Ron Eldor591f1622018-01-22 12:30:04 +02004707
4708 if( ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED )
Ron Eldora9788042018-12-05 11:04:31 +02004709 {
Johan Pascald576fdb2020-09-22 10:39:53 +02004710 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Ron Eldora9788042018-12-05 11:04:31 +02004711 }
Ron Eldor591f1622018-01-22 12:30:04 +02004712
4713 memcpy( ssl->dtls_srtp_info.mki_value, mki_value, mki_len );
4714 ssl->dtls_srtp_info.mki_len = mki_len;
Ron Eldora9788042018-12-05 11:04:31 +02004715 return( 0 );
Ron Eldor591f1622018-01-22 12:30:04 +02004716}
4717
Ron Eldoref72faf2018-07-12 11:54:20 +03004718int mbedtls_ssl_conf_dtls_srtp_protection_profiles( mbedtls_ssl_config *conf,
Johan Pascal253d0262020-09-22 13:04:45 +02004719 const mbedtls_ssl_srtp_profile *profiles )
Johan Pascalb62bb512015-12-03 21:56:45 +01004720{
Johan Pascal253d0262020-09-22 13:04:45 +02004721 const mbedtls_ssl_srtp_profile *p;
4722 size_t list_size = 0;
Johan Pascalb62bb512015-12-03 21:56:45 +01004723
Johan Pascal253d0262020-09-22 13:04:45 +02004724 /* check the profiles list: all entry must be valid,
4725 * its size cannot be more than the total number of supported profiles, currently 4 */
Johan Pascald387aa02020-09-23 18:47:56 +02004726 for( p = profiles; *p != MBEDTLS_TLS_SRTP_UNSET &&
4727 list_size <= MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH;
4728 p++ )
Johan Pascald576fdb2020-09-22 10:39:53 +02004729 {
Johan Pascal5ef72d22020-10-28 17:05:47 +01004730 if( mbedtls_ssl_check_srtp_profile_value( *p ) != MBEDTLS_TLS_SRTP_UNSET )
Johan Pascald576fdb2020-09-22 10:39:53 +02004731 {
Johan Pascal76fdf1d2020-10-22 23:31:00 +02004732 list_size++;
4733 }
4734 else
4735 {
4736 /* unsupported value, stop parsing and set the size to an error value */
4737 list_size = MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH + 1;
Johan Pascalb62bb512015-12-03 21:56:45 +01004738 }
4739 }
4740
Johan Pascal5ef72d22020-10-28 17:05:47 +01004741 if( list_size > MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH )
Johan Pascald387aa02020-09-23 18:47:56 +02004742 {
Johan Pascal253d0262020-09-22 13:04:45 +02004743 conf->dtls_srtp_profile_list = NULL;
4744 conf->dtls_srtp_profile_list_len = 0;
4745 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4746 }
4747
Johan Pascal9bc97ca2020-09-21 23:44:45 +02004748 conf->dtls_srtp_profile_list = profiles;
Johan Pascal253d0262020-09-22 13:04:45 +02004749 conf->dtls_srtp_profile_list_len = list_size;
Johan Pascalb62bb512015-12-03 21:56:45 +01004750
4751 return( 0 );
4752}
4753
Johan Pascal5ef72d22020-10-28 17:05:47 +01004754void mbedtls_ssl_get_dtls_srtp_negotiation_result( const mbedtls_ssl_context *ssl,
4755 mbedtls_dtls_srtp_info *dtls_srtp_info )
Johan Pascalb62bb512015-12-03 21:56:45 +01004756{
Johan Pascal2258a4f2020-10-28 13:53:09 +01004757 dtls_srtp_info->chosen_dtls_srtp_profile = ssl->dtls_srtp_info.chosen_dtls_srtp_profile;
4758 /* do not copy the mki value if there is no chosen profile */
Johan Pascal5ef72d22020-10-28 17:05:47 +01004759 if( dtls_srtp_info->chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET )
Johan Pascal0dbcd1d2020-10-28 11:03:07 +01004760 {
Johan Pascal2258a4f2020-10-28 13:53:09 +01004761 dtls_srtp_info->mki_len = 0;
Johan Pascal0dbcd1d2020-10-28 11:03:07 +01004762 }
Johan Pascal2258a4f2020-10-28 13:53:09 +01004763 else
4764 {
4765 dtls_srtp_info->mki_len = ssl->dtls_srtp_info.mki_len;
Johan Pascal5ef72d22020-10-28 17:05:47 +01004766 memcpy( dtls_srtp_info->mki_value, ssl->dtls_srtp_info.mki_value,
4767 ssl->dtls_srtp_info.mki_len );
Johan Pascal2258a4f2020-10-28 13:53:09 +01004768 }
Johan Pascalb62bb512015-12-03 21:56:45 +01004769}
Johan Pascalb62bb512015-12-03 21:56:45 +01004770#endif /* MBEDTLS_SSL_DTLS_SRTP */
4771
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02004772void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor )
Paul Bakker490ecc82011-10-06 13:04:09 +00004773{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004774 conf->max_major_ver = major;
4775 conf->max_minor_ver = minor;
Paul Bakker490ecc82011-10-06 13:04:09 +00004776}
4777
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02004778void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor )
Paul Bakker1d29fb52012-09-28 13:28:45 +00004779{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004780 conf->min_major_ver = major;
4781 conf->min_minor_ver = minor;
Paul Bakker1d29fb52012-09-28 13:28:45 +00004782}
4783
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004784#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004785void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback )
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02004786{
Manuel Pégourié-Gonnard684b0592015-05-06 09:27:31 +01004787 conf->fallback = fallback;
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02004788}
4789#endif
4790
Janos Follath088ce432017-04-10 12:42:31 +01004791#if defined(MBEDTLS_SSL_SRV_C)
4792void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf,
4793 char cert_req_ca_list )
4794{
4795 conf->cert_req_ca_list = cert_req_ca_list;
4796}
4797#endif
4798
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004799#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004800void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01004801{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004802 conf->encrypt_then_mac = etm;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01004803}
4804#endif
4805
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004806#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004807void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02004808{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004809 conf->extended_ms = ems;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02004810}
4811#endif
4812
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02004813#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004814void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 )
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01004815{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004816 conf->arc4_disabled = arc4;
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01004817}
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02004818#endif
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01004819
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004820#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004821int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02004822{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004823 if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ||
Angus Grattond8213d02016-05-25 20:56:48 +10004824 ssl_mfl_code_to_length( mfl_code ) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02004825 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004826 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02004827 }
4828
Manuel Pégourié-Gonnard6bf89d62015-05-05 17:01:57 +01004829 conf->mfl_code = mfl_code;
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02004830
4831 return( 0 );
4832}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004833#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02004834
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004835#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02004836void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate )
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02004837{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004838 conf->trunc_hmac = truncate;
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02004839}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004840#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02004841
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004842#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004843void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split )
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01004844{
Manuel Pégourié-Gonnard17eab2b2015-05-05 16:34:53 +01004845 conf->cbc_record_splitting = split;
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01004846}
4847#endif
4848
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004849void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy )
Paul Bakker48916f92012-09-16 19:57:18 +00004850{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004851 conf->allow_legacy_renegotiation = allow_legacy;
Paul Bakker48916f92012-09-16 19:57:18 +00004852}
4853
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004854#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004855void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01004856{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004857 conf->disable_renegotiation = renegotiation;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01004858}
4859
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004860void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records )
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02004861{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004862 conf->renego_max_records = max_records;
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02004863}
4864
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02004865void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01004866 const unsigned char period[8] )
4867{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02004868 memcpy( conf->renego_period, period, 8 );
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01004869}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004870#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker5121ce52009-01-03 21:22:43 +00004871
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004872#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02004873#if defined(MBEDTLS_SSL_CLI_C)
4874void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets )
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02004875{
Manuel Pégourié-Gonnard2b494452015-05-06 10:05:11 +01004876 conf->session_tickets = use_tickets;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02004877}
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02004878#endif
Paul Bakker606b4ba2013-08-14 16:52:14 +02004879
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02004880#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02004881void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,
4882 mbedtls_ssl_ticket_write_t *f_ticket_write,
4883 mbedtls_ssl_ticket_parse_t *f_ticket_parse,
4884 void *p_ticket )
Paul Bakker606b4ba2013-08-14 16:52:14 +02004885{
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02004886 conf->f_ticket_write = f_ticket_write;
4887 conf->f_ticket_parse = f_ticket_parse;
4888 conf->p_ticket = p_ticket;
Paul Bakker606b4ba2013-08-14 16:52:14 +02004889}
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02004890#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004891#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02004892
Robert Cragie4feb7ae2015-10-02 13:33:37 +01004893#if defined(MBEDTLS_SSL_EXPORT_KEYS)
4894void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf,
4895 mbedtls_ssl_export_keys_t *f_export_keys,
4896 void *p_export_keys )
4897{
4898 conf->f_export_keys = f_export_keys;
4899 conf->p_export_keys = p_export_keys;
4900}
Ron Eldorf5cc10d2019-05-07 18:33:40 +03004901
4902void mbedtls_ssl_conf_export_keys_ext_cb( mbedtls_ssl_config *conf,
4903 mbedtls_ssl_export_keys_ext_t *f_export_keys_ext,
4904 void *p_export_keys )
4905{
4906 conf->f_export_keys_ext = f_export_keys_ext;
4907 conf->p_export_keys = p_export_keys;
4908}
Robert Cragie4feb7ae2015-10-02 13:33:37 +01004909#endif
4910
Gilles Peskineb74a1c72018-04-24 13:09:22 +02004911#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine8bf79f62018-01-05 21:11:53 +01004912void mbedtls_ssl_conf_async_private_cb(
4913 mbedtls_ssl_config *conf,
4914 mbedtls_ssl_async_sign_t *f_async_sign,
4915 mbedtls_ssl_async_decrypt_t *f_async_decrypt,
4916 mbedtls_ssl_async_resume_t *f_async_resume,
4917 mbedtls_ssl_async_cancel_t *f_async_cancel,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004918 void *async_config_data )
Gilles Peskine8bf79f62018-01-05 21:11:53 +01004919{
4920 conf->f_async_sign_start = f_async_sign;
4921 conf->f_async_decrypt_start = f_async_decrypt;
4922 conf->f_async_resume = f_async_resume;
4923 conf->f_async_cancel = f_async_cancel;
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004924 conf->p_async_config_data = async_config_data;
4925}
4926
Gilles Peskine8f97af72018-04-26 11:46:10 +02004927void *mbedtls_ssl_conf_get_async_config_data( const mbedtls_ssl_config *conf )
4928{
4929 return( conf->p_async_config_data );
4930}
4931
Gilles Peskine1febfef2018-04-30 11:54:39 +02004932void *mbedtls_ssl_get_async_operation_data( const mbedtls_ssl_context *ssl )
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004933{
4934 if( ssl->handshake == NULL )
4935 return( NULL );
4936 else
4937 return( ssl->handshake->user_async_ctx );
4938}
4939
Gilles Peskine1febfef2018-04-30 11:54:39 +02004940void mbedtls_ssl_set_async_operation_data( mbedtls_ssl_context *ssl,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004941 void *ctx )
4942{
4943 if( ssl->handshake != NULL )
4944 ssl->handshake->user_async_ctx = ctx;
Gilles Peskine8bf79f62018-01-05 21:11:53 +01004945}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02004946#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine8bf79f62018-01-05 21:11:53 +01004947
Paul Bakker5121ce52009-01-03 21:22:43 +00004948/*
4949 * SSL get accessors
4950 */
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02004951uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004952{
Manuel Pégourié-Gonnarde89163c2015-01-23 14:30:57 +00004953 if( ssl->session != NULL )
4954 return( ssl->session->verify_result );
4955
4956 if( ssl->session_negotiate != NULL )
4957 return( ssl->session_negotiate->verify_result );
4958
Manuel Pégourié-Gonnard6ab9b002015-05-14 11:25:04 +02004959 return( 0xFFFFFFFF );
Paul Bakker5121ce52009-01-03 21:22:43 +00004960}
4961
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004962const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00004963{
Paul Bakker926c8e42013-03-06 10:23:34 +01004964 if( ssl == NULL || ssl->session == NULL )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02004965 return( NULL );
Paul Bakker926c8e42013-03-06 10:23:34 +01004966
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004967 return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00004968}
4969
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004970const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl )
Paul Bakker43ca69c2011-01-15 17:35:19 +00004971{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004972#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02004973 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01004974 {
4975 switch( ssl->minor_ver )
4976 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004977 case MBEDTLS_SSL_MINOR_VERSION_2:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01004978 return( "DTLSv1.0" );
4979
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004980 case MBEDTLS_SSL_MINOR_VERSION_3:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01004981 return( "DTLSv1.2" );
4982
4983 default:
4984 return( "unknown (DTLS)" );
4985 }
4986 }
4987#endif
4988
Paul Bakker43ca69c2011-01-15 17:35:19 +00004989 switch( ssl->minor_ver )
4990 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004991 case MBEDTLS_SSL_MINOR_VERSION_0:
Paul Bakker43ca69c2011-01-15 17:35:19 +00004992 return( "SSLv3.0" );
4993
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004994 case MBEDTLS_SSL_MINOR_VERSION_1:
Paul Bakker43ca69c2011-01-15 17:35:19 +00004995 return( "TLSv1.0" );
4996
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004997 case MBEDTLS_SSL_MINOR_VERSION_2:
Paul Bakker43ca69c2011-01-15 17:35:19 +00004998 return( "TLSv1.1" );
4999
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005000 case MBEDTLS_SSL_MINOR_VERSION_3:
Paul Bakker1ef83d62012-04-11 12:09:53 +00005001 return( "TLSv1.2" );
5002
Paul Bakker43ca69c2011-01-15 17:35:19 +00005003 default:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01005004 return( "unknown" );
Paul Bakker43ca69c2011-01-15 17:35:19 +00005005 }
Paul Bakker43ca69c2011-01-15 17:35:19 +00005006}
5007
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005008#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Andrzej Kurek90c6e842020-04-03 05:25:29 -04005009size_t mbedtls_ssl_get_input_max_frag_len( const mbedtls_ssl_context *ssl )
5010{
5011 size_t max_len = MBEDTLS_SSL_MAX_CONTENT_LEN;
5012 size_t read_mfl;
5013
5014 /* Use the configured MFL for the client if we're past SERVER_HELLO_DONE */
5015 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
5016 ssl->state >= MBEDTLS_SSL_SERVER_HELLO_DONE )
5017 {
5018 return ssl_mfl_code_to_length( ssl->conf->mfl_code );
5019 }
5020
5021 /* Check if a smaller max length was negotiated */
5022 if( ssl->session_out != NULL )
5023 {
5024 read_mfl = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
5025 if( read_mfl < max_len )
5026 {
5027 max_len = read_mfl;
5028 }
5029 }
5030
5031 // During a handshake, use the value being negotiated
5032 if( ssl->session_negotiate != NULL )
5033 {
5034 read_mfl = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
5035 if( read_mfl < max_len )
5036 {
5037 max_len = read_mfl;
5038 }
5039 }
5040
5041 return( max_len );
5042}
5043
5044size_t mbedtls_ssl_get_output_max_frag_len( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005045{
5046 size_t max_len;
5047
5048 /*
5049 * Assume mfl_code is correct since it was checked when set
5050 */
Angus Grattond8213d02016-05-25 20:56:48 +10005051 max_len = ssl_mfl_code_to_length( ssl->conf->mfl_code );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005052
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02005053 /* Check if a smaller max length was negotiated */
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005054 if( ssl->session_out != NULL &&
Angus Grattond8213d02016-05-25 20:56:48 +10005055 ssl_mfl_code_to_length( ssl->session_out->mfl_code ) < max_len )
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005056 {
Angus Grattond8213d02016-05-25 20:56:48 +10005057 max_len = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005058 }
5059
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02005060 /* During a handshake, use the value being negotiated */
5061 if( ssl->session_negotiate != NULL &&
5062 ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code ) < max_len )
5063 {
5064 max_len = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
5065 }
5066
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005067 return( max_len );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005068}
Andrzej Kurek90c6e842020-04-03 05:25:29 -04005069
5070#if !defined(MBEDTLS_DEPRECATED_REMOVED)
5071size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl )
5072{
5073 return mbedtls_ssl_get_output_max_frag_len( ssl );
5074}
5075#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02005076#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
5077
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02005078#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker89490712020-02-05 10:50:12 +00005079size_t mbedtls_ssl_get_current_mtu( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02005080{
Andrzej Kurekef43ce62018-10-09 08:24:12 -04005081 /* Return unlimited mtu for client hello messages to avoid fragmentation. */
5082 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
5083 ( ssl->state == MBEDTLS_SSL_CLIENT_HELLO ||
5084 ssl->state == MBEDTLS_SSL_SERVER_HELLO ) )
5085 return ( 0 );
5086
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02005087 if( ssl->handshake == NULL || ssl->handshake->mtu == 0 )
5088 return( ssl->mtu );
5089
5090 if( ssl->mtu == 0 )
5091 return( ssl->handshake->mtu );
5092
5093 return( ssl->mtu < ssl->handshake->mtu ?
5094 ssl->mtu : ssl->handshake->mtu );
5095}
5096#endif /* MBEDTLS_SSL_PROTO_DTLS */
5097
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005098int mbedtls_ssl_get_max_out_record_payload( const mbedtls_ssl_context *ssl )
5099{
5100 size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
5101
Manuel Pégourié-Gonnard000281e2018-08-21 11:20:58 +02005102#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
5103 !defined(MBEDTLS_SSL_PROTO_DTLS)
5104 (void) ssl;
5105#endif
5106
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005107#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Andrzej Kurek90c6e842020-04-03 05:25:29 -04005108 const size_t mfl = mbedtls_ssl_get_output_max_frag_len( ssl );
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005109
5110 if( max_len > mfl )
5111 max_len = mfl;
5112#endif
5113
5114#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker89490712020-02-05 10:50:12 +00005115 if( mbedtls_ssl_get_current_mtu( ssl ) != 0 )
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005116 {
Hanno Becker89490712020-02-05 10:50:12 +00005117 const size_t mtu = mbedtls_ssl_get_current_mtu( ssl );
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005118 const int ret = mbedtls_ssl_get_record_expansion( ssl );
5119 const size_t overhead = (size_t) ret;
5120
5121 if( ret < 0 )
5122 return( ret );
5123
5124 if( mtu <= overhead )
5125 {
5126 MBEDTLS_SSL_DEBUG_MSG( 1, ( "MTU too low for record expansion" ) );
5127 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
5128 }
5129
5130 if( max_len > mtu - overhead )
5131 max_len = mtu - overhead;
5132 }
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02005133#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005134
Hanno Becker0defedb2018-08-10 12:35:02 +01005135#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
5136 !defined(MBEDTLS_SSL_PROTO_DTLS)
5137 ((void) ssl);
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02005138#endif
5139
5140 return( (int) max_len );
5141}
5142
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005143#if defined(MBEDTLS_X509_CRT_PARSE_C)
5144const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl )
Paul Bakkerb0550d92012-10-30 07:51:03 +00005145{
5146 if( ssl == NULL || ssl->session == NULL )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02005147 return( NULL );
Paul Bakkerb0550d92012-10-30 07:51:03 +00005148
Hanno Beckere6824572019-02-07 13:18:46 +00005149#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Paul Bakkerd8bb8262014-06-17 14:06:49 +02005150 return( ssl->session->peer_cert );
Hanno Beckere6824572019-02-07 13:18:46 +00005151#else
5152 return( NULL );
5153#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakkerb0550d92012-10-30 07:51:03 +00005154}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005155#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00005156
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005157#if defined(MBEDTLS_SSL_CLI_C)
Hanno Beckerf852b1c2019-02-05 11:42:30 +00005158int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl,
5159 mbedtls_ssl_session *dst )
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005160{
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005161 if( ssl == NULL ||
5162 dst == NULL ||
5163 ssl->session == NULL ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005164 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005165 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005166 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005167 }
5168
Hanno Becker52055ae2019-02-06 14:30:46 +00005169 return( mbedtls_ssl_session_copy( dst, ssl->session ) );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005170}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005171#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02005172
Manuel Pégourié-Gonnardb5e4e0a2019-05-20 11:12:28 +02005173const mbedtls_ssl_session *mbedtls_ssl_get_session_pointer( const mbedtls_ssl_context *ssl )
5174{
5175 if( ssl == NULL )
5176 return( NULL );
5177
5178 return( ssl->session );
5179}
5180
Paul Bakker5121ce52009-01-03 21:22:43 +00005181/*
Hanno Beckera835da52019-05-16 12:39:07 +01005182 * Define ticket header determining Mbed TLS version
5183 * and structure of the ticket.
5184 */
5185
Hanno Becker94ef3b32019-05-16 12:50:45 +01005186/*
Hanno Becker50b59662019-05-28 14:30:45 +01005187 * Define bitflag determining compile-time settings influencing
5188 * structure of serialized SSL sessions.
Hanno Becker94ef3b32019-05-16 12:50:45 +01005189 */
5190
Hanno Becker50b59662019-05-28 14:30:45 +01005191#if defined(MBEDTLS_HAVE_TIME)
Hanno Becker3e088662019-05-29 11:10:18 +01005192#define SSL_SERIALIZED_SESSION_CONFIG_TIME 1
Hanno Becker50b59662019-05-28 14:30:45 +01005193#else
Hanno Becker3e088662019-05-29 11:10:18 +01005194#define SSL_SERIALIZED_SESSION_CONFIG_TIME 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005195#endif /* MBEDTLS_HAVE_TIME */
5196
5197#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker3e088662019-05-29 11:10:18 +01005198#define SSL_SERIALIZED_SESSION_CONFIG_CRT 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01005199#else
Hanno Becker3e088662019-05-29 11:10:18 +01005200#define SSL_SERIALIZED_SESSION_CONFIG_CRT 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005201#endif /* MBEDTLS_X509_CRT_PARSE_C */
5202
5203#if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_SESSION_TICKETS)
Hanno Becker3e088662019-05-29 11:10:18 +01005204#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01005205#else
Hanno Becker3e088662019-05-29 11:10:18 +01005206#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005207#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_SESSION_TICKETS */
5208
5209#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Hanno Becker3e088662019-05-29 11:10:18 +01005210#define SSL_SERIALIZED_SESSION_CONFIG_MFL 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01005211#else
Hanno Becker3e088662019-05-29 11:10:18 +01005212#define SSL_SERIALIZED_SESSION_CONFIG_MFL 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005213#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
5214
5215#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Hanno Becker3e088662019-05-29 11:10:18 +01005216#define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01005217#else
Hanno Becker3e088662019-05-29 11:10:18 +01005218#define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005219#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
5220
5221#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker3e088662019-05-29 11:10:18 +01005222#define SSL_SERIALIZED_SESSION_CONFIG_ETM 1
Hanno Becker94ef3b32019-05-16 12:50:45 +01005223#else
Hanno Becker3e088662019-05-29 11:10:18 +01005224#define SSL_SERIALIZED_SESSION_CONFIG_ETM 0
Hanno Becker94ef3b32019-05-16 12:50:45 +01005225#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
5226
Hanno Becker94ef3b32019-05-16 12:50:45 +01005227#if defined(MBEDTLS_SSL_SESSION_TICKETS)
5228#define SSL_SERIALIZED_SESSION_CONFIG_TICKET 1
5229#else
5230#define SSL_SERIALIZED_SESSION_CONFIG_TICKET 0
5231#endif /* MBEDTLS_SSL_SESSION_TICKETS */
5232
Hanno Becker3e088662019-05-29 11:10:18 +01005233#define SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT 0
5234#define SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT 1
5235#define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT 2
5236#define SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT 3
5237#define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC_BIT 4
5238#define SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT 5
5239#define SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT 6
Hanno Becker3e088662019-05-29 11:10:18 +01005240
Hanno Becker50b59662019-05-28 14:30:45 +01005241#define SSL_SERIALIZED_SESSION_CONFIG_BITFLAG \
Hanno Becker3e088662019-05-29 11:10:18 +01005242 ( (uint16_t) ( \
5243 ( SSL_SERIALIZED_SESSION_CONFIG_TIME << SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT ) | \
5244 ( SSL_SERIALIZED_SESSION_CONFIG_CRT << SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT ) | \
5245 ( SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET << SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT ) | \
5246 ( SSL_SERIALIZED_SESSION_CONFIG_MFL << SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT ) | \
5247 ( SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC << SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC_BIT ) | \
5248 ( SSL_SERIALIZED_SESSION_CONFIG_ETM << SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT ) | \
Hanno Beckerbe34e8e2019-06-04 09:43:16 +01005249 ( SSL_SERIALIZED_SESSION_CONFIG_TICKET << SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT ) ) )
Hanno Becker94ef3b32019-05-16 12:50:45 +01005250
Hanno Beckerf8787072019-05-16 12:41:07 +01005251static unsigned char ssl_serialized_session_header[] = {
Hanno Becker94ef3b32019-05-16 12:50:45 +01005252 MBEDTLS_VERSION_MAJOR,
5253 MBEDTLS_VERSION_MINOR,
5254 MBEDTLS_VERSION_PATCH,
Hanno Becker50b59662019-05-28 14:30:45 +01005255 ( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG >> 8 ) & 0xFF,
5256 ( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG >> 0 ) & 0xFF,
Hanno Beckerf8787072019-05-16 12:41:07 +01005257};
Hanno Beckera835da52019-05-16 12:39:07 +01005258
5259/*
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005260 * Serialize a session in the following format:
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005261 * (in the presentation language of TLS, RFC 8446 section 3)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005262 *
Hanno Becker50b59662019-05-28 14:30:45 +01005263 * opaque mbedtls_version[3]; // major, minor, patch
5264 * opaque session_format[2]; // version-specific 16-bit field determining
5265 * // the format of the remaining
5266 * // serialized data.
Hanno Beckerdc28b6c2019-05-29 11:08:00 +01005267 *
5268 * Note: When updating the format, remember to keep
5269 * these version+format bytes.
5270 *
Hanno Beckerbe34e8e2019-06-04 09:43:16 +01005271 * // In this version, `session_format` determines
5272 * // the setting of those compile-time
5273 * // configuration options which influence
Hanno Becker50b59662019-05-28 14:30:45 +01005274 * // the structure of mbedtls_ssl_session.
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005275 * uint64 start_time;
Hanno Becker50b59662019-05-28 14:30:45 +01005276 * uint8 ciphersuite[2]; // defined by the standard
5277 * uint8 compression; // 0 or 1
5278 * uint8 session_id_len; // at most 32
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005279 * opaque session_id[32];
Hanno Becker50b59662019-05-28 14:30:45 +01005280 * opaque master[48]; // fixed length in the standard
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005281 * uint32 verify_result;
Hanno Becker50b59662019-05-28 14:30:45 +01005282 * opaque peer_cert<0..2^24-1>; // length 0 means no peer cert
5283 * opaque ticket<0..2^24-1>; // length 0 means no ticket
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005284 * uint32 ticket_lifetime;
Hanno Becker50b59662019-05-28 14:30:45 +01005285 * uint8 mfl_code; // up to 255 according to standard
5286 * uint8 trunc_hmac; // 0 or 1
5287 * uint8 encrypt_then_mac; // 0 or 1
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005288 *
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005289 * The order is the same as in the definition of the structure, except
5290 * verify_result is put before peer_cert so that all mandatory fields come
5291 * together in one block.
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005292 */
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005293static int ssl_session_save( const mbedtls_ssl_session *session,
5294 unsigned char omit_header,
5295 unsigned char *buf,
5296 size_t buf_len,
5297 size_t *olen )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005298{
5299 unsigned char *p = buf;
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005300 size_t used = 0;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005301#if defined(MBEDTLS_HAVE_TIME)
5302 uint64_t start;
5303#endif
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005304#if defined(MBEDTLS_X509_CRT_PARSE_C)
5305#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5306 size_t cert_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005307#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5308#endif /* MBEDTLS_X509_CRT_PARSE_C */
5309
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005310
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005311 if( !omit_header )
Hanno Beckera835da52019-05-16 12:39:07 +01005312 {
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005313 /*
5314 * Add version identifier
5315 */
5316
5317 used += sizeof( ssl_serialized_session_header );
5318
5319 if( used <= buf_len )
5320 {
5321 memcpy( p, ssl_serialized_session_header,
5322 sizeof( ssl_serialized_session_header ) );
5323 p += sizeof( ssl_serialized_session_header );
5324 }
Hanno Beckera835da52019-05-16 12:39:07 +01005325 }
5326
5327 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005328 * Time
5329 */
5330#if defined(MBEDTLS_HAVE_TIME)
5331 used += 8;
5332
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005333 if( used <= buf_len )
5334 {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005335 start = (uint64_t) session->start;
5336
5337 *p++ = (unsigned char)( ( start >> 56 ) & 0xFF );
5338 *p++ = (unsigned char)( ( start >> 48 ) & 0xFF );
5339 *p++ = (unsigned char)( ( start >> 40 ) & 0xFF );
5340 *p++ = (unsigned char)( ( start >> 32 ) & 0xFF );
5341 *p++ = (unsigned char)( ( start >> 24 ) & 0xFF );
5342 *p++ = (unsigned char)( ( start >> 16 ) & 0xFF );
5343 *p++ = (unsigned char)( ( start >> 8 ) & 0xFF );
5344 *p++ = (unsigned char)( ( start ) & 0xFF );
5345 }
5346#endif /* MBEDTLS_HAVE_TIME */
5347
5348 /*
5349 * Basic mandatory fields
5350 */
5351 used += 2 /* ciphersuite */
5352 + 1 /* compression */
5353 + 1 /* id_len */
5354 + sizeof( session->id )
5355 + sizeof( session->master )
5356 + 4; /* verify_result */
5357
5358 if( used <= buf_len )
5359 {
5360 *p++ = (unsigned char)( ( session->ciphersuite >> 8 ) & 0xFF );
5361 *p++ = (unsigned char)( ( session->ciphersuite ) & 0xFF );
5362
5363 *p++ = (unsigned char)( session->compression & 0xFF );
5364
5365 *p++ = (unsigned char)( session->id_len & 0xFF );
5366 memcpy( p, session->id, 32 );
5367 p += 32;
5368
5369 memcpy( p, session->master, 48 );
5370 p += 48;
5371
5372 *p++ = (unsigned char)( ( session->verify_result >> 24 ) & 0xFF );
5373 *p++ = (unsigned char)( ( session->verify_result >> 16 ) & 0xFF );
5374 *p++ = (unsigned char)( ( session->verify_result >> 8 ) & 0xFF );
5375 *p++ = (unsigned char)( ( session->verify_result ) & 0xFF );
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005376 }
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005377
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005378 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005379 * Peer's end-entity certificate
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005380 */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005381#if defined(MBEDTLS_X509_CRT_PARSE_C)
5382#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5383 if( session->peer_cert == NULL )
5384 cert_len = 0;
5385 else
5386 cert_len = session->peer_cert->raw.len;
5387
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005388 used += 3 + cert_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005389
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005390 if( used <= buf_len )
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005391 {
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005392 *p++ = (unsigned char)( ( cert_len >> 16 ) & 0xFF );
5393 *p++ = (unsigned char)( ( cert_len >> 8 ) & 0xFF );
5394 *p++ = (unsigned char)( ( cert_len ) & 0xFF );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005395
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005396 if( session->peer_cert != NULL )
5397 {
5398 memcpy( p, session->peer_cert->raw.p, cert_len );
5399 p += cert_len;
5400 }
5401 }
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005402#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005403 if( session->peer_cert_digest != NULL )
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005404 {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005405 used += 1 /* type */ + 1 /* length */ + session->peer_cert_digest_len;
5406 if( used <= buf_len )
5407 {
5408 *p++ = (unsigned char) session->peer_cert_digest_type;
5409 *p++ = (unsigned char) session->peer_cert_digest_len;
5410 memcpy( p, session->peer_cert_digest,
5411 session->peer_cert_digest_len );
5412 p += session->peer_cert_digest_len;
5413 }
5414 }
5415 else
5416 {
5417 used += 2;
5418 if( used <= buf_len )
5419 {
5420 *p++ = (unsigned char) MBEDTLS_MD_NONE;
5421 *p++ = 0;
5422 }
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005423 }
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005424#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5425#endif /* MBEDTLS_X509_CRT_PARSE_C */
5426
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005427 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005428 * Session ticket if any, plus associated data
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005429 */
5430#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005431 used += 3 + session->ticket_len + 4; /* len + ticket + lifetime */
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005432
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005433 if( used <= buf_len )
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005434 {
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005435 *p++ = (unsigned char)( ( session->ticket_len >> 16 ) & 0xFF );
5436 *p++ = (unsigned char)( ( session->ticket_len >> 8 ) & 0xFF );
5437 *p++ = (unsigned char)( ( session->ticket_len ) & 0xFF );
5438
5439 if( session->ticket != NULL )
5440 {
5441 memcpy( p, session->ticket, session->ticket_len );
5442 p += session->ticket_len;
5443 }
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005444
5445 *p++ = (unsigned char)( ( session->ticket_lifetime >> 24 ) & 0xFF );
5446 *p++ = (unsigned char)( ( session->ticket_lifetime >> 16 ) & 0xFF );
5447 *p++ = (unsigned char)( ( session->ticket_lifetime >> 8 ) & 0xFF );
5448 *p++ = (unsigned char)( ( session->ticket_lifetime ) & 0xFF );
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005449 }
5450#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
5451
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005452 /*
5453 * Misc extension-related info
5454 */
5455#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
5456 used += 1;
5457
5458 if( used <= buf_len )
5459 *p++ = session->mfl_code;
5460#endif
5461
5462#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
5463 used += 1;
5464
5465 if( used <= buf_len )
5466 *p++ = (unsigned char)( ( session->trunc_hmac ) & 0xFF );
5467#endif
5468
5469#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
5470 used += 1;
5471
5472 if( used <= buf_len )
5473 *p++ = (unsigned char)( ( session->encrypt_then_mac ) & 0xFF );
5474#endif
5475
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005476 /* Done */
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02005477 *olen = used;
5478
5479 if( used > buf_len )
5480 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005481
5482 return( 0 );
5483}
5484
5485/*
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005486 * Public wrapper for ssl_session_save()
5487 */
5488int mbedtls_ssl_session_save( const mbedtls_ssl_session *session,
5489 unsigned char *buf,
5490 size_t buf_len,
5491 size_t *olen )
5492{
5493 return( ssl_session_save( session, 0, buf, buf_len, olen ) );
5494}
5495
5496/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02005497 * Deserialize session, see mbedtls_ssl_session_save() for format.
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02005498 *
5499 * This internal version is wrapped by a public function that cleans up in
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005500 * case of error, and has an extra option omit_header.
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005501 */
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02005502static int ssl_session_load( mbedtls_ssl_session *session,
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005503 unsigned char omit_header,
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02005504 const unsigned char *buf,
5505 size_t len )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005506{
5507 const unsigned char *p = buf;
5508 const unsigned char * const end = buf + len;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005509#if defined(MBEDTLS_HAVE_TIME)
5510 uint64_t start;
5511#endif
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005512#if defined(MBEDTLS_X509_CRT_PARSE_C)
5513#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5514 size_t cert_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005515#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5516#endif /* MBEDTLS_X509_CRT_PARSE_C */
5517
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005518 if( !omit_header )
Hanno Beckera835da52019-05-16 12:39:07 +01005519 {
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005520 /*
5521 * Check version identifier
5522 */
5523
5524 if( (size_t)( end - p ) < sizeof( ssl_serialized_session_header ) )
5525 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5526
5527 if( memcmp( p, ssl_serialized_session_header,
5528 sizeof( ssl_serialized_session_header ) ) != 0 )
5529 {
5530 return( MBEDTLS_ERR_SSL_VERSION_MISMATCH );
5531 }
5532 p += sizeof( ssl_serialized_session_header );
Hanno Beckera835da52019-05-16 12:39:07 +01005533 }
Hanno Beckera835da52019-05-16 12:39:07 +01005534
5535 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005536 * Time
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005537 */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005538#if defined(MBEDTLS_HAVE_TIME)
5539 if( 8 > (size_t)( end - p ) )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005540 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5541
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005542 start = ( (uint64_t) p[0] << 56 ) |
5543 ( (uint64_t) p[1] << 48 ) |
5544 ( (uint64_t) p[2] << 40 ) |
5545 ( (uint64_t) p[3] << 32 ) |
5546 ( (uint64_t) p[4] << 24 ) |
5547 ( (uint64_t) p[5] << 16 ) |
5548 ( (uint64_t) p[6] << 8 ) |
5549 ( (uint64_t) p[7] );
5550 p += 8;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005551
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005552 session->start = (time_t) start;
5553#endif /* MBEDTLS_HAVE_TIME */
5554
5555 /*
5556 * Basic mandatory fields
5557 */
5558 if( 2 + 1 + 1 + 32 + 48 + 4 > (size_t)( end - p ) )
5559 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5560
5561 session->ciphersuite = ( p[0] << 8 ) | p[1];
5562 p += 2;
5563
5564 session->compression = *p++;
5565
5566 session->id_len = *p++;
5567 memcpy( session->id, p, 32 );
5568 p += 32;
5569
5570 memcpy( session->master, p, 48 );
5571 p += 48;
5572
5573 session->verify_result = ( (uint32_t) p[0] << 24 ) |
5574 ( (uint32_t) p[1] << 16 ) |
5575 ( (uint32_t) p[2] << 8 ) |
5576 ( (uint32_t) p[3] );
5577 p += 4;
5578
5579 /* Immediately clear invalid pointer values that have been read, in case
5580 * we exit early before we replaced them with valid ones. */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005581#if defined(MBEDTLS_X509_CRT_PARSE_C)
5582#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5583 session->peer_cert = NULL;
5584#else
5585 session->peer_cert_digest = NULL;
5586#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5587#endif /* MBEDTLS_X509_CRT_PARSE_C */
5588#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
5589 session->ticket = NULL;
5590#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
5591
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005592 /*
5593 * Peer certificate
5594 */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005595#if defined(MBEDTLS_X509_CRT_PARSE_C)
5596#if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5597 /* Deserialize CRT from the end of the ticket. */
5598 if( 3 > (size_t)( end - p ) )
5599 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5600
5601 cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
5602 p += 3;
5603
5604 if( cert_len != 0 )
5605 {
Janos Follath865b3eb2019-12-16 11:46:15 +00005606 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005607
5608 if( cert_len > (size_t)( end - p ) )
5609 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5610
5611 session->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
5612
5613 if( session->peer_cert == NULL )
5614 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
5615
5616 mbedtls_x509_crt_init( session->peer_cert );
5617
5618 if( ( ret = mbedtls_x509_crt_parse_der( session->peer_cert,
5619 p, cert_len ) ) != 0 )
5620 {
5621 mbedtls_x509_crt_free( session->peer_cert );
5622 mbedtls_free( session->peer_cert );
5623 session->peer_cert = NULL;
5624 return( ret );
5625 }
5626
5627 p += cert_len;
5628 }
5629#else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5630 /* Deserialize CRT digest from the end of the ticket. */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005631 if( 2 > (size_t)( end - p ) )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005632 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5633
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005634 session->peer_cert_digest_type = (mbedtls_md_type_t) *p++;
5635 session->peer_cert_digest_len = (size_t) *p++;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005636
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005637 if( session->peer_cert_digest_len != 0 )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005638 {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005639 const mbedtls_md_info_t *md_info =
5640 mbedtls_md_info_from_type( session->peer_cert_digest_type );
5641 if( md_info == NULL )
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005642 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005643 if( session->peer_cert_digest_len != mbedtls_md_get_size( md_info ) )
5644 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005645
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005646 if( session->peer_cert_digest_len > (size_t)( end - p ) )
5647 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5648
5649 session->peer_cert_digest =
5650 mbedtls_calloc( 1, session->peer_cert_digest_len );
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005651 if( session->peer_cert_digest == NULL )
5652 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
5653
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005654 memcpy( session->peer_cert_digest, p,
5655 session->peer_cert_digest_len );
5656 p += session->peer_cert_digest_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005657 }
5658#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5659#endif /* MBEDTLS_X509_CRT_PARSE_C */
5660
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005661 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005662 * Session ticket and associated data
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005663 */
5664#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
5665 if( 3 > (size_t)( end - p ) )
5666 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5667
5668 session->ticket_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
5669 p += 3;
5670
5671 if( session->ticket_len != 0 )
5672 {
5673 if( session->ticket_len > (size_t)( end - p ) )
5674 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5675
5676 session->ticket = mbedtls_calloc( 1, session->ticket_len );
5677 if( session->ticket == NULL )
5678 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
5679
5680 memcpy( session->ticket, p, session->ticket_len );
5681 p += session->ticket_len;
5682 }
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005683
5684 if( 4 > (size_t)( end - p ) )
5685 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5686
5687 session->ticket_lifetime = ( (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;
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005692#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
5693
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02005694 /*
5695 * Misc extension-related info
5696 */
5697#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
5698 if( 1 > (size_t)( end - p ) )
5699 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5700
5701 session->mfl_code = *p++;
5702#endif
5703
5704#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
5705 if( 1 > (size_t)( end - p ) )
5706 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5707
5708 session->trunc_hmac = *p++;
5709#endif
5710
5711#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
5712 if( 1 > (size_t)( end - p ) )
5713 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5714
5715 session->encrypt_then_mac = *p++;
5716#endif
5717
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02005718 /* Done, should have consumed entire buffer */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02005719 if( p != end )
5720 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5721
5722 return( 0 );
5723}
5724
5725/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02005726 * Deserialize session: public wrapper for error cleaning
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02005727 */
5728int mbedtls_ssl_session_load( mbedtls_ssl_session *session,
5729 const unsigned char *buf,
5730 size_t len )
5731{
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005732 int ret = ssl_session_load( session, 0, buf, len );
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02005733
5734 if( ret != 0 )
5735 mbedtls_ssl_session_free( session );
5736
5737 return( ret );
5738}
5739
5740/*
Paul Bakker1961b702013-01-25 14:49:24 +01005741 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00005742 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005743int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00005744{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005745 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00005746
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02005747 if( ssl == NULL || ssl->conf == NULL )
5748 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5749
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005750#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005751 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005752 ret = mbedtls_ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00005753#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005754#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005755 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005756 ret = mbedtls_ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00005757#endif
5758
Paul Bakker1961b702013-01-25 14:49:24 +01005759 return( ret );
5760}
5761
5762/*
5763 * Perform the SSL handshake
5764 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005765int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl )
Paul Bakker1961b702013-01-25 14:49:24 +01005766{
5767 int ret = 0;
5768
Hanno Beckera817ea42020-10-20 15:20:23 +01005769 /* Sanity checks */
5770
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02005771 if( ssl == NULL || ssl->conf == NULL )
5772 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5773
Hanno Beckera817ea42020-10-20 15:20:23 +01005774#if defined(MBEDTLS_SSL_PROTO_DTLS)
5775 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
5776 ( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL ) )
5777 {
5778 MBEDTLS_SSL_DEBUG_MSG( 1, ( "You must use "
5779 "mbedtls_ssl_set_timer_cb() for DTLS" ) );
5780 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5781 }
5782#endif /* MBEDTLS_SSL_PROTO_DTLS */
5783
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005784 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
Paul Bakker1961b702013-01-25 14:49:24 +01005785
Hanno Beckera817ea42020-10-20 15:20:23 +01005786 /* Main handshake loop */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005787 while( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Paul Bakker1961b702013-01-25 14:49:24 +01005788 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005789 ret = mbedtls_ssl_handshake_step( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01005790
5791 if( ret != 0 )
5792 break;
5793 }
5794
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005795 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00005796
5797 return( ret );
5798}
5799
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005800#if defined(MBEDTLS_SSL_RENEGOTIATION)
5801#if defined(MBEDTLS_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00005802/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005803 * Write HelloRequest to request renegotiation on server
Paul Bakker48916f92012-09-16 19:57:18 +00005804 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005805static int ssl_write_hello_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005806{
Janos Follath865b3eb2019-12-16 11:46:15 +00005807 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005808
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005809 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello request" ) );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005810
5811 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005812 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
5813 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005814
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02005815 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005816 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02005817 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005818 return( ret );
5819 }
5820
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005821 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello request" ) );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005822
5823 return( 0 );
5824}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005825#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005826
5827/*
5828 * Actually renegotiate current connection, triggered by either:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005829 * - any side: calling mbedtls_ssl_renegotiate(),
5830 * - client: receiving a HelloRequest during mbedtls_ssl_read(),
5831 * - server: receiving any handshake message on server during mbedtls_ssl_read() after
Manuel Pégourié-Gonnard55e4ff22014-08-19 11:16:35 +02005832 * the initial handshake is completed.
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005833 * If the handshake doesn't complete due to waiting for I/O, it will continue
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005834 * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively.
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005835 */
Hanno Becker40cdaa12020-02-05 10:48:27 +00005836int mbedtls_ssl_start_renegotiation( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00005837{
Janos Follath865b3eb2019-12-16 11:46:15 +00005838 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker48916f92012-09-16 19:57:18 +00005839
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005840 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00005841
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005842 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
5843 return( ret );
Paul Bakker48916f92012-09-16 19:57:18 +00005844
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02005845 /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and
5846 * the ServerHello will have message_seq = 1" */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005847#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005848 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005849 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02005850 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005851 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02005852 ssl->handshake->out_msg_seq = 1;
5853 else
5854 ssl->handshake->in_msg_seq = 1;
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02005855 }
5856#endif
5857
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005858 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
5859 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS;
Paul Bakker48916f92012-09-16 19:57:18 +00005860
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005861 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00005862 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005863 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Paul Bakker48916f92012-09-16 19:57:18 +00005864 return( ret );
5865 }
5866
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005867 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00005868
5869 return( 0 );
5870}
5871
5872/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005873 * Renegotiate current connection on client,
5874 * or request renegotiation on server
5875 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005876int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005877{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005878 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005879
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02005880 if( ssl == NULL || ssl->conf == NULL )
5881 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5882
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005883#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005884 /* On server, just send the request */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005885 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005886 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005887 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
5888 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005889
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005890 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02005891
5892 /* Did we already try/start sending HelloRequest? */
5893 if( ssl->out_left != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005894 return( mbedtls_ssl_flush_output( ssl ) );
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02005895
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005896 return( ssl_write_hello_request( ssl ) );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005897 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005898#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005899
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005900#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005901 /*
5902 * On client, either start the renegotiation process or,
5903 * if already in progress, continue the handshake
5904 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005905 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005906 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005907 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
5908 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005909
Hanno Becker40cdaa12020-02-05 10:48:27 +00005910 if( ( ret = mbedtls_ssl_start_renegotiation( ssl ) ) != 0 )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005911 {
Hanno Becker40cdaa12020-02-05 10:48:27 +00005912 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_start_renegotiation", ret );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005913 return( ret );
5914 }
5915 }
5916 else
5917 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005918 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005919 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005920 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005921 return( ret );
5922 }
5923 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005924#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005925
Paul Bakker37ce0ff2013-10-31 14:32:04 +01005926 return( ret );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005927}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005928#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005929
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005930#if defined(MBEDTLS_X509_CRT_PARSE_C)
5931static void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert )
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02005932{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005933 mbedtls_ssl_key_cert *cur = key_cert, *next;
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02005934
5935 while( cur != NULL )
5936 {
5937 next = cur->next;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005938 mbedtls_free( cur );
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02005939 cur = next;
5940 }
5941}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005942#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02005943
Gilles Peskine9b562d52018-04-25 20:32:43 +02005944void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00005945{
Gilles Peskine9b562d52018-04-25 20:32:43 +02005946 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
5947
Paul Bakkeraccaffe2014-06-26 13:37:14 +02005948 if( handshake == NULL )
5949 return;
5950
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02005951#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
5952 if( ssl->conf->f_async_cancel != NULL && handshake->async_in_progress != 0 )
5953 {
Gilles Peskine8f97af72018-04-26 11:46:10 +02005954 ssl->conf->f_async_cancel( ssl );
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02005955 handshake->async_in_progress = 0;
5956 }
5957#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
5958
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02005959#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
5960 defined(MBEDTLS_SSL_PROTO_TLS1_1)
5961 mbedtls_md5_free( &handshake->fin_md5 );
5962 mbedtls_sha1_free( &handshake->fin_sha1 );
5963#endif
5964#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5965#if defined(MBEDTLS_SHA256_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05005966#if defined(MBEDTLS_USE_PSA_CRYPTO)
5967 psa_hash_abort( &handshake->fin_sha256_psa );
5968#else
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02005969 mbedtls_sha256_free( &handshake->fin_sha256 );
5970#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05005971#endif
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02005972#if defined(MBEDTLS_SHA512_C)
Andrzej Kurekeb342242019-01-29 09:14:33 -05005973#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05005974 psa_hash_abort( &handshake->fin_sha384_psa );
Andrzej Kurekeb342242019-01-29 09:14:33 -05005975#else
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02005976 mbedtls_sha512_free( &handshake->fin_sha512 );
5977#endif
Andrzej Kurekeb342242019-01-29 09:14:33 -05005978#endif
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02005979#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
5980
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005981#if defined(MBEDTLS_DHM_C)
5982 mbedtls_dhm_free( &handshake->dhm_ctx );
Paul Bakker48916f92012-09-16 19:57:18 +00005983#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005984#if defined(MBEDTLS_ECDH_C)
5985 mbedtls_ecdh_free( &handshake->ecdh_ctx );
Paul Bakker61d113b2013-07-04 11:51:43 +02005986#endif
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02005987#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02005988 mbedtls_ecjpake_free( &handshake->ecjpake_ctx );
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02005989#if defined(MBEDTLS_SSL_CLI_C)
5990 mbedtls_free( handshake->ecjpake_cache );
5991 handshake->ecjpake_cache = NULL;
5992 handshake->ecjpake_cache_len = 0;
5993#endif
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02005994#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02005995
Janos Follath4ae5c292016-02-10 11:27:43 +00005996#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
5997 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Paul Bakker9af723c2014-05-01 13:03:14 +02005998 /* explicit void pointer cast for buggy MS compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005999 mbedtls_free( (void *) handshake->curves );
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +02006000#endif
6001
Gilles Peskineeccd8882020-03-10 12:19:08 +01006002#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01006003 if( handshake->psk != NULL )
6004 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006005 mbedtls_platform_zeroize( handshake->psk, handshake->psk_len );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01006006 mbedtls_free( handshake->psk );
6007 }
6008#endif
6009
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006010#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
6011 defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02006012 /*
6013 * Free only the linked list wrapper, not the keys themselves
6014 * since the belong to the SNI callback
6015 */
6016 if( handshake->sni_key_cert != NULL )
6017 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006018 mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next;
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02006019
6020 while( cur != NULL )
6021 {
6022 next = cur->next;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006023 mbedtls_free( cur );
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02006024 cur = next;
6025 }
6026 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006027#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02006028
Gilles Peskineeccd8882020-03-10 12:19:08 +01006029#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Manuel Pégourié-Gonnard6b7301c2017-08-15 12:08:45 +02006030 mbedtls_x509_crt_restart_free( &handshake->ecrs_ctx );
Hanno Becker3dad3112019-02-05 17:19:52 +00006031 if( handshake->ecrs_peer_cert != NULL )
6032 {
6033 mbedtls_x509_crt_free( handshake->ecrs_peer_cert );
6034 mbedtls_free( handshake->ecrs_peer_cert );
6035 }
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02006036#endif
6037
Hanno Becker75173122019-02-06 16:18:31 +00006038#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
6039 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
6040 mbedtls_pk_free( &handshake->peer_pubkey );
6041#endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
6042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006043#if defined(MBEDTLS_SSL_PROTO_DTLS)
6044 mbedtls_free( handshake->verify_cookie );
Hanno Becker533ab5f2020-02-05 10:49:13 +00006045 mbedtls_ssl_flight_free( handshake->flight );
6046 mbedtls_ssl_buffering_free( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02006047#endif
6048
Hanno Becker4a63ed42019-01-08 11:39:35 +00006049#if defined(MBEDTLS_ECDH_C) && \
6050 defined(MBEDTLS_USE_PSA_CRYPTO)
6051 psa_destroy_key( handshake->ecdh_psa_privkey );
6052#endif /* MBEDTLS_ECDH_C && MBEDTLS_USE_PSA_CRYPTO */
6053
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006054 mbedtls_platform_zeroize( handshake,
6055 sizeof( mbedtls_ssl_handshake_params ) );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006056
6057#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
6058 /* If the buffers are too big - reallocate. Because of the way Mbed TLS
6059 * processes datagrams and the fact that a datagram is allowed to have
6060 * several records in it, it is possible that the I/O buffers are not
6061 * empty at this stage */
6062 {
6063 int modified = 0;
6064 uint32_t buf_len = mbedtls_ssl_get_input_buflen( ssl );
Andrzej Kurekb6577832020-06-08 07:08:03 -04006065 size_t written_in = 0, iv_offset_in = 0, len_offset_in = 0;
6066 size_t written_out = 0, iv_offset_out = 0, len_offset_out = 0;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04006067 if( ssl->in_buf != NULL )
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006068 {
6069 written_in = ssl->in_msg - ssl->in_buf;
Andrzej Kurekb6577832020-06-08 07:08:03 -04006070 iv_offset_in = ssl->in_iv - ssl->in_buf;
6071 len_offset_in = ssl->in_len - ssl->in_buf;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04006072 if( ssl->in_buf_len > buf_len && ssl->in_left < buf_len )
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006073 {
Andrzej Kurek8ea68722020-04-03 06:40:47 -04006074 if( resize_buffer( &ssl->in_buf, buf_len, &ssl->in_buf_len ) != 0 )
6075 {
6076 MBEDTLS_SSL_DEBUG_MSG( 1, ( "input buffer resizing failed - out of memory" ) );
6077 }
6078 else
6079 {
6080 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating in_buf to %d", buf_len ) );
6081 modified = 1;
6082 }
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006083 }
6084 }
6085
Andrzej Kurek8ea68722020-04-03 06:40:47 -04006086
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006087 buf_len = mbedtls_ssl_get_output_buflen( ssl );
Andrzej Kurek8ea68722020-04-03 06:40:47 -04006088 if(ssl->out_buf != NULL )
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006089 {
6090 written_out = ssl->out_msg - ssl->out_buf;
Andrzej Kurekb6577832020-06-08 07:08:03 -04006091 iv_offset_out = ssl->out_iv - ssl->out_buf;
6092 len_offset_out = ssl->out_len - ssl->out_buf;
Andrzej Kurek8ea68722020-04-03 06:40:47 -04006093 if( ssl->out_buf_len > mbedtls_ssl_get_output_buflen( ssl ) &&
6094 ssl->out_left < buf_len )
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006095 {
Andrzej Kurek8ea68722020-04-03 06:40:47 -04006096 if( resize_buffer( &ssl->out_buf, buf_len, &ssl->out_buf_len ) != 0 )
6097 {
6098 MBEDTLS_SSL_DEBUG_MSG( 1, ( "output buffer resizing failed - out of memory" ) );
6099 }
6100 else
6101 {
6102 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating out_buf to %d", buf_len ) );
6103 modified = 1;
6104 }
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006105 }
6106 }
6107 if( modified )
6108 {
6109 /* Update pointers here to avoid doing it twice. */
6110 mbedtls_ssl_reset_in_out_pointers( ssl );
6111 /* Fields below might not be properly updated with record
Andrzej Kurekb6577832020-06-08 07:08:03 -04006112 * splitting or with CID, so they are manually updated here. */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006113 ssl->out_msg = ssl->out_buf + written_out;
Andrzej Kurekb6577832020-06-08 07:08:03 -04006114 ssl->out_len = ssl->out_buf + len_offset_out;
6115 ssl->out_iv = ssl->out_buf + iv_offset_out;
6116
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006117 ssl->in_msg = ssl->in_buf + written_in;
Andrzej Kurekb6577832020-06-08 07:08:03 -04006118 ssl->in_len = ssl->in_buf + len_offset_in;
6119 ssl->in_iv = ssl->in_buf + iv_offset_in;
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006120 }
6121 }
6122#endif
Paul Bakker48916f92012-09-16 19:57:18 +00006123}
6124
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006125void mbedtls_ssl_session_free( mbedtls_ssl_session *session )
Paul Bakker48916f92012-09-16 19:57:18 +00006126{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006127 if( session == NULL )
6128 return;
6129
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006130#if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker1294a0b2019-02-05 12:38:15 +00006131 ssl_clear_peer_cert( session );
Paul Bakkered27a042013-04-18 22:46:23 +02006132#endif
Paul Bakker0a597072012-09-25 21:55:46 +00006133
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02006134#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006135 mbedtls_free( session->ticket );
Paul Bakkera503a632013-08-14 13:48:06 +02006136#endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02006137
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006138 mbedtls_platform_zeroize( session, sizeof( mbedtls_ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00006139}
6140
Manuel Pégourié-Gonnard5c0e3772019-07-23 16:13:17 +02006141#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02006142
6143#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
6144#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 1u
6145#else
6146#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 0u
6147#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
6148
6149#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
6150#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 1u
6151#else
6152#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 0u
6153#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */
6154
6155#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6156#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 1u
6157#else
6158#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 0u
6159#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
6160
6161#if defined(MBEDTLS_SSL_ALPN)
6162#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 1u
6163#else
6164#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 0u
6165#endif /* MBEDTLS_SSL_ALPN */
6166
6167#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT 0
6168#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT 1
6169#define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT 2
6170#define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT 3
6171
6172#define SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG \
6173 ( (uint32_t) ( \
6174 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT ) | \
6175 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT ) | \
6176 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT ) | \
6177 ( SSL_SERIALIZED_CONTEXT_CONFIG_ALPN << SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT ) | \
6178 0u ) )
6179
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006180static unsigned char ssl_serialized_context_header[] = {
6181 MBEDTLS_VERSION_MAJOR,
6182 MBEDTLS_VERSION_MINOR,
6183 MBEDTLS_VERSION_PATCH,
6184 ( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG >> 8 ) & 0xFF,
6185 ( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG >> 0 ) & 0xFF,
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02006186 ( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG >> 16 ) & 0xFF,
6187 ( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG >> 8 ) & 0xFF,
6188 ( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG >> 0 ) & 0xFF,
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006189};
6190
Paul Bakker5121ce52009-01-03 21:22:43 +00006191/*
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006192 * Serialize a full SSL context
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02006193 *
6194 * The format of the serialized data is:
6195 * (in the presentation language of TLS, RFC 8446 section 3)
6196 *
6197 * // header
6198 * opaque mbedtls_version[3]; // major, minor, patch
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006199 * opaque context_format[5]; // version-specific field determining
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02006200 * // the format of the remaining
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006201 * // serialized data.
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02006202 * Note: When updating the format, remember to keep these
6203 * version+format bytes. (We may make their size part of the API.)
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02006204 *
6205 * // session sub-structure
6206 * opaque session<1..2^32-1>; // see mbedtls_ssl_session_save()
6207 * // transform sub-structure
6208 * uint8 random[64]; // ServerHello.random+ClientHello.random
6209 * uint8 in_cid<0..2^8-1> // Connection ID: expected incoming value
6210 * uint8 out_cid<0..2^8-1> // Connection ID: outgoing value to use
6211 * // fields from ssl_context
6212 * uint32 badmac_seen; // DTLS: number of records with failing MAC
6213 * uint64 in_window_top; // DTLS: last validated record seq_num
6214 * uint64 in_window; // DTLS: bitmask for replay protection
6215 * uint8 disable_datagram_packing; // DTLS: only one record per datagram
6216 * uint64 cur_out_ctr; // Record layer: outgoing sequence number
6217 * uint16 mtu; // DTLS: path mtu (max outgoing fragment size)
6218 * uint8 alpn_chosen<0..2^8-1> // ALPN: negotiated application protocol
6219 *
6220 * Note that many fields of the ssl_context or sub-structures are not
6221 * serialized, as they fall in one of the following categories:
6222 *
6223 * 1. forced value (eg in_left must be 0)
6224 * 2. pointer to dynamically-allocated memory (eg session, transform)
6225 * 3. value can be re-derived from other data (eg session keys from MS)
6226 * 4. value was temporary (eg content of input buffer)
6227 * 5. value will be provided by the user again (eg I/O callbacks and context)
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006228 */
6229int mbedtls_ssl_context_save( mbedtls_ssl_context *ssl,
6230 unsigned char *buf,
6231 size_t buf_len,
6232 size_t *olen )
6233{
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006234 unsigned char *p = buf;
6235 size_t used = 0;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006236 size_t session_len;
6237 int ret = 0;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006238
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02006239 /*
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006240 * Enforce usage restrictions, see "return BAD_INPUT_DATA" in
6241 * this function's documentation.
6242 *
6243 * These are due to assumptions/limitations in the implementation. Some of
6244 * them are likely to stay (no handshake in progress) some might go away
6245 * (only DTLS) but are currently used to simplify the implementation.
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02006246 */
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006247 /* The initial handshake must be over */
6248 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006249 {
6250 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Initial handshake isn't over" ) );
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02006251 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006252 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006253 if( ssl->handshake != NULL )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006254 {
6255 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Handshake isn't completed" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006256 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006257 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006258 /* Double-check that sub-structures are indeed ready */
6259 if( ssl->transform == NULL || ssl->session == NULL )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006260 {
6261 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Serialised structures aren't ready" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006262 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006263 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006264 /* There must be no pending incoming or outgoing data */
6265 if( mbedtls_ssl_check_pending( ssl ) != 0 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006266 {
6267 MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending incoming data" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006268 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006269 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006270 if( ssl->out_left != 0 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006271 {
6272 MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending outgoing data" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006273 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006274 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006275 /* Protocol must be DLTS, not TLS */
6276 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006277 {
6278 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only DTLS is supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006279 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006280 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006281 /* Version must be 1.2 */
6282 if( ssl->major_ver != MBEDTLS_SSL_MAJOR_VERSION_3 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006283 {
6284 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only version 1.2 supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006285 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006286 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006287 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006288 {
6289 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only version 1.2 supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006290 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006291 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006292 /* We must be using an AEAD ciphersuite */
6293 if( mbedtls_ssl_transform_uses_aead( ssl->transform ) != 1 )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006294 {
6295 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only AEAD ciphersuites supported" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006296 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006297 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006298 /* Renegotiation must not be enabled */
6299#if defined(MBEDTLS_SSL_RENEGOTIATION)
6300 if( ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED )
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006301 {
6302 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Renegotiation must not be enabled" ) );
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006303 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03006304 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02006305#endif
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006306
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006307 /*
6308 * Version and format identifier
6309 */
6310 used += sizeof( ssl_serialized_context_header );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006311
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006312 if( used <= buf_len )
6313 {
6314 memcpy( p, ssl_serialized_context_header,
6315 sizeof( ssl_serialized_context_header ) );
6316 p += sizeof( ssl_serialized_context_header );
6317 }
6318
6319 /*
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006320 * Session (length + data)
6321 */
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02006322 ret = ssl_session_save( ssl->session, 1, NULL, 0, &session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006323 if( ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL )
6324 return( ret );
6325
6326 used += 4 + session_len;
6327 if( used <= buf_len )
6328 {
6329 *p++ = (unsigned char)( ( session_len >> 24 ) & 0xFF );
6330 *p++ = (unsigned char)( ( session_len >> 16 ) & 0xFF );
6331 *p++ = (unsigned char)( ( session_len >> 8 ) & 0xFF );
6332 *p++ = (unsigned char)( ( session_len ) & 0xFF );
6333
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02006334 ret = ssl_session_save( ssl->session, 1,
6335 p, session_len, &session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006336 if( ret != 0 )
6337 return( ret );
6338
6339 p += session_len;
6340 }
6341
6342 /*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006343 * Transform
6344 */
6345 used += sizeof( ssl->transform->randbytes );
6346 if( used <= buf_len )
6347 {
6348 memcpy( p, ssl->transform->randbytes,
6349 sizeof( ssl->transform->randbytes ) );
6350 p += sizeof( ssl->transform->randbytes );
6351 }
6352
6353#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
6354 used += 2 + ssl->transform->in_cid_len + ssl->transform->out_cid_len;
6355 if( used <= buf_len )
6356 {
6357 *p++ = ssl->transform->in_cid_len;
6358 memcpy( p, ssl->transform->in_cid, ssl->transform->in_cid_len );
6359 p += ssl->transform->in_cid_len;
6360
6361 *p++ = ssl->transform->out_cid_len;
6362 memcpy( p, ssl->transform->out_cid, ssl->transform->out_cid_len );
6363 p += ssl->transform->out_cid_len;
6364 }
6365#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
6366
6367 /*
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02006368 * Saved fields from top-level ssl_context structure
6369 */
6370#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
6371 used += 4;
6372 if( used <= buf_len )
6373 {
6374 *p++ = (unsigned char)( ( ssl->badmac_seen >> 24 ) & 0xFF );
6375 *p++ = (unsigned char)( ( ssl->badmac_seen >> 16 ) & 0xFF );
6376 *p++ = (unsigned char)( ( ssl->badmac_seen >> 8 ) & 0xFF );
6377 *p++ = (unsigned char)( ( ssl->badmac_seen ) & 0xFF );
6378 }
6379#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */
6380
6381#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6382 used += 16;
6383 if( used <= buf_len )
6384 {
6385 *p++ = (unsigned char)( ( ssl->in_window_top >> 56 ) & 0xFF );
6386 *p++ = (unsigned char)( ( ssl->in_window_top >> 48 ) & 0xFF );
6387 *p++ = (unsigned char)( ( ssl->in_window_top >> 40 ) & 0xFF );
6388 *p++ = (unsigned char)( ( ssl->in_window_top >> 32 ) & 0xFF );
6389 *p++ = (unsigned char)( ( ssl->in_window_top >> 24 ) & 0xFF );
6390 *p++ = (unsigned char)( ( ssl->in_window_top >> 16 ) & 0xFF );
6391 *p++ = (unsigned char)( ( ssl->in_window_top >> 8 ) & 0xFF );
6392 *p++ = (unsigned char)( ( ssl->in_window_top ) & 0xFF );
6393
6394 *p++ = (unsigned char)( ( ssl->in_window >> 56 ) & 0xFF );
6395 *p++ = (unsigned char)( ( ssl->in_window >> 48 ) & 0xFF );
6396 *p++ = (unsigned char)( ( ssl->in_window >> 40 ) & 0xFF );
6397 *p++ = (unsigned char)( ( ssl->in_window >> 32 ) & 0xFF );
6398 *p++ = (unsigned char)( ( ssl->in_window >> 24 ) & 0xFF );
6399 *p++ = (unsigned char)( ( ssl->in_window >> 16 ) & 0xFF );
6400 *p++ = (unsigned char)( ( ssl->in_window >> 8 ) & 0xFF );
6401 *p++ = (unsigned char)( ( ssl->in_window ) & 0xFF );
6402 }
6403#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
6404
6405#if defined(MBEDTLS_SSL_PROTO_DTLS)
6406 used += 1;
6407 if( used <= buf_len )
6408 {
6409 *p++ = ssl->disable_datagram_packing;
6410 }
6411#endif /* MBEDTLS_SSL_PROTO_DTLS */
6412
6413 used += 8;
6414 if( used <= buf_len )
6415 {
6416 memcpy( p, ssl->cur_out_ctr, 8 );
6417 p += 8;
6418 }
6419
6420#if defined(MBEDTLS_SSL_PROTO_DTLS)
6421 used += 2;
6422 if( used <= buf_len )
6423 {
6424 *p++ = (unsigned char)( ( ssl->mtu >> 8 ) & 0xFF );
6425 *p++ = (unsigned char)( ( ssl->mtu ) & 0xFF );
6426 }
6427#endif /* MBEDTLS_SSL_PROTO_DTLS */
6428
6429#if defined(MBEDTLS_SSL_ALPN)
6430 {
6431 const uint8_t alpn_len = ssl->alpn_chosen
Manuel Pégourié-Gonnardf041f4e2019-07-24 00:58:27 +02006432 ? (uint8_t) strlen( ssl->alpn_chosen )
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02006433 : 0;
6434
6435 used += 1 + alpn_len;
6436 if( used <= buf_len )
6437 {
6438 *p++ = alpn_len;
6439
6440 if( ssl->alpn_chosen != NULL )
6441 {
6442 memcpy( p, ssl->alpn_chosen, alpn_len );
6443 p += alpn_len;
6444 }
6445 }
6446 }
6447#endif /* MBEDTLS_SSL_ALPN */
6448
6449 /*
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006450 * Done
6451 */
6452 *olen = used;
6453
6454 if( used > buf_len )
6455 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006456
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006457 MBEDTLS_SSL_DEBUG_BUF( 4, "saved context", buf, used );
6458
Hanno Becker43aefe22020-02-05 10:44:56 +00006459 return( mbedtls_ssl_session_reset_int( ssl, 0 ) );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006460}
6461
6462/*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006463 * Helper to get TLS 1.2 PRF from ciphersuite
6464 * (Duplicates bits of logic from ssl_set_handshake_prfs().)
6465 */
6466typedef int (*tls_prf_fn)( const unsigned char *secret, size_t slen,
6467 const char *label,
6468 const unsigned char *random, size_t rlen,
6469 unsigned char *dstbuf, size_t dlen );
6470static tls_prf_fn ssl_tls12prf_from_cs( int ciphersuite_id )
6471{
Jarno Lamsab7b486c2019-08-21 15:30:44 +03006472#if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006473 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
6474 mbedtls_ssl_ciphersuite_from_id( ciphersuite_id );
6475
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02006476 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
6477 return( tls_prf_sha384 );
Jarno Lamsab7b486c2019-08-21 15:30:44 +03006478#else
6479 (void) ciphersuite_id;
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02006480#endif
6481 return( tls_prf_sha256 );
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006482}
6483
6484/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02006485 * Deserialize context, see mbedtls_ssl_context_save() for format.
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006486 *
6487 * This internal version is wrapped by a public function that cleans up in
6488 * case of error.
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006489 */
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006490static int ssl_context_load( mbedtls_ssl_context *ssl,
6491 const unsigned char *buf,
6492 size_t len )
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006493{
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006494 const unsigned char *p = buf;
6495 const unsigned char * const end = buf + len;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006496 size_t session_len;
Janos Follath865b3eb2019-12-16 11:46:15 +00006497 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006498
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02006499 /*
6500 * The context should have been freshly setup or reset.
6501 * Give the user an error in case of obvious misuse.
Manuel Pégourié-Gonnard4ca930f2019-07-26 16:31:53 +02006502 * (Checking session is useful because it won't be NULL if we're
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02006503 * renegotiating, or if the user mistakenly loaded a session first.)
6504 */
6505 if( ssl->state != MBEDTLS_SSL_HELLO_REQUEST ||
6506 ssl->session != NULL )
6507 {
6508 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6509 }
6510
6511 /*
6512 * We can't check that the config matches the initial one, but we can at
6513 * least check it matches the requirements for serializing.
6514 */
6515 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
6516 ssl->conf->max_major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
6517 ssl->conf->min_major_ver > MBEDTLS_SSL_MAJOR_VERSION_3 ||
6518 ssl->conf->max_minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ||
6519 ssl->conf->min_minor_ver > MBEDTLS_SSL_MINOR_VERSION_3 ||
6520#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02006521 ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED ||
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02006522#endif
Manuel Pégourié-Gonnard9a96fd72019-07-23 17:11:24 +02006523 0 )
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02006524 {
6525 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6526 }
6527
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006528 MBEDTLS_SSL_DEBUG_BUF( 4, "context to load", buf, len );
6529
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006530 /*
6531 * Check version identifier
6532 */
6533 if( (size_t)( end - p ) < sizeof( ssl_serialized_context_header ) )
6534 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6535
6536 if( memcmp( p, ssl_serialized_context_header,
6537 sizeof( ssl_serialized_context_header ) ) != 0 )
6538 {
6539 return( MBEDTLS_ERR_SSL_VERSION_MISMATCH );
6540 }
6541 p += sizeof( ssl_serialized_context_header );
6542
6543 /*
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006544 * Session
6545 */
6546 if( (size_t)( end - p ) < 4 )
6547 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6548
6549 session_len = ( (size_t) p[0] << 24 ) |
6550 ( (size_t) p[1] << 16 ) |
6551 ( (size_t) p[2] << 8 ) |
6552 ( (size_t) p[3] );
6553 p += 4;
6554
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006555 /* This has been allocated by ssl_handshake_init(), called by
Hanno Becker43aefe22020-02-05 10:44:56 +00006556 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006557 ssl->session = ssl->session_negotiate;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006558 ssl->session_in = ssl->session;
6559 ssl->session_out = ssl->session;
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006560 ssl->session_negotiate = NULL;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006561
6562 if( (size_t)( end - p ) < session_len )
6563 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6564
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02006565 ret = ssl_session_load( ssl->session, 1, p, session_len );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006566 if( ret != 0 )
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02006567 {
6568 mbedtls_ssl_session_free( ssl->session );
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006569 return( ret );
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02006570 }
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006571
6572 p += session_len;
6573
6574 /*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006575 * Transform
6576 */
6577
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006578 /* This has been allocated by ssl_handshake_init(), called by
Hanno Becker43aefe22020-02-05 10:44:56 +00006579 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006580 ssl->transform = ssl->transform_negotiate;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006581 ssl->transform_in = ssl->transform;
6582 ssl->transform_out = ssl->transform;
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02006583 ssl->transform_negotiate = NULL;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006584
6585 /* Read random bytes and populate structure */
6586 if( (size_t)( end - p ) < sizeof( ssl->transform->randbytes ) )
6587 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6588
6589 ret = ssl_populate_transform( ssl->transform,
6590 ssl->session->ciphersuite,
6591 ssl->session->master,
6592#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
6593#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
6594 ssl->session->encrypt_then_mac,
6595#endif
6596#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
6597 ssl->session->trunc_hmac,
6598#endif
6599#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
6600#if defined(MBEDTLS_ZLIB_SUPPORT)
6601 ssl->session->compression,
6602#endif
6603 ssl_tls12prf_from_cs( ssl->session->ciphersuite ),
6604 p, /* currently pointing to randbytes */
6605 MBEDTLS_SSL_MINOR_VERSION_3, /* (D)TLS 1.2 is forced */
6606 ssl->conf->endpoint,
6607 ssl );
6608 if( ret != 0 )
6609 return( ret );
6610
6611 p += sizeof( ssl->transform->randbytes );
6612
6613#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
6614 /* Read connection IDs and store them */
6615 if( (size_t)( end - p ) < 1 )
6616 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6617
6618 ssl->transform->in_cid_len = *p++;
6619
Manuel Pégourié-Gonnard5ea13b82019-07-23 15:02:54 +02006620 if( (size_t)( end - p ) < ssl->transform->in_cid_len + 1u )
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02006621 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6622
6623 memcpy( ssl->transform->in_cid, p, ssl->transform->in_cid_len );
6624 p += ssl->transform->in_cid_len;
6625
6626 ssl->transform->out_cid_len = *p++;
6627
6628 if( (size_t)( end - p ) < ssl->transform->out_cid_len )
6629 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6630
6631 memcpy( ssl->transform->out_cid, p, ssl->transform->out_cid_len );
6632 p += ssl->transform->out_cid_len;
6633#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
6634
6635 /*
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02006636 * Saved fields from top-level ssl_context structure
6637 */
6638#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
6639 if( (size_t)( end - p ) < 4 )
6640 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6641
6642 ssl->badmac_seen = ( (uint32_t) p[0] << 24 ) |
6643 ( (uint32_t) p[1] << 16 ) |
6644 ( (uint32_t) p[2] << 8 ) |
6645 ( (uint32_t) p[3] );
6646 p += 4;
6647#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */
6648
6649#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6650 if( (size_t)( end - p ) < 16 )
6651 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6652
6653 ssl->in_window_top = ( (uint64_t) p[0] << 56 ) |
6654 ( (uint64_t) p[1] << 48 ) |
6655 ( (uint64_t) p[2] << 40 ) |
6656 ( (uint64_t) p[3] << 32 ) |
6657 ( (uint64_t) p[4] << 24 ) |
6658 ( (uint64_t) p[5] << 16 ) |
6659 ( (uint64_t) p[6] << 8 ) |
6660 ( (uint64_t) p[7] );
6661 p += 8;
6662
6663 ssl->in_window = ( (uint64_t) p[0] << 56 ) |
6664 ( (uint64_t) p[1] << 48 ) |
6665 ( (uint64_t) p[2] << 40 ) |
6666 ( (uint64_t) p[3] << 32 ) |
6667 ( (uint64_t) p[4] << 24 ) |
6668 ( (uint64_t) p[5] << 16 ) |
6669 ( (uint64_t) p[6] << 8 ) |
6670 ( (uint64_t) p[7] );
6671 p += 8;
6672#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
6673
6674#if defined(MBEDTLS_SSL_PROTO_DTLS)
6675 if( (size_t)( end - p ) < 1 )
6676 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6677
6678 ssl->disable_datagram_packing = *p++;
6679#endif /* MBEDTLS_SSL_PROTO_DTLS */
6680
6681 if( (size_t)( end - p ) < 8 )
6682 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6683
6684 memcpy( ssl->cur_out_ctr, p, 8 );
6685 p += 8;
6686
6687#if defined(MBEDTLS_SSL_PROTO_DTLS)
6688 if( (size_t)( end - p ) < 2 )
6689 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6690
6691 ssl->mtu = ( p[0] << 8 ) | p[1];
6692 p += 2;
6693#endif /* MBEDTLS_SSL_PROTO_DTLS */
6694
6695#if defined(MBEDTLS_SSL_ALPN)
6696 {
6697 uint8_t alpn_len;
6698 const char **cur;
6699
6700 if( (size_t)( end - p ) < 1 )
6701 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6702
6703 alpn_len = *p++;
6704
6705 if( alpn_len != 0 && ssl->conf->alpn_list != NULL )
6706 {
6707 /* alpn_chosen should point to an item in the configured list */
6708 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
6709 {
6710 if( strlen( *cur ) == alpn_len &&
6711 memcmp( p, cur, alpn_len ) == 0 )
6712 {
6713 ssl->alpn_chosen = *cur;
6714 break;
6715 }
6716 }
6717 }
6718
6719 /* can only happen on conf mismatch */
6720 if( alpn_len != 0 && ssl->alpn_chosen == NULL )
6721 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6722
6723 p += alpn_len;
6724 }
6725#endif /* MBEDTLS_SSL_ALPN */
6726
6727 /*
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02006728 * Forced fields from top-level ssl_context structure
6729 *
6730 * Most of them already set to the correct value by mbedtls_ssl_init() and
6731 * mbedtls_ssl_reset(), so we only need to set the remaining ones.
6732 */
6733 ssl->state = MBEDTLS_SSL_HANDSHAKE_OVER;
6734
6735 ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
6736 ssl->minor_ver = MBEDTLS_SSL_MINOR_VERSION_3;
6737
Hanno Becker361b10d2019-08-30 10:42:49 +01006738 /* Adjust pointers for header fields of outgoing records to
6739 * the given transform, accounting for explicit IV and CID. */
Hanno Becker3e6f8ab2020-02-05 10:40:57 +00006740 mbedtls_ssl_update_out_pointers( ssl, ssl->transform );
Hanno Becker361b10d2019-08-30 10:42:49 +01006741
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02006742#if defined(MBEDTLS_SSL_PROTO_DTLS)
6743 ssl->in_epoch = 1;
6744#endif
6745
6746 /* mbedtls_ssl_reset() leaves the handshake sub-structure allocated,
6747 * which we don't want - otherwise we'd end up freeing the wrong transform
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00006748 * by calling mbedtls_ssl_handshake_wrapup_free_hs_transform()
6749 * inappropriately. */
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02006750 if( ssl->handshake != NULL )
6751 {
6752 mbedtls_ssl_handshake_free( ssl );
6753 mbedtls_free( ssl->handshake );
6754 ssl->handshake = NULL;
6755 }
6756
6757 /*
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02006758 * Done - should have consumed entire buffer
6759 */
6760 if( p != end )
6761 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02006762
6763 return( 0 );
6764}
6765
6766/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02006767 * Deserialize context: public wrapper for error cleaning
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006768 */
6769int mbedtls_ssl_context_load( mbedtls_ssl_context *context,
6770 const unsigned char *buf,
6771 size_t len )
6772{
6773 int ret = ssl_context_load( context, buf, len );
6774
6775 if( ret != 0 )
6776 mbedtls_ssl_free( context );
6777
6778 return( ret );
6779}
Manuel Pégourié-Gonnard5c0e3772019-07-23 16:13:17 +02006780#endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02006781
6782/*
Paul Bakker5121ce52009-01-03 21:22:43 +00006783 * Free an SSL context
6784 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006785void mbedtls_ssl_free( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00006786{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006787 if( ssl == NULL )
6788 return;
6789
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006790 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> free" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006791
Manuel Pégourié-Gonnard7ee6f0e2014-02-13 10:54:07 +01006792 if( ssl->out_buf != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00006793 {
sander-visserb8aa2072020-05-06 22:05:13 +02006794#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
6795 size_t out_buf_len = ssl->out_buf_len;
6796#else
6797 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
6798#endif
6799
Darryl Greenb33cc762019-11-28 14:29:44 +00006800 mbedtls_platform_zeroize( ssl->out_buf, out_buf_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006801 mbedtls_free( ssl->out_buf );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006802 ssl->out_buf = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00006803 }
6804
Manuel Pégourié-Gonnard7ee6f0e2014-02-13 10:54:07 +01006805 if( ssl->in_buf != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00006806 {
sander-visserb8aa2072020-05-06 22:05:13 +02006807#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
6808 size_t in_buf_len = ssl->in_buf_len;
6809#else
6810 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
6811#endif
6812
Darryl Greenb33cc762019-11-28 14:29:44 +00006813 mbedtls_platform_zeroize( ssl->in_buf, in_buf_len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006814 mbedtls_free( ssl->in_buf );
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05006815 ssl->in_buf = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00006816 }
6817
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006818#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakker16770332013-10-11 09:59:44 +02006819 if( ssl->compress_buf != NULL )
6820 {
Angus Grattond8213d02016-05-25 20:56:48 +10006821 mbedtls_platform_zeroize( ssl->compress_buf, MBEDTLS_SSL_COMPRESS_BUFFER_LEN );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006822 mbedtls_free( ssl->compress_buf );
Paul Bakker16770332013-10-11 09:59:44 +02006823 }
6824#endif
6825
Paul Bakker48916f92012-09-16 19:57:18 +00006826 if( ssl->transform )
6827 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006828 mbedtls_ssl_transform_free( ssl->transform );
6829 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00006830 }
6831
6832 if( ssl->handshake )
6833 {
Gilles Peskine9b562d52018-04-25 20:32:43 +02006834 mbedtls_ssl_handshake_free( ssl );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006835 mbedtls_ssl_transform_free( ssl->transform_negotiate );
6836 mbedtls_ssl_session_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00006837
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006838 mbedtls_free( ssl->handshake );
6839 mbedtls_free( ssl->transform_negotiate );
6840 mbedtls_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00006841 }
6842
Paul Bakkerc0463502013-02-14 11:19:38 +01006843 if( ssl->session )
6844 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006845 mbedtls_ssl_session_free( ssl->session );
6846 mbedtls_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01006847 }
6848
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +02006849#if defined(MBEDTLS_X509_CRT_PARSE_C)
Paul Bakker66d5d072014-06-17 16:39:18 +02006850 if( ssl->hostname != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00006851 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006852 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006853 mbedtls_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00006854 }
Paul Bakker0be444a2013-08-27 21:55:01 +02006855#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00006856
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006857#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
6858 if( mbedtls_ssl_hw_record_finish != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00006859 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006860 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_finish()" ) );
6861 mbedtls_ssl_hw_record_finish( ssl );
Paul Bakker05ef8352012-05-08 09:17:57 +00006862 }
6863#endif
6864
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02006865#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006866 mbedtls_free( ssl->cli_id );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02006867#endif
6868
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006869 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00006870
Paul Bakker86f04f42013-02-14 11:20:09 +01006871 /* Actually clear after last debug message */
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006872 mbedtls_platform_zeroize( ssl, sizeof( mbedtls_ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006873}
6874
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006875/*
6876 * Initialze mbedtls_ssl_config
6877 */
6878void mbedtls_ssl_config_init( mbedtls_ssl_config *conf )
6879{
6880 memset( conf, 0, sizeof( mbedtls_ssl_config ) );
6881}
6882
Gilles Peskineeccd8882020-03-10 12:19:08 +01006883#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01006884static int ssl_preset_default_hashes[] = {
6885#if defined(MBEDTLS_SHA512_C)
6886 MBEDTLS_MD_SHA512,
6887 MBEDTLS_MD_SHA384,
6888#endif
6889#if defined(MBEDTLS_SHA256_C)
6890 MBEDTLS_MD_SHA256,
6891 MBEDTLS_MD_SHA224,
6892#endif
Gilles Peskine5d2511c2017-05-12 13:16:40 +02006893#if defined(MBEDTLS_SHA1_C) && defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01006894 MBEDTLS_MD_SHA1,
6895#endif
6896 MBEDTLS_MD_NONE
6897};
Simon Butcherc97b6972015-12-27 23:48:17 +00006898#endif
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01006899
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006900static int ssl_preset_suiteb_ciphersuites[] = {
6901 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
6902 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
6903 0
6904};
6905
Gilles Peskineeccd8882020-03-10 12:19:08 +01006906#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006907static int ssl_preset_suiteb_hashes[] = {
6908 MBEDTLS_MD_SHA256,
6909 MBEDTLS_MD_SHA384,
6910 MBEDTLS_MD_NONE
6911};
6912#endif
6913
6914#if defined(MBEDTLS_ECP_C)
6915static mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = {
Jaeden Amerod4311042019-06-03 08:27:16 +01006916#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006917 MBEDTLS_ECP_DP_SECP256R1,
Jaeden Amerod4311042019-06-03 08:27:16 +01006918#endif
6919#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006920 MBEDTLS_ECP_DP_SECP384R1,
Jaeden Amerod4311042019-06-03 08:27:16 +01006921#endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006922 MBEDTLS_ECP_DP_NONE
6923};
6924#endif
6925
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006926/*
Tillmann Karras588ad502015-09-25 04:27:22 +02006927 * Load default in mbedtls_ssl_config
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006928 */
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02006929int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006930 int endpoint, int transport, int preset )
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006931{
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02006932#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Janos Follath865b3eb2019-12-16 11:46:15 +00006933 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02006934#endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006935
Manuel Pégourié-Gonnard0de074f2015-05-14 12:58:01 +02006936 /* Use the functions here so that they are covered in tests,
6937 * but otherwise access member directly for efficiency */
6938 mbedtls_ssl_conf_endpoint( conf, endpoint );
6939 mbedtls_ssl_conf_transport( conf, transport );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006940
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006941 /*
6942 * Things that are common to all presets
6943 */
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02006944#if defined(MBEDTLS_SSL_CLI_C)
6945 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
6946 {
6947 conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
6948#if defined(MBEDTLS_SSL_SESSION_TICKETS)
6949 conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED;
6950#endif
6951 }
6952#endif
6953
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02006954#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006955 conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED;
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02006956#endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006957
6958#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
6959 conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
6960#endif
6961
6962#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
6963 conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
6964#endif
6965
Manuel Pégourié-Gonnard17eab2b2015-05-05 16:34:53 +01006966#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
6967 conf->cbc_record_splitting = MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED;
6968#endif
6969
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02006970#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006971 conf->f_cookie_write = ssl_cookie_write_dummy;
6972 conf->f_cookie_check = ssl_cookie_check_dummy;
6973#endif
6974
6975#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6976 conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
6977#endif
6978
Janos Follath088ce432017-04-10 12:42:31 +01006979#if defined(MBEDTLS_SSL_SRV_C)
6980 conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED;
6981#endif
6982
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006983#if defined(MBEDTLS_SSL_PROTO_DTLS)
6984 conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
6985 conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
6986#endif
6987
6988#if defined(MBEDTLS_SSL_RENEGOTIATION)
6989 conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
Andres AG2196c7f2016-12-15 17:01:16 +00006990 memset( conf->renego_period, 0x00, 2 );
6991 memset( conf->renego_period + 2, 0xFF, 6 );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006992#endif
6993
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006994#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
6995 if( endpoint == MBEDTLS_SSL_IS_SERVER )
6996 {
Hanno Becker00d0a682017-10-04 13:14:29 +01006997 const unsigned char dhm_p[] =
6998 MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN;
6999 const unsigned char dhm_g[] =
7000 MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN;
7001
Hanno Beckera90658f2017-10-04 15:29:08 +01007002 if ( ( ret = mbedtls_ssl_conf_dh_param_bin( conf,
7003 dhm_p, sizeof( dhm_p ),
7004 dhm_g, sizeof( dhm_g ) ) ) != 0 )
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007005 {
7006 return( ret );
7007 }
7008 }
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02007009#endif
7010
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007011 /*
7012 * Preset-specific defaults
7013 */
7014 switch( preset )
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007015 {
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007016 /*
7017 * NSA Suite B
7018 */
7019 case MBEDTLS_SSL_PRESET_SUITEB:
7020 conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
7021 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */
7022 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
7023 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
7024
7025 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
7026 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
7027 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
7028 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
7029 ssl_preset_suiteb_ciphersuites;
7030
7031#if defined(MBEDTLS_X509_CRT_PARSE_C)
7032 conf->cert_profile = &mbedtls_x509_crt_profile_suiteb;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007033#endif
7034
Gilles Peskineeccd8882020-03-10 12:19:08 +01007035#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007036 conf->sig_hashes = ssl_preset_suiteb_hashes;
7037#endif
7038
7039#if defined(MBEDTLS_ECP_C)
7040 conf->curve_list = ssl_preset_suiteb_curves;
7041#endif
Manuel Pégourié-Gonnardc98204e2015-08-11 04:21:01 +02007042 break;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007043
7044 /*
7045 * Default
7046 */
7047 default:
Ron Eldor5e9f14d2017-05-28 10:46:38 +03007048 conf->min_major_ver = ( MBEDTLS_SSL_MIN_MAJOR_VERSION >
7049 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION ) ?
7050 MBEDTLS_SSL_MIN_MAJOR_VERSION :
7051 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION;
7052 conf->min_minor_ver = ( MBEDTLS_SSL_MIN_MINOR_VERSION >
7053 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION ) ?
7054 MBEDTLS_SSL_MIN_MINOR_VERSION :
7055 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007056 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
7057 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
7058
7059#if defined(MBEDTLS_SSL_PROTO_DTLS)
7060 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
7061 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_2;
7062#endif
7063
7064 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
7065 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
7066 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
7067 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
7068 mbedtls_ssl_list_ciphersuites();
7069
7070#if defined(MBEDTLS_X509_CRT_PARSE_C)
7071 conf->cert_profile = &mbedtls_x509_crt_profile_default;
7072#endif
7073
Gilles Peskineeccd8882020-03-10 12:19:08 +01007074#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01007075 conf->sig_hashes = ssl_preset_default_hashes;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02007076#endif
7077
7078#if defined(MBEDTLS_ECP_C)
7079 conf->curve_list = mbedtls_ecp_grp_id_list();
7080#endif
7081
7082#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
7083 conf->dhm_min_bitlen = 1024;
7084#endif
7085 }
7086
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007087 return( 0 );
7088}
7089
7090/*
7091 * Free mbedtls_ssl_config
7092 */
7093void mbedtls_ssl_config_free( mbedtls_ssl_config *conf )
7094{
7095#if defined(MBEDTLS_DHM_C)
7096 mbedtls_mpi_free( &conf->dhm_P );
7097 mbedtls_mpi_free( &conf->dhm_G );
7098#endif
7099
Gilles Peskineeccd8882020-03-10 12:19:08 +01007100#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007101 if( conf->psk != NULL )
7102 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05007103 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007104 mbedtls_free( conf->psk );
Azim Khan27e8a122018-03-21 14:24:11 +00007105 conf->psk = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007106 conf->psk_len = 0;
junyeonLEE316b1622017-12-20 16:29:30 +09007107 }
7108
7109 if( conf->psk_identity != NULL )
7110 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05007111 mbedtls_platform_zeroize( conf->psk_identity, conf->psk_identity_len );
junyeonLEE316b1622017-12-20 16:29:30 +09007112 mbedtls_free( conf->psk_identity );
Azim Khan27e8a122018-03-21 14:24:11 +00007113 conf->psk_identity = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007114 conf->psk_identity_len = 0;
7115 }
7116#endif
7117
7118#if defined(MBEDTLS_X509_CRT_PARSE_C)
7119 ssl_key_cert_free( conf->key_cert );
7120#endif
7121
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05007122 mbedtls_platform_zeroize( conf, sizeof( mbedtls_ssl_config ) );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02007123}
7124
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02007125#if defined(MBEDTLS_PK_C) && \
7126 ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007127/*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007128 * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007129 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007130unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007131{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007132#if defined(MBEDTLS_RSA_C)
7133 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) )
7134 return( MBEDTLS_SSL_SIG_RSA );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007135#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007136#if defined(MBEDTLS_ECDSA_C)
7137 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) )
7138 return( MBEDTLS_SSL_SIG_ECDSA );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007139#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007140 return( MBEDTLS_SSL_SIG_ANON );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02007141}
7142
Hanno Becker7e5437a2017-04-28 17:15:26 +01007143unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type )
7144{
7145 switch( type ) {
7146 case MBEDTLS_PK_RSA:
7147 return( MBEDTLS_SSL_SIG_RSA );
7148 case MBEDTLS_PK_ECDSA:
7149 case MBEDTLS_PK_ECKEY:
7150 return( MBEDTLS_SSL_SIG_ECDSA );
7151 default:
7152 return( MBEDTLS_SSL_SIG_ANON );
7153 }
7154}
7155
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007156mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig )
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007157{
7158 switch( sig )
7159 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007160#if defined(MBEDTLS_RSA_C)
7161 case MBEDTLS_SSL_SIG_RSA:
7162 return( MBEDTLS_PK_RSA );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007163#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007164#if defined(MBEDTLS_ECDSA_C)
7165 case MBEDTLS_SSL_SIG_ECDSA:
7166 return( MBEDTLS_PK_ECDSA );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007167#endif
7168 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007169 return( MBEDTLS_PK_NONE );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007170 }
7171}
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02007172#endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007173
Hanno Becker7e5437a2017-04-28 17:15:26 +01007174#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
Gilles Peskineeccd8882020-03-10 12:19:08 +01007175 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01007176
7177/* Find an entry in a signature-hash set matching a given hash algorithm. */
7178mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set,
7179 mbedtls_pk_type_t sig_alg )
7180{
7181 switch( sig_alg )
7182 {
7183 case MBEDTLS_PK_RSA:
7184 return( set->rsa );
7185 case MBEDTLS_PK_ECDSA:
7186 return( set->ecdsa );
7187 default:
7188 return( MBEDTLS_MD_NONE );
7189 }
7190}
7191
7192/* Add a signature-hash-pair to a signature-hash set */
7193void mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set,
7194 mbedtls_pk_type_t sig_alg,
7195 mbedtls_md_type_t md_alg )
7196{
7197 switch( sig_alg )
7198 {
7199 case MBEDTLS_PK_RSA:
7200 if( set->rsa == MBEDTLS_MD_NONE )
7201 set->rsa = md_alg;
7202 break;
7203
7204 case MBEDTLS_PK_ECDSA:
7205 if( set->ecdsa == MBEDTLS_MD_NONE )
7206 set->ecdsa = md_alg;
7207 break;
7208
7209 default:
7210 break;
7211 }
7212}
7213
7214/* Allow exactly one hash algorithm for each signature. */
7215void mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set,
7216 mbedtls_md_type_t md_alg )
7217{
7218 set->rsa = md_alg;
7219 set->ecdsa = md_alg;
7220}
7221
7222#endif /* MBEDTLS_SSL_PROTO_TLS1_2) &&
Gilles Peskineeccd8882020-03-10 12:19:08 +01007223 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01007224
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02007225/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007226 * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02007227 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007228mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash )
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007229{
7230 switch( hash )
7231 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007232#if defined(MBEDTLS_MD5_C)
7233 case MBEDTLS_SSL_HASH_MD5:
7234 return( MBEDTLS_MD_MD5 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007235#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007236#if defined(MBEDTLS_SHA1_C)
7237 case MBEDTLS_SSL_HASH_SHA1:
7238 return( MBEDTLS_MD_SHA1 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007239#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007240#if defined(MBEDTLS_SHA256_C)
7241 case MBEDTLS_SSL_HASH_SHA224:
7242 return( MBEDTLS_MD_SHA224 );
7243 case MBEDTLS_SSL_HASH_SHA256:
7244 return( MBEDTLS_MD_SHA256 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007245#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007246#if defined(MBEDTLS_SHA512_C)
7247 case MBEDTLS_SSL_HASH_SHA384:
7248 return( MBEDTLS_MD_SHA384 );
7249 case MBEDTLS_SSL_HASH_SHA512:
7250 return( MBEDTLS_MD_SHA512 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007251#endif
7252 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007253 return( MBEDTLS_MD_NONE );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02007254 }
7255}
7256
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007257/*
7258 * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX
7259 */
7260unsigned char mbedtls_ssl_hash_from_md_alg( int md )
7261{
7262 switch( md )
7263 {
7264#if defined(MBEDTLS_MD5_C)
7265 case MBEDTLS_MD_MD5:
7266 return( MBEDTLS_SSL_HASH_MD5 );
7267#endif
7268#if defined(MBEDTLS_SHA1_C)
7269 case MBEDTLS_MD_SHA1:
7270 return( MBEDTLS_SSL_HASH_SHA1 );
7271#endif
7272#if defined(MBEDTLS_SHA256_C)
7273 case MBEDTLS_MD_SHA224:
7274 return( MBEDTLS_SSL_HASH_SHA224 );
7275 case MBEDTLS_MD_SHA256:
7276 return( MBEDTLS_SSL_HASH_SHA256 );
7277#endif
7278#if defined(MBEDTLS_SHA512_C)
7279 case MBEDTLS_MD_SHA384:
7280 return( MBEDTLS_SSL_HASH_SHA384 );
7281 case MBEDTLS_MD_SHA512:
7282 return( MBEDTLS_SSL_HASH_SHA512 );
7283#endif
7284 default:
7285 return( MBEDTLS_SSL_HASH_NONE );
7286 }
7287}
7288
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02007289#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007290/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007291 * Check if a curve proposed by the peer is in our list.
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02007292 * Return 0 if we're willing to use it, -1 otherwise.
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007293 */
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02007294int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007295{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007296 const mbedtls_ecp_group_id *gid;
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007297
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02007298 if( ssl->conf->curve_list == NULL )
7299 return( -1 );
7300
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02007301 for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007302 if( *gid == grp_id )
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02007303 return( 0 );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007304
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02007305 return( -1 );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01007306}
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02007307#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007308
Gilles Peskineeccd8882020-03-10 12:19:08 +01007309#if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007310/*
7311 * Check if a hash proposed by the peer is in our list.
7312 * Return 0 if we're willing to use it, -1 otherwise.
7313 */
7314int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl,
7315 mbedtls_md_type_t md )
7316{
7317 const int *cur;
7318
7319 if( ssl->conf->sig_hashes == NULL )
7320 return( -1 );
7321
7322 for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ )
7323 if( *cur == (int) md )
7324 return( 0 );
7325
7326 return( -1 );
7327}
Gilles Peskineeccd8882020-03-10 12:19:08 +01007328#endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02007329
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007330#if defined(MBEDTLS_X509_CRT_PARSE_C)
7331int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,
7332 const mbedtls_ssl_ciphersuite_t *ciphersuite,
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007333 int cert_endpoint,
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02007334 uint32_t *flags )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007335{
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007336 int ret = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007337#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007338 int usage = 0;
7339#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007340#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007341 const char *ext_oid;
7342 size_t ext_len;
7343#endif
7344
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007345#if !defined(MBEDTLS_X509_CHECK_KEY_USAGE) && \
7346 !defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007347 ((void) cert);
7348 ((void) cert_endpoint);
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007349 ((void) flags);
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007350#endif
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007351
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007352#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
7353 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007354 {
7355 /* Server part of the key exchange */
7356 switch( ciphersuite->key_exchange )
7357 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007358 case MBEDTLS_KEY_EXCHANGE_RSA:
7359 case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01007360 usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007361 break;
7362
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007363 case MBEDTLS_KEY_EXCHANGE_DHE_RSA:
7364 case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
7365 case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
7366 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007367 break;
7368
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007369 case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
7370 case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01007371 usage = MBEDTLS_X509_KU_KEY_AGREEMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007372 break;
7373
7374 /* Don't use default: we want warnings when adding new values */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007375 case MBEDTLS_KEY_EXCHANGE_NONE:
7376 case MBEDTLS_KEY_EXCHANGE_PSK:
7377 case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
7378 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
Manuel Pégourié-Gonnard557535d2015-09-15 17:53:32 +02007379 case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007380 usage = 0;
7381 }
7382 }
7383 else
7384 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007385 /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */
7386 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007387 }
7388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007389 if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 )
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007390 {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01007391 *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007392 ret = -1;
7393 }
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007394#else
7395 ((void) ciphersuite);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007396#endif /* MBEDTLS_X509_CHECK_KEY_USAGE */
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007397
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007398#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
7399 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007400 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007401 ext_oid = MBEDTLS_OID_SERVER_AUTH;
7402 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH );
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007403 }
7404 else
7405 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007406 ext_oid = MBEDTLS_OID_CLIENT_AUTH;
7407 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH );
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007408 }
7409
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007410 if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 )
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007411 {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01007412 *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007413 ret = -1;
7414 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007415#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02007416
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01007417 return( ret );
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02007418}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007419#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3a306b92014-04-29 15:11:17 +02007420
Simon Butcher99000142016-10-13 17:21:01 +01007421int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md )
7422{
7423#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
7424 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
7425 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
7426
7427 switch( md )
7428 {
7429#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
7430#if defined(MBEDTLS_MD5_C)
7431 case MBEDTLS_SSL_HASH_MD5:
Janos Follath182013f2016-10-25 10:50:22 +01007432 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
Simon Butcher99000142016-10-13 17:21:01 +01007433#endif
7434#if defined(MBEDTLS_SHA1_C)
7435 case MBEDTLS_SSL_HASH_SHA1:
7436 ssl->handshake->calc_verify = ssl_calc_verify_tls;
7437 break;
7438#endif
7439#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
7440#if defined(MBEDTLS_SHA512_C)
7441 case MBEDTLS_SSL_HASH_SHA384:
7442 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384;
7443 break;
7444#endif
7445#if defined(MBEDTLS_SHA256_C)
7446 case MBEDTLS_SSL_HASH_SHA256:
7447 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256;
7448 break;
7449#endif
7450 default:
7451 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
7452 }
7453
7454 return 0;
7455#else /* !MBEDTLS_SSL_PROTO_TLS1_2 */
7456 (void) ssl;
7457 (void) md;
7458
7459 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
7460#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
7461}
7462
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007463#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
7464 defined(MBEDTLS_SSL_PROTO_TLS1_1)
7465int mbedtls_ssl_get_key_exchange_md_ssl_tls( mbedtls_ssl_context *ssl,
7466 unsigned char *output,
7467 unsigned char *data, size_t data_len )
7468{
7469 int ret = 0;
7470 mbedtls_md5_context mbedtls_md5;
7471 mbedtls_sha1_context mbedtls_sha1;
7472
7473 mbedtls_md5_init( &mbedtls_md5 );
7474 mbedtls_sha1_init( &mbedtls_sha1 );
7475
7476 /*
7477 * digitally-signed struct {
7478 * opaque md5_hash[16];
7479 * opaque sha_hash[20];
7480 * };
7481 *
7482 * md5_hash
7483 * MD5(ClientHello.random + ServerHello.random
7484 * + ServerParams);
7485 * sha_hash
7486 * SHA(ClientHello.random + ServerHello.random
7487 * + ServerParams);
7488 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007489 if( ( ret = mbedtls_md5_starts_ret( &mbedtls_md5 ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007490 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007491 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_starts_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007492 goto exit;
7493 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007494 if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007495 ssl->handshake->randbytes, 64 ) ) != 0 )
7496 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007497 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007498 goto exit;
7499 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007500 if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5, data, data_len ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007501 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007502 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007503 goto exit;
7504 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007505 if( ( ret = mbedtls_md5_finish_ret( &mbedtls_md5, output ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007506 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007507 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_finish_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007508 goto exit;
7509 }
7510
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007511 if( ( ret = mbedtls_sha1_starts_ret( &mbedtls_sha1 ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007512 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007513 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_starts_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007514 goto exit;
7515 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007516 if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007517 ssl->handshake->randbytes, 64 ) ) != 0 )
7518 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007519 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007520 goto exit;
7521 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007522 if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1, data,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007523 data_len ) ) != 0 )
7524 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007525 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007526 goto exit;
7527 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007528 if( ( ret = mbedtls_sha1_finish_ret( &mbedtls_sha1,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007529 output + 16 ) ) != 0 )
7530 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01007531 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_finish_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007532 goto exit;
7533 }
7534
7535exit:
7536 mbedtls_md5_free( &mbedtls_md5 );
7537 mbedtls_sha1_free( &mbedtls_sha1 );
7538
7539 if( ret != 0 )
7540 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7541 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7542
7543 return( ret );
7544
7545}
7546#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
7547 MBEDTLS_SSL_PROTO_TLS1_1 */
7548
7549#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
7550 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007551
7552#if defined(MBEDTLS_USE_PSA_CRYPTO)
7553int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
7554 unsigned char *hash, size_t *hashlen,
7555 unsigned char *data, size_t data_len,
7556 mbedtls_md_type_t md_alg )
7557{
Andrzej Kurek814feff2019-01-14 04:35:19 -05007558 psa_status_t status;
Jaeden Amero34973232019-02-20 10:32:28 +00007559 psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT;
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007560 psa_algorithm_t hash_alg = mbedtls_psa_translate_md( md_alg );
7561
Hanno Becker4c8c7aa2019-04-10 09:25:41 +01007562 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Perform PSA-based computation of digest of ServerKeyExchange" ) );
Andrzej Kurek814feff2019-01-14 04:35:19 -05007563
7564 if( ( status = psa_hash_setup( &hash_operation,
7565 hash_alg ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007566 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05007567 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_setup", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007568 goto exit;
7569 }
7570
Andrzej Kurek814feff2019-01-14 04:35:19 -05007571 if( ( status = psa_hash_update( &hash_operation, ssl->handshake->randbytes,
7572 64 ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007573 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05007574 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_update", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007575 goto exit;
7576 }
7577
Andrzej Kurek814feff2019-01-14 04:35:19 -05007578 if( ( status = psa_hash_update( &hash_operation,
7579 data, data_len ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007580 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05007581 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_update", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007582 goto exit;
7583 }
7584
Andrzej Kurek814feff2019-01-14 04:35:19 -05007585 if( ( status = psa_hash_finish( &hash_operation, hash, MBEDTLS_MD_MAX_SIZE,
7586 hashlen ) ) != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007587 {
Andrzej Kurek814feff2019-01-14 04:35:19 -05007588 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_finish", status );
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007589 goto exit;
7590 }
7591
7592exit:
Andrzej Kurek814feff2019-01-14 04:35:19 -05007593 if( status != PSA_SUCCESS )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007594 {
7595 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7596 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Andrzej Kurek814feff2019-01-14 04:35:19 -05007597 switch( status )
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007598 {
7599 case PSA_ERROR_NOT_SUPPORTED:
7600 return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE );
Andrzej Kurek814feff2019-01-14 04:35:19 -05007601 case PSA_ERROR_BAD_STATE: /* Intentional fallthrough */
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007602 case PSA_ERROR_BUFFER_TOO_SMALL:
7603 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
7604 case PSA_ERROR_INSUFFICIENT_MEMORY:
7605 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
7606 default:
7607 return( MBEDTLS_ERR_MD_HW_ACCEL_FAILED );
7608 }
7609 }
7610 return( 0 );
7611}
7612
7613#else
7614
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007615int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
Gilles Peskineca1d7422018-04-24 11:53:22 +02007616 unsigned char *hash, size_t *hashlen,
7617 unsigned char *data, size_t data_len,
7618 mbedtls_md_type_t md_alg )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007619{
7620 int ret = 0;
7621 mbedtls_md_context_t ctx;
7622 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );
Gilles Peskineca1d7422018-04-24 11:53:22 +02007623 *hashlen = mbedtls_md_get_size( md_info );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007624
Hanno Becker4c8c7aa2019-04-10 09:25:41 +01007625 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Perform mbedtls-based computation of digest of ServerKeyExchange" ) );
Andrzej Kurek814feff2019-01-14 04:35:19 -05007626
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007627 mbedtls_md_init( &ctx );
7628
7629 /*
7630 * digitally-signed struct {
7631 * opaque client_random[32];
7632 * opaque server_random[32];
7633 * ServerDHParams params;
7634 * };
7635 */
7636 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
7637 {
7638 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
7639 goto exit;
7640 }
7641 if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 )
7642 {
7643 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_starts", ret );
7644 goto exit;
7645 }
7646 if( ( ret = mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 ) ) != 0 )
7647 {
7648 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
7649 goto exit;
7650 }
7651 if( ( ret = mbedtls_md_update( &ctx, data, data_len ) ) != 0 )
7652 {
7653 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
7654 goto exit;
7655 }
Gilles Peskineca1d7422018-04-24 11:53:22 +02007656 if( ( ret = mbedtls_md_finish( &ctx, hash ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007657 {
7658 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_finish", ret );
7659 goto exit;
7660 }
7661
7662exit:
7663 mbedtls_md_free( &ctx );
7664
7665 if( ret != 0 )
7666 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7667 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7668
7669 return( ret );
7670}
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05007671#endif /* MBEDTLS_USE_PSA_CRYPTO */
7672
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01007673#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
7674 MBEDTLS_SSL_PROTO_TLS1_2 */
7675
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007676#endif /* MBEDTLS_SSL_TLS_C */