blob: 0d673edf28749d79d67513e52ed990bc9799bf3f [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 shared functions
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
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 Bakkerb96f1542010-07-18 20:36:00 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000020 */
21/*
22 * The SSL 3.0 specification was drafted by Netscape in 1996,
23 * and became an IETF standard in 1999.
24 *
25 * http://wp.netscape.com/eng/ssl3/
26 * http://www.ietf.org/rfc/rfc2246.txt
27 * http://www.ietf.org/rfc/rfc4346.txt
28 */
29
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020030#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000031#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020032#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020033#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020034#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036#if defined(MBEDTLS_SSL_TLS_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000037
SimonBd5800b72016-04-26 07:43:27 +010038#if defined(MBEDTLS_PLATFORM_C)
39#include "mbedtls/platform.h"
40#else
41#include <stdlib.h>
42#define mbedtls_calloc calloc
43#define mbedtls_free free
SimonBd5800b72016-04-26 07:43:27 +010044#endif
45
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000046#include "mbedtls/debug.h"
47#include "mbedtls/ssl.h"
Manuel Pégourié-Gonnard5e94dde2015-05-26 11:57:05 +020048#include "mbedtls/ssl_internal.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050049#include "mbedtls/platform_util.h"
Paul Bakker0be444a2013-08-27 21:55:01 +020050
Rich Evans00ab4702015-02-06 13:43:58 +000051#include <string.h>
52
Janos Follath23bdca02016-10-07 14:47:14 +010053#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000054#include "mbedtls/oid.h"
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +020055#endif
56
Hanno Becker2a43f6f2018-08-10 11:12:52 +010057static void ssl_reset_in_out_pointers( mbedtls_ssl_context *ssl );
Hanno Beckercd9dcda2018-08-28 17:18:56 +010058static uint32_t ssl_get_hs_total_len( mbedtls_ssl_context const *ssl );
Hanno Becker2a43f6f2018-08-10 11:12:52 +010059
Manuel Pégourié-Gonnard5afb1672014-02-16 18:33:22 +010060/* Length of the "epoch" field in the record header */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020061static inline size_t ssl_ep_len( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard5afb1672014-02-16 18:33:22 +010062{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020063#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +020064 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard5afb1672014-02-16 18:33:22 +010065 return( 2 );
Manuel Pégourié-Gonnard34c10112014-03-25 13:36:22 +010066#else
67 ((void) ssl);
Manuel Pégourié-Gonnard5afb1672014-02-16 18:33:22 +010068#endif
69 return( 0 );
70}
71
Manuel Pégourié-Gonnarddb2858c2014-09-29 14:04:42 +020072/*
73 * Start a timer.
74 * Passing millisecs = 0 cancels a running timer.
Manuel Pégourié-Gonnarddb2858c2014-09-29 14:04:42 +020075 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020076static void ssl_set_timer( mbedtls_ssl_context *ssl, uint32_t millisecs )
Manuel Pégourié-Gonnarddb2858c2014-09-29 14:04:42 +020077{
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +020078 if( ssl->f_set_timer == NULL )
79 return;
80
81 MBEDTLS_SSL_DEBUG_MSG( 3, ( "set_timer to %d ms", (int) millisecs ) );
82 ssl->f_set_timer( ssl->p_timer, millisecs / 4, millisecs );
Manuel Pégourié-Gonnarddb2858c2014-09-29 14:04:42 +020083}
84
85/*
86 * Return -1 is timer is expired, 0 if it isn't.
87 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020088static int ssl_check_timer( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarddb2858c2014-09-29 14:04:42 +020089{
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +020090 if( ssl->f_get_timer == NULL )
Manuel Pégourié-Gonnard545102e2015-05-13 17:28:43 +020091 return( 0 );
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +020092
93 if( ssl->f_get_timer( ssl->p_timer ) == 2 )
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +020094 {
95 MBEDTLS_SSL_DEBUG_MSG( 3, ( "timer expired" ) );
Manuel Pégourié-Gonnarddb2858c2014-09-29 14:04:42 +020096 return( -1 );
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +020097 }
Manuel Pégourié-Gonnarddb2858c2014-09-29 14:04:42 +020098
99 return( 0 );
100}
Manuel Pégourié-Gonnarddb2858c2014-09-29 14:04:42 +0200101
Hanno Becker5aa4e2c2018-08-06 09:26:08 +0100102static void ssl_update_out_pointers( mbedtls_ssl_context *ssl,
103 mbedtls_ssl_transform *transform );
104static void ssl_update_in_pointers( mbedtls_ssl_context *ssl,
105 mbedtls_ssl_transform *transform );
Hanno Becker67bc7c32018-08-06 11:33:50 +0100106
107#define SSL_DONT_FORCE_FLUSH 0
108#define SSL_FORCE_FLUSH 1
109
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +0200110#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker2b1e3542018-08-06 11:19:13 +0100111
Hanno Beckerba8cd672019-04-23 12:31:42 +0100112#if defined(MBEDTLS_SSL_CID)
Hanno Beckerb9e7dea2019-04-09 15:22:03 +0100113/* Top-level Connection ID API */
114
Hanno Becker07489862019-04-25 16:01:49 +0100115/* WARNING: The CID feature isn't fully implemented yet
116 * and will not be used. */
Hanno Beckerb9e7dea2019-04-09 15:22:03 +0100117int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
118 int enable,
119 unsigned char const *own_cid,
120 size_t own_cid_len )
121{
Hanno Becker07489862019-04-25 16:01:49 +0100122 ssl->negotiate_cid = enable;
123 if( enable == MBEDTLS_SSL_CID_DISABLED )
124 {
125 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Disable use of CID extension." ) );
126 return( 0 );
127 }
128 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Enable use of CID extension." ) );
129
130 if( own_cid_len > MBEDTLS_SSL_CID_IN_LEN_MAX )
131 {
132 MBEDTLS_SSL_DEBUG_MSG( 3, ( "CID too large: Maximum %u, actual %u",
133 (unsigned) MBEDTLS_SSL_CID_IN_LEN_MAX,
134 (unsigned) own_cid_len ) );
135 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
136 }
137
138 memcpy( ssl->own_cid, own_cid, own_cid_len );
139 ssl->own_cid_len = own_cid_len;
140
141 MBEDTLS_SSL_DEBUG_BUF( 3, "Own CID", own_cid, own_cid_len );
Hanno Beckerb9e7dea2019-04-09 15:22:03 +0100142 return( 0 );
143}
144
Hanno Becker8d0893d2019-04-23 12:01:20 +0100145/* WARNING: This implementation is a stub and doesn't do anything!
146 * It is included solely to allow review and coding against
147 * the new Connection CID API. */
Hanno Beckerb9e7dea2019-04-09 15:22:03 +0100148int mbedtls_ssl_get_peer_cid( mbedtls_ssl_context *ssl,
149 int *enabled,
150 unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ],
151 size_t *peer_cid_len )
152{
153 ((void) ssl);
154 ((void) peer_cid);
155 ((void) peer_cid_len);
156
157 *enabled = MBEDTLS_SSL_CID_DISABLED;
158 return( 0 );
159}
Hanno Beckerba8cd672019-04-23 12:31:42 +0100160#endif /* MBEDTLS_SSL_CID */
Hanno Beckerb9e7dea2019-04-09 15:22:03 +0100161
Hanno Beckerd5847772018-08-28 10:09:23 +0100162/* Forward declarations for functions related to message buffering. */
163static void ssl_buffering_free( mbedtls_ssl_context *ssl );
164static void ssl_buffering_free_slot( mbedtls_ssl_context *ssl,
165 uint8_t slot );
166static void ssl_free_buffered_record( mbedtls_ssl_context *ssl );
167static int ssl_load_buffered_message( mbedtls_ssl_context *ssl );
168static int ssl_load_buffered_record( mbedtls_ssl_context *ssl );
169static int ssl_buffer_message( mbedtls_ssl_context *ssl );
170static int ssl_buffer_future_record( mbedtls_ssl_context *ssl );
Hanno Beckeref7afdf2018-08-28 17:16:31 +0100171static int ssl_next_record_is_in_datagram( mbedtls_ssl_context *ssl );
Hanno Beckerd5847772018-08-28 10:09:23 +0100172
Hanno Beckera67dee22018-08-22 10:05:20 +0100173static size_t ssl_get_current_mtu( const mbedtls_ssl_context *ssl );
Hanno Becker11682cc2018-08-22 14:41:02 +0100174static size_t ssl_get_maximum_datagram_size( mbedtls_ssl_context const *ssl )
Hanno Becker2b1e3542018-08-06 11:19:13 +0100175{
Hanno Becker11682cc2018-08-22 14:41:02 +0100176 size_t mtu = ssl_get_current_mtu( ssl );
Hanno Becker2b1e3542018-08-06 11:19:13 +0100177
178 if( mtu != 0 && mtu < MBEDTLS_SSL_OUT_BUFFER_LEN )
Hanno Becker11682cc2018-08-22 14:41:02 +0100179 return( mtu );
Hanno Becker2b1e3542018-08-06 11:19:13 +0100180
181 return( MBEDTLS_SSL_OUT_BUFFER_LEN );
182}
183
Hanno Becker67bc7c32018-08-06 11:33:50 +0100184static int ssl_get_remaining_space_in_datagram( mbedtls_ssl_context const *ssl )
185{
Hanno Becker11682cc2018-08-22 14:41:02 +0100186 size_t const bytes_written = ssl->out_left;
187 size_t const mtu = ssl_get_maximum_datagram_size( ssl );
Hanno Becker67bc7c32018-08-06 11:33:50 +0100188
189 /* Double-check that the write-index hasn't gone
190 * past what we can transmit in a single datagram. */
Hanno Becker11682cc2018-08-22 14:41:02 +0100191 if( bytes_written > mtu )
Hanno Becker67bc7c32018-08-06 11:33:50 +0100192 {
193 /* Should never happen... */
194 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
195 }
196
197 return( (int) ( mtu - bytes_written ) );
198}
199
200static int ssl_get_remaining_payload_in_datagram( mbedtls_ssl_context const *ssl )
201{
202 int ret;
203 size_t remaining, expansion;
Andrzej Kurek748face2018-10-11 07:20:19 -0400204 size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
Hanno Becker67bc7c32018-08-06 11:33:50 +0100205
206#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
207 const size_t mfl = mbedtls_ssl_get_max_frag_len( ssl );
208
209 if( max_len > mfl )
210 max_len = mfl;
Hanno Beckerf4b010e2018-08-24 10:47:29 +0100211
212 /* By the standard (RFC 6066 Sect. 4), the MFL extension
213 * only limits the maximum record payload size, so in theory
214 * we would be allowed to pack multiple records of payload size
215 * MFL into a single datagram. However, this would mean that there's
216 * no way to explicitly communicate MTU restrictions to the peer.
217 *
218 * The following reduction of max_len makes sure that we never
219 * write datagrams larger than MFL + Record Expansion Overhead.
220 */
221 if( max_len <= ssl->out_left )
222 return( 0 );
223
224 max_len -= ssl->out_left;
Hanno Becker67bc7c32018-08-06 11:33:50 +0100225#endif
226
227 ret = ssl_get_remaining_space_in_datagram( ssl );
228 if( ret < 0 )
229 return( ret );
230 remaining = (size_t) ret;
231
232 ret = mbedtls_ssl_get_record_expansion( ssl );
233 if( ret < 0 )
234 return( ret );
235 expansion = (size_t) ret;
236
237 if( remaining <= expansion )
238 return( 0 );
239
240 remaining -= expansion;
241 if( remaining >= max_len )
242 remaining = max_len;
243
244 return( (int) remaining );
245}
246
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200247/*
248 * Double the retransmit timeout value, within the allowed range,
249 * returning -1 if the maximum value has already been reached.
250 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200251static int ssl_double_retransmit_timeout( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200252{
253 uint32_t new_timeout;
254
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200255 if( ssl->handshake->retransmit_timeout >= ssl->conf->hs_timeout_max )
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200256 return( -1 );
257
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +0200258 /* Implement the final paragraph of RFC 6347 section 4.1.1.1
259 * in the following way: after the initial transmission and a first
260 * retransmission, back off to a temporary estimated MTU of 508 bytes.
261 * This value is guaranteed to be deliverable (if not guaranteed to be
262 * delivered) of any compliant IPv4 (and IPv6) network, and should work
263 * on most non-IP stacks too. */
264 if( ssl->handshake->retransmit_timeout != ssl->conf->hs_timeout_min )
Andrzej Kurek6290dae2018-10-05 08:06:01 -0400265 {
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +0200266 ssl->handshake->mtu = 508;
Andrzej Kurek6290dae2018-10-05 08:06:01 -0400267 MBEDTLS_SSL_DEBUG_MSG( 2, ( "mtu autoreduction to %d bytes", ssl->handshake->mtu ) );
268 }
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +0200269
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200270 new_timeout = 2 * ssl->handshake->retransmit_timeout;
271
272 /* Avoid arithmetic overflow and range overflow */
273 if( new_timeout < ssl->handshake->retransmit_timeout ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200274 new_timeout > ssl->conf->hs_timeout_max )
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200275 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200276 new_timeout = ssl->conf->hs_timeout_max;
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200277 }
278
279 ssl->handshake->retransmit_timeout = new_timeout;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280 MBEDTLS_SSL_DEBUG_MSG( 3, ( "update timeout value to %d millisecs",
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200281 ssl->handshake->retransmit_timeout ) );
282
283 return( 0 );
284}
285
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286static void ssl_reset_retransmit_timeout( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200287{
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200288 ssl->handshake->retransmit_timeout = ssl->conf->hs_timeout_min;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200289 MBEDTLS_SSL_DEBUG_MSG( 3, ( "update timeout value to %d millisecs",
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200290 ssl->handshake->retransmit_timeout ) );
291}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200293
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200294#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200295/*
296 * Convert max_fragment_length codes to length.
297 * RFC 6066 says:
298 * enum{
299 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
300 * } MaxFragmentLength;
301 * and we add 0 -> extension unused
302 */
Angus Grattond8213d02016-05-25 20:56:48 +1000303static unsigned int ssl_mfl_code_to_length( int mfl )
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200304{
Angus Grattond8213d02016-05-25 20:56:48 +1000305 switch( mfl )
306 {
307 case MBEDTLS_SSL_MAX_FRAG_LEN_NONE:
308 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
309 case MBEDTLS_SSL_MAX_FRAG_LEN_512:
310 return 512;
311 case MBEDTLS_SSL_MAX_FRAG_LEN_1024:
312 return 1024;
313 case MBEDTLS_SSL_MAX_FRAG_LEN_2048:
314 return 2048;
315 case MBEDTLS_SSL_MAX_FRAG_LEN_4096:
316 return 4096;
317 default:
318 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
319 }
320}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200321#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200322
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +0200323#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200324static int ssl_session_copy( mbedtls_ssl_session *dst, const mbedtls_ssl_session *src )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200325{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326 mbedtls_ssl_session_free( dst );
327 memcpy( dst, src, sizeof( mbedtls_ssl_session ) );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200328
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200330 if( src->peer_cert != NULL )
331 {
Paul Bakker2292d1f2013-09-15 17:06:49 +0200332 int ret;
333
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200334 dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200335 if( dst->peer_cert == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200336 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200338 mbedtls_x509_crt_init( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200339
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200340 if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p,
Manuel Pégourié-Gonnard4d2a8eb2014-06-13 20:33:27 +0200341 src->peer_cert->raw.len ) ) != 0 )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200342 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200343 mbedtls_free( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200344 dst->peer_cert = NULL;
345 return( ret );
346 }
347 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200348#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200349
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +0200350#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200351 if( src->ticket != NULL )
352 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200353 dst->ticket = mbedtls_calloc( 1, src->ticket_len );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200354 if( dst->ticket == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +0200355 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200356
357 memcpy( dst->ticket, src->ticket, src->ticket_len );
358 }
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +0200359#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200360
361 return( 0 );
362}
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +0200363#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200364
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200365#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
366int (*mbedtls_ssl_hw_record_init)( mbedtls_ssl_context *ssl,
Paul Bakker9af723c2014-05-01 13:03:14 +0200367 const unsigned char *key_enc, const unsigned char *key_dec,
368 size_t keylen,
369 const unsigned char *iv_enc, const unsigned char *iv_dec,
370 size_t ivlen,
371 const unsigned char *mac_enc, const unsigned char *mac_dec,
Paul Bakker66d5d072014-06-17 16:39:18 +0200372 size_t maclen ) = NULL;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200373int (*mbedtls_ssl_hw_record_activate)( mbedtls_ssl_context *ssl, int direction) = NULL;
374int (*mbedtls_ssl_hw_record_reset)( mbedtls_ssl_context *ssl ) = NULL;
375int (*mbedtls_ssl_hw_record_write)( mbedtls_ssl_context *ssl ) = NULL;
376int (*mbedtls_ssl_hw_record_read)( mbedtls_ssl_context *ssl ) = NULL;
377int (*mbedtls_ssl_hw_record_finish)( mbedtls_ssl_context *ssl ) = NULL;
378#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
Paul Bakker05ef8352012-05-08 09:17:57 +0000379
Paul Bakker5121ce52009-01-03 21:22:43 +0000380/*
381 * Key material generation
382 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383#if defined(MBEDTLS_SSL_PROTO_SSL3)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200384static int ssl3_prf( const unsigned char *secret, size_t slen,
385 const char *label,
386 const unsigned char *random, size_t rlen,
Paul Bakker5f70b252012-09-13 14:23:06 +0000387 unsigned char *dstbuf, size_t dlen )
388{
Andres Amaya Garcia33952502017-07-20 16:29:16 +0100389 int ret = 0;
Paul Bakker5f70b252012-09-13 14:23:06 +0000390 size_t i;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +0200391 mbedtls_md5_context md5;
392 mbedtls_sha1_context sha1;
Paul Bakker5f70b252012-09-13 14:23:06 +0000393 unsigned char padding[16];
394 unsigned char sha1sum[20];
395 ((void)label);
396
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +0200397 mbedtls_md5_init( &md5 );
398 mbedtls_sha1_init( &sha1 );
Paul Bakker5b4af392014-06-26 12:09:34 +0200399
Paul Bakker5f70b252012-09-13 14:23:06 +0000400 /*
401 * SSLv3:
402 * block =
403 * MD5( secret + SHA1( 'A' + secret + random ) ) +
404 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
405 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
406 * ...
407 */
408 for( i = 0; i < dlen / 16; i++ )
409 {
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200410 memset( padding, (unsigned char) ('A' + i), 1 + i );
Paul Bakker5f70b252012-09-13 14:23:06 +0000411
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100412 if( ( ret = mbedtls_sha1_starts_ret( &sha1 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100413 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100414 if( ( ret = mbedtls_sha1_update_ret( &sha1, padding, 1 + i ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100415 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100416 if( ( ret = mbedtls_sha1_update_ret( &sha1, secret, slen ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100417 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100418 if( ( ret = mbedtls_sha1_update_ret( &sha1, random, rlen ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100419 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100420 if( ( ret = mbedtls_sha1_finish_ret( &sha1, sha1sum ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100421 goto exit;
Paul Bakker5f70b252012-09-13 14:23:06 +0000422
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100423 if( ( ret = mbedtls_md5_starts_ret( &md5 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100424 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100425 if( ( ret = mbedtls_md5_update_ret( &md5, secret, slen ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100426 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100427 if( ( ret = mbedtls_md5_update_ret( &md5, sha1sum, 20 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100428 goto exit;
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100429 if( ( ret = mbedtls_md5_finish_ret( &md5, dstbuf + i * 16 ) ) != 0 )
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100430 goto exit;
Paul Bakker5f70b252012-09-13 14:23:06 +0000431 }
432
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100433exit:
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +0200434 mbedtls_md5_free( &md5 );
435 mbedtls_sha1_free( &sha1 );
Paul Bakker5f70b252012-09-13 14:23:06 +0000436
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500437 mbedtls_platform_zeroize( padding, sizeof( padding ) );
438 mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) );
Paul Bakker5f70b252012-09-13 14:23:06 +0000439
Andres Amaya Garcia1a607a12017-06-29 17:09:42 +0100440 return( ret );
Paul Bakker5f70b252012-09-13 14:23:06 +0000441}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200442#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5f70b252012-09-13 14:23:06 +0000443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200444#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200445static int tls1_prf( const unsigned char *secret, size_t slen,
446 const char *label,
447 const unsigned char *random, size_t rlen,
Paul Bakker23986e52011-04-24 08:57:21 +0000448 unsigned char *dstbuf, size_t dlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000449{
Paul Bakker23986e52011-04-24 08:57:21 +0000450 size_t nb, hs;
451 size_t i, j, k;
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200452 const unsigned char *S1, *S2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000453 unsigned char tmp[128];
454 unsigned char h_i[20];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200455 const mbedtls_md_info_t *md_info;
456 mbedtls_md_context_t md_ctx;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100457 int ret;
458
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200459 mbedtls_md_init( &md_ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000460
461 if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200462 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000463
464 hs = ( slen + 1 ) / 2;
465 S1 = secret;
466 S2 = secret + slen - hs;
467
468 nb = strlen( label );
469 memcpy( tmp + 20, label, nb );
470 memcpy( tmp + 20 + nb, random, rlen );
471 nb += rlen;
472
473 /*
474 * First compute P_md5(secret,label+random)[0..dlen]
475 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200476 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ) ) == NULL )
477 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7da726b2015-03-24 18:08:19 +0100478
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200479 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100480 return( ret );
481
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200482 mbedtls_md_hmac_starts( &md_ctx, S1, hs );
483 mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );
484 mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );
Paul Bakker5121ce52009-01-03 21:22:43 +0000485
486 for( i = 0; i < dlen; i += 16 )
487 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200488 mbedtls_md_hmac_reset ( &md_ctx );
489 mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 + nb );
490 mbedtls_md_hmac_finish( &md_ctx, h_i );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100491
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200492 mbedtls_md_hmac_reset ( &md_ctx );
493 mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 );
494 mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );
Paul Bakker5121ce52009-01-03 21:22:43 +0000495
496 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
497
498 for( j = 0; j < k; j++ )
499 dstbuf[i + j] = h_i[j];
500 }
501
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200502 mbedtls_md_free( &md_ctx );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100503
Paul Bakker5121ce52009-01-03 21:22:43 +0000504 /*
505 * XOR out with P_sha1(secret,label+random)[0..dlen]
506 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200507 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL )
508 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7da726b2015-03-24 18:08:19 +0100509
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200510 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100511 return( ret );
512
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200513 mbedtls_md_hmac_starts( &md_ctx, S2, hs );
514 mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );
515 mbedtls_md_hmac_finish( &md_ctx, tmp );
Paul Bakker5121ce52009-01-03 21:22:43 +0000516
517 for( i = 0; i < dlen; i += 20 )
518 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200519 mbedtls_md_hmac_reset ( &md_ctx );
520 mbedtls_md_hmac_update( &md_ctx, tmp, 20 + nb );
521 mbedtls_md_hmac_finish( &md_ctx, h_i );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100522
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200523 mbedtls_md_hmac_reset ( &md_ctx );
524 mbedtls_md_hmac_update( &md_ctx, tmp, 20 );
525 mbedtls_md_hmac_finish( &md_ctx, tmp );
Paul Bakker5121ce52009-01-03 21:22:43 +0000526
527 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
528
529 for( j = 0; j < k; j++ )
530 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
531 }
532
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200533 mbedtls_md_free( &md_ctx );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100534
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500535 mbedtls_platform_zeroize( tmp, sizeof( tmp ) );
536 mbedtls_platform_zeroize( h_i, sizeof( h_i ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000537
538 return( 0 );
539}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200540#endif /* MBEDTLS_SSL_PROTO_TLS1) || MBEDTLS_SSL_PROTO_TLS1_1 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000541
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200542#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
543static int tls_prf_generic( mbedtls_md_type_t md_type,
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100544 const unsigned char *secret, size_t slen,
545 const char *label,
546 const unsigned char *random, size_t rlen,
547 unsigned char *dstbuf, size_t dlen )
Paul Bakker1ef83d62012-04-11 12:09:53 +0000548{
549 size_t nb;
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100550 size_t i, j, k, md_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000551 unsigned char tmp[128];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200552 unsigned char h_i[MBEDTLS_MD_MAX_SIZE];
553 const mbedtls_md_info_t *md_info;
554 mbedtls_md_context_t md_ctx;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100555 int ret;
556
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200557 mbedtls_md_init( &md_ctx );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000558
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200559 if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL )
560 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100561
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200562 md_len = mbedtls_md_get_size( md_info );
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100563
564 if( sizeof( tmp ) < md_len + strlen( label ) + rlen )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200565 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000566
567 nb = strlen( label );
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100568 memcpy( tmp + md_len, label, nb );
569 memcpy( tmp + md_len + nb, random, rlen );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000570 nb += rlen;
571
572 /*
573 * Compute P_<hash>(secret, label + random)[0..dlen]
574 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200575 if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100576 return( ret );
577
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200578 mbedtls_md_hmac_starts( &md_ctx, secret, slen );
579 mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb );
580 mbedtls_md_hmac_finish( &md_ctx, tmp );
Manuel Pégourié-Gonnard7da726b2015-03-24 18:08:19 +0100581
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100582 for( i = 0; i < dlen; i += md_len )
Paul Bakker1ef83d62012-04-11 12:09:53 +0000583 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200584 mbedtls_md_hmac_reset ( &md_ctx );
585 mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb );
586 mbedtls_md_hmac_finish( &md_ctx, h_i );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100587
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200588 mbedtls_md_hmac_reset ( &md_ctx );
589 mbedtls_md_hmac_update( &md_ctx, tmp, md_len );
590 mbedtls_md_hmac_finish( &md_ctx, tmp );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000591
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100592 k = ( i + md_len > dlen ) ? dlen % md_len : md_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000593
594 for( j = 0; j < k; j++ )
595 dstbuf[i + j] = h_i[j];
596 }
597
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200598 mbedtls_md_free( &md_ctx );
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100599
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500600 mbedtls_platform_zeroize( tmp, sizeof( tmp ) );
601 mbedtls_platform_zeroize( h_i, sizeof( h_i ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000602
603 return( 0 );
604}
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100605
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200606#if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100607static int tls_prf_sha256( const unsigned char *secret, size_t slen,
608 const char *label,
609 const unsigned char *random, size_t rlen,
610 unsigned char *dstbuf, size_t dlen )
611{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200612 return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen,
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100613 label, random, rlen, dstbuf, dlen ) );
614}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200615#endif /* MBEDTLS_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000616
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200617#if defined(MBEDTLS_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200618static int tls_prf_sha384( const unsigned char *secret, size_t slen,
619 const char *label,
620 const unsigned char *random, size_t rlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000621 unsigned char *dstbuf, size_t dlen )
622{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200623 return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen,
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100624 label, random, rlen, dstbuf, dlen ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000625}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200626#endif /* MBEDTLS_SHA512_C */
627#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +0000628
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200629static void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200630
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200631#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
632 defined(MBEDTLS_SSL_PROTO_TLS1_1)
633static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *, const unsigned char *, size_t );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200634#endif
Paul Bakker380da532012-04-18 16:10:25 +0000635
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200636#if defined(MBEDTLS_SSL_PROTO_SSL3)
637static void ssl_calc_verify_ssl( mbedtls_ssl_context *, unsigned char * );
638static void ssl_calc_finished_ssl( mbedtls_ssl_context *, unsigned char *, int );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200639#endif
640
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200641#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
642static void ssl_calc_verify_tls( mbedtls_ssl_context *, unsigned char * );
643static void ssl_calc_finished_tls( mbedtls_ssl_context *, unsigned char *, int );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200644#endif
645
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200646#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
647#if defined(MBEDTLS_SHA256_C)
648static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t );
649static void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *,unsigned char * );
650static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200651#endif
Paul Bakker769075d2012-11-24 11:26:46 +0100652
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200653#if defined(MBEDTLS_SHA512_C)
654static void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t );
655static void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *, unsigned char * );
656static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int );
Paul Bakker769075d2012-11-24 11:26:46 +0100657#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200658#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000659
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +0000661{
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200662 int ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000663 unsigned char tmp[64];
Paul Bakker5121ce52009-01-03 21:22:43 +0000664 unsigned char keyblk[256];
665 unsigned char *key1;
666 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100667 unsigned char *mac_enc;
668 unsigned char *mac_dec;
Hanno Becker81c7b182017-11-09 18:39:33 +0000669 size_t mac_key_len;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200670 size_t iv_copy_len;
Hanno Beckere7f2df02017-12-27 08:17:40 +0000671 unsigned keylen;
Hanno Becker8759e162017-12-27 21:34:08 +0000672 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200673 const mbedtls_cipher_info_t *cipher_info;
674 const mbedtls_md_info_t *md_info;
Paul Bakker68884e32013-01-07 18:20:04 +0100675
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200676 mbedtls_ssl_session *session = ssl->session_negotiate;
677 mbedtls_ssl_transform *transform = ssl->transform_negotiate;
678 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Paul Bakker5121ce52009-01-03 21:22:43 +0000679
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200680 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000681
Hanno Becker3307b532017-12-27 21:37:21 +0000682#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
683 transform->encrypt_then_mac = session->encrypt_then_mac;
684#endif
685 transform->minor_ver = ssl->minor_ver;
686
Hanno Becker8759e162017-12-27 21:34:08 +0000687 ciphersuite_info = handshake->ciphersuite_info;
688 cipher_info = mbedtls_cipher_info_from_type( ciphersuite_info->cipher );
Paul Bakker68884e32013-01-07 18:20:04 +0100689 if( cipher_info == NULL )
690 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200691 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %d not found",
Hanno Becker8759e162017-12-27 21:34:08 +0000692 ciphersuite_info->cipher ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200693 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +0100694 }
695
Hanno Becker8759e162017-12-27 21:34:08 +0000696 md_info = mbedtls_md_info_from_type( ciphersuite_info->mac );
Paul Bakker68884e32013-01-07 18:20:04 +0100697 if( md_info == NULL )
698 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200699 MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_md info for %d not found",
Hanno Becker8759e162017-12-27 21:34:08 +0000700 ciphersuite_info->mac ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200701 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker68884e32013-01-07 18:20:04 +0100702 }
703
Hanno Beckerdd0afca2019-04-26 16:22:27 +0100704#if defined(MBEDTLS_SSL_CID)
705 /* Copy own and peer's CID if the use of the CID
706 * extension has been negotiated. */
707 if( ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_ENABLED )
708 {
709 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Copy CIDs into SSL transform" ) );
710 transform->in_cid_len = ssl->own_cid_len;
711 transform->out_cid_len = ssl->handshake->peer_cid_len;
712 memcpy( transform->in_cid, ssl->own_cid, ssl->own_cid_len );
713 memcpy( transform->out_cid, ssl->handshake->peer_cid,
714 ssl->handshake->peer_cid_len );
715
716 MBEDTLS_SSL_DEBUG_BUF( 3, "Outgoing CID", transform->out_cid,
717 transform->out_cid_len );
718 MBEDTLS_SSL_DEBUG_BUF( 3, "Ingoing CID", transform->in_cid,
719 transform->in_cid_len );
720 }
721#endif /* MBEDTLS_SSL_CID */
722
Paul Bakker5121ce52009-01-03 21:22:43 +0000723 /*
Paul Bakkerca4ab492012-04-18 14:23:57 +0000724 * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
Paul Bakker1ef83d62012-04-11 12:09:53 +0000725 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200726#if defined(MBEDTLS_SSL_PROTO_SSL3)
727 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000728 {
Paul Bakker48916f92012-09-16 19:57:18 +0000729 handshake->tls_prf = ssl3_prf;
730 handshake->calc_verify = ssl_calc_verify_ssl;
731 handshake->calc_finished = ssl_calc_finished_ssl;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000732 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200733 else
734#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200735#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
736 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000737 {
Paul Bakker48916f92012-09-16 19:57:18 +0000738 handshake->tls_prf = tls1_prf;
739 handshake->calc_verify = ssl_calc_verify_tls;
740 handshake->calc_finished = ssl_calc_finished_tls;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000741 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200742 else
743#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200744#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
745#if defined(MBEDTLS_SHA512_C)
746 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
Hanno Becker8759e162017-12-27 21:34:08 +0000747 ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000748 {
Paul Bakker48916f92012-09-16 19:57:18 +0000749 handshake->tls_prf = tls_prf_sha384;
750 handshake->calc_verify = ssl_calc_verify_tls_sha384;
751 handshake->calc_finished = ssl_calc_finished_tls_sha384;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000752 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000753 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200754#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200755#if defined(MBEDTLS_SHA256_C)
756 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000757 {
Paul Bakker48916f92012-09-16 19:57:18 +0000758 handshake->tls_prf = tls_prf_sha256;
759 handshake->calc_verify = ssl_calc_verify_tls_sha256;
760 handshake->calc_finished = ssl_calc_finished_tls_sha256;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000761 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200762 else
763#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200764#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +0200765 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200766 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
767 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +0200768 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000769
770 /*
Paul Bakker5121ce52009-01-03 21:22:43 +0000771 * SSLv3:
772 * master =
773 * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
774 * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
775 * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
Paul Bakkerf7abd422013-04-16 13:15:56 +0200776 *
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200777 * TLSv1+:
Paul Bakker5121ce52009-01-03 21:22:43 +0000778 * master = PRF( premaster, "master secret", randbytes )[0..47]
779 */
Paul Bakker0a597072012-09-25 21:55:46 +0000780 if( handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000781 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200782 MBEDTLS_SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
Paul Bakker48916f92012-09-16 19:57:18 +0000783 handshake->pmslen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000784
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200785#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
786 if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +0200787 {
788 unsigned char session_hash[48];
789 size_t hash_len;
790
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200791 MBEDTLS_SSL_DEBUG_MSG( 3, ( "using extended master secret" ) );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +0200792
793 ssl->handshake->calc_verify( ssl, session_hash );
794
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200795#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
796 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +0200797 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200798#if defined(MBEDTLS_SHA512_C)
Hanno Becker8759e162017-12-27 21:34:08 +0000799 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +0200800 {
801 hash_len = 48;
802 }
803 else
804#endif
805 hash_len = 32;
806 }
807 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200808#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +0200809 hash_len = 36;
810
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200811 MBEDTLS_SSL_DEBUG_BUF( 3, "session hash", session_hash, hash_len );
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +0200812
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100813 ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,
814 "extended master secret",
815 session_hash, hash_len,
816 session->master, 48 );
817 if( ret != 0 )
818 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200819 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100820 return( ret );
821 }
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +0200822
823 }
824 else
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200825#endif
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100826 ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,
827 "master secret",
828 handshake->randbytes, 64,
829 session->master, 48 );
830 if( ret != 0 )
831 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200832 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100833 return( ret );
834 }
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +0200835
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500836 mbedtls_platform_zeroize( handshake->premaster,
837 sizeof(handshake->premaster) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000838 }
839 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200840 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000841
842 /*
843 * Swap the client and server random values.
844 */
Paul Bakker48916f92012-09-16 19:57:18 +0000845 memcpy( tmp, handshake->randbytes, 64 );
846 memcpy( handshake->randbytes, tmp + 32, 32 );
847 memcpy( handshake->randbytes + 32, tmp, 32 );
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500848 mbedtls_platform_zeroize( tmp, sizeof( tmp ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000849
850 /*
851 * SSLv3:
852 * key block =
853 * MD5( master + SHA1( 'A' + master + randbytes ) ) +
854 * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
855 * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
856 * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
857 * ...
858 *
859 * TLSv1:
860 * key block = PRF( master, "key expansion", randbytes )
861 */
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100862 ret = handshake->tls_prf( session->master, 48, "key expansion",
863 handshake->randbytes, 64, keyblk, 256 );
864 if( ret != 0 )
865 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200866 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100867 return( ret );
868 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000869
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200870 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
871 mbedtls_ssl_get_ciphersuite_name( session->ciphersuite ) ) );
872 MBEDTLS_SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
873 MBEDTLS_SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
874 MBEDTLS_SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000875
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500876 mbedtls_platform_zeroize( handshake->randbytes,
877 sizeof( handshake->randbytes ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000878
879 /*
880 * Determine the appropriate key, IV and MAC length.
881 */
Paul Bakker68884e32013-01-07 18:20:04 +0100882
Hanno Beckere7f2df02017-12-27 08:17:40 +0000883 keylen = cipher_info->key_bitlen / 8;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200884
Hanno Beckerf1229442018-01-03 15:32:31 +0000885#if defined(MBEDTLS_GCM_C) || \
886 defined(MBEDTLS_CCM_C) || \
887 defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200888 if( cipher_info->mode == MBEDTLS_MODE_GCM ||
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200889 cipher_info->mode == MBEDTLS_MODE_CCM ||
890 cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY )
Paul Bakker5121ce52009-01-03 21:22:43 +0000891 {
Hanno Becker8759e162017-12-27 21:34:08 +0000892 size_t explicit_ivlen;
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200893
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200894 transform->maclen = 0;
Hanno Becker81c7b182017-11-09 18:39:33 +0000895 mac_key_len = 0;
Hanno Becker8759e162017-12-27 21:34:08 +0000896 transform->taglen =
897 ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200898
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200899 /* All modes haves 96-bit IVs;
900 * GCM and CCM has 4 implicit and 8 explicit bytes
901 * ChachaPoly has all 12 bytes implicit
902 */
Paul Bakker68884e32013-01-07 18:20:04 +0100903 transform->ivlen = 12;
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200904 if( cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY )
905 transform->fixed_ivlen = 12;
906 else
907 transform->fixed_ivlen = 4;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200908
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200909 /* Minimum length of encrypted record */
910 explicit_ivlen = transform->ivlen - transform->fixed_ivlen;
Hanno Becker8759e162017-12-27 21:34:08 +0000911 transform->minlen = explicit_ivlen + transform->taglen;
Paul Bakker68884e32013-01-07 18:20:04 +0100912 }
913 else
Hanno Beckerf1229442018-01-03 15:32:31 +0000914#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */
915#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
916 if( cipher_info->mode == MBEDTLS_MODE_STREAM ||
917 cipher_info->mode == MBEDTLS_MODE_CBC )
Paul Bakker68884e32013-01-07 18:20:04 +0100918 {
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200919 /* Initialize HMAC contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920 if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 ||
921 ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 )
Paul Bakker68884e32013-01-07 18:20:04 +0100922 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200923 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200924 return( ret );
Paul Bakker68884e32013-01-07 18:20:04 +0100925 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000926
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200927 /* Get MAC length */
Hanno Becker81c7b182017-11-09 18:39:33 +0000928 mac_key_len = mbedtls_md_get_size( md_info );
929 transform->maclen = mac_key_len;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200930
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200932 /*
933 * If HMAC is to be truncated, we shall keep the leftmost bytes,
934 * (rfc 6066 page 13 or rfc 2104 section 4),
935 * so we only need to adjust the length here.
936 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200937 if( session->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED )
Hanno Beckere89353a2017-11-20 16:36:41 +0000938 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200939 transform->maclen = MBEDTLS_SSL_TRUNCATED_HMAC_LEN;
Hanno Beckere89353a2017-11-20 16:36:41 +0000940
941#if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT)
942 /* Fall back to old, non-compliant version of the truncated
Hanno Becker563423f2017-11-21 17:20:17 +0000943 * HMAC implementation which also truncates the key
944 * (Mbed TLS versions from 1.3 to 2.6.0) */
Hanno Beckere89353a2017-11-20 16:36:41 +0000945 mac_key_len = transform->maclen;
946#endif
947 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200948#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200949
950 /* IV length */
Paul Bakker68884e32013-01-07 18:20:04 +0100951 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +0000952
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200953 /* Minimum length */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200954 if( cipher_info->mode == MBEDTLS_MODE_STREAM )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200955 transform->minlen = transform->maclen;
956 else
Paul Bakker68884e32013-01-07 18:20:04 +0100957 {
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200958 /*
959 * GenericBlockCipher:
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +0100960 * 1. if EtM is in use: one block plus MAC
961 * otherwise: * first multiple of blocklen greater than maclen
962 * 2. IV except for SSL3 and TLS 1.0
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200963 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200964#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
965 if( session->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED )
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +0100966 {
967 transform->minlen = transform->maclen
968 + cipher_info->block_size;
969 }
970 else
971#endif
972 {
973 transform->minlen = transform->maclen
974 + cipher_info->block_size
975 - transform->maclen % cipher_info->block_size;
976 }
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200977
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200978#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)
979 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
980 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_1 )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200981 ; /* No need to adjust minlen */
Paul Bakker68884e32013-01-07 18:20:04 +0100982 else
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200983#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200984#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
985 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_2 ||
986 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200987 {
988 transform->minlen += transform->ivlen;
989 }
990 else
991#endif
992 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
994 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200995 }
Paul Bakker68884e32013-01-07 18:20:04 +0100996 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000997 }
Hanno Beckerf1229442018-01-03 15:32:31 +0000998 else
999#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1000 {
1001 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1002 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1003 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001004
Hanno Beckere7f2df02017-12-27 08:17:40 +00001005 MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %u, minlen: %u, ivlen: %u, maclen: %u",
1006 (unsigned) keylen,
1007 (unsigned) transform->minlen,
1008 (unsigned) transform->ivlen,
1009 (unsigned) transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001010
1011 /*
1012 * Finally setup the cipher contexts, IVs and MAC secrets.
1013 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001014#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001015 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker5121ce52009-01-03 21:22:43 +00001016 {
Hanno Becker81c7b182017-11-09 18:39:33 +00001017 key1 = keyblk + mac_key_len * 2;
Hanno Beckere7f2df02017-12-27 08:17:40 +00001018 key2 = keyblk + mac_key_len * 2 + keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001019
Paul Bakker68884e32013-01-07 18:20:04 +01001020 mac_enc = keyblk;
Hanno Becker81c7b182017-11-09 18:39:33 +00001021 mac_dec = keyblk + mac_key_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001022
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001023 /*
1024 * This is not used in TLS v1.1.
1025 */
Paul Bakker48916f92012-09-16 19:57:18 +00001026 iv_copy_len = ( transform->fixed_ivlen ) ?
1027 transform->fixed_ivlen : transform->ivlen;
Hanno Beckere7f2df02017-12-27 08:17:40 +00001028 memcpy( transform->iv_enc, key2 + keylen, iv_copy_len );
1029 memcpy( transform->iv_dec, key2 + keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001030 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001031 }
1032 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001033#endif /* MBEDTLS_SSL_CLI_C */
1034#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02001035 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Paul Bakker5121ce52009-01-03 21:22:43 +00001036 {
Hanno Beckere7f2df02017-12-27 08:17:40 +00001037 key1 = keyblk + mac_key_len * 2 + keylen;
Hanno Becker81c7b182017-11-09 18:39:33 +00001038 key2 = keyblk + mac_key_len * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +00001039
Hanno Becker81c7b182017-11-09 18:39:33 +00001040 mac_enc = keyblk + mac_key_len;
Paul Bakker68884e32013-01-07 18:20:04 +01001041 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +00001042
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001043 /*
1044 * This is not used in TLS v1.1.
1045 */
Paul Bakker48916f92012-09-16 19:57:18 +00001046 iv_copy_len = ( transform->fixed_ivlen ) ?
1047 transform->fixed_ivlen : transform->ivlen;
Hanno Beckere7f2df02017-12-27 08:17:40 +00001048 memcpy( transform->iv_dec, key1 + keylen, iv_copy_len );
1049 memcpy( transform->iv_enc, key1 + keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001050 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001051 }
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001052 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001053#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001054 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001055 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1056 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01001057 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001058
Hanno Becker92231322018-01-03 15:32:51 +00001059#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001060#if defined(MBEDTLS_SSL_PROTO_SSL3)
1061 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker68884e32013-01-07 18:20:04 +01001062 {
Hanno Becker92231322018-01-03 15:32:51 +00001063 if( mac_key_len > sizeof( transform->mac_enc ) )
Manuel Pégourié-Gonnard7cfdcb82014-01-18 18:22:55 +01001064 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001065 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1066 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard7cfdcb82014-01-18 18:22:55 +01001067 }
1068
Hanno Becker81c7b182017-11-09 18:39:33 +00001069 memcpy( transform->mac_enc, mac_enc, mac_key_len );
1070 memcpy( transform->mac_dec, mac_dec, mac_key_len );
Paul Bakker68884e32013-01-07 18:20:04 +01001071 }
1072 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001073#endif /* MBEDTLS_SSL_PROTO_SSL3 */
1074#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
1075 defined(MBEDTLS_SSL_PROTO_TLS1_2)
1076 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )
Paul Bakker68884e32013-01-07 18:20:04 +01001077 {
Gilles Peskine039fd122018-03-19 19:06:08 +01001078 /* For HMAC-based ciphersuites, initialize the HMAC transforms.
1079 For AEAD-based ciphersuites, there is nothing to do here. */
1080 if( mac_key_len != 0 )
1081 {
1082 mbedtls_md_hmac_starts( &transform->md_ctx_enc, mac_enc, mac_key_len );
1083 mbedtls_md_hmac_starts( &transform->md_ctx_dec, mac_dec, mac_key_len );
1084 }
Paul Bakker68884e32013-01-07 18:20:04 +01001085 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001086 else
1087#endif
Paul Bakker577e0062013-08-28 11:57:20 +02001088 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001089 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1090 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02001091 }
Hanno Becker92231322018-01-03 15:32:51 +00001092#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
Paul Bakker68884e32013-01-07 18:20:04 +01001093
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001094#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
1095 if( mbedtls_ssl_hw_record_init != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001096 {
1097 int ret = 0;
1098
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001099 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) );
Paul Bakker05ef8352012-05-08 09:17:57 +00001100
Hanno Beckere7f2df02017-12-27 08:17:40 +00001101 if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, keylen,
Paul Bakker07eb38b2012-12-19 14:42:06 +01001102 transform->iv_enc, transform->iv_dec,
1103 iv_copy_len,
Paul Bakker68884e32013-01-07 18:20:04 +01001104 mac_enc, mac_dec,
Hanno Becker81c7b182017-11-09 18:39:33 +00001105 mac_key_len ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +00001106 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001107 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_init", ret );
1108 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Paul Bakker05ef8352012-05-08 09:17:57 +00001109 }
1110 }
Hanno Becker92231322018-01-03 15:32:51 +00001111#else
1112 ((void) mac_dec);
1113 ((void) mac_enc);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001114#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
Paul Bakker05ef8352012-05-08 09:17:57 +00001115
Manuel Pégourié-Gonnard024b6df2015-10-19 13:52:53 +02001116#if defined(MBEDTLS_SSL_EXPORT_KEYS)
1117 if( ssl->conf->f_export_keys != NULL )
Robert Cragie4feb7ae2015-10-02 13:33:37 +01001118 {
Manuel Pégourié-Gonnard024b6df2015-10-19 13:52:53 +02001119 ssl->conf->f_export_keys( ssl->conf->p_export_keys,
1120 session->master, keyblk,
Hanno Beckere7f2df02017-12-27 08:17:40 +00001121 mac_key_len, keylen,
Robert Cragie4feb7ae2015-10-02 13:33:37 +01001122 iv_copy_len );
1123 }
1124#endif
1125
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001126 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001127 cipher_info ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001128 {
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001129 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001130 return( ret );
1131 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001132
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001133 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec,
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001134 cipher_info ) ) != 0 )
1135 {
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001136 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001137 return( ret );
1138 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001139
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001140 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001141 cipher_info->key_bitlen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001142 MBEDTLS_ENCRYPT ) ) != 0 )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001143 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001144 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001145 return( ret );
1146 }
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001147
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001148 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001149 cipher_info->key_bitlen,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001150 MBEDTLS_DECRYPT ) ) != 0 )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001151 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001152 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001153 return( ret );
1154 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001155
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001156#if defined(MBEDTLS_CIPHER_MODE_CBC)
1157 if( cipher_info->mode == MBEDTLS_MODE_CBC )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001158 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001159 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc,
1160 MBEDTLS_PADDING_NONE ) ) != 0 )
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001161 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001162 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001163 return( ret );
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001164 }
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001165
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001166 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec,
1167 MBEDTLS_PADDING_NONE ) ) != 0 )
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001168 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001169 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001170 return( ret );
1171 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001172 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001173#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001174
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05001175 mbedtls_platform_zeroize( keyblk, sizeof( keyblk ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001176
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001177#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakker2770fbd2012-07-03 13:30:23 +00001178 // Initialize compression
1179 //
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001180 if( session->compression == MBEDTLS_SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001181 {
Paul Bakker16770332013-10-11 09:59:44 +02001182 if( ssl->compress_buf == NULL )
1183 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001184 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Allocating compression buffer" ) );
Angus Grattond8213d02016-05-25 20:56:48 +10001185 ssl->compress_buf = mbedtls_calloc( 1, MBEDTLS_SSL_COMPRESS_BUFFER_LEN );
Paul Bakker16770332013-10-11 09:59:44 +02001186 if( ssl->compress_buf == NULL )
1187 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02001188 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
Angus Grattond8213d02016-05-25 20:56:48 +10001189 MBEDTLS_SSL_COMPRESS_BUFFER_LEN ) );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02001190 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker16770332013-10-11 09:59:44 +02001191 }
1192 }
1193
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001194 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001195
Paul Bakker48916f92012-09-16 19:57:18 +00001196 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
1197 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001198
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001199 if( deflateInit( &transform->ctx_deflate,
1200 Z_DEFAULT_COMPRESSION ) != Z_OK ||
Paul Bakker48916f92012-09-16 19:57:18 +00001201 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001202 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001203 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
1204 return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001205 }
1206 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001207#endif /* MBEDTLS_ZLIB_SUPPORT */
Paul Bakker2770fbd2012-07-03 13:30:23 +00001208
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001209 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001210
1211 return( 0 );
1212}
1213
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001214#if defined(MBEDTLS_SSL_PROTO_SSL3)
1215void ssl_calc_verify_ssl( mbedtls_ssl_context *ssl, unsigned char hash[36] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001216{
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001217 mbedtls_md5_context md5;
1218 mbedtls_sha1_context sha1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001219 unsigned char pad_1[48];
1220 unsigned char pad_2[48];
1221
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001222 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001223
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001224 mbedtls_md5_init( &md5 );
1225 mbedtls_sha1_init( &sha1 );
1226
1227 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
1228 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001229
Paul Bakker380da532012-04-18 16:10:25 +00001230 memset( pad_1, 0x36, 48 );
1231 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001232
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001233 mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 );
1234 mbedtls_md5_update_ret( &md5, pad_1, 48 );
1235 mbedtls_md5_finish_ret( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001236
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001237 mbedtls_md5_starts_ret( &md5 );
1238 mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 );
1239 mbedtls_md5_update_ret( &md5, pad_2, 48 );
1240 mbedtls_md5_update_ret( &md5, hash, 16 );
1241 mbedtls_md5_finish_ret( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001242
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001243 mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 );
1244 mbedtls_sha1_update_ret( &sha1, pad_1, 40 );
1245 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
Paul Bakker380da532012-04-18 16:10:25 +00001246
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001247 mbedtls_sha1_starts_ret( &sha1 );
1248 mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 );
1249 mbedtls_sha1_update_ret( &sha1, pad_2, 40 );
1250 mbedtls_sha1_update_ret( &sha1, hash + 16, 20 );
1251 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
Paul Bakker380da532012-04-18 16:10:25 +00001252
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001253 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
1254 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001255
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001256 mbedtls_md5_free( &md5 );
1257 mbedtls_sha1_free( &sha1 );
Paul Bakker5b4af392014-06-26 12:09:34 +02001258
Paul Bakker380da532012-04-18 16:10:25 +00001259 return;
1260}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001261#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker380da532012-04-18 16:10:25 +00001262
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001263#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
1264void ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char hash[36] )
Paul Bakker380da532012-04-18 16:10:25 +00001265{
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001266 mbedtls_md5_context md5;
1267 mbedtls_sha1_context sha1;
Paul Bakker380da532012-04-18 16:10:25 +00001268
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001269 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001270
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001271 mbedtls_md5_init( &md5 );
1272 mbedtls_sha1_init( &sha1 );
1273
1274 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
1275 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker380da532012-04-18 16:10:25 +00001276
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001277 mbedtls_md5_finish_ret( &md5, hash );
1278 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
Paul Bakker380da532012-04-18 16:10:25 +00001279
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001280 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
1281 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001282
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001283 mbedtls_md5_free( &md5 );
1284 mbedtls_sha1_free( &sha1 );
Paul Bakker5b4af392014-06-26 12:09:34 +02001285
Paul Bakker380da532012-04-18 16:10:25 +00001286 return;
1287}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001288#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
Paul Bakker380da532012-04-18 16:10:25 +00001289
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001290#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1291#if defined(MBEDTLS_SHA256_C)
1292void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char hash[32] )
Paul Bakker380da532012-04-18 16:10:25 +00001293{
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001294 mbedtls_sha256_context sha256;
Paul Bakker380da532012-04-18 16:10:25 +00001295
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001296 mbedtls_sha256_init( &sha256 );
1297
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001298 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001299
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001300 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001301 mbedtls_sha256_finish_ret( &sha256, hash );
Paul Bakker380da532012-04-18 16:10:25 +00001302
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001303 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
1304 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001305
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001306 mbedtls_sha256_free( &sha256 );
Paul Bakker5b4af392014-06-26 12:09:34 +02001307
Paul Bakker380da532012-04-18 16:10:25 +00001308 return;
1309}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001310#endif /* MBEDTLS_SHA256_C */
Paul Bakker380da532012-04-18 16:10:25 +00001311
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001312#if defined(MBEDTLS_SHA512_C)
1313void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *ssl, unsigned char hash[48] )
Paul Bakker380da532012-04-18 16:10:25 +00001314{
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001315 mbedtls_sha512_context sha512;
Paul Bakker380da532012-04-18 16:10:25 +00001316
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001317 mbedtls_sha512_init( &sha512 );
1318
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001319 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
Paul Bakker380da532012-04-18 16:10:25 +00001320
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001321 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01001322 mbedtls_sha512_finish_ret( &sha512, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001323
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001324 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
1325 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001326
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001327 mbedtls_sha512_free( &sha512 );
Paul Bakker5b4af392014-06-26 12:09:34 +02001328
Paul Bakker5121ce52009-01-03 21:22:43 +00001329 return;
1330}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001331#endif /* MBEDTLS_SHA512_C */
1332#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001333
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001334#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
1335int 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 +02001336{
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001337 unsigned char *p = ssl->handshake->premaster;
1338 unsigned char *end = p + sizeof( ssl->handshake->premaster );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001339 const unsigned char *psk = ssl->conf->psk;
1340 size_t psk_len = ssl->conf->psk_len;
1341
1342 /* If the psk callback was called, use its result */
1343 if( ssl->handshake->psk != NULL )
1344 {
1345 psk = ssl->handshake->psk;
1346 psk_len = ssl->handshake->psk_len;
1347 }
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001348
1349 /*
1350 * PMS = struct {
1351 * opaque other_secret<0..2^16-1>;
1352 * opaque psk<0..2^16-1>;
1353 * };
1354 * with "other_secret" depending on the particular key exchange
1355 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001356#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
1357 if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001358 {
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001359 if( end - p < 2 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001360 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001361
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001362 *(p++) = (unsigned char)( psk_len >> 8 );
1363 *(p++) = (unsigned char)( psk_len );
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001364
1365 if( end < p || (size_t)( end - p ) < psk_len )
1366 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1367
1368 memset( p, 0, psk_len );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001369 p += psk_len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001370 }
1371 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001372#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
1373#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
1374 if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001375 {
1376 /*
1377 * other_secret already set by the ClientKeyExchange message,
1378 * and is 48 bytes long
1379 */
Philippe Antoine747fd532018-05-30 09:13:21 +02001380 if( end - p < 2 )
1381 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1382
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001383 *p++ = 0;
1384 *p++ = 48;
1385 p += 48;
1386 }
1387 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001388#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
1389#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
1390 if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001391 {
Manuel Pégourié-Gonnard1b62c7f2013-10-14 14:02:19 +02001392 int ret;
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +01001393 size_t len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001394
Manuel Pégourié-Gonnard8df68632014-06-23 17:56:08 +02001395 /* Write length only when we know the actual value */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001396 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +01001397 p + 2, end - ( p + 2 ), &len,
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01001398 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001399 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001400 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001401 return( ret );
1402 }
Manuel Pégourié-Gonnard8df68632014-06-23 17:56:08 +02001403 *(p++) = (unsigned char)( len >> 8 );
1404 *(p++) = (unsigned char)( len );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001405 p += len;
1406
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001407 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001408 }
1409 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001410#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
1411#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
1412 if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001413 {
Manuel Pégourié-Gonnard1b62c7f2013-10-14 14:02:19 +02001414 int ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001415 size_t zlen;
1416
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001417 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen,
Paul Bakker66d5d072014-06-17 16:39:18 +02001418 p + 2, end - ( p + 2 ),
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01001419 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001420 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001421 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001422 return( ret );
1423 }
1424
1425 *(p++) = (unsigned char)( zlen >> 8 );
1426 *(p++) = (unsigned char)( zlen );
1427 p += zlen;
1428
Janos Follath3fbdada2018-08-15 10:26:53 +01001429 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
1430 MBEDTLS_DEBUG_ECDH_Z );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001431 }
1432 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001433#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001434 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001435 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1436 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001437 }
1438
1439 /* opaque psk<0..2^16-1>; */
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001440 if( end - p < 2 )
1441 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardb2bf5a12014-03-25 16:28:12 +01001442
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001443 *(p++) = (unsigned char)( psk_len >> 8 );
1444 *(p++) = (unsigned char)( psk_len );
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001445
1446 if( end < p || (size_t)( end - p ) < psk_len )
1447 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1448
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001449 memcpy( p, psk, psk_len );
1450 p += psk_len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001451
1452 ssl->handshake->pmslen = p - ssl->handshake->premaster;
1453
1454 return( 0 );
1455}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001456#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001457
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001458#if defined(MBEDTLS_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00001459/*
1460 * SSLv3.0 MAC functions
1461 */
Manuel Pégourié-Gonnardb053efb2017-12-19 10:03:46 +01001462#define SSL_MAC_MAX_BYTES 20 /* MD-5 or SHA-1 */
Manuel Pégourié-Gonnard464147c2017-12-18 18:04:59 +01001463static void ssl_mac( mbedtls_md_context_t *md_ctx,
1464 const unsigned char *secret,
1465 const unsigned char *buf, size_t len,
1466 const unsigned char *ctr, int type,
Manuel Pégourié-Gonnardb053efb2017-12-19 10:03:46 +01001467 unsigned char out[SSL_MAC_MAX_BYTES] )
Paul Bakker5121ce52009-01-03 21:22:43 +00001468{
1469 unsigned char header[11];
1470 unsigned char padding[48];
Manuel Pégourié-Gonnard8d4ad072014-07-13 14:43:28 +02001471 int padlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001472 int md_size = mbedtls_md_get_size( md_ctx->md_info );
1473 int md_type = mbedtls_md_get_type( md_ctx->md_info );
Paul Bakker68884e32013-01-07 18:20:04 +01001474
Manuel Pégourié-Gonnard8d4ad072014-07-13 14:43:28 +02001475 /* Only MD5 and SHA-1 supported */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001476 if( md_type == MBEDTLS_MD_MD5 )
Paul Bakker68884e32013-01-07 18:20:04 +01001477 padlen = 48;
Manuel Pégourié-Gonnard8d4ad072014-07-13 14:43:28 +02001478 else
Paul Bakker68884e32013-01-07 18:20:04 +01001479 padlen = 40;
Paul Bakker5121ce52009-01-03 21:22:43 +00001480
1481 memcpy( header, ctr, 8 );
1482 header[ 8] = (unsigned char) type;
1483 header[ 9] = (unsigned char)( len >> 8 );
1484 header[10] = (unsigned char)( len );
1485
Paul Bakker68884e32013-01-07 18:20:04 +01001486 memset( padding, 0x36, padlen );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001487 mbedtls_md_starts( md_ctx );
1488 mbedtls_md_update( md_ctx, secret, md_size );
1489 mbedtls_md_update( md_ctx, padding, padlen );
1490 mbedtls_md_update( md_ctx, header, 11 );
1491 mbedtls_md_update( md_ctx, buf, len );
Manuel Pégourié-Gonnard464147c2017-12-18 18:04:59 +01001492 mbedtls_md_finish( md_ctx, out );
Paul Bakker5121ce52009-01-03 21:22:43 +00001493
Paul Bakker68884e32013-01-07 18:20:04 +01001494 memset( padding, 0x5C, padlen );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001495 mbedtls_md_starts( md_ctx );
1496 mbedtls_md_update( md_ctx, secret, md_size );
1497 mbedtls_md_update( md_ctx, padding, padlen );
Manuel Pégourié-Gonnard464147c2017-12-18 18:04:59 +01001498 mbedtls_md_update( md_ctx, out, md_size );
1499 mbedtls_md_finish( md_ctx, out );
Paul Bakker5f70b252012-09-13 14:23:06 +00001500}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001501#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5f70b252012-09-13 14:23:06 +00001502
Manuel Pégourié-Gonnard7b420302018-06-28 10:38:35 +02001503/* The function below is only used in the Lucky 13 counter-measure in
Hanno Becker30d02cd2018-10-18 15:43:13 +01001504 * mbedtls_ssl_decrypt_buf(). These are the defines that guard the call site. */
Hanno Becker5cc04d52018-01-03 15:24:20 +00001505#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) && \
Manuel Pégourié-Gonnard7b420302018-06-28 10:38:35 +02001506 ( defined(MBEDTLS_SSL_PROTO_TLS1) || \
1507 defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
1508 defined(MBEDTLS_SSL_PROTO_TLS1_2) )
1509/* This function makes sure every byte in the memory region is accessed
1510 * (in ascending addresses order) */
1511static void ssl_read_memory( unsigned char *p, size_t len )
1512{
1513 unsigned char acc = 0;
1514 volatile unsigned char force;
1515
1516 for( ; len != 0; p++, len-- )
1517 acc ^= *p;
1518
1519 force = acc;
1520 (void) force;
1521}
1522#endif /* SSL_SOME_MODES_USE_MAC && ( TLS1 || TLS1_1 || TLS1_2 ) */
1523
Manuel Pégourié-Gonnard0098e7d2014-10-28 13:08:59 +01001524/*
Paul Bakker5121ce52009-01-03 21:22:43 +00001525 * Encryption/decryption functions
Paul Bakkerf7abd422013-04-16 13:15:56 +02001526 */
Hanno Becker3307b532017-12-27 21:37:21 +00001527
1528static void ssl_extract_add_data_from_record( unsigned char* add_data,
1529 mbedtls_record *rec )
1530{
1531 memcpy( add_data, rec->ctr, sizeof( rec->ctr ) );
1532 add_data[8] = rec->type;
1533 memcpy( add_data + 9, rec->ver, sizeof( rec->ver ) );
1534 add_data[11] = ( rec->data_len >> 8 ) & 0xFF;
1535 add_data[12] = rec->data_len & 0xFF;
1536}
1537
Hanno Becker611a83b2018-01-03 14:27:32 +00001538int mbedtls_ssl_encrypt_buf( mbedtls_ssl_context *ssl,
1539 mbedtls_ssl_transform *transform,
1540 mbedtls_record *rec,
1541 int (*f_rng)(void *, unsigned char *, size_t),
1542 void *p_rng )
Paul Bakker5121ce52009-01-03 21:22:43 +00001543{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001544 mbedtls_cipher_mode_t mode;
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001545 int auth_done = 0;
Hanno Becker3307b532017-12-27 21:37:21 +00001546 unsigned char * data;
1547 unsigned char add_data[13];
1548 size_t post_avail;
1549
1550 /* The SSL context is only used for debugging purposes! */
Hanno Becker611a83b2018-01-03 14:27:32 +00001551#if !defined(MBEDTLS_DEBUG_C)
Hanno Becker3307b532017-12-27 21:37:21 +00001552 ((void) ssl);
1553#endif
1554
1555 /* The PRNG is used for dynamic IV generation that's used
1556 * for CBC transformations in TLS 1.1 and TLS 1.2. */
1557#if !( defined(MBEDTLS_CIPHER_MODE_CBC) && \
1558 ( defined(MBEDTLS_AES_C) || \
1559 defined(MBEDTLS_ARIA_C) || \
1560 defined(MBEDTLS_CAMELLIA_C) ) && \
1561 ( defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) ) )
1562 ((void) f_rng);
1563 ((void) p_rng);
1564#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001565
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001566 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001567
Hanno Becker3307b532017-12-27 21:37:21 +00001568 if( transform == NULL )
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001569 {
Hanno Becker3307b532017-12-27 21:37:21 +00001570 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no transform provided to encrypt_buf" ) );
1571 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1572 }
1573 if( rec == NULL ||
1574 rec->buf == NULL ||
1575 rec->buf_len < rec->data_offset ||
1576 rec->buf_len - rec->data_offset < rec->data_len )
1577 {
1578 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad record structure provided to encrypt_buf" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001579 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001580 }
1581
Hanno Becker3307b532017-12-27 21:37:21 +00001582 post_avail = rec->buf_len - ( rec->data_len + rec->data_offset );
1583 data = rec->buf + rec->data_offset;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001584 MBEDTLS_SSL_DEBUG_BUF( 4, "before encrypt: output payload",
Hanno Becker3307b532017-12-27 21:37:21 +00001585 data, rec->data_len );
1586
1587 mode = mbedtls_cipher_get_cipher_mode( &transform->cipher_ctx_enc );
1588
1589 if( rec->data_len > MBEDTLS_SSL_OUT_CONTENT_LEN )
1590 {
1591 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Record content %u too large, maximum %d",
1592 (unsigned) rec->data_len,
1593 MBEDTLS_SSL_OUT_CONTENT_LEN ) );
1594 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1595 }
Manuel Pégourié-Gonnard60346be2014-11-21 11:38:37 +01001596
Paul Bakker5121ce52009-01-03 21:22:43 +00001597 /*
Manuel Pégourié-Gonnard0098e7d2014-10-28 13:08:59 +01001598 * Add MAC before if needed
Paul Bakker5121ce52009-01-03 21:22:43 +00001599 */
Hanno Becker5cc04d52018-01-03 15:24:20 +00001600#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001601 if( mode == MBEDTLS_MODE_STREAM ||
1602 ( mode == MBEDTLS_MODE_CBC
1603#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker3307b532017-12-27 21:37:21 +00001604 && transform->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001605#endif
1606 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00001607 {
Hanno Becker3307b532017-12-27 21:37:21 +00001608 if( post_avail < transform->maclen )
1609 {
1610 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Buffer provided for encrypted record not large enough" ) );
1611 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
1612 }
1613
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001614#if defined(MBEDTLS_SSL_PROTO_SSL3)
Hanno Becker3307b532017-12-27 21:37:21 +00001615 if( transform->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001616 {
Manuel Pégourié-Gonnardb053efb2017-12-19 10:03:46 +01001617 unsigned char mac[SSL_MAC_MAX_BYTES];
Hanno Becker3307b532017-12-27 21:37:21 +00001618 ssl_mac( &transform->md_ctx_enc, transform->mac_enc,
1619 data, rec->data_len, rec->ctr, rec->type, mac );
1620 memcpy( data + rec->data_len, mac, transform->maclen );
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001621 }
1622 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001623#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001624#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
1625 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker3307b532017-12-27 21:37:21 +00001626 if( transform->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001627 {
Hanno Becker992b6872017-11-09 18:57:39 +00001628 unsigned char mac[MBEDTLS_SSL_MAC_ADD];
1629
Hanno Becker3307b532017-12-27 21:37:21 +00001630 ssl_extract_add_data_from_record( add_data, rec );
Hanno Becker992b6872017-11-09 18:57:39 +00001631
Hanno Becker3307b532017-12-27 21:37:21 +00001632 mbedtls_md_hmac_update( &transform->md_ctx_enc, add_data,
1633 sizeof( add_data ) );
1634 mbedtls_md_hmac_update( &transform->md_ctx_enc,
1635 data, rec->data_len );
1636 mbedtls_md_hmac_finish( &transform->md_ctx_enc, mac );
1637 mbedtls_md_hmac_reset( &transform->md_ctx_enc );
1638
1639 memcpy( data + rec->data_len, mac, transform->maclen );
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001640 }
1641 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001642#endif
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001643 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001644 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1645 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001646 }
1647
Hanno Becker3307b532017-12-27 21:37:21 +00001648 MBEDTLS_SSL_DEBUG_BUF( 4, "computed mac", data + rec->data_len,
1649 transform->maclen );
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001650
Hanno Becker3307b532017-12-27 21:37:21 +00001651 rec->data_len += transform->maclen;
1652 post_avail -= transform->maclen;
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001653 auth_done++;
Paul Bakker577e0062013-08-28 11:57:20 +02001654 }
Hanno Becker5cc04d52018-01-03 15:24:20 +00001655#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001656
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001657 /*
1658 * Encrypt
1659 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001660#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER)
1661 if( mode == MBEDTLS_MODE_STREAM )
Paul Bakker5121ce52009-01-03 21:22:43 +00001662 {
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001663 int ret;
Hanno Becker3307b532017-12-27 21:37:21 +00001664 size_t olen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001665 MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Hanno Becker3307b532017-12-27 21:37:21 +00001666 "including %d bytes of padding",
1667 rec->data_len, 0 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001668
Hanno Becker3307b532017-12-27 21:37:21 +00001669 if( ( ret = mbedtls_cipher_crypt( &transform->cipher_ctx_enc,
1670 transform->iv_enc, transform->ivlen,
1671 data, rec->data_len,
1672 data, &olen ) ) != 0 )
Paul Bakker45125bc2013-09-04 16:47:11 +02001673 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001674 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001675 return( ret );
1676 }
1677
Hanno Becker3307b532017-12-27 21:37:21 +00001678 if( rec->data_len != olen )
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001679 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001680 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1681 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001682 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001683 }
Paul Bakker68884e32013-01-07 18:20:04 +01001684 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001685#endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */
Hanno Becker4c6876b2017-12-27 21:28:58 +00001686
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001687#if defined(MBEDTLS_GCM_C) || \
1688 defined(MBEDTLS_CCM_C) || \
1689 defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001690 if( mode == MBEDTLS_MODE_GCM ||
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001691 mode == MBEDTLS_MODE_CCM ||
1692 mode == MBEDTLS_MODE_CHACHAPOLY )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001693 {
Manuel Pégourié-Gonnard2e5ee322014-05-14 13:09:22 +02001694 int ret;
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001695 unsigned char iv[12];
Hanno Becker3307b532017-12-27 21:37:21 +00001696 size_t explicit_iv_len = transform->ivlen - transform->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001697
Hanno Becker3307b532017-12-27 21:37:21 +00001698 /* Check that there's space for both the authentication tag
1699 * and the explicit IV before and after the record content. */
1700 if( post_avail < transform->taglen ||
1701 rec->data_offset < explicit_iv_len )
1702 {
1703 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Buffer provided for encrypted record not large enough" ) );
1704 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
1705 }
Paul Bakkerca4ab492012-04-18 14:23:57 +00001706
Paul Bakker68884e32013-01-07 18:20:04 +01001707 /*
1708 * Generate IV
1709 */
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001710 if( transform->ivlen == 12 && transform->fixed_ivlen == 4 )
1711 {
Manuel Pégourié-Gonnard8744a022018-07-11 12:30:40 +02001712 /* GCM and CCM: fixed || explicit (=seqnum) */
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001713 memcpy( iv, transform->iv_enc, transform->fixed_ivlen );
Hanno Becker3307b532017-12-27 21:37:21 +00001714 memcpy( iv + transform->fixed_ivlen, rec->ctr,
1715 explicit_iv_len );
1716 /* Prefix record content with explicit IV. */
1717 memcpy( data - explicit_iv_len, rec->ctr, explicit_iv_len );
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001718 }
1719 else if( transform->ivlen == 12 && transform->fixed_ivlen == 12 )
1720 {
Manuel Pégourié-Gonnard8744a022018-07-11 12:30:40 +02001721 /* ChachaPoly: fixed XOR sequence number */
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001722 unsigned char i;
1723
1724 memcpy( iv, transform->iv_enc, transform->fixed_ivlen );
1725
1726 for( i = 0; i < 8; i++ )
Hanno Becker3307b532017-12-27 21:37:21 +00001727 iv[i+4] ^= rec->ctr[i];
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001728 }
1729 else
Manuel Pégourié-Gonnardd056ce02014-10-29 22:29:20 +01001730 {
1731 /* Reminder if we ever add an AEAD mode with a different size */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001732 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1733 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardd056ce02014-10-29 22:29:20 +01001734 }
1735
Hanno Becker08885812019-04-26 13:34:37 +01001736 ssl_extract_add_data_from_record( add_data, rec );
1737
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001738 MBEDTLS_SSL_DEBUG_BUF( 4, "IV used (internal)",
1739 iv, transform->ivlen );
1740 MBEDTLS_SSL_DEBUG_BUF( 4, "IV used (transmitted)",
Hanno Becker3307b532017-12-27 21:37:21 +00001741 data - explicit_iv_len, explicit_iv_len );
1742 MBEDTLS_SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1743 add_data, 13 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001744 MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001745 "including 0 bytes of padding",
Hanno Becker3307b532017-12-27 21:37:21 +00001746 rec->data_len ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001747
Paul Bakker68884e32013-01-07 18:20:04 +01001748 /*
Manuel Pégourié-Gonnardde7bb442014-05-13 12:41:10 +02001749 * Encrypt and authenticate
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001750 */
Hanno Becker3307b532017-12-27 21:37:21 +00001751
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001752 if( ( ret = mbedtls_cipher_auth_encrypt( &transform->cipher_ctx_enc,
Hanno Becker3307b532017-12-27 21:37:21 +00001753 iv, transform->ivlen,
1754 add_data, 13, /* add data */
1755 data, rec->data_len, /* source */
1756 data, &rec->data_len, /* destination */
1757 data + rec->data_len, transform->taglen ) ) != 0 )
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001758 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001759 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_auth_encrypt", ret );
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001760 return( ret );
1761 }
1762
Hanno Becker3307b532017-12-27 21:37:21 +00001763 MBEDTLS_SSL_DEBUG_BUF( 4, "after encrypt: tag",
1764 data + rec->data_len, transform->taglen );
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001765
Hanno Becker3307b532017-12-27 21:37:21 +00001766 rec->data_len += transform->taglen + explicit_iv_len;
1767 rec->data_offset -= explicit_iv_len;
1768 post_avail -= transform->taglen;
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001769 auth_done++;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001770 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001771 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001772#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */
1773#if defined(MBEDTLS_CIPHER_MODE_CBC) && \
Markku-Juhani O. Saarinenc06e1012017-12-07 11:51:13 +00001774 ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) || defined(MBEDTLS_ARIA_C) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001775 if( mode == MBEDTLS_MODE_CBC )
Paul Bakker5121ce52009-01-03 21:22:43 +00001776 {
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001777 int ret;
Hanno Becker3307b532017-12-27 21:37:21 +00001778 size_t padlen, i;
1779 size_t olen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001780
Hanno Becker3307b532017-12-27 21:37:21 +00001781 /* Currently we're always using minimal padding
1782 * (up to 255 bytes would be allowed). */
1783 padlen = transform->ivlen - ( rec->data_len + 1 ) % transform->ivlen;
1784 if( padlen == transform->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001785 padlen = 0;
1786
Hanno Becker3307b532017-12-27 21:37:21 +00001787 /* Check there's enough space in the buffer for the padding. */
1788 if( post_avail < padlen + 1 )
1789 {
1790 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Buffer provided for encrypted record not large enough" ) );
1791 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
1792 }
1793
Paul Bakker5121ce52009-01-03 21:22:43 +00001794 for( i = 0; i <= padlen; i++ )
Hanno Becker3307b532017-12-27 21:37:21 +00001795 data[rec->data_len + i] = (unsigned char) padlen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001796
Hanno Becker3307b532017-12-27 21:37:21 +00001797 rec->data_len += padlen + 1;
1798 post_avail -= padlen + 1;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001799
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001800#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001801 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001802 * Prepend per-record IV for block cipher in TLS v1.1 and up as per
1803 * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001804 */
Hanno Becker3307b532017-12-27 21:37:21 +00001805 if( transform->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001806 {
Hanno Becker3307b532017-12-27 21:37:21 +00001807 if( f_rng == NULL )
1808 {
1809 MBEDTLS_SSL_DEBUG_MSG( 1, ( "No PRNG provided to encrypt_record routine" ) );
1810 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1811 }
1812
1813 if( rec->data_offset < transform->ivlen )
1814 {
1815 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Buffer provided for encrypted record not large enough" ) );
1816 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
1817 }
1818
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001819 /*
1820 * Generate IV
1821 */
Hanno Becker3307b532017-12-27 21:37:21 +00001822 ret = f_rng( p_rng, transform->iv_enc, transform->ivlen );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001823 if( ret != 0 )
1824 return( ret );
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001825
Hanno Becker3307b532017-12-27 21:37:21 +00001826 memcpy( data - transform->ivlen, transform->iv_enc,
1827 transform->ivlen );
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001828
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001829 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001830#endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001831
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001832 MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001833 "including %d bytes of IV and %d bytes of padding",
Hanno Becker3307b532017-12-27 21:37:21 +00001834 rec->data_len, transform->ivlen,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001835 padlen + 1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001836
Hanno Becker3307b532017-12-27 21:37:21 +00001837 if( ( ret = mbedtls_cipher_crypt( &transform->cipher_ctx_enc,
1838 transform->iv_enc,
1839 transform->ivlen,
1840 data, rec->data_len,
1841 data, &olen ) ) != 0 )
Paul Bakker45125bc2013-09-04 16:47:11 +02001842 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001843 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001844 return( ret );
1845 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001846
Hanno Becker3307b532017-12-27 21:37:21 +00001847 if( rec->data_len != olen )
Paul Bakkercca5b812013-08-31 17:40:26 +02001848 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001849 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1850 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakkercca5b812013-08-31 17:40:26 +02001851 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001852
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001853#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)
Hanno Becker3307b532017-12-27 21:37:21 +00001854 if( transform->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 )
Paul Bakkercca5b812013-08-31 17:40:26 +02001855 {
1856 /*
1857 * Save IV in SSL3 and TLS1
1858 */
Hanno Becker3307b532017-12-27 21:37:21 +00001859 memcpy( transform->iv_enc, transform->cipher_ctx_enc.iv,
1860 transform->ivlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001861 }
Hanno Becker3307b532017-12-27 21:37:21 +00001862 else
Paul Bakkercca5b812013-08-31 17:40:26 +02001863#endif
Hanno Becker3307b532017-12-27 21:37:21 +00001864 {
1865 data -= transform->ivlen;
1866 rec->data_offset -= transform->ivlen;
1867 rec->data_len += transform->ivlen;
1868 }
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01001869
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001870#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001871 if( auth_done == 0 )
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01001872 {
Hanno Becker3d8c9072018-01-05 16:24:22 +00001873 unsigned char mac[MBEDTLS_SSL_MAC_ADD];
1874
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01001875 /*
1876 * MAC(MAC_write_key, seq_num +
1877 * TLSCipherText.type +
1878 * TLSCipherText.version +
Manuel Pégourié-Gonnard08558e52014-11-04 14:40:21 +01001879 * length_of( (IV +) ENC(...) ) +
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01001880 * IV + // except for TLS 1.0
1881 * ENC(content + padding + padding_length));
1882 */
Hanno Becker3307b532017-12-27 21:37:21 +00001883
1884 if( post_avail < transform->maclen)
1885 {
1886 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Buffer provided for encrypted record not large enough" ) );
1887 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
1888 }
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01001889
Hanno Becker08885812019-04-26 13:34:37 +01001890 ssl_extract_add_data_from_record( add_data, rec );
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01001891
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001892 MBEDTLS_SSL_DEBUG_MSG( 3, ( "using encrypt then mac" ) );
Hanno Becker3307b532017-12-27 21:37:21 +00001893 MBEDTLS_SSL_DEBUG_BUF( 4, "MAC'd meta-data", add_data,
1894 sizeof( add_data ) );
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001895
Hanno Becker3307b532017-12-27 21:37:21 +00001896 mbedtls_md_hmac_update( &transform->md_ctx_enc, add_data,
1897 sizeof( add_data ) );
1898 mbedtls_md_hmac_update( &transform->md_ctx_enc,
1899 data, rec->data_len );
1900 mbedtls_md_hmac_finish( &transform->md_ctx_enc, mac );
1901 mbedtls_md_hmac_reset( &transform->md_ctx_enc );
Manuel Pégourié-Gonnard08558e52014-11-04 14:40:21 +01001902
Hanno Becker3307b532017-12-27 21:37:21 +00001903 memcpy( data + rec->data_len, mac, transform->maclen );
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01001904
Hanno Becker3307b532017-12-27 21:37:21 +00001905 rec->data_len += transform->maclen;
1906 post_avail -= transform->maclen;
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001907 auth_done++;
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01001908 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001909#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001910 }
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02001911 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001912#endif /* MBEDTLS_CIPHER_MODE_CBC &&
Markku-Juhani O. Saarinenc06e1012017-12-07 11:51:13 +00001913 ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C || MBEDTLS_ARIA_C ) */
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02001914 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001915 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1916 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02001917 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001918
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001919 /* Make extra sure authentication was performed, exactly once */
1920 if( auth_done != 1 )
1921 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001922 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1923 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001924 }
1925
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001926 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001927
1928 return( 0 );
1929}
1930
Hanno Becker611a83b2018-01-03 14:27:32 +00001931int mbedtls_ssl_decrypt_buf( mbedtls_ssl_context *ssl,
1932 mbedtls_ssl_transform *transform,
1933 mbedtls_record *rec )
Paul Bakker5121ce52009-01-03 21:22:43 +00001934{
Hanno Becker4c6876b2017-12-27 21:28:58 +00001935 size_t olen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001936 mbedtls_cipher_mode_t mode;
Hanno Becker4c6876b2017-12-27 21:28:58 +00001937 int ret, auth_done = 0;
Hanno Becker5cc04d52018-01-03 15:24:20 +00001938#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Paul Bakker1e5369c2013-12-19 16:40:57 +01001939 size_t padlen = 0, correct = 1;
1940#endif
Hanno Becker4c6876b2017-12-27 21:28:58 +00001941 unsigned char* data;
1942 unsigned char add_data[13];
1943
Hanno Becker611a83b2018-01-03 14:27:32 +00001944#if !defined(MBEDTLS_DEBUG_C)
Hanno Becker4c6876b2017-12-27 21:28:58 +00001945 ((void) ssl);
1946#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001947
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001948 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
Hanno Becker4c6876b2017-12-27 21:28:58 +00001949 if( transform == NULL )
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001950 {
Hanno Becker4c6876b2017-12-27 21:28:58 +00001951 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no transform provided to decrypt_buf" ) );
1952 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1953 }
1954 if( rec == NULL ||
1955 rec->buf == NULL ||
1956 rec->buf_len < rec->data_offset ||
1957 rec->buf_len - rec->data_offset < rec->data_len )
1958 {
1959 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad record structure provided to decrypt_buf" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001960 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01001961 }
1962
Hanno Becker4c6876b2017-12-27 21:28:58 +00001963 data = rec->buf + rec->data_offset;
1964 mode = mbedtls_cipher_get_cipher_mode( &transform->cipher_ctx_dec );
Paul Bakker5121ce52009-01-03 21:22:43 +00001965
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001966#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER)
1967 if( mode == MBEDTLS_MODE_STREAM )
Paul Bakker68884e32013-01-07 18:20:04 +01001968 {
1969 padlen = 0;
Hanno Becker4c6876b2017-12-27 21:28:58 +00001970 if( ( ret = mbedtls_cipher_crypt( &transform->cipher_ctx_dec,
1971 transform->iv_dec,
1972 transform->ivlen,
1973 data, rec->data_len,
1974 data, &olen ) ) != 0 )
Paul Bakker45125bc2013-09-04 16:47:11 +02001975 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001976 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001977 return( ret );
1978 }
1979
Hanno Becker4c6876b2017-12-27 21:28:58 +00001980 if( rec->data_len != olen )
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001981 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001982 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1983 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001984 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001985 }
Paul Bakker68884e32013-01-07 18:20:04 +01001986 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001987#endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001988#if defined(MBEDTLS_GCM_C) || \
1989 defined(MBEDTLS_CCM_C) || \
1990 defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001991 if( mode == MBEDTLS_MODE_GCM ||
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001992 mode == MBEDTLS_MODE_CCM ||
1993 mode == MBEDTLS_MODE_CHACHAPOLY )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001994 {
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001995 unsigned char iv[12];
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001996 size_t explicit_iv_len = transform->ivlen - transform->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001997
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02001998 /*
1999 * Compute and update sizes
2000 */
Hanno Becker4c6876b2017-12-27 21:28:58 +00002001 if( rec->data_len < explicit_iv_len + transform->taglen )
Manuel Pégourié-Gonnard0bcc4e12014-06-17 10:54:17 +02002002 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002003 MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < explicit_iv_len (%d) "
Hanno Becker4c6876b2017-12-27 21:28:58 +00002004 "+ taglen (%d)", rec->data_len,
2005 explicit_iv_len, transform->taglen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002006 return( MBEDTLS_ERR_SSL_INVALID_MAC );
Manuel Pégourié-Gonnard0bcc4e12014-06-17 10:54:17 +02002007 }
Paul Bakker68884e32013-01-07 18:20:04 +01002008
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02002009 /*
2010 * Prepare IV
2011 */
2012 if( transform->ivlen == 12 && transform->fixed_ivlen == 4 )
2013 {
Manuel Pégourié-Gonnard8744a022018-07-11 12:30:40 +02002014 /* GCM and CCM: fixed || explicit (transmitted) */
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02002015 memcpy( iv, transform->iv_dec, transform->fixed_ivlen );
Hanno Becker4c6876b2017-12-27 21:28:58 +00002016 memcpy( iv + transform->fixed_ivlen, data, 8 );
Paul Bakker68884e32013-01-07 18:20:04 +01002017
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02002018 }
2019 else if( transform->ivlen == 12 && transform->fixed_ivlen == 12 )
2020 {
Manuel Pégourié-Gonnard8744a022018-07-11 12:30:40 +02002021 /* ChachaPoly: fixed XOR sequence number */
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02002022 unsigned char i;
2023
2024 memcpy( iv, transform->iv_dec, transform->fixed_ivlen );
2025
2026 for( i = 0; i < 8; i++ )
Hanno Becker4c6876b2017-12-27 21:28:58 +00002027 iv[i+4] ^= rec->ctr[i];
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02002028 }
2029 else
2030 {
2031 /* Reminder if we ever add an AEAD mode with a different size */
2032 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2033 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2034 }
2035
Hanno Becker4c6876b2017-12-27 21:28:58 +00002036 data += explicit_iv_len;
2037 rec->data_offset += explicit_iv_len;
2038 rec->data_len -= explicit_iv_len + transform->taglen;
2039
2040 ssl_extract_add_data_from_record( add_data, rec );
2041 MBEDTLS_SSL_DEBUG_BUF( 4, "additional data used for AEAD",
2042 add_data, 13 );
2043
2044 memcpy( transform->iv_dec + transform->fixed_ivlen,
2045 data - explicit_iv_len, explicit_iv_len );
2046
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +02002047 MBEDTLS_SSL_DEBUG_BUF( 4, "IV used", iv, transform->ivlen );
Hanno Becker4c6876b2017-12-27 21:28:58 +00002048 MBEDTLS_SSL_DEBUG_BUF( 4, "TAG used", data + rec->data_len,
Hanno Becker8759e162017-12-27 21:34:08 +00002049 transform->taglen );
Paul Bakker68884e32013-01-07 18:20:04 +01002050
Paul Bakker68884e32013-01-07 18:20:04 +01002051
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02002052 /*
Manuel Pégourié-Gonnardde7bb442014-05-13 12:41:10 +02002053 * Decrypt and authenticate
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02002054 */
Hanno Becker4c6876b2017-12-27 21:28:58 +00002055 if( ( ret = mbedtls_cipher_auth_decrypt( &transform->cipher_ctx_dec,
2056 iv, transform->ivlen,
2057 add_data, 13,
2058 data, rec->data_len,
2059 data, &olen,
2060 data + rec->data_len,
2061 transform->taglen ) ) != 0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00002062 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002063 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_auth_decrypt", ret );
Manuel Pégourié-Gonnardde7bb442014-05-13 12:41:10 +02002064
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002065 if( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED )
2066 return( MBEDTLS_ERR_SSL_INVALID_MAC );
Manuel Pégourié-Gonnardde7bb442014-05-13 12:41:10 +02002067
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02002068 return( ret );
2069 }
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01002070 auth_done++;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002071
Hanno Becker4c6876b2017-12-27 21:28:58 +00002072 if( olen != rec->data_len )
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02002073 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002074 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2075 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02002076 }
Paul Bakkerca4ab492012-04-18 14:23:57 +00002077 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002078 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002079#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */
2080#if defined(MBEDTLS_CIPHER_MODE_CBC) && \
Markku-Juhani O. Saarinenc06e1012017-12-07 11:51:13 +00002081 ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) || defined(MBEDTLS_ARIA_C) )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002082 if( mode == MBEDTLS_MODE_CBC )
Paul Bakker5121ce52009-01-03 21:22:43 +00002083 {
Paul Bakkere47b34b2013-02-27 14:48:00 +01002084 size_t minlen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002085
Paul Bakker5121ce52009-01-03 21:22:43 +00002086 /*
Paul Bakker45829992013-01-03 14:52:21 +01002087 * Check immediate ciphertext sanity
Paul Bakker5121ce52009-01-03 21:22:43 +00002088 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002089#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker4c6876b2017-12-27 21:28:58 +00002090 if( transform->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
2091 {
2092 /* The ciphertext is prefixed with the CBC IV. */
2093 minlen += transform->ivlen;
2094 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002095#endif
Paul Bakker45829992013-01-03 14:52:21 +01002096
Hanno Becker4c6876b2017-12-27 21:28:58 +00002097 /* Size considerations:
2098 *
2099 * - The CBC cipher text must not be empty and hence
2100 * at least of size transform->ivlen.
2101 *
2102 * Together with the potential IV-prefix, this explains
2103 * the first of the two checks below.
2104 *
2105 * - The record must contain a MAC, either in plain or
2106 * encrypted, depending on whether Encrypt-then-MAC
2107 * is used or not.
2108 * - If it is, the message contains the IV-prefix,
2109 * the CBC ciphertext, and the MAC.
2110 * - If it is not, the padded plaintext, and hence
2111 * the CBC ciphertext, has at least length maclen + 1
2112 * because there is at least the padding length byte.
2113 *
2114 * As the CBC ciphertext is not empty, both cases give the
2115 * lower bound minlen + maclen + 1 on the record size, which
2116 * we test for in the second check below.
2117 */
2118 if( rec->data_len < minlen + transform->ivlen ||
2119 rec->data_len < minlen + transform->maclen + 1 )
Paul Bakker45829992013-01-03 14:52:21 +01002120 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002121 MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) "
Hanno Becker4c6876b2017-12-27 21:28:58 +00002122 "+ 1 ) ( + expl IV )", rec->data_len,
2123 transform->ivlen,
2124 transform->maclen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002125 return( MBEDTLS_ERR_SSL_INVALID_MAC );
Paul Bakker45829992013-01-03 14:52:21 +01002126 }
2127
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002128 /*
2129 * Authenticate before decrypt if enabled
2130 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002131#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Hanno Becker4c6876b2017-12-27 21:28:58 +00002132 if( transform->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED )
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002133 {
Hanno Becker992b6872017-11-09 18:57:39 +00002134 unsigned char mac_expect[MBEDTLS_SSL_MAC_ADD];
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002135
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002136 MBEDTLS_SSL_DEBUG_MSG( 3, ( "using encrypt then mac" ) );
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01002137
Hanno Becker4c6876b2017-12-27 21:28:58 +00002138 /* Safe due to the check data_len >= minlen + maclen + 1 above. */
2139 rec->data_len -= transform->maclen;
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002140
Hanno Becker4c6876b2017-12-27 21:28:58 +00002141 ssl_extract_add_data_from_record( add_data, rec );
Manuel Pégourié-Gonnard08558e52014-11-04 14:40:21 +01002142
Hanno Becker4c6876b2017-12-27 21:28:58 +00002143 MBEDTLS_SSL_DEBUG_BUF( 4, "MAC'd meta-data", add_data, 13 );
2144 mbedtls_md_hmac_update( &transform->md_ctx_dec, add_data, 13 );
2145 mbedtls_md_hmac_update( &transform->md_ctx_dec,
2146 data, rec->data_len );
2147 mbedtls_md_hmac_finish( &transform->md_ctx_dec, mac_expect );
2148 mbedtls_md_hmac_reset( &transform->md_ctx_dec );
Manuel Pégourié-Gonnard08558e52014-11-04 14:40:21 +01002149
Hanno Becker4c6876b2017-12-27 21:28:58 +00002150 MBEDTLS_SSL_DEBUG_BUF( 4, "message mac", data + rec->data_len,
2151 transform->maclen );
Hanno Becker992b6872017-11-09 18:57:39 +00002152 MBEDTLS_SSL_DEBUG_BUF( 4, "expected mac", mac_expect,
Hanno Becker4c6876b2017-12-27 21:28:58 +00002153 transform->maclen );
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002154
Hanno Becker4c6876b2017-12-27 21:28:58 +00002155 if( mbedtls_ssl_safer_memcmp( data + rec->data_len, mac_expect,
2156 transform->maclen ) != 0 )
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002157 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002158 MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002159 return( MBEDTLS_ERR_SSL_INVALID_MAC );
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002160 }
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01002161 auth_done++;
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002162 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002163#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002164
2165 /*
2166 * Check length sanity
2167 */
Hanno Becker4c6876b2017-12-27 21:28:58 +00002168 if( rec->data_len % transform->ivlen != 0 )
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002169 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002170 MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
Hanno Becker4c6876b2017-12-27 21:28:58 +00002171 rec->data_len, transform->ivlen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002172 return( MBEDTLS_ERR_SSL_INVALID_MAC );
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002173 }
2174
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002175#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002176 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00002177 * Initialize for prepended IV for block cipher in TLS v1.1 and up
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002178 */
Hanno Becker4c6876b2017-12-27 21:28:58 +00002179 if( transform->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002180 {
Hanno Becker4c6876b2017-12-27 21:28:58 +00002181 /* This is safe because data_len >= minlen + maclen + 1 initially,
2182 * and at this point we have at most subtracted maclen (note that
2183 * minlen == transform->ivlen here). */
2184 memcpy( transform->iv_dec, data, transform->ivlen );
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002185
Hanno Becker4c6876b2017-12-27 21:28:58 +00002186 data += transform->ivlen;
2187 rec->data_offset += transform->ivlen;
2188 rec->data_len -= transform->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002189 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002190#endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002191
Hanno Becker4c6876b2017-12-27 21:28:58 +00002192 if( ( ret = mbedtls_cipher_crypt( &transform->cipher_ctx_dec,
2193 transform->iv_dec, transform->ivlen,
2194 data, rec->data_len, data, &olen ) ) != 0 )
Paul Bakker45125bc2013-09-04 16:47:11 +02002195 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002196 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02002197 return( ret );
2198 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02002199
Hanno Becker4c6876b2017-12-27 21:28:58 +00002200 if( rec->data_len != olen )
Paul Bakkercca5b812013-08-31 17:40:26 +02002201 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002202 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2203 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakkercca5b812013-08-31 17:40:26 +02002204 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02002205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002206#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)
Hanno Becker4c6876b2017-12-27 21:28:58 +00002207 if( transform->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 )
Paul Bakkercca5b812013-08-31 17:40:26 +02002208 {
2209 /*
2210 * Save IV in SSL3 and TLS1
2211 */
Hanno Becker4c6876b2017-12-27 21:28:58 +00002212 memcpy( transform->iv_dec, transform->cipher_ctx_dec.iv,
2213 transform->ivlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00002214 }
Paul Bakkercca5b812013-08-31 17:40:26 +02002215#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002216
Hanno Becker4c6876b2017-12-27 21:28:58 +00002217 /* Safe since data_len >= minlen + maclen + 1, so after having
2218 * subtracted at most minlen and maclen up to this point,
2219 * data_len > 0. */
2220 padlen = data[rec->data_len - 1];
Paul Bakker45829992013-01-03 14:52:21 +01002221
Hanno Becker4c6876b2017-12-27 21:28:58 +00002222 if( auth_done == 1 )
2223 {
2224 correct *= ( rec->data_len >= padlen + 1 );
2225 padlen *= ( rec->data_len >= padlen + 1 );
2226 }
2227 else
Paul Bakker45829992013-01-03 14:52:21 +01002228 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002229#if defined(MBEDTLS_SSL_DEBUG_ALL)
Hanno Becker4c6876b2017-12-27 21:28:58 +00002230 if( rec->data_len < transform->maclen + padlen + 1 )
2231 {
2232 MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
2233 rec->data_len,
2234 transform->maclen,
2235 padlen + 1 ) );
2236 }
Paul Bakkerd66f0702013-01-31 16:57:45 +01002237#endif
Hanno Becker4c6876b2017-12-27 21:28:58 +00002238
2239 correct *= ( rec->data_len >= transform->maclen + padlen + 1 );
2240 padlen *= ( rec->data_len >= transform->maclen + padlen + 1 );
Paul Bakker45829992013-01-03 14:52:21 +01002241 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002242
Hanno Becker4c6876b2017-12-27 21:28:58 +00002243 padlen++;
2244
2245 /* Regardless of the validity of the padding,
2246 * we have data_len >= padlen here. */
2247
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002248#if defined(MBEDTLS_SSL_PROTO_SSL3)
Hanno Becker4c6876b2017-12-27 21:28:58 +00002249 if( transform->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002250 {
Hanno Becker4c6876b2017-12-27 21:28:58 +00002251 if( padlen > transform->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00002252 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002253#if defined(MBEDTLS_SSL_DEBUG_ALL)
2254 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
Hanno Becker4c6876b2017-12-27 21:28:58 +00002255 "should be no more than %d",
2256 padlen, transform->ivlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01002257#endif
Paul Bakker45829992013-01-03 14:52:21 +01002258 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002259 }
2260 }
2261 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002262#endif /* MBEDTLS_SSL_PROTO_SSL3 */
2263#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2264 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker4c6876b2017-12-27 21:28:58 +00002265 if( transform->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002266 {
Hanno Becker4c6876b2017-12-27 21:28:58 +00002267 /* The padding check involves a series of up to 256
2268 * consecutive memory reads at the end of the record
2269 * plaintext buffer. In order to hide the length and
2270 * validity of the padding, always perform exactly
2271 * `min(256,plaintext_len)` reads (but take into account
2272 * only the last `padlen` bytes for the padding check). */
2273 size_t pad_count = 0;
2274 size_t real_count = 0;
2275 volatile unsigned char* const check = data;
Paul Bakkere47b34b2013-02-27 14:48:00 +01002276
Hanno Becker4c6876b2017-12-27 21:28:58 +00002277 /* Index of first padding byte; it has been ensured above
2278 * that the subtraction is safe. */
2279 size_t const padding_idx = rec->data_len - padlen;
2280 size_t const num_checks = rec->data_len <= 256 ? rec->data_len : 256;
2281 size_t const start_idx = rec->data_len - num_checks;
2282 size_t idx;
Paul Bakker956c9e02013-12-19 14:42:28 +01002283
Hanno Becker4c6876b2017-12-27 21:28:58 +00002284 for( idx = start_idx; idx < rec->data_len; idx++ )
Paul Bakkerca9c87e2013-09-25 18:52:37 +02002285 {
Hanno Becker4c6876b2017-12-27 21:28:58 +00002286 real_count |= ( idx >= padding_idx );
2287 pad_count += real_count * ( check[idx] == padlen - 1 );
Paul Bakkerca9c87e2013-09-25 18:52:37 +02002288 }
Hanno Becker4c6876b2017-12-27 21:28:58 +00002289 correct &= ( pad_count == padlen );
Paul Bakkere47b34b2013-02-27 14:48:00 +01002290
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002291#if defined(MBEDTLS_SSL_DEBUG_ALL)
Paul Bakker66d5d072014-06-17 16:39:18 +02002292 if( padlen > 0 && correct == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002293 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01002294#endif
Paul Bakkere47b34b2013-02-27 14:48:00 +01002295 padlen &= correct * 0x1FF;
Paul Bakker5121ce52009-01-03 21:22:43 +00002296 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002297 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002298#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
2299 MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02002300 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002301 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2302 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02002303 }
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002304
Hanno Becker4c6876b2017-12-27 21:28:58 +00002305 /* If the padding was found to be invalid, padlen == 0
2306 * and the subtraction is safe. If the padding was found valid,
2307 * padlen hasn't been changed and the previous assertion
2308 * data_len >= padlen still holds. */
2309 rec->data_len -= padlen;
Paul Bakker5121ce52009-01-03 21:22:43 +00002310 }
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02002311 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002312#endif /* MBEDTLS_CIPHER_MODE_CBC &&
Markku-Juhani O. Saarinenc06e1012017-12-07 11:51:13 +00002313 ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C || MBEDTLS_ARIA_C ) */
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02002314 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002315 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2316 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02002317 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002318
Manuel Pégourié-Gonnard6a25cfa2018-07-10 11:15:36 +02002319#if defined(MBEDTLS_SSL_DEBUG_ALL)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002320 MBEDTLS_SSL_DEBUG_BUF( 4, "raw buffer after decryption",
Hanno Becker4c6876b2017-12-27 21:28:58 +00002321 data, rec->data_len );
Manuel Pégourié-Gonnard6a25cfa2018-07-10 11:15:36 +02002322#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002323
2324 /*
Manuel Pégourié-Gonnard313d7962014-10-29 12:07:57 +01002325 * Authenticate if not done yet.
2326 * Compute the MAC regardless of the padding result (RFC4346, CBCTIME).
Paul Bakker5121ce52009-01-03 21:22:43 +00002327 */
Hanno Becker5cc04d52018-01-03 15:24:20 +00002328#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01002329 if( auth_done == 0 )
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002330 {
Hanno Becker992b6872017-11-09 18:57:39 +00002331 unsigned char mac_expect[MBEDTLS_SSL_MAC_ADD];
Paul Bakker1e5369c2013-12-19 16:40:57 +01002332
Hanno Becker4c6876b2017-12-27 21:28:58 +00002333 /* If the initial value of padlen was such that
2334 * data_len < maclen + padlen + 1, then padlen
2335 * got reset to 1, and the initial check
2336 * data_len >= minlen + maclen + 1
2337 * guarantees that at this point we still
2338 * have at least data_len >= maclen.
2339 *
2340 * If the initial value of padlen was such that
2341 * data_len >= maclen + padlen + 1, then we have
2342 * subtracted either padlen + 1 (if the padding was correct)
2343 * or 0 (if the padding was incorrect) since then,
2344 * hence data_len >= maclen in any case.
2345 */
2346 rec->data_len -= transform->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +00002347
Hanno Becker4c6876b2017-12-27 21:28:58 +00002348 ssl_extract_add_data_from_record( add_data, rec );
Paul Bakker5121ce52009-01-03 21:22:43 +00002349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002350#if defined(MBEDTLS_SSL_PROTO_SSL3)
Hanno Becker4c6876b2017-12-27 21:28:58 +00002351 if( transform->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002352 {
Hanno Becker4c6876b2017-12-27 21:28:58 +00002353 ssl_mac( &transform->md_ctx_dec,
2354 transform->mac_dec,
2355 data, rec->data_len,
2356 rec->ctr, rec->type,
2357 mac_expect );
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002358 }
2359 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002360#endif /* MBEDTLS_SSL_PROTO_SSL3 */
2361#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2362 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Becker4c6876b2017-12-27 21:28:58 +00002363 if( transform->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002364 {
2365 /*
2366 * Process MAC and always update for padlen afterwards to make
Gilles Peskine20b44082018-05-29 14:06:49 +02002367 * total time independent of padlen.
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002368 *
2369 * Known timing attacks:
2370 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
2371 *
Gilles Peskine20b44082018-05-29 14:06:49 +02002372 * To compensate for different timings for the MAC calculation
2373 * depending on how much padding was removed (which is determined
2374 * by padlen), process extra_run more blocks through the hash
2375 * function.
2376 *
2377 * The formula in the paper is
2378 * extra_run = ceil( (L1-55) / 64 ) - ceil( (L2-55) / 64 )
2379 * where L1 is the size of the header plus the decrypted message
2380 * plus CBC padding and L2 is the size of the header plus the
2381 * decrypted message. This is for an underlying hash function
2382 * with 64-byte blocks.
2383 * We use ( (Lx+8) / 64 ) to handle 'negative Lx' values
2384 * correctly. We round down instead of up, so -56 is the correct
2385 * value for our calculations instead of -55.
2386 *
Gilles Peskine1bd9d582018-06-04 11:58:44 +02002387 * Repeat the formula rather than defining a block_size variable.
2388 * This avoids requiring division by a variable at runtime
2389 * (which would be marginally less efficient and would require
2390 * linking an extra division function in some builds).
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002391 */
2392 size_t j, extra_run = 0;
Hanno Becker4c6876b2017-12-27 21:28:58 +00002393 unsigned char tmp[MBEDTLS_MD_MAX_BLOCK_SIZE];
Manuel Pégourié-Gonnard7b420302018-06-28 10:38:35 +02002394
2395 /*
2396 * The next two sizes are the minimum and maximum values of
2397 * in_msglen over all padlen values.
2398 *
2399 * They're independent of padlen, since we previously did
2400 * in_msglen -= padlen.
2401 *
2402 * Note that max_len + maclen is never more than the buffer
2403 * length, as we previously did in_msglen -= maclen too.
2404 */
Hanno Becker4c6876b2017-12-27 21:28:58 +00002405 const size_t max_len = rec->data_len + padlen;
Manuel Pégourié-Gonnard7b420302018-06-28 10:38:35 +02002406 const size_t min_len = ( max_len > 256 ) ? max_len - 256 : 0;
2407
Hanno Becker4c6876b2017-12-27 21:28:58 +00002408 memset( tmp, 0, sizeof( tmp ) );
2409
2410 switch( mbedtls_md_get_type( transform->md_ctx_dec.md_info ) )
Gilles Peskine20b44082018-05-29 14:06:49 +02002411 {
Gilles Peskined0e55a42018-06-04 12:03:30 +02002412#if defined(MBEDTLS_MD5_C) || defined(MBEDTLS_SHA1_C) || \
2413 defined(MBEDTLS_SHA256_C)
Gilles Peskine20b44082018-05-29 14:06:49 +02002414 case MBEDTLS_MD_MD5:
2415 case MBEDTLS_MD_SHA1:
Gilles Peskine20b44082018-05-29 14:06:49 +02002416 case MBEDTLS_MD_SHA256:
Gilles Peskine20b44082018-05-29 14:06:49 +02002417 /* 8 bytes of message size, 64-byte compression blocks */
Hanno Becker4c6876b2017-12-27 21:28:58 +00002418 extra_run = ( 13 + rec->data_len + padlen + 8 ) / 64 -
2419 ( 13 + rec->data_len + 8 ) / 64;
Gilles Peskine20b44082018-05-29 14:06:49 +02002420 break;
2421#endif
Gilles Peskinea7fe25d2018-06-04 12:01:18 +02002422#if defined(MBEDTLS_SHA512_C)
Gilles Peskine20b44082018-05-29 14:06:49 +02002423 case MBEDTLS_MD_SHA384:
Gilles Peskine20b44082018-05-29 14:06:49 +02002424 /* 16 bytes of message size, 128-byte compression blocks */
Hanno Becker4c6876b2017-12-27 21:28:58 +00002425 extra_run = ( 13 + rec->data_len + padlen + 16 ) / 128 -
2426 ( 13 + rec->data_len + 16 ) / 128;
Gilles Peskine20b44082018-05-29 14:06:49 +02002427 break;
2428#endif
2429 default:
Gilles Peskine5c389842018-06-04 12:02:43 +02002430 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Gilles Peskine20b44082018-05-29 14:06:49 +02002431 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2432 }
Paul Bakkere47b34b2013-02-27 14:48:00 +01002433
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002434 extra_run &= correct * 0xFF;
Paul Bakkere47b34b2013-02-27 14:48:00 +01002435
Hanno Becker4c6876b2017-12-27 21:28:58 +00002436 mbedtls_md_hmac_update( &transform->md_ctx_dec, add_data, 13 );
2437 mbedtls_md_hmac_update( &transform->md_ctx_dec, data,
2438 rec->data_len );
Manuel Pégourié-Gonnard7b420302018-06-28 10:38:35 +02002439 /* Make sure we access everything even when padlen > 0. This
2440 * makes the synchronisation requirements for just-in-time
2441 * Prime+Probe attacks much tighter and hopefully impractical. */
Hanno Becker4c6876b2017-12-27 21:28:58 +00002442 ssl_read_memory( data + rec->data_len, padlen );
2443 mbedtls_md_hmac_finish( &transform->md_ctx_dec, mac_expect );
Manuel Pégourié-Gonnard7b420302018-06-28 10:38:35 +02002444
2445 /* Call mbedtls_md_process at least once due to cache attacks
2446 * that observe whether md_process() was called of not */
Manuel Pégourié-Gonnard47fede02015-04-29 01:35:48 +02002447 for( j = 0; j < extra_run + 1; j++ )
Hanno Becker4c6876b2017-12-27 21:28:58 +00002448 mbedtls_md_process( &transform->md_ctx_dec, tmp );
Paul Bakkere47b34b2013-02-27 14:48:00 +01002449
Hanno Becker4c6876b2017-12-27 21:28:58 +00002450 mbedtls_md_hmac_reset( &transform->md_ctx_dec );
Manuel Pégourié-Gonnard7b420302018-06-28 10:38:35 +02002451
2452 /* Make sure we access all the memory that could contain the MAC,
2453 * before we check it in the next code block. This makes the
2454 * synchronisation requirements for just-in-time Prime+Probe
2455 * attacks much tighter and hopefully impractical. */
Hanno Becker4c6876b2017-12-27 21:28:58 +00002456 ssl_read_memory( data + min_len,
2457 max_len - min_len + transform->maclen );
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002458 }
2459 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002460#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
2461 MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002462 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002463 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2464 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002465 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002466
Manuel Pégourié-Gonnard7b420302018-06-28 10:38:35 +02002467#if defined(MBEDTLS_SSL_DEBUG_ALL)
Hanno Becker4c6876b2017-12-27 21:28:58 +00002468 MBEDTLS_SSL_DEBUG_BUF( 4, "expected mac", mac_expect, transform->maclen );
2469 MBEDTLS_SSL_DEBUG_BUF( 4, "message mac", data + rec->data_len, transform->maclen );
Manuel Pégourié-Gonnard7b420302018-06-28 10:38:35 +02002470#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002471
Hanno Becker4c6876b2017-12-27 21:28:58 +00002472 if( mbedtls_ssl_safer_memcmp( data + rec->data_len, mac_expect,
2473 transform->maclen ) != 0 )
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002474 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002475#if defined(MBEDTLS_SSL_DEBUG_ALL)
2476 MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakkere47b34b2013-02-27 14:48:00 +01002477#endif
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002478 correct = 0;
2479 }
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01002480 auth_done++;
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02002481 }
Hanno Beckerdd3ab132018-10-17 14:43:14 +01002482
2483 /*
2484 * Finally check the correct flag
2485 */
2486 if( correct == 0 )
2487 return( MBEDTLS_ERR_SSL_INVALID_MAC );
Hanno Becker5cc04d52018-01-03 15:24:20 +00002488#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01002489
2490 /* Make extra sure authentication was performed, exactly once */
2491 if( auth_done != 1 )
2492 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002493 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2494 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard352143f2015-01-13 10:59:51 +01002495 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002496
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002497 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002498
2499 return( 0 );
2500}
2501
Manuel Pégourié-Gonnard0098e7d2014-10-28 13:08:59 +01002502#undef MAC_NONE
2503#undef MAC_PLAINTEXT
2504#undef MAC_CIPHERTEXT
2505
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002506#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakker2770fbd2012-07-03 13:30:23 +00002507/*
2508 * Compression/decompression functions
2509 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002510static int ssl_compress_buf( mbedtls_ssl_context *ssl )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002511{
2512 int ret;
2513 unsigned char *msg_post = ssl->out_msg;
Andrzej Kurek5462e022018-04-20 07:58:53 -04002514 ptrdiff_t bytes_written = ssl->out_msg - ssl->out_buf;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002515 size_t len_pre = ssl->out_msglen;
Paul Bakker16770332013-10-11 09:59:44 +02002516 unsigned char *msg_pre = ssl->compress_buf;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002517
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002518 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002519
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02002520 if( len_pre == 0 )
2521 return( 0 );
2522
Paul Bakker2770fbd2012-07-03 13:30:23 +00002523 memcpy( msg_pre, ssl->out_msg, len_pre );
2524
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002525 MBEDTLS_SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
Paul Bakker2770fbd2012-07-03 13:30:23 +00002526 ssl->out_msglen ) );
2527
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002528 MBEDTLS_SSL_DEBUG_BUF( 4, "before compression: output payload",
Paul Bakker2770fbd2012-07-03 13:30:23 +00002529 ssl->out_msg, ssl->out_msglen );
2530
Paul Bakker48916f92012-09-16 19:57:18 +00002531 ssl->transform_out->ctx_deflate.next_in = msg_pre;
2532 ssl->transform_out->ctx_deflate.avail_in = len_pre;
2533 ssl->transform_out->ctx_deflate.next_out = msg_post;
Angus Grattond8213d02016-05-25 20:56:48 +10002534 ssl->transform_out->ctx_deflate.avail_out = MBEDTLS_SSL_OUT_BUFFER_LEN - bytes_written;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002535
Paul Bakker48916f92012-09-16 19:57:18 +00002536 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002537 if( ret != Z_OK )
2538 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002539 MBEDTLS_SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
2540 return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002541 }
2542
Angus Grattond8213d02016-05-25 20:56:48 +10002543 ssl->out_msglen = MBEDTLS_SSL_OUT_BUFFER_LEN -
Andrzej Kurek5462e022018-04-20 07:58:53 -04002544 ssl->transform_out->ctx_deflate.avail_out - bytes_written;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002545
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002546 MBEDTLS_SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
Paul Bakker2770fbd2012-07-03 13:30:23 +00002547 ssl->out_msglen ) );
2548
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002549 MBEDTLS_SSL_DEBUG_BUF( 4, "after compression: output payload",
Paul Bakker2770fbd2012-07-03 13:30:23 +00002550 ssl->out_msg, ssl->out_msglen );
2551
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002552 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002553
2554 return( 0 );
2555}
2556
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002557static int ssl_decompress_buf( mbedtls_ssl_context *ssl )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002558{
2559 int ret;
2560 unsigned char *msg_post = ssl->in_msg;
Andrzej Kureka9ceef82018-04-24 06:32:44 -04002561 ptrdiff_t header_bytes = ssl->in_msg - ssl->in_buf;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002562 size_t len_pre = ssl->in_msglen;
Paul Bakker16770332013-10-11 09:59:44 +02002563 unsigned char *msg_pre = ssl->compress_buf;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002564
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002565 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002566
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02002567 if( len_pre == 0 )
2568 return( 0 );
2569
Paul Bakker2770fbd2012-07-03 13:30:23 +00002570 memcpy( msg_pre, ssl->in_msg, len_pre );
2571
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002572 MBEDTLS_SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
Paul Bakker2770fbd2012-07-03 13:30:23 +00002573 ssl->in_msglen ) );
2574
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002575 MBEDTLS_SSL_DEBUG_BUF( 4, "before decompression: input payload",
Paul Bakker2770fbd2012-07-03 13:30:23 +00002576 ssl->in_msg, ssl->in_msglen );
2577
Paul Bakker48916f92012-09-16 19:57:18 +00002578 ssl->transform_in->ctx_inflate.next_in = msg_pre;
2579 ssl->transform_in->ctx_inflate.avail_in = len_pre;
2580 ssl->transform_in->ctx_inflate.next_out = msg_post;
Angus Grattond8213d02016-05-25 20:56:48 +10002581 ssl->transform_in->ctx_inflate.avail_out = MBEDTLS_SSL_IN_BUFFER_LEN -
Andrzej Kureka9ceef82018-04-24 06:32:44 -04002582 header_bytes;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002583
Paul Bakker48916f92012-09-16 19:57:18 +00002584 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002585 if( ret != Z_OK )
2586 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002587 MBEDTLS_SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
2588 return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002589 }
2590
Angus Grattond8213d02016-05-25 20:56:48 +10002591 ssl->in_msglen = MBEDTLS_SSL_IN_BUFFER_LEN -
Andrzej Kureka9ceef82018-04-24 06:32:44 -04002592 ssl->transform_in->ctx_inflate.avail_out - header_bytes;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002593
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002594 MBEDTLS_SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
Paul Bakker2770fbd2012-07-03 13:30:23 +00002595 ssl->in_msglen ) );
2596
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002597 MBEDTLS_SSL_DEBUG_BUF( 4, "after decompression: input payload",
Paul Bakker2770fbd2012-07-03 13:30:23 +00002598 ssl->in_msg, ssl->in_msglen );
2599
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002600 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002601
2602 return( 0 );
2603}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002604#endif /* MBEDTLS_ZLIB_SUPPORT */
Paul Bakker2770fbd2012-07-03 13:30:23 +00002605
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002606#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
2607static int ssl_write_hello_request( mbedtls_ssl_context *ssl );
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002608
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002609#if defined(MBEDTLS_SSL_PROTO_DTLS)
2610static int ssl_resend_hello_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002611{
2612 /* If renegotiation is not enforced, retransmit until we would reach max
2613 * timeout if we were using the usual handshake doubling scheme */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002614 if( ssl->conf->renego_max_records < 0 )
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002615 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002616 uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1;
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002617 unsigned char doublings = 1;
2618
2619 while( ratio != 0 )
2620 {
2621 ++doublings;
2622 ratio >>= 1;
2623 }
2624
2625 if( ++ssl->renego_records_seen > doublings )
2626 {
Manuel Pégourié-Gonnardcb0d2122015-07-22 11:52:11 +02002627 MBEDTLS_SSL_DEBUG_MSG( 2, ( "no longer retransmitting hello request" ) );
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002628 return( 0 );
2629 }
2630 }
2631
2632 return( ssl_write_hello_request( ssl ) );
2633}
2634#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002635#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02002636
Paul Bakker5121ce52009-01-03 21:22:43 +00002637/*
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02002638 * Fill the input message buffer by appending data to it.
2639 * The amount of data already fetched is in ssl->in_left.
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002640 *
2641 * If we return 0, is it guaranteed that (at least) nb_want bytes are
2642 * available (from this read and/or a previous one). Otherwise, an error code
2643 * is returned (possibly EOF or WANT_READ).
2644 *
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02002645 * With stream transport (TLS) on success ssl->in_left == nb_want, but
2646 * with datagram transport (DTLS) on success ssl->in_left >= nb_want,
2647 * since we always read a whole datagram at once.
2648 *
Manuel Pégourié-Gonnard64dffc52014-09-02 13:39:16 +02002649 * For DTLS, it is up to the caller to set ssl->next_record_offset when
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02002650 * they're done reading a record.
Paul Bakker5121ce52009-01-03 21:22:43 +00002651 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002652int mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want )
Paul Bakker5121ce52009-01-03 21:22:43 +00002653{
Paul Bakker23986e52011-04-24 08:57:21 +00002654 int ret;
2655 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002656
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002657 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002658
Manuel Pégourié-Gonnarde6bdc442014-09-17 11:34:57 +02002659 if( ssl->f_recv == NULL && ssl->f_recv_timeout == NULL )
2660 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002661 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() "
Manuel Pégourié-Gonnard1b511f92015-05-06 15:54:23 +01002662 "or mbedtls_ssl_set_bio()" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002663 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnarde6bdc442014-09-17 11:34:57 +02002664 }
2665
Angus Grattond8213d02016-05-25 20:56:48 +10002666 if( nb_want > MBEDTLS_SSL_IN_BUFFER_LEN - (size_t)( ssl->in_hdr - ssl->in_buf ) )
Paul Bakker1a1fbba2014-04-30 14:38:05 +02002667 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002668 MBEDTLS_SSL_DEBUG_MSG( 1, ( "requesting more data than fits" ) );
2669 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker1a1fbba2014-04-30 14:38:05 +02002670 }
2671
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002672#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002673 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Paul Bakker5121ce52009-01-03 21:22:43 +00002674 {
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02002675 uint32_t timeout;
2676
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02002677 /* Just to be sure */
2678 if( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL )
2679 {
2680 MBEDTLS_SSL_DEBUG_MSG( 1, ( "You must use "
2681 "mbedtls_ssl_set_timer_cb() for DTLS" ) );
2682 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2683 }
2684
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02002685 /*
2686 * The point is, we need to always read a full datagram at once, so we
2687 * sometimes read more then requested, and handle the additional data.
2688 * It could be the rest of the current record (while fetching the
2689 * header) and/or some other records in the same datagram.
2690 */
2691
2692 /*
2693 * Move to the next record in the already read datagram if applicable
2694 */
2695 if( ssl->next_record_offset != 0 )
2696 {
2697 if( ssl->in_left < ssl->next_record_offset )
2698 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002699 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2700 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02002701 }
2702
2703 ssl->in_left -= ssl->next_record_offset;
2704
2705 if( ssl->in_left != 0 )
2706 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002707 MBEDTLS_SSL_DEBUG_MSG( 2, ( "next record in same datagram, offset: %d",
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02002708 ssl->next_record_offset ) );
2709 memmove( ssl->in_hdr,
2710 ssl->in_hdr + ssl->next_record_offset,
2711 ssl->in_left );
2712 }
2713
2714 ssl->next_record_offset = 0;
2715 }
2716
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002717 MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
Paul Bakker5121ce52009-01-03 21:22:43 +00002718 ssl->in_left, nb_want ) );
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002719
2720 /*
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02002721 * Done if we already have enough data.
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002722 */
2723 if( nb_want <= ssl->in_left)
Manuel Pégourié-Gonnard502bf302014-08-20 13:12:58 +02002724 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002725 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002726 return( 0 );
Manuel Pégourié-Gonnard502bf302014-08-20 13:12:58 +02002727 }
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002728
2729 /*
2730 * A record can't be split accross datagrams. If we need to read but
2731 * are not at the beginning of a new record, the caller did something
2732 * wrong.
2733 */
2734 if( ssl->in_left != 0 )
2735 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002736 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2737 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002738 }
2739
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02002740 /*
2741 * Don't even try to read if time's out already.
2742 * This avoids by-passing the timer when repeatedly receiving messages
2743 * that will end up being dropped.
2744 */
2745 if( ssl_check_timer( ssl ) != 0 )
Hanno Beckere65ce782017-05-22 14:47:48 +01002746 {
2747 MBEDTLS_SSL_DEBUG_MSG( 2, ( "timer has expired" ) );
Manuel Pégourié-Gonnard88369942015-05-06 16:19:31 +01002748 ret = MBEDTLS_ERR_SSL_TIMEOUT;
Hanno Beckere65ce782017-05-22 14:47:48 +01002749 }
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02002750 else
Manuel Pégourié-Gonnard6a2bdfa2014-09-19 21:18:23 +02002751 {
Angus Grattond8213d02016-05-25 20:56:48 +10002752 len = MBEDTLS_SSL_IN_BUFFER_LEN - ( ssl->in_hdr - ssl->in_buf );
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02002753
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002754 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02002755 timeout = ssl->handshake->retransmit_timeout;
2756 else
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002757 timeout = ssl->conf->read_timeout;
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02002758
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002759 MBEDTLS_SSL_DEBUG_MSG( 3, ( "f_recv_timeout: %u ms", timeout ) );
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02002760
Manuel Pégourié-Gonnard07617332015-06-24 23:00:03 +02002761 if( ssl->f_recv_timeout != NULL )
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02002762 ret = ssl->f_recv_timeout( ssl->p_bio, ssl->in_hdr, len,
2763 timeout );
2764 else
2765 ret = ssl->f_recv( ssl->p_bio, ssl->in_hdr, len );
2766
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002767 MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_recv(_timeout)", ret );
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02002768
2769 if( ret == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002770 return( MBEDTLS_ERR_SSL_CONN_EOF );
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02002771 }
2772
Manuel Pégourié-Gonnard88369942015-05-06 16:19:31 +01002773 if( ret == MBEDTLS_ERR_SSL_TIMEOUT )
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02002774 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002775 MBEDTLS_SSL_DEBUG_MSG( 2, ( "timeout" ) );
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02002776 ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard6a2bdfa2014-09-19 21:18:23 +02002777
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002778 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +02002779 {
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02002780 if( ssl_double_retransmit_timeout( ssl ) != 0 )
2781 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002782 MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake timeout" ) );
Manuel Pégourié-Gonnard88369942015-05-06 16:19:31 +01002783 return( MBEDTLS_ERR_SSL_TIMEOUT );
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02002784 }
2785
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002786 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02002787 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002788 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret );
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02002789 return( ret );
2790 }
2791
Manuel Pégourié-Gonnard88369942015-05-06 16:19:31 +01002792 return( MBEDTLS_ERR_SSL_WANT_READ );
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +02002793 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002794#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02002795 else if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002796 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02002797 {
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02002798 if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 )
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02002799 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002800 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_resend_hello_request", ret );
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02002801 return( ret );
2802 }
2803
Manuel Pégourié-Gonnard88369942015-05-06 16:19:31 +01002804 return( MBEDTLS_ERR_SSL_WANT_READ );
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02002805 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002806#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard6a2bdfa2014-09-19 21:18:23 +02002807 }
2808
Paul Bakker5121ce52009-01-03 21:22:43 +00002809 if( ret < 0 )
2810 return( ret );
2811
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002812 ssl->in_left = ret;
2813 }
2814 else
2815#endif
2816 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002817 MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02002818 ssl->in_left, nb_want ) );
2819
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002820 while( ssl->in_left < nb_want )
2821 {
2822 len = nb_want - ssl->in_left;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02002823
2824 if( ssl_check_timer( ssl ) != 0 )
2825 ret = MBEDTLS_ERR_SSL_TIMEOUT;
2826 else
Manuel Pégourié-Gonnard07617332015-06-24 23:00:03 +02002827 {
2828 if( ssl->f_recv_timeout != NULL )
2829 {
2830 ret = ssl->f_recv_timeout( ssl->p_bio,
2831 ssl->in_hdr + ssl->in_left, len,
2832 ssl->conf->read_timeout );
2833 }
2834 else
2835 {
2836 ret = ssl->f_recv( ssl->p_bio,
2837 ssl->in_hdr + ssl->in_left, len );
2838 }
2839 }
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002840
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002841 MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
Manuel Pégourié-Gonnard07617332015-06-24 23:00:03 +02002842 ssl->in_left, nb_want ) );
2843 MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_recv(_timeout)", ret );
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002844
2845 if( ret == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002846 return( MBEDTLS_ERR_SSL_CONN_EOF );
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002847
2848 if( ret < 0 )
2849 return( ret );
2850
mohammad160352aecb92018-03-28 23:41:40 -07002851 if ( (size_t)ret > len || ( INT_MAX > SIZE_MAX && ret > SIZE_MAX ) )
mohammad16035bd15cb2018-02-28 04:30:59 -08002852 {
Darryl Green11999bb2018-03-13 15:22:58 +00002853 MBEDTLS_SSL_DEBUG_MSG( 1,
2854 ( "f_recv returned %d bytes but only %lu were requested",
mohammad160319d392b2018-04-02 07:25:26 -07002855 ret, (unsigned long)len ) );
mohammad16035bd15cb2018-02-28 04:30:59 -08002856 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2857 }
2858
Manuel Pégourié-Gonnardfe98ace2014-03-24 13:13:01 +01002859 ssl->in_left += ret;
2860 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002861 }
2862
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002863 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002864
2865 return( 0 );
2866}
2867
2868/*
2869 * Flush any data not yet written
2870 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002871int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002872{
Manuel Pégourié-Gonnard5afb1672014-02-16 18:33:22 +01002873 int ret;
Hanno Becker04484622018-08-06 09:49:38 +01002874 unsigned char *buf;
Paul Bakker5121ce52009-01-03 21:22:43 +00002875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002876 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002877
Manuel Pégourié-Gonnarde6bdc442014-09-17 11:34:57 +02002878 if( ssl->f_send == NULL )
2879 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002880 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() "
Manuel Pégourié-Gonnard1b511f92015-05-06 15:54:23 +01002881 "or mbedtls_ssl_set_bio()" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002882 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnarde6bdc442014-09-17 11:34:57 +02002883 }
2884
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01002885 /* Avoid incrementing counter if data is flushed */
2886 if( ssl->out_left == 0 )
2887 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002888 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01002889 return( 0 );
2890 }
2891
Paul Bakker5121ce52009-01-03 21:22:43 +00002892 while( ssl->out_left > 0 )
2893 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002894 MBEDTLS_SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
2895 mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen, ssl->out_left ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002896
Hanno Becker2b1e3542018-08-06 11:19:13 +01002897 buf = ssl->out_hdr - ssl->out_left;
Manuel Pégourié-Gonnarde6bdc442014-09-17 11:34:57 +02002898 ret = ssl->f_send( ssl->p_bio, buf, ssl->out_left );
Paul Bakker186751d2012-05-08 13:16:14 +00002899
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002900 MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_send", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002901
2902 if( ret <= 0 )
2903 return( ret );
2904
mohammad160352aecb92018-03-28 23:41:40 -07002905 if( (size_t)ret > ssl->out_left || ( INT_MAX > SIZE_MAX && ret > SIZE_MAX ) )
mohammad16034bbaeb42018-02-22 04:29:04 -08002906 {
Darryl Green11999bb2018-03-13 15:22:58 +00002907 MBEDTLS_SSL_DEBUG_MSG( 1,
2908 ( "f_send returned %d bytes but only %lu bytes were sent",
mohammad160319d392b2018-04-02 07:25:26 -07002909 ret, (unsigned long)ssl->out_left ) );
mohammad16034bbaeb42018-02-22 04:29:04 -08002910 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2911 }
2912
Paul Bakker5121ce52009-01-03 21:22:43 +00002913 ssl->out_left -= ret;
2914 }
2915
Hanno Becker2b1e3542018-08-06 11:19:13 +01002916#if defined(MBEDTLS_SSL_PROTO_DTLS)
2917 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01002918 {
Hanno Becker2b1e3542018-08-06 11:19:13 +01002919 ssl->out_hdr = ssl->out_buf;
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01002920 }
Hanno Becker2b1e3542018-08-06 11:19:13 +01002921 else
2922#endif
2923 {
2924 ssl->out_hdr = ssl->out_buf + 8;
2925 }
2926 ssl_update_out_pointers( ssl, ssl->transform_out );
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01002927
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002928 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002929
2930 return( 0 );
2931}
2932
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002933/*
2934 * Functions to handle the DTLS retransmission state machine
2935 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002936#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002937/*
2938 * Append current handshake message to current outgoing flight
2939 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002940static int ssl_flight_append( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002941{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002942 mbedtls_ssl_flight_item *msg;
Hanno Becker3b235902018-08-06 09:54:53 +01002943 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_flight_append" ) );
2944 MBEDTLS_SSL_DEBUG_BUF( 4, "message appended to flight",
2945 ssl->out_msg, ssl->out_msglen );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002946
2947 /* Allocate space for current message */
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02002948 if( ( msg = mbedtls_calloc( 1, sizeof( mbedtls_ssl_flight_item ) ) ) == NULL )
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002949 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02002950 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc %d bytes failed",
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002951 sizeof( mbedtls_ssl_flight_item ) ) );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02002952 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002953 }
2954
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02002955 if( ( msg->p = mbedtls_calloc( 1, ssl->out_msglen ) ) == NULL )
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002956 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02002957 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc %d bytes failed", ssl->out_msglen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002958 mbedtls_free( msg );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02002959 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002960 }
2961
2962 /* Copy current handshake message with headers */
2963 memcpy( msg->p, ssl->out_msg, ssl->out_msglen );
2964 msg->len = ssl->out_msglen;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002965 msg->type = ssl->out_msgtype;
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002966 msg->next = NULL;
2967
2968 /* Append to the current flight */
2969 if( ssl->handshake->flight == NULL )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002970 ssl->handshake->flight = msg;
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002971 else
2972 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002973 mbedtls_ssl_flight_item *cur = ssl->handshake->flight;
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002974 while( cur->next != NULL )
2975 cur = cur->next;
2976 cur->next = msg;
2977 }
2978
Hanno Becker3b235902018-08-06 09:54:53 +01002979 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_flight_append" ) );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002980 return( 0 );
2981}
2982
2983/*
2984 * Free the current flight of handshake messages
2985 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002986static void ssl_flight_free( mbedtls_ssl_flight_item *flight )
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002987{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002988 mbedtls_ssl_flight_item *cur = flight;
2989 mbedtls_ssl_flight_item *next;
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002990
2991 while( cur != NULL )
2992 {
2993 next = cur->next;
2994
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002995 mbedtls_free( cur->p );
2996 mbedtls_free( cur );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02002997
2998 cur = next;
2999 }
3000}
3001
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003002#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
3003static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl );
Manuel Pégourié-Gonnardb47368a2014-09-24 13:29:58 +02003004#endif
3005
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003006/*
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003007 * Swap transform_out and out_ctr with the alternative ones
3008 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003009static void ssl_swap_epochs( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003010{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003011 mbedtls_ssl_transform *tmp_transform;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003012 unsigned char tmp_out_ctr[8];
3013
3014 if( ssl->transform_out == ssl->handshake->alt_transform_out )
3015 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003016 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip swap epochs" ) );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003017 return;
3018 }
3019
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003020 MBEDTLS_SSL_DEBUG_MSG( 3, ( "swap epochs" ) );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003021
Manuel Pégourié-Gonnardc715aed2014-09-19 21:39:13 +02003022 /* Swap transforms */
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003023 tmp_transform = ssl->transform_out;
3024 ssl->transform_out = ssl->handshake->alt_transform_out;
3025 ssl->handshake->alt_transform_out = tmp_transform;
3026
Manuel Pégourié-Gonnardc715aed2014-09-19 21:39:13 +02003027 /* Swap epoch + sequence_number */
Hanno Becker19859472018-08-06 09:40:20 +01003028 memcpy( tmp_out_ctr, ssl->cur_out_ctr, 8 );
3029 memcpy( ssl->cur_out_ctr, ssl->handshake->alt_out_ctr, 8 );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003030 memcpy( ssl->handshake->alt_out_ctr, tmp_out_ctr, 8 );
Manuel Pégourié-Gonnardc715aed2014-09-19 21:39:13 +02003031
3032 /* Adjust to the newly activated transform */
Hanno Becker5aa4e2c2018-08-06 09:26:08 +01003033 ssl_update_out_pointers( ssl, ssl->transform_out );
Manuel Pégourié-Gonnardc715aed2014-09-19 21:39:13 +02003034
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003035#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
3036 if( mbedtls_ssl_hw_record_activate != NULL )
Manuel Pégourié-Gonnardc715aed2014-09-19 21:39:13 +02003037 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003038 if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 )
Manuel Pégourié-Gonnardc715aed2014-09-19 21:39:13 +02003039 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003040 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret );
3041 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Manuel Pégourié-Gonnardc715aed2014-09-19 21:39:13 +02003042 }
3043 }
3044#endif
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003045}
3046
3047/*
3048 * Retransmit the current flight of messages.
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003049 */
3050int mbedtls_ssl_resend( mbedtls_ssl_context *ssl )
3051{
3052 int ret = 0;
3053
3054 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> mbedtls_ssl_resend" ) );
3055
3056 ret = mbedtls_ssl_flight_transmit( ssl );
3057
3058 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= mbedtls_ssl_resend" ) );
3059
3060 return( ret );
3061}
3062
3063/*
3064 * Transmit or retransmit the current flight of messages.
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003065 *
3066 * Need to remember the current message in case flush_output returns
3067 * WANT_WRITE, causing us to exit this function and come back later.
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003068 * This function must be called until state is no longer SENDING.
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003069 */
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003070int mbedtls_ssl_flight_transmit( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003071{
Hanno Becker67bc7c32018-08-06 11:33:50 +01003072 int ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003073 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> mbedtls_ssl_flight_transmit" ) );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003074
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003075 if( ssl->handshake->retransmit_state != MBEDTLS_SSL_RETRANS_SENDING )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003076 {
Manuel Pégourié-Gonnard19c62f92018-08-16 10:50:39 +02003077 MBEDTLS_SSL_DEBUG_MSG( 2, ( "initialise flight transmission" ) );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003078
3079 ssl->handshake->cur_msg = ssl->handshake->flight;
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003080 ssl->handshake->cur_msg_p = ssl->handshake->flight->p + 12;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003081 ssl_swap_epochs( ssl );
3082
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003083 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_SENDING;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003084 }
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003085
3086 while( ssl->handshake->cur_msg != NULL )
3087 {
Hanno Becker67bc7c32018-08-06 11:33:50 +01003088 size_t max_frag_len;
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003089 const mbedtls_ssl_flight_item * const cur = ssl->handshake->cur_msg;
Hanno Becker67bc7c32018-08-06 11:33:50 +01003090
Hanno Beckere1dcb032018-08-17 16:47:58 +01003091 int const is_finished =
3092 ( cur->type == MBEDTLS_SSL_MSG_HANDSHAKE &&
3093 cur->p[0] == MBEDTLS_SSL_HS_FINISHED );
3094
Hanno Becker04da1892018-08-14 13:22:10 +01003095 uint8_t const force_flush = ssl->disable_datagram_packing == 1 ?
3096 SSL_FORCE_FLUSH : SSL_DONT_FORCE_FLUSH;
3097
Manuel Pégourié-Gonnardc715aed2014-09-19 21:39:13 +02003098 /* Swap epochs before sending Finished: we can't do it after
3099 * sending ChangeCipherSpec, in case write returns WANT_READ.
3100 * Must be done before copying, may change out_msg pointer */
Hanno Beckere1dcb032018-08-17 16:47:58 +01003101 if( is_finished && ssl->handshake->cur_msg_p == ( cur->p + 12 ) )
Manuel Pégourié-Gonnardc715aed2014-09-19 21:39:13 +02003102 {
Hanno Becker67bc7c32018-08-06 11:33:50 +01003103 MBEDTLS_SSL_DEBUG_MSG( 2, ( "swap epochs to send finished message" ) );
Manuel Pégourié-Gonnardc715aed2014-09-19 21:39:13 +02003104 ssl_swap_epochs( ssl );
3105 }
3106
Hanno Becker67bc7c32018-08-06 11:33:50 +01003107 ret = ssl_get_remaining_payload_in_datagram( ssl );
3108 if( ret < 0 )
3109 return( ret );
3110 max_frag_len = (size_t) ret;
3111
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003112 /* CCS is copied as is, while HS messages may need fragmentation */
3113 if( cur->type == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC )
3114 {
Hanno Becker67bc7c32018-08-06 11:33:50 +01003115 if( max_frag_len == 0 )
3116 {
3117 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
3118 return( ret );
3119
3120 continue;
3121 }
3122
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003123 memcpy( ssl->out_msg, cur->p, cur->len );
Hanno Becker67bc7c32018-08-06 11:33:50 +01003124 ssl->out_msglen = cur->len;
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003125 ssl->out_msgtype = cur->type;
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003126
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003127 /* Update position inside current message */
3128 ssl->handshake->cur_msg_p += cur->len;
3129 }
3130 else
3131 {
3132 const unsigned char * const p = ssl->handshake->cur_msg_p;
3133 const size_t hs_len = cur->len - 12;
3134 const size_t frag_off = p - ( cur->p + 12 );
3135 const size_t rem_len = hs_len - frag_off;
Hanno Becker67bc7c32018-08-06 11:33:50 +01003136 size_t cur_hs_frag_len, max_hs_frag_len;
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003137
Hanno Beckere1dcb032018-08-17 16:47:58 +01003138 if( ( max_frag_len < 12 ) || ( max_frag_len == 12 && hs_len != 0 ) )
Manuel Pégourié-Gonnarda1071a52018-08-20 11:56:14 +02003139 {
Hanno Beckere1dcb032018-08-17 16:47:58 +01003140 if( is_finished )
Hanno Becker67bc7c32018-08-06 11:33:50 +01003141 ssl_swap_epochs( ssl );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003142
Hanno Becker67bc7c32018-08-06 11:33:50 +01003143 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
3144 return( ret );
3145
3146 continue;
3147 }
3148 max_hs_frag_len = max_frag_len - 12;
3149
3150 cur_hs_frag_len = rem_len > max_hs_frag_len ?
3151 max_hs_frag_len : rem_len;
3152
3153 if( frag_off == 0 && cur_hs_frag_len != hs_len )
Manuel Pégourié-Gonnard19c62f92018-08-16 10:50:39 +02003154 {
3155 MBEDTLS_SSL_DEBUG_MSG( 2, ( "fragmenting handshake message (%u > %u)",
Hanno Becker67bc7c32018-08-06 11:33:50 +01003156 (unsigned) cur_hs_frag_len,
3157 (unsigned) max_hs_frag_len ) );
Manuel Pégourié-Gonnard19c62f92018-08-16 10:50:39 +02003158 }
Manuel Pégourié-Gonnardb747c6c2018-08-12 13:28:53 +02003159
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003160 /* Messages are stored with handshake headers as if not fragmented,
3161 * copy beginning of headers then fill fragmentation fields.
3162 * Handshake headers: type(1) len(3) seq(2) f_off(3) f_len(3) */
3163 memcpy( ssl->out_msg, cur->p, 6 );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003164
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003165 ssl->out_msg[6] = ( ( frag_off >> 16 ) & 0xff );
3166 ssl->out_msg[7] = ( ( frag_off >> 8 ) & 0xff );
3167 ssl->out_msg[8] = ( ( frag_off ) & 0xff );
3168
Hanno Becker67bc7c32018-08-06 11:33:50 +01003169 ssl->out_msg[ 9] = ( ( cur_hs_frag_len >> 16 ) & 0xff );
3170 ssl->out_msg[10] = ( ( cur_hs_frag_len >> 8 ) & 0xff );
3171 ssl->out_msg[11] = ( ( cur_hs_frag_len ) & 0xff );
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003172
3173 MBEDTLS_SSL_DEBUG_BUF( 3, "handshake header", ssl->out_msg, 12 );
3174
Hanno Becker3f7b9732018-08-28 09:53:25 +01003175 /* Copy the handshake message content and set records fields */
Hanno Becker67bc7c32018-08-06 11:33:50 +01003176 memcpy( ssl->out_msg + 12, p, cur_hs_frag_len );
3177 ssl->out_msglen = cur_hs_frag_len + 12;
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003178 ssl->out_msgtype = cur->type;
3179
3180 /* Update position inside current message */
Hanno Becker67bc7c32018-08-06 11:33:50 +01003181 ssl->handshake->cur_msg_p += cur_hs_frag_len;
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003182 }
3183
3184 /* If done with the current message move to the next one if any */
3185 if( ssl->handshake->cur_msg_p >= cur->p + cur->len )
3186 {
3187 if( cur->next != NULL )
3188 {
3189 ssl->handshake->cur_msg = cur->next;
3190 ssl->handshake->cur_msg_p = cur->next->p + 12;
3191 }
3192 else
3193 {
3194 ssl->handshake->cur_msg = NULL;
3195 ssl->handshake->cur_msg_p = NULL;
3196 }
3197 }
3198
3199 /* Actually send the message out */
Hanno Becker04da1892018-08-14 13:22:10 +01003200 if( ( ret = mbedtls_ssl_write_record( ssl, force_flush ) ) != 0 )
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003201 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003202 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003203 return( ret );
3204 }
3205 }
3206
Hanno Becker67bc7c32018-08-06 11:33:50 +01003207 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
3208 return( ret );
3209
Manuel Pégourié-Gonnard28f4bea2017-09-13 14:00:05 +02003210 /* Update state and set timer */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003211 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
3212 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED;
Manuel Pégourié-Gonnard23b7b702014-09-25 13:50:12 +02003213 else
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02003214 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003215 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
Manuel Pégourié-Gonnard4e2f2452014-10-02 16:51:56 +02003216 ssl_set_timer( ssl, ssl->handshake->retransmit_timeout );
3217 }
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003218
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003219 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= mbedtls_ssl_flight_transmit" ) );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003220
3221 return( 0 );
3222}
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003223
3224/*
3225 * To be called when the last message of an incoming flight is received.
3226 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003227void mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003228{
3229 /* We won't need to resend that one any more */
3230 ssl_flight_free( ssl->handshake->flight );
3231 ssl->handshake->flight = NULL;
3232 ssl->handshake->cur_msg = NULL;
3233
3234 /* The next incoming flight will start with this msg_seq */
3235 ssl->handshake->in_flight_start_seq = ssl->handshake->in_msg_seq;
3236
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01003237 /* We don't want to remember CCS's across flight boundaries. */
Hanno Beckerd7f8ae22018-08-16 09:45:56 +01003238 ssl->handshake->buffering.seen_ccs = 0;
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01003239
Hanno Becker0271f962018-08-16 13:23:47 +01003240 /* Clear future message buffering structure. */
3241 ssl_buffering_free( ssl );
3242
Manuel Pégourié-Gonnard6c1fa3a2014-10-01 16:58:16 +02003243 /* Cancel timer */
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003244 ssl_set_timer( ssl, 0 );
3245
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003246 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
3247 ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED )
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003248 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003249 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003250 }
3251 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003252 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02003253}
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003254
3255/*
3256 * To be called when the last message of an outgoing flight is send.
3257 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003258void mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003259{
Manuel Pégourié-Gonnard6c1fa3a2014-10-01 16:58:16 +02003260 ssl_reset_retransmit_timeout( ssl );
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +02003261 ssl_set_timer( ssl, ssl->handshake->retransmit_timeout );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003262
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003263 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
3264 ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED )
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003265 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003266 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED;
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003267 }
3268 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003269 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02003270}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003271#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003272
Paul Bakker5121ce52009-01-03 21:22:43 +00003273/*
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003274 * Handshake layer functions
Paul Bakker5121ce52009-01-03 21:22:43 +00003275 */
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003276
3277/*
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003278 * Write (DTLS: or queue) current handshake (including CCS) message.
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003279 *
3280 * - fill in handshake headers
3281 * - update handshake checksum
3282 * - DTLS: save message for resending
3283 * - then pass to the record layer
3284 *
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003285 * DTLS: except for HelloRequest, messages are only queued, and will only be
3286 * actually sent when calling flight_transmit() or resend().
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003287 *
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003288 * Inputs:
3289 * - ssl->out_msglen: 4 + actual handshake message len
3290 * (4 is the size of handshake headers for TLS)
3291 * - ssl->out_msg[0]: the handshake type (ClientHello, ServerHello, etc)
3292 * - ssl->out_msg + 4: the handshake message body
3293 *
Manuel Pégourié-Gonnard065a2a32018-08-20 11:09:26 +02003294 * Outputs, ie state before passing to flight_append() or write_record():
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003295 * - ssl->out_msglen: the length of the record contents
3296 * (including handshake headers but excluding record headers)
3297 * - ssl->out_msg: the record contents (handshake headers + content)
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003298 */
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003299int mbedtls_ssl_write_handshake_msg( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003300{
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003301 int ret;
3302 const size_t hs_len = ssl->out_msglen - 4;
3303 const unsigned char hs_type = ssl->out_msg[0];
Paul Bakker5121ce52009-01-03 21:22:43 +00003304
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003305 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write handshake message" ) );
3306
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003307 /*
3308 * Sanity checks
3309 */
Hanno Beckerc83d2b32018-08-22 16:05:47 +01003310 if( ssl->out_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE &&
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003311 ssl->out_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC )
3312 {
Hanno Beckerc83d2b32018-08-22 16:05:47 +01003313 /* In SSLv3, the client might send a NoCertificate alert. */
3314#if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C)
3315 if( ! ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 &&
3316 ssl->out_msgtype == MBEDTLS_SSL_MSG_ALERT &&
3317 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) )
3318#endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */
3319 {
3320 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3321 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3322 }
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003323 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003324
Hanno Beckerf6d6e302018-11-07 11:57:51 +00003325 /* Whenever we send anything different from a
3326 * HelloRequest we should be in a handshake - double check. */
3327 if( ! ( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
3328 hs_type == MBEDTLS_SSL_HS_HELLO_REQUEST ) &&
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003329 ssl->handshake == NULL )
3330 {
3331 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3332 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3333 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003334
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003335#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003336 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003337 ssl->handshake != NULL &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003338 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003339 {
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003340 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3341 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003342 }
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003343#endif
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003344
Hanno Beckerb50a2532018-08-06 11:52:54 +01003345 /* Double-check that we did not exceed the bounds
3346 * of the outgoing record buffer.
3347 * This should never fail as the various message
3348 * writing functions must obey the bounds of the
3349 * outgoing record buffer, but better be safe.
3350 *
3351 * Note: We deliberately do not check for the MTU or MFL here.
3352 */
3353 if( ssl->out_msglen > MBEDTLS_SSL_OUT_CONTENT_LEN )
3354 {
3355 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Record too large: "
3356 "size %u, maximum %u",
3357 (unsigned) ssl->out_msglen,
3358 (unsigned) MBEDTLS_SSL_OUT_CONTENT_LEN ) );
3359 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3360 }
3361
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003362 /*
3363 * Fill handshake headers
3364 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003365 if( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00003366 {
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003367 ssl->out_msg[1] = (unsigned char)( hs_len >> 16 );
3368 ssl->out_msg[2] = (unsigned char)( hs_len >> 8 );
3369 ssl->out_msg[3] = (unsigned char)( hs_len );
Paul Bakker5121ce52009-01-03 21:22:43 +00003370
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01003371 /*
3372 * DTLS has additional fields in the Handshake layer,
3373 * between the length field and the actual payload:
3374 * uint16 message_seq;
3375 * uint24 fragment_offset;
3376 * uint24 fragment_length;
3377 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003378#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003379 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01003380 {
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01003381 /* Make room for the additional DTLS fields */
Angus Grattond8213d02016-05-25 20:56:48 +10003382 if( MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen < 8 )
Hanno Becker9648f8b2017-09-18 10:55:54 +01003383 {
3384 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS handshake message too large: "
3385 "size %u, maximum %u",
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003386 (unsigned) ( hs_len ),
Angus Grattond8213d02016-05-25 20:56:48 +10003387 (unsigned) ( MBEDTLS_SSL_OUT_CONTENT_LEN - 12 ) ) );
Hanno Becker9648f8b2017-09-18 10:55:54 +01003388 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3389 }
3390
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003391 memmove( ssl->out_msg + 12, ssl->out_msg + 4, hs_len );
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01003392 ssl->out_msglen += 8;
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01003393
Manuel Pégourié-Gonnardc392b242014-08-19 17:53:11 +02003394 /* Write message_seq and update it, except for HelloRequest */
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003395 if( hs_type != MBEDTLS_SSL_HS_HELLO_REQUEST )
Manuel Pégourié-Gonnardc392b242014-08-19 17:53:11 +02003396 {
Manuel Pégourié-Gonnardd9ba0d92014-09-02 18:30:26 +02003397 ssl->out_msg[4] = ( ssl->handshake->out_msg_seq >> 8 ) & 0xFF;
3398 ssl->out_msg[5] = ( ssl->handshake->out_msg_seq ) & 0xFF;
3399 ++( ssl->handshake->out_msg_seq );
Manuel Pégourié-Gonnardc392b242014-08-19 17:53:11 +02003400 }
3401 else
3402 {
3403 ssl->out_msg[4] = 0;
3404 ssl->out_msg[5] = 0;
3405 }
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01003406
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003407 /* Handshake hashes are computed without fragmentation,
3408 * so set frag_offset = 0 and frag_len = hs_len for now */
Manuel Pégourié-Gonnarde89bcf02014-02-18 18:50:02 +01003409 memset( ssl->out_msg + 6, 0x00, 3 );
3410 memcpy( ssl->out_msg + 9, ssl->out_msg + 1, 3 );
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01003411 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003412#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01003413
Hanno Becker0207e532018-08-28 10:28:28 +01003414 /* Update running hashes of handshake messages seen */
Manuel Pégourié-Gonnard9c3a8ca2017-09-13 09:54:27 +02003415 if( hs_type != MBEDTLS_SSL_HS_HELLO_REQUEST )
3416 ssl->handshake->update_checksum( ssl, ssl->out_msg, ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00003417 }
3418
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003419 /* Either send now, or just save to be sent (and resent) later */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003420#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003421 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Hanno Beckerf6d6e302018-11-07 11:57:51 +00003422 ! ( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
3423 hs_type == MBEDTLS_SSL_HS_HELLO_REQUEST ) )
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003424 {
3425 if( ( ret = ssl_flight_append( ssl ) ) != 0 )
3426 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003427 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_flight_append", ret );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003428 return( ret );
3429 }
3430 }
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003431 else
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003432#endif
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003433 {
Hanno Becker67bc7c32018-08-06 11:33:50 +01003434 if( ( ret = mbedtls_ssl_write_record( ssl, SSL_FORCE_FLUSH ) ) != 0 )
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003435 {
3436 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_record", ret );
3437 return( ret );
3438 }
3439 }
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003440
3441 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write handshake message" ) );
3442
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02003443 return( 0 );
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003444}
3445
3446/*
3447 * Record layer functions
3448 */
3449
3450/*
3451 * Write current record.
3452 *
3453 * Uses:
3454 * - ssl->out_msgtype: type of the message (AppData, Handshake, Alert, CCS)
3455 * - ssl->out_msglen: length of the record content (excl headers)
3456 * - ssl->out_msg: record content
3457 */
Hanno Becker67bc7c32018-08-06 11:33:50 +01003458int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush )
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003459{
3460 int ret, done = 0;
3461 size_t len = ssl->out_msglen;
Hanno Becker67bc7c32018-08-06 11:33:50 +01003462 uint8_t flush = force_flush;
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02003463
3464 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write record" ) );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02003465
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003466#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00003467 if( ssl->transform_out != NULL &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003468 ssl->session_out->compression == MBEDTLS_SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00003469 {
3470 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
3471 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003472 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00003473 return( ret );
3474 }
3475
3476 len = ssl->out_msglen;
3477 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003478#endif /*MBEDTLS_ZLIB_SUPPORT */
Paul Bakker2770fbd2012-07-03 13:30:23 +00003479
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003480#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
3481 if( mbedtls_ssl_hw_record_write != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00003482 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003483 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_write()" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003484
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003485 ret = mbedtls_ssl_hw_record_write( ssl );
3486 if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH )
Paul Bakker05ef8352012-05-08 09:17:57 +00003487 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003488 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_write", ret );
3489 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Paul Bakker05ef8352012-05-08 09:17:57 +00003490 }
Paul Bakkerc7878112012-12-19 14:41:14 +01003491
3492 if( ret == 0 )
3493 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00003494 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003495#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
Paul Bakker05ef8352012-05-08 09:17:57 +00003496 if( !done )
3497 {
Hanno Becker2b1e3542018-08-06 11:19:13 +01003498 unsigned i;
3499 size_t protected_record_size;
3500
Paul Bakker05ef8352012-05-08 09:17:57 +00003501 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003502 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003503 ssl->conf->transport, ssl->out_hdr + 1 );
Manuel Pégourié-Gonnard507e1e42014-02-13 11:17:34 +01003504
Hanno Becker19859472018-08-06 09:40:20 +01003505 memcpy( ssl->out_ctr, ssl->cur_out_ctr, 8 );
Manuel Pégourié-Gonnard507e1e42014-02-13 11:17:34 +01003506 ssl->out_len[0] = (unsigned char)( len >> 8 );
3507 ssl->out_len[1] = (unsigned char)( len );
Paul Bakker05ef8352012-05-08 09:17:57 +00003508
Paul Bakker48916f92012-09-16 19:57:18 +00003509 if( ssl->transform_out != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00003510 {
Hanno Becker3307b532017-12-27 21:37:21 +00003511 mbedtls_record rec;
3512
3513 rec.buf = ssl->out_iv;
3514 rec.buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN -
3515 ( ssl->out_iv - ssl->out_buf );
3516 rec.data_len = ssl->out_msglen;
3517 rec.data_offset = ssl->out_msg - rec.buf;
3518
3519 memcpy( &rec.ctr[0], ssl->out_ctr, 8 );
3520 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
3521 ssl->conf->transport, rec.ver );
3522 rec.type = ssl->out_msgtype;
3523
Hanno Becker611a83b2018-01-03 14:27:32 +00003524 if( ( ret = mbedtls_ssl_encrypt_buf( ssl, ssl->transform_out, &rec,
Hanno Becker3307b532017-12-27 21:37:21 +00003525 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +00003526 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003527 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
Paul Bakker05ef8352012-05-08 09:17:57 +00003528 return( ret );
3529 }
3530
Hanno Becker3307b532017-12-27 21:37:21 +00003531 if( rec.data_offset != 0 )
3532 {
3533 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3534 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3535 }
3536
Hanno Beckerc5aee962019-03-14 12:56:23 +00003537 ssl->out_msglen = len = rec.data_len;
Hanno Becker3307b532017-12-27 21:37:21 +00003538 ssl->out_len[0] = (unsigned char)( rec.data_len >> 8 );
3539 ssl->out_len[1] = (unsigned char)( rec.data_len );
Paul Bakker05ef8352012-05-08 09:17:57 +00003540 }
3541
Hanno Becker2b1e3542018-08-06 11:19:13 +01003542 protected_record_size = len + mbedtls_ssl_hdr_len( ssl );
3543
3544#if defined(MBEDTLS_SSL_PROTO_DTLS)
3545 /* In case of DTLS, double-check that we don't exceed
3546 * the remaining space in the datagram. */
3547 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
3548 {
Hanno Becker554b0af2018-08-22 20:33:41 +01003549 ret = ssl_get_remaining_space_in_datagram( ssl );
Hanno Becker2b1e3542018-08-06 11:19:13 +01003550 if( ret < 0 )
3551 return( ret );
3552
3553 if( protected_record_size > (size_t) ret )
3554 {
3555 /* Should never happen */
3556 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3557 }
3558 }
3559#endif /* MBEDTLS_SSL_PROTO_DTLS */
Paul Bakker05ef8352012-05-08 09:17:57 +00003560
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003561 MBEDTLS_SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
Hanno Beckerecbdf1c2018-08-28 09:53:54 +01003562 "version = [%d:%d], msglen = %d",
3563 ssl->out_hdr[0], ssl->out_hdr[1],
3564 ssl->out_hdr[2], len ) );
Paul Bakker05ef8352012-05-08 09:17:57 +00003565
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003566 MBEDTLS_SSL_DEBUG_BUF( 4, "output record sent to network",
Hanno Beckerecbdf1c2018-08-28 09:53:54 +01003567 ssl->out_hdr, protected_record_size );
Hanno Becker2b1e3542018-08-06 11:19:13 +01003568
3569 ssl->out_left += protected_record_size;
3570 ssl->out_hdr += protected_record_size;
3571 ssl_update_out_pointers( ssl, ssl->transform_out );
3572
Hanno Becker04484622018-08-06 09:49:38 +01003573 for( i = 8; i > ssl_ep_len( ssl ); i-- )
3574 if( ++ssl->cur_out_ctr[i - 1] != 0 )
3575 break;
3576
3577 /* The loop goes to its end iff the counter is wrapping */
3578 if( i == ssl_ep_len( ssl ) )
3579 {
3580 MBEDTLS_SSL_DEBUG_MSG( 1, ( "outgoing message counter would wrap" ) );
3581 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
3582 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003583 }
3584
Hanno Becker67bc7c32018-08-06 11:33:50 +01003585#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker47db8772018-08-21 13:32:13 +01003586 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3587 flush == SSL_DONT_FORCE_FLUSH )
Hanno Becker67bc7c32018-08-06 11:33:50 +01003588 {
Hanno Becker1f5a15d2018-08-21 13:31:31 +01003589 size_t remaining;
3590 ret = ssl_get_remaining_payload_in_datagram( ssl );
3591 if( ret < 0 )
3592 {
3593 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_remaining_payload_in_datagram",
3594 ret );
3595 return( ret );
3596 }
3597
3598 remaining = (size_t) ret;
Hanno Becker67bc7c32018-08-06 11:33:50 +01003599 if( remaining == 0 )
Hanno Beckerf0da6672018-08-28 09:55:10 +01003600 {
Hanno Becker67bc7c32018-08-06 11:33:50 +01003601 flush = SSL_FORCE_FLUSH;
Hanno Beckerf0da6672018-08-28 09:55:10 +01003602 }
Hanno Becker67bc7c32018-08-06 11:33:50 +01003603 else
3604 {
Hanno Becker513815a2018-08-20 11:56:09 +01003605 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Still %u bytes available in current datagram", (unsigned) remaining ) );
Hanno Becker67bc7c32018-08-06 11:33:50 +01003606 }
3607 }
3608#endif /* MBEDTLS_SSL_PROTO_DTLS */
3609
3610 if( ( flush == SSL_FORCE_FLUSH ) &&
3611 ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003612 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003613 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flush_output", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003614 return( ret );
3615 }
3616
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003617 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write record" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003618
3619 return( 0 );
3620}
3621
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003622#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Beckere25e3b72018-08-16 09:30:53 +01003623
3624static int ssl_hs_is_proper_fragment( mbedtls_ssl_context *ssl )
3625{
3626 if( ssl->in_msglen < ssl->in_hslen ||
3627 memcmp( ssl->in_msg + 6, "\0\0\0", 3 ) != 0 ||
3628 memcmp( ssl->in_msg + 9, ssl->in_msg + 1, 3 ) != 0 )
3629 {
3630 return( 1 );
3631 }
3632 return( 0 );
3633}
Hanno Becker44650b72018-08-16 12:51:11 +01003634
Hanno Beckercd9dcda2018-08-28 17:18:56 +01003635static uint32_t ssl_get_hs_frag_len( mbedtls_ssl_context const *ssl )
Hanno Becker44650b72018-08-16 12:51:11 +01003636{
3637 return( ( ssl->in_msg[9] << 16 ) |
3638 ( ssl->in_msg[10] << 8 ) |
3639 ssl->in_msg[11] );
3640}
3641
Hanno Beckercd9dcda2018-08-28 17:18:56 +01003642static uint32_t ssl_get_hs_frag_off( mbedtls_ssl_context const *ssl )
Hanno Becker44650b72018-08-16 12:51:11 +01003643{
3644 return( ( ssl->in_msg[6] << 16 ) |
3645 ( ssl->in_msg[7] << 8 ) |
3646 ssl->in_msg[8] );
3647}
3648
Hanno Beckercd9dcda2018-08-28 17:18:56 +01003649static int ssl_check_hs_header( mbedtls_ssl_context const *ssl )
Hanno Becker44650b72018-08-16 12:51:11 +01003650{
3651 uint32_t msg_len, frag_off, frag_len;
3652
3653 msg_len = ssl_get_hs_total_len( ssl );
3654 frag_off = ssl_get_hs_frag_off( ssl );
3655 frag_len = ssl_get_hs_frag_len( ssl );
3656
3657 if( frag_off > msg_len )
3658 return( -1 );
3659
3660 if( frag_len > msg_len - frag_off )
3661 return( -1 );
3662
3663 if( frag_len + 12 > ssl->in_msglen )
3664 return( -1 );
3665
3666 return( 0 );
3667}
3668
Manuel Pégourié-Gonnard502bf302014-08-20 13:12:58 +02003669/*
3670 * Mark bits in bitmask (used for DTLS HS reassembly)
3671 */
3672static void ssl_bitmask_set( unsigned char *mask, size_t offset, size_t len )
3673{
3674 unsigned int start_bits, end_bits;
3675
3676 start_bits = 8 - ( offset % 8 );
3677 if( start_bits != 8 )
3678 {
3679 size_t first_byte_idx = offset / 8;
3680
Manuel Pégourié-Gonnardac030522014-09-02 14:23:40 +02003681 /* Special case */
3682 if( len <= start_bits )
3683 {
3684 for( ; len != 0; len-- )
3685 mask[first_byte_idx] |= 1 << ( start_bits - len );
3686
3687 /* Avoid potential issues with offset or len becoming invalid */
3688 return;
3689 }
3690
Manuel Pégourié-Gonnard502bf302014-08-20 13:12:58 +02003691 offset += start_bits; /* Now offset % 8 == 0 */
3692 len -= start_bits;
3693
3694 for( ; start_bits != 0; start_bits-- )
3695 mask[first_byte_idx] |= 1 << ( start_bits - 1 );
3696 }
3697
3698 end_bits = len % 8;
3699 if( end_bits != 0 )
3700 {
3701 size_t last_byte_idx = ( offset + len ) / 8;
3702
3703 len -= end_bits; /* Now len % 8 == 0 */
3704
3705 for( ; end_bits != 0; end_bits-- )
3706 mask[last_byte_idx] |= 1 << ( 8 - end_bits );
3707 }
3708
3709 memset( mask + offset / 8, 0xFF, len / 8 );
3710}
3711
3712/*
3713 * Check that bitmask is full
3714 */
3715static int ssl_bitmask_check( unsigned char *mask, size_t len )
3716{
3717 size_t i;
3718
3719 for( i = 0; i < len / 8; i++ )
3720 if( mask[i] != 0xFF )
3721 return( -1 );
3722
3723 for( i = 0; i < len % 8; i++ )
3724 if( ( mask[len / 8] & ( 1 << ( 7 - i ) ) ) == 0 )
3725 return( -1 );
3726
3727 return( 0 );
3728}
3729
Hanno Becker56e205e2018-08-16 09:06:12 +01003730/* msg_len does not include the handshake header */
Hanno Becker65dc8852018-08-23 09:40:49 +01003731static size_t ssl_get_reassembly_buffer_size( size_t msg_len,
Hanno Becker2a97b0e2018-08-21 15:47:49 +01003732 unsigned add_bitmap )
Manuel Pégourié-Gonnarded79a4b2014-08-20 10:43:01 +02003733{
Hanno Becker56e205e2018-08-16 09:06:12 +01003734 size_t alloc_len;
Manuel Pégourié-Gonnard502bf302014-08-20 13:12:58 +02003735
Hanno Becker56e205e2018-08-16 09:06:12 +01003736 alloc_len = 12; /* Handshake header */
3737 alloc_len += msg_len; /* Content buffer */
Manuel Pégourié-Gonnarded79a4b2014-08-20 10:43:01 +02003738
Hanno Beckerd07df862018-08-16 09:14:58 +01003739 if( add_bitmap )
3740 alloc_len += msg_len / 8 + ( msg_len % 8 != 0 ); /* Bitmap */
Manuel Pégourié-Gonnard502bf302014-08-20 13:12:58 +02003741
Hanno Becker2a97b0e2018-08-21 15:47:49 +01003742 return( alloc_len );
Manuel Pégourié-Gonnarded79a4b2014-08-20 10:43:01 +02003743}
Hanno Becker56e205e2018-08-16 09:06:12 +01003744
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003745#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnarded79a4b2014-08-20 10:43:01 +02003746
Hanno Beckercd9dcda2018-08-28 17:18:56 +01003747static uint32_t ssl_get_hs_total_len( mbedtls_ssl_context const *ssl )
Hanno Becker12555c62018-08-16 12:47:53 +01003748{
3749 return( ( ssl->in_msg[1] << 16 ) |
3750 ( ssl->in_msg[2] << 8 ) |
3751 ssl->in_msg[3] );
3752}
Hanno Beckere25e3b72018-08-16 09:30:53 +01003753
Simon Butcher99000142016-10-13 17:21:01 +01003754int mbedtls_ssl_prepare_handshake_record( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnarda59543a2014-02-18 11:33:49 +01003755{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003756 if( ssl->in_msglen < mbedtls_ssl_hs_hdr_len( ssl ) )
Manuel Pégourié-Gonnard9d1d7192014-09-03 11:01:14 +02003757 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003758 MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake message too short: %d",
Manuel Pégourié-Gonnard9d1d7192014-09-03 11:01:14 +02003759 ssl->in_msglen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003760 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
Manuel Pégourié-Gonnard9d1d7192014-09-03 11:01:14 +02003761 }
3762
Hanno Becker12555c62018-08-16 12:47:53 +01003763 ssl->in_hslen = mbedtls_ssl_hs_hdr_len( ssl ) + ssl_get_hs_total_len( ssl );
Manuel Pégourié-Gonnarda59543a2014-02-18 11:33:49 +01003764
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003765 MBEDTLS_SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
Manuel Pégourié-Gonnarda59543a2014-02-18 11:33:49 +01003766 " %d, type = %d, hslen = %d",
Manuel Pégourié-Gonnardce441b32014-02-18 17:40:52 +01003767 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
Manuel Pégourié-Gonnarda59543a2014-02-18 11:33:49 +01003768
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003769#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003770 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnarda59543a2014-02-18 11:33:49 +01003771 {
Manuel Pégourié-Gonnarded79a4b2014-08-20 10:43:01 +02003772 int ret;
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02003773 unsigned int recv_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5];
Manuel Pégourié-Gonnarded79a4b2014-08-20 10:43:01 +02003774
Hanno Becker44650b72018-08-16 12:51:11 +01003775 if( ssl_check_hs_header( ssl ) != 0 )
3776 {
3777 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid handshake header" ) );
3778 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
3779 }
3780
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02003781 if( ssl->handshake != NULL &&
Hanno Beckerc76c6192017-06-06 10:03:17 +01003782 ( ( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER &&
3783 recv_msg_seq != ssl->handshake->in_msg_seq ) ||
3784 ( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER &&
3785 ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO ) ) )
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02003786 {
Hanno Becker9e1ec222018-08-15 15:54:43 +01003787 if( recv_msg_seq > ssl->handshake->in_msg_seq )
3788 {
3789 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received future handshake message of sequence number %u (next %u)",
3790 recv_msg_seq,
3791 ssl->handshake->in_msg_seq ) );
3792 return( MBEDTLS_ERR_SSL_EARLY_MESSAGE );
3793 }
3794
Manuel Pégourié-Gonnardfc572dd2014-10-09 17:56:57 +02003795 /* Retransmit only on last message from previous flight, to avoid
3796 * too many retransmissions.
3797 * Besides, No sane server ever retransmits HelloVerifyRequest */
3798 if( recv_msg_seq == ssl->handshake->in_flight_start_seq - 1 &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003799 ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
Manuel Pégourié-Gonnard6a2bdfa2014-09-19 21:18:23 +02003800 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003801 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received message from last flight, "
Manuel Pégourié-Gonnard6a2bdfa2014-09-19 21:18:23 +02003802 "message_seq = %d, start_of_flight = %d",
3803 recv_msg_seq,
3804 ssl->handshake->in_flight_start_seq ) );
3805
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003806 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )
Manuel Pégourié-Gonnard6a2bdfa2014-09-19 21:18:23 +02003807 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003808 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret );
Manuel Pégourié-Gonnard6a2bdfa2014-09-19 21:18:23 +02003809 return( ret );
3810 }
3811 }
3812 else
3813 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003814 MBEDTLS_SSL_DEBUG_MSG( 2, ( "dropping out-of-sequence message: "
Manuel Pégourié-Gonnard6a2bdfa2014-09-19 21:18:23 +02003815 "message_seq = %d, expected = %d",
3816 recv_msg_seq,
3817 ssl->handshake->in_msg_seq ) );
3818 }
3819
Hanno Becker90333da2017-10-10 11:27:13 +01003820 return( MBEDTLS_ERR_SSL_CONTINUE_PROCESSING );
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02003821 }
3822 /* Wait until message completion to increment in_msg_seq */
Manuel Pégourié-Gonnarded79a4b2014-08-20 10:43:01 +02003823
Hanno Becker6d97ef52018-08-16 13:09:04 +01003824 /* Message reassembly is handled alongside buffering of future
3825 * messages; the commonality is that both handshake fragments and
Hanno Becker83ab41c2018-08-28 17:19:38 +01003826 * future messages cannot be forwarded immediately to the
Hanno Becker6d97ef52018-08-16 13:09:04 +01003827 * handshake logic layer. */
Hanno Beckere25e3b72018-08-16 09:30:53 +01003828 if( ssl_hs_is_proper_fragment( ssl ) == 1 )
Manuel Pégourié-Gonnarded79a4b2014-08-20 10:43:01 +02003829 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003830 MBEDTLS_SSL_DEBUG_MSG( 2, ( "found fragmented DTLS handshake message" ) );
Hanno Becker6d97ef52018-08-16 13:09:04 +01003831 return( MBEDTLS_ERR_SSL_EARLY_MESSAGE );
Manuel Pégourié-Gonnarded79a4b2014-08-20 10:43:01 +02003832 }
3833 }
3834 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003835#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnarded79a4b2014-08-20 10:43:01 +02003836 /* With TLS we don't handle fragmentation (for now) */
3837 if( ssl->in_msglen < ssl->in_hslen )
3838 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003839 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLS handshake fragmentation not supported" ) );
3840 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnarda59543a2014-02-18 11:33:49 +01003841 }
3842
Simon Butcher99000142016-10-13 17:21:01 +01003843 return( 0 );
3844}
3845
3846void mbedtls_ssl_update_handshake_status( mbedtls_ssl_context *ssl )
3847{
Hanno Becker0271f962018-08-16 13:23:47 +01003848 mbedtls_ssl_handshake_params * const hs = ssl->handshake;
Simon Butcher99000142016-10-13 17:21:01 +01003849
Hanno Becker0271f962018-08-16 13:23:47 +01003850 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER && hs != NULL )
Manuel Pégourié-Gonnard14bf7062015-06-23 14:07:13 +02003851 {
Manuel Pégourié-Gonnarda59543a2014-02-18 11:33:49 +01003852 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Manuel Pégourié-Gonnard14bf7062015-06-23 14:07:13 +02003853 }
Manuel Pégourié-Gonnarda59543a2014-02-18 11:33:49 +01003854
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02003855 /* Handshake message is complete, increment counter */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003856#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003857 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02003858 ssl->handshake != NULL )
3859 {
Hanno Becker0271f962018-08-16 13:23:47 +01003860 unsigned offset;
3861 mbedtls_ssl_hs_buffer *hs_buf;
Hanno Beckere25e3b72018-08-16 09:30:53 +01003862
Hanno Becker0271f962018-08-16 13:23:47 +01003863 /* Increment handshake sequence number */
3864 hs->in_msg_seq++;
3865
3866 /*
3867 * Clear up handshake buffering and reassembly structure.
3868 */
3869
3870 /* Free first entry */
Hanno Beckere605b192018-08-21 15:59:07 +01003871 ssl_buffering_free_slot( ssl, 0 );
Hanno Becker0271f962018-08-16 13:23:47 +01003872
3873 /* Shift all other entries */
Hanno Beckere605b192018-08-21 15:59:07 +01003874 for( offset = 0, hs_buf = &hs->buffering.hs[0];
3875 offset + 1 < MBEDTLS_SSL_MAX_BUFFERED_HS;
Hanno Becker0271f962018-08-16 13:23:47 +01003876 offset++, hs_buf++ )
3877 {
3878 *hs_buf = *(hs_buf + 1);
3879 }
3880
3881 /* Create a fresh last entry */
3882 memset( hs_buf, 0, sizeof( mbedtls_ssl_hs_buffer ) );
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02003883 }
3884#endif
Manuel Pégourié-Gonnarda59543a2014-02-18 11:33:49 +01003885}
3886
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02003887/*
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003888 * DTLS anti-replay: RFC 6347 4.1.2.6
3889 *
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003890 * in_window is a field of bits numbered from 0 (lsb) to 63 (msb).
3891 * Bit n is set iff record number in_window_top - n has been seen.
3892 *
3893 * Usually, in_window_top is the last record number seen and the lsb of
3894 * in_window is set. The only exception is the initial state (record number 0
3895 * not seen yet).
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003896 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003897#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
3898static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003899{
3900 ssl->in_window_top = 0;
3901 ssl->in_window = 0;
3902}
3903
3904static inline uint64_t ssl_load_six_bytes( unsigned char *buf )
3905{
3906 return( ( (uint64_t) buf[0] << 40 ) |
3907 ( (uint64_t) buf[1] << 32 ) |
3908 ( (uint64_t) buf[2] << 24 ) |
3909 ( (uint64_t) buf[3] << 16 ) |
3910 ( (uint64_t) buf[4] << 8 ) |
3911 ( (uint64_t) buf[5] ) );
3912}
3913
3914/*
3915 * Return 0 if sequence number is acceptable, -1 otherwise
3916 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003917int mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003918{
3919 uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 );
3920 uint64_t bit;
3921
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003922 if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED )
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02003923 return( 0 );
3924
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003925 if( rec_seqnum > ssl->in_window_top )
3926 return( 0 );
3927
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003928 bit = ssl->in_window_top - rec_seqnum;
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003929
3930 if( bit >= 64 )
3931 return( -1 );
3932
3933 if( ( ssl->in_window & ( (uint64_t) 1 << bit ) ) != 0 )
3934 return( -1 );
3935
3936 return( 0 );
3937}
3938
3939/*
3940 * Update replay window on new validated record
3941 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003942void mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003943{
3944 uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 );
3945
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02003946 if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED )
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02003947 return;
3948
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003949 if( rec_seqnum > ssl->in_window_top )
3950 {
3951 /* Update window_top and the contents of the window */
3952 uint64_t shift = rec_seqnum - ssl->in_window_top;
3953
3954 if( shift >= 64 )
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003955 ssl->in_window = 1;
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003956 else
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003957 {
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003958 ssl->in_window <<= shift;
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003959 ssl->in_window |= 1;
3960 }
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003961
3962 ssl->in_window_top = rec_seqnum;
3963 }
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003964 else
3965 {
3966 /* Mark that number as seen in the current window */
Manuel Pégourié-Gonnard4956fd72014-09-24 11:13:44 +02003967 uint64_t bit = ssl->in_window_top - rec_seqnum;
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003968
3969 if( bit < 64 ) /* Always true, but be extra sure */
3970 ssl->in_window |= (uint64_t) 1 << bit;
3971 }
3972}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003973#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02003974
Manuel Pégourié-Gonnardddfe5d22015-09-09 12:46:16 +02003975#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02003976/* Forward declaration */
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02003977static int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial );
3978
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02003979/*
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02003980 * Without any SSL context, check if a datagram looks like a ClientHello with
3981 * a valid cookie, and if it doesn't, generate a HelloVerifyRequest message.
Simon Butcher0789aed2015-09-11 17:15:17 +01003982 * Both input and output include full DTLS headers.
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02003983 *
3984 * - if cookie is valid, return 0
3985 * - if ClientHello looks superficially valid but cookie is not,
3986 * fill obuf and set olen, then
3987 * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED
3988 * - otherwise return a specific error code
3989 */
3990static int ssl_check_dtls_clihlo_cookie(
3991 mbedtls_ssl_cookie_write_t *f_cookie_write,
3992 mbedtls_ssl_cookie_check_t *f_cookie_check,
3993 void *p_cookie,
3994 const unsigned char *cli_id, size_t cli_id_len,
3995 const unsigned char *in, size_t in_len,
3996 unsigned char *obuf, size_t buf_len, size_t *olen )
3997{
3998 size_t sid_len, cookie_len;
3999 unsigned char *p;
4000
4001 if( f_cookie_write == NULL || f_cookie_check == NULL )
4002 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4003
4004 /*
4005 * Structure of ClientHello with record and handshake headers,
4006 * and expected values. We don't need to check a lot, more checks will be
4007 * done when actually parsing the ClientHello - skipping those checks
4008 * avoids code duplication and does not make cookie forging any easier.
4009 *
4010 * 0-0 ContentType type; copied, must be handshake
4011 * 1-2 ProtocolVersion version; copied
4012 * 3-4 uint16 epoch; copied, must be 0
4013 * 5-10 uint48 sequence_number; copied
4014 * 11-12 uint16 length; (ignored)
4015 *
4016 * 13-13 HandshakeType msg_type; (ignored)
4017 * 14-16 uint24 length; (ignored)
4018 * 17-18 uint16 message_seq; copied
4019 * 19-21 uint24 fragment_offset; copied, must be 0
4020 * 22-24 uint24 fragment_length; (ignored)
4021 *
4022 * 25-26 ProtocolVersion client_version; (ignored)
4023 * 27-58 Random random; (ignored)
4024 * 59-xx SessionID session_id; 1 byte len + sid_len content
4025 * 60+ opaque cookie<0..2^8-1>; 1 byte len + content
4026 * ...
4027 *
4028 * Minimum length is 61 bytes.
4029 */
4030 if( in_len < 61 ||
4031 in[0] != MBEDTLS_SSL_MSG_HANDSHAKE ||
4032 in[3] != 0 || in[4] != 0 ||
4033 in[19] != 0 || in[20] != 0 || in[21] != 0 )
4034 {
4035 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
4036 }
4037
4038 sid_len = in[59];
4039 if( sid_len > in_len - 61 )
4040 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
4041
4042 cookie_len = in[60 + sid_len];
4043 if( cookie_len > in_len - 60 )
4044 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );
4045
4046 if( f_cookie_check( p_cookie, in + sid_len + 61, cookie_len,
4047 cli_id, cli_id_len ) == 0 )
4048 {
4049 /* Valid cookie */
4050 return( 0 );
4051 }
4052
4053 /*
4054 * If we get here, we've got an invalid cookie, let's prepare HVR.
4055 *
4056 * 0-0 ContentType type; copied
4057 * 1-2 ProtocolVersion version; copied
4058 * 3-4 uint16 epoch; copied
4059 * 5-10 uint48 sequence_number; copied
4060 * 11-12 uint16 length; olen - 13
4061 *
4062 * 13-13 HandshakeType msg_type; hello_verify_request
4063 * 14-16 uint24 length; olen - 25
4064 * 17-18 uint16 message_seq; copied
4065 * 19-21 uint24 fragment_offset; copied
4066 * 22-24 uint24 fragment_length; olen - 25
4067 *
4068 * 25-26 ProtocolVersion server_version; 0xfe 0xff
4069 * 27-27 opaque cookie<0..2^8-1>; cookie_len = olen - 27, cookie
4070 *
4071 * Minimum length is 28.
4072 */
4073 if( buf_len < 28 )
4074 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
4075
4076 /* Copy most fields and adapt others */
4077 memcpy( obuf, in, 25 );
4078 obuf[13] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
4079 obuf[25] = 0xfe;
4080 obuf[26] = 0xff;
4081
4082 /* Generate and write actual cookie */
4083 p = obuf + 28;
4084 if( f_cookie_write( p_cookie,
4085 &p, obuf + buf_len, cli_id, cli_id_len ) != 0 )
4086 {
4087 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
4088 }
4089
4090 *olen = p - obuf;
4091
4092 /* Go back and fill length fields */
4093 obuf[27] = (unsigned char)( *olen - 28 );
4094
4095 obuf[14] = obuf[22] = (unsigned char)( ( *olen - 25 ) >> 16 );
4096 obuf[15] = obuf[23] = (unsigned char)( ( *olen - 25 ) >> 8 );
4097 obuf[16] = obuf[24] = (unsigned char)( ( *olen - 25 ) );
4098
4099 obuf[11] = (unsigned char)( ( *olen - 13 ) >> 8 );
4100 obuf[12] = (unsigned char)( ( *olen - 13 ) );
4101
4102 return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED );
4103}
4104
4105/*
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004106 * Handle possible client reconnect with the same UDP quadruplet
4107 * (RFC 6347 Section 4.2.8).
4108 *
4109 * Called by ssl_parse_record_header() in case we receive an epoch 0 record
4110 * that looks like a ClientHello.
4111 *
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004112 * - if the input looks like a ClientHello without cookies,
4113 * send back HelloVerifyRequest, then
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02004114 * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004115 * - if the input looks like a ClientHello with a valid cookie,
4116 * reset the session of the current context, and
Manuel Pégourié-Gonnardbe619c12015-09-08 11:21:21 +02004117 * return MBEDTLS_ERR_SSL_CLIENT_RECONNECT
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02004118 * - if anything goes wrong, return a specific error code
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004119 *
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02004120 * mbedtls_ssl_read_record() will ignore the record if anything else than
Simon Butcherd0bf6a32015-09-11 17:34:49 +01004121 * MBEDTLS_ERR_SSL_CLIENT_RECONNECT or 0 is returned, although this function
4122 * cannot not return 0.
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004123 */
4124static int ssl_handle_possible_reconnect( mbedtls_ssl_context *ssl )
4125{
4126 int ret;
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02004127 size_t len;
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004128
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02004129 ret = ssl_check_dtls_clihlo_cookie(
4130 ssl->conf->f_cookie_write,
4131 ssl->conf->f_cookie_check,
4132 ssl->conf->p_cookie,
4133 ssl->cli_id, ssl->cli_id_len,
4134 ssl->in_buf, ssl->in_left,
Angus Grattond8213d02016-05-25 20:56:48 +10004135 ssl->out_buf, MBEDTLS_SSL_OUT_CONTENT_LEN, &len );
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004136
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02004137 MBEDTLS_SSL_DEBUG_RET( 2, "ssl_check_dtls_clihlo_cookie", ret );
4138
4139 if( ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED )
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004140 {
Brian J Murray1903fb32016-11-06 04:45:15 -08004141 /* Don't check write errors as we can't do anything here.
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02004142 * If the error is permanent we'll catch it later,
4143 * if it's not, then hopefully it'll work next time. */
4144 (void) ssl->f_send( ssl->p_bio, ssl->out_buf, len );
4145
4146 return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED );
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004147 }
4148
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02004149 if( ret == 0 )
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004150 {
Manuel Pégourié-Gonnard62c74bb2015-09-08 17:50:29 +02004151 /* Got a valid cookie, partially reset context */
4152 if( ( ret = ssl_session_reset_int( ssl, 1 ) ) != 0 )
4153 {
4154 MBEDTLS_SSL_DEBUG_RET( 1, "reset", ret );
4155 return( ret );
4156 }
4157
4158 return( MBEDTLS_ERR_SSL_CLIENT_RECONNECT );
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004159 }
4160
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004161 return( ret );
4162}
Manuel Pégourié-Gonnardddfe5d22015-09-09 12:46:16 +02004163#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard11331fc2015-09-08 10:30:55 +02004164
Manuel Pégourié-Gonnard7a7e1402014-09-24 10:52:58 +02004165/*
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004166 * ContentType type;
4167 * ProtocolVersion version;
4168 * uint16 epoch; // DTLS only
4169 * uint48 sequence_number; // DTLS only
4170 * uint16 length;
Manuel Pégourié-Gonnarde2e25e72015-12-03 16:13:17 +01004171 *
4172 * Return 0 if header looks sane (and, for DTLS, the record is expected)
Simon Butcher207990d2015-12-16 01:51:30 +00004173 * MBEDTLS_ERR_SSL_INVALID_RECORD if the header looks bad,
Manuel Pégourié-Gonnarde2e25e72015-12-03 16:13:17 +01004174 * MBEDTLS_ERR_SSL_UNEXPECTED_RECORD (DTLS only) if sane but unexpected.
4175 *
4176 * With DTLS, mbedtls_ssl_read_record() will:
Simon Butcher207990d2015-12-16 01:51:30 +00004177 * 1. proceed with the record if this function returns 0
4178 * 2. drop only the current record if this function returns UNEXPECTED_RECORD
4179 * 3. return CLIENT_RECONNECT if this function return that value
4180 * 4. drop the whole datagram if this function returns anything else.
4181 * Point 2 is needed when the peer is resending, and we have already received
4182 * the first record from a datagram but are still waiting for the others.
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004183 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004184static int ssl_parse_record_header( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00004185{
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01004186 int major_ver, minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00004187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004188 MBEDTLS_SSL_DEBUG_BUF( 4, "input record header", ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) );
Manuel Pégourié-Gonnard64dffc52014-09-02 13:39:16 +02004189
Paul Bakker5121ce52009-01-03 21:22:43 +00004190 ssl->in_msgtype = ssl->in_hdr[0];
Manuel Pégourié-Gonnard507e1e42014-02-13 11:17:34 +01004191 ssl->in_msglen = ( ssl->in_len[0] << 8 ) | ssl->in_len[1];
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02004192 mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, ssl->in_hdr + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00004193
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004194 MBEDTLS_SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
Paul Bakker5121ce52009-01-03 21:22:43 +00004195 "version = [%d:%d], msglen = %d",
Manuel Pégourié-Gonnardedcbe542014-08-11 19:27:24 +02004196 ssl->in_msgtype,
4197 major_ver, minor_ver, ssl->in_msglen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004198
Manuel Pégourié-Gonnardedcbe542014-08-11 19:27:24 +02004199 /* Check record type */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004200 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE &&
4201 ssl->in_msgtype != MBEDTLS_SSL_MSG_ALERT &&
4202 ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC &&
4203 ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA )
Manuel Pégourié-Gonnardedcbe542014-08-11 19:27:24 +02004204 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004205 MBEDTLS_SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
Andres Amaya Garcia2fad94b2017-06-26 15:11:59 +01004206
4207#if defined(MBEDTLS_SSL_PROTO_DTLS)
Andres Amaya Garcia01692532017-06-28 09:26:46 +01004208 /* Silently ignore invalid DTLS records as recommended by RFC 6347
4209 * Section 4.1.2.7 */
Andres Amaya Garcia2fad94b2017-06-26 15:11:59 +01004210 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
4211#endif /* MBEDTLS_SSL_PROTO_DTLS */
4212 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
4213 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
4214
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004215 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
Manuel Pégourié-Gonnardedcbe542014-08-11 19:27:24 +02004216 }
4217
4218 /* Check version */
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01004219 if( major_ver != ssl->major_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00004220 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004221 MBEDTLS_SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
4222 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00004223 }
4224
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02004225 if( minor_ver > ssl->conf->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00004226 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004227 MBEDTLS_SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
4228 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00004229 }
4230
Manuel Pégourié-Gonnardedcbe542014-08-11 19:27:24 +02004231 /* Check length against the size of our buffer */
Angus Grattond8213d02016-05-25 20:56:48 +10004232 if( ssl->in_msglen > MBEDTLS_SSL_IN_BUFFER_LEN
Manuel Pégourié-Gonnardedcbe542014-08-11 19:27:24 +02004233 - (size_t)( ssl->in_msg - ssl->in_buf ) )
Paul Bakker1a1fbba2014-04-30 14:38:05 +02004234 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004235 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
4236 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
Paul Bakker1a1fbba2014-04-30 14:38:05 +02004237 }
4238
Manuel Pégourié-Gonnarde2e25e72015-12-03 16:13:17 +01004239 /*
Hanno Becker52c6dc62017-05-26 16:07:36 +01004240 * DTLS-related tests.
4241 * Check epoch before checking length constraint because
4242 * the latter varies with the epoch. E.g., if a ChangeCipherSpec
4243 * message gets duplicated before the corresponding Finished message,
4244 * the second ChangeCipherSpec should be discarded because it belongs
4245 * to an old epoch, but not because its length is shorter than
4246 * the minimum record length for packets using the new record transform.
4247 * Note that these two kinds of failures are handled differently,
4248 * as an unexpected record is silently skipped but an invalid
4249 * record leads to the entire datagram being dropped.
Manuel Pégourié-Gonnarde2e25e72015-12-03 16:13:17 +01004250 */
4251#if defined(MBEDTLS_SSL_PROTO_DTLS)
4252 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
4253 {
4254 unsigned int rec_epoch = ( ssl->in_ctr[0] << 8 ) | ssl->in_ctr[1];
4255
Manuel Pégourié-Gonnarde2e25e72015-12-03 16:13:17 +01004256 /* Check epoch (and sequence number) with DTLS */
4257 if( rec_epoch != ssl->in_epoch )
4258 {
4259 MBEDTLS_SSL_DEBUG_MSG( 1, ( "record from another epoch: "
4260 "expected %d, received %d",
4261 ssl->in_epoch, rec_epoch ) );
4262
4263#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)
4264 /*
4265 * Check for an epoch 0 ClientHello. We can't use in_msg here to
4266 * access the first byte of record content (handshake type), as we
4267 * have an active transform (possibly iv_len != 0), so use the
4268 * fact that the record header len is 13 instead.
4269 */
4270 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
4271 ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER &&
4272 rec_epoch == 0 &&
4273 ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
4274 ssl->in_left > 13 &&
4275 ssl->in_buf[13] == MBEDTLS_SSL_HS_CLIENT_HELLO )
4276 {
4277 MBEDTLS_SSL_DEBUG_MSG( 1, ( "possible client reconnect "
4278 "from the same port" ) );
4279 return( ssl_handle_possible_reconnect( ssl ) );
4280 }
4281 else
4282#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */
Hanno Becker5f066e72018-08-16 14:56:31 +01004283 {
4284 /* Consider buffering the record. */
4285 if( rec_epoch == (unsigned int) ssl->in_epoch + 1 )
4286 {
4287 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Consider record for buffering" ) );
4288 return( MBEDTLS_ERR_SSL_EARLY_MESSAGE );
4289 }
4290
Manuel Pégourié-Gonnarde2e25e72015-12-03 16:13:17 +01004291 return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );
Hanno Becker5f066e72018-08-16 14:56:31 +01004292 }
Manuel Pégourié-Gonnarde2e25e72015-12-03 16:13:17 +01004293 }
4294
4295#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
4296 /* Replay detection only works for the current epoch */
4297 if( rec_epoch == ssl->in_epoch &&
4298 mbedtls_ssl_dtls_replay_check( ssl ) != 0 )
4299 {
4300 MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record" ) );
4301 return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );
4302 }
4303#endif
Hanno Becker52c6dc62017-05-26 16:07:36 +01004304
Hanno Becker52c6dc62017-05-26 16:07:36 +01004305 /* Drop unexpected ApplicationData records,
4306 * except at the beginning of renegotiations */
4307 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA &&
4308 ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER
4309#if defined(MBEDTLS_SSL_RENEGOTIATION)
4310 && ! ( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
4311 ssl->state == MBEDTLS_SSL_SERVER_HELLO )
4312#endif
4313 )
4314 {
4315 MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping unexpected ApplicationData" ) );
4316 return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );
4317 }
Manuel Pégourié-Gonnarde2e25e72015-12-03 16:13:17 +01004318 }
4319#endif /* MBEDTLS_SSL_PROTO_DTLS */
4320
Hanno Becker52c6dc62017-05-26 16:07:36 +01004321
4322 /* Check length against bounds of the current transform and version */
4323 if( ssl->transform_in == NULL )
4324 {
4325 if( ssl->in_msglen < 1 ||
Angus Grattond8213d02016-05-25 20:56:48 +10004326 ssl->in_msglen > MBEDTLS_SSL_IN_CONTENT_LEN )
Hanno Becker52c6dc62017-05-26 16:07:36 +01004327 {
4328 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
4329 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
4330 }
4331 }
4332 else
4333 {
4334 if( ssl->in_msglen < ssl->transform_in->minlen )
4335 {
4336 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
4337 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
4338 }
4339
4340#if defined(MBEDTLS_SSL_PROTO_SSL3)
4341 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 &&
Angus Grattond8213d02016-05-25 20:56:48 +10004342 ssl->in_msglen > ssl->transform_in->minlen + MBEDTLS_SSL_IN_CONTENT_LEN )
Hanno Becker52c6dc62017-05-26 16:07:36 +01004343 {
4344 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
4345 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
4346 }
4347#endif
4348#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
4349 defined(MBEDTLS_SSL_PROTO_TLS1_2)
4350 /*
4351 * TLS encrypted messages can have up to 256 bytes of padding
4352 */
4353 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 &&
4354 ssl->in_msglen > ssl->transform_in->minlen +
Angus Grattond8213d02016-05-25 20:56:48 +10004355 MBEDTLS_SSL_IN_CONTENT_LEN + 256 )
Hanno Becker52c6dc62017-05-26 16:07:36 +01004356 {
4357 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
4358 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
4359 }
4360#endif
4361 }
4362
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004363 return( 0 );
4364}
Paul Bakker5121ce52009-01-03 21:22:43 +00004365
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004366/*
4367 * If applicable, decrypt (and decompress) record content
4368 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004369static int ssl_prepare_record_content( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004370{
4371 int ret, done = 0;
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02004372
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004373 MBEDTLS_SSL_DEBUG_BUF( 4, "input record from network",
4374 ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00004375
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004376#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
4377 if( mbedtls_ssl_hw_record_read != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00004378 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004379 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_read()" ) );
Paul Bakker05ef8352012-05-08 09:17:57 +00004380
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004381 ret = mbedtls_ssl_hw_record_read( ssl );
4382 if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH )
Paul Bakker05ef8352012-05-08 09:17:57 +00004383 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004384 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_read", ret );
4385 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Paul Bakker05ef8352012-05-08 09:17:57 +00004386 }
Paul Bakkerc7878112012-12-19 14:41:14 +01004387
4388 if( ret == 0 )
4389 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00004390 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004391#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
Paul Bakker48916f92012-09-16 19:57:18 +00004392 if( !done && ssl->transform_in != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00004393 {
Hanno Becker4c6876b2017-12-27 21:28:58 +00004394 mbedtls_record rec;
4395
4396 rec.buf = ssl->in_iv;
4397 rec.buf_len = MBEDTLS_SSL_IN_BUFFER_LEN
4398 - ( ssl->in_iv - ssl->in_buf );
4399 rec.data_len = ssl->in_msglen;
4400 rec.data_offset = 0;
4401
4402 memcpy( &rec.ctr[0], ssl->in_ctr, 8 );
4403 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,
4404 ssl->conf->transport, rec.ver );
4405 rec.type = ssl->in_msgtype;
Hanno Becker611a83b2018-01-03 14:27:32 +00004406 if( ( ret = mbedtls_ssl_decrypt_buf( ssl, ssl->transform_in,
4407 &rec ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00004408 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004409 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00004410 return( ret );
4411 }
4412
Hanno Becker93012fe2018-08-07 14:30:18 +01004413 if( ssl->in_iv + rec.data_offset != ssl->in_msg )
4414 {
4415 /* Should never happen */
4416 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
4417 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004418
Hanno Becker4c6876b2017-12-27 21:28:58 +00004419 ssl->in_msglen = rec.data_len;
4420 ssl->in_len[0] = (unsigned char)( rec.data_len >> 8 );
4421 ssl->in_len[1] = (unsigned char)( rec.data_len );
4422
Paul Bakker5121ce52009-01-03 21:22:43 +00004423 MBEDTLS_SSL_DEBUG_BUF( 4, "input payload after decrypt",
4424 ssl->in_msg, ssl->in_msglen );
4425
Angus Grattond8213d02016-05-25 20:56:48 +10004426 if( ssl->in_msglen > MBEDTLS_SSL_IN_CONTENT_LEN )
Paul Bakker5121ce52009-01-03 21:22:43 +00004427 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004428 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) );
4429 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00004430 }
Hanno Becker4c6876b2017-12-27 21:28:58 +00004431 else if( ssl->in_msglen == 0 )
4432 {
4433#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4434 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3
4435 && ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA )
4436 {
4437 /* TLS v1.2 explicitly disallows zero-length messages which are not application data */
4438 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid zero-length message type: %d", ssl->in_msgtype ) );
4439 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
4440 }
4441#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
4442
4443 ssl->nb_zero++;
4444
4445 /*
4446 * Three or more empty messages may be a DoS attack
4447 * (excessive CPU consumption).
4448 */
4449 if( ssl->nb_zero > 3 )
4450 {
4451 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
4452 "messages, possible DoS attack" ) );
4453 /* Q: Is that the right error code? */
4454 return( MBEDTLS_ERR_SSL_INVALID_MAC );
4455 }
4456 }
4457 else
4458 ssl->nb_zero = 0;
4459
4460#if defined(MBEDTLS_SSL_PROTO_DTLS)
4461 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
4462 {
4463 ; /* in_ctr read from peer, not maintained internally */
4464 }
4465 else
4466#endif
4467 {
4468 unsigned i;
4469 for( i = 8; i > ssl_ep_len( ssl ); i-- )
4470 if( ++ssl->in_ctr[i - 1] != 0 )
4471 break;
4472
4473 /* The loop goes to its end iff the counter is wrapping */
4474 if( i == ssl_ep_len( ssl ) )
4475 {
4476 MBEDTLS_SSL_DEBUG_MSG( 1, ( "incoming message counter would wrap" ) );
4477 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
4478 }
4479 }
4480
Paul Bakker5121ce52009-01-03 21:22:43 +00004481 }
4482
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004483#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00004484 if( ssl->transform_in != NULL &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004485 ssl->session_in->compression == MBEDTLS_SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00004486 {
4487 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
4488 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004489 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00004490 return( ret );
4491 }
Paul Bakker2770fbd2012-07-03 13:30:23 +00004492 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004493#endif /* MBEDTLS_ZLIB_SUPPORT */
Paul Bakker2770fbd2012-07-03 13:30:23 +00004494
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004495#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02004496 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardb47368a2014-09-24 13:29:58 +02004497 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004498 mbedtls_ssl_dtls_replay_update( ssl );
Manuel Pégourié-Gonnardb47368a2014-09-24 13:29:58 +02004499 }
4500#endif
4501
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004502 return( 0 );
4503}
4504
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004505static void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02004506
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02004507/*
4508 * Read a record.
4509 *
Manuel Pégourié-Gonnardfbdf06c2015-10-23 11:13:28 +02004510 * Silently ignore non-fatal alert (and for DTLS, invalid records as well,
4511 * RFC 6347 4.1.2.7) and continue reading until a valid record is found.
4512 *
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02004513 */
Hanno Becker1097b342018-08-15 14:09:41 +01004514
4515/* Helper functions for mbedtls_ssl_read_record(). */
4516static int ssl_consume_current_message( mbedtls_ssl_context *ssl );
Hanno Beckere74d5562018-08-15 14:26:08 +01004517static int ssl_get_next_record( mbedtls_ssl_context *ssl );
4518static int ssl_record_is_in_progress( mbedtls_ssl_context *ssl );
Hanno Becker4162b112018-08-15 14:05:04 +01004519
Hanno Becker327c93b2018-08-15 13:56:18 +01004520int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl,
Hanno Becker3a0aad12018-08-20 09:44:02 +01004521 unsigned update_hs_digest )
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004522{
4523 int ret;
4524
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004525 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> read record" ) );
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004526
Hanno Beckeraf0665d2017-05-24 09:16:26 +01004527 if( ssl->keep_current_message == 0 )
4528 {
4529 do {
Simon Butcher99000142016-10-13 17:21:01 +01004530
Hanno Becker26994592018-08-15 14:14:59 +01004531 ret = ssl_consume_current_message( ssl );
Hanno Becker90333da2017-10-10 11:27:13 +01004532 if( ret != 0 )
Hanno Beckeraf0665d2017-05-24 09:16:26 +01004533 return( ret );
Hanno Becker26994592018-08-15 14:14:59 +01004534
Hanno Beckere74d5562018-08-15 14:26:08 +01004535 if( ssl_record_is_in_progress( ssl ) == 0 )
Hanno Beckeraf0665d2017-05-24 09:16:26 +01004536 {
Hanno Becker40f50842018-08-15 14:48:01 +01004537#if defined(MBEDTLS_SSL_PROTO_DTLS)
4538 int have_buffered = 0;
Hanno Beckere74d5562018-08-15 14:26:08 +01004539
Hanno Becker40f50842018-08-15 14:48:01 +01004540 /* We only check for buffered messages if the
4541 * current datagram is fully consumed. */
4542 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Hanno Beckeref7afdf2018-08-28 17:16:31 +01004543 ssl_next_record_is_in_datagram( ssl ) == 0 )
Hanno Beckere74d5562018-08-15 14:26:08 +01004544 {
Hanno Becker40f50842018-08-15 14:48:01 +01004545 if( ssl_load_buffered_message( ssl ) == 0 )
4546 have_buffered = 1;
4547 }
4548
4549 if( have_buffered == 0 )
4550#endif /* MBEDTLS_SSL_PROTO_DTLS */
4551 {
4552 ret = ssl_get_next_record( ssl );
4553 if( ret == MBEDTLS_ERR_SSL_CONTINUE_PROCESSING )
4554 continue;
4555
4556 if( ret != 0 )
4557 {
Hanno Beckerc573ac32018-08-28 17:15:25 +01004558 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_get_next_record" ), ret );
Hanno Becker40f50842018-08-15 14:48:01 +01004559 return( ret );
4560 }
Hanno Beckere74d5562018-08-15 14:26:08 +01004561 }
Hanno Beckeraf0665d2017-05-24 09:16:26 +01004562 }
4563
4564 ret = mbedtls_ssl_handle_message_type( ssl );
4565
Hanno Becker40f50842018-08-15 14:48:01 +01004566#if defined(MBEDTLS_SSL_PROTO_DTLS)
4567 if( ret == MBEDTLS_ERR_SSL_EARLY_MESSAGE )
4568 {
4569 /* Buffer future message */
4570 ret = ssl_buffer_message( ssl );
4571 if( ret != 0 )
4572 return( ret );
4573
4574 ret = MBEDTLS_ERR_SSL_CONTINUE_PROCESSING;
4575 }
4576#endif /* MBEDTLS_SSL_PROTO_DTLS */
4577
Hanno Becker90333da2017-10-10 11:27:13 +01004578 } while( MBEDTLS_ERR_SSL_NON_FATAL == ret ||
4579 MBEDTLS_ERR_SSL_CONTINUE_PROCESSING == ret );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01004580
4581 if( 0 != ret )
Simon Butcher99000142016-10-13 17:21:01 +01004582 {
Hanno Becker05c4fc82017-11-09 14:34:06 +00004583 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_handle_message_type" ), ret );
Simon Butcher99000142016-10-13 17:21:01 +01004584 return( ret );
4585 }
4586
Hanno Becker327c93b2018-08-15 13:56:18 +01004587 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
Hanno Becker3a0aad12018-08-20 09:44:02 +01004588 update_hs_digest == 1 )
Hanno Beckeraf0665d2017-05-24 09:16:26 +01004589 {
4590 mbedtls_ssl_update_handshake_status( ssl );
4591 }
Simon Butcher99000142016-10-13 17:21:01 +01004592 }
Hanno Beckeraf0665d2017-05-24 09:16:26 +01004593 else
Simon Butcher99000142016-10-13 17:21:01 +01004594 {
Hanno Becker02f59072018-08-15 14:00:24 +01004595 MBEDTLS_SSL_DEBUG_MSG( 2, ( "reuse previously read message" ) );
Hanno Beckeraf0665d2017-05-24 09:16:26 +01004596 ssl->keep_current_message = 0;
Simon Butcher99000142016-10-13 17:21:01 +01004597 }
4598
4599 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= read record" ) );
4600
4601 return( 0 );
4602}
4603
Hanno Becker40f50842018-08-15 14:48:01 +01004604#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Beckeref7afdf2018-08-28 17:16:31 +01004605static int ssl_next_record_is_in_datagram( mbedtls_ssl_context *ssl )
Simon Butcher99000142016-10-13 17:21:01 +01004606{
Hanno Becker40f50842018-08-15 14:48:01 +01004607 if( ssl->in_left > ssl->next_record_offset )
4608 return( 1 );
Simon Butcher99000142016-10-13 17:21:01 +01004609
Hanno Becker40f50842018-08-15 14:48:01 +01004610 return( 0 );
4611}
4612
4613static int ssl_load_buffered_message( mbedtls_ssl_context *ssl )
4614{
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004615 mbedtls_ssl_handshake_params * const hs = ssl->handshake;
Hanno Becker37f95322018-08-16 13:55:32 +01004616 mbedtls_ssl_hs_buffer * hs_buf;
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004617 int ret = 0;
4618
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004619 if( hs == NULL )
4620 return( -1 );
4621
Hanno Beckere00ae372018-08-20 09:39:42 +01004622 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_load_buffered_messsage" ) );
4623
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004624 if( ssl->state == MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC ||
4625 ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC )
4626 {
4627 /* Check if we have seen a ChangeCipherSpec before.
4628 * If yes, synthesize a CCS record. */
Hanno Becker4422bbb2018-08-20 09:40:19 +01004629 if( !hs->buffering.seen_ccs )
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004630 {
4631 MBEDTLS_SSL_DEBUG_MSG( 2, ( "CCS not seen in the current flight" ) );
4632 ret = -1;
Hanno Becker0d4b3762018-08-20 09:36:59 +01004633 goto exit;
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004634 }
4635
Hanno Becker39b8bc92018-08-28 17:17:13 +01004636 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Injecting buffered CCS message" ) );
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004637 ssl->in_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC;
4638 ssl->in_msglen = 1;
4639 ssl->in_msg[0] = 1;
4640
4641 /* As long as they are equal, the exact value doesn't matter. */
4642 ssl->in_left = 0;
4643 ssl->next_record_offset = 0;
4644
Hanno Beckerd7f8ae22018-08-16 09:45:56 +01004645 hs->buffering.seen_ccs = 0;
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004646 goto exit;
4647 }
Hanno Becker37f95322018-08-16 13:55:32 +01004648
Hanno Beckerb8f50142018-08-28 10:01:34 +01004649#if defined(MBEDTLS_DEBUG_C)
Hanno Becker37f95322018-08-16 13:55:32 +01004650 /* Debug only */
4651 {
4652 unsigned offset;
4653 for( offset = 1; offset < MBEDTLS_SSL_MAX_BUFFERED_HS; offset++ )
4654 {
4655 hs_buf = &hs->buffering.hs[offset];
4656 if( hs_buf->is_valid == 1 )
4657 {
4658 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Future message with sequence number %u %s buffered.",
4659 hs->in_msg_seq + offset,
Hanno Beckera591c482018-08-28 17:20:00 +01004660 hs_buf->is_complete ? "fully" : "partially" ) );
Hanno Becker37f95322018-08-16 13:55:32 +01004661 }
4662 }
4663 }
Hanno Beckerb8f50142018-08-28 10:01:34 +01004664#endif /* MBEDTLS_DEBUG_C */
Hanno Becker37f95322018-08-16 13:55:32 +01004665
4666 /* Check if we have buffered and/or fully reassembled the
4667 * next handshake message. */
4668 hs_buf = &hs->buffering.hs[0];
4669 if( ( hs_buf->is_valid == 1 ) && ( hs_buf->is_complete == 1 ) )
4670 {
4671 /* Synthesize a record containing the buffered HS message. */
4672 size_t msg_len = ( hs_buf->data[1] << 16 ) |
4673 ( hs_buf->data[2] << 8 ) |
4674 hs_buf->data[3];
4675
4676 /* Double-check that we haven't accidentally buffered
4677 * a message that doesn't fit into the input buffer. */
4678 if( msg_len + 12 > MBEDTLS_SSL_IN_CONTENT_LEN )
4679 {
4680 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
4681 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
4682 }
4683
4684 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Next handshake message has been buffered - load" ) );
4685 MBEDTLS_SSL_DEBUG_BUF( 3, "Buffered handshake message (incl. header)",
4686 hs_buf->data, msg_len + 12 );
4687
4688 ssl->in_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4689 ssl->in_hslen = msg_len + 12;
4690 ssl->in_msglen = msg_len + 12;
4691 memcpy( ssl->in_msg, hs_buf->data, ssl->in_hslen );
4692
4693 ret = 0;
4694 goto exit;
4695 }
4696 else
4697 {
4698 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Next handshake message %u not or only partially bufffered",
4699 hs->in_msg_seq ) );
4700 }
4701
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004702 ret = -1;
4703
4704exit:
4705
4706 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_load_buffered_message" ) );
4707 return( ret );
Hanno Becker40f50842018-08-15 14:48:01 +01004708}
4709
Hanno Beckera02b0b42018-08-21 17:20:27 +01004710static int ssl_buffer_make_space( mbedtls_ssl_context *ssl,
4711 size_t desired )
4712{
4713 int offset;
4714 mbedtls_ssl_handshake_params * const hs = ssl->handshake;
Hanno Becker6e12c1e2018-08-24 14:39:15 +01004715 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Attempt to free buffered messages to have %u bytes available",
4716 (unsigned) desired ) );
Hanno Beckera02b0b42018-08-21 17:20:27 +01004717
Hanno Becker01315ea2018-08-21 17:22:17 +01004718 /* Get rid of future records epoch first, if such exist. */
4719 ssl_free_buffered_record( ssl );
4720
4721 /* Check if we have enough space available now. */
4722 if( desired <= ( MBEDTLS_SSL_DTLS_MAX_BUFFERING -
4723 hs->buffering.total_bytes_buffered ) )
4724 {
Hanno Becker6e12c1e2018-08-24 14:39:15 +01004725 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Enough space available after freeing future epoch record" ) );
Hanno Becker01315ea2018-08-21 17:22:17 +01004726 return( 0 );
4727 }
Hanno Beckera02b0b42018-08-21 17:20:27 +01004728
Hanno Becker4f432ad2018-08-28 10:02:32 +01004729 /* We don't have enough space to buffer the next expected handshake
4730 * message. Remove buffers used for future messages to gain space,
4731 * starting with the most distant one. */
Hanno Beckera02b0b42018-08-21 17:20:27 +01004732 for( offset = MBEDTLS_SSL_MAX_BUFFERED_HS - 1;
4733 offset >= 0; offset-- )
4734 {
4735 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Free buffering slot %d to make space for reassembly of next handshake message",
4736 offset ) );
4737
Hanno Beckerb309b922018-08-23 13:18:05 +01004738 ssl_buffering_free_slot( ssl, (uint8_t) offset );
Hanno Beckera02b0b42018-08-21 17:20:27 +01004739
4740 /* Check if we have enough space available now. */
4741 if( desired <= ( MBEDTLS_SSL_DTLS_MAX_BUFFERING -
4742 hs->buffering.total_bytes_buffered ) )
4743 {
Hanno Becker6e12c1e2018-08-24 14:39:15 +01004744 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Enough space available after freeing buffered HS messages" ) );
Hanno Beckera02b0b42018-08-21 17:20:27 +01004745 return( 0 );
4746 }
4747 }
4748
4749 return( -1 );
4750}
4751
Hanno Becker40f50842018-08-15 14:48:01 +01004752static int ssl_buffer_message( mbedtls_ssl_context *ssl )
4753{
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004754 int ret = 0;
4755 mbedtls_ssl_handshake_params * const hs = ssl->handshake;
4756
4757 if( hs == NULL )
4758 return( 0 );
4759
4760 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_buffer_message" ) );
4761
4762 switch( ssl->in_msgtype )
4763 {
4764 case MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC:
4765 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Remember CCS message" ) );
Hanno Beckere678eaa2018-08-21 14:57:46 +01004766
Hanno Beckerd7f8ae22018-08-16 09:45:56 +01004767 hs->buffering.seen_ccs = 1;
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004768 break;
4769
4770 case MBEDTLS_SSL_MSG_HANDSHAKE:
Hanno Becker37f95322018-08-16 13:55:32 +01004771 {
4772 unsigned recv_msg_seq_offset;
4773 unsigned recv_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5];
4774 mbedtls_ssl_hs_buffer *hs_buf;
4775 size_t msg_len = ssl->in_hslen - 12;
4776
4777 /* We should never receive an old handshake
4778 * message - double-check nonetheless. */
4779 if( recv_msg_seq < ssl->handshake->in_msg_seq )
4780 {
4781 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
4782 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
4783 }
4784
4785 recv_msg_seq_offset = recv_msg_seq - ssl->handshake->in_msg_seq;
4786 if( recv_msg_seq_offset >= MBEDTLS_SSL_MAX_BUFFERED_HS )
4787 {
4788 /* Silently ignore -- message too far in the future */
4789 MBEDTLS_SSL_DEBUG_MSG( 2,
4790 ( "Ignore future HS message with sequence number %u, "
4791 "buffering window %u - %u",
4792 recv_msg_seq, ssl->handshake->in_msg_seq,
4793 ssl->handshake->in_msg_seq + MBEDTLS_SSL_MAX_BUFFERED_HS - 1 ) );
4794
4795 goto exit;
4796 }
4797
4798 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering HS message with sequence number %u, offset %u ",
4799 recv_msg_seq, recv_msg_seq_offset ) );
4800
4801 hs_buf = &hs->buffering.hs[ recv_msg_seq_offset ];
4802
4803 /* Check if the buffering for this seq nr has already commenced. */
Hanno Becker4422bbb2018-08-20 09:40:19 +01004804 if( !hs_buf->is_valid )
Hanno Becker37f95322018-08-16 13:55:32 +01004805 {
Hanno Becker2a97b0e2018-08-21 15:47:49 +01004806 size_t reassembly_buf_sz;
4807
Hanno Becker37f95322018-08-16 13:55:32 +01004808 hs_buf->is_fragmented =
4809 ( ssl_hs_is_proper_fragment( ssl ) == 1 );
4810
4811 /* We copy the message back into the input buffer
4812 * after reassembly, so check that it's not too large.
4813 * This is an implementation-specific limitation
4814 * and not one from the standard, hence it is not
4815 * checked in ssl_check_hs_header(). */
Hanno Becker96a6c692018-08-21 15:56:03 +01004816 if( msg_len + 12 > MBEDTLS_SSL_IN_CONTENT_LEN )
Hanno Becker37f95322018-08-16 13:55:32 +01004817 {
4818 /* Ignore message */
4819 goto exit;
4820 }
4821
Hanno Beckere0b150f2018-08-21 15:51:03 +01004822 /* Check if we have enough space to buffer the message. */
4823 if( hs->buffering.total_bytes_buffered >
4824 MBEDTLS_SSL_DTLS_MAX_BUFFERING )
4825 {
4826 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
4827 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
4828 }
4829
Hanno Becker2a97b0e2018-08-21 15:47:49 +01004830 reassembly_buf_sz = ssl_get_reassembly_buffer_size( msg_len,
4831 hs_buf->is_fragmented );
Hanno Beckere0b150f2018-08-21 15:51:03 +01004832
4833 if( reassembly_buf_sz > ( MBEDTLS_SSL_DTLS_MAX_BUFFERING -
4834 hs->buffering.total_bytes_buffered ) )
4835 {
4836 if( recv_msg_seq_offset > 0 )
4837 {
4838 /* If we can't buffer a future message because
4839 * of space limitations -- ignore. */
4840 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering of future message of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- ignore\n",
4841 (unsigned) msg_len, MBEDTLS_SSL_DTLS_MAX_BUFFERING,
4842 (unsigned) hs->buffering.total_bytes_buffered ) );
4843 goto exit;
4844 }
Hanno Beckere1801392018-08-21 16:51:05 +01004845 else
4846 {
4847 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering of future message of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- attempt to make space by freeing buffered future messages\n",
4848 (unsigned) msg_len, MBEDTLS_SSL_DTLS_MAX_BUFFERING,
4849 (unsigned) hs->buffering.total_bytes_buffered ) );
4850 }
Hanno Beckere0b150f2018-08-21 15:51:03 +01004851
Hanno Beckera02b0b42018-08-21 17:20:27 +01004852 if( ssl_buffer_make_space( ssl, reassembly_buf_sz ) != 0 )
Hanno Becker55e9e2a2018-08-21 16:07:55 +01004853 {
Hanno Becker6e12c1e2018-08-24 14:39:15 +01004854 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reassembly of next message of size %u (%u with bitmap) would exceed the compile-time limit %u (already %u bytes buffered) -- fail\n",
4855 (unsigned) msg_len,
4856 (unsigned) reassembly_buf_sz,
4857 MBEDTLS_SSL_DTLS_MAX_BUFFERING,
Hanno Beckere0b150f2018-08-21 15:51:03 +01004858 (unsigned) hs->buffering.total_bytes_buffered ) );
Hanno Becker55e9e2a2018-08-21 16:07:55 +01004859 ret = MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
4860 goto exit;
4861 }
Hanno Beckere0b150f2018-08-21 15:51:03 +01004862 }
4863
4864 MBEDTLS_SSL_DEBUG_MSG( 2, ( "initialize reassembly, total length = %d",
4865 msg_len ) );
4866
Hanno Becker2a97b0e2018-08-21 15:47:49 +01004867 hs_buf->data = mbedtls_calloc( 1, reassembly_buf_sz );
4868 if( hs_buf->data == NULL )
Hanno Becker37f95322018-08-16 13:55:32 +01004869 {
Hanno Beckere0b150f2018-08-21 15:51:03 +01004870 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
Hanno Becker37f95322018-08-16 13:55:32 +01004871 goto exit;
4872 }
Hanno Beckere0b150f2018-08-21 15:51:03 +01004873 hs_buf->data_len = reassembly_buf_sz;
Hanno Becker37f95322018-08-16 13:55:32 +01004874
4875 /* Prepare final header: copy msg_type, length and message_seq,
4876 * then add standardised fragment_offset and fragment_length */
4877 memcpy( hs_buf->data, ssl->in_msg, 6 );
4878 memset( hs_buf->data + 6, 0, 3 );
4879 memcpy( hs_buf->data + 9, hs_buf->data + 1, 3 );
4880
4881 hs_buf->is_valid = 1;
Hanno Beckere0b150f2018-08-21 15:51:03 +01004882
4883 hs->buffering.total_bytes_buffered += reassembly_buf_sz;
Hanno Becker37f95322018-08-16 13:55:32 +01004884 }
4885 else
4886 {
4887 /* Make sure msg_type and length are consistent */
4888 if( memcmp( hs_buf->data, ssl->in_msg, 4 ) != 0 )
4889 {
4890 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Fragment header mismatch - ignore" ) );
4891 /* Ignore */
4892 goto exit;
4893 }
4894 }
4895
Hanno Becker4422bbb2018-08-20 09:40:19 +01004896 if( !hs_buf->is_complete )
Hanno Becker37f95322018-08-16 13:55:32 +01004897 {
4898 size_t frag_len, frag_off;
4899 unsigned char * const msg = hs_buf->data + 12;
4900
4901 /*
4902 * Check and copy current fragment
4903 */
4904
4905 /* Validation of header fields already done in
4906 * mbedtls_ssl_prepare_handshake_record(). */
4907 frag_off = ssl_get_hs_frag_off( ssl );
4908 frag_len = ssl_get_hs_frag_len( ssl );
4909
4910 MBEDTLS_SSL_DEBUG_MSG( 2, ( "adding fragment, offset = %d, length = %d",
4911 frag_off, frag_len ) );
4912 memcpy( msg + frag_off, ssl->in_msg + 12, frag_len );
4913
4914 if( hs_buf->is_fragmented )
4915 {
4916 unsigned char * const bitmask = msg + msg_len;
4917 ssl_bitmask_set( bitmask, frag_off, frag_len );
4918 hs_buf->is_complete = ( ssl_bitmask_check( bitmask,
4919 msg_len ) == 0 );
4920 }
4921 else
4922 {
4923 hs_buf->is_complete = 1;
4924 }
4925
4926 MBEDTLS_SSL_DEBUG_MSG( 2, ( "message %scomplete",
4927 hs_buf->is_complete ? "" : "not yet " ) );
4928 }
4929
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004930 break;
Hanno Becker37f95322018-08-16 13:55:32 +01004931 }
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004932
4933 default:
Hanno Becker360bef32018-08-28 10:04:33 +01004934 /* We don't buffer other types of messages. */
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01004935 break;
4936 }
4937
4938exit:
4939
4940 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_buffer_message" ) );
4941 return( ret );
Hanno Becker40f50842018-08-15 14:48:01 +01004942}
4943#endif /* MBEDTLS_SSL_PROTO_DTLS */
4944
Hanno Becker1097b342018-08-15 14:09:41 +01004945static int ssl_consume_current_message( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004946{
Hanno Becker4a810fb2017-05-24 16:27:30 +01004947 /*
Hanno Becker4a810fb2017-05-24 16:27:30 +01004948 * Consume last content-layer message and potentially
4949 * update in_msglen which keeps track of the contents'
4950 * consumption state.
4951 *
4952 * (1) Handshake messages:
4953 * Remove last handshake message, move content
4954 * and adapt in_msglen.
4955 *
4956 * (2) Alert messages:
4957 * Consume whole record content, in_msglen = 0.
4958 *
Hanno Becker4a810fb2017-05-24 16:27:30 +01004959 * (3) Change cipher spec:
4960 * Consume whole record content, in_msglen = 0.
4961 *
4962 * (4) Application data:
4963 * Don't do anything - the record layer provides
4964 * the application data as a stream transport
4965 * and consumes through mbedtls_ssl_read only.
4966 *
4967 */
4968
4969 /* Case (1): Handshake messages */
4970 if( ssl->in_hslen != 0 )
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004971 {
Hanno Beckerbb9dd0c2017-06-08 11:55:34 +01004972 /* Hard assertion to be sure that no application data
4973 * is in flight, as corrupting ssl->in_msglen during
4974 * ssl->in_offt != NULL is fatal. */
4975 if( ssl->in_offt != NULL )
4976 {
4977 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
4978 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
4979 }
4980
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004981 /*
4982 * Get next Handshake message in the current record
4983 */
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02004984
Hanno Becker4a810fb2017-05-24 16:27:30 +01004985 /* Notes:
Hanno Beckere72489d2017-10-23 13:23:50 +01004986 * (1) in_hslen is not necessarily the size of the
Hanno Becker4a810fb2017-05-24 16:27:30 +01004987 * current handshake content: If DTLS handshake
4988 * fragmentation is used, that's the fragment
4989 * size instead. Using the total handshake message
Hanno Beckere72489d2017-10-23 13:23:50 +01004990 * size here is faulty and should be changed at
4991 * some point.
Hanno Becker4a810fb2017-05-24 16:27:30 +01004992 * (2) While it doesn't seem to cause problems, one
4993 * has to be very careful not to assume that in_hslen
4994 * is always <= in_msglen in a sensible communication.
4995 * Again, it's wrong for DTLS handshake fragmentation.
4996 * The following check is therefore mandatory, and
4997 * should not be treated as a silently corrected assertion.
Hanno Beckerbb9dd0c2017-06-08 11:55:34 +01004998 * Additionally, ssl->in_hslen might be arbitrarily out of
4999 * bounds after handling a DTLS message with an unexpected
5000 * sequence number, see mbedtls_ssl_prepare_handshake_record.
Hanno Becker4a810fb2017-05-24 16:27:30 +01005001 */
5002 if( ssl->in_hslen < ssl->in_msglen )
5003 {
5004 ssl->in_msglen -= ssl->in_hslen;
5005 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
5006 ssl->in_msglen );
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005007
Hanno Becker4a810fb2017-05-24 16:27:30 +01005008 MBEDTLS_SSL_DEBUG_BUF( 4, "remaining content in record",
5009 ssl->in_msg, ssl->in_msglen );
5010 }
5011 else
5012 {
5013 ssl->in_msglen = 0;
5014 }
Manuel Pégourié-Gonnard4a175362014-09-09 17:45:31 +02005015
Hanno Becker4a810fb2017-05-24 16:27:30 +01005016 ssl->in_hslen = 0;
5017 }
5018 /* Case (4): Application data */
5019 else if( ssl->in_offt != NULL )
5020 {
5021 return( 0 );
5022 }
5023 /* Everything else (CCS & Alerts) */
5024 else
5025 {
5026 ssl->in_msglen = 0;
5027 }
5028
Hanno Becker1097b342018-08-15 14:09:41 +01005029 return( 0 );
5030}
Hanno Becker4a810fb2017-05-24 16:27:30 +01005031
Hanno Beckere74d5562018-08-15 14:26:08 +01005032static int ssl_record_is_in_progress( mbedtls_ssl_context *ssl )
5033{
Hanno Becker4a810fb2017-05-24 16:27:30 +01005034 if( ssl->in_msglen > 0 )
Hanno Beckere74d5562018-08-15 14:26:08 +01005035 return( 1 );
5036
5037 return( 0 );
5038}
5039
Hanno Becker5f066e72018-08-16 14:56:31 +01005040#if defined(MBEDTLS_SSL_PROTO_DTLS)
5041
5042static void ssl_free_buffered_record( mbedtls_ssl_context *ssl )
5043{
5044 mbedtls_ssl_handshake_params * const hs = ssl->handshake;
5045 if( hs == NULL )
5046 return;
5047
Hanno Becker01315ea2018-08-21 17:22:17 +01005048 if( hs->buffering.future_record.data != NULL )
Hanno Becker4a810fb2017-05-24 16:27:30 +01005049 {
Hanno Becker01315ea2018-08-21 17:22:17 +01005050 hs->buffering.total_bytes_buffered -=
5051 hs->buffering.future_record.len;
5052
5053 mbedtls_free( hs->buffering.future_record.data );
5054 hs->buffering.future_record.data = NULL;
5055 }
Hanno Becker5f066e72018-08-16 14:56:31 +01005056}
5057
5058static int ssl_load_buffered_record( mbedtls_ssl_context *ssl )
5059{
5060 mbedtls_ssl_handshake_params * const hs = ssl->handshake;
5061 unsigned char * rec;
5062 size_t rec_len;
5063 unsigned rec_epoch;
5064
5065 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
5066 return( 0 );
5067
5068 if( hs == NULL )
5069 return( 0 );
5070
Hanno Becker5f066e72018-08-16 14:56:31 +01005071 rec = hs->buffering.future_record.data;
5072 rec_len = hs->buffering.future_record.len;
5073 rec_epoch = hs->buffering.future_record.epoch;
5074
5075 if( rec == NULL )
5076 return( 0 );
5077
Hanno Becker4cb782d2018-08-20 11:19:05 +01005078 /* Only consider loading future records if the
5079 * input buffer is empty. */
Hanno Beckeref7afdf2018-08-28 17:16:31 +01005080 if( ssl_next_record_is_in_datagram( ssl ) == 1 )
Hanno Becker4cb782d2018-08-20 11:19:05 +01005081 return( 0 );
5082
Hanno Becker5f066e72018-08-16 14:56:31 +01005083 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_load_buffered_record" ) );
5084
5085 if( rec_epoch != ssl->in_epoch )
5086 {
5087 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffered record not from current epoch." ) );
5088 goto exit;
5089 }
5090
5091 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Found buffered record from current epoch - load" ) );
5092
5093 /* Double-check that the record is not too large */
5094 if( rec_len > MBEDTLS_SSL_IN_BUFFER_LEN -
5095 (size_t)( ssl->in_hdr - ssl->in_buf ) )
5096 {
5097 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
5098 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
5099 }
5100
5101 memcpy( ssl->in_hdr, rec, rec_len );
5102 ssl->in_left = rec_len;
5103 ssl->next_record_offset = 0;
5104
5105 ssl_free_buffered_record( ssl );
5106
5107exit:
5108 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_load_buffered_record" ) );
5109 return( 0 );
5110}
5111
5112static int ssl_buffer_future_record( mbedtls_ssl_context *ssl )
5113{
5114 mbedtls_ssl_handshake_params * const hs = ssl->handshake;
5115 size_t const rec_hdr_len = 13;
Hanno Becker01315ea2018-08-21 17:22:17 +01005116 size_t const total_buf_sz = rec_hdr_len + ssl->in_msglen;
Hanno Becker5f066e72018-08-16 14:56:31 +01005117
5118 /* Don't buffer future records outside handshakes. */
5119 if( hs == NULL )
5120 return( 0 );
5121
5122 /* Only buffer handshake records (we are only interested
5123 * in Finished messages). */
5124 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
5125 return( 0 );
5126
5127 /* Don't buffer more than one future epoch record. */
5128 if( hs->buffering.future_record.data != NULL )
5129 return( 0 );
5130
Hanno Becker01315ea2018-08-21 17:22:17 +01005131 /* Don't buffer record if there's not enough buffering space remaining. */
5132 if( total_buf_sz > ( MBEDTLS_SSL_DTLS_MAX_BUFFERING -
5133 hs->buffering.total_bytes_buffered ) )
5134 {
5135 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering of future epoch record of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- ignore\n",
5136 (unsigned) total_buf_sz, MBEDTLS_SSL_DTLS_MAX_BUFFERING,
5137 (unsigned) hs->buffering.total_bytes_buffered ) );
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005138 return( 0 );
5139 }
5140
Hanno Becker5f066e72018-08-16 14:56:31 +01005141 /* Buffer record */
5142 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffer record from epoch %u",
5143 ssl->in_epoch + 1 ) );
5144 MBEDTLS_SSL_DEBUG_BUF( 3, "Buffered record", ssl->in_hdr,
5145 rec_hdr_len + ssl->in_msglen );
5146
5147 /* ssl_parse_record_header() only considers records
5148 * of the next epoch as candidates for buffering. */
5149 hs->buffering.future_record.epoch = ssl->in_epoch + 1;
Hanno Becker01315ea2018-08-21 17:22:17 +01005150 hs->buffering.future_record.len = total_buf_sz;
Hanno Becker5f066e72018-08-16 14:56:31 +01005151
5152 hs->buffering.future_record.data =
5153 mbedtls_calloc( 1, hs->buffering.future_record.len );
5154 if( hs->buffering.future_record.data == NULL )
5155 {
5156 /* If we run out of RAM trying to buffer a
5157 * record from the next epoch, just ignore. */
5158 return( 0 );
5159 }
5160
Hanno Becker01315ea2018-08-21 17:22:17 +01005161 memcpy( hs->buffering.future_record.data, ssl->in_hdr, total_buf_sz );
Hanno Becker5f066e72018-08-16 14:56:31 +01005162
Hanno Becker01315ea2018-08-21 17:22:17 +01005163 hs->buffering.total_bytes_buffered += total_buf_sz;
Hanno Becker5f066e72018-08-16 14:56:31 +01005164 return( 0 );
5165}
5166
5167#endif /* MBEDTLS_SSL_PROTO_DTLS */
5168
Hanno Beckere74d5562018-08-15 14:26:08 +01005169static int ssl_get_next_record( mbedtls_ssl_context *ssl )
Hanno Becker1097b342018-08-15 14:09:41 +01005170{
5171 int ret;
5172
Hanno Becker5f066e72018-08-16 14:56:31 +01005173#if defined(MBEDTLS_SSL_PROTO_DTLS)
5174 /* We might have buffered a future record; if so,
5175 * and if the epoch matches now, load it.
5176 * On success, this call will set ssl->in_left to
5177 * the length of the buffered record, so that
5178 * the calls to ssl_fetch_input() below will
5179 * essentially be no-ops. */
5180 ret = ssl_load_buffered_record( ssl );
5181 if( ret != 0 )
5182 return( ret );
5183#endif /* MBEDTLS_SSL_PROTO_DTLS */
Hanno Becker4a810fb2017-05-24 16:27:30 +01005184
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005185 if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) ) ) != 0 )
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005186 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005187 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005188 return( ret );
5189 }
5190
5191 if( ( ret = ssl_parse_record_header( ssl ) ) != 0 )
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005192 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005193#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnardbe619c12015-09-08 11:21:21 +02005194 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
5195 ret != MBEDTLS_ERR_SSL_CLIENT_RECONNECT )
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005196 {
Hanno Becker5f066e72018-08-16 14:56:31 +01005197 if( ret == MBEDTLS_ERR_SSL_EARLY_MESSAGE )
5198 {
5199 ret = ssl_buffer_future_record( ssl );
5200 if( ret != 0 )
5201 return( ret );
5202
5203 /* Fall through to handling of unexpected records */
5204 ret = MBEDTLS_ERR_SSL_UNEXPECTED_RECORD;
5205 }
5206
Manuel Pégourié-Gonnarde2e25e72015-12-03 16:13:17 +01005207 if( ret == MBEDTLS_ERR_SSL_UNEXPECTED_RECORD )
5208 {
5209 /* Skip unexpected record (but not whole datagram) */
5210 ssl->next_record_offset = ssl->in_msglen
5211 + mbedtls_ssl_hdr_len( ssl );
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005212
Manuel Pégourié-Gonnarde2e25e72015-12-03 16:13:17 +01005213 MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding unexpected record "
5214 "(header)" ) );
5215 }
5216 else
5217 {
5218 /* Skip invalid record and the rest of the datagram */
5219 ssl->next_record_offset = 0;
5220 ssl->in_left = 0;
5221
5222 MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding invalid record "
5223 "(header)" ) );
5224 }
5225
5226 /* Get next record */
Hanno Becker90333da2017-10-10 11:27:13 +01005227 return( MBEDTLS_ERR_SSL_CONTINUE_PROCESSING );
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005228 }
5229#endif
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005230 return( ret );
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005231 }
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005232
5233 /*
5234 * Read and optionally decrypt the message contents
5235 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005236 if( ( ret = mbedtls_ssl_fetch_input( ssl,
5237 mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen ) ) != 0 )
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005238 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005239 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret );
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005240 return( ret );
5241 }
5242
5243 /* Done reading this record, get ready for the next one */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005244#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005245 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Hanno Beckere65ce782017-05-22 14:47:48 +01005246 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005247 ssl->next_record_offset = ssl->in_msglen + mbedtls_ssl_hdr_len( ssl );
Hanno Beckere65ce782017-05-22 14:47:48 +01005248 if( ssl->next_record_offset < ssl->in_left )
5249 {
5250 MBEDTLS_SSL_DEBUG_MSG( 3, ( "more than one record within datagram" ) );
5251 }
5252 }
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005253 else
5254#endif
5255 ssl->in_left = 0;
5256
5257 if( ( ret = ssl_prepare_record_content( ssl ) ) != 0 )
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005258 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005259#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005260 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005261 {
5262 /* Silently discard invalid records */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005263 if( ret == MBEDTLS_ERR_SSL_INVALID_RECORD ||
5264 ret == MBEDTLS_ERR_SSL_INVALID_MAC )
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005265 {
Manuel Pégourié-Gonnard0a885742015-08-04 12:08:35 +02005266 /* Except when waiting for Finished as a bad mac here
5267 * probably means something went wrong in the handshake
5268 * (eg wrong psk used, mitm downgrade attempt, etc.) */
5269 if( ssl->state == MBEDTLS_SSL_CLIENT_FINISHED ||
5270 ssl->state == MBEDTLS_SSL_SERVER_FINISHED )
5271 {
5272#if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES)
5273 if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )
5274 {
5275 mbedtls_ssl_send_alert_message( ssl,
5276 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5277 MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC );
5278 }
5279#endif
5280 return( ret );
5281 }
5282
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005283#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005284 if( ssl->conf->badmac_limit != 0 &&
5285 ++ssl->badmac_seen >= ssl->conf->badmac_limit )
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02005286 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005287 MBEDTLS_SSL_DEBUG_MSG( 1, ( "too many records with bad MAC" ) );
5288 return( MBEDTLS_ERR_SSL_INVALID_MAC );
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02005289 }
5290#endif
5291
Hanno Becker4a810fb2017-05-24 16:27:30 +01005292 /* As above, invalid records cause
5293 * dismissal of the whole datagram. */
5294
5295 ssl->next_record_offset = 0;
5296 ssl->in_left = 0;
5297
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005298 MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding invalid record (mac)" ) );
Hanno Becker90333da2017-10-10 11:27:13 +01005299 return( MBEDTLS_ERR_SSL_CONTINUE_PROCESSING );
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005300 }
5301
5302 return( ret );
5303 }
5304 else
5305#endif
5306 {
5307 /* Error out (and send alert) on invalid records */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005308#if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES)
5309 if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005310 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005311 mbedtls_ssl_send_alert_message( ssl,
5312 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5313 MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC );
Manuel Pégourié-Gonnard63eca932014-09-08 16:39:08 +02005314 }
5315#endif
5316 return( ret );
5317 }
5318 }
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005319
Simon Butcher99000142016-10-13 17:21:01 +01005320 return( 0 );
5321}
5322
5323int mbedtls_ssl_handle_message_type( mbedtls_ssl_context *ssl )
5324{
5325 int ret;
5326
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02005327 /*
Manuel Pégourié-Gonnard167a3762014-09-08 16:14:10 +02005328 * Handle particular types of records
5329 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005330 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00005331 {
Simon Butcher99000142016-10-13 17:21:01 +01005332 if( ( ret = mbedtls_ssl_prepare_handshake_record( ssl ) ) != 0 )
5333 {
Manuel Pégourié-Gonnarda59543a2014-02-18 11:33:49 +01005334 return( ret );
Simon Butcher99000142016-10-13 17:21:01 +01005335 }
Paul Bakker5121ce52009-01-03 21:22:43 +00005336 }
5337
Hanno Beckere678eaa2018-08-21 14:57:46 +01005338 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC )
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01005339 {
Hanno Beckere678eaa2018-08-21 14:57:46 +01005340 if( ssl->in_msglen != 1 )
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01005341 {
Hanno Beckere678eaa2018-08-21 14:57:46 +01005342 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid CCS message, len: %d",
5343 ssl->in_msglen ) );
5344 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01005345 }
5346
Hanno Beckere678eaa2018-08-21 14:57:46 +01005347 if( ssl->in_msg[0] != 1 )
5348 {
5349 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid CCS message, content: %02x",
5350 ssl->in_msg[0] ) );
5351 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
5352 }
5353
5354#if defined(MBEDTLS_SSL_PROTO_DTLS)
5355 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
5356 ssl->state != MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC &&
5357 ssl->state != MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC )
5358 {
5359 if( ssl->handshake == NULL )
5360 {
5361 MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping ChangeCipherSpec outside handshake" ) );
5362 return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );
5363 }
5364
5365 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received out-of-order ChangeCipherSpec - remember" ) );
5366 return( MBEDTLS_ERR_SSL_EARLY_MESSAGE );
5367 }
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01005368#endif
Hanno Beckere678eaa2018-08-21 14:57:46 +01005369 }
Hanno Becker2ed6bcc2018-08-15 15:11:57 +01005370
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005371 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00005372 {
Angus Gratton1a7a17e2018-06-20 15:43:50 +10005373 if( ssl->in_msglen != 2 )
5374 {
5375 /* Note: Standard allows for more than one 2 byte alert
5376 to be packed in a single message, but Mbed TLS doesn't
5377 currently support this. */
5378 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid alert message, len: %d",
5379 ssl->in_msglen ) );
5380 return( MBEDTLS_ERR_SSL_INVALID_RECORD );
5381 }
5382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005383 MBEDTLS_SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
Paul Bakker5121ce52009-01-03 21:22:43 +00005384 ssl->in_msg[0], ssl->in_msg[1] ) );
5385
5386 /*
Simon Butcher459a9502015-10-27 16:09:03 +00005387 * Ignore non-fatal alerts, except close_notify and no_renegotiation
Paul Bakker5121ce52009-01-03 21:22:43 +00005388 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005389 if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_FATAL )
Paul Bakker5121ce52009-01-03 21:22:43 +00005390 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005391 MBEDTLS_SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
Paul Bakker2770fbd2012-07-03 13:30:23 +00005392 ssl->in_msg[1] ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005393 return( MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00005394 }
5395
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005396 if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
5397 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00005398 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005399 MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
5400 return( MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00005401 }
Manuel Pégourié-Gonnardfbdf06c2015-10-23 11:13:28 +02005402
5403#if defined(MBEDTLS_SSL_RENEGOTIATION_ENABLED)
5404 if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
5405 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION )
5406 {
Hanno Becker90333da2017-10-10 11:27:13 +01005407 MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a SSLv3 no renegotiation alert" ) );
Manuel Pégourié-Gonnardfbdf06c2015-10-23 11:13:28 +02005408 /* Will be handled when trying to parse ServerHello */
5409 return( 0 );
5410 }
5411#endif
5412
5413#if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_SRV_C)
5414 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 &&
5415 ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
5416 ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
5417 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT )
5418 {
5419 MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a SSLv3 no_cert" ) );
5420 /* Will be handled in mbedtls_ssl_parse_certificate() */
5421 return( 0 );
5422 }
5423#endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */
5424
5425 /* Silently ignore: fetch new message */
Simon Butcher99000142016-10-13 17:21:01 +01005426 return MBEDTLS_ERR_SSL_NON_FATAL;
Paul Bakker5121ce52009-01-03 21:22:43 +00005427 }
5428
Hanno Beckerc76c6192017-06-06 10:03:17 +01005429#if defined(MBEDTLS_SSL_PROTO_DTLS)
5430 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
5431 ssl->handshake != NULL &&
5432 ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
5433 {
5434 ssl_handshake_wrapup_free_hs_transform( ssl );
5435 }
5436#endif
5437
Paul Bakker5121ce52009-01-03 21:22:43 +00005438 return( 0 );
5439}
5440
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005441int mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl )
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00005442{
5443 int ret;
5444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005445 if( ( ret = mbedtls_ssl_send_alert_message( ssl,
5446 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5447 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00005448 {
5449 return( ret );
5450 }
5451
5452 return( 0 );
5453}
5454
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005455int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl,
Paul Bakker0a925182012-04-16 06:46:41 +00005456 unsigned char level,
5457 unsigned char message )
5458{
5459 int ret;
5460
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02005461 if( ssl == NULL || ssl->conf == NULL )
5462 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5463
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005464 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005465 MBEDTLS_SSL_DEBUG_MSG( 3, ( "send alert level=%u message=%u", level, message ));
Paul Bakker0a925182012-04-16 06:46:41 +00005466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005467 ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT;
Paul Bakker0a925182012-04-16 06:46:41 +00005468 ssl->out_msglen = 2;
5469 ssl->out_msg[0] = level;
5470 ssl->out_msg[1] = message;
5471
Hanno Becker67bc7c32018-08-06 11:33:50 +01005472 if( ( ret = mbedtls_ssl_write_record( ssl, SSL_FORCE_FLUSH ) ) != 0 )
Paul Bakker0a925182012-04-16 06:46:41 +00005473 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005474 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Paul Bakker0a925182012-04-16 06:46:41 +00005475 return( ret );
5476 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005477 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
Paul Bakker0a925182012-04-16 06:46:41 +00005478
5479 return( 0 );
5480}
5481
Paul Bakker5121ce52009-01-03 21:22:43 +00005482/*
5483 * Handshake functions
5484 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005485#if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \
5486 !defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \
5487 !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
5488 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
5489 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \
5490 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \
5491 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskinef9828522017-05-03 12:28:43 +02005492/* No certificate support -> dummy functions */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005493int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00005494{
Hanno Becker8759e162017-12-27 21:34:08 +00005495 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00005496
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005497 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00005498
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005499 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
5500 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02005501 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
5502 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02005503 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005504 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02005505 ssl->state++;
5506 return( 0 );
5507 }
5508
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005509 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
5510 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005511}
5512
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005513int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005514{
Hanno Becker8759e162017-12-27 21:34:08 +00005515 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005516
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005517 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005518
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005519 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
5520 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02005521 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
5522 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005523 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005524 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005525 ssl->state++;
5526 return( 0 );
5527 }
5528
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005529 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
5530 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005531}
Gilles Peskinef9828522017-05-03 12:28:43 +02005532
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005533#else
Gilles Peskinef9828522017-05-03 12:28:43 +02005534/* Some certificate support -> implement write and parse */
5535
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005536int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005537{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005538 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005539 size_t i, n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005540 const mbedtls_x509_crt *crt;
Hanno Becker8759e162017-12-27 21:34:08 +00005541 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005542
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005543 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005544
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005545 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
5546 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
Manuel Pégourié-Gonnard25dbeb02015-09-16 17:30:03 +02005547 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
5548 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005549 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005550 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02005551 ssl->state++;
5552 return( 0 );
5553 }
5554
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005555#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005556 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker5121ce52009-01-03 21:22:43 +00005557 {
5558 if( ssl->client_auth == 0 )
5559 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005560 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00005561 ssl->state++;
5562 return( 0 );
5563 }
5564
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005565#if defined(MBEDTLS_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00005566 /*
5567 * If using SSLv3 and got no cert, send an Alert message
5568 * (otherwise an empty Certificate message will be sent).
5569 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005570 if( mbedtls_ssl_own_cert( ssl ) == NULL &&
5571 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00005572 {
5573 ssl->out_msglen = 2;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005574 ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT;
5575 ssl->out_msg[0] = MBEDTLS_SSL_ALERT_LEVEL_WARNING;
5576 ssl->out_msg[1] = MBEDTLS_SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00005577
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005578 MBEDTLS_SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00005579 goto write_msg;
5580 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005581#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00005582 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005583#endif /* MBEDTLS_SSL_CLI_C */
5584#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005585 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Paul Bakker5121ce52009-01-03 21:22:43 +00005586 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005587 if( mbedtls_ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00005588 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005589 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
5590 return( MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00005591 }
5592 }
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01005593#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00005594
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005595 MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", mbedtls_ssl_own_cert( ssl ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00005596
5597 /*
5598 * 0 . 0 handshake type
5599 * 1 . 3 handshake length
5600 * 4 . 6 length of all certs
5601 * 7 . 9 length of cert. 1
5602 * 10 . n-1 peer certificate
5603 * n . n+2 length of cert. 2
5604 * n+3 . ... upper level cert, etc.
5605 */
5606 i = 7;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005607 crt = mbedtls_ssl_own_cert( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00005608
Paul Bakker29087132010-03-21 21:03:34 +00005609 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00005610 {
5611 n = crt->raw.len;
Angus Grattond8213d02016-05-25 20:56:48 +10005612 if( n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i )
Paul Bakker5121ce52009-01-03 21:22:43 +00005613 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005614 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
Angus Grattond8213d02016-05-25 20:56:48 +10005615 i + 3 + n, MBEDTLS_SSL_OUT_CONTENT_LEN ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005616 return( MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00005617 }
5618
5619 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
5620 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
5621 ssl->out_msg[i + 2] = (unsigned char)( n );
5622
5623 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
5624 i += n; crt = crt->next;
5625 }
5626
5627 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
5628 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
5629 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
5630
5631 ssl->out_msglen = i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005632 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
5633 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE;
Paul Bakker5121ce52009-01-03 21:22:43 +00005634
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02005635#if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00005636write_msg:
Paul Bakkerd2f068e2013-08-27 21:19:20 +02005637#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00005638
5639 ssl->state++;
5640
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02005641 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00005642 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02005643 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00005644 return( ret );
5645 }
5646
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005647 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00005648
Paul Bakkered27a042013-04-18 22:46:23 +02005649 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00005650}
5651
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02005652/*
5653 * Once the certificate message is read, parse it into a cert chain and
5654 * perform basic checks, but leave actual verification to the caller
5655 */
5656static int ssl_parse_certificate_chain( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00005657{
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02005658 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +00005659 size_t i, n;
Gilles Peskine064a85c2017-05-10 10:46:40 +02005660 uint8_t alert;
Paul Bakker5121ce52009-01-03 21:22:43 +00005661
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005662#if defined(MBEDTLS_SSL_SRV_C)
5663#if defined(MBEDTLS_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00005664 /*
5665 * Check if the client sent an empty certificate
5666 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005667 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005668 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00005669 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00005670 if( ssl->in_msglen == 2 &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005671 ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT &&
5672 ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
5673 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00005674 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005675 MBEDTLS_SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00005676
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005677 /* The client was asked for a certificate but didn't send
5678 one. The client should know what's going on, so we
5679 don't send an alert. */
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01005680 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02005681 return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00005682 }
5683 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005684#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00005685
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005686#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
5687 defined(MBEDTLS_SSL_PROTO_TLS1_2)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005688 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005689 ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00005690 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005691 if( ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len( ssl ) &&
5692 ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
5693 ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE &&
5694 memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), "\0\0\0", 3 ) == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00005695 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005696 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00005697
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005698 /* The client was asked for a certificate but didn't send
5699 one. The client should know what's going on, so we
5700 don't send an alert. */
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01005701 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02005702 return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00005703 }
5704 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005705#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
5706 MBEDTLS_SSL_PROTO_TLS1_2 */
5707#endif /* MBEDTLS_SSL_SRV_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00005708
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005709 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00005710 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005711 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005712 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5713 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005714 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00005715 }
5716
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005717 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE ||
5718 ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 )
Paul Bakker5121ce52009-01-03 21:22:43 +00005719 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005720 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005721 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5722 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005723 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00005724 }
5725
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005726 i = mbedtls_ssl_hs_hdr_len( ssl );
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00005727
Paul Bakker5121ce52009-01-03 21:22:43 +00005728 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005729 * Same message structure as in mbedtls_ssl_write_certificate()
Paul Bakker5121ce52009-01-03 21:22:43 +00005730 */
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00005731 n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2];
Paul Bakker5121ce52009-01-03 21:22:43 +00005732
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00005733 if( ssl->in_msg[i] != 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005734 ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00005735 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005736 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005737 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5738 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005739 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00005740 }
5741
Manuel Pégourié-Gonnardbfb355c2013-09-07 17:27:43 +02005742 /* In case we tried to reuse a session but it failed */
5743 if( ssl->session_negotiate->peer_cert != NULL )
5744 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005745 mbedtls_x509_crt_free( ssl->session_negotiate->peer_cert );
5746 mbedtls_free( ssl->session_negotiate->peer_cert );
Manuel Pégourié-Gonnardbfb355c2013-09-07 17:27:43 +02005747 }
5748
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02005749 if( ( ssl->session_negotiate->peer_cert = mbedtls_calloc( 1,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005750 sizeof( mbedtls_x509_crt ) ) ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00005751 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02005752 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005753 sizeof( mbedtls_x509_crt ) ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005754 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5755 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02005756 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00005757 }
5758
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005759 mbedtls_x509_crt_init( ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00005760
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00005761 i += 3;
Paul Bakker5121ce52009-01-03 21:22:43 +00005762
5763 while( i < ssl->in_hslen )
5764 {
Philippe Antoine747fd532018-05-30 09:13:21 +02005765 if ( i + 3 > ssl->in_hslen ) {
5766 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
5767 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5768 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
5769 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
5770 }
Paul Bakker5121ce52009-01-03 21:22:43 +00005771 if( ssl->in_msg[i] != 0 )
5772 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005773 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005774 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5775 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005776 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00005777 }
5778
5779 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
5780 | (unsigned int) ssl->in_msg[i + 2];
5781 i += 3;
5782
5783 if( n < 128 || i + n > ssl->in_hslen )
5784 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005785 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005786 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5787 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005788 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00005789 }
5790
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005791 ret = mbedtls_x509_crt_parse_der( ssl->session_negotiate->peer_cert,
Paul Bakkerddf26b42013-09-18 13:46:23 +02005792 ssl->in_msg + i, n );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005793 switch( ret )
Paul Bakker5121ce52009-01-03 21:22:43 +00005794 {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005795 case 0: /*ok*/
5796 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
5797 /* Ignore certificate with an unknown algorithm: maybe a
5798 prior certificate was already trusted. */
5799 break;
5800
5801 case MBEDTLS_ERR_X509_ALLOC_FAILED:
5802 alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR;
5803 goto crt_parse_der_failed;
5804
5805 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
5806 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
5807 goto crt_parse_der_failed;
5808
5809 default:
5810 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
5811 crt_parse_der_failed:
5812 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005813 MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00005814 return( ret );
5815 }
5816
5817 i += n;
5818 }
5819
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005820 MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00005821
Manuel Pégourié-Gonnard796c6f32014-03-10 09:34:49 +01005822 /*
5823 * On client, make sure the server cert doesn't change during renego to
5824 * avoid "triple handshake" attack: https://secure-resumption.com/
5825 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005826#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02005827 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005828 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard796c6f32014-03-10 09:34:49 +01005829 {
5830 if( ssl->session->peer_cert == NULL )
5831 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005832 MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005833 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5834 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005835 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Manuel Pégourié-Gonnard796c6f32014-03-10 09:34:49 +01005836 }
5837
5838 if( ssl->session->peer_cert->raw.len !=
5839 ssl->session_negotiate->peer_cert->raw.len ||
5840 memcmp( ssl->session->peer_cert->raw.p,
5841 ssl->session_negotiate->peer_cert->raw.p,
5842 ssl->session->peer_cert->raw.len ) != 0 )
5843 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005844 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server cert changed during renegotiation" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02005845 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
5846 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005847 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
Manuel Pégourié-Gonnard796c6f32014-03-10 09:34:49 +01005848 }
5849 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005850#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard796c6f32014-03-10 09:34:49 +01005851
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02005852 return( 0 );
5853}
5854
5855int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
5856{
5857 int ret;
5858 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
Hanno Becker8759e162017-12-27 21:34:08 +00005859 ssl->handshake->ciphersuite_info;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02005860#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
5861 const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET
5862 ? ssl->handshake->sni_authmode
5863 : ssl->conf->authmode;
5864#else
5865 const int authmode = ssl->conf->authmode;
5866#endif
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02005867 void *rs_ctx = NULL;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02005868
5869 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
5870
5871 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
5872 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
5873 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
5874 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
5875 {
5876 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
5877 ssl->state++;
5878 return( 0 );
5879 }
5880
5881#if defined(MBEDTLS_SSL_SRV_C)
5882 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
5883 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
5884 {
5885 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
5886 ssl->state++;
5887 return( 0 );
5888 }
5889
5890 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
5891 authmode == MBEDTLS_SSL_VERIFY_NONE )
5892 {
5893 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_SKIP_VERIFY;
5894 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02005895
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02005896 ssl->state++;
5897 return( 0 );
5898 }
5899#endif
5900
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02005901#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
5902 if( ssl->handshake->ecrs_enabled &&
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02005903 ssl->handshake->ecrs_state == ssl_ecrs_crt_verify )
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02005904 {
5905 goto crt_verify;
5906 }
5907#endif
5908
Manuel Pégourié-Gonnard125af942018-09-11 11:08:12 +02005909 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02005910 {
5911 /* mbedtls_ssl_read_record may have sent an alert already. We
5912 let it decide whether to alert. */
5913 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
5914 return( ret );
5915 }
5916
5917 if( ( ret = ssl_parse_certificate_chain( ssl ) ) != 0 )
5918 {
5919#if defined(MBEDTLS_SSL_SRV_C)
5920 if( ret == MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE &&
5921 authmode == MBEDTLS_SSL_VERIFY_OPTIONAL )
5922 {
5923 ret = 0;
5924 }
5925#endif
5926
5927 ssl->state++;
5928 return( ret );
5929 }
5930
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02005931#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
5932 if( ssl->handshake->ecrs_enabled)
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02005933 ssl->handshake->ecrs_state = ssl_ecrs_crt_verify;
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02005934
5935crt_verify:
5936 if( ssl->handshake->ecrs_enabled)
5937 rs_ctx = &ssl->handshake->ecrs_ctx;
5938#endif
5939
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02005940 if( authmode != MBEDTLS_SSL_VERIFY_NONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00005941 {
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02005942 mbedtls_x509_crt *ca_chain;
5943 mbedtls_x509_crl *ca_crl;
5944
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02005945#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02005946 if( ssl->handshake->sni_ca_chain != NULL )
5947 {
5948 ca_chain = ssl->handshake->sni_ca_chain;
5949 ca_crl = ssl->handshake->sni_ca_crl;
5950 }
5951 else
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02005952#endif
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02005953 {
5954 ca_chain = ssl->conf->ca_chain;
5955 ca_crl = ssl->conf->ca_crl;
5956 }
5957
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005958 /*
5959 * Main check: verify certificate
5960 */
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02005961 ret = mbedtls_x509_crt_verify_restartable(
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02005962 ssl->session_negotiate->peer_cert,
5963 ca_chain, ca_crl,
5964 ssl->conf->cert_profile,
5965 ssl->hostname,
5966 &ssl->session_negotiate->verify_result,
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02005967 ssl->conf->f_vrfy, ssl->conf->p_vrfy, rs_ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +00005968
5969 if( ret != 0 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005970 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005971 MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005972 }
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005973
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02005974#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
5975 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02005976 return( MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS );
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02005977#endif
5978
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005979 /*
5980 * Secondary checks: always done, but change 'ret' only if it was 0
5981 */
5982
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02005983#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005984 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005985 const mbedtls_pk_context *pk = &ssl->session_negotiate->peer_cert->pk;
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005986
5987 /* If certificate uses an EC key, make sure the curve is OK */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005988 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) &&
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02005989 mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005990 {
Hanno Becker39ae8cd2017-05-08 16:31:14 +01005991 ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY;
5992
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005993 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) );
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02005994 if( ret == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005995 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01005996 }
5997 }
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02005998#endif /* MBEDTLS_ECP_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00005999
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006000 if( mbedtls_ssl_check_cert_usage( ssl->session_negotiate->peer_cert,
Hanno Becker39ae8cd2017-05-08 16:31:14 +01006001 ciphersuite_info,
6002 ! ssl->conf->endpoint,
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01006003 &ssl->session_negotiate->verify_result ) != 0 )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006004 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006005 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) );
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006006 if( ret == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006007 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006008 }
6009
Hanno Becker39ae8cd2017-05-08 16:31:14 +01006010 /* mbedtls_x509_crt_verify_with_profile is supposed to report a
6011 * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
6012 * with details encoded in the verification flags. All other kinds
6013 * of error codes, including those from the user provided f_vrfy
6014 * functions, are treated as fatal and lead to a failure of
6015 * ssl_parse_certificate even if verification was optional. */
6016 if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
6017 ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
6018 ret == MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ) )
6019 {
Paul Bakker5121ce52009-01-03 21:22:43 +00006020 ret = 0;
Hanno Becker39ae8cd2017-05-08 16:31:14 +01006021 }
6022
6023 if( ca_chain == NULL && authmode == MBEDTLS_SSL_VERIFY_REQUIRED )
6024 {
6025 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
6026 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
6027 }
Gilles Peskine1cc8e342017-05-03 16:28:34 +02006028
6029 if( ret != 0 )
6030 {
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02006031 uint8_t alert;
6032
Gilles Peskine1cc8e342017-05-03 16:28:34 +02006033 /* The certificate may have been rejected for several reasons.
6034 Pick one and send the corresponding alert. Which alert to send
6035 may be a subject of debate in some cases. */
Gilles Peskine1cc8e342017-05-03 16:28:34 +02006036 if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER )
6037 alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED;
6038 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH )
6039 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
6040 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE )
6041 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6042 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE )
6043 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6044 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE )
6045 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6046 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK )
6047 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6048 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY )
6049 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
6050 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED )
6051 alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED;
6052 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED )
6053 alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED;
6054 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED )
6055 alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA;
Gilles Peskine8498cb32017-05-10 15:39:40 +02006056 else
6057 alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN;
Gilles Peskine1cc8e342017-05-03 16:28:34 +02006058 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6059 alert );
6060 }
Hanno Becker39ae8cd2017-05-08 16:31:14 +01006061
Hanno Beckere6706e62017-05-15 16:05:15 +01006062#if defined(MBEDTLS_DEBUG_C)
6063 if( ssl->session_negotiate->verify_result != 0 )
6064 {
6065 MBEDTLS_SSL_DEBUG_MSG( 3, ( "! Certificate verification flags %x",
6066 ssl->session_negotiate->verify_result ) );
6067 }
6068 else
6069 {
6070 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate verification flags clear" ) );
6071 }
6072#endif /* MBEDTLS_DEBUG_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00006073 }
6074
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02006075 ssl->state++;
6076
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006077 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006078
6079 return( ret );
6080}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006081#endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
6082 !MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
6083 !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED
6084 !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
6085 !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
6086 !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
6087 !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00006088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006089int mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00006090{
6091 int ret;
6092
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006093 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006094
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006095 ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC;
Paul Bakker5121ce52009-01-03 21:22:43 +00006096 ssl->out_msglen = 1;
6097 ssl->out_msg[0] = 1;
6098
Paul Bakker5121ce52009-01-03 21:22:43 +00006099 ssl->state++;
6100
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02006101 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00006102 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02006103 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00006104 return( ret );
6105 }
6106
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006107 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006108
6109 return( 0 );
6110}
6111
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006112int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00006113{
6114 int ret;
6115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006116 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006117
Hanno Becker327c93b2018-08-15 13:56:18 +01006118 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00006119 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006120 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00006121 return( ret );
6122 }
6123
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006124 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC )
Paul Bakker5121ce52009-01-03 21:22:43 +00006125 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006126 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02006127 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6128 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006129 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00006130 }
6131
Hanno Beckere678eaa2018-08-21 14:57:46 +01006132 /* CCS records are only accepted if they have length 1 and content '1',
6133 * so we don't need to check this here. */
Paul Bakker5121ce52009-01-03 21:22:43 +00006134
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02006135 /*
6136 * Switch to our negotiated transform and session parameters for inbound
6137 * data.
6138 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006139 MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02006140 ssl->transform_in = ssl->transform_negotiate;
6141 ssl->session_in = ssl->session_negotiate;
6142
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006143#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006144 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02006145 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006146#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02006147 ssl_dtls_replay_reset( ssl );
6148#endif
6149
6150 /* Increment epoch */
6151 if( ++ssl->in_epoch == 0 )
6152 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006153 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02006154 /* This is highly unlikely to happen for legitimate reasons, so
6155 treat it as an attack and don't send an alert. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006156 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02006157 }
6158 }
6159 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006160#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02006161 memset( ssl->in_ctr, 0, 8 );
6162
Hanno Becker5aa4e2c2018-08-06 09:26:08 +01006163 ssl_update_in_pointers( ssl, ssl->transform_negotiate );
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02006164
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006165#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
6166 if( mbedtls_ssl_hw_record_activate != NULL )
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02006167 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006168 if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_INBOUND ) ) != 0 )
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02006169 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006170 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02006171 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6172 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006173 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02006174 }
6175 }
6176#endif
6177
Paul Bakker5121ce52009-01-03 21:22:43 +00006178 ssl->state++;
6179
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006180 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006181
6182 return( 0 );
6183}
6184
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006185void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl,
6186 const mbedtls_ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00006187{
Paul Bakkerfb08fd22013-08-27 15:06:26 +02006188 ((void) ciphersuite_info);
Paul Bakker769075d2012-11-24 11:26:46 +01006189
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006190#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
6191 defined(MBEDTLS_SSL_PROTO_TLS1_1)
6192 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00006193 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker380da532012-04-18 16:10:25 +00006194 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02006195#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006196#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
6197#if defined(MBEDTLS_SHA512_C)
6198 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
Paul Bakkerd2f068e2013-08-27 21:19:20 +02006199 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
6200 else
6201#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006202#if defined(MBEDTLS_SHA256_C)
6203 if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 )
Paul Bakker48916f92012-09-16 19:57:18 +00006204 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02006205 else
6206#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006207#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02006208 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006209 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02006210 return;
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02006211 }
Paul Bakker380da532012-04-18 16:10:25 +00006212}
Paul Bakkerf7abd422013-04-16 13:15:56 +02006213
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006214void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02006215{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006216#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
6217 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006218 mbedtls_md5_starts_ret( &ssl->handshake->fin_md5 );
6219 mbedtls_sha1_starts_ret( &ssl->handshake->fin_sha1 );
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02006220#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006221#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
6222#if defined(MBEDTLS_SHA256_C)
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006223 mbedtls_sha256_starts_ret( &ssl->handshake->fin_sha256, 0 );
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02006224#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006225#if defined(MBEDTLS_SHA512_C)
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006226 mbedtls_sha512_starts_ret( &ssl->handshake->fin_sha512, 1 );
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02006227#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006228#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02006229}
6230
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006231static void ssl_update_checksum_start( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02006232 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00006233{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006234#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
6235 defined(MBEDTLS_SSL_PROTO_TLS1_1)
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006236 mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len );
6237 mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02006238#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006239#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
6240#if defined(MBEDTLS_SHA256_C)
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006241 mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02006242#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006243#if defined(MBEDTLS_SHA512_C)
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006244 mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01006245#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006246#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00006247}
6248
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006249#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
6250 defined(MBEDTLS_SSL_PROTO_TLS1_1)
6251static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02006252 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00006253{
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006254 mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len );
6255 mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00006256}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02006257#endif
Paul Bakker380da532012-04-18 16:10:25 +00006258
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006259#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
6260#if defined(MBEDTLS_SHA256_C)
6261static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02006262 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00006263{
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006264 mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00006265}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02006266#endif
Paul Bakker380da532012-04-18 16:10:25 +00006267
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006268#if defined(MBEDTLS_SHA512_C)
6269static void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl,
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02006270 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00006271{
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006272 mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00006273}
Paul Bakker769075d2012-11-24 11:26:46 +01006274#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006275#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00006276
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006277#if defined(MBEDTLS_SSL_PROTO_SSL3)
Paul Bakker1ef83d62012-04-11 12:09:53 +00006278static void ssl_calc_finished_ssl(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006279 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00006280{
Paul Bakker3c2122f2013-06-24 19:03:14 +02006281 const char *sender;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006282 mbedtls_md5_context md5;
6283 mbedtls_sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00006284
Paul Bakker5121ce52009-01-03 21:22:43 +00006285 unsigned char padbuf[48];
6286 unsigned char md5sum[16];
6287 unsigned char sha1sum[20];
6288
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006289 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00006290 if( !session )
6291 session = ssl->session;
6292
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006293 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006294
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02006295 mbedtls_md5_init( &md5 );
6296 mbedtls_sha1_init( &sha1 );
6297
6298 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
6299 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00006300
6301 /*
6302 * SSLv3:
6303 * hash =
6304 * MD5( master + pad2 +
6305 * MD5( handshake + sender + master + pad1 ) )
6306 * + SHA1( master + pad2 +
6307 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00006308 */
6309
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006310#if !defined(MBEDTLS_MD5_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006311 MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
6312 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02006313#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00006314
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006315#if !defined(MBEDTLS_SHA1_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006316 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
6317 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02006318#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00006319
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006320 sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "CLNT"
Paul Bakker3c2122f2013-06-24 19:03:14 +02006321 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00006322
Paul Bakker1ef83d62012-04-11 12:09:53 +00006323 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00006324
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006325 mbedtls_md5_update_ret( &md5, (const unsigned char *) sender, 4 );
6326 mbedtls_md5_update_ret( &md5, session->master, 48 );
6327 mbedtls_md5_update_ret( &md5, padbuf, 48 );
6328 mbedtls_md5_finish_ret( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00006329
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006330 mbedtls_sha1_update_ret( &sha1, (const unsigned char *) sender, 4 );
6331 mbedtls_sha1_update_ret( &sha1, session->master, 48 );
6332 mbedtls_sha1_update_ret( &sha1, padbuf, 40 );
6333 mbedtls_sha1_finish_ret( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00006334
Paul Bakker1ef83d62012-04-11 12:09:53 +00006335 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00006336
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006337 mbedtls_md5_starts_ret( &md5 );
6338 mbedtls_md5_update_ret( &md5, session->master, 48 );
6339 mbedtls_md5_update_ret( &md5, padbuf, 48 );
6340 mbedtls_md5_update_ret( &md5, md5sum, 16 );
6341 mbedtls_md5_finish_ret( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00006342
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006343 mbedtls_sha1_starts_ret( &sha1 );
6344 mbedtls_sha1_update_ret( &sha1, session->master, 48 );
6345 mbedtls_sha1_update_ret( &sha1, padbuf , 40 );
6346 mbedtls_sha1_update_ret( &sha1, sha1sum, 20 );
6347 mbedtls_sha1_finish_ret( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00006348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006349 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00006350
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006351 mbedtls_md5_free( &md5 );
6352 mbedtls_sha1_free( &sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00006353
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006354 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
6355 mbedtls_platform_zeroize( md5sum, sizeof( md5sum ) );
6356 mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006357
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006358 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006359}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006360#endif /* MBEDTLS_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00006361
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006362#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
Paul Bakker1ef83d62012-04-11 12:09:53 +00006363static void ssl_calc_finished_tls(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006364 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00006365{
Paul Bakker1ef83d62012-04-11 12:09:53 +00006366 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02006367 const char *sender;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006368 mbedtls_md5_context md5;
6369 mbedtls_sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00006370 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00006371
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006372 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00006373 if( !session )
6374 session = ssl->session;
6375
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006376 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006377
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02006378 mbedtls_md5_init( &md5 );
6379 mbedtls_sha1_init( &sha1 );
6380
6381 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
6382 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00006383
Paul Bakker1ef83d62012-04-11 12:09:53 +00006384 /*
6385 * TLSv1:
6386 * hash = PRF( master, finished_label,
6387 * MD5( handshake ) + SHA1( handshake ) )[0..11]
6388 */
Paul Bakker5121ce52009-01-03 21:22:43 +00006389
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006390#if !defined(MBEDTLS_MD5_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006391 MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
6392 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02006393#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00006394
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006395#if !defined(MBEDTLS_SHA1_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006396 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
6397 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02006398#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00006399
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006400 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02006401 ? "client finished"
6402 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00006403
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006404 mbedtls_md5_finish_ret( &md5, padbuf );
6405 mbedtls_sha1_finish_ret( &sha1, padbuf + 16 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006406
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02006407 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00006408 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006409
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006410 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006411
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006412 mbedtls_md5_free( &md5 );
6413 mbedtls_sha1_free( &sha1 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006414
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006415 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006416
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006417 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006418}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006419#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00006420
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006421#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
6422#if defined(MBEDTLS_SHA256_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00006423static void ssl_calc_finished_tls_sha256(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006424 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker1ef83d62012-04-11 12:09:53 +00006425{
6426 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02006427 const char *sender;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006428 mbedtls_sha256_context sha256;
Paul Bakker1ef83d62012-04-11 12:09:53 +00006429 unsigned char padbuf[32];
6430
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006431 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00006432 if( !session )
6433 session = ssl->session;
6434
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02006435 mbedtls_sha256_init( &sha256 );
6436
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006437 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006438
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02006439 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006440
6441 /*
6442 * TLSv1.2:
6443 * hash = PRF( master, finished_label,
6444 * Hash( handshake ) )[0.11]
6445 */
6446
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006447#if !defined(MBEDTLS_SHA256_ALT)
6448 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006449 sha256.state, sizeof( sha256.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02006450#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00006451
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006452 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02006453 ? "client finished"
6454 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00006455
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006456 mbedtls_sha256_finish_ret( &sha256, padbuf );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006457
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02006458 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00006459 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006460
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006461 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006462
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006463 mbedtls_sha256_free( &sha256 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006464
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006465 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006467 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006468}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006469#endif /* MBEDTLS_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +00006470
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006471#if defined(MBEDTLS_SHA512_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00006472static void ssl_calc_finished_tls_sha384(
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006473 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
Paul Bakkerca4ab492012-04-18 14:23:57 +00006474{
6475 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02006476 const char *sender;
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006477 mbedtls_sha512_context sha512;
Paul Bakkerca4ab492012-04-18 14:23:57 +00006478 unsigned char padbuf[48];
6479
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006480 mbedtls_ssl_session *session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00006481 if( !session )
6482 session = ssl->session;
6483
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02006484 mbedtls_sha512_init( &sha512 );
6485
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006486 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00006487
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02006488 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
Paul Bakkerca4ab492012-04-18 14:23:57 +00006489
6490 /*
6491 * TLSv1.2:
6492 * hash = PRF( master, finished_label,
6493 * Hash( handshake ) )[0.11]
6494 */
6495
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006496#if !defined(MBEDTLS_SHA512_ALT)
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006497 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
6498 sha512.state, sizeof( sha512.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02006499#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00006500
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006501 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02006502 ? "client finished"
6503 : "server finished";
Paul Bakkerca4ab492012-04-18 14:23:57 +00006504
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006505 mbedtls_sha512_finish_ret( &sha512, padbuf );
Paul Bakkerca4ab492012-04-18 14:23:57 +00006506
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02006507 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00006508 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00006509
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006510 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00006511
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02006512 mbedtls_sha512_free( &sha512 );
Paul Bakkerca4ab492012-04-18 14:23:57 +00006513
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05006514 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00006515
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006516 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00006517}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006518#endif /* MBEDTLS_SHA512_C */
6519#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +00006520
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006521static void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00006522{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006523 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup: final free" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00006524
6525 /*
6526 * Free our handshake params
6527 */
Gilles Peskine9b562d52018-04-25 20:32:43 +02006528 mbedtls_ssl_handshake_free( ssl );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006529 mbedtls_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00006530 ssl->handshake = NULL;
6531
6532 /*
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02006533 * Free the previous transform and swith in the current one
Paul Bakker48916f92012-09-16 19:57:18 +00006534 */
6535 if( ssl->transform )
6536 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006537 mbedtls_ssl_transform_free( ssl->transform );
6538 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00006539 }
6540 ssl->transform = ssl->transform_negotiate;
6541 ssl->transform_negotiate = NULL;
6542
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006543 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup: final free" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02006544}
6545
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006546void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02006547{
6548 int resume = ssl->handshake->resume;
6549
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006550 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02006551
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006552#if defined(MBEDTLS_SSL_RENEGOTIATION)
6553 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02006554 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006555 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE;
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02006556 ssl->renego_records_seen = 0;
6557 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01006558#endif
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02006559
6560 /*
6561 * Free the previous session and switch in the current one
6562 */
Paul Bakker0a597072012-09-25 21:55:46 +00006563 if( ssl->session )
6564 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006565#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard1a034732014-11-04 17:36:18 +01006566 /* RFC 7366 3.1: keep the EtM state */
6567 ssl->session_negotiate->encrypt_then_mac =
6568 ssl->session->encrypt_then_mac;
6569#endif
6570
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006571 mbedtls_ssl_session_free( ssl->session );
6572 mbedtls_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00006573 }
6574 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00006575 ssl->session_negotiate = NULL;
6576
Paul Bakker0a597072012-09-25 21:55:46 +00006577 /*
6578 * Add cache entry
6579 */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006580 if( ssl->conf->f_set_cache != NULL &&
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02006581 ssl->session->id_len != 0 &&
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02006582 resume == 0 )
6583 {
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01006584 if( ssl->conf->f_set_cache( ssl->conf->p_cache, ssl->session ) != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006585 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02006586 }
Paul Bakker0a597072012-09-25 21:55:46 +00006587
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006588#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006589 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02006590 ssl->handshake->flight != NULL )
6591 {
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02006592 /* Cancel handshake timer */
6593 ssl_set_timer( ssl, 0 );
6594
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02006595 /* Keep last flight around in case we need to resend it:
6596 * we need the handshake and transform structures for that */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006597 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip freeing handshake and transform" ) );
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02006598 }
6599 else
6600#endif
6601 ssl_handshake_wrapup_free_hs_transform( ssl );
6602
Paul Bakker48916f92012-09-16 19:57:18 +00006603 ssl->state++;
6604
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006605 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00006606}
6607
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006608int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl )
Paul Bakker1ef83d62012-04-11 12:09:53 +00006609{
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02006610 int ret, hash_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +00006611
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006612 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006613
Hanno Becker5aa4e2c2018-08-06 09:26:08 +01006614 ssl_update_out_pointers( ssl, ssl->transform_negotiate );
Paul Bakker92be97b2013-01-02 17:30:03 +01006615
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006616 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00006617
Manuel Pégourié-Gonnard214a8482016-02-22 11:27:26 +01006618 /*
6619 * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites
6620 * may define some other value. Currently (early 2016), no defined
6621 * ciphersuite does this (and this is unlikely to change as activity has
6622 * moved to TLS 1.3 now) so we can keep the hardcoded 12 here.
6623 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006624 hash_len = ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) ? 36 : 12;
Paul Bakker5121ce52009-01-03 21:22:43 +00006625
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006626#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00006627 ssl->verify_data_len = hash_len;
6628 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01006629#endif
Paul Bakker48916f92012-09-16 19:57:18 +00006630
Paul Bakker5121ce52009-01-03 21:22:43 +00006631 ssl->out_msglen = 4 + hash_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006632 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
6633 ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED;
Paul Bakker5121ce52009-01-03 21:22:43 +00006634
6635 /*
6636 * In case of session resuming, invert the client and server
6637 * ChangeCipherSpec messages order.
6638 */
Paul Bakker0a597072012-09-25 21:55:46 +00006639 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00006640 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006641#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006642 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006643 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01006644#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006645#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006646 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006647 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01006648#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00006649 }
6650 else
6651 ssl->state++;
6652
Paul Bakker48916f92012-09-16 19:57:18 +00006653 /*
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02006654 * Switch to our negotiated transform and session parameters for outbound
6655 * data.
Paul Bakker48916f92012-09-16 19:57:18 +00006656 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006657 MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
Manuel Pégourié-Gonnard5afb1672014-02-16 18:33:22 +01006658
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006659#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006660 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02006661 {
6662 unsigned char i;
6663
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02006664 /* Remember current epoch settings for resending */
6665 ssl->handshake->alt_transform_out = ssl->transform_out;
Hanno Becker19859472018-08-06 09:40:20 +01006666 memcpy( ssl->handshake->alt_out_ctr, ssl->cur_out_ctr, 8 );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02006667
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02006668 /* Set sequence_number to zero */
Hanno Becker19859472018-08-06 09:40:20 +01006669 memset( ssl->cur_out_ctr + 2, 0, 6 );
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02006670
6671 /* Increment epoch */
6672 for( i = 2; i > 0; i-- )
Hanno Becker19859472018-08-06 09:40:20 +01006673 if( ++ssl->cur_out_ctr[i - 1] != 0 )
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02006674 break;
6675
6676 /* The loop goes to its end iff the counter is wrapping */
6677 if( i == 0 )
6678 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006679 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) );
6680 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02006681 }
6682 }
6683 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006684#endif /* MBEDTLS_SSL_PROTO_DTLS */
Hanno Becker19859472018-08-06 09:40:20 +01006685 memset( ssl->cur_out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00006686
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02006687 ssl->transform_out = ssl->transform_negotiate;
6688 ssl->session_out = ssl->session_negotiate;
6689
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006690#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
6691 if( mbedtls_ssl_hw_record_activate != NULL )
Paul Bakker07eb38b2012-12-19 14:42:06 +01006692 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006693 if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 )
Paul Bakker07eb38b2012-12-19 14:42:06 +01006694 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006695 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret );
6696 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Paul Bakker07eb38b2012-12-19 14:42:06 +01006697 }
6698 }
6699#endif
6700
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006701#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006702 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006703 mbedtls_ssl_send_flight_completed( ssl );
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02006704#endif
6705
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02006706 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00006707 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02006708 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00006709 return( ret );
6710 }
6711
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02006712#if defined(MBEDTLS_SSL_PROTO_DTLS)
6713 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
6714 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
6715 {
6716 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
6717 return( ret );
6718 }
6719#endif
6720
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006721 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006722
6723 return( 0 );
6724}
6725
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006726#if defined(MBEDTLS_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00006727#define SSL_MAX_HASH_LEN 36
6728#else
6729#define SSL_MAX_HASH_LEN 12
6730#endif
6731
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006732int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00006733{
Paul Bakker23986e52011-04-24 08:57:21 +00006734 int ret;
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02006735 unsigned int hash_len;
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00006736 unsigned char buf[SSL_MAX_HASH_LEN];
Paul Bakker5121ce52009-01-03 21:22:43 +00006737
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006738 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006739
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006740 ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00006741
Hanno Becker327c93b2018-08-15 13:56:18 +01006742 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00006743 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006744 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00006745 return( ret );
6746 }
6747
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006748 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker5121ce52009-01-03 21:22:43 +00006749 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006750 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02006751 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6752 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006753 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00006754 }
6755
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00006756 /* There is currently no ciphersuite using another length with TLS 1.2 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006757#if defined(MBEDTLS_SSL_PROTO_SSL3)
6758 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00006759 hash_len = 36;
6760 else
6761#endif
6762 hash_len = 12;
Paul Bakker5121ce52009-01-03 21:22:43 +00006763
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006764 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED ||
6765 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len )
Paul Bakker5121ce52009-01-03 21:22:43 +00006766 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006767 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02006768 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6769 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006770 return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00006771 }
6772
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006773 if( mbedtls_ssl_safer_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ),
Manuel Pégourié-Gonnard4abc3272014-09-10 12:02:46 +00006774 buf, hash_len ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00006775 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006776 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Gilles Peskine1cc8e342017-05-03 16:28:34 +02006777 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6778 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006779 return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00006780 }
6781
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006782#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00006783 ssl->verify_data_len = hash_len;
6784 memcpy( ssl->peer_verify_data, buf, hash_len );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01006785#endif
Paul Bakker48916f92012-09-16 19:57:18 +00006786
Paul Bakker0a597072012-09-25 21:55:46 +00006787 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00006788 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006789#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006790 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006791 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01006792#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006793#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006794 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006795 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +01006796#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00006797 }
6798 else
6799 ssl->state++;
6800
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006801#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02006802 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006803 mbedtls_ssl_recv_flight_completed( ssl );
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02006804#endif
6805
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006806 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00006807
6808 return( 0 );
6809}
6810
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006811static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006812{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006813 memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006814
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006815#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
6816 defined(MBEDTLS_SSL_PROTO_TLS1_1)
6817 mbedtls_md5_init( &handshake->fin_md5 );
6818 mbedtls_sha1_init( &handshake->fin_sha1 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006819 mbedtls_md5_starts_ret( &handshake->fin_md5 );
6820 mbedtls_sha1_starts_ret( &handshake->fin_sha1 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006821#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006822#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
6823#if defined(MBEDTLS_SHA256_C)
6824 mbedtls_sha256_init( &handshake->fin_sha256 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006825 mbedtls_sha256_starts_ret( &handshake->fin_sha256, 0 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006826#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006827#if defined(MBEDTLS_SHA512_C)
6828 mbedtls_sha512_init( &handshake->fin_sha512 );
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01006829 mbedtls_sha512_starts_ret( &handshake->fin_sha512, 1 );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006830#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006831#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006832
6833 handshake->update_checksum = ssl_update_checksum_start;
Hanno Becker7e5437a2017-04-28 17:15:26 +01006834
6835#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
6836 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
6837 mbedtls_ssl_sig_hash_set_init( &handshake->hash_algs );
6838#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006839
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006840#if defined(MBEDTLS_DHM_C)
6841 mbedtls_dhm_init( &handshake->dhm_ctx );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006842#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006843#if defined(MBEDTLS_ECDH_C)
6844 mbedtls_ecdh_init( &handshake->ecdh_ctx );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006845#endif
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02006846#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02006847 mbedtls_ecjpake_init( &handshake->ecjpake_ctx );
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02006848#if defined(MBEDTLS_SSL_CLI_C)
6849 handshake->ecjpake_cache = NULL;
6850 handshake->ecjpake_cache_len = 0;
6851#endif
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02006852#endif
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02006853
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02006854#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnard6b7301c2017-08-15 12:08:45 +02006855 mbedtls_x509_crt_restart_init( &handshake->ecrs_ctx );
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02006856#endif
6857
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02006858#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
6859 handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
6860#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006861}
6862
Hanno Becker611a83b2018-01-03 14:27:32 +00006863void mbedtls_ssl_transform_init( mbedtls_ssl_transform *transform )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006864{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006865 memset( transform, 0, sizeof(mbedtls_ssl_transform) );
Paul Bakker84bbeb52014-07-01 14:53:22 +02006866
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006867 mbedtls_cipher_init( &transform->cipher_ctx_enc );
6868 mbedtls_cipher_init( &transform->cipher_ctx_dec );
Paul Bakker84bbeb52014-07-01 14:53:22 +02006869
Hanno Becker92231322018-01-03 15:32:51 +00006870#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006871 mbedtls_md_init( &transform->md_ctx_enc );
6872 mbedtls_md_init( &transform->md_ctx_dec );
Hanno Becker92231322018-01-03 15:32:51 +00006873#endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006874}
6875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006876void mbedtls_ssl_session_init( mbedtls_ssl_session *session )
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006877{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006878 memset( session, 0, sizeof(mbedtls_ssl_session) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006879}
6880
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006881static int ssl_handshake_init( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00006882{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006883 /* Clear old handshake information if present */
Paul Bakker48916f92012-09-16 19:57:18 +00006884 if( ssl->transform_negotiate )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006885 mbedtls_ssl_transform_free( ssl->transform_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006886 if( ssl->session_negotiate )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006887 mbedtls_ssl_session_free( ssl->session_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006888 if( ssl->handshake )
Gilles Peskine9b562d52018-04-25 20:32:43 +02006889 mbedtls_ssl_handshake_free( ssl );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006890
6891 /*
6892 * Either the pointers are now NULL or cleared properly and can be freed.
6893 * Now allocate missing structures.
6894 */
6895 if( ssl->transform_negotiate == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02006896 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02006897 ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02006898 }
Paul Bakker48916f92012-09-16 19:57:18 +00006899
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006900 if( ssl->session_negotiate == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02006901 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02006902 ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02006903 }
Paul Bakker48916f92012-09-16 19:57:18 +00006904
Paul Bakker82788fb2014-10-20 13:59:19 +02006905 if( ssl->handshake == NULL )
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02006906 {
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02006907 ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) );
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02006908 }
Paul Bakker48916f92012-09-16 19:57:18 +00006909
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006910 /* All pointers should exist and can be directly freed without issue */
Paul Bakker48916f92012-09-16 19:57:18 +00006911 if( ssl->handshake == NULL ||
6912 ssl->transform_negotiate == NULL ||
6913 ssl->session_negotiate == NULL )
6914 {
Manuel Pégourié-Gonnardb2a18a22015-05-27 16:29:56 +02006915 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc() of ssl sub-contexts failed" ) );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006916
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006917 mbedtls_free( ssl->handshake );
6918 mbedtls_free( ssl->transform_negotiate );
6919 mbedtls_free( ssl->session_negotiate );
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006920
6921 ssl->handshake = NULL;
6922 ssl->transform_negotiate = NULL;
6923 ssl->session_negotiate = NULL;
6924
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02006925 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker48916f92012-09-16 19:57:18 +00006926 }
6927
Paul Bakkeraccaffe2014-06-26 13:37:14 +02006928 /* Initialize structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006929 mbedtls_ssl_session_init( ssl->session_negotiate );
Hanno Becker611a83b2018-01-03 14:27:32 +00006930 mbedtls_ssl_transform_init( ssl->transform_negotiate );
Paul Bakker968afaa2014-07-09 11:09:24 +02006931 ssl_handshake_params_init( ssl->handshake );
6932
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006933#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02006934 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
6935 {
6936 ssl->handshake->alt_transform_out = ssl->transform_out;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02006937
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02006938 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
6939 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
6940 else
6941 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02006942
6943 ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02006944 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02006945#endif
6946
Paul Bakker48916f92012-09-16 19:57:18 +00006947 return( 0 );
6948}
6949
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02006950#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02006951/* Dummy cookie callbacks for defaults */
6952static int ssl_cookie_write_dummy( void *ctx,
6953 unsigned char **p, unsigned char *end,
6954 const unsigned char *cli_id, size_t cli_id_len )
6955{
6956 ((void) ctx);
6957 ((void) p);
6958 ((void) end);
6959 ((void) cli_id);
6960 ((void) cli_id_len);
6961
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006962 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02006963}
6964
6965static int ssl_cookie_check_dummy( void *ctx,
6966 const unsigned char *cookie, size_t cookie_len,
6967 const unsigned char *cli_id, size_t cli_id_len )
6968{
6969 ((void) ctx);
6970 ((void) cookie);
6971 ((void) cookie_len);
6972 ((void) cli_id);
6973 ((void) cli_id_len);
6974
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006975 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02006976}
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02006977#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02006978
Hanno Becker5aa4e2c2018-08-06 09:26:08 +01006979/* Once ssl->out_hdr as the address of the beginning of the
6980 * next outgoing record is set, deduce the other pointers.
6981 *
6982 * Note: For TLS, we save the implicit record sequence number
6983 * (entering MAC computation) in the 8 bytes before ssl->out_hdr,
6984 * and the caller has to make sure there's space for this.
6985 */
6986
6987static void ssl_update_out_pointers( mbedtls_ssl_context *ssl,
6988 mbedtls_ssl_transform *transform )
6989{
6990#if defined(MBEDTLS_SSL_PROTO_DTLS)
6991 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
6992 {
6993 ssl->out_ctr = ssl->out_hdr + 3;
6994 ssl->out_len = ssl->out_hdr + 11;
6995 ssl->out_iv = ssl->out_hdr + 13;
6996 }
6997 else
6998#endif
6999 {
7000 ssl->out_ctr = ssl->out_hdr - 8;
7001 ssl->out_len = ssl->out_hdr + 3;
7002 ssl->out_iv = ssl->out_hdr + 5;
7003 }
7004
7005 /* Adjust out_msg to make space for explicit IV, if used. */
7006 if( transform != NULL &&
7007 ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
7008 {
7009 ssl->out_msg = ssl->out_iv + transform->ivlen - transform->fixed_ivlen;
7010 }
7011 else
7012 ssl->out_msg = ssl->out_iv;
7013}
7014
7015/* Once ssl->in_hdr as the address of the beginning of the
7016 * next incoming record is set, deduce the other pointers.
7017 *
7018 * Note: For TLS, we save the implicit record sequence number
7019 * (entering MAC computation) in the 8 bytes before ssl->in_hdr,
7020 * and the caller has to make sure there's space for this.
7021 */
7022
7023static void ssl_update_in_pointers( mbedtls_ssl_context *ssl,
7024 mbedtls_ssl_transform *transform )
7025{
7026#if defined(MBEDTLS_SSL_PROTO_DTLS)
7027 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
7028 {
7029 ssl->in_ctr = ssl->in_hdr + 3;
7030 ssl->in_len = ssl->in_hdr + 11;
7031 ssl->in_iv = ssl->in_hdr + 13;
7032 }
7033 else
7034#endif
7035 {
7036 ssl->in_ctr = ssl->in_hdr - 8;
7037 ssl->in_len = ssl->in_hdr + 3;
7038 ssl->in_iv = ssl->in_hdr + 5;
7039 }
7040
7041 /* Offset in_msg from in_iv to allow space for explicit IV, if used. */
7042 if( transform != NULL &&
7043 ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
7044 {
7045 ssl->in_msg = ssl->in_iv + transform->ivlen - transform->fixed_ivlen;
7046 }
7047 else
7048 ssl->in_msg = ssl->in_iv;
7049}
7050
Paul Bakker5121ce52009-01-03 21:22:43 +00007051/*
7052 * Initialize an SSL context
7053 */
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02007054void mbedtls_ssl_init( mbedtls_ssl_context *ssl )
7055{
7056 memset( ssl, 0, sizeof( mbedtls_ssl_context ) );
7057}
7058
7059/*
7060 * Setup an SSL context
7061 */
Hanno Becker2a43f6f2018-08-10 11:12:52 +01007062
7063static void ssl_reset_in_out_pointers( mbedtls_ssl_context *ssl )
7064{
7065 /* Set the incoming and outgoing record pointers. */
7066#if defined(MBEDTLS_SSL_PROTO_DTLS)
7067 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
7068 {
7069 ssl->out_hdr = ssl->out_buf;
7070 ssl->in_hdr = ssl->in_buf;
7071 }
7072 else
7073#endif /* MBEDTLS_SSL_PROTO_DTLS */
7074 {
7075 ssl->out_hdr = ssl->out_buf + 8;
7076 ssl->in_hdr = ssl->in_buf + 8;
7077 }
7078
7079 /* Derive other internal pointers. */
7080 ssl_update_out_pointers( ssl, NULL /* no transform enabled */ );
7081 ssl_update_in_pointers ( ssl, NULL /* no transform enabled */ );
7082}
7083
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02007084int mbedtls_ssl_setup( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard1897af92015-05-10 23:27:38 +02007085 const mbedtls_ssl_config *conf )
Paul Bakker5121ce52009-01-03 21:22:43 +00007086{
Paul Bakker48916f92012-09-16 19:57:18 +00007087 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00007088
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02007089 ssl->conf = conf;
Paul Bakker62f2dee2012-09-28 07:31:51 +00007090
7091 /*
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01007092 * Prepare base structures
Paul Bakker62f2dee2012-09-28 07:31:51 +00007093 */
k-stachowiakc9a5f022018-07-24 13:53:31 +02007094
7095 /* Set to NULL in case of an error condition */
7096 ssl->out_buf = NULL;
k-stachowiaka47911c2018-07-04 17:41:58 +02007097
Angus Grattond8213d02016-05-25 20:56:48 +10007098 ssl->in_buf = mbedtls_calloc( 1, MBEDTLS_SSL_IN_BUFFER_LEN );
7099 if( ssl->in_buf == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00007100 {
Angus Grattond8213d02016-05-25 20:56:48 +10007101 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", MBEDTLS_SSL_IN_BUFFER_LEN) );
k-stachowiak9f7798e2018-07-31 16:52:32 +02007102 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02007103 goto error;
Angus Grattond8213d02016-05-25 20:56:48 +10007104 }
7105
7106 ssl->out_buf = mbedtls_calloc( 1, MBEDTLS_SSL_OUT_BUFFER_LEN );
7107 if( ssl->out_buf == NULL )
7108 {
7109 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", MBEDTLS_SSL_OUT_BUFFER_LEN) );
k-stachowiak9f7798e2018-07-31 16:52:32 +02007110 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02007111 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00007112 }
7113
Hanno Becker2a43f6f2018-08-10 11:12:52 +01007114 ssl_reset_in_out_pointers( ssl );
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02007115
Paul Bakker48916f92012-09-16 19:57:18 +00007116 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
k-stachowiaka47911c2018-07-04 17:41:58 +02007117 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00007118
7119 return( 0 );
k-stachowiaka47911c2018-07-04 17:41:58 +02007120
7121error:
7122 mbedtls_free( ssl->in_buf );
7123 mbedtls_free( ssl->out_buf );
7124
7125 ssl->conf = NULL;
7126
7127 ssl->in_buf = NULL;
7128 ssl->out_buf = NULL;
7129
7130 ssl->in_hdr = NULL;
7131 ssl->in_ctr = NULL;
7132 ssl->in_len = NULL;
7133 ssl->in_iv = NULL;
7134 ssl->in_msg = NULL;
7135
7136 ssl->out_hdr = NULL;
7137 ssl->out_ctr = NULL;
7138 ssl->out_len = NULL;
7139 ssl->out_iv = NULL;
7140 ssl->out_msg = NULL;
7141
k-stachowiak9f7798e2018-07-31 16:52:32 +02007142 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00007143}
7144
7145/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00007146 * Reset an initialized and used SSL context for re-use while retaining
7147 * all application-set variables, function pointers and data.
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02007148 *
7149 * If partial is non-zero, keep data in the input buffer and client ID.
7150 * (Use when a DTLS client reconnects from the same port.)
Paul Bakker7eb013f2011-10-06 12:37:39 +00007151 */
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02007152static int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial )
Paul Bakker7eb013f2011-10-06 12:37:39 +00007153{
Paul Bakker48916f92012-09-16 19:57:18 +00007154 int ret;
7155
Hanno Becker7e772132018-08-10 12:38:21 +01007156#if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || \
7157 !defined(MBEDTLS_SSL_SRV_C)
7158 ((void) partial);
7159#endif
7160
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007161 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01007162
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02007163 /* Cancel any possibly running timer */
7164 ssl_set_timer( ssl, 0 );
7165
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007166#if defined(MBEDTLS_SSL_RENEGOTIATION)
7167 ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01007168 ssl->renego_records_seen = 0;
Paul Bakker48916f92012-09-16 19:57:18 +00007169
7170 ssl->verify_data_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007171 memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
7172 memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01007173#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007174 ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +00007175
Paul Bakker7eb013f2011-10-06 12:37:39 +00007176 ssl->in_offt = NULL;
Hanno Beckerf29d4702018-08-10 11:31:15 +01007177 ssl_reset_in_out_pointers( ssl );
Paul Bakker7eb013f2011-10-06 12:37:39 +00007178
7179 ssl->in_msgtype = 0;
7180 ssl->in_msglen = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007181#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02007182 ssl->next_record_offset = 0;
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02007183 ssl->in_epoch = 0;
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02007184#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007185#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardb47368a2014-09-24 13:29:58 +02007186 ssl_dtls_replay_reset( ssl );
7187#endif
Paul Bakker7eb013f2011-10-06 12:37:39 +00007188
7189 ssl->in_hslen = 0;
7190 ssl->nb_zero = 0;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01007191
7192 ssl->keep_current_message = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00007193
7194 ssl->out_msgtype = 0;
7195 ssl->out_msglen = 0;
7196 ssl->out_left = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007197#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
7198 if( ssl->split_done != MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED )
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01007199 ssl->split_done = 0;
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01007200#endif
Paul Bakker7eb013f2011-10-06 12:37:39 +00007201
Hanno Becker19859472018-08-06 09:40:20 +01007202 memset( ssl->cur_out_ctr, 0, sizeof( ssl->cur_out_ctr ) );
7203
Paul Bakker48916f92012-09-16 19:57:18 +00007204 ssl->transform_in = NULL;
7205 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00007206
Hanno Becker78640902018-08-13 16:35:15 +01007207 ssl->session_in = NULL;
7208 ssl->session_out = NULL;
7209
Angus Grattond8213d02016-05-25 20:56:48 +10007210 memset( ssl->out_buf, 0, MBEDTLS_SSL_OUT_BUFFER_LEN );
Hanno Becker4ccbf062018-08-10 11:20:38 +01007211
7212#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02007213 if( partial == 0 )
Hanno Becker4ccbf062018-08-10 11:20:38 +01007214#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */
7215 {
7216 ssl->in_left = 0;
Angus Grattond8213d02016-05-25 20:56:48 +10007217 memset( ssl->in_buf, 0, MBEDTLS_SSL_IN_BUFFER_LEN );
Hanno Becker4ccbf062018-08-10 11:20:38 +01007218 }
Paul Bakker05ef8352012-05-08 09:17:57 +00007219
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007220#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
7221 if( mbedtls_ssl_hw_record_reset != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00007222 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007223 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_reset()" ) );
7224 if( ( ret = mbedtls_ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00007225 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007226 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_reset", ret );
7227 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
Paul Bakker2770fbd2012-07-03 13:30:23 +00007228 }
Paul Bakker05ef8352012-05-08 09:17:57 +00007229 }
7230#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00007231
Paul Bakker48916f92012-09-16 19:57:18 +00007232 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00007233 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007234 mbedtls_ssl_transform_free( ssl->transform );
7235 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00007236 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00007237 }
Paul Bakker48916f92012-09-16 19:57:18 +00007238
Paul Bakkerc0463502013-02-14 11:19:38 +01007239 if( ssl->session )
7240 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007241 mbedtls_ssl_session_free( ssl->session );
7242 mbedtls_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01007243 ssl->session = NULL;
7244 }
7245
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007246#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02007247 ssl->alpn_chosen = NULL;
7248#endif
7249
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02007250#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Hanno Becker4ccbf062018-08-10 11:20:38 +01007251#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE)
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02007252 if( partial == 0 )
Hanno Becker4ccbf062018-08-10 11:20:38 +01007253#endif
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02007254 {
7255 mbedtls_free( ssl->cli_id );
7256 ssl->cli_id = NULL;
7257 ssl->cli_id_len = 0;
7258 }
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02007259#endif
7260
Paul Bakker48916f92012-09-16 19:57:18 +00007261 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
7262 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00007263
7264 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00007265}
7266
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02007267/*
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02007268 * Reset an initialized and used SSL context for re-use while retaining
7269 * all application-set variables, function pointers and data.
7270 */
7271int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl )
7272{
7273 return( ssl_session_reset_int( ssl, 0 ) );
7274}
7275
7276/*
Paul Bakker5121ce52009-01-03 21:22:43 +00007277 * SSL set accessors
7278 */
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007279void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint )
Paul Bakker5121ce52009-01-03 21:22:43 +00007280{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007281 conf->endpoint = endpoint;
Paul Bakker5121ce52009-01-03 21:22:43 +00007282}
7283
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02007284void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport )
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01007285{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007286 conf->transport = transport;
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01007287}
7288
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007289#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007290void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode )
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02007291{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007292 conf->anti_replay = mode;
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02007293}
7294#endif
7295
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007296#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007297void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit )
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02007298{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007299 conf->badmac_limit = limit;
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02007300}
7301#endif
7302
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007303#if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker04da1892018-08-14 13:22:10 +01007304
Hanno Becker1841b0a2018-08-24 11:13:57 +01007305void mbedtls_ssl_set_datagram_packing( mbedtls_ssl_context *ssl,
7306 unsigned allow_packing )
Hanno Becker04da1892018-08-14 13:22:10 +01007307{
7308 ssl->disable_datagram_packing = !allow_packing;
7309}
7310
7311void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf,
7312 uint32_t min, uint32_t max )
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02007313{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007314 conf->hs_timeout_min = min;
7315 conf->hs_timeout_max = max;
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02007316}
7317#endif
7318
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007319void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode )
Paul Bakker5121ce52009-01-03 21:22:43 +00007320{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007321 conf->authmode = authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00007322}
7323
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007324#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007325void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02007326 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00007327 void *p_vrfy )
7328{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007329 conf->f_vrfy = f_vrfy;
7330 conf->p_vrfy = p_vrfy;
Paul Bakkerb63b0af2011-01-13 17:54:59 +00007331}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007332#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00007333
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007334void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf,
Paul Bakkera3d195c2011-11-27 21:07:34 +00007335 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00007336 void *p_rng )
7337{
Manuel Pégourié-Gonnard750e4d72015-05-07 12:35:38 +01007338 conf->f_rng = f_rng;
7339 conf->p_rng = p_rng;
Paul Bakker5121ce52009-01-03 21:22:43 +00007340}
7341
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007342void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardfd474232015-06-23 16:34:24 +02007343 void (*f_dbg)(void *, int, const char *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00007344 void *p_dbg )
7345{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007346 conf->f_dbg = f_dbg;
7347 conf->p_dbg = p_dbg;
Paul Bakker5121ce52009-01-03 21:22:43 +00007348}
7349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007350void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02007351 void *p_bio,
Simon Butchere846b512016-03-01 17:31:49 +00007352 mbedtls_ssl_send_t *f_send,
7353 mbedtls_ssl_recv_t *f_recv,
7354 mbedtls_ssl_recv_timeout_t *f_recv_timeout )
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02007355{
7356 ssl->p_bio = p_bio;
7357 ssl->f_send = f_send;
7358 ssl->f_recv = f_recv;
7359 ssl->f_recv_timeout = f_recv_timeout;
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01007360}
7361
Manuel Pégourié-Gonnard6e7aaca2018-08-20 10:37:23 +02007362#if defined(MBEDTLS_SSL_PROTO_DTLS)
7363void mbedtls_ssl_set_mtu( mbedtls_ssl_context *ssl, uint16_t mtu )
7364{
7365 ssl->mtu = mtu;
7366}
7367#endif
7368
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007369void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout )
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01007370{
7371 conf->read_timeout = timeout;
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02007372}
7373
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02007374void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl,
7375 void *p_timer,
Simon Butchere846b512016-03-01 17:31:49 +00007376 mbedtls_ssl_set_timer_t *f_set_timer,
7377 mbedtls_ssl_get_timer_t *f_get_timer )
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02007378{
7379 ssl->p_timer = p_timer;
7380 ssl->f_set_timer = f_set_timer;
7381 ssl->f_get_timer = f_get_timer;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02007382
7383 /* Make sure we start with no timer running */
7384 ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02007385}
7386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007387#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007388void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01007389 void *p_cache,
7390 int (*f_get_cache)(void *, mbedtls_ssl_session *),
7391 int (*f_set_cache)(void *, const mbedtls_ssl_session *) )
Paul Bakker5121ce52009-01-03 21:22:43 +00007392{
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01007393 conf->p_cache = p_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007394 conf->f_get_cache = f_get_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007395 conf->f_set_cache = f_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00007396}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007397#endif /* MBEDTLS_SSL_SRV_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00007398
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007399#if defined(MBEDTLS_SSL_CLI_C)
7400int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00007401{
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02007402 int ret;
7403
7404 if( ssl == NULL ||
7405 session == NULL ||
7406 ssl->session_negotiate == NULL ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02007407 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02007408 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007409 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02007410 }
7411
7412 if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 )
7413 return( ret );
7414
Paul Bakker0a597072012-09-25 21:55:46 +00007415 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02007416
7417 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00007418}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007419#endif /* MBEDTLS_SSL_CLI_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00007420
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007421void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007422 const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00007423{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007424 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = ciphersuites;
7425 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = ciphersuites;
7426 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = ciphersuites;
7427 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ciphersuites;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02007428}
7429
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007430void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02007431 const int *ciphersuites,
Paul Bakker8f4ddae2013-04-15 15:09:54 +02007432 int major, int minor )
7433{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007434 if( major != MBEDTLS_SSL_MAJOR_VERSION_3 )
Paul Bakker8f4ddae2013-04-15 15:09:54 +02007435 return;
7436
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007437 if( minor < MBEDTLS_SSL_MINOR_VERSION_0 || minor > MBEDTLS_SSL_MINOR_VERSION_3 )
Paul Bakker8f4ddae2013-04-15 15:09:54 +02007438 return;
7439
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007440 conf->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00007441}
7442
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007443#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02007444void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf,
Nicholas Wilson2088e2e2015-09-08 16:53:18 +01007445 const mbedtls_x509_crt_profile *profile )
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02007446{
7447 conf->cert_profile = profile;
7448}
7449
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02007450/* Append a new keycert entry to a (possibly empty) list */
7451static int ssl_append_key_cert( mbedtls_ssl_key_cert **head,
7452 mbedtls_x509_crt *cert,
7453 mbedtls_pk_context *key )
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02007454{
niisato8ee24222018-06-25 19:05:48 +09007455 mbedtls_ssl_key_cert *new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02007456
niisato8ee24222018-06-25 19:05:48 +09007457 new_cert = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) );
7458 if( new_cert == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02007459 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02007460
niisato8ee24222018-06-25 19:05:48 +09007461 new_cert->cert = cert;
7462 new_cert->key = key;
7463 new_cert->next = NULL;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02007464
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02007465 /* Update head is the list was null, else add to the end */
7466 if( *head == NULL )
Paul Bakker0333b972013-11-04 17:08:28 +01007467 {
niisato8ee24222018-06-25 19:05:48 +09007468 *head = new_cert;
Paul Bakker0333b972013-11-04 17:08:28 +01007469 }
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02007470 else
7471 {
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02007472 mbedtls_ssl_key_cert *cur = *head;
7473 while( cur->next != NULL )
7474 cur = cur->next;
niisato8ee24222018-06-25 19:05:48 +09007475 cur->next = new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02007476 }
7477
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02007478 return( 0 );
7479}
7480
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007481int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02007482 mbedtls_x509_crt *own_cert,
7483 mbedtls_pk_context *pk_key )
7484{
Manuel Pégourié-Gonnard17a40cd2015-05-10 23:17:17 +02007485 return( ssl_append_key_cert( &conf->key_cert, own_cert, pk_key ) );
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02007486}
7487
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007488void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01007489 mbedtls_x509_crt *ca_chain,
7490 mbedtls_x509_crl *ca_crl )
Paul Bakker5121ce52009-01-03 21:22:43 +00007491{
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01007492 conf->ca_chain = ca_chain;
7493 conf->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00007494}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007495#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00007496
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02007497#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
7498int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl,
7499 mbedtls_x509_crt *own_cert,
7500 mbedtls_pk_context *pk_key )
7501{
7502 return( ssl_append_key_cert( &ssl->handshake->sni_key_cert,
7503 own_cert, pk_key ) );
7504}
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02007505
7506void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl,
7507 mbedtls_x509_crt *ca_chain,
7508 mbedtls_x509_crl *ca_crl )
7509{
7510 ssl->handshake->sni_ca_chain = ca_chain;
7511 ssl->handshake->sni_ca_crl = ca_crl;
7512}
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02007513
7514void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl,
7515 int authmode )
7516{
7517 ssl->handshake->sni_authmode = authmode;
7518}
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02007519#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
7520
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02007521#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02007522/*
7523 * Set EC J-PAKE password for current handshake
7524 */
7525int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,
7526 const unsigned char *pw,
7527 size_t pw_len )
7528{
7529 mbedtls_ecjpake_role role;
7530
Janos Follath8eb64132016-06-03 15:40:57 +01007531 if( ssl->handshake == NULL || ssl->conf == NULL )
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02007532 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
7533
7534 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
7535 role = MBEDTLS_ECJPAKE_SERVER;
7536 else
7537 role = MBEDTLS_ECJPAKE_CLIENT;
7538
7539 return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx,
7540 role,
7541 MBEDTLS_MD_SHA256,
7542 MBEDTLS_ECP_DP_SECP256R1,
7543 pw, pw_len ) );
7544}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02007545#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02007546
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007547#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007548int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01007549 const unsigned char *psk, size_t psk_len,
7550 const unsigned char *psk_identity, size_t psk_identity_len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02007551{
Paul Bakker6db455e2013-09-18 17:29:31 +02007552 if( psk == NULL || psk_identity == NULL )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007553 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker6db455e2013-09-18 17:29:31 +02007554
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007555 if( psk_len > MBEDTLS_PSK_MAX_LEN )
7556 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardb2bf5a12014-03-25 16:28:12 +01007557
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02007558 /* Identity len will be encoded on two bytes */
7559 if( ( psk_identity_len >> 16 ) != 0 ||
Angus Grattond8213d02016-05-25 20:56:48 +10007560 psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN )
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02007561 {
7562 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
7563 }
7564
Andres Amaya Garciabbafd342017-07-05 14:25:21 +01007565 if( conf->psk != NULL )
Paul Bakker6db455e2013-09-18 17:29:31 +02007566 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05007567 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
Andres Amaya Garciabbafd342017-07-05 14:25:21 +01007568
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01007569 mbedtls_free( conf->psk );
Manuel Pégourié-Gonnard173c7902015-10-20 19:56:45 +02007570 conf->psk = NULL;
Andres Amaya Garciabbafd342017-07-05 14:25:21 +01007571 conf->psk_len = 0;
7572 }
7573 if( conf->psk_identity != NULL )
7574 {
7575 mbedtls_free( conf->psk_identity );
Manuel Pégourié-Gonnard173c7902015-10-20 19:56:45 +02007576 conf->psk_identity = NULL;
Andres Amaya Garciabbafd342017-07-05 14:25:21 +01007577 conf->psk_identity_len = 0;
Paul Bakker6db455e2013-09-18 17:29:31 +02007578 }
7579
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02007580 if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL ||
7581 ( conf->psk_identity = mbedtls_calloc( 1, psk_identity_len ) ) == NULL )
Mansour Moufidf81088b2015-02-17 13:10:21 -05007582 {
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01007583 mbedtls_free( conf->psk );
Manuel Pégourié-Gonnard24417f02015-09-28 18:09:45 +02007584 mbedtls_free( conf->psk_identity );
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01007585 conf->psk = NULL;
Manuel Pégourié-Gonnard24417f02015-09-28 18:09:45 +02007586 conf->psk_identity = NULL;
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02007587 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Mansour Moufidf81088b2015-02-17 13:10:21 -05007588 }
Paul Bakker6db455e2013-09-18 17:29:31 +02007589
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01007590 conf->psk_len = psk_len;
7591 conf->psk_identity_len = psk_identity_len;
Paul Bakker6db455e2013-09-18 17:29:31 +02007592
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01007593 memcpy( conf->psk, psk, conf->psk_len );
7594 memcpy( conf->psk_identity, psk_identity, conf->psk_identity_len );
Paul Bakker6db455e2013-09-18 17:29:31 +02007595
7596 return( 0 );
7597}
7598
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01007599int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl,
7600 const unsigned char *psk, size_t psk_len )
7601{
7602 if( psk == NULL || ssl->handshake == NULL )
7603 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
7604
7605 if( psk_len > MBEDTLS_PSK_MAX_LEN )
7606 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
7607
7608 if( ssl->handshake->psk != NULL )
Andres Amaya Garciaa0049882017-06-26 11:35:17 +01007609 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05007610 mbedtls_platform_zeroize( ssl->handshake->psk,
7611 ssl->handshake->psk_len );
Simon Butcher5b8d1d62015-10-04 22:06:51 +01007612 mbedtls_free( ssl->handshake->psk );
Andres Amaya Garciabbafd342017-07-05 14:25:21 +01007613 ssl->handshake->psk_len = 0;
Andres Amaya Garciaa0049882017-06-26 11:35:17 +01007614 }
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01007615
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02007616 if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +02007617 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01007618
7619 ssl->handshake->psk_len = psk_len;
7620 memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len );
7621
7622 return( 0 );
7623}
7624
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007625void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007626 int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *,
Paul Bakker6db455e2013-09-18 17:29:31 +02007627 size_t),
7628 void *p_psk )
7629{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007630 conf->f_psk = f_psk;
7631 conf->p_psk = p_psk;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02007632}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007633#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00007634
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02007635#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Hanno Becker470a8c42017-10-04 15:28:46 +01007636
7637#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007638int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00007639{
7640 int ret;
7641
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01007642 if( ( ret = mbedtls_mpi_read_string( &conf->dhm_P, 16, dhm_P ) ) != 0 ||
7643 ( ret = mbedtls_mpi_read_string( &conf->dhm_G, 16, dhm_G ) ) != 0 )
7644 {
7645 mbedtls_mpi_free( &conf->dhm_P );
7646 mbedtls_mpi_free( &conf->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00007647 return( ret );
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01007648 }
Paul Bakker5121ce52009-01-03 21:22:43 +00007649
7650 return( 0 );
7651}
Hanno Becker470a8c42017-10-04 15:28:46 +01007652#endif /* MBEDTLS_DEPRECATED_REMOVED */
Paul Bakker5121ce52009-01-03 21:22:43 +00007653
Hanno Beckera90658f2017-10-04 15:29:08 +01007654int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf,
7655 const unsigned char *dhm_P, size_t P_len,
7656 const unsigned char *dhm_G, size_t G_len )
7657{
7658 int ret;
7659
7660 if( ( ret = mbedtls_mpi_read_binary( &conf->dhm_P, dhm_P, P_len ) ) != 0 ||
7661 ( ret = mbedtls_mpi_read_binary( &conf->dhm_G, dhm_G, G_len ) ) != 0 )
7662 {
7663 mbedtls_mpi_free( &conf->dhm_P );
7664 mbedtls_mpi_free( &conf->dhm_G );
7665 return( ret );
7666 }
7667
7668 return( 0 );
7669}
Paul Bakker5121ce52009-01-03 21:22:43 +00007670
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007671int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx )
Paul Bakker1b57b062011-01-06 15:48:19 +00007672{
7673 int ret;
7674
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01007675 if( ( ret = mbedtls_mpi_copy( &conf->dhm_P, &dhm_ctx->P ) ) != 0 ||
7676 ( ret = mbedtls_mpi_copy( &conf->dhm_G, &dhm_ctx->G ) ) != 0 )
7677 {
7678 mbedtls_mpi_free( &conf->dhm_P );
7679 mbedtls_mpi_free( &conf->dhm_G );
Paul Bakker1b57b062011-01-06 15:48:19 +00007680 return( ret );
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01007681 }
Paul Bakker1b57b062011-01-06 15:48:19 +00007682
7683 return( 0 );
7684}
Manuel Pégourié-Gonnardcf141ca2015-05-20 10:35:51 +02007685#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00007686
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02007687#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
7688/*
7689 * Set the minimum length for Diffie-Hellman parameters
7690 */
7691void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf,
7692 unsigned int bitlen )
7693{
7694 conf->dhm_min_bitlen = bitlen;
7695}
7696#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */
7697
Manuel Pégourié-Gonnarde5f30722015-10-22 17:01:15 +02007698#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02007699/*
7700 * Set allowed/preferred hashes for handshake signatures
7701 */
7702void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf,
7703 const int *hashes )
7704{
7705 conf->sig_hashes = hashes;
7706}
Hanno Becker947194e2017-04-07 13:25:49 +01007707#endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02007708
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02007709#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01007710/*
7711 * Set the allowed elliptic curves
7712 */
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007713void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007714 const mbedtls_ecp_group_id *curve_list )
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01007715{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007716 conf->curve_list = curve_list;
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01007717}
Hanno Becker947194e2017-04-07 13:25:49 +01007718#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01007719
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01007720#if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007721int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00007722{
Hanno Becker947194e2017-04-07 13:25:49 +01007723 /* Initialize to suppress unnecessary compiler warning */
7724 size_t hostname_len = 0;
7725
7726 /* Check if new hostname is valid before
7727 * making any change to current one */
Hanno Becker947194e2017-04-07 13:25:49 +01007728 if( hostname != NULL )
7729 {
7730 hostname_len = strlen( hostname );
7731
7732 if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN )
7733 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
7734 }
7735
7736 /* Now it's clear that we will overwrite the old hostname,
7737 * so we can free it safely */
7738
7739 if( ssl->hostname != NULL )
7740 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05007741 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
Hanno Becker947194e2017-04-07 13:25:49 +01007742 mbedtls_free( ssl->hostname );
7743 }
7744
7745 /* Passing NULL as hostname shall clear the old one */
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +01007746
Paul Bakker5121ce52009-01-03 21:22:43 +00007747 if( hostname == NULL )
Hanno Becker947194e2017-04-07 13:25:49 +01007748 {
7749 ssl->hostname = NULL;
7750 }
7751 else
7752 {
7753 ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 );
Hanno Becker947194e2017-04-07 13:25:49 +01007754 if( ssl->hostname == NULL )
7755 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02007756
Hanno Becker947194e2017-04-07 13:25:49 +01007757 memcpy( ssl->hostname, hostname, hostname_len );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02007758
Hanno Becker947194e2017-04-07 13:25:49 +01007759 ssl->hostname[hostname_len] = '\0';
7760 }
Paul Bakker5121ce52009-01-03 21:22:43 +00007761
7762 return( 0 );
7763}
Hanno Becker1a9a51c2017-04-07 13:02:16 +01007764#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00007765
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01007766#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007767void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007768 int (*f_sni)(void *, mbedtls_ssl_context *,
Paul Bakker5701cdc2012-09-27 21:49:42 +00007769 const unsigned char *, size_t),
7770 void *p_sni )
7771{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007772 conf->f_sni = f_sni;
7773 conf->p_sni = p_sni;
Paul Bakker5701cdc2012-09-27 21:49:42 +00007774}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007775#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00007776
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007777#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007778int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos )
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02007779{
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02007780 size_t cur_len, tot_len;
7781 const char **p;
7782
7783 /*
Brian J Murray1903fb32016-11-06 04:45:15 -08007784 * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings
7785 * MUST NOT be truncated."
7786 * We check lengths now rather than later.
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02007787 */
7788 tot_len = 0;
7789 for( p = protos; *p != NULL; p++ )
7790 {
7791 cur_len = strlen( *p );
7792 tot_len += cur_len;
7793
7794 if( cur_len == 0 || cur_len > 255 || tot_len > 65535 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007795 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02007796 }
7797
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007798 conf->alpn_list = protos;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02007799
7800 return( 0 );
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02007801}
7802
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007803const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02007804{
Paul Bakkerd8bb8262014-06-17 14:06:49 +02007805 return( ssl->alpn_chosen );
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02007806}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007807#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02007808
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02007809void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor )
Paul Bakker490ecc82011-10-06 13:04:09 +00007810{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007811 conf->max_major_ver = major;
7812 conf->max_minor_ver = minor;
Paul Bakker490ecc82011-10-06 13:04:09 +00007813}
7814
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02007815void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor )
Paul Bakker1d29fb52012-09-28 13:28:45 +00007816{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007817 conf->min_major_ver = major;
7818 conf->min_minor_ver = minor;
Paul Bakker1d29fb52012-09-28 13:28:45 +00007819}
7820
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007821#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007822void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback )
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02007823{
Manuel Pégourié-Gonnard684b0592015-05-06 09:27:31 +01007824 conf->fallback = fallback;
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +02007825}
7826#endif
7827
Janos Follath088ce432017-04-10 12:42:31 +01007828#if defined(MBEDTLS_SSL_SRV_C)
7829void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf,
7830 char cert_req_ca_list )
7831{
7832 conf->cert_req_ca_list = cert_req_ca_list;
7833}
7834#endif
7835
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007836#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007837void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm )
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01007838{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007839 conf->encrypt_then_mac = etm;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01007840}
7841#endif
7842
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007843#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007844void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02007845{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007846 conf->extended_ms = ems;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02007847}
7848#endif
7849
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02007850#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007851void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 )
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01007852{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007853 conf->arc4_disabled = arc4;
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01007854}
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02007855#endif
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01007856
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007857#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007858int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02007859{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007860 if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ||
Angus Grattond8213d02016-05-25 20:56:48 +10007861 ssl_mfl_code_to_length( mfl_code ) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02007862 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007863 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02007864 }
7865
Manuel Pégourié-Gonnard6bf89d62015-05-05 17:01:57 +01007866 conf->mfl_code = mfl_code;
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02007867
7868 return( 0 );
7869}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007870#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02007871
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007872#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard01e5e8c2015-05-11 10:11:56 +02007873void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate )
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02007874{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007875 conf->trunc_hmac = truncate;
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02007876}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007877#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02007878
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007879#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007880void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split )
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01007881{
Manuel Pégourié-Gonnard17eab2b2015-05-05 16:34:53 +01007882 conf->cbc_record_splitting = split;
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01007883}
7884#endif
7885
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007886void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy )
Paul Bakker48916f92012-09-16 19:57:18 +00007887{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007888 conf->allow_legacy_renegotiation = allow_legacy;
Paul Bakker48916f92012-09-16 19:57:18 +00007889}
7890
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007891#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007892void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01007893{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007894 conf->disable_renegotiation = renegotiation;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01007895}
7896
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007897void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records )
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02007898{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007899 conf->renego_max_records = max_records;
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02007900}
7901
Manuel Pégourié-Gonnard6729e792015-05-11 09:50:24 +02007902void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01007903 const unsigned char period[8] )
7904{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02007905 memcpy( conf->renego_period, period, 8 );
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01007906}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007907#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker5121ce52009-01-03 21:22:43 +00007908
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007909#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02007910#if defined(MBEDTLS_SSL_CLI_C)
7911void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets )
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02007912{
Manuel Pégourié-Gonnard2b494452015-05-06 10:05:11 +01007913 conf->session_tickets = use_tickets;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02007914}
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02007915#endif
Paul Bakker606b4ba2013-08-14 16:52:14 +02007916
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02007917#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02007918void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,
7919 mbedtls_ssl_ticket_write_t *f_ticket_write,
7920 mbedtls_ssl_ticket_parse_t *f_ticket_parse,
7921 void *p_ticket )
Paul Bakker606b4ba2013-08-14 16:52:14 +02007922{
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02007923 conf->f_ticket_write = f_ticket_write;
7924 conf->f_ticket_parse = f_ticket_parse;
7925 conf->p_ticket = p_ticket;
Paul Bakker606b4ba2013-08-14 16:52:14 +02007926}
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02007927#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007928#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02007929
Robert Cragie4feb7ae2015-10-02 13:33:37 +01007930#if defined(MBEDTLS_SSL_EXPORT_KEYS)
7931void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf,
7932 mbedtls_ssl_export_keys_t *f_export_keys,
7933 void *p_export_keys )
7934{
7935 conf->f_export_keys = f_export_keys;
7936 conf->p_export_keys = p_export_keys;
7937}
7938#endif
7939
Gilles Peskineb74a1c72018-04-24 13:09:22 +02007940#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine8bf79f62018-01-05 21:11:53 +01007941void mbedtls_ssl_conf_async_private_cb(
7942 mbedtls_ssl_config *conf,
7943 mbedtls_ssl_async_sign_t *f_async_sign,
7944 mbedtls_ssl_async_decrypt_t *f_async_decrypt,
7945 mbedtls_ssl_async_resume_t *f_async_resume,
7946 mbedtls_ssl_async_cancel_t *f_async_cancel,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02007947 void *async_config_data )
Gilles Peskine8bf79f62018-01-05 21:11:53 +01007948{
7949 conf->f_async_sign_start = f_async_sign;
7950 conf->f_async_decrypt_start = f_async_decrypt;
7951 conf->f_async_resume = f_async_resume;
7952 conf->f_async_cancel = f_async_cancel;
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02007953 conf->p_async_config_data = async_config_data;
7954}
7955
Gilles Peskine8f97af72018-04-26 11:46:10 +02007956void *mbedtls_ssl_conf_get_async_config_data( const mbedtls_ssl_config *conf )
7957{
7958 return( conf->p_async_config_data );
7959}
7960
Gilles Peskine1febfef2018-04-30 11:54:39 +02007961void *mbedtls_ssl_get_async_operation_data( const mbedtls_ssl_context *ssl )
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02007962{
7963 if( ssl->handshake == NULL )
7964 return( NULL );
7965 else
7966 return( ssl->handshake->user_async_ctx );
7967}
7968
Gilles Peskine1febfef2018-04-30 11:54:39 +02007969void mbedtls_ssl_set_async_operation_data( mbedtls_ssl_context *ssl,
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02007970 void *ctx )
7971{
7972 if( ssl->handshake != NULL )
7973 ssl->handshake->user_async_ctx = ctx;
Gilles Peskine8bf79f62018-01-05 21:11:53 +01007974}
Gilles Peskineb74a1c72018-04-24 13:09:22 +02007975#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine8bf79f62018-01-05 21:11:53 +01007976
Paul Bakker5121ce52009-01-03 21:22:43 +00007977/*
7978 * SSL get accessors
7979 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02007980size_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00007981{
7982 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
7983}
7984
Hanno Becker8b170a02017-10-10 11:51:19 +01007985int mbedtls_ssl_check_pending( const mbedtls_ssl_context *ssl )
7986{
7987 /*
7988 * Case A: We're currently holding back
7989 * a message for further processing.
7990 */
7991
7992 if( ssl->keep_current_message == 1 )
7993 {
Hanno Beckera6fb0892017-10-23 13:17:48 +01007994 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: record held back for processing" ) );
Hanno Becker8b170a02017-10-10 11:51:19 +01007995 return( 1 );
7996 }
7997
7998 /*
7999 * Case B: Further records are pending in the current datagram.
8000 */
8001
8002#if defined(MBEDTLS_SSL_PROTO_DTLS)
8003 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
8004 ssl->in_left > ssl->next_record_offset )
8005 {
Hanno Beckera6fb0892017-10-23 13:17:48 +01008006 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: more records within current datagram" ) );
Hanno Becker8b170a02017-10-10 11:51:19 +01008007 return( 1 );
8008 }
8009#endif /* MBEDTLS_SSL_PROTO_DTLS */
8010
8011 /*
8012 * Case C: A handshake message is being processed.
8013 */
8014
Hanno Becker8b170a02017-10-10 11:51:19 +01008015 if( ssl->in_hslen > 0 && ssl->in_hslen < ssl->in_msglen )
8016 {
Hanno Beckera6fb0892017-10-23 13:17:48 +01008017 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: more handshake messages within current record" ) );
Hanno Becker8b170a02017-10-10 11:51:19 +01008018 return( 1 );
8019 }
8020
8021 /*
8022 * Case D: An application data message is being processed
8023 */
8024 if( ssl->in_offt != NULL )
8025 {
Hanno Beckera6fb0892017-10-23 13:17:48 +01008026 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: application data record is being processed" ) );
Hanno Becker8b170a02017-10-10 11:51:19 +01008027 return( 1 );
8028 }
8029
8030 /*
8031 * In all other cases, the rest of the message can be dropped.
Hanno Beckerc573ac32018-08-28 17:15:25 +01008032 * As in ssl_get_next_record, this needs to be adapted if
Hanno Becker8b170a02017-10-10 11:51:19 +01008033 * we implement support for multiple alerts in single records.
8034 */
8035
8036 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: nothing pending" ) );
8037 return( 0 );
8038}
8039
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02008040uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00008041{
Manuel Pégourié-Gonnarde89163c2015-01-23 14:30:57 +00008042 if( ssl->session != NULL )
8043 return( ssl->session->verify_result );
8044
8045 if( ssl->session_negotiate != NULL )
8046 return( ssl->session_negotiate->verify_result );
8047
Manuel Pégourié-Gonnard6ab9b002015-05-14 11:25:04 +02008048 return( 0xFFFFFFFF );
Paul Bakker5121ce52009-01-03 21:22:43 +00008049}
8050
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008051const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00008052{
Paul Bakker926c8e42013-03-06 10:23:34 +01008053 if( ssl == NULL || ssl->session == NULL )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02008054 return( NULL );
Paul Bakker926c8e42013-03-06 10:23:34 +01008055
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008056 return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00008057}
8058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008059const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl )
Paul Bakker43ca69c2011-01-15 17:35:19 +00008060{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008061#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008062 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01008063 {
8064 switch( ssl->minor_ver )
8065 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008066 case MBEDTLS_SSL_MINOR_VERSION_2:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01008067 return( "DTLSv1.0" );
8068
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008069 case MBEDTLS_SSL_MINOR_VERSION_3:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01008070 return( "DTLSv1.2" );
8071
8072 default:
8073 return( "unknown (DTLS)" );
8074 }
8075 }
8076#endif
8077
Paul Bakker43ca69c2011-01-15 17:35:19 +00008078 switch( ssl->minor_ver )
8079 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008080 case MBEDTLS_SSL_MINOR_VERSION_0:
Paul Bakker43ca69c2011-01-15 17:35:19 +00008081 return( "SSLv3.0" );
8082
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008083 case MBEDTLS_SSL_MINOR_VERSION_1:
Paul Bakker43ca69c2011-01-15 17:35:19 +00008084 return( "TLSv1.0" );
8085
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008086 case MBEDTLS_SSL_MINOR_VERSION_2:
Paul Bakker43ca69c2011-01-15 17:35:19 +00008087 return( "TLSv1.1" );
8088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008089 case MBEDTLS_SSL_MINOR_VERSION_3:
Paul Bakker1ef83d62012-04-11 12:09:53 +00008090 return( "TLSv1.2" );
8091
Paul Bakker43ca69c2011-01-15 17:35:19 +00008092 default:
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01008093 return( "unknown" );
Paul Bakker43ca69c2011-01-15 17:35:19 +00008094 }
Paul Bakker43ca69c2011-01-15 17:35:19 +00008095}
8096
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008097int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard9b35f182014-10-14 17:47:31 +02008098{
Hanno Becker3136ede2018-08-17 15:28:19 +01008099 size_t transform_expansion = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008100 const mbedtls_ssl_transform *transform = ssl->transform_out;
Hanno Becker5b559ac2018-08-03 09:40:07 +01008101 unsigned block_size;
Manuel Pégourié-Gonnard9b35f182014-10-14 17:47:31 +02008102
Hanno Becker78640902018-08-13 16:35:15 +01008103 if( transform == NULL )
8104 return( (int) mbedtls_ssl_hdr_len( ssl ) );
8105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008106#if defined(MBEDTLS_ZLIB_SUPPORT)
8107 if( ssl->session_out->compression != MBEDTLS_SSL_COMPRESS_NULL )
8108 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
Manuel Pégourié-Gonnard9b35f182014-10-14 17:47:31 +02008109#endif
8110
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008111 switch( mbedtls_cipher_get_cipher_mode( &transform->cipher_ctx_enc ) )
Manuel Pégourié-Gonnard9b35f182014-10-14 17:47:31 +02008112 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008113 case MBEDTLS_MODE_GCM:
8114 case MBEDTLS_MODE_CCM:
Hanno Becker5b559ac2018-08-03 09:40:07 +01008115 case MBEDTLS_MODE_CHACHAPOLY:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008116 case MBEDTLS_MODE_STREAM:
Manuel Pégourié-Gonnard9b35f182014-10-14 17:47:31 +02008117 transform_expansion = transform->minlen;
8118 break;
8119
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008120 case MBEDTLS_MODE_CBC:
Hanno Becker5b559ac2018-08-03 09:40:07 +01008121
8122 block_size = mbedtls_cipher_get_block_size(
8123 &transform->cipher_ctx_enc );
8124
Hanno Becker3136ede2018-08-17 15:28:19 +01008125 /* Expansion due to the addition of the MAC. */
8126 transform_expansion += transform->maclen;
8127
8128 /* Expansion due to the addition of CBC padding;
8129 * Theoretically up to 256 bytes, but we never use
8130 * more than the block size of the underlying cipher. */
8131 transform_expansion += block_size;
8132
8133 /* For TLS 1.1 or higher, an explicit IV is added
8134 * after the record header. */
Hanno Becker5b559ac2018-08-03 09:40:07 +01008135#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
8136 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )
Hanno Becker3136ede2018-08-17 15:28:19 +01008137 transform_expansion += block_size;
Hanno Becker5b559ac2018-08-03 09:40:07 +01008138#endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Becker3136ede2018-08-17 15:28:19 +01008139
Manuel Pégourié-Gonnard9b35f182014-10-14 17:47:31 +02008140 break;
8141
8142 default:
Manuel Pégourié-Gonnardcb0d2122015-07-22 11:52:11 +02008143 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008144 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnard9b35f182014-10-14 17:47:31 +02008145 }
8146
Manuel Pégourié-Gonnard9de64f52015-07-01 15:51:43 +02008147 return( (int)( mbedtls_ssl_hdr_len( ssl ) + transform_expansion ) );
Manuel Pégourié-Gonnard9b35f182014-10-14 17:47:31 +02008148}
8149
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02008150#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
8151size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl )
8152{
8153 size_t max_len;
8154
8155 /*
8156 * Assume mfl_code is correct since it was checked when set
8157 */
Angus Grattond8213d02016-05-25 20:56:48 +10008158 max_len = ssl_mfl_code_to_length( ssl->conf->mfl_code );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02008159
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02008160 /* Check if a smaller max length was negotiated */
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02008161 if( ssl->session_out != NULL &&
Angus Grattond8213d02016-05-25 20:56:48 +10008162 ssl_mfl_code_to_length( ssl->session_out->mfl_code ) < max_len )
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02008163 {
Angus Grattond8213d02016-05-25 20:56:48 +10008164 max_len = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02008165 }
8166
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02008167 /* During a handshake, use the value being negotiated */
8168 if( ssl->session_negotiate != NULL &&
8169 ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code ) < max_len )
8170 {
8171 max_len = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
8172 }
8173
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02008174 return( max_len );
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02008175}
8176#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
8177
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02008178#if defined(MBEDTLS_SSL_PROTO_DTLS)
8179static size_t ssl_get_current_mtu( const mbedtls_ssl_context *ssl )
8180{
Andrzej Kurekef43ce62018-10-09 08:24:12 -04008181 /* Return unlimited mtu for client hello messages to avoid fragmentation. */
8182 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
8183 ( ssl->state == MBEDTLS_SSL_CLIENT_HELLO ||
8184 ssl->state == MBEDTLS_SSL_SERVER_HELLO ) )
8185 return ( 0 );
8186
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02008187 if( ssl->handshake == NULL || ssl->handshake->mtu == 0 )
8188 return( ssl->mtu );
8189
8190 if( ssl->mtu == 0 )
8191 return( ssl->handshake->mtu );
8192
8193 return( ssl->mtu < ssl->handshake->mtu ?
8194 ssl->mtu : ssl->handshake->mtu );
8195}
8196#endif /* MBEDTLS_SSL_PROTO_DTLS */
8197
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02008198int mbedtls_ssl_get_max_out_record_payload( const mbedtls_ssl_context *ssl )
8199{
8200 size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
8201
Manuel Pégourié-Gonnard000281e2018-08-21 11:20:58 +02008202#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
8203 !defined(MBEDTLS_SSL_PROTO_DTLS)
8204 (void) ssl;
8205#endif
8206
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02008207#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
8208 const size_t mfl = mbedtls_ssl_get_max_frag_len( ssl );
8209
8210 if( max_len > mfl )
8211 max_len = mfl;
8212#endif
8213
8214#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02008215 if( ssl_get_current_mtu( ssl ) != 0 )
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02008216 {
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02008217 const size_t mtu = ssl_get_current_mtu( ssl );
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02008218 const int ret = mbedtls_ssl_get_record_expansion( ssl );
8219 const size_t overhead = (size_t) ret;
8220
8221 if( ret < 0 )
8222 return( ret );
8223
8224 if( mtu <= overhead )
8225 {
8226 MBEDTLS_SSL_DEBUG_MSG( 1, ( "MTU too low for record expansion" ) );
8227 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
8228 }
8229
8230 if( max_len > mtu - overhead )
8231 max_len = mtu - overhead;
8232 }
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02008233#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02008234
Hanno Becker0defedb2018-08-10 12:35:02 +01008235#if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
8236 !defined(MBEDTLS_SSL_PROTO_DTLS)
8237 ((void) ssl);
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02008238#endif
8239
8240 return( (int) max_len );
8241}
8242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008243#if defined(MBEDTLS_X509_CRT_PARSE_C)
8244const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl )
Paul Bakkerb0550d92012-10-30 07:51:03 +00008245{
8246 if( ssl == NULL || ssl->session == NULL )
Paul Bakkerd8bb8262014-06-17 14:06:49 +02008247 return( NULL );
Paul Bakkerb0550d92012-10-30 07:51:03 +00008248
Paul Bakkerd8bb8262014-06-17 14:06:49 +02008249 return( ssl->session->peer_cert );
Paul Bakkerb0550d92012-10-30 07:51:03 +00008250}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008251#endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00008252
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008253#if defined(MBEDTLS_SSL_CLI_C)
8254int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *dst )
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02008255{
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02008256 if( ssl == NULL ||
8257 dst == NULL ||
8258 ssl->session == NULL ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008259 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02008260 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008261 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02008262 }
8263
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02008264 return( ssl_session_copy( dst, ssl->session ) );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02008265}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008266#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02008267
Paul Bakker5121ce52009-01-03 21:22:43 +00008268/*
Paul Bakker1961b702013-01-25 14:49:24 +01008269 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00008270 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008271int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00008272{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008273 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00008274
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02008275 if( ssl == NULL || ssl->conf == NULL )
8276 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8277
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008278#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008279 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008280 ret = mbedtls_ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00008281#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008282#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008283 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008284 ret = mbedtls_ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00008285#endif
8286
Paul Bakker1961b702013-01-25 14:49:24 +01008287 return( ret );
8288}
8289
8290/*
8291 * Perform the SSL handshake
8292 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008293int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl )
Paul Bakker1961b702013-01-25 14:49:24 +01008294{
8295 int ret = 0;
8296
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02008297 if( ssl == NULL || ssl->conf == NULL )
8298 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8299
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008300 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
Paul Bakker1961b702013-01-25 14:49:24 +01008301
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008302 while( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Paul Bakker1961b702013-01-25 14:49:24 +01008303 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008304 ret = mbedtls_ssl_handshake_step( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01008305
8306 if( ret != 0 )
8307 break;
8308 }
8309
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008310 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00008311
8312 return( ret );
8313}
8314
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008315#if defined(MBEDTLS_SSL_RENEGOTIATION)
8316#if defined(MBEDTLS_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00008317/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008318 * Write HelloRequest to request renegotiation on server
Paul Bakker48916f92012-09-16 19:57:18 +00008319 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008320static int ssl_write_hello_request( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008321{
8322 int ret;
8323
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008324 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello request" ) );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008325
8326 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008327 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
8328 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008329
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02008330 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008331 {
Manuel Pégourié-Gonnard31c15862017-09-13 09:38:11 +02008332 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008333 return( ret );
8334 }
8335
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008336 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello request" ) );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008337
8338 return( 0 );
8339}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008340#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008341
8342/*
8343 * Actually renegotiate current connection, triggered by either:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008344 * - any side: calling mbedtls_ssl_renegotiate(),
8345 * - client: receiving a HelloRequest during mbedtls_ssl_read(),
8346 * - server: receiving any handshake message on server during mbedtls_ssl_read() after
Manuel Pégourié-Gonnard55e4ff22014-08-19 11:16:35 +02008347 * the initial handshake is completed.
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008348 * If the handshake doesn't complete due to waiting for I/O, it will continue
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008349 * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively.
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008350 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008351static int ssl_start_renegotiation( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00008352{
8353 int ret;
8354
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008355 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00008356
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008357 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
8358 return( ret );
Paul Bakker48916f92012-09-16 19:57:18 +00008359
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02008360 /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and
8361 * the ServerHello will have message_seq = 1" */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008362#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008363 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008364 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02008365 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008366 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02008367 ssl->handshake->out_msg_seq = 1;
8368 else
8369 ssl->handshake->in_msg_seq = 1;
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02008370 }
8371#endif
8372
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008373 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
8374 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS;
Paul Bakker48916f92012-09-16 19:57:18 +00008375
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008376 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00008377 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008378 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Paul Bakker48916f92012-09-16 19:57:18 +00008379 return( ret );
8380 }
8381
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008382 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00008383
8384 return( 0 );
8385}
8386
8387/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008388 * Renegotiate current connection on client,
8389 * or request renegotiation on server
8390 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008391int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008392{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008393 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008394
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02008395 if( ssl == NULL || ssl->conf == NULL )
8396 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8397
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008398#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008399 /* On server, just send the request */
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008400 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008401 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008402 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
8403 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008404
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008405 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02008406
8407 /* Did we already try/start sending HelloRequest? */
8408 if( ssl->out_left != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008409 return( mbedtls_ssl_flush_output( ssl ) );
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02008410
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008411 return( ssl_write_hello_request( ssl ) );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008412 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008413#endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008415#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008416 /*
8417 * On client, either start the renegotiation process or,
8418 * if already in progress, continue the handshake
8419 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008420 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008421 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008422 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
8423 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008424
8425 if( ( ret = ssl_start_renegotiation( ssl ) ) != 0 )
8426 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008427 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008428 return( ret );
8429 }
8430 }
8431 else
8432 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008433 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008434 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008435 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008436 return( ret );
8437 }
8438 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008439#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01008440
Paul Bakker37ce0ff2013-10-31 14:32:04 +01008441 return( ret );
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01008442}
8443
8444/*
Manuel Pégourié-Gonnardb4458052014-11-04 21:04:22 +01008445 * Check record counters and renegotiate if they're above the limit.
8446 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008447static int ssl_check_ctr_renegotiate( mbedtls_ssl_context *ssl )
Manuel Pégourié-Gonnardb4458052014-11-04 21:04:22 +01008448{
Andres AG2196c7f2016-12-15 17:01:16 +00008449 size_t ep_len = ssl_ep_len( ssl );
8450 int in_ctr_cmp;
8451 int out_ctr_cmp;
8452
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008453 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ||
8454 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ||
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008455 ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED )
Manuel Pégourié-Gonnardb4458052014-11-04 21:04:22 +01008456 {
8457 return( 0 );
8458 }
8459
Andres AG2196c7f2016-12-15 17:01:16 +00008460 in_ctr_cmp = memcmp( ssl->in_ctr + ep_len,
8461 ssl->conf->renego_period + ep_len, 8 - ep_len );
Hanno Becker19859472018-08-06 09:40:20 +01008462 out_ctr_cmp = memcmp( ssl->cur_out_ctr + ep_len,
Andres AG2196c7f2016-12-15 17:01:16 +00008463 ssl->conf->renego_period + ep_len, 8 - ep_len );
8464
8465 if( in_ctr_cmp <= 0 && out_ctr_cmp <= 0 )
Manuel Pégourié-Gonnardb4458052014-11-04 21:04:22 +01008466 {
8467 return( 0 );
8468 }
8469
Manuel Pégourié-Gonnardcb0d2122015-07-22 11:52:11 +02008470 MBEDTLS_SSL_DEBUG_MSG( 1, ( "record counter limit reached: renegotiate" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008471 return( mbedtls_ssl_renegotiate( ssl ) );
Manuel Pégourié-Gonnardb4458052014-11-04 21:04:22 +01008472}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008473#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker5121ce52009-01-03 21:22:43 +00008474
8475/*
8476 * Receive application data decrypted from the SSL layer
8477 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008478int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00008479{
Hanno Becker4a810fb2017-05-24 16:27:30 +01008480 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +00008481 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00008482
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02008483 if( ssl == NULL || ssl->conf == NULL )
8484 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8485
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008486 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> read" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00008487
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008488#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008489 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02008490 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008491 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02008492 return( ret );
8493
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02008494 if( ssl->handshake != NULL &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008495 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02008496 {
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02008497 if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02008498 return( ret );
8499 }
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02008500 }
8501#endif
8502
Hanno Becker4a810fb2017-05-24 16:27:30 +01008503 /*
8504 * Check if renegotiation is necessary and/or handshake is
8505 * in process. If yes, perform/continue, and fall through
8506 * if an unexpected packet is received while the client
8507 * is waiting for the ServerHello.
8508 *
8509 * (There is no equivalent to the last condition on
8510 * the server-side as it is not treated as within
8511 * a handshake while waiting for the ClientHello
8512 * after a renegotiation request.)
8513 */
8514
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008515#if defined(MBEDTLS_SSL_RENEGOTIATION)
Hanno Becker4a810fb2017-05-24 16:27:30 +01008516 ret = ssl_check_ctr_renegotiate( ssl );
8517 if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO &&
8518 ret != 0 )
Manuel Pégourié-Gonnardb4458052014-11-04 21:04:22 +01008519 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008520 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_check_ctr_renegotiate", ret );
Manuel Pégourié-Gonnardb4458052014-11-04 21:04:22 +01008521 return( ret );
8522 }
8523#endif
8524
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008525 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Paul Bakker5121ce52009-01-03 21:22:43 +00008526 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008527 ret = mbedtls_ssl_handshake( ssl );
Hanno Becker4a810fb2017-05-24 16:27:30 +01008528 if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO &&
8529 ret != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00008530 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008531 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00008532 return( ret );
8533 }
8534 }
8535
Hanno Beckere41158b2017-10-23 13:30:32 +01008536 /* Loop as long as no application data record is available */
Hanno Becker90333da2017-10-10 11:27:13 +01008537 while( ssl->in_offt == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00008538 {
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02008539 /* Start timer if not already running */
Manuel Pégourié-Gonnard545102e2015-05-13 17:28:43 +02008540 if( ssl->f_get_timer != NULL &&
8541 ssl->f_get_timer( ssl->p_timer ) == -1 )
8542 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008543 ssl_set_timer( ssl, ssl->conf->read_timeout );
Manuel Pégourié-Gonnard545102e2015-05-13 17:28:43 +02008544 }
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02008545
Hanno Becker327c93b2018-08-15 13:56:18 +01008546 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00008547 {
Hanno Becker4a810fb2017-05-24 16:27:30 +01008548 if( ret == MBEDTLS_ERR_SSL_CONN_EOF )
8549 return( 0 );
Paul Bakker831a7552011-05-18 13:32:51 +00008550
Hanno Becker4a810fb2017-05-24 16:27:30 +01008551 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
8552 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00008553 }
8554
8555 if( ssl->in_msglen == 0 &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008556 ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00008557 {
8558 /*
8559 * OpenSSL sends empty messages to randomize the IV
8560 */
Hanno Becker327c93b2018-08-15 13:56:18 +01008561 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00008562 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008563 if( ret == MBEDTLS_ERR_SSL_CONN_EOF )
Paul Bakker831a7552011-05-18 13:32:51 +00008564 return( 0 );
8565
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008566 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00008567 return( ret );
8568 }
8569 }
8570
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008571 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00008572 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008573 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00008574
Hanno Becker4a810fb2017-05-24 16:27:30 +01008575 /*
8576 * - For client-side, expect SERVER_HELLO_REQUEST.
8577 * - For server-side, expect CLIENT_HELLO.
8578 * - Fail (TLS) or silently drop record (DTLS) in other cases.
8579 */
8580
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008581#if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008582 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008583 ( ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST ||
Hanno Becker4a810fb2017-05-24 16:27:30 +01008584 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ) )
Paul Bakker48916f92012-09-16 19:57:18 +00008585 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008586 MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
Manuel Pégourié-Gonnard990f9e42014-09-06 12:27:02 +02008587
8588 /* With DTLS, drop the packet (probably from last handshake) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008589#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008590 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Hanno Becker90333da2017-10-10 11:27:13 +01008591 {
8592 continue;
8593 }
Manuel Pégourié-Gonnard990f9e42014-09-06 12:27:02 +02008594#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008595 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnard990f9e42014-09-06 12:27:02 +02008596 }
Hanno Becker4a810fb2017-05-24 16:27:30 +01008597#endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard990f9e42014-09-06 12:27:02 +02008598
Hanno Becker4a810fb2017-05-24 16:27:30 +01008599#if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008600 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008601 ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO )
Manuel Pégourié-Gonnard990f9e42014-09-06 12:27:02 +02008602 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008603 MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not ClientHello)" ) );
Manuel Pégourié-Gonnard990f9e42014-09-06 12:27:02 +02008604
8605 /* With DTLS, drop the packet (probably from last handshake) */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008606#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008607 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Hanno Becker90333da2017-10-10 11:27:13 +01008608 {
8609 continue;
8610 }
Manuel Pégourié-Gonnard990f9e42014-09-06 12:27:02 +02008611#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008612 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker48916f92012-09-16 19:57:18 +00008613 }
Hanno Becker4a810fb2017-05-24 16:27:30 +01008614#endif /* MBEDTLS_SSL_SRV_C */
8615
Hanno Becker21df7f92017-10-17 11:03:26 +01008616#if defined(MBEDTLS_SSL_RENEGOTIATION)
Hanno Becker4a810fb2017-05-24 16:27:30 +01008617 /* Determine whether renegotiation attempt should be accepted */
Hanno Beckerb4ff0aa2017-10-17 11:03:04 +01008618 if( ! ( ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED ||
8619 ( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
8620 ssl->conf->allow_legacy_renegotiation ==
8621 MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) ) )
8622 {
8623 /*
8624 * Accept renegotiation request
8625 */
Paul Bakker48916f92012-09-16 19:57:18 +00008626
Hanno Beckerb4ff0aa2017-10-17 11:03:04 +01008627 /* DTLS clients need to know renego is server-initiated */
8628#if defined(MBEDTLS_SSL_PROTO_DTLS)
8629 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
8630 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
8631 {
8632 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
8633 }
8634#endif
8635 ret = ssl_start_renegotiation( ssl );
8636 if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO &&
8637 ret != 0 )
8638 {
8639 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret );
8640 return( ret );
8641 }
8642 }
8643 else
Hanno Becker21df7f92017-10-17 11:03:26 +01008644#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker48916f92012-09-16 19:57:18 +00008645 {
Hanno Becker4a810fb2017-05-24 16:27:30 +01008646 /*
8647 * Refuse renegotiation
8648 */
8649
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008650 MBEDTLS_SSL_DEBUG_MSG( 3, ( "refusing renegotiation, sending alert" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00008651
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008652#if defined(MBEDTLS_SSL_PROTO_SSL3)
8653 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
Paul Bakker48916f92012-09-16 19:57:18 +00008654 {
Gilles Peskine92e44262017-05-10 17:27:49 +02008655 /* SSLv3 does not have a "no_renegotiation" warning, so
8656 we send a fatal alert and abort the connection. */
8657 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
8658 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
8659 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00008660 }
8661 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008662#endif /* MBEDTLS_SSL_PROTO_SSL3 */
8663#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
8664 defined(MBEDTLS_SSL_PROTO_TLS1_2)
8665 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00008666 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008667 if( ( ret = mbedtls_ssl_send_alert_message( ssl,
8668 MBEDTLS_SSL_ALERT_LEVEL_WARNING,
8669 MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00008670 {
8671 return( ret );
8672 }
Paul Bakker48916f92012-09-16 19:57:18 +00008673 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02008674 else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008675#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 ||
8676 MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02008677 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008678 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
8679 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02008680 }
Paul Bakker48916f92012-09-16 19:57:18 +00008681 }
Manuel Pégourié-Gonnardf26a1e82014-08-19 12:28:50 +02008682
Hanno Becker90333da2017-10-10 11:27:13 +01008683 /* At this point, we don't know whether the renegotiation has been
8684 * completed or not. The cases to consider are the following:
8685 * 1) The renegotiation is complete. In this case, no new record
8686 * has been read yet.
8687 * 2) The renegotiation is incomplete because the client received
8688 * an application data record while awaiting the ServerHello.
8689 * 3) The renegotiation is incomplete because the client received
8690 * a non-handshake, non-application data message while awaiting
8691 * the ServerHello.
8692 * In each of these case, looping will be the proper action:
8693 * - For 1), the next iteration will read a new record and check
8694 * if it's application data.
8695 * - For 2), the loop condition isn't satisfied as application data
8696 * is present, hence continue is the same as break
8697 * - For 3), the loop condition is satisfied and read_record
8698 * will re-deliver the message that was held back by the client
8699 * when expecting the ServerHello.
8700 */
8701 continue;
Paul Bakker48916f92012-09-16 19:57:18 +00008702 }
Hanno Becker21df7f92017-10-17 11:03:26 +01008703#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008704 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
Manuel Pégourié-Gonnard6d8404d2013-10-30 16:41:45 +01008705 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008706 if( ssl->conf->renego_max_records >= 0 )
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02008707 {
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008708 if( ++ssl->renego_records_seen > ssl->conf->renego_max_records )
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02008709 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008710 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, "
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02008711 "but not honored by client" ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008712 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02008713 }
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02008714 }
Manuel Pégourié-Gonnard6d8404d2013-10-30 16:41:45 +01008715 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008716#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnardf26a1e82014-08-19 12:28:50 +02008717
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008718 /* Fatal and closure alerts handled by mbedtls_ssl_read_record() */
8719 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT )
Manuel Pégourié-Gonnardf26a1e82014-08-19 12:28:50 +02008720 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008721 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ignoring non-fatal non-closure alert" ) );
Manuel Pégourié-Gonnard88369942015-05-06 16:19:31 +01008722 return( MBEDTLS_ERR_SSL_WANT_READ );
Manuel Pégourié-Gonnardf26a1e82014-08-19 12:28:50 +02008723 }
8724
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008725 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00008726 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008727 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
8728 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00008729 }
8730
8731 ssl->in_offt = ssl->in_msg;
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02008732
Manuel Pégourié-Gonnardba958b82014-10-09 16:13:44 +02008733 /* We're going to return something now, cancel timer,
8734 * except if handshake (renegotiation) is in progress */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008735 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
Manuel Pégourié-Gonnardba958b82014-10-09 16:13:44 +02008736 ssl_set_timer( ssl, 0 );
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02008737
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02008738#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02008739 /* If we requested renego but received AppData, resend HelloRequest.
8740 * Do it now, after setting in_offt, to avoid taking this branch
8741 * again if ssl_write_hello_request() returns WANT_WRITE */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008742#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008743 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008744 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02008745 {
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02008746 if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 )
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02008747 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008748 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_resend_hello_request", ret );
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02008749 return( ret );
8750 }
8751 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008752#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
Hanno Becker4a810fb2017-05-24 16:27:30 +01008753#endif /* MBEDTLS_SSL_PROTO_DTLS */
Paul Bakker5121ce52009-01-03 21:22:43 +00008754 }
8755
8756 n = ( len < ssl->in_msglen )
8757 ? len : ssl->in_msglen;
8758
8759 memcpy( buf, ssl->in_offt, n );
8760 ssl->in_msglen -= n;
8761
8762 if( ssl->in_msglen == 0 )
Hanno Becker4a810fb2017-05-24 16:27:30 +01008763 {
8764 /* all bytes consumed */
Paul Bakker5121ce52009-01-03 21:22:43 +00008765 ssl->in_offt = NULL;
Hanno Beckerbdf39052017-06-09 10:42:03 +01008766 ssl->keep_current_message = 0;
Hanno Becker4a810fb2017-05-24 16:27:30 +01008767 }
Paul Bakker5121ce52009-01-03 21:22:43 +00008768 else
Hanno Becker4a810fb2017-05-24 16:27:30 +01008769 {
Paul Bakker5121ce52009-01-03 21:22:43 +00008770 /* more data available */
8771 ssl->in_offt += n;
Hanno Becker4a810fb2017-05-24 16:27:30 +01008772 }
Paul Bakker5121ce52009-01-03 21:22:43 +00008773
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008774 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= read" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00008775
Paul Bakker23986e52011-04-24 08:57:21 +00008776 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00008777}
8778
8779/*
Andres Amaya Garcia5b923522017-09-28 14:41:17 +01008780 * Send application data to be encrypted by the SSL layer, taking care of max
8781 * fragment length and buffer size.
8782 *
8783 * According to RFC 5246 Section 6.2.1:
8784 *
8785 * Zero-length fragments of Application data MAY be sent as they are
8786 * potentially useful as a traffic analysis countermeasure.
8787 *
8788 * Therefore, it is possible that the input message length is 0 and the
8789 * corresponding return code is 0 on success.
Paul Bakker5121ce52009-01-03 21:22:43 +00008790 */
Manuel Pégourié-Gonnard144bc222015-04-17 20:39:07 +02008791static int ssl_write_real( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008792 const unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00008793{
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02008794 int ret = mbedtls_ssl_get_max_out_record_payload( ssl );
8795 const size_t max_len = (size_t) ret;
8796
8797 if( ret < 0 )
8798 {
8799 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_get_max_out_record_payload", ret );
8800 return( ret );
8801 }
8802
Manuel Pégourié-Gonnard37e08e12014-10-13 17:55:52 +02008803 if( len > max_len )
8804 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008805#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02008806 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnard37e08e12014-10-13 17:55:52 +02008807 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008808 MBEDTLS_SSL_DEBUG_MSG( 1, ( "fragment larger than the (negotiated) "
Manuel Pégourié-Gonnard37e08e12014-10-13 17:55:52 +02008809 "maximum fragment length: %d > %d",
8810 len, max_len ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008811 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard37e08e12014-10-13 17:55:52 +02008812 }
8813 else
8814#endif
8815 len = max_len;
8816 }
Paul Bakker887bd502011-06-08 13:10:54 +00008817
Paul Bakker5121ce52009-01-03 21:22:43 +00008818 if( ssl->out_left != 0 )
8819 {
Andres Amaya Garcia5b923522017-09-28 14:41:17 +01008820 /*
8821 * The user has previously tried to send the data and
8822 * MBEDTLS_ERR_SSL_WANT_WRITE or the message was only partially
8823 * written. In this case, we expect the high-level write function
8824 * (e.g. mbedtls_ssl_write()) to be called with the same parameters
8825 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008826 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00008827 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008828 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flush_output", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00008829 return( ret );
8830 }
8831 }
Paul Bakker887bd502011-06-08 13:10:54 +00008832 else
Paul Bakker1fd00bf2011-03-14 20:50:15 +00008833 {
Andres Amaya Garcia5b923522017-09-28 14:41:17 +01008834 /*
8835 * The user is trying to send a message the first time, so we need to
8836 * copy the data into the internal buffers and setup the data structure
8837 * to keep track of partial writes
8838 */
Manuel Pégourié-Gonnard37e08e12014-10-13 17:55:52 +02008839 ssl->out_msglen = len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008840 ssl->out_msgtype = MBEDTLS_SSL_MSG_APPLICATION_DATA;
Manuel Pégourié-Gonnard37e08e12014-10-13 17:55:52 +02008841 memcpy( ssl->out_msg, buf, len );
Paul Bakker887bd502011-06-08 13:10:54 +00008842
Hanno Becker67bc7c32018-08-06 11:33:50 +01008843 if( ( ret = mbedtls_ssl_write_record( ssl, SSL_FORCE_FLUSH ) ) != 0 )
Paul Bakker887bd502011-06-08 13:10:54 +00008844 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008845 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret );
Paul Bakker887bd502011-06-08 13:10:54 +00008846 return( ret );
8847 }
Paul Bakker5121ce52009-01-03 21:22:43 +00008848 }
8849
Manuel Pégourié-Gonnard37e08e12014-10-13 17:55:52 +02008850 return( (int) len );
Paul Bakker5121ce52009-01-03 21:22:43 +00008851}
8852
8853/*
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01008854 * Write application data, doing 1/n-1 splitting if necessary.
8855 *
8856 * With non-blocking I/O, ssl_write_real() may return WANT_WRITE,
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01008857 * then the caller will call us again with the same arguments, so
Hanno Becker2b187c42017-09-18 14:58:11 +01008858 * remember whether we already did the split or not.
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01008859 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008860#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
Manuel Pégourié-Gonnard144bc222015-04-17 20:39:07 +02008861static int ssl_write_split( mbedtls_ssl_context *ssl,
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008862 const unsigned char *buf, size_t len )
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01008863{
8864 int ret;
8865
Manuel Pégourié-Gonnard17eab2b2015-05-05 16:34:53 +01008866 if( ssl->conf->cbc_record_splitting ==
8867 MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED ||
Manuel Pégourié-Gonnardcfa477e2015-01-07 14:50:54 +01008868 len <= 1 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008869 ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_1 ||
8870 mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc )
8871 != MBEDTLS_MODE_CBC )
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01008872 {
8873 return( ssl_write_real( ssl, buf, len ) );
8874 }
8875
8876 if( ssl->split_done == 0 )
8877 {
Manuel Pégourié-Gonnarda852cf42015-01-13 20:56:15 +01008878 if( ( ret = ssl_write_real( ssl, buf, 1 ) ) <= 0 )
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01008879 return( ret );
Manuel Pégourié-Gonnarda852cf42015-01-13 20:56:15 +01008880 ssl->split_done = 1;
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01008881 }
8882
Manuel Pégourié-Gonnarda852cf42015-01-13 20:56:15 +01008883 if( ( ret = ssl_write_real( ssl, buf + 1, len - 1 ) ) <= 0 )
8884 return( ret );
8885 ssl->split_done = 0;
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01008886
8887 return( ret + 1 );
8888}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008889#endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */
Manuel Pégourié-Gonnardd76314c2015-01-07 12:39:44 +01008890
8891/*
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008892 * Write application data (public-facing wrapper)
8893 */
Manuel Pégourié-Gonnard144bc222015-04-17 20:39:07 +02008894int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len )
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008895{
8896 int ret;
8897
Manuel Pégourié-Gonnard144bc222015-04-17 20:39:07 +02008898 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write" ) );
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008899
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02008900 if( ssl == NULL || ssl->conf == NULL )
8901 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8902
Manuel Pégourié-Gonnard144bc222015-04-17 20:39:07 +02008903#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008904 if( ( ret = ssl_check_ctr_renegotiate( ssl ) ) != 0 )
8905 {
Manuel Pégourié-Gonnard144bc222015-04-17 20:39:07 +02008906 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_check_ctr_renegotiate", ret );
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008907 return( ret );
8908 }
8909#endif
8910
Manuel Pégourié-Gonnard144bc222015-04-17 20:39:07 +02008911 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008912 {
Manuel Pégourié-Gonnard144bc222015-04-17 20:39:07 +02008913 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008914 {
Manuel Pégourié-Gonnard151dc772015-05-14 13:55:51 +02008915 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008916 return( ret );
8917 }
8918 }
8919
Manuel Pégourié-Gonnard144bc222015-04-17 20:39:07 +02008920#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008921 ret = ssl_write_split( ssl, buf, len );
8922#else
8923 ret = ssl_write_real( ssl, buf, len );
8924#endif
8925
Manuel Pégourié-Gonnard144bc222015-04-17 20:39:07 +02008926 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write" ) );
Manuel Pégourié-Gonnarda2fce212015-04-15 19:09:03 +02008927
8928 return( ret );
8929}
8930
8931/*
Paul Bakker5121ce52009-01-03 21:22:43 +00008932 * Notify the peer that the connection is being closed
8933 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008934int mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00008935{
8936 int ret;
8937
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02008938 if( ssl == NULL || ssl->conf == NULL )
8939 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
8940
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008941 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00008942
Manuel Pégourié-Gonnarda13500f2014-08-19 16:14:04 +02008943 if( ssl->out_left != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008944 return( mbedtls_ssl_flush_output( ssl ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00008945
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008946 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )
Paul Bakker5121ce52009-01-03 21:22:43 +00008947 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008948 if( ( ret = mbedtls_ssl_send_alert_message( ssl,
8949 MBEDTLS_SSL_ALERT_LEVEL_WARNING,
8950 MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00008951 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008952 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_send_alert_message", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00008953 return( ret );
8954 }
8955 }
8956
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008957 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00008958
Manuel Pégourié-Gonnarda13500f2014-08-19 16:14:04 +02008959 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00008960}
8961
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008962void mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform )
Paul Bakker48916f92012-09-16 19:57:18 +00008963{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02008964 if( transform == NULL )
8965 return;
8966
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008967#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00008968 deflateEnd( &transform->ctx_deflate );
8969 inflateEnd( &transform->ctx_inflate );
8970#endif
8971
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008972 mbedtls_cipher_free( &transform->cipher_ctx_enc );
8973 mbedtls_cipher_free( &transform->cipher_ctx_dec );
Manuel Pégourié-Gonnardf71e5872013-09-23 17:12:43 +02008974
Hanno Becker92231322018-01-03 15:32:51 +00008975#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008976 mbedtls_md_free( &transform->md_ctx_enc );
8977 mbedtls_md_free( &transform->md_ctx_dec );
Hanno Becker92231322018-01-03 15:32:51 +00008978#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02008979
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05008980 mbedtls_platform_zeroize( transform, sizeof( mbedtls_ssl_transform ) );
Paul Bakker48916f92012-09-16 19:57:18 +00008981}
8982
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008983#if defined(MBEDTLS_X509_CRT_PARSE_C)
8984static void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert )
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02008985{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008986 mbedtls_ssl_key_cert *cur = key_cert, *next;
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02008987
8988 while( cur != NULL )
8989 {
8990 next = cur->next;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008991 mbedtls_free( cur );
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02008992 cur = next;
8993 }
8994}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008995#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02008996
Hanno Becker0271f962018-08-16 13:23:47 +01008997#if defined(MBEDTLS_SSL_PROTO_DTLS)
8998
8999static void ssl_buffering_free( mbedtls_ssl_context *ssl )
9000{
9001 unsigned offset;
9002 mbedtls_ssl_handshake_params * const hs = ssl->handshake;
9003
9004 if( hs == NULL )
9005 return;
9006
Hanno Becker283f5ef2018-08-24 09:34:47 +01009007 ssl_free_buffered_record( ssl );
9008
Hanno Becker0271f962018-08-16 13:23:47 +01009009 for( offset = 0; offset < MBEDTLS_SSL_MAX_BUFFERED_HS; offset++ )
Hanno Beckere605b192018-08-21 15:59:07 +01009010 ssl_buffering_free_slot( ssl, offset );
9011}
9012
9013static void ssl_buffering_free_slot( mbedtls_ssl_context *ssl,
9014 uint8_t slot )
9015{
9016 mbedtls_ssl_handshake_params * const hs = ssl->handshake;
9017 mbedtls_ssl_hs_buffer * const hs_buf = &hs->buffering.hs[slot];
Hanno Beckerb309b922018-08-23 13:18:05 +01009018
9019 if( slot >= MBEDTLS_SSL_MAX_BUFFERED_HS )
9020 return;
9021
Hanno Beckere605b192018-08-21 15:59:07 +01009022 if( hs_buf->is_valid == 1 )
Hanno Becker0271f962018-08-16 13:23:47 +01009023 {
Hanno Beckere605b192018-08-21 15:59:07 +01009024 hs->buffering.total_bytes_buffered -= hs_buf->data_len;
Hanno Becker805f2e12018-10-12 16:31:41 +01009025 mbedtls_platform_zeroize( hs_buf->data, hs_buf->data_len );
Hanno Beckere605b192018-08-21 15:59:07 +01009026 mbedtls_free( hs_buf->data );
9027 memset( hs_buf, 0, sizeof( mbedtls_ssl_hs_buffer ) );
Hanno Becker0271f962018-08-16 13:23:47 +01009028 }
9029}
9030
9031#endif /* MBEDTLS_SSL_PROTO_DTLS */
9032
Gilles Peskine9b562d52018-04-25 20:32:43 +02009033void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00009034{
Gilles Peskine9b562d52018-04-25 20:32:43 +02009035 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
9036
Paul Bakkeraccaffe2014-06-26 13:37:14 +02009037 if( handshake == NULL )
9038 return;
9039
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02009040#if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
9041 if( ssl->conf->f_async_cancel != NULL && handshake->async_in_progress != 0 )
9042 {
Gilles Peskine8f97af72018-04-26 11:46:10 +02009043 ssl->conf->f_async_cancel( ssl );
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02009044 handshake->async_in_progress = 0;
9045 }
9046#endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
9047
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02009048#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
9049 defined(MBEDTLS_SSL_PROTO_TLS1_1)
9050 mbedtls_md5_free( &handshake->fin_md5 );
9051 mbedtls_sha1_free( &handshake->fin_sha1 );
9052#endif
9053#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
9054#if defined(MBEDTLS_SHA256_C)
9055 mbedtls_sha256_free( &handshake->fin_sha256 );
9056#endif
9057#if defined(MBEDTLS_SHA512_C)
9058 mbedtls_sha512_free( &handshake->fin_sha512 );
9059#endif
9060#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
9061
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009062#if defined(MBEDTLS_DHM_C)
9063 mbedtls_dhm_free( &handshake->dhm_ctx );
Paul Bakker48916f92012-09-16 19:57:18 +00009064#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009065#if defined(MBEDTLS_ECDH_C)
9066 mbedtls_ecdh_free( &handshake->ecdh_ctx );
Paul Bakker61d113b2013-07-04 11:51:43 +02009067#endif
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +02009068#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02009069 mbedtls_ecjpake_free( &handshake->ecjpake_ctx );
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02009070#if defined(MBEDTLS_SSL_CLI_C)
9071 mbedtls_free( handshake->ecjpake_cache );
9072 handshake->ecjpake_cache = NULL;
9073 handshake->ecjpake_cache_len = 0;
9074#endif
Manuel Pégourié-Gonnard76cfd3f2015-09-15 12:10:54 +02009075#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02009076
Janos Follath4ae5c292016-02-10 11:27:43 +00009077#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
9078 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Paul Bakker9af723c2014-05-01 13:03:14 +02009079 /* explicit void pointer cast for buggy MS compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009080 mbedtls_free( (void *) handshake->curves );
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +02009081#endif
9082
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01009083#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
9084 if( handshake->psk != NULL )
9085 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05009086 mbedtls_platform_zeroize( handshake->psk, handshake->psk_len );
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01009087 mbedtls_free( handshake->psk );
9088 }
9089#endif
9090
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009091#if defined(MBEDTLS_X509_CRT_PARSE_C) && \
9092 defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02009093 /*
9094 * Free only the linked list wrapper, not the keys themselves
9095 * since the belong to the SNI callback
9096 */
9097 if( handshake->sni_key_cert != NULL )
9098 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009099 mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next;
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02009100
9101 while( cur != NULL )
9102 {
9103 next = cur->next;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009104 mbedtls_free( cur );
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02009105 cur = next;
9106 }
9107 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009108#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02009109
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02009110#if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
Manuel Pégourié-Gonnard6b7301c2017-08-15 12:08:45 +02009111 mbedtls_x509_crt_restart_free( &handshake->ecrs_ctx );
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02009112#endif
9113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009114#if defined(MBEDTLS_SSL_PROTO_DTLS)
9115 mbedtls_free( handshake->verify_cookie );
Manuel Pégourié-Gonnardffa67be2014-09-19 11:18:57 +02009116 ssl_flight_free( handshake->flight );
Hanno Becker0271f962018-08-16 13:23:47 +01009117 ssl_buffering_free( ssl );
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02009118#endif
9119
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05009120 mbedtls_platform_zeroize( handshake,
9121 sizeof( mbedtls_ssl_handshake_params ) );
Paul Bakker48916f92012-09-16 19:57:18 +00009122}
9123
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009124void mbedtls_ssl_session_free( mbedtls_ssl_session *session )
Paul Bakker48916f92012-09-16 19:57:18 +00009125{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02009126 if( session == NULL )
9127 return;
9128
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009129#if defined(MBEDTLS_X509_CRT_PARSE_C)
Paul Bakker0a597072012-09-25 21:55:46 +00009130 if( session->peer_cert != NULL )
Paul Bakker48916f92012-09-16 19:57:18 +00009131 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009132 mbedtls_x509_crt_free( session->peer_cert );
9133 mbedtls_free( session->peer_cert );
Paul Bakker48916f92012-09-16 19:57:18 +00009134 }
Paul Bakkered27a042013-04-18 22:46:23 +02009135#endif
Paul Bakker0a597072012-09-25 21:55:46 +00009136
Manuel Pégourié-Gonnardb596abf2015-05-20 10:45:29 +02009137#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009138 mbedtls_free( session->ticket );
Paul Bakkera503a632013-08-14 13:48:06 +02009139#endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02009140
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05009141 mbedtls_platform_zeroize( session, sizeof( mbedtls_ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00009142}
9143
Paul Bakker5121ce52009-01-03 21:22:43 +00009144/*
9145 * Free an SSL context
9146 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009147void mbedtls_ssl_free( mbedtls_ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00009148{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02009149 if( ssl == NULL )
9150 return;
9151
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009152 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> free" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00009153
Manuel Pégourié-Gonnard7ee6f0e2014-02-13 10:54:07 +01009154 if( ssl->out_buf != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00009155 {
Angus Grattond8213d02016-05-25 20:56:48 +10009156 mbedtls_platform_zeroize( ssl->out_buf, MBEDTLS_SSL_OUT_BUFFER_LEN );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009157 mbedtls_free( ssl->out_buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00009158 }
9159
Manuel Pégourié-Gonnard7ee6f0e2014-02-13 10:54:07 +01009160 if( ssl->in_buf != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00009161 {
Angus Grattond8213d02016-05-25 20:56:48 +10009162 mbedtls_platform_zeroize( ssl->in_buf, MBEDTLS_SSL_IN_BUFFER_LEN );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009163 mbedtls_free( ssl->in_buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00009164 }
9165
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009166#if defined(MBEDTLS_ZLIB_SUPPORT)
Paul Bakker16770332013-10-11 09:59:44 +02009167 if( ssl->compress_buf != NULL )
9168 {
Angus Grattond8213d02016-05-25 20:56:48 +10009169 mbedtls_platform_zeroize( ssl->compress_buf, MBEDTLS_SSL_COMPRESS_BUFFER_LEN );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009170 mbedtls_free( ssl->compress_buf );
Paul Bakker16770332013-10-11 09:59:44 +02009171 }
9172#endif
9173
Paul Bakker48916f92012-09-16 19:57:18 +00009174 if( ssl->transform )
9175 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009176 mbedtls_ssl_transform_free( ssl->transform );
9177 mbedtls_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00009178 }
9179
9180 if( ssl->handshake )
9181 {
Gilles Peskine9b562d52018-04-25 20:32:43 +02009182 mbedtls_ssl_handshake_free( ssl );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009183 mbedtls_ssl_transform_free( ssl->transform_negotiate );
9184 mbedtls_ssl_session_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00009185
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009186 mbedtls_free( ssl->handshake );
9187 mbedtls_free( ssl->transform_negotiate );
9188 mbedtls_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00009189 }
9190
Paul Bakkerc0463502013-02-14 11:19:38 +01009191 if( ssl->session )
9192 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009193 mbedtls_ssl_session_free( ssl->session );
9194 mbedtls_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01009195 }
9196
Manuel Pégourié-Gonnard55fab2d2015-05-11 16:15:19 +02009197#if defined(MBEDTLS_X509_CRT_PARSE_C)
Paul Bakker66d5d072014-06-17 16:39:18 +02009198 if( ssl->hostname != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00009199 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05009200 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009201 mbedtls_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00009202 }
Paul Bakker0be444a2013-08-27 21:55:01 +02009203#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00009204
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009205#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
9206 if( mbedtls_ssl_hw_record_finish != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00009207 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009208 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_finish()" ) );
9209 mbedtls_ssl_hw_record_finish( ssl );
Paul Bakker05ef8352012-05-08 09:17:57 +00009210 }
9211#endif
9212
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02009213#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009214 mbedtls_free( ssl->cli_id );
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02009215#endif
9216
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009217 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00009218
Paul Bakker86f04f42013-02-14 11:20:09 +01009219 /* Actually clear after last debug message */
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05009220 mbedtls_platform_zeroize( ssl, sizeof( mbedtls_ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00009221}
9222
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009223/*
9224 * Initialze mbedtls_ssl_config
9225 */
9226void mbedtls_ssl_config_init( mbedtls_ssl_config *conf )
9227{
9228 memset( conf, 0, sizeof( mbedtls_ssl_config ) );
9229}
9230
Simon Butcherc97b6972015-12-27 23:48:17 +00009231#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01009232static int ssl_preset_default_hashes[] = {
9233#if defined(MBEDTLS_SHA512_C)
9234 MBEDTLS_MD_SHA512,
9235 MBEDTLS_MD_SHA384,
9236#endif
9237#if defined(MBEDTLS_SHA256_C)
9238 MBEDTLS_MD_SHA256,
9239 MBEDTLS_MD_SHA224,
9240#endif
Gilles Peskine5d2511c2017-05-12 13:16:40 +02009241#if defined(MBEDTLS_SHA1_C) && defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01009242 MBEDTLS_MD_SHA1,
9243#endif
9244 MBEDTLS_MD_NONE
9245};
Simon Butcherc97b6972015-12-27 23:48:17 +00009246#endif
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01009247
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009248static int ssl_preset_suiteb_ciphersuites[] = {
9249 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
9250 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
9251 0
9252};
9253
Manuel Pégourié-Gonnarde5f30722015-10-22 17:01:15 +02009254#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009255static int ssl_preset_suiteb_hashes[] = {
9256 MBEDTLS_MD_SHA256,
9257 MBEDTLS_MD_SHA384,
9258 MBEDTLS_MD_NONE
9259};
9260#endif
9261
9262#if defined(MBEDTLS_ECP_C)
9263static mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = {
9264 MBEDTLS_ECP_DP_SECP256R1,
9265 MBEDTLS_ECP_DP_SECP384R1,
9266 MBEDTLS_ECP_DP_NONE
9267};
9268#endif
9269
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009270/*
Tillmann Karras588ad502015-09-25 04:27:22 +02009271 * Load default in mbedtls_ssl_config
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009272 */
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02009273int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009274 int endpoint, int transport, int preset )
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009275{
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02009276#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009277 int ret;
Manuel Pégourié-Gonnard8b431fb2015-05-11 12:54:52 +02009278#endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009279
Manuel Pégourié-Gonnard0de074f2015-05-14 12:58:01 +02009280 /* Use the functions here so that they are covered in tests,
9281 * but otherwise access member directly for efficiency */
9282 mbedtls_ssl_conf_endpoint( conf, endpoint );
9283 mbedtls_ssl_conf_transport( conf, transport );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009284
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009285 /*
9286 * Things that are common to all presets
9287 */
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02009288#if defined(MBEDTLS_SSL_CLI_C)
9289 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
9290 {
9291 conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
9292#if defined(MBEDTLS_SSL_SESSION_TICKETS)
9293 conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED;
9294#endif
9295 }
9296#endif
9297
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02009298#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009299 conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED;
Manuel Pégourié-Gonnard66dc5552015-05-14 12:28:21 +02009300#endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009301
9302#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
9303 conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
9304#endif
9305
9306#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
9307 conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
9308#endif
9309
Manuel Pégourié-Gonnard17eab2b2015-05-05 16:34:53 +01009310#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
9311 conf->cbc_record_splitting = MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED;
9312#endif
9313
Manuel Pégourié-Gonnarde057d3b2015-05-20 10:59:43 +02009314#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009315 conf->f_cookie_write = ssl_cookie_write_dummy;
9316 conf->f_cookie_check = ssl_cookie_check_dummy;
9317#endif
9318
9319#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
9320 conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
9321#endif
9322
Janos Follath088ce432017-04-10 12:42:31 +01009323#if defined(MBEDTLS_SSL_SRV_C)
9324 conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED;
9325#endif
9326
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009327#if defined(MBEDTLS_SSL_PROTO_DTLS)
9328 conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
9329 conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
9330#endif
9331
9332#if defined(MBEDTLS_SSL_RENEGOTIATION)
9333 conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
Andres AG2196c7f2016-12-15 17:01:16 +00009334 memset( conf->renego_period, 0x00, 2 );
9335 memset( conf->renego_period + 2, 0xFF, 6 );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009336#endif
9337
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009338#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
9339 if( endpoint == MBEDTLS_SSL_IS_SERVER )
9340 {
Hanno Becker00d0a682017-10-04 13:14:29 +01009341 const unsigned char dhm_p[] =
9342 MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN;
9343 const unsigned char dhm_g[] =
9344 MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN;
9345
Hanno Beckera90658f2017-10-04 15:29:08 +01009346 if ( ( ret = mbedtls_ssl_conf_dh_param_bin( conf,
9347 dhm_p, sizeof( dhm_p ),
9348 dhm_g, sizeof( dhm_g ) ) ) != 0 )
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009349 {
9350 return( ret );
9351 }
9352 }
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02009353#endif
9354
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009355 /*
9356 * Preset-specific defaults
9357 */
9358 switch( preset )
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009359 {
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009360 /*
9361 * NSA Suite B
9362 */
9363 case MBEDTLS_SSL_PRESET_SUITEB:
9364 conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
9365 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */
9366 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
9367 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
9368
9369 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
9370 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
9371 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
9372 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
9373 ssl_preset_suiteb_ciphersuites;
9374
9375#if defined(MBEDTLS_X509_CRT_PARSE_C)
9376 conf->cert_profile = &mbedtls_x509_crt_profile_suiteb;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009377#endif
9378
Manuel Pégourié-Gonnarde5f30722015-10-22 17:01:15 +02009379#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009380 conf->sig_hashes = ssl_preset_suiteb_hashes;
9381#endif
9382
9383#if defined(MBEDTLS_ECP_C)
9384 conf->curve_list = ssl_preset_suiteb_curves;
9385#endif
Manuel Pégourié-Gonnardc98204e2015-08-11 04:21:01 +02009386 break;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009387
9388 /*
9389 * Default
9390 */
9391 default:
Ron Eldor5e9f14d2017-05-28 10:46:38 +03009392 conf->min_major_ver = ( MBEDTLS_SSL_MIN_MAJOR_VERSION >
9393 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION ) ?
9394 MBEDTLS_SSL_MIN_MAJOR_VERSION :
9395 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION;
9396 conf->min_minor_ver = ( MBEDTLS_SSL_MIN_MINOR_VERSION >
9397 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION ) ?
9398 MBEDTLS_SSL_MIN_MINOR_VERSION :
9399 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009400 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
9401 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
9402
9403#if defined(MBEDTLS_SSL_PROTO_DTLS)
9404 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
9405 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_2;
9406#endif
9407
9408 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
9409 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
9410 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
9411 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
9412 mbedtls_ssl_list_ciphersuites();
9413
9414#if defined(MBEDTLS_X509_CRT_PARSE_C)
9415 conf->cert_profile = &mbedtls_x509_crt_profile_default;
9416#endif
9417
Manuel Pégourié-Gonnarde5f30722015-10-22 17:01:15 +02009418#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01009419 conf->sig_hashes = ssl_preset_default_hashes;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02009420#endif
9421
9422#if defined(MBEDTLS_ECP_C)
9423 conf->curve_list = mbedtls_ecp_grp_id_list();
9424#endif
9425
9426#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
9427 conf->dhm_min_bitlen = 1024;
9428#endif
9429 }
9430
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009431 return( 0 );
9432}
9433
9434/*
9435 * Free mbedtls_ssl_config
9436 */
9437void mbedtls_ssl_config_free( mbedtls_ssl_config *conf )
9438{
9439#if defined(MBEDTLS_DHM_C)
9440 mbedtls_mpi_free( &conf->dhm_P );
9441 mbedtls_mpi_free( &conf->dhm_G );
9442#endif
9443
9444#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
9445 if( conf->psk != NULL )
9446 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05009447 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009448 mbedtls_free( conf->psk );
Azim Khan27e8a122018-03-21 14:24:11 +00009449 conf->psk = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009450 conf->psk_len = 0;
junyeonLEE316b1622017-12-20 16:29:30 +09009451 }
9452
9453 if( conf->psk_identity != NULL )
9454 {
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05009455 mbedtls_platform_zeroize( conf->psk_identity, conf->psk_identity_len );
junyeonLEE316b1622017-12-20 16:29:30 +09009456 mbedtls_free( conf->psk_identity );
Azim Khan27e8a122018-03-21 14:24:11 +00009457 conf->psk_identity = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009458 conf->psk_identity_len = 0;
9459 }
9460#endif
9461
9462#if defined(MBEDTLS_X509_CRT_PARSE_C)
9463 ssl_key_cert_free( conf->key_cert );
9464#endif
9465
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -05009466 mbedtls_platform_zeroize( conf, sizeof( mbedtls_ssl_config ) );
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02009467}
9468
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02009469#if defined(MBEDTLS_PK_C) && \
9470 ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02009471/*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009472 * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02009473 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009474unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02009475{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009476#if defined(MBEDTLS_RSA_C)
9477 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) )
9478 return( MBEDTLS_SSL_SIG_RSA );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02009479#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009480#if defined(MBEDTLS_ECDSA_C)
9481 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) )
9482 return( MBEDTLS_SSL_SIG_ECDSA );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02009483#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009484 return( MBEDTLS_SSL_SIG_ANON );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02009485}
9486
Hanno Becker7e5437a2017-04-28 17:15:26 +01009487unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type )
9488{
9489 switch( type ) {
9490 case MBEDTLS_PK_RSA:
9491 return( MBEDTLS_SSL_SIG_RSA );
9492 case MBEDTLS_PK_ECDSA:
9493 case MBEDTLS_PK_ECKEY:
9494 return( MBEDTLS_SSL_SIG_ECDSA );
9495 default:
9496 return( MBEDTLS_SSL_SIG_ANON );
9497 }
9498}
9499
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009500mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig )
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009501{
9502 switch( sig )
9503 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009504#if defined(MBEDTLS_RSA_C)
9505 case MBEDTLS_SSL_SIG_RSA:
9506 return( MBEDTLS_PK_RSA );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009507#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009508#if defined(MBEDTLS_ECDSA_C)
9509 case MBEDTLS_SSL_SIG_ECDSA:
9510 return( MBEDTLS_PK_ECDSA );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009511#endif
9512 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009513 return( MBEDTLS_PK_NONE );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009514 }
9515}
Manuel Pégourié-Gonnard5674a972015-10-19 15:14:03 +02009516#endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009517
Hanno Becker7e5437a2017-04-28 17:15:26 +01009518#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
9519 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
9520
9521/* Find an entry in a signature-hash set matching a given hash algorithm. */
9522mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set,
9523 mbedtls_pk_type_t sig_alg )
9524{
9525 switch( sig_alg )
9526 {
9527 case MBEDTLS_PK_RSA:
9528 return( set->rsa );
9529 case MBEDTLS_PK_ECDSA:
9530 return( set->ecdsa );
9531 default:
9532 return( MBEDTLS_MD_NONE );
9533 }
9534}
9535
9536/* Add a signature-hash-pair to a signature-hash set */
9537void mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set,
9538 mbedtls_pk_type_t sig_alg,
9539 mbedtls_md_type_t md_alg )
9540{
9541 switch( sig_alg )
9542 {
9543 case MBEDTLS_PK_RSA:
9544 if( set->rsa == MBEDTLS_MD_NONE )
9545 set->rsa = md_alg;
9546 break;
9547
9548 case MBEDTLS_PK_ECDSA:
9549 if( set->ecdsa == MBEDTLS_MD_NONE )
9550 set->ecdsa = md_alg;
9551 break;
9552
9553 default:
9554 break;
9555 }
9556}
9557
9558/* Allow exactly one hash algorithm for each signature. */
9559void mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set,
9560 mbedtls_md_type_t md_alg )
9561{
9562 set->rsa = md_alg;
9563 set->ecdsa = md_alg;
9564}
9565
9566#endif /* MBEDTLS_SSL_PROTO_TLS1_2) &&
9567 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
9568
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02009569/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02009570 * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02009571 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009572mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash )
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009573{
9574 switch( hash )
9575 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009576#if defined(MBEDTLS_MD5_C)
9577 case MBEDTLS_SSL_HASH_MD5:
9578 return( MBEDTLS_MD_MD5 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009579#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009580#if defined(MBEDTLS_SHA1_C)
9581 case MBEDTLS_SSL_HASH_SHA1:
9582 return( MBEDTLS_MD_SHA1 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009583#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009584#if defined(MBEDTLS_SHA256_C)
9585 case MBEDTLS_SSL_HASH_SHA224:
9586 return( MBEDTLS_MD_SHA224 );
9587 case MBEDTLS_SSL_HASH_SHA256:
9588 return( MBEDTLS_MD_SHA256 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009589#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009590#if defined(MBEDTLS_SHA512_C)
9591 case MBEDTLS_SSL_HASH_SHA384:
9592 return( MBEDTLS_MD_SHA384 );
9593 case MBEDTLS_SSL_HASH_SHA512:
9594 return( MBEDTLS_MD_SHA512 );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009595#endif
9596 default:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009597 return( MBEDTLS_MD_NONE );
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02009598 }
9599}
9600
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02009601/*
9602 * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX
9603 */
9604unsigned char mbedtls_ssl_hash_from_md_alg( int md )
9605{
9606 switch( md )
9607 {
9608#if defined(MBEDTLS_MD5_C)
9609 case MBEDTLS_MD_MD5:
9610 return( MBEDTLS_SSL_HASH_MD5 );
9611#endif
9612#if defined(MBEDTLS_SHA1_C)
9613 case MBEDTLS_MD_SHA1:
9614 return( MBEDTLS_SSL_HASH_SHA1 );
9615#endif
9616#if defined(MBEDTLS_SHA256_C)
9617 case MBEDTLS_MD_SHA224:
9618 return( MBEDTLS_SSL_HASH_SHA224 );
9619 case MBEDTLS_MD_SHA256:
9620 return( MBEDTLS_SSL_HASH_SHA256 );
9621#endif
9622#if defined(MBEDTLS_SHA512_C)
9623 case MBEDTLS_MD_SHA384:
9624 return( MBEDTLS_SSL_HASH_SHA384 );
9625 case MBEDTLS_MD_SHA512:
9626 return( MBEDTLS_SSL_HASH_SHA512 );
9627#endif
9628 default:
9629 return( MBEDTLS_SSL_HASH_NONE );
9630 }
9631}
9632
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02009633#if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01009634/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02009635 * Check if a curve proposed by the peer is in our list.
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02009636 * Return 0 if we're willing to use it, -1 otherwise.
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01009637 */
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02009638int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01009639{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009640 const mbedtls_ecp_group_id *gid;
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01009641
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02009642 if( ssl->conf->curve_list == NULL )
9643 return( -1 );
9644
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +02009645 for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01009646 if( *gid == grp_id )
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02009647 return( 0 );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01009648
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02009649 return( -1 );
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01009650}
Manuel Pégourié-Gonnardb541da62015-06-17 11:43:30 +02009651#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009652
Manuel Pégourié-Gonnarde5f30722015-10-22 17:01:15 +02009653#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02009654/*
9655 * Check if a hash proposed by the peer is in our list.
9656 * Return 0 if we're willing to use it, -1 otherwise.
9657 */
9658int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl,
9659 mbedtls_md_type_t md )
9660{
9661 const int *cur;
9662
9663 if( ssl->conf->sig_hashes == NULL )
9664 return( -1 );
9665
9666 for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ )
9667 if( *cur == (int) md )
9668 return( 0 );
9669
9670 return( -1 );
9671}
Manuel Pégourié-Gonnarde5f30722015-10-22 17:01:15 +02009672#endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02009673
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009674#if defined(MBEDTLS_X509_CRT_PARSE_C)
9675int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,
9676 const mbedtls_ssl_ciphersuite_t *ciphersuite,
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01009677 int cert_endpoint,
Manuel Pégourié-Gonnarde6ef16f2015-05-11 19:54:43 +02009678 uint32_t *flags )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009679{
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01009680 int ret = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009681#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009682 int usage = 0;
9683#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009684#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02009685 const char *ext_oid;
9686 size_t ext_len;
9687#endif
9688
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009689#if !defined(MBEDTLS_X509_CHECK_KEY_USAGE) && \
9690 !defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02009691 ((void) cert);
9692 ((void) cert_endpoint);
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01009693 ((void) flags);
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02009694#endif
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009695
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009696#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
9697 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009698 {
9699 /* Server part of the key exchange */
9700 switch( ciphersuite->key_exchange )
9701 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009702 case MBEDTLS_KEY_EXCHANGE_RSA:
9703 case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01009704 usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009705 break;
9706
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009707 case MBEDTLS_KEY_EXCHANGE_DHE_RSA:
9708 case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
9709 case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
9710 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009711 break;
9712
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009713 case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
9714 case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01009715 usage = MBEDTLS_X509_KU_KEY_AGREEMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009716 break;
9717
9718 /* Don't use default: we want warnings when adding new values */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009719 case MBEDTLS_KEY_EXCHANGE_NONE:
9720 case MBEDTLS_KEY_EXCHANGE_PSK:
9721 case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
9722 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
Manuel Pégourié-Gonnard557535d2015-09-15 17:53:32 +02009723 case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009724 usage = 0;
9725 }
9726 }
9727 else
9728 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009729 /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */
9730 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009731 }
9732
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009733 if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 )
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01009734 {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01009735 *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01009736 ret = -1;
9737 }
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02009738#else
9739 ((void) ciphersuite);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009740#endif /* MBEDTLS_X509_CHECK_KEY_USAGE */
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009741
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009742#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
9743 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02009744 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009745 ext_oid = MBEDTLS_OID_SERVER_AUTH;
9746 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH );
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02009747 }
9748 else
9749 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009750 ext_oid = MBEDTLS_OID_CLIENT_AUTH;
9751 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH );
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02009752 }
9753
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009754 if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 )
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01009755 {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01009756 *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01009757 ret = -1;
9758 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009759#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02009760
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01009761 return( ret );
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02009762}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009763#endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3a306b92014-04-29 15:11:17 +02009764
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009765/*
9766 * Convert version numbers to/from wire format
9767 * and, for DTLS, to/from TLS equivalent.
9768 *
9769 * For TLS this is the identity.
Brian J Murray1903fb32016-11-06 04:45:15 -08009770 * For DTLS, use 1's complement (v -> 255 - v, and then map as follows:
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009771 * 1.0 <-> 3.2 (DTLS 1.0 is based on TLS 1.1)
9772 * 1.x <-> 3.x+1 for x != 0 (DTLS 1.2 based on TLS 1.2)
9773 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009774void mbedtls_ssl_write_version( int major, int minor, int transport,
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009775 unsigned char ver[2] )
9776{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009777#if defined(MBEDTLS_SSL_PROTO_DTLS)
9778 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009779 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009780 if( minor == MBEDTLS_SSL_MINOR_VERSION_2 )
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009781 --minor; /* DTLS 1.0 stored as TLS 1.1 internally */
9782
9783 ver[0] = (unsigned char)( 255 - ( major - 2 ) );
9784 ver[1] = (unsigned char)( 255 - ( minor - 1 ) );
9785 }
Manuel Pégourié-Gonnard34c10112014-03-25 13:36:22 +01009786 else
9787#else
9788 ((void) transport);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009789#endif
Manuel Pégourié-Gonnard34c10112014-03-25 13:36:22 +01009790 {
9791 ver[0] = (unsigned char) major;
9792 ver[1] = (unsigned char) minor;
9793 }
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009794}
9795
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009796void mbedtls_ssl_read_version( int *major, int *minor, int transport,
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009797 const unsigned char ver[2] )
9798{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009799#if defined(MBEDTLS_SSL_PROTO_DTLS)
9800 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009801 {
9802 *major = 255 - ver[0] + 2;
9803 *minor = 255 - ver[1] + 1;
9804
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02009805 if( *minor == MBEDTLS_SSL_MINOR_VERSION_1 )
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009806 ++*minor; /* DTLS 1.0 stored as TLS 1.1 internally */
9807 }
Manuel Pégourié-Gonnard34c10112014-03-25 13:36:22 +01009808 else
9809#else
9810 ((void) transport);
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009811#endif
Manuel Pégourié-Gonnard34c10112014-03-25 13:36:22 +01009812 {
9813 *major = ver[0];
9814 *minor = ver[1];
9815 }
Manuel Pégourié-Gonnardabc7e3b2014-02-11 18:15:03 +01009816}
9817
Simon Butcher99000142016-10-13 17:21:01 +01009818int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md )
9819{
9820#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
9821 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
9822 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
9823
9824 switch( md )
9825 {
9826#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
9827#if defined(MBEDTLS_MD5_C)
9828 case MBEDTLS_SSL_HASH_MD5:
Janos Follath182013f2016-10-25 10:50:22 +01009829 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
Simon Butcher99000142016-10-13 17:21:01 +01009830#endif
9831#if defined(MBEDTLS_SHA1_C)
9832 case MBEDTLS_SSL_HASH_SHA1:
9833 ssl->handshake->calc_verify = ssl_calc_verify_tls;
9834 break;
9835#endif
9836#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
9837#if defined(MBEDTLS_SHA512_C)
9838 case MBEDTLS_SSL_HASH_SHA384:
9839 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384;
9840 break;
9841#endif
9842#if defined(MBEDTLS_SHA256_C)
9843 case MBEDTLS_SSL_HASH_SHA256:
9844 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256;
9845 break;
9846#endif
9847 default:
9848 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
9849 }
9850
9851 return 0;
9852#else /* !MBEDTLS_SSL_PROTO_TLS1_2 */
9853 (void) ssl;
9854 (void) md;
9855
9856 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
9857#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
9858}
9859
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009860#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
9861 defined(MBEDTLS_SSL_PROTO_TLS1_1)
9862int mbedtls_ssl_get_key_exchange_md_ssl_tls( mbedtls_ssl_context *ssl,
9863 unsigned char *output,
9864 unsigned char *data, size_t data_len )
9865{
9866 int ret = 0;
9867 mbedtls_md5_context mbedtls_md5;
9868 mbedtls_sha1_context mbedtls_sha1;
9869
9870 mbedtls_md5_init( &mbedtls_md5 );
9871 mbedtls_sha1_init( &mbedtls_sha1 );
9872
9873 /*
9874 * digitally-signed struct {
9875 * opaque md5_hash[16];
9876 * opaque sha_hash[20];
9877 * };
9878 *
9879 * md5_hash
9880 * MD5(ClientHello.random + ServerHello.random
9881 * + ServerParams);
9882 * sha_hash
9883 * SHA(ClientHello.random + ServerHello.random
9884 * + ServerParams);
9885 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009886 if( ( ret = mbedtls_md5_starts_ret( &mbedtls_md5 ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009887 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009888 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_starts_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009889 goto exit;
9890 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009891 if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009892 ssl->handshake->randbytes, 64 ) ) != 0 )
9893 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009894 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009895 goto exit;
9896 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009897 if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5, data, data_len ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009898 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009899 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009900 goto exit;
9901 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009902 if( ( ret = mbedtls_md5_finish_ret( &mbedtls_md5, output ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009903 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009904 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_finish_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009905 goto exit;
9906 }
9907
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009908 if( ( ret = mbedtls_sha1_starts_ret( &mbedtls_sha1 ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009909 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009910 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_starts_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009911 goto exit;
9912 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009913 if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009914 ssl->handshake->randbytes, 64 ) ) != 0 )
9915 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009916 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009917 goto exit;
9918 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009919 if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1, data,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009920 data_len ) ) != 0 )
9921 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009922 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009923 goto exit;
9924 }
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009925 if( ( ret = mbedtls_sha1_finish_ret( &mbedtls_sha1,
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009926 output + 16 ) ) != 0 )
9927 {
Gilles Peskine9e4f77c2018-01-22 11:48:08 +01009928 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_finish_ret", ret );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009929 goto exit;
9930 }
9931
9932exit:
9933 mbedtls_md5_free( &mbedtls_md5 );
9934 mbedtls_sha1_free( &mbedtls_sha1 );
9935
9936 if( ret != 0 )
9937 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
9938 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
9939
9940 return( ret );
9941
9942}
9943#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
9944 MBEDTLS_SSL_PROTO_TLS1_1 */
9945
9946#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
9947 defined(MBEDTLS_SSL_PROTO_TLS1_2)
9948int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
Gilles Peskineca1d7422018-04-24 11:53:22 +02009949 unsigned char *hash, size_t *hashlen,
9950 unsigned char *data, size_t data_len,
9951 mbedtls_md_type_t md_alg )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009952{
9953 int ret = 0;
9954 mbedtls_md_context_t ctx;
9955 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );
Gilles Peskineca1d7422018-04-24 11:53:22 +02009956 *hashlen = mbedtls_md_get_size( md_info );
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009957
9958 mbedtls_md_init( &ctx );
9959
9960 /*
9961 * digitally-signed struct {
9962 * opaque client_random[32];
9963 * opaque server_random[32];
9964 * ServerDHParams params;
9965 * };
9966 */
9967 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
9968 {
9969 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
9970 goto exit;
9971 }
9972 if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 )
9973 {
9974 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_starts", ret );
9975 goto exit;
9976 }
9977 if( ( ret = mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 ) ) != 0 )
9978 {
9979 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
9980 goto exit;
9981 }
9982 if( ( ret = mbedtls_md_update( &ctx, data, data_len ) ) != 0 )
9983 {
9984 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
9985 goto exit;
9986 }
Gilles Peskineca1d7422018-04-24 11:53:22 +02009987 if( ( ret = mbedtls_md_finish( &ctx, hash ) ) != 0 )
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01009988 {
9989 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_finish", ret );
9990 goto exit;
9991 }
9992
9993exit:
9994 mbedtls_md_free( &ctx );
9995
9996 if( ret != 0 )
9997 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
9998 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
9999
10000 return( ret );
10001}
10002#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
10003 MBEDTLS_SSL_PROTO_TLS1_2 */
10004
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020010005#endif /* MBEDTLS_SSL_TLS_C */