1 /*
2 * SSLv3/TLSv1 shared functions
3 *
4 * Copyright The Mbed TLS Contributors
5 * 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.
18 */
19 /*
20 * The SSL 3.0 specification was drafted by Netscape in 1996,
21 * and became an IETF standard in 1999.
22 *
23 * http://wp.netscape.com/eng/ssl3/
24 * http://www.ietf.org/rfc/rfc2246.txt
25 * http://www.ietf.org/rfc/rfc4346.txt
26 */
27
28 #include "common.h"
29
30 #if defined(MBEDTLS_SSL_TLS_C)
31
32 #if defined(MBEDTLS_PLATFORM_C)
33 #include "mbedtls/platform.h"
34 #else
35 #include <stdlib.h>
36 #define mbedtls_calloc calloc
37 #define mbedtls_free free
38 #endif
39
40 #include "mbedtls/ssl.h"
41 #include "mbedtls/ssl_internal.h"
42 #include "mbedtls/debug.h"
43 #include "mbedtls/error.h"
44 #include "mbedtls/platform_util.h"
45 #include "mbedtls/version.h"
46 #include "mbedtls/constant_time.h"
47
48 #include <string.h>
49
50 #if defined(MBEDTLS_USE_PSA_CRYPTO)
51 #include "mbedtls/psa_util.h"
52 #include "psa/crypto.h"
53 #endif
54
55 #if defined(MBEDTLS_X509_CRT_PARSE_C)
56 #include "mbedtls/oid.h"
57 #endif
58
59 #if defined(MBEDTLS_SSL_PROTO_DTLS)
60
61 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
62 /* Top-level Connection ID API */
63
mbedtls_ssl_conf_cid(mbedtls_ssl_config * conf,size_t len,int ignore_other_cid)64 int mbedtls_ssl_conf_cid( mbedtls_ssl_config *conf,
65 size_t len,
66 int ignore_other_cid )
67 {
68 if( len > MBEDTLS_SSL_CID_IN_LEN_MAX )
69 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
70
71 if( ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_FAIL &&
72 ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_IGNORE )
73 {
74 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
75 }
76
77 conf->ignore_unexpected_cid = ignore_other_cid;
78 conf->cid_len = len;
79 return( 0 );
80 }
81
mbedtls_ssl_set_cid(mbedtls_ssl_context * ssl,int enable,unsigned char const * own_cid,size_t own_cid_len)82 int mbedtls_ssl_set_cid( mbedtls_ssl_context *ssl,
83 int enable,
84 unsigned char const *own_cid,
85 size_t own_cid_len )
86 {
87 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
88 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
89
90 ssl->negotiate_cid = enable;
91 if( enable == MBEDTLS_SSL_CID_DISABLED )
92 {
93 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Disable use of CID extension." ) );
94 return( 0 );
95 }
96 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Enable use of CID extension." ) );
97 MBEDTLS_SSL_DEBUG_BUF( 3, "Own CID", own_cid, own_cid_len );
98
99 if( own_cid_len != ssl->conf->cid_len )
100 {
101 MBEDTLS_SSL_DEBUG_MSG( 3, ( "CID length %u does not match CID length %u in config",
102 (unsigned) own_cid_len,
103 (unsigned) ssl->conf->cid_len ) );
104 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
105 }
106
107 memcpy( ssl->own_cid, own_cid, own_cid_len );
108 /* Truncation is not an issue here because
109 * MBEDTLS_SSL_CID_IN_LEN_MAX at most 255. */
110 ssl->own_cid_len = (uint8_t) own_cid_len;
111
112 return( 0 );
113 }
114
mbedtls_ssl_get_peer_cid(mbedtls_ssl_context * ssl,int * enabled,unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX],size_t * peer_cid_len)115 int mbedtls_ssl_get_peer_cid( mbedtls_ssl_context *ssl,
116 int *enabled,
117 unsigned char peer_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ],
118 size_t *peer_cid_len )
119 {
120 *enabled = MBEDTLS_SSL_CID_DISABLED;
121
122 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
123 ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
124 {
125 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
126 }
127
128 /* We report MBEDTLS_SSL_CID_DISABLED in case the CID extensions
129 * were used, but client and server requested the empty CID.
130 * This is indistinguishable from not using the CID extension
131 * in the first place. */
132 if( ssl->transform_in->in_cid_len == 0 &&
133 ssl->transform_in->out_cid_len == 0 )
134 {
135 return( 0 );
136 }
137
138 if( peer_cid_len != NULL )
139 {
140 *peer_cid_len = ssl->transform_in->out_cid_len;
141 if( peer_cid != NULL )
142 {
143 memcpy( peer_cid, ssl->transform_in->out_cid,
144 ssl->transform_in->out_cid_len );
145 }
146 }
147
148 *enabled = MBEDTLS_SSL_CID_ENABLED;
149
150 return( 0 );
151 }
152 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
153
154 #endif /* MBEDTLS_SSL_PROTO_DTLS */
155
156 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
157 /*
158 * Convert max_fragment_length codes to length.
159 * RFC 6066 says:
160 * enum{
161 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
162 * } MaxFragmentLength;
163 * and we add 0 -> extension unused
164 */
ssl_mfl_code_to_length(int mfl)165 static unsigned int ssl_mfl_code_to_length( int mfl )
166 {
167 switch( mfl )
168 {
169 case MBEDTLS_SSL_MAX_FRAG_LEN_NONE:
170 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
171 case MBEDTLS_SSL_MAX_FRAG_LEN_512:
172 return 512;
173 case MBEDTLS_SSL_MAX_FRAG_LEN_1024:
174 return 1024;
175 case MBEDTLS_SSL_MAX_FRAG_LEN_2048:
176 return 2048;
177 case MBEDTLS_SSL_MAX_FRAG_LEN_4096:
178 return 4096;
179 default:
180 return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN );
181 }
182 }
183 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
184
mbedtls_ssl_session_copy(mbedtls_ssl_session * dst,const mbedtls_ssl_session * src)185 int mbedtls_ssl_session_copy( mbedtls_ssl_session *dst,
186 const mbedtls_ssl_session *src )
187 {
188 mbedtls_ssl_session_free( dst );
189 memcpy( dst, src, sizeof( mbedtls_ssl_session ) );
190
191 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
192 dst->ticket = NULL;
193 #endif
194
195 #if defined(MBEDTLS_X509_CRT_PARSE_C)
196
197 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
198 if( src->peer_cert != NULL )
199 {
200 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
201
202 dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) );
203 if( dst->peer_cert == NULL )
204 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
205
206 mbedtls_x509_crt_init( dst->peer_cert );
207
208 if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p,
209 src->peer_cert->raw.len ) ) != 0 )
210 {
211 mbedtls_free( dst->peer_cert );
212 dst->peer_cert = NULL;
213 return( ret );
214 }
215 }
216 #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
217 if( src->peer_cert_digest != NULL )
218 {
219 dst->peer_cert_digest =
220 mbedtls_calloc( 1, src->peer_cert_digest_len );
221 if( dst->peer_cert_digest == NULL )
222 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
223
224 memcpy( dst->peer_cert_digest, src->peer_cert_digest,
225 src->peer_cert_digest_len );
226 dst->peer_cert_digest_type = src->peer_cert_digest_type;
227 dst->peer_cert_digest_len = src->peer_cert_digest_len;
228 }
229 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
230
231 #endif /* MBEDTLS_X509_CRT_PARSE_C */
232
233 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
234 if( src->ticket != NULL )
235 {
236 dst->ticket = mbedtls_calloc( 1, src->ticket_len );
237 if( dst->ticket == NULL )
238 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
239
240 memcpy( dst->ticket, src->ticket, src->ticket_len );
241 }
242 #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
243
244 return( 0 );
245 }
246
247 #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
resize_buffer(unsigned char ** buffer,size_t len_new,size_t * len_old)248 static int resize_buffer( unsigned char **buffer, size_t len_new, size_t *len_old )
249 {
250 unsigned char* resized_buffer = mbedtls_calloc( 1, len_new );
251 if( resized_buffer == NULL )
252 return -1;
253
254 /* We want to copy len_new bytes when downsizing the buffer, and
255 * len_old bytes when upsizing, so we choose the smaller of two sizes,
256 * to fit one buffer into another. Size checks, ensuring that no data is
257 * lost, are done outside of this function. */
258 memcpy( resized_buffer, *buffer,
259 ( len_new < *len_old ) ? len_new : *len_old );
260 mbedtls_platform_zeroize( *buffer, *len_old );
261 mbedtls_free( *buffer );
262
263 *buffer = resized_buffer;
264 *len_old = len_new;
265
266 return 0;
267 }
268
handle_buffer_resizing(mbedtls_ssl_context * ssl,int downsizing,size_t in_buf_new_len,size_t out_buf_new_len)269 static void handle_buffer_resizing( mbedtls_ssl_context *ssl, int downsizing,
270 size_t in_buf_new_len,
271 size_t out_buf_new_len )
272 {
273 int modified = 0;
274 size_t written_in = 0, iv_offset_in = 0, len_offset_in = 0;
275 size_t written_out = 0, iv_offset_out = 0, len_offset_out = 0;
276 if( ssl->in_buf != NULL )
277 {
278 written_in = ssl->in_msg - ssl->in_buf;
279 iv_offset_in = ssl->in_iv - ssl->in_buf;
280 len_offset_in = ssl->in_len - ssl->in_buf;
281 if( downsizing ?
282 ssl->in_buf_len > in_buf_new_len && ssl->in_left < in_buf_new_len :
283 ssl->in_buf_len < in_buf_new_len )
284 {
285 if( resize_buffer( &ssl->in_buf, in_buf_new_len, &ssl->in_buf_len ) != 0 )
286 {
287 MBEDTLS_SSL_DEBUG_MSG( 1, ( "input buffer resizing failed - out of memory" ) );
288 }
289 else
290 {
291 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating in_buf to %" MBEDTLS_PRINTF_SIZET,
292 in_buf_new_len ) );
293 modified = 1;
294 }
295 }
296 }
297
298 if( ssl->out_buf != NULL )
299 {
300 written_out = ssl->out_msg - ssl->out_buf;
301 iv_offset_out = ssl->out_iv - ssl->out_buf;
302 len_offset_out = ssl->out_len - ssl->out_buf;
303 if( downsizing ?
304 ssl->out_buf_len > out_buf_new_len && ssl->out_left < out_buf_new_len :
305 ssl->out_buf_len < out_buf_new_len )
306 {
307 if( resize_buffer( &ssl->out_buf, out_buf_new_len, &ssl->out_buf_len ) != 0 )
308 {
309 MBEDTLS_SSL_DEBUG_MSG( 1, ( "output buffer resizing failed - out of memory" ) );
310 }
311 else
312 {
313 MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reallocating out_buf to %" MBEDTLS_PRINTF_SIZET,
314 out_buf_new_len ) );
315 modified = 1;
316 }
317 }
318 }
319 if( modified )
320 {
321 /* Update pointers here to avoid doing it twice. */
322 mbedtls_ssl_reset_in_out_pointers( ssl );
323 /* Fields below might not be properly updated with record
324 * splitting or with CID, so they are manually updated here. */
325 ssl->out_msg = ssl->out_buf + written_out;
326 ssl->out_len = ssl->out_buf + len_offset_out;
327 ssl->out_iv = ssl->out_buf + iv_offset_out;
328
329 ssl->in_msg = ssl->in_buf + written_in;
330 ssl->in_len = ssl->in_buf + len_offset_in;
331 ssl->in_iv = ssl->in_buf + iv_offset_in;
332 }
333 }
334 #endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
335
336 /*
337 * Key material generation
338 */
339 #if defined(MBEDTLS_SSL_PROTO_SSL3)
ssl3_prf(const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)340 static int ssl3_prf( const unsigned char *secret, size_t slen,
341 const char *label,
342 const unsigned char *random, size_t rlen,
343 unsigned char *dstbuf, size_t dlen )
344 {
345 int ret = 0;
346 size_t i;
347 mbedtls_md5_context md5;
348 mbedtls_sha1_context sha1;
349 unsigned char padding[16];
350 unsigned char sha1sum[20];
351 ((void)label);
352
353 mbedtls_md5_init( &md5 );
354 mbedtls_sha1_init( &sha1 );
355
356 /*
357 * SSLv3:
358 * block =
359 * MD5( secret + SHA1( 'A' + secret + random ) ) +
360 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
361 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
362 * ...
363 */
364 for( i = 0; i < dlen / 16; i++ )
365 {
366 memset( padding, (unsigned char) ('A' + i), 1 + i );
367
368 if( ( ret = mbedtls_sha1_starts_ret( &sha1 ) ) != 0 )
369 goto exit;
370 if( ( ret = mbedtls_sha1_update_ret( &sha1, padding, 1 + i ) ) != 0 )
371 goto exit;
372 if( ( ret = mbedtls_sha1_update_ret( &sha1, secret, slen ) ) != 0 )
373 goto exit;
374 if( ( ret = mbedtls_sha1_update_ret( &sha1, random, rlen ) ) != 0 )
375 goto exit;
376 if( ( ret = mbedtls_sha1_finish_ret( &sha1, sha1sum ) ) != 0 )
377 goto exit;
378
379 if( ( ret = mbedtls_md5_starts_ret( &md5 ) ) != 0 )
380 goto exit;
381 if( ( ret = mbedtls_md5_update_ret( &md5, secret, slen ) ) != 0 )
382 goto exit;
383 if( ( ret = mbedtls_md5_update_ret( &md5, sha1sum, 20 ) ) != 0 )
384 goto exit;
385 if( ( ret = mbedtls_md5_finish_ret( &md5, dstbuf + i * 16 ) ) != 0 )
386 goto exit;
387 }
388
389 exit:
390 mbedtls_md5_free( &md5 );
391 mbedtls_sha1_free( &sha1 );
392
393 mbedtls_platform_zeroize( padding, sizeof( padding ) );
394 mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) );
395
396 return( ret );
397 }
398 #endif /* MBEDTLS_SSL_PROTO_SSL3 */
399
400 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
tls1_prf(const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)401 static int tls1_prf( const unsigned char *secret, size_t slen,
402 const char *label,
403 const unsigned char *random, size_t rlen,
404 unsigned char *dstbuf, size_t dlen )
405 {
406 size_t nb, hs;
407 size_t i, j, k;
408 const unsigned char *S1, *S2;
409 unsigned char *tmp;
410 size_t tmp_len = 0;
411 unsigned char h_i[20];
412 const mbedtls_md_info_t *md_info;
413 mbedtls_md_context_t md_ctx;
414 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
415
416 mbedtls_md_init( &md_ctx );
417
418 tmp_len = 20 + strlen( label ) + rlen;
419 tmp = mbedtls_calloc( 1, tmp_len );
420 if( tmp == NULL )
421 {
422 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
423 goto exit;
424 }
425
426 hs = ( slen + 1 ) / 2;
427 S1 = secret;
428 S2 = secret + slen - hs;
429
430 nb = strlen( label );
431 memcpy( tmp + 20, label, nb );
432 memcpy( tmp + 20 + nb, random, rlen );
433 nb += rlen;
434
435 /*
436 * First compute P_md5(secret,label+random)[0..dlen]
437 */
438 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ) ) == NULL )
439 {
440 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
441 goto exit;
442 }
443
444 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
445 {
446 goto exit;
447 }
448
449 ret = mbedtls_md_hmac_starts( &md_ctx, S1, hs );
450 if( ret != 0 )
451 goto exit;
452 ret = mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );
453 if( ret != 0 )
454 goto exit;
455 ret = mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );
456 if( ret != 0 )
457 goto exit;
458
459 for( i = 0; i < dlen; i += 16 )
460 {
461 ret = mbedtls_md_hmac_reset ( &md_ctx );
462 if( ret != 0 )
463 goto exit;
464 ret = mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 + nb );
465 if( ret != 0 )
466 goto exit;
467 ret = mbedtls_md_hmac_finish( &md_ctx, h_i );
468 if( ret != 0 )
469 goto exit;
470
471 ret = mbedtls_md_hmac_reset ( &md_ctx );
472 if( ret != 0 )
473 goto exit;
474 ret = mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 );
475 if( ret != 0 )
476 goto exit;
477 ret = mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );
478 if( ret != 0 )
479 goto exit;
480
481 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
482
483 for( j = 0; j < k; j++ )
484 dstbuf[i + j] = h_i[j];
485 }
486
487 mbedtls_md_free( &md_ctx );
488
489 /*
490 * XOR out with P_sha1(secret,label+random)[0..dlen]
491 */
492 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL )
493 {
494 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
495 goto exit;
496 }
497
498 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
499 {
500 goto exit;
501 }
502
503 ret = mbedtls_md_hmac_starts( &md_ctx, S2, hs );
504 if( ret != 0 )
505 goto exit;
506 ret = mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );
507 if( ret != 0 )
508 goto exit;
509 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
510 if( ret != 0 )
511 goto exit;
512
513 for( i = 0; i < dlen; i += 20 )
514 {
515 ret = mbedtls_md_hmac_reset ( &md_ctx );
516 if( ret != 0 )
517 goto exit;
518 ret = mbedtls_md_hmac_update( &md_ctx, tmp, 20 + nb );
519 if( ret != 0 )
520 goto exit;
521 ret = mbedtls_md_hmac_finish( &md_ctx, h_i );
522 if( ret != 0 )
523 goto exit;
524
525 ret = mbedtls_md_hmac_reset ( &md_ctx );
526 if( ret != 0 )
527 goto exit;
528 ret = mbedtls_md_hmac_update( &md_ctx, tmp, 20 );
529 if( ret != 0 )
530 goto exit;
531 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
532 if( ret != 0 )
533 goto exit;
534
535 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
536
537 for( j = 0; j < k; j++ )
538 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
539 }
540
541 exit:
542 mbedtls_md_free( &md_ctx );
543
544 mbedtls_platform_zeroize( tmp, tmp_len );
545 mbedtls_platform_zeroize( h_i, sizeof( h_i ) );
546
547 mbedtls_free( tmp );
548 return( ret );
549 }
550 #endif /* MBEDTLS_SSL_PROTO_TLS1) || MBEDTLS_SSL_PROTO_TLS1_1 */
551
552 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
553 #if defined(MBEDTLS_USE_PSA_CRYPTO)
554
setup_psa_key_derivation(psa_key_derivation_operation_t * derivation,psa_key_id_t key,psa_algorithm_t alg,const unsigned char * seed,size_t seed_length,const unsigned char * label,size_t label_length,size_t capacity)555 static psa_status_t setup_psa_key_derivation( psa_key_derivation_operation_t* derivation,
556 psa_key_id_t key,
557 psa_algorithm_t alg,
558 const unsigned char* seed, size_t seed_length,
559 const unsigned char* label, size_t label_length,
560 size_t capacity )
561 {
562 psa_status_t status;
563
564 status = psa_key_derivation_setup( derivation, alg );
565 if( status != PSA_SUCCESS )
566 return( status );
567
568 if( PSA_ALG_IS_TLS12_PRF( alg ) || PSA_ALG_IS_TLS12_PSK_TO_MS( alg ) )
569 {
570 status = psa_key_derivation_input_bytes( derivation,
571 PSA_KEY_DERIVATION_INPUT_SEED,
572 seed, seed_length );
573 if( status != PSA_SUCCESS )
574 return( status );
575
576 if( mbedtls_svc_key_id_is_null( key ) )
577 {
578 status = psa_key_derivation_input_bytes(
579 derivation, PSA_KEY_DERIVATION_INPUT_SECRET,
580 NULL, 0 );
581 }
582 else
583 {
584 status = psa_key_derivation_input_key(
585 derivation, PSA_KEY_DERIVATION_INPUT_SECRET, key );
586 }
587 if( status != PSA_SUCCESS )
588 return( status );
589
590 status = psa_key_derivation_input_bytes( derivation,
591 PSA_KEY_DERIVATION_INPUT_LABEL,
592 label, label_length );
593 if( status != PSA_SUCCESS )
594 return( status );
595 }
596 else
597 {
598 return( PSA_ERROR_NOT_SUPPORTED );
599 }
600
601 status = psa_key_derivation_set_capacity( derivation, capacity );
602 if( status != PSA_SUCCESS )
603 return( status );
604
605 return( PSA_SUCCESS );
606 }
607
tls_prf_generic(mbedtls_md_type_t md_type,const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)608 static int tls_prf_generic( mbedtls_md_type_t md_type,
609 const unsigned char *secret, size_t slen,
610 const char *label,
611 const unsigned char *random, size_t rlen,
612 unsigned char *dstbuf, size_t dlen )
613 {
614 psa_status_t status;
615 psa_algorithm_t alg;
616 psa_key_id_t master_key = MBEDTLS_SVC_KEY_ID_INIT;
617 psa_key_derivation_operation_t derivation =
618 PSA_KEY_DERIVATION_OPERATION_INIT;
619
620 if( md_type == MBEDTLS_MD_SHA384 )
621 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_384);
622 else
623 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256);
624
625 /* Normally a "secret" should be long enough to be impossible to
626 * find by brute force, and in particular should not be empty. But
627 * this PRF is also used to derive an IV, in particular in EAP-TLS,
628 * and for this use case it makes sense to have a 0-length "secret".
629 * Since the key API doesn't allow importing a key of length 0,
630 * keep master_key=0, which setup_psa_key_derivation() understands
631 * to mean a 0-length "secret" input. */
632 if( slen != 0 )
633 {
634 psa_key_attributes_t key_attributes = psa_key_attributes_init();
635 psa_set_key_usage_flags( &key_attributes, PSA_KEY_USAGE_DERIVE );
636 psa_set_key_algorithm( &key_attributes, alg );
637 psa_set_key_type( &key_attributes, PSA_KEY_TYPE_DERIVE );
638
639 status = psa_import_key( &key_attributes, secret, slen, &master_key );
640 if( status != PSA_SUCCESS )
641 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
642 }
643
644 status = setup_psa_key_derivation( &derivation,
645 master_key, alg,
646 random, rlen,
647 (unsigned char const *) label,
648 (size_t) strlen( label ),
649 dlen );
650 if( status != PSA_SUCCESS )
651 {
652 psa_key_derivation_abort( &derivation );
653 psa_destroy_key( master_key );
654 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
655 }
656
657 status = psa_key_derivation_output_bytes( &derivation, dstbuf, dlen );
658 if( status != PSA_SUCCESS )
659 {
660 psa_key_derivation_abort( &derivation );
661 psa_destroy_key( master_key );
662 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
663 }
664
665 status = psa_key_derivation_abort( &derivation );
666 if( status != PSA_SUCCESS )
667 {
668 psa_destroy_key( master_key );
669 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
670 }
671
672 if( ! mbedtls_svc_key_id_is_null( master_key ) )
673 status = psa_destroy_key( master_key );
674 if( status != PSA_SUCCESS )
675 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
676
677 return( 0 );
678 }
679
680 #else /* MBEDTLS_USE_PSA_CRYPTO */
681
tls_prf_generic(mbedtls_md_type_t md_type,const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)682 static int tls_prf_generic( mbedtls_md_type_t md_type,
683 const unsigned char *secret, size_t slen,
684 const char *label,
685 const unsigned char *random, size_t rlen,
686 unsigned char *dstbuf, size_t dlen )
687 {
688 size_t nb;
689 size_t i, j, k, md_len;
690 unsigned char *tmp;
691 size_t tmp_len = 0;
692 unsigned char h_i[MBEDTLS_MD_MAX_SIZE];
693 const mbedtls_md_info_t *md_info;
694 mbedtls_md_context_t md_ctx;
695 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
696
697 mbedtls_md_init( &md_ctx );
698
699 if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL )
700 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
701
702 md_len = mbedtls_md_get_size( md_info );
703
704 tmp_len = md_len + strlen( label ) + rlen;
705 tmp = mbedtls_calloc( 1, tmp_len );
706 if( tmp == NULL )
707 {
708 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
709 goto exit;
710 }
711
712 nb = strlen( label );
713 memcpy( tmp + md_len, label, nb );
714 memcpy( tmp + md_len + nb, random, rlen );
715 nb += rlen;
716
717 /*
718 * Compute P_<hash>(secret, label + random)[0..dlen]
719 */
720 if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )
721 goto exit;
722
723 ret = mbedtls_md_hmac_starts( &md_ctx, secret, slen );
724 if( ret != 0 )
725 goto exit;
726 ret = mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb );
727 if( ret != 0 )
728 goto exit;
729 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
730 if( ret != 0 )
731 goto exit;
732
733 for( i = 0; i < dlen; i += md_len )
734 {
735 ret = mbedtls_md_hmac_reset ( &md_ctx );
736 if( ret != 0 )
737 goto exit;
738 ret = mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb );
739 if( ret != 0 )
740 goto exit;
741 ret = mbedtls_md_hmac_finish( &md_ctx, h_i );
742 if( ret != 0 )
743 goto exit;
744
745 ret = mbedtls_md_hmac_reset ( &md_ctx );
746 if( ret != 0 )
747 goto exit;
748 ret = mbedtls_md_hmac_update( &md_ctx, tmp, md_len );
749 if( ret != 0 )
750 goto exit;
751 ret = mbedtls_md_hmac_finish( &md_ctx, tmp );
752 if( ret != 0 )
753 goto exit;
754
755 k = ( i + md_len > dlen ) ? dlen % md_len : md_len;
756
757 for( j = 0; j < k; j++ )
758 dstbuf[i + j] = h_i[j];
759 }
760
761 exit:
762 mbedtls_md_free( &md_ctx );
763
764 mbedtls_platform_zeroize( tmp, tmp_len );
765 mbedtls_platform_zeroize( h_i, sizeof( h_i ) );
766
767 mbedtls_free( tmp );
768
769 return( ret );
770 }
771 #endif /* MBEDTLS_USE_PSA_CRYPTO */
772 #if defined(MBEDTLS_SHA256_C)
tls_prf_sha256(const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)773 static int tls_prf_sha256( const unsigned char *secret, size_t slen,
774 const char *label,
775 const unsigned char *random, size_t rlen,
776 unsigned char *dstbuf, size_t dlen )
777 {
778 return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen,
779 label, random, rlen, dstbuf, dlen ) );
780 }
781 #endif /* MBEDTLS_SHA256_C */
782
783 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
tls_prf_sha384(const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)784 static int tls_prf_sha384( const unsigned char *secret, size_t slen,
785 const char *label,
786 const unsigned char *random, size_t rlen,
787 unsigned char *dstbuf, size_t dlen )
788 {
789 return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen,
790 label, random, rlen, dstbuf, dlen ) );
791 }
792 #endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */
793 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
794
795 static void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t );
796
797 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
798 defined(MBEDTLS_SSL_PROTO_TLS1_1)
799 static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *, const unsigned char *, size_t );
800 #endif
801
802 #if defined(MBEDTLS_SSL_PROTO_SSL3)
803 static void ssl_calc_verify_ssl( const mbedtls_ssl_context *, unsigned char *, size_t * );
804 static void ssl_calc_finished_ssl( mbedtls_ssl_context *, unsigned char *, int );
805 #endif
806
807 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
808 static void ssl_calc_verify_tls( const mbedtls_ssl_context *, unsigned char*, size_t * );
809 static void ssl_calc_finished_tls( mbedtls_ssl_context *, unsigned char *, int );
810 #endif
811
812 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
813 #if defined(MBEDTLS_SHA256_C)
814 static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t );
815 static void ssl_calc_verify_tls_sha256( const mbedtls_ssl_context *,unsigned char*, size_t * );
816 static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int );
817 #endif
818
819 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
820 static void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t );
821 static void ssl_calc_verify_tls_sha384( const mbedtls_ssl_context *, unsigned char*, size_t * );
822 static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int );
823 #endif
824 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
825
826 #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) && \
827 defined(MBEDTLS_USE_PSA_CRYPTO)
ssl_use_opaque_psk(mbedtls_ssl_context const * ssl)828 static int ssl_use_opaque_psk( mbedtls_ssl_context const *ssl )
829 {
830 if( ssl->conf->f_psk != NULL )
831 {
832 /* If we've used a callback to select the PSK,
833 * the static configuration is irrelevant. */
834 if( ! mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
835 return( 1 );
836
837 return( 0 );
838 }
839
840 if( ! mbedtls_svc_key_id_is_null( ssl->conf->psk_opaque ) )
841 return( 1 );
842
843 return( 0 );
844 }
845 #endif /* MBEDTLS_USE_PSA_CRYPTO &&
846 MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
847
848 #if defined(MBEDTLS_SSL_EXPORT_KEYS)
tls_prf_get_type(mbedtls_ssl_tls_prf_cb * tls_prf)849 static mbedtls_tls_prf_types tls_prf_get_type( mbedtls_ssl_tls_prf_cb *tls_prf )
850 {
851 #if defined(MBEDTLS_SSL_PROTO_SSL3)
852 if( tls_prf == ssl3_prf )
853 {
854 return( MBEDTLS_SSL_TLS_PRF_SSL3 );
855 }
856 else
857 #endif
858 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
859 if( tls_prf == tls1_prf )
860 {
861 return( MBEDTLS_SSL_TLS_PRF_TLS1 );
862 }
863 else
864 #endif
865 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
866 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
867 if( tls_prf == tls_prf_sha384 )
868 {
869 return( MBEDTLS_SSL_TLS_PRF_SHA384 );
870 }
871 else
872 #endif
873 #if defined(MBEDTLS_SHA256_C)
874 if( tls_prf == tls_prf_sha256 )
875 {
876 return( MBEDTLS_SSL_TLS_PRF_SHA256 );
877 }
878 else
879 #endif
880 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
881 return( MBEDTLS_SSL_TLS_PRF_NONE );
882 }
883 #endif /* MBEDTLS_SSL_EXPORT_KEYS */
884
mbedtls_ssl_tls_prf(const mbedtls_tls_prf_types prf,const unsigned char * secret,size_t slen,const char * label,const unsigned char * random,size_t rlen,unsigned char * dstbuf,size_t dlen)885 int mbedtls_ssl_tls_prf( const mbedtls_tls_prf_types prf,
886 const unsigned char *secret, size_t slen,
887 const char *label,
888 const unsigned char *random, size_t rlen,
889 unsigned char *dstbuf, size_t dlen )
890 {
891 mbedtls_ssl_tls_prf_cb *tls_prf = NULL;
892
893 switch( prf )
894 {
895 #if defined(MBEDTLS_SSL_PROTO_SSL3)
896 case MBEDTLS_SSL_TLS_PRF_SSL3:
897 tls_prf = ssl3_prf;
898 break;
899 #endif /* MBEDTLS_SSL_PROTO_SSL3 */
900 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
901 case MBEDTLS_SSL_TLS_PRF_TLS1:
902 tls_prf = tls1_prf;
903 break;
904 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
905
906 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
907 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
908 case MBEDTLS_SSL_TLS_PRF_SHA384:
909 tls_prf = tls_prf_sha384;
910 break;
911 #endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */
912 #if defined(MBEDTLS_SHA256_C)
913 case MBEDTLS_SSL_TLS_PRF_SHA256:
914 tls_prf = tls_prf_sha256;
915 break;
916 #endif /* MBEDTLS_SHA256_C */
917 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
918 default:
919 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
920 }
921
922 return( tls_prf( secret, slen, label, random, rlen, dstbuf, dlen ) );
923 }
924
925 /* Type for the TLS PRF */
926 typedef int ssl_tls_prf_t(const unsigned char *, size_t, const char *,
927 const unsigned char *, size_t,
928 unsigned char *, size_t);
929
930 /*
931 * Populate a transform structure with session keys and all the other
932 * necessary information.
933 *
934 * Parameters:
935 * - [in/out]: transform: structure to populate
936 * [in] must be just initialised with mbedtls_ssl_transform_init()
937 * [out] fully populated, ready for use by mbedtls_ssl_{en,de}crypt_buf()
938 * - [in] ciphersuite
939 * - [in] master
940 * - [in] encrypt_then_mac
941 * - [in] trunc_hmac
942 * - [in] compression
943 * - [in] tls_prf: pointer to PRF to use for key derivation
944 * - [in] randbytes: buffer holding ServerHello.random + ClientHello.random
945 * - [in] minor_ver: SSL/TLS minor version
946 * - [in] endpoint: client or server
947 * - [in] ssl: optionally used for:
948 * - MBEDTLS_SSL_HW_RECORD_ACCEL: whole context (non-const)
949 * - MBEDTLS_SSL_EXPORT_KEYS: ssl->conf->{f,p}_export_keys
950 * - MBEDTLS_DEBUG_C: ssl->conf->{f,p}_dbg
951 */
ssl_populate_transform(mbedtls_ssl_transform * transform,int ciphersuite,const unsigned char master[48],int encrypt_then_mac,int trunc_hmac,int compression,ssl_tls_prf_t tls_prf,const unsigned char randbytes[64],int minor_ver,unsigned endpoint,const mbedtls_ssl_context * ssl)952 static int ssl_populate_transform( mbedtls_ssl_transform *transform,
953 int ciphersuite,
954 const unsigned char master[48],
955 #if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
956 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
957 int encrypt_then_mac,
958 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
959 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
960 int trunc_hmac,
961 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
962 #endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
963 #if defined(MBEDTLS_ZLIB_SUPPORT)
964 int compression,
965 #endif
966 ssl_tls_prf_t tls_prf,
967 const unsigned char randbytes[64],
968 int minor_ver,
969 unsigned endpoint,
970 #if !defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
971 const
972 #endif
973 mbedtls_ssl_context *ssl )
974 {
975 int ret = 0;
976 #if defined(MBEDTLS_USE_PSA_CRYPTO)
977 int psa_fallthrough;
978 #endif /* MBEDTLS_USE_PSA_CRYPTO */
979 unsigned char keyblk[256];
980 unsigned char *key1;
981 unsigned char *key2;
982 unsigned char *mac_enc;
983 unsigned char *mac_dec;
984 size_t mac_key_len = 0;
985 size_t iv_copy_len;
986 unsigned keylen;
987 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
988 const mbedtls_cipher_info_t *cipher_info;
989 const mbedtls_md_info_t *md_info;
990
991 #if !defined(MBEDTLS_SSL_HW_RECORD_ACCEL) && \
992 !defined(MBEDTLS_SSL_EXPORT_KEYS) && \
993 !defined(MBEDTLS_DEBUG_C)
994 ssl = NULL; /* make sure we don't use it except for those cases */
995 (void) ssl;
996 #endif
997
998 /*
999 * Some data just needs copying into the structure
1000 */
1001 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
1002 defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
1003 transform->encrypt_then_mac = encrypt_then_mac;
1004 #endif
1005 transform->minor_ver = minor_ver;
1006
1007 #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
1008 memcpy( transform->randbytes, randbytes, sizeof( transform->randbytes ) );
1009 #endif
1010
1011 /*
1012 * Get various info structures
1013 */
1014 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuite );
1015 if( ciphersuite_info == NULL )
1016 {
1017 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %d not found",
1018 ciphersuite ) );
1019 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1020 }
1021
1022 cipher_info = mbedtls_cipher_info_from_type( ciphersuite_info->cipher );
1023 if( cipher_info == NULL )
1024 {
1025 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %u not found",
1026 ciphersuite_info->cipher ) );
1027 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1028 }
1029
1030 md_info = mbedtls_md_info_from_type( ciphersuite_info->mac );
1031 if( md_info == NULL )
1032 {
1033 MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_md info for %u not found",
1034 (unsigned) ciphersuite_info->mac ) );
1035 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1036 }
1037
1038 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1039 /* Copy own and peer's CID if the use of the CID
1040 * extension has been negotiated. */
1041 if( ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_ENABLED )
1042 {
1043 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Copy CIDs into SSL transform" ) );
1044
1045 transform->in_cid_len = ssl->own_cid_len;
1046 memcpy( transform->in_cid, ssl->own_cid, ssl->own_cid_len );
1047 MBEDTLS_SSL_DEBUG_BUF( 3, "Incoming CID", transform->in_cid,
1048 transform->in_cid_len );
1049
1050 transform->out_cid_len = ssl->handshake->peer_cid_len;
1051 memcpy( transform->out_cid, ssl->handshake->peer_cid,
1052 ssl->handshake->peer_cid_len );
1053 MBEDTLS_SSL_DEBUG_BUF( 3, "Outgoing CID", transform->out_cid,
1054 transform->out_cid_len );
1055 }
1056 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1057
1058 /*
1059 * Compute key block using the PRF
1060 */
1061 ret = tls_prf( master, 48, "key expansion", randbytes, 64, keyblk, 256 );
1062 if( ret != 0 )
1063 {
1064 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
1065 return( ret );
1066 }
1067
1068 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
1069 mbedtls_ssl_get_ciphersuite_name( ciphersuite ) ) );
1070 MBEDTLS_SSL_DEBUG_BUF( 3, "master secret", master, 48 );
1071 MBEDTLS_SSL_DEBUG_BUF( 4, "random bytes", randbytes, 64 );
1072 MBEDTLS_SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
1073
1074 /*
1075 * Determine the appropriate key, IV and MAC length.
1076 */
1077
1078 keylen = cipher_info->key_bitlen / 8;
1079
1080 #if defined(MBEDTLS_GCM_C) || \
1081 defined(MBEDTLS_CCM_C) || \
1082 defined(MBEDTLS_CHACHAPOLY_C)
1083 if( cipher_info->mode == MBEDTLS_MODE_GCM ||
1084 cipher_info->mode == MBEDTLS_MODE_CCM ||
1085 cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY )
1086 {
1087 size_t explicit_ivlen;
1088
1089 transform->maclen = 0;
1090 mac_key_len = 0;
1091 transform->taglen =
1092 ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;
1093
1094 /* All modes haves 96-bit IVs, but the length of the static parts vary
1095 * with mode and version:
1096 * - For GCM and CCM in TLS 1.2, there's a static IV of 4 Bytes
1097 * (to be concatenated with a dynamically chosen IV of 8 Bytes)
1098 * - For ChaChaPoly in TLS 1.2, and all modes in TLS 1.3, there's
1099 * a static IV of 12 Bytes (to be XOR'ed with the 8 Byte record
1100 * sequence number).
1101 */
1102 transform->ivlen = 12;
1103 #if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
1104 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_4 )
1105 {
1106 transform->fixed_ivlen = 12;
1107 }
1108 else
1109 #endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
1110 {
1111 if( cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY )
1112 transform->fixed_ivlen = 12;
1113 else
1114 transform->fixed_ivlen = 4;
1115 }
1116
1117 /* Minimum length of encrypted record */
1118 explicit_ivlen = transform->ivlen - transform->fixed_ivlen;
1119 transform->minlen = explicit_ivlen + transform->taglen;
1120 }
1121 else
1122 #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */
1123 #if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
1124 if( cipher_info->mode == MBEDTLS_MODE_STREAM ||
1125 cipher_info->mode == MBEDTLS_MODE_CBC )
1126 {
1127 /* Initialize HMAC contexts */
1128 if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 ||
1129 ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 )
1130 {
1131 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
1132 goto end;
1133 }
1134
1135 /* Get MAC length */
1136 mac_key_len = mbedtls_md_get_size( md_info );
1137 transform->maclen = mac_key_len;
1138
1139 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1140 /*
1141 * If HMAC is to be truncated, we shall keep the leftmost bytes,
1142 * (rfc 6066 page 13 or rfc 2104 section 4),
1143 * so we only need to adjust the length here.
1144 */
1145 if( trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED )
1146 {
1147 transform->maclen = MBEDTLS_SSL_TRUNCATED_HMAC_LEN;
1148
1149 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT)
1150 /* Fall back to old, non-compliant version of the truncated
1151 * HMAC implementation which also truncates the key
1152 * (Mbed TLS versions from 1.3 to 2.6.0) */
1153 mac_key_len = transform->maclen;
1154 #endif
1155 }
1156 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
1157
1158 /* IV length */
1159 transform->ivlen = cipher_info->iv_size;
1160
1161 /* Minimum length */
1162 if( cipher_info->mode == MBEDTLS_MODE_STREAM )
1163 transform->minlen = transform->maclen;
1164 else
1165 {
1166 /*
1167 * GenericBlockCipher:
1168 * 1. if EtM is in use: one block plus MAC
1169 * otherwise: * first multiple of blocklen greater than maclen
1170 * 2. IV except for SSL3 and TLS 1.0
1171 */
1172 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1173 if( encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED )
1174 {
1175 transform->minlen = transform->maclen
1176 + cipher_info->block_size;
1177 }
1178 else
1179 #endif
1180 {
1181 transform->minlen = transform->maclen
1182 + cipher_info->block_size
1183 - transform->maclen % cipher_info->block_size;
1184 }
1185
1186 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)
1187 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
1188 minor_ver == MBEDTLS_SSL_MINOR_VERSION_1 )
1189 ; /* No need to adjust minlen */
1190 else
1191 #endif
1192 #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)
1193 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_2 ||
1194 minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
1195 {
1196 transform->minlen += transform->ivlen;
1197 }
1198 else
1199 #endif
1200 {
1201 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1202 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1203 goto end;
1204 }
1205 }
1206 }
1207 else
1208 #endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1209 {
1210 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1211 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1212 }
1213
1214 MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %u, minlen: %u, ivlen: %u, maclen: %u",
1215 (unsigned) keylen,
1216 (unsigned) transform->minlen,
1217 (unsigned) transform->ivlen,
1218 (unsigned) transform->maclen ) );
1219
1220 /*
1221 * Finally setup the cipher contexts, IVs and MAC secrets.
1222 */
1223 #if defined(MBEDTLS_SSL_CLI_C)
1224 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
1225 {
1226 key1 = keyblk + mac_key_len * 2;
1227 key2 = keyblk + mac_key_len * 2 + keylen;
1228
1229 mac_enc = keyblk;
1230 mac_dec = keyblk + mac_key_len;
1231
1232 /*
1233 * This is not used in TLS v1.1.
1234 */
1235 iv_copy_len = ( transform->fixed_ivlen ) ?
1236 transform->fixed_ivlen : transform->ivlen;
1237 memcpy( transform->iv_enc, key2 + keylen, iv_copy_len );
1238 memcpy( transform->iv_dec, key2 + keylen + iv_copy_len,
1239 iv_copy_len );
1240 }
1241 else
1242 #endif /* MBEDTLS_SSL_CLI_C */
1243 #if defined(MBEDTLS_SSL_SRV_C)
1244 if( endpoint == MBEDTLS_SSL_IS_SERVER )
1245 {
1246 key1 = keyblk + mac_key_len * 2 + keylen;
1247 key2 = keyblk + mac_key_len * 2;
1248
1249 mac_enc = keyblk + mac_key_len;
1250 mac_dec = keyblk;
1251
1252 /*
1253 * This is not used in TLS v1.1.
1254 */
1255 iv_copy_len = ( transform->fixed_ivlen ) ?
1256 transform->fixed_ivlen : transform->ivlen;
1257 memcpy( transform->iv_dec, key1 + keylen, iv_copy_len );
1258 memcpy( transform->iv_enc, key1 + keylen + iv_copy_len,
1259 iv_copy_len );
1260 }
1261 else
1262 #endif /* MBEDTLS_SSL_SRV_C */
1263 {
1264 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1265 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1266 goto end;
1267 }
1268
1269 #if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
1270 #if defined(MBEDTLS_SSL_PROTO_SSL3)
1271 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
1272 {
1273 if( mac_key_len > sizeof( transform->mac_enc ) )
1274 {
1275 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1276 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1277 goto end;
1278 }
1279
1280 memcpy( transform->mac_enc, mac_enc, mac_key_len );
1281 memcpy( transform->mac_dec, mac_dec, mac_key_len );
1282 }
1283 else
1284 #endif /* MBEDTLS_SSL_PROTO_SSL3 */
1285 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
1286 defined(MBEDTLS_SSL_PROTO_TLS1_2)
1287 if( minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )
1288 {
1289 /* For HMAC-based ciphersuites, initialize the HMAC transforms.
1290 For AEAD-based ciphersuites, there is nothing to do here. */
1291 if( mac_key_len != 0 )
1292 {
1293 ret = mbedtls_md_hmac_starts( &transform->md_ctx_enc,
1294 mac_enc, mac_key_len );
1295 if( ret != 0 )
1296 goto end;
1297 ret = mbedtls_md_hmac_starts( &transform->md_ctx_dec,
1298 mac_dec, mac_key_len );
1299 if( ret != 0 )
1300 goto end;
1301 }
1302 }
1303 else
1304 #endif
1305 {
1306 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1307 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
1308 goto end;
1309 }
1310 #endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1311
1312 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
1313 if( mbedtls_ssl_hw_record_init != NULL )
1314 {
1315 ret = 0;
1316
1317 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) );
1318
1319 if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, keylen,
1320 transform->iv_enc, transform->iv_dec,
1321 iv_copy_len,
1322 mac_enc, mac_dec,
1323 mac_key_len ) ) != 0 )
1324 {
1325 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_init", ret );
1326 ret = MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
1327 goto end;
1328 }
1329 }
1330 #else
1331 ((void) mac_dec);
1332 ((void) mac_enc);
1333 #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */
1334
1335 #if defined(MBEDTLS_SSL_EXPORT_KEYS)
1336 if( ssl->conf->f_export_keys != NULL )
1337 {
1338 ssl->conf->f_export_keys( ssl->conf->p_export_keys,
1339 master, keyblk,
1340 mac_key_len, keylen,
1341 iv_copy_len );
1342 }
1343
1344 if( ssl->conf->f_export_keys_ext != NULL )
1345 {
1346 ssl->conf->f_export_keys_ext( ssl->conf->p_export_keys,
1347 master, keyblk,
1348 mac_key_len, keylen,
1349 iv_copy_len,
1350 randbytes + 32,
1351 randbytes,
1352 tls_prf_get_type( tls_prf ) );
1353 }
1354 #endif
1355
1356 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1357
1358 /* Only use PSA-based ciphers for TLS-1.2.
1359 * That's relevant at least for TLS-1.0, where
1360 * we assume that mbedtls_cipher_crypt() updates
1361 * the structure field for the IV, which the PSA-based
1362 * implementation currently doesn't. */
1363 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1364 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
1365 {
1366 ret = mbedtls_cipher_setup_psa( &transform->cipher_ctx_enc,
1367 cipher_info, transform->taglen );
1368 if( ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE )
1369 {
1370 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup_psa", ret );
1371 goto end;
1372 }
1373
1374 if( ret == 0 )
1375 {
1376 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Successfully setup PSA-based encryption cipher context" ) );
1377 psa_fallthrough = 0;
1378 }
1379 else
1380 {
1381 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to setup PSA-based cipher context for record encryption - fall through to default setup." ) );
1382 psa_fallthrough = 1;
1383 }
1384 }
1385 else
1386 psa_fallthrough = 1;
1387 #else
1388 psa_fallthrough = 1;
1389 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1390
1391 if( psa_fallthrough == 1 )
1392 #endif /* MBEDTLS_USE_PSA_CRYPTO */
1393 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,
1394 cipher_info ) ) != 0 )
1395 {
1396 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
1397 goto end;
1398 }
1399
1400 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1401 /* Only use PSA-based ciphers for TLS-1.2.
1402 * That's relevant at least for TLS-1.0, where
1403 * we assume that mbedtls_cipher_crypt() updates
1404 * the structure field for the IV, which the PSA-based
1405 * implementation currently doesn't. */
1406 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1407 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
1408 {
1409 ret = mbedtls_cipher_setup_psa( &transform->cipher_ctx_dec,
1410 cipher_info, transform->taglen );
1411 if( ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE )
1412 {
1413 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup_psa", ret );
1414 goto end;
1415 }
1416
1417 if( ret == 0 )
1418 {
1419 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Successfully setup PSA-based decryption cipher context" ) );
1420 psa_fallthrough = 0;
1421 }
1422 else
1423 {
1424 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to setup PSA-based cipher context for record decryption - fall through to default setup." ) );
1425 psa_fallthrough = 1;
1426 }
1427 }
1428 else
1429 psa_fallthrough = 1;
1430 #else
1431 psa_fallthrough = 1;
1432 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1433
1434 if( psa_fallthrough == 1 )
1435 #endif /* MBEDTLS_USE_PSA_CRYPTO */
1436 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec,
1437 cipher_info ) ) != 0 )
1438 {
1439 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret );
1440 goto end;
1441 }
1442
1443 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1,
1444 cipher_info->key_bitlen,
1445 MBEDTLS_ENCRYPT ) ) != 0 )
1446 {
1447 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
1448 goto end;
1449 }
1450
1451 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2,
1452 cipher_info->key_bitlen,
1453 MBEDTLS_DECRYPT ) ) != 0 )
1454 {
1455 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret );
1456 goto end;
1457 }
1458
1459 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1460 if( cipher_info->mode == MBEDTLS_MODE_CBC )
1461 {
1462 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc,
1463 MBEDTLS_PADDING_NONE ) ) != 0 )
1464 {
1465 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
1466 goto end;
1467 }
1468
1469 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec,
1470 MBEDTLS_PADDING_NONE ) ) != 0 )
1471 {
1472 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret );
1473 goto end;
1474 }
1475 }
1476 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1477
1478
1479 /* Initialize Zlib contexts */
1480 #if defined(MBEDTLS_ZLIB_SUPPORT)
1481 if( compression == MBEDTLS_SSL_COMPRESS_DEFLATE )
1482 {
1483 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
1484
1485 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
1486 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
1487
1488 if( deflateInit( &transform->ctx_deflate,
1489 Z_DEFAULT_COMPRESSION ) != Z_OK ||
1490 inflateInit( &transform->ctx_inflate ) != Z_OK )
1491 {
1492 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
1493 ret = MBEDTLS_ERR_SSL_COMPRESSION_FAILED;
1494 goto end;
1495 }
1496 }
1497 #endif /* MBEDTLS_ZLIB_SUPPORT */
1498
1499 end:
1500 mbedtls_platform_zeroize( keyblk, sizeof( keyblk ) );
1501 return( ret );
1502 }
1503
1504 /*
1505 * Set appropriate PRF function and other SSL / TLS 1.0/1.1 / TLS1.2 functions
1506 *
1507 * Inputs:
1508 * - SSL/TLS minor version
1509 * - hash associated with the ciphersuite (only used by TLS 1.2)
1510 *
1511 * Outputs:
1512 * - the tls_prf, calc_verify and calc_finished members of handshake structure
1513 */
ssl_set_handshake_prfs(mbedtls_ssl_handshake_params * handshake,int minor_ver,mbedtls_md_type_t hash)1514 static int ssl_set_handshake_prfs( mbedtls_ssl_handshake_params *handshake,
1515 int minor_ver,
1516 mbedtls_md_type_t hash )
1517 {
1518 #if !defined(MBEDTLS_SSL_PROTO_TLS1_2) || \
1519 !( defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) )
1520 (void) hash;
1521 #endif
1522
1523 #if defined(MBEDTLS_SSL_PROTO_SSL3)
1524 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
1525 {
1526 handshake->tls_prf = ssl3_prf;
1527 handshake->calc_verify = ssl_calc_verify_ssl;
1528 handshake->calc_finished = ssl_calc_finished_ssl;
1529 }
1530 else
1531 #endif
1532 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
1533 if( minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
1534 {
1535 handshake->tls_prf = tls1_prf;
1536 handshake->calc_verify = ssl_calc_verify_tls;
1537 handshake->calc_finished = ssl_calc_finished_tls;
1538 }
1539 else
1540 #endif
1541 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1542 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
1543 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
1544 hash == MBEDTLS_MD_SHA384 )
1545 {
1546 handshake->tls_prf = tls_prf_sha384;
1547 handshake->calc_verify = ssl_calc_verify_tls_sha384;
1548 handshake->calc_finished = ssl_calc_finished_tls_sha384;
1549 }
1550 else
1551 #endif
1552 #if defined(MBEDTLS_SHA256_C)
1553 if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
1554 {
1555 handshake->tls_prf = tls_prf_sha256;
1556 handshake->calc_verify = ssl_calc_verify_tls_sha256;
1557 handshake->calc_finished = ssl_calc_finished_tls_sha256;
1558 }
1559 else
1560 #endif
1561 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1562 {
1563 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
1564 }
1565
1566 return( 0 );
1567 }
1568
1569 /*
1570 * Compute master secret if needed
1571 *
1572 * Parameters:
1573 * [in/out] handshake
1574 * [in] resume, premaster, extended_ms, calc_verify, tls_prf
1575 * (PSA-PSK) ciphersuite_info, psk_opaque
1576 * [out] premaster (cleared)
1577 * [out] master
1578 * [in] ssl: optionally used for debugging, EMS and PSA-PSK
1579 * debug: conf->f_dbg, conf->p_dbg
1580 * EMS: passed to calc_verify (debug + (SSL3) session_negotiate)
1581 * PSA-PSA: minor_ver, conf
1582 */
ssl_compute_master(mbedtls_ssl_handshake_params * handshake,unsigned char * master,const mbedtls_ssl_context * ssl)1583 static int ssl_compute_master( mbedtls_ssl_handshake_params *handshake,
1584 unsigned char *master,
1585 const mbedtls_ssl_context *ssl )
1586 {
1587 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1588
1589 /* cf. RFC 5246, Section 8.1:
1590 * "The master secret is always exactly 48 bytes in length." */
1591 size_t const master_secret_len = 48;
1592
1593 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1594 unsigned char session_hash[48];
1595 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
1596
1597 /* The label for the KDF used for key expansion.
1598 * This is either "master secret" or "extended master secret"
1599 * depending on whether the Extended Master Secret extension
1600 * is used. */
1601 char const *lbl = "master secret";
1602
1603 /* The salt for the KDF used for key expansion.
1604 * - If the Extended Master Secret extension is not used,
1605 * this is ClientHello.Random + ServerHello.Random
1606 * (see Sect. 8.1 in RFC 5246).
1607 * - If the Extended Master Secret extension is used,
1608 * this is the transcript of the handshake so far.
1609 * (see Sect. 4 in RFC 7627). */
1610 unsigned char const *salt = handshake->randbytes;
1611 size_t salt_len = 64;
1612
1613 #if !defined(MBEDTLS_DEBUG_C) && \
1614 !defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \
1615 !(defined(MBEDTLS_USE_PSA_CRYPTO) && \
1616 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED))
1617 ssl = NULL; /* make sure we don't use it except for those cases */
1618 (void) ssl;
1619 #endif
1620
1621 if( handshake->resume != 0 )
1622 {
1623 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
1624 return( 0 );
1625 }
1626
1627 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1628 if( handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED )
1629 {
1630 lbl = "extended master secret";
1631 salt = session_hash;
1632 handshake->calc_verify( ssl, session_hash, &salt_len );
1633
1634 MBEDTLS_SSL_DEBUG_BUF( 3, "session hash for extended master secret",
1635 session_hash, salt_len );
1636 }
1637 #endif /* MBEDTLS_SSL_EXTENDED_MS_ENABLED */
1638
1639 #if defined(MBEDTLS_USE_PSA_CRYPTO) && \
1640 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
1641 if( handshake->ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK &&
1642 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
1643 ssl_use_opaque_psk( ssl ) == 1 )
1644 {
1645 /* Perform PSK-to-MS expansion in a single step. */
1646 psa_status_t status;
1647 psa_algorithm_t alg;
1648 psa_key_id_t psk;
1649 psa_key_derivation_operation_t derivation =
1650 PSA_KEY_DERIVATION_OPERATION_INIT;
1651 mbedtls_md_type_t hash_alg = handshake->ciphersuite_info->mac;
1652
1653 MBEDTLS_SSL_DEBUG_MSG( 2, ( "perform PSA-based PSK-to-MS expansion" ) );
1654
1655 psk = mbedtls_ssl_get_opaque_psk( ssl );
1656
1657 if( hash_alg == MBEDTLS_MD_SHA384 )
1658 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
1659 else
1660 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
1661
1662 status = setup_psa_key_derivation( &derivation, psk, alg,
1663 salt, salt_len,
1664 (unsigned char const *) lbl,
1665 (size_t) strlen( lbl ),
1666 master_secret_len );
1667 if( status != PSA_SUCCESS )
1668 {
1669 psa_key_derivation_abort( &derivation );
1670 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
1671 }
1672
1673 status = psa_key_derivation_output_bytes( &derivation,
1674 master,
1675 master_secret_len );
1676 if( status != PSA_SUCCESS )
1677 {
1678 psa_key_derivation_abort( &derivation );
1679 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
1680 }
1681
1682 status = psa_key_derivation_abort( &derivation );
1683 if( status != PSA_SUCCESS )
1684 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
1685 }
1686 else
1687 #endif
1688 {
1689 ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,
1690 lbl, salt, salt_len,
1691 master,
1692 master_secret_len );
1693 if( ret != 0 )
1694 {
1695 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret );
1696 return( ret );
1697 }
1698
1699 MBEDTLS_SSL_DEBUG_BUF( 3, "premaster secret",
1700 handshake->premaster,
1701 handshake->pmslen );
1702
1703 mbedtls_platform_zeroize( handshake->premaster,
1704 sizeof(handshake->premaster) );
1705 }
1706
1707 return( 0 );
1708 }
1709
mbedtls_ssl_derive_keys(mbedtls_ssl_context * ssl)1710 int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )
1711 {
1712 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1713 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
1714 ssl->handshake->ciphersuite_info;
1715
1716 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
1717
1718 /* Set PRF, calc_verify and calc_finished function pointers */
1719 ret = ssl_set_handshake_prfs( ssl->handshake,
1720 ssl->minor_ver,
1721 ciphersuite_info->mac );
1722 if( ret != 0 )
1723 {
1724 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_set_handshake_prfs", ret );
1725 return( ret );
1726 }
1727
1728 /* Compute master secret if needed */
1729 ret = ssl_compute_master( ssl->handshake,
1730 ssl->session_negotiate->master,
1731 ssl );
1732 if( ret != 0 )
1733 {
1734 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_compute_master", ret );
1735 return( ret );
1736 }
1737
1738 /* Swap the client and server random values:
1739 * - MS derivation wanted client+server (RFC 5246 8.1)
1740 * - key derivation wants server+client (RFC 5246 6.3) */
1741 {
1742 unsigned char tmp[64];
1743 memcpy( tmp, ssl->handshake->randbytes, 64 );
1744 memcpy( ssl->handshake->randbytes, tmp + 32, 32 );
1745 memcpy( ssl->handshake->randbytes + 32, tmp, 32 );
1746 mbedtls_platform_zeroize( tmp, sizeof( tmp ) );
1747 }
1748
1749 /* Populate transform structure */
1750 ret = ssl_populate_transform( ssl->transform_negotiate,
1751 ssl->session_negotiate->ciphersuite,
1752 ssl->session_negotiate->master,
1753 #if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
1754 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1755 ssl->session_negotiate->encrypt_then_mac,
1756 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
1757 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1758 ssl->session_negotiate->trunc_hmac,
1759 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
1760 #endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
1761 #if defined(MBEDTLS_ZLIB_SUPPORT)
1762 ssl->session_negotiate->compression,
1763 #endif
1764 ssl->handshake->tls_prf,
1765 ssl->handshake->randbytes,
1766 ssl->minor_ver,
1767 ssl->conf->endpoint,
1768 ssl );
1769 if( ret != 0 )
1770 {
1771 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_populate_transform", ret );
1772 return( ret );
1773 }
1774
1775 /* We no longer need Server/ClientHello.random values */
1776 mbedtls_platform_zeroize( ssl->handshake->randbytes,
1777 sizeof( ssl->handshake->randbytes ) );
1778
1779 /* Allocate compression buffer */
1780 #if defined(MBEDTLS_ZLIB_SUPPORT)
1781 if( ssl->session_negotiate->compression == MBEDTLS_SSL_COMPRESS_DEFLATE &&
1782 ssl->compress_buf == NULL )
1783 {
1784 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Allocating compression buffer" ) );
1785 ssl->compress_buf = mbedtls_calloc( 1, MBEDTLS_SSL_COMPRESS_BUFFER_LEN );
1786 if( ssl->compress_buf == NULL )
1787 {
1788 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
1789 MBEDTLS_SSL_COMPRESS_BUFFER_LEN ) );
1790 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
1791 }
1792 }
1793 #endif
1794
1795 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
1796
1797 return( 0 );
1798 }
1799
1800 #if defined(MBEDTLS_SSL_PROTO_SSL3)
ssl_calc_verify_ssl(const mbedtls_ssl_context * ssl,unsigned char * hash,size_t * hlen)1801 void ssl_calc_verify_ssl( const mbedtls_ssl_context *ssl,
1802 unsigned char *hash,
1803 size_t *hlen )
1804 {
1805 mbedtls_md5_context md5;
1806 mbedtls_sha1_context sha1;
1807 unsigned char pad_1[48];
1808 unsigned char pad_2[48];
1809
1810 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
1811
1812 mbedtls_md5_init( &md5 );
1813 mbedtls_sha1_init( &sha1 );
1814
1815 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
1816 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
1817
1818 memset( pad_1, 0x36, 48 );
1819 memset( pad_2, 0x5C, 48 );
1820
1821 mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 );
1822 mbedtls_md5_update_ret( &md5, pad_1, 48 );
1823 mbedtls_md5_finish_ret( &md5, hash );
1824
1825 mbedtls_md5_starts_ret( &md5 );
1826 mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 );
1827 mbedtls_md5_update_ret( &md5, pad_2, 48 );
1828 mbedtls_md5_update_ret( &md5, hash, 16 );
1829 mbedtls_md5_finish_ret( &md5, hash );
1830
1831 mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 );
1832 mbedtls_sha1_update_ret( &sha1, pad_1, 40 );
1833 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
1834
1835 mbedtls_sha1_starts_ret( &sha1 );
1836 mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 );
1837 mbedtls_sha1_update_ret( &sha1, pad_2, 40 );
1838 mbedtls_sha1_update_ret( &sha1, hash + 16, 20 );
1839 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
1840
1841 *hlen = 36;
1842
1843 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
1844 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
1845
1846 mbedtls_md5_free( &md5 );
1847 mbedtls_sha1_free( &sha1 );
1848
1849 return;
1850 }
1851 #endif /* MBEDTLS_SSL_PROTO_SSL3 */
1852
1853 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
ssl_calc_verify_tls(const mbedtls_ssl_context * ssl,unsigned char * hash,size_t * hlen)1854 void ssl_calc_verify_tls( const mbedtls_ssl_context *ssl,
1855 unsigned char *hash,
1856 size_t *hlen )
1857 {
1858 mbedtls_md5_context md5;
1859 mbedtls_sha1_context sha1;
1860
1861 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
1862
1863 mbedtls_md5_init( &md5 );
1864 mbedtls_sha1_init( &sha1 );
1865
1866 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
1867 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
1868
1869 mbedtls_md5_finish_ret( &md5, hash );
1870 mbedtls_sha1_finish_ret( &sha1, hash + 16 );
1871
1872 *hlen = 36;
1873
1874 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
1875 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
1876
1877 mbedtls_md5_free( &md5 );
1878 mbedtls_sha1_free( &sha1 );
1879
1880 return;
1881 }
1882 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
1883
1884 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1885 #if defined(MBEDTLS_SHA256_C)
ssl_calc_verify_tls_sha256(const mbedtls_ssl_context * ssl,unsigned char * hash,size_t * hlen)1886 void ssl_calc_verify_tls_sha256( const mbedtls_ssl_context *ssl,
1887 unsigned char *hash,
1888 size_t *hlen )
1889 {
1890 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1891 size_t hash_size;
1892 psa_status_t status;
1893 psa_hash_operation_t sha256_psa = psa_hash_operation_init();
1894
1895 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> PSA calc verify sha256" ) );
1896 status = psa_hash_clone( &ssl->handshake->fin_sha256_psa, &sha256_psa );
1897 if( status != PSA_SUCCESS )
1898 {
1899 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
1900 return;
1901 }
1902
1903 status = psa_hash_finish( &sha256_psa, hash, 32, &hash_size );
1904 if( status != PSA_SUCCESS )
1905 {
1906 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
1907 return;
1908 }
1909
1910 *hlen = 32;
1911 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated verify result", hash, *hlen );
1912 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= PSA calc verify" ) );
1913 #else
1914 mbedtls_sha256_context sha256;
1915
1916 mbedtls_sha256_init( &sha256 );
1917
1918 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
1919
1920 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
1921 mbedtls_sha256_finish_ret( &sha256, hash );
1922
1923 *hlen = 32;
1924
1925 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
1926 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
1927
1928 mbedtls_sha256_free( &sha256 );
1929 #endif /* MBEDTLS_USE_PSA_CRYPTO */
1930 return;
1931 }
1932 #endif /* MBEDTLS_SHA256_C */
1933
1934 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
ssl_calc_verify_tls_sha384(const mbedtls_ssl_context * ssl,unsigned char * hash,size_t * hlen)1935 void ssl_calc_verify_tls_sha384( const mbedtls_ssl_context *ssl,
1936 unsigned char *hash,
1937 size_t *hlen )
1938 {
1939 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1940 size_t hash_size;
1941 psa_status_t status;
1942 psa_hash_operation_t sha384_psa = psa_hash_operation_init();
1943
1944 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> PSA calc verify sha384" ) );
1945 status = psa_hash_clone( &ssl->handshake->fin_sha384_psa, &sha384_psa );
1946 if( status != PSA_SUCCESS )
1947 {
1948 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
1949 return;
1950 }
1951
1952 status = psa_hash_finish( &sha384_psa, hash, 48, &hash_size );
1953 if( status != PSA_SUCCESS )
1954 {
1955 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
1956 return;
1957 }
1958
1959 *hlen = 48;
1960 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated verify result", hash, *hlen );
1961 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= PSA calc verify" ) );
1962 #else
1963 mbedtls_sha512_context sha512;
1964
1965 mbedtls_sha512_init( &sha512 );
1966
1967 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
1968
1969 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
1970 mbedtls_sha512_finish_ret( &sha512, hash );
1971
1972 *hlen = 48;
1973
1974 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, *hlen );
1975 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
1976
1977 mbedtls_sha512_free( &sha512 );
1978 #endif /* MBEDTLS_USE_PSA_CRYPTO */
1979 return;
1980 }
1981 #endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */
1982 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
1983
1984 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
mbedtls_ssl_psk_derive_premaster(mbedtls_ssl_context * ssl,mbedtls_key_exchange_type_t key_ex)1985 int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex )
1986 {
1987 unsigned char *p = ssl->handshake->premaster;
1988 unsigned char *end = p + sizeof( ssl->handshake->premaster );
1989 const unsigned char *psk = NULL;
1990 size_t psk_len = 0;
1991
1992 if( mbedtls_ssl_get_psk( ssl, &psk, &psk_len )
1993 == MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED )
1994 {
1995 /*
1996 * This should never happen because the existence of a PSK is always
1997 * checked before calling this function
1998 */
1999 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2000 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2001 }
2002
2003 /*
2004 * PMS = struct {
2005 * opaque other_secret<0..2^16-1>;
2006 * opaque psk<0..2^16-1>;
2007 * };
2008 * with "other_secret" depending on the particular key exchange
2009 */
2010 #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
2011 if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK )
2012 {
2013 if( end - p < 2 )
2014 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2015
2016 MBEDTLS_PUT_UINT16_BE( psk_len, p, 0 );
2017 p += 2;
2018
2019 if( end < p || (size_t)( end - p ) < psk_len )
2020 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2021
2022 memset( p, 0, psk_len );
2023 p += psk_len;
2024 }
2025 else
2026 #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
2027 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
2028 if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2029 {
2030 /*
2031 * other_secret already set by the ClientKeyExchange message,
2032 * and is 48 bytes long
2033 */
2034 if( end - p < 2 )
2035 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2036
2037 *p++ = 0;
2038 *p++ = 48;
2039 p += 48;
2040 }
2041 else
2042 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
2043 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
2044 if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
2045 {
2046 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2047 size_t len;
2048
2049 /* Write length only when we know the actual value */
2050 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
2051 p + 2, end - ( p + 2 ), &len,
2052 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
2053 {
2054 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
2055 return( ret );
2056 }
2057 MBEDTLS_PUT_UINT16_BE( len, p, 0 );
2058 p += 2 + len;
2059
2060 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
2061 }
2062 else
2063 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
2064 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2065 if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
2066 {
2067 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2068 size_t zlen;
2069
2070 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen,
2071 p + 2, end - ( p + 2 ),
2072 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
2073 {
2074 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
2075 return( ret );
2076 }
2077
2078 MBEDTLS_PUT_UINT16_BE( zlen, p, 0 );
2079 p += 2 + zlen;
2080
2081 MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
2082 MBEDTLS_DEBUG_ECDH_Z );
2083 }
2084 else
2085 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
2086 {
2087 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2088 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2089 }
2090
2091 /* opaque psk<0..2^16-1>; */
2092 if( end - p < 2 )
2093 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2094
2095 MBEDTLS_PUT_UINT16_BE( psk_len, p, 0 );
2096 p += 2;
2097
2098 if( end < p || (size_t)( end - p ) < psk_len )
2099 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
2100
2101 memcpy( p, psk, psk_len );
2102 p += psk_len;
2103
2104 ssl->handshake->pmslen = p - ssl->handshake->premaster;
2105
2106 return( 0 );
2107 }
2108 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
2109
2110 #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
2111 static int ssl_write_hello_request( mbedtls_ssl_context *ssl );
2112
2113 #if defined(MBEDTLS_SSL_PROTO_DTLS)
mbedtls_ssl_resend_hello_request(mbedtls_ssl_context * ssl)2114 int mbedtls_ssl_resend_hello_request( mbedtls_ssl_context *ssl )
2115 {
2116 /* If renegotiation is not enforced, retransmit until we would reach max
2117 * timeout if we were using the usual handshake doubling scheme */
2118 if( ssl->conf->renego_max_records < 0 )
2119 {
2120 uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1;
2121 unsigned char doublings = 1;
2122
2123 while( ratio != 0 )
2124 {
2125 ++doublings;
2126 ratio >>= 1;
2127 }
2128
2129 if( ++ssl->renego_records_seen > doublings )
2130 {
2131 MBEDTLS_SSL_DEBUG_MSG( 2, ( "no longer retransmitting hello request" ) );
2132 return( 0 );
2133 }
2134 }
2135
2136 return( ssl_write_hello_request( ssl ) );
2137 }
2138 #endif
2139 #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
2140
2141 #if defined(MBEDTLS_X509_CRT_PARSE_C)
ssl_clear_peer_cert(mbedtls_ssl_session * session)2142 static void ssl_clear_peer_cert( mbedtls_ssl_session *session )
2143 {
2144 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2145 if( session->peer_cert != NULL )
2146 {
2147 mbedtls_x509_crt_free( session->peer_cert );
2148 mbedtls_free( session->peer_cert );
2149 session->peer_cert = NULL;
2150 }
2151 #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2152 if( session->peer_cert_digest != NULL )
2153 {
2154 /* Zeroization is not necessary. */
2155 mbedtls_free( session->peer_cert_digest );
2156 session->peer_cert_digest = NULL;
2157 session->peer_cert_digest_type = MBEDTLS_MD_NONE;
2158 session->peer_cert_digest_len = 0;
2159 }
2160 #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2161 }
2162 #endif /* MBEDTLS_X509_CRT_PARSE_C */
2163
2164 /*
2165 * Handshake functions
2166 */
2167 #if !defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
2168 /* No certificate support -> dummy functions */
mbedtls_ssl_write_certificate(mbedtls_ssl_context * ssl)2169 int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
2170 {
2171 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2172 ssl->handshake->ciphersuite_info;
2173
2174 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
2175
2176 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
2177 {
2178 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2179 ssl->state++;
2180 return( 0 );
2181 }
2182
2183 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2184 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2185 }
2186
mbedtls_ssl_parse_certificate(mbedtls_ssl_context * ssl)2187 int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
2188 {
2189 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2190 ssl->handshake->ciphersuite_info;
2191
2192 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2193
2194 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
2195 {
2196 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2197 ssl->state++;
2198 return( 0 );
2199 }
2200
2201 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2202 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2203 }
2204
2205 #else /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
2206 /* Some certificate support -> implement write and parse */
2207
mbedtls_ssl_write_certificate(mbedtls_ssl_context * ssl)2208 int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )
2209 {
2210 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
2211 size_t i, n;
2212 const mbedtls_x509_crt *crt;
2213 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2214 ssl->handshake->ciphersuite_info;
2215
2216 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
2217
2218 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
2219 {
2220 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2221 ssl->state++;
2222 return( 0 );
2223 }
2224
2225 #if defined(MBEDTLS_SSL_CLI_C)
2226 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
2227 {
2228 if( ssl->client_auth == 0 )
2229 {
2230 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2231 ssl->state++;
2232 return( 0 );
2233 }
2234
2235 #if defined(MBEDTLS_SSL_PROTO_SSL3)
2236 /*
2237 * If using SSLv3 and got no cert, send an Alert message
2238 * (otherwise an empty Certificate message will be sent).
2239 */
2240 if( mbedtls_ssl_own_cert( ssl ) == NULL &&
2241 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
2242 {
2243 ssl->out_msglen = 2;
2244 ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT;
2245 ssl->out_msg[0] = MBEDTLS_SSL_ALERT_LEVEL_WARNING;
2246 ssl->out_msg[1] = MBEDTLS_SSL_ALERT_MSG_NO_CERT;
2247
2248 MBEDTLS_SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
2249 goto write_msg;
2250 }
2251 #endif /* MBEDTLS_SSL_PROTO_SSL3 */
2252 }
2253 #endif /* MBEDTLS_SSL_CLI_C */
2254 #if defined(MBEDTLS_SSL_SRV_C)
2255 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
2256 {
2257 if( mbedtls_ssl_own_cert( ssl ) == NULL )
2258 {
2259 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
2260 return( MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED );
2261 }
2262 }
2263 #endif
2264
2265 MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", mbedtls_ssl_own_cert( ssl ) );
2266
2267 /*
2268 * 0 . 0 handshake type
2269 * 1 . 3 handshake length
2270 * 4 . 6 length of all certs
2271 * 7 . 9 length of cert. 1
2272 * 10 . n-1 peer certificate
2273 * n . n+2 length of cert. 2
2274 * n+3 . ... upper level cert, etc.
2275 */
2276 i = 7;
2277 crt = mbedtls_ssl_own_cert( ssl );
2278
2279 while( crt != NULL )
2280 {
2281 n = crt->raw.len;
2282 if( n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i )
2283 {
2284 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate too large, %" MBEDTLS_PRINTF_SIZET
2285 " > %" MBEDTLS_PRINTF_SIZET,
2286 i + 3 + n, (size_t) MBEDTLS_SSL_OUT_CONTENT_LEN ) );
2287 return( MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE );
2288 }
2289
2290 ssl->out_msg[i ] = MBEDTLS_BYTE_2( n );
2291 ssl->out_msg[i + 1] = MBEDTLS_BYTE_1( n );
2292 ssl->out_msg[i + 2] = MBEDTLS_BYTE_0( n );
2293
2294 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
2295 i += n; crt = crt->next;
2296 }
2297
2298 ssl->out_msg[4] = MBEDTLS_BYTE_2( i - 7 );
2299 ssl->out_msg[5] = MBEDTLS_BYTE_1( i - 7 );
2300 ssl->out_msg[6] = MBEDTLS_BYTE_0( i - 7 );
2301
2302 ssl->out_msglen = i;
2303 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2304 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE;
2305
2306 #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C)
2307 write_msg:
2308 #endif
2309
2310 ssl->state++;
2311
2312 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
2313 {
2314 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
2315 return( ret );
2316 }
2317
2318 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
2319
2320 return( ret );
2321 }
2322
2323 #if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
2324
2325 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
ssl_check_peer_crt_unchanged(mbedtls_ssl_context * ssl,unsigned char * crt_buf,size_t crt_buf_len)2326 static int ssl_check_peer_crt_unchanged( mbedtls_ssl_context *ssl,
2327 unsigned char *crt_buf,
2328 size_t crt_buf_len )
2329 {
2330 mbedtls_x509_crt const * const peer_crt = ssl->session->peer_cert;
2331
2332 if( peer_crt == NULL )
2333 return( -1 );
2334
2335 if( peer_crt->raw.len != crt_buf_len )
2336 return( -1 );
2337
2338 return( memcmp( peer_crt->raw.p, crt_buf, peer_crt->raw.len ) );
2339 }
2340 #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
ssl_check_peer_crt_unchanged(mbedtls_ssl_context * ssl,unsigned char * crt_buf,size_t crt_buf_len)2341 static int ssl_check_peer_crt_unchanged( mbedtls_ssl_context *ssl,
2342 unsigned char *crt_buf,
2343 size_t crt_buf_len )
2344 {
2345 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2346 unsigned char const * const peer_cert_digest =
2347 ssl->session->peer_cert_digest;
2348 mbedtls_md_type_t const peer_cert_digest_type =
2349 ssl->session->peer_cert_digest_type;
2350 mbedtls_md_info_t const * const digest_info =
2351 mbedtls_md_info_from_type( peer_cert_digest_type );
2352 unsigned char tmp_digest[MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN];
2353 size_t digest_len;
2354
2355 if( peer_cert_digest == NULL || digest_info == NULL )
2356 return( -1 );
2357
2358 digest_len = mbedtls_md_get_size( digest_info );
2359 if( digest_len > MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN )
2360 return( -1 );
2361
2362 ret = mbedtls_md( digest_info, crt_buf, crt_buf_len, tmp_digest );
2363 if( ret != 0 )
2364 return( -1 );
2365
2366 return( memcmp( tmp_digest, peer_cert_digest, digest_len ) );
2367 }
2368 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2369 #endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
2370
2371 /*
2372 * Once the certificate message is read, parse it into a cert chain and
2373 * perform basic checks, but leave actual verification to the caller
2374 */
ssl_parse_certificate_chain(mbedtls_ssl_context * ssl,mbedtls_x509_crt * chain)2375 static int ssl_parse_certificate_chain( mbedtls_ssl_context *ssl,
2376 mbedtls_x509_crt *chain )
2377 {
2378 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2379 #if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
2380 int crt_cnt=0;
2381 #endif
2382 size_t i, n;
2383 uint8_t alert;
2384
2385 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
2386 {
2387 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
2388 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2389 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
2390 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2391 }
2392
2393 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE ||
2394 ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 )
2395 {
2396 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
2397 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2398 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
2399 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
2400 }
2401
2402 i = mbedtls_ssl_hs_hdr_len( ssl );
2403
2404 /*
2405 * Same message structure as in mbedtls_ssl_write_certificate()
2406 */
2407 n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2];
2408
2409 if( ssl->in_msg[i] != 0 ||
2410 ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) )
2411 {
2412 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
2413 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2414 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
2415 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
2416 }
2417
2418 /* Make &ssl->in_msg[i] point to the beginning of the CRT chain. */
2419 i += 3;
2420
2421 /* Iterate through and parse the CRTs in the provided chain. */
2422 while( i < ssl->in_hslen )
2423 {
2424 /* Check that there's room for the next CRT's length fields. */
2425 if ( i + 3 > ssl->in_hslen ) {
2426 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
2427 mbedtls_ssl_send_alert_message( ssl,
2428 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2429 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
2430 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
2431 }
2432 /* In theory, the CRT can be up to 2**24 Bytes, but we don't support
2433 * anything beyond 2**16 ~ 64K. */
2434 if( ssl->in_msg[i] != 0 )
2435 {
2436 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
2437 mbedtls_ssl_send_alert_message( ssl,
2438 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2439 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
2440 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
2441 }
2442
2443 /* Read length of the next CRT in the chain. */
2444 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2445 | (unsigned int) ssl->in_msg[i + 2];
2446 i += 3;
2447
2448 if( n < 128 || i + n > ssl->in_hslen )
2449 {
2450 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
2451 mbedtls_ssl_send_alert_message( ssl,
2452 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2453 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
2454 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
2455 }
2456
2457 /* Check if we're handling the first CRT in the chain. */
2458 #if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
2459 if( crt_cnt++ == 0 &&
2460 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
2461 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
2462 {
2463 /* During client-side renegotiation, check that the server's
2464 * end-CRTs hasn't changed compared to the initial handshake,
2465 * mitigating the triple handshake attack. On success, reuse
2466 * the original end-CRT instead of parsing it again. */
2467 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Check that peer CRT hasn't changed during renegotiation" ) );
2468 if( ssl_check_peer_crt_unchanged( ssl,
2469 &ssl->in_msg[i],
2470 n ) != 0 )
2471 {
2472 MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) );
2473 mbedtls_ssl_send_alert_message( ssl,
2474 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2475 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED );
2476 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
2477 }
2478
2479 /* Now we can safely free the original chain. */
2480 ssl_clear_peer_cert( ssl->session );
2481 }
2482 #endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
2483
2484 /* Parse the next certificate in the chain. */
2485 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2486 ret = mbedtls_x509_crt_parse_der( chain, ssl->in_msg + i, n );
2487 #else
2488 /* If we don't need to store the CRT chain permanently, parse
2489 * it in-place from the input buffer instead of making a copy. */
2490 ret = mbedtls_x509_crt_parse_der_nocopy( chain, ssl->in_msg + i, n );
2491 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2492 switch( ret )
2493 {
2494 case 0: /*ok*/
2495 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
2496 /* Ignore certificate with an unknown algorithm: maybe a
2497 prior certificate was already trusted. */
2498 break;
2499
2500 case MBEDTLS_ERR_X509_ALLOC_FAILED:
2501 alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR;
2502 goto crt_parse_der_failed;
2503
2504 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
2505 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2506 goto crt_parse_der_failed;
2507
2508 default:
2509 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
2510 crt_parse_der_failed:
2511 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert );
2512 MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret );
2513 return( ret );
2514 }
2515
2516 i += n;
2517 }
2518
2519 MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", chain );
2520 return( 0 );
2521 }
2522
2523 #if defined(MBEDTLS_SSL_SRV_C)
ssl_srv_check_client_no_crt_notification(mbedtls_ssl_context * ssl)2524 static int ssl_srv_check_client_no_crt_notification( mbedtls_ssl_context *ssl )
2525 {
2526 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
2527 return( -1 );
2528
2529 #if defined(MBEDTLS_SSL_PROTO_SSL3)
2530 /*
2531 * Check if the client sent an empty certificate
2532 */
2533 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
2534 {
2535 if( ssl->in_msglen == 2 &&
2536 ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT &&
2537 ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&
2538 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT )
2539 {
2540 MBEDTLS_SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2541 return( 0 );
2542 }
2543
2544 return( -1 );
2545 }
2546 #endif /* MBEDTLS_SSL_PROTO_SSL3 */
2547
2548 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2549 defined(MBEDTLS_SSL_PROTO_TLS1_2)
2550 if( ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len( ssl ) &&
2551 ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
2552 ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE &&
2553 memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), "\0\0\0", 3 ) == 0 )
2554 {
2555 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2556 return( 0 );
2557 }
2558
2559 return( -1 );
2560 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
2561 MBEDTLS_SSL_PROTO_TLS1_2 */
2562 }
2563 #endif /* MBEDTLS_SSL_SRV_C */
2564
2565 /* Check if a certificate message is expected.
2566 * Return either
2567 * - SSL_CERTIFICATE_EXPECTED, or
2568 * - SSL_CERTIFICATE_SKIP
2569 * indicating whether a Certificate message is expected or not.
2570 */
2571 #define SSL_CERTIFICATE_EXPECTED 0
2572 #define SSL_CERTIFICATE_SKIP 1
ssl_parse_certificate_coordinate(mbedtls_ssl_context * ssl,int authmode)2573 static int ssl_parse_certificate_coordinate( mbedtls_ssl_context *ssl,
2574 int authmode )
2575 {
2576 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2577 ssl->handshake->ciphersuite_info;
2578
2579 if( !mbedtls_ssl_ciphersuite_uses_srv_cert( ciphersuite_info ) )
2580 return( SSL_CERTIFICATE_SKIP );
2581
2582 #if defined(MBEDTLS_SSL_SRV_C)
2583 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
2584 {
2585 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2586 return( SSL_CERTIFICATE_SKIP );
2587
2588 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
2589 {
2590 ssl->session_negotiate->verify_result =
2591 MBEDTLS_X509_BADCERT_SKIP_VERIFY;
2592 return( SSL_CERTIFICATE_SKIP );
2593 }
2594 }
2595 #else
2596 ((void) authmode);
2597 #endif /* MBEDTLS_SSL_SRV_C */
2598
2599 return( SSL_CERTIFICATE_EXPECTED );
2600 }
2601
ssl_parse_certificate_verify(mbedtls_ssl_context * ssl,int authmode,mbedtls_x509_crt * chain,void * rs_ctx)2602 static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl,
2603 int authmode,
2604 mbedtls_x509_crt *chain,
2605 void *rs_ctx )
2606 {
2607 int ret = 0;
2608 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2609 ssl->handshake->ciphersuite_info;
2610 int have_ca_chain = 0;
2611
2612 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *);
2613 void *p_vrfy;
2614
2615 if( authmode == MBEDTLS_SSL_VERIFY_NONE )
2616 return( 0 );
2617
2618 if( ssl->f_vrfy != NULL )
2619 {
2620 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use context-specific verification callback" ) );
2621 f_vrfy = ssl->f_vrfy;
2622 p_vrfy = ssl->p_vrfy;
2623 }
2624 else
2625 {
2626 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use configuration-specific verification callback" ) );
2627 f_vrfy = ssl->conf->f_vrfy;
2628 p_vrfy = ssl->conf->p_vrfy;
2629 }
2630
2631 /*
2632 * Main check: verify certificate
2633 */
2634 #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
2635 if( ssl->conf->f_ca_cb != NULL )
2636 {
2637 ((void) rs_ctx);
2638 have_ca_chain = 1;
2639
2640 MBEDTLS_SSL_DEBUG_MSG( 3, ( "use CA callback for X.509 CRT verification" ) );
2641 ret = mbedtls_x509_crt_verify_with_ca_cb(
2642 chain,
2643 ssl->conf->f_ca_cb,
2644 ssl->conf->p_ca_cb,
2645 ssl->conf->cert_profile,
2646 ssl->hostname,
2647 &ssl->session_negotiate->verify_result,
2648 f_vrfy, p_vrfy );
2649 }
2650 else
2651 #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
2652 {
2653 mbedtls_x509_crt *ca_chain;
2654 mbedtls_x509_crl *ca_crl;
2655
2656 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2657 if( ssl->handshake->sni_ca_chain != NULL )
2658 {
2659 ca_chain = ssl->handshake->sni_ca_chain;
2660 ca_crl = ssl->handshake->sni_ca_crl;
2661 }
2662 else
2663 #endif
2664 {
2665 ca_chain = ssl->conf->ca_chain;
2666 ca_crl = ssl->conf->ca_crl;
2667 }
2668
2669 if( ca_chain != NULL )
2670 have_ca_chain = 1;
2671
2672 ret = mbedtls_x509_crt_verify_restartable(
2673 chain,
2674 ca_chain, ca_crl,
2675 ssl->conf->cert_profile,
2676 ssl->hostname,
2677 &ssl->session_negotiate->verify_result,
2678 f_vrfy, p_vrfy, rs_ctx );
2679 }
2680
2681 if( ret != 0 )
2682 {
2683 MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2684 }
2685
2686 #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2687 if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
2688 return( MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS );
2689 #endif
2690
2691 /*
2692 * Secondary checks: always done, but change 'ret' only if it was 0
2693 */
2694
2695 #if defined(MBEDTLS_ECP_C)
2696 {
2697 const mbedtls_pk_context *pk = &chain->pk;
2698
2699 /* If certificate uses an EC key, make sure the curve is OK */
2700 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) &&
2701 mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 )
2702 {
2703 ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY;
2704
2705 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) );
2706 if( ret == 0 )
2707 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
2708 }
2709 }
2710 #endif /* MBEDTLS_ECP_C */
2711
2712 if( mbedtls_ssl_check_cert_usage( chain,
2713 ciphersuite_info,
2714 ! ssl->conf->endpoint,
2715 &ssl->session_negotiate->verify_result ) != 0 )
2716 {
2717 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) );
2718 if( ret == 0 )
2719 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;
2720 }
2721
2722 /* mbedtls_x509_crt_verify_with_profile is supposed to report a
2723 * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
2724 * with details encoded in the verification flags. All other kinds
2725 * of error codes, including those from the user provided f_vrfy
2726 * functions, are treated as fatal and lead to a failure of
2727 * ssl_parse_certificate even if verification was optional. */
2728 if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
2729 ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
2730 ret == MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ) )
2731 {
2732 ret = 0;
2733 }
2734
2735 if( have_ca_chain == 0 && authmode == MBEDTLS_SSL_VERIFY_REQUIRED )
2736 {
2737 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
2738 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
2739 }
2740
2741 if( ret != 0 )
2742 {
2743 uint8_t alert;
2744
2745 /* The certificate may have been rejected for several reasons.
2746 Pick one and send the corresponding alert. Which alert to send
2747 may be a subject of debate in some cases. */
2748 if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER )
2749 alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED;
2750 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH )
2751 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
2752 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE )
2753 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2754 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE )
2755 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2756 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE )
2757 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2758 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK )
2759 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2760 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY )
2761 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
2762 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED )
2763 alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED;
2764 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED )
2765 alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED;
2766 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED )
2767 alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA;
2768 else
2769 alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN;
2770 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2771 alert );
2772 }
2773
2774 #if defined(MBEDTLS_DEBUG_C)
2775 if( ssl->session_negotiate->verify_result != 0 )
2776 {
2777 MBEDTLS_SSL_DEBUG_MSG( 3, ( "! Certificate verification flags %08x",
2778 (unsigned int) ssl->session_negotiate->verify_result ) );
2779 }
2780 else
2781 {
2782 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate verification flags clear" ) );
2783 }
2784 #endif /* MBEDTLS_DEBUG_C */
2785
2786 return( ret );
2787 }
2788
2789 #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
ssl_remember_peer_crt_digest(mbedtls_ssl_context * ssl,unsigned char * start,size_t len)2790 static int ssl_remember_peer_crt_digest( mbedtls_ssl_context *ssl,
2791 unsigned char *start, size_t len )
2792 {
2793 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2794 /* Remember digest of the peer's end-CRT. */
2795 ssl->session_negotiate->peer_cert_digest =
2796 mbedtls_calloc( 1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN );
2797 if( ssl->session_negotiate->peer_cert_digest == NULL )
2798 {
2799 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed",
2800 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN ) );
2801 mbedtls_ssl_send_alert_message( ssl,
2802 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2803 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
2804
2805 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
2806 }
2807
2808 ret = mbedtls_md( mbedtls_md_info_from_type(
2809 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE ),
2810 start, len,
2811 ssl->session_negotiate->peer_cert_digest );
2812
2813 ssl->session_negotiate->peer_cert_digest_type =
2814 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
2815 ssl->session_negotiate->peer_cert_digest_len =
2816 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
2817
2818 return( ret );
2819 }
2820
ssl_remember_peer_pubkey(mbedtls_ssl_context * ssl,unsigned char * start,size_t len)2821 static int ssl_remember_peer_pubkey( mbedtls_ssl_context *ssl,
2822 unsigned char *start, size_t len )
2823 {
2824 unsigned char *end = start + len;
2825 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2826
2827 /* Make a copy of the peer's raw public key. */
2828 mbedtls_pk_init( &ssl->handshake->peer_pubkey );
2829 ret = mbedtls_pk_parse_subpubkey( &start, end,
2830 &ssl->handshake->peer_pubkey );
2831 if( ret != 0 )
2832 {
2833 /* We should have parsed the public key before. */
2834 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2835 }
2836
2837 return( 0 );
2838 }
2839 #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2840
mbedtls_ssl_parse_certificate(mbedtls_ssl_context * ssl)2841 int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )
2842 {
2843 int ret = 0;
2844 int crt_expected;
2845 #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2846 const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET
2847 ? ssl->handshake->sni_authmode
2848 : ssl->conf->authmode;
2849 #else
2850 const int authmode = ssl->conf->authmode;
2851 #endif
2852 void *rs_ctx = NULL;
2853 mbedtls_x509_crt *chain = NULL;
2854
2855 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2856
2857 crt_expected = ssl_parse_certificate_coordinate( ssl, authmode );
2858 if( crt_expected == SSL_CERTIFICATE_SKIP )
2859 {
2860 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2861 goto exit;
2862 }
2863
2864 #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2865 if( ssl->handshake->ecrs_enabled &&
2866 ssl->handshake->ecrs_state == ssl_ecrs_crt_verify )
2867 {
2868 chain = ssl->handshake->ecrs_peer_cert;
2869 ssl->handshake->ecrs_peer_cert = NULL;
2870 goto crt_verify;
2871 }
2872 #endif
2873
2874 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
2875 {
2876 /* mbedtls_ssl_read_record may have sent an alert already. We
2877 let it decide whether to alert. */
2878 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
2879 goto exit;
2880 }
2881
2882 #if defined(MBEDTLS_SSL_SRV_C)
2883 if( ssl_srv_check_client_no_crt_notification( ssl ) == 0 )
2884 {
2885 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
2886
2887 if( authmode != MBEDTLS_SSL_VERIFY_OPTIONAL )
2888 ret = MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
2889
2890 goto exit;
2891 }
2892 #endif /* MBEDTLS_SSL_SRV_C */
2893
2894 /* Clear existing peer CRT structure in case we tried to
2895 * reuse a session but it failed, and allocate a new one. */
2896 ssl_clear_peer_cert( ssl->session_negotiate );
2897
2898 chain = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
2899 if( chain == NULL )
2900 {
2901 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed",
2902 sizeof( mbedtls_x509_crt ) ) );
2903 mbedtls_ssl_send_alert_message( ssl,
2904 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2905 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
2906
2907 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
2908 goto exit;
2909 }
2910 mbedtls_x509_crt_init( chain );
2911
2912 ret = ssl_parse_certificate_chain( ssl, chain );
2913 if( ret != 0 )
2914 goto exit;
2915
2916 #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2917 if( ssl->handshake->ecrs_enabled)
2918 ssl->handshake->ecrs_state = ssl_ecrs_crt_verify;
2919
2920 crt_verify:
2921 if( ssl->handshake->ecrs_enabled)
2922 rs_ctx = &ssl->handshake->ecrs_ctx;
2923 #endif
2924
2925 ret = ssl_parse_certificate_verify( ssl, authmode,
2926 chain, rs_ctx );
2927 if( ret != 0 )
2928 goto exit;
2929
2930 #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2931 {
2932 unsigned char *crt_start, *pk_start;
2933 size_t crt_len, pk_len;
2934
2935 /* We parse the CRT chain without copying, so
2936 * these pointers point into the input buffer,
2937 * and are hence still valid after freeing the
2938 * CRT chain. */
2939
2940 crt_start = chain->raw.p;
2941 crt_len = chain->raw.len;
2942
2943 pk_start = chain->pk_raw.p;
2944 pk_len = chain->pk_raw.len;
2945
2946 /* Free the CRT structures before computing
2947 * digest and copying the peer's public key. */
2948 mbedtls_x509_crt_free( chain );
2949 mbedtls_free( chain );
2950 chain = NULL;
2951
2952 ret = ssl_remember_peer_crt_digest( ssl, crt_start, crt_len );
2953 if( ret != 0 )
2954 goto exit;
2955
2956 ret = ssl_remember_peer_pubkey( ssl, pk_start, pk_len );
2957 if( ret != 0 )
2958 goto exit;
2959 }
2960 #else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2961 /* Pass ownership to session structure. */
2962 ssl->session_negotiate->peer_cert = chain;
2963 chain = NULL;
2964 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2965
2966 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
2967
2968 exit:
2969
2970 if( ret == 0 )
2971 ssl->state++;
2972
2973 #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2974 if( ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS )
2975 {
2976 ssl->handshake->ecrs_peer_cert = chain;
2977 chain = NULL;
2978 }
2979 #endif
2980
2981 if( chain != NULL )
2982 {
2983 mbedtls_x509_crt_free( chain );
2984 mbedtls_free( chain );
2985 }
2986
2987 return( ret );
2988 }
2989 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
2990
mbedtls_ssl_optimize_checksum(mbedtls_ssl_context * ssl,const mbedtls_ssl_ciphersuite_t * ciphersuite_info)2991 void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl,
2992 const mbedtls_ssl_ciphersuite_t *ciphersuite_info )
2993 {
2994 ((void) ciphersuite_info);
2995
2996 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2997 defined(MBEDTLS_SSL_PROTO_TLS1_1)
2998 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
2999 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
3000 else
3001 #endif
3002 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3003 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
3004 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
3005 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
3006 else
3007 #endif
3008 #if defined(MBEDTLS_SHA256_C)
3009 if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 )
3010 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
3011 else
3012 #endif
3013 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3014 {
3015 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3016 return;
3017 }
3018 }
3019
mbedtls_ssl_reset_checksum(mbedtls_ssl_context * ssl)3020 void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl )
3021 {
3022 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3023 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3024 mbedtls_md5_starts_ret( &ssl->handshake->fin_md5 );
3025 mbedtls_sha1_starts_ret( &ssl->handshake->fin_sha1 );
3026 #endif
3027 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3028 #if defined(MBEDTLS_SHA256_C)
3029 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3030 psa_hash_abort( &ssl->handshake->fin_sha256_psa );
3031 psa_hash_setup( &ssl->handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
3032 #else
3033 mbedtls_sha256_starts_ret( &ssl->handshake->fin_sha256, 0 );
3034 #endif
3035 #endif
3036 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
3037 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3038 psa_hash_abort( &ssl->handshake->fin_sha384_psa );
3039 psa_hash_setup( &ssl->handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
3040 #else
3041 mbedtls_sha512_starts_ret( &ssl->handshake->fin_sha512, 1 );
3042 #endif
3043 #endif
3044 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3045 }
3046
ssl_update_checksum_start(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)3047 static void ssl_update_checksum_start( mbedtls_ssl_context *ssl,
3048 const unsigned char *buf, size_t len )
3049 {
3050 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3051 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3052 mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len );
3053 mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len );
3054 #endif
3055 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3056 #if defined(MBEDTLS_SHA256_C)
3057 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3058 psa_hash_update( &ssl->handshake->fin_sha256_psa, buf, len );
3059 #else
3060 mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len );
3061 #endif
3062 #endif
3063 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
3064 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3065 psa_hash_update( &ssl->handshake->fin_sha384_psa, buf, len );
3066 #else
3067 mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len );
3068 #endif
3069 #endif
3070 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3071 }
3072
3073 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3074 defined(MBEDTLS_SSL_PROTO_TLS1_1)
ssl_update_checksum_md5sha1(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)3075 static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *ssl,
3076 const unsigned char *buf, size_t len )
3077 {
3078 mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len );
3079 mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len );
3080 }
3081 #endif
3082
3083 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3084 #if defined(MBEDTLS_SHA256_C)
ssl_update_checksum_sha256(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)3085 static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl,
3086 const unsigned char *buf, size_t len )
3087 {
3088 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3089 psa_hash_update( &ssl->handshake->fin_sha256_psa, buf, len );
3090 #else
3091 mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len );
3092 #endif
3093 }
3094 #endif
3095
3096 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
ssl_update_checksum_sha384(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)3097 static void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl,
3098 const unsigned char *buf, size_t len )
3099 {
3100 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3101 psa_hash_update( &ssl->handshake->fin_sha384_psa, buf, len );
3102 #else
3103 mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len );
3104 #endif
3105 }
3106 #endif
3107 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3108
3109 #if defined(MBEDTLS_SSL_PROTO_SSL3)
ssl_calc_finished_ssl(mbedtls_ssl_context * ssl,unsigned char * buf,int from)3110 static void ssl_calc_finished_ssl(
3111 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
3112 {
3113 const char *sender;
3114 mbedtls_md5_context md5;
3115 mbedtls_sha1_context sha1;
3116
3117 unsigned char padbuf[48];
3118 unsigned char md5sum[16];
3119 unsigned char sha1sum[20];
3120
3121 mbedtls_ssl_session *session = ssl->session_negotiate;
3122 if( !session )
3123 session = ssl->session;
3124
3125 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
3126
3127 mbedtls_md5_init( &md5 );
3128 mbedtls_sha1_init( &sha1 );
3129
3130 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
3131 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
3132
3133 /*
3134 * SSLv3:
3135 * hash =
3136 * MD5( master + pad2 +
3137 * MD5( handshake + sender + master + pad1 ) )
3138 * + SHA1( master + pad2 +
3139 * SHA1( handshake + sender + master + pad1 ) )
3140 */
3141
3142 #if !defined(MBEDTLS_MD5_ALT)
3143 MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
3144 md5.state, sizeof( md5.state ) );
3145 #endif
3146
3147 #if !defined(MBEDTLS_SHA1_ALT)
3148 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
3149 sha1.state, sizeof( sha1.state ) );
3150 #endif
3151
3152 sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "CLNT"
3153 : "SRVR";
3154
3155 memset( padbuf, 0x36, 48 );
3156
3157 mbedtls_md5_update_ret( &md5, (const unsigned char *) sender, 4 );
3158 mbedtls_md5_update_ret( &md5, session->master, 48 );
3159 mbedtls_md5_update_ret( &md5, padbuf, 48 );
3160 mbedtls_md5_finish_ret( &md5, md5sum );
3161
3162 mbedtls_sha1_update_ret( &sha1, (const unsigned char *) sender, 4 );
3163 mbedtls_sha1_update_ret( &sha1, session->master, 48 );
3164 mbedtls_sha1_update_ret( &sha1, padbuf, 40 );
3165 mbedtls_sha1_finish_ret( &sha1, sha1sum );
3166
3167 memset( padbuf, 0x5C, 48 );
3168
3169 mbedtls_md5_starts_ret( &md5 );
3170 mbedtls_md5_update_ret( &md5, session->master, 48 );
3171 mbedtls_md5_update_ret( &md5, padbuf, 48 );
3172 mbedtls_md5_update_ret( &md5, md5sum, 16 );
3173 mbedtls_md5_finish_ret( &md5, buf );
3174
3175 mbedtls_sha1_starts_ret( &sha1 );
3176 mbedtls_sha1_update_ret( &sha1, session->master, 48 );
3177 mbedtls_sha1_update_ret( &sha1, padbuf , 40 );
3178 mbedtls_sha1_update_ret( &sha1, sha1sum, 20 );
3179 mbedtls_sha1_finish_ret( &sha1, buf + 16 );
3180
3181 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
3182
3183 mbedtls_md5_free( &md5 );
3184 mbedtls_sha1_free( &sha1 );
3185
3186 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
3187 mbedtls_platform_zeroize( md5sum, sizeof( md5sum ) );
3188 mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) );
3189
3190 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
3191 }
3192 #endif /* MBEDTLS_SSL_PROTO_SSL3 */
3193
3194 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
ssl_calc_finished_tls(mbedtls_ssl_context * ssl,unsigned char * buf,int from)3195 static void ssl_calc_finished_tls(
3196 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
3197 {
3198 int len = 12;
3199 const char *sender;
3200 mbedtls_md5_context md5;
3201 mbedtls_sha1_context sha1;
3202 unsigned char padbuf[36];
3203
3204 mbedtls_ssl_session *session = ssl->session_negotiate;
3205 if( !session )
3206 session = ssl->session;
3207
3208 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
3209
3210 mbedtls_md5_init( &md5 );
3211 mbedtls_sha1_init( &sha1 );
3212
3213 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );
3214 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );
3215
3216 /*
3217 * TLSv1:
3218 * hash = PRF( master, finished_label,
3219 * MD5( handshake ) + SHA1( handshake ) )[0..11]
3220 */
3221
3222 #if !defined(MBEDTLS_MD5_ALT)
3223 MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
3224 md5.state, sizeof( md5.state ) );
3225 #endif
3226
3227 #if !defined(MBEDTLS_SHA1_ALT)
3228 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
3229 sha1.state, sizeof( sha1.state ) );
3230 #endif
3231
3232 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
3233 ? "client finished"
3234 : "server finished";
3235
3236 mbedtls_md5_finish_ret( &md5, padbuf );
3237 mbedtls_sha1_finish_ret( &sha1, padbuf + 16 );
3238
3239 ssl->handshake->tls_prf( session->master, 48, sender,
3240 padbuf, 36, buf, len );
3241
3242 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
3243
3244 mbedtls_md5_free( &md5 );
3245 mbedtls_sha1_free( &sha1 );
3246
3247 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
3248
3249 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
3250 }
3251 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
3252
3253 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3254 #if defined(MBEDTLS_SHA256_C)
ssl_calc_finished_tls_sha256(mbedtls_ssl_context * ssl,unsigned char * buf,int from)3255 static void ssl_calc_finished_tls_sha256(
3256 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
3257 {
3258 int len = 12;
3259 const char *sender;
3260 unsigned char padbuf[32];
3261 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3262 size_t hash_size;
3263 psa_hash_operation_t sha256_psa = PSA_HASH_OPERATION_INIT;
3264 psa_status_t status;
3265 #else
3266 mbedtls_sha256_context sha256;
3267 #endif
3268
3269 mbedtls_ssl_session *session = ssl->session_negotiate;
3270 if( !session )
3271 session = ssl->session;
3272
3273 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
3274 ? "client finished"
3275 : "server finished";
3276
3277 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3278 sha256_psa = psa_hash_operation_init();
3279
3280 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc PSA finished tls sha256" ) );
3281
3282 status = psa_hash_clone( &ssl->handshake->fin_sha256_psa, &sha256_psa );
3283 if( status != PSA_SUCCESS )
3284 {
3285 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
3286 return;
3287 }
3288
3289 status = psa_hash_finish( &sha256_psa, padbuf, sizeof( padbuf ), &hash_size );
3290 if( status != PSA_SUCCESS )
3291 {
3292 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
3293 return;
3294 }
3295 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated padbuf", padbuf, 32 );
3296 #else
3297
3298 mbedtls_sha256_init( &sha256 );
3299
3300 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
3301
3302 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );
3303
3304 /*
3305 * TLSv1.2:
3306 * hash = PRF( master, finished_label,
3307 * Hash( handshake ) )[0.11]
3308 */
3309
3310 #if !defined(MBEDTLS_SHA256_ALT)
3311 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
3312 sha256.state, sizeof( sha256.state ) );
3313 #endif
3314
3315 mbedtls_sha256_finish_ret( &sha256, padbuf );
3316 mbedtls_sha256_free( &sha256 );
3317 #endif /* MBEDTLS_USE_PSA_CRYPTO */
3318
3319 ssl->handshake->tls_prf( session->master, 48, sender,
3320 padbuf, 32, buf, len );
3321
3322 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
3323
3324 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
3325
3326 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
3327 }
3328 #endif /* MBEDTLS_SHA256_C */
3329
3330 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
3331
ssl_calc_finished_tls_sha384(mbedtls_ssl_context * ssl,unsigned char * buf,int from)3332 static void ssl_calc_finished_tls_sha384(
3333 mbedtls_ssl_context *ssl, unsigned char *buf, int from )
3334 {
3335 int len = 12;
3336 const char *sender;
3337 unsigned char padbuf[48];
3338 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3339 size_t hash_size;
3340 psa_hash_operation_t sha384_psa = PSA_HASH_OPERATION_INIT;
3341 psa_status_t status;
3342 #else
3343 mbedtls_sha512_context sha512;
3344 #endif
3345
3346 mbedtls_ssl_session *session = ssl->session_negotiate;
3347 if( !session )
3348 session = ssl->session;
3349
3350 sender = ( from == MBEDTLS_SSL_IS_CLIENT )
3351 ? "client finished"
3352 : "server finished";
3353
3354 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3355 sha384_psa = psa_hash_operation_init();
3356
3357 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc PSA finished tls sha384" ) );
3358
3359 status = psa_hash_clone( &ssl->handshake->fin_sha384_psa, &sha384_psa );
3360 if( status != PSA_SUCCESS )
3361 {
3362 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash clone failed" ) );
3363 return;
3364 }
3365
3366 status = psa_hash_finish( &sha384_psa, padbuf, sizeof( padbuf ), &hash_size );
3367 if( status != PSA_SUCCESS )
3368 {
3369 MBEDTLS_SSL_DEBUG_MSG( 2, ( "PSA hash finish failed" ) );
3370 return;
3371 }
3372 MBEDTLS_SSL_DEBUG_BUF( 3, "PSA calculated padbuf", padbuf, 48 );
3373 #else
3374 mbedtls_sha512_init( &sha512 );
3375
3376 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
3377
3378 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );
3379
3380 /*
3381 * TLSv1.2:
3382 * hash = PRF( master, finished_label,
3383 * Hash( handshake ) )[0.11]
3384 */
3385
3386 #if !defined(MBEDTLS_SHA512_ALT)
3387 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
3388 sha512.state, sizeof( sha512.state ) );
3389 #endif
3390 /* mbedtls_sha512_finish_ret's output parameter is declared as a
3391 * 64-byte buffer, but sice we're using SHA-384, we know that the
3392 * output fits in 48 bytes. This is correct C, but GCC 11.1 warns
3393 * about it.
3394 */
3395 #if defined(__GNUC__) && __GNUC__ >= 11
3396 #pragma GCC diagnostic push
3397 #pragma GCC diagnostic ignored "-Wstringop-overflow"
3398 #endif
3399 mbedtls_sha512_finish_ret( &sha512, padbuf );
3400 #if defined(__GNUC__) && __GNUC__ >= 11
3401 #pragma GCC diagnostic pop
3402 #endif
3403
3404 mbedtls_sha512_free( &sha512 );
3405 #endif
3406
3407 ssl->handshake->tls_prf( session->master, 48, sender,
3408 padbuf, 48, buf, len );
3409
3410 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
3411
3412 mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) );
3413
3414 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
3415 }
3416 #endif /* MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384 */
3417 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3418
mbedtls_ssl_handshake_wrapup_free_hs_transform(mbedtls_ssl_context * ssl)3419 void mbedtls_ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl )
3420 {
3421 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup: final free" ) );
3422
3423 /*
3424 * Free our handshake params
3425 */
3426 mbedtls_ssl_handshake_free( ssl );
3427 mbedtls_free( ssl->handshake );
3428 ssl->handshake = NULL;
3429
3430 /*
3431 * Free the previous transform and swith in the current one
3432 */
3433 if( ssl->transform )
3434 {
3435 mbedtls_ssl_transform_free( ssl->transform );
3436 mbedtls_free( ssl->transform );
3437 }
3438 ssl->transform = ssl->transform_negotiate;
3439 ssl->transform_negotiate = NULL;
3440
3441 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup: final free" ) );
3442 }
3443
mbedtls_ssl_handshake_wrapup(mbedtls_ssl_context * ssl)3444 void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl )
3445 {
3446 int resume = ssl->handshake->resume;
3447
3448 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
3449
3450 #if defined(MBEDTLS_SSL_RENEGOTIATION)
3451 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
3452 {
3453 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE;
3454 ssl->renego_records_seen = 0;
3455 }
3456 #endif
3457
3458 /*
3459 * Free the previous session and switch in the current one
3460 */
3461 if( ssl->session )
3462 {
3463 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
3464 /* RFC 7366 3.1: keep the EtM state */
3465 ssl->session_negotiate->encrypt_then_mac =
3466 ssl->session->encrypt_then_mac;
3467 #endif
3468
3469 mbedtls_ssl_session_free( ssl->session );
3470 mbedtls_free( ssl->session );
3471 }
3472 ssl->session = ssl->session_negotiate;
3473 ssl->session_negotiate = NULL;
3474
3475 /*
3476 * Add cache entry
3477 */
3478 if( ssl->conf->f_set_cache != NULL &&
3479 ssl->session->id_len != 0 &&
3480 resume == 0 )
3481 {
3482 if( ssl->conf->f_set_cache( ssl->conf->p_cache, ssl->session ) != 0 )
3483 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
3484 }
3485
3486 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3487 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3488 ssl->handshake->flight != NULL )
3489 {
3490 /* Cancel handshake timer */
3491 mbedtls_ssl_set_timer( ssl, 0 );
3492
3493 /* Keep last flight around in case we need to resend it:
3494 * we need the handshake and transform structures for that */
3495 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip freeing handshake and transform" ) );
3496 }
3497 else
3498 #endif
3499 mbedtls_ssl_handshake_wrapup_free_hs_transform( ssl );
3500
3501 ssl->state++;
3502
3503 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
3504 }
3505
mbedtls_ssl_write_finished(mbedtls_ssl_context * ssl)3506 int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl )
3507 {
3508 int ret, hash_len;
3509
3510 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
3511
3512 mbedtls_ssl_update_out_pointers( ssl, ssl->transform_negotiate );
3513
3514 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint );
3515
3516 /*
3517 * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites
3518 * may define some other value. Currently (early 2016), no defined
3519 * ciphersuite does this (and this is unlikely to change as activity has
3520 * moved to TLS 1.3 now) so we can keep the hardcoded 12 here.
3521 */
3522 hash_len = ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) ? 36 : 12;
3523
3524 #if defined(MBEDTLS_SSL_RENEGOTIATION)
3525 ssl->verify_data_len = hash_len;
3526 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
3527 #endif
3528
3529 ssl->out_msglen = 4 + hash_len;
3530 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3531 ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED;
3532
3533 /*
3534 * In case of session resuming, invert the client and server
3535 * ChangeCipherSpec messages order.
3536 */
3537 if( ssl->handshake->resume != 0 )
3538 {
3539 #if defined(MBEDTLS_SSL_CLI_C)
3540 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
3541 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
3542 #endif
3543 #if defined(MBEDTLS_SSL_SRV_C)
3544 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
3545 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
3546 #endif
3547 }
3548 else
3549 ssl->state++;
3550
3551 /*
3552 * Switch to our negotiated transform and session parameters for outbound
3553 * data.
3554 */
3555 MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
3556
3557 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3558 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
3559 {
3560 unsigned char i;
3561
3562 /* Remember current epoch settings for resending */
3563 ssl->handshake->alt_transform_out = ssl->transform_out;
3564 memcpy( ssl->handshake->alt_out_ctr, ssl->cur_out_ctr, 8 );
3565
3566 /* Set sequence_number to zero */
3567 memset( ssl->cur_out_ctr + 2, 0, 6 );
3568
3569 /* Increment epoch */
3570 for( i = 2; i > 0; i-- )
3571 if( ++ssl->cur_out_ctr[i - 1] != 0 )
3572 break;
3573
3574 /* The loop goes to its end iff the counter is wrapping */
3575 if( i == 0 )
3576 {
3577 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) );
3578 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );
3579 }
3580 }
3581 else
3582 #endif /* MBEDTLS_SSL_PROTO_DTLS */
3583 memset( ssl->cur_out_ctr, 0, 8 );
3584
3585 ssl->transform_out = ssl->transform_negotiate;
3586 ssl->session_out = ssl->session_negotiate;
3587
3588 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
3589 if( mbedtls_ssl_hw_record_activate != NULL )
3590 {
3591 if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 )
3592 {
3593 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret );
3594 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3595 }
3596 }
3597 #endif
3598
3599 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3600 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
3601 mbedtls_ssl_send_flight_completed( ssl );
3602 #endif
3603
3604 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
3605 {
3606 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
3607 return( ret );
3608 }
3609
3610 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3611 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3612 ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
3613 {
3614 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
3615 return( ret );
3616 }
3617 #endif
3618
3619 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
3620
3621 return( 0 );
3622 }
3623
3624 #if defined(MBEDTLS_SSL_PROTO_SSL3)
3625 #define SSL_MAX_HASH_LEN 36
3626 #else
3627 #define SSL_MAX_HASH_LEN 12
3628 #endif
3629
mbedtls_ssl_parse_finished(mbedtls_ssl_context * ssl)3630 int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl )
3631 {
3632 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3633 unsigned int hash_len;
3634 unsigned char buf[SSL_MAX_HASH_LEN];
3635
3636 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
3637
3638 /* There is currently no ciphersuite using another length with TLS 1.2 */
3639 #if defined(MBEDTLS_SSL_PROTO_SSL3)
3640 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
3641 hash_len = 36;
3642 else
3643 #endif
3644 hash_len = 12;
3645
3646 ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 );
3647
3648 if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
3649 {
3650 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3651 goto exit;
3652 }
3653
3654 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3655 {
3656 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
3657 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3658 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
3659 ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
3660 goto exit;
3661 }
3662
3663 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED ||
3664 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len )
3665 {
3666 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
3667 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3668 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
3669 ret = MBEDTLS_ERR_SSL_BAD_HS_FINISHED;
3670 goto exit;
3671 }
3672
3673 if( mbedtls_ct_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ),
3674 buf, hash_len ) != 0 )
3675 {
3676 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
3677 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3678 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );
3679 ret = MBEDTLS_ERR_SSL_BAD_HS_FINISHED;
3680 goto exit;
3681 }
3682
3683 #if defined(MBEDTLS_SSL_RENEGOTIATION)
3684 ssl->verify_data_len = hash_len;
3685 memcpy( ssl->peer_verify_data, buf, hash_len );
3686 #endif
3687
3688 if( ssl->handshake->resume != 0 )
3689 {
3690 #if defined(MBEDTLS_SSL_CLI_C)
3691 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
3692 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
3693 #endif
3694 #if defined(MBEDTLS_SSL_SRV_C)
3695 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
3696 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
3697 #endif
3698 }
3699 else
3700 ssl->state++;
3701
3702 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3703 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
3704 mbedtls_ssl_recv_flight_completed( ssl );
3705 #endif
3706
3707 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
3708
3709 exit:
3710 mbedtls_platform_zeroize( buf, hash_len );
3711 return( ret );
3712 }
3713
ssl_handshake_params_init(mbedtls_ssl_handshake_params * handshake)3714 static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake )
3715 {
3716 memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) );
3717
3718 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3719 defined(MBEDTLS_SSL_PROTO_TLS1_1)
3720 mbedtls_md5_init( &handshake->fin_md5 );
3721 mbedtls_sha1_init( &handshake->fin_sha1 );
3722 mbedtls_md5_starts_ret( &handshake->fin_md5 );
3723 mbedtls_sha1_starts_ret( &handshake->fin_sha1 );
3724 #endif
3725 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3726 #if defined(MBEDTLS_SHA256_C)
3727 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3728 handshake->fin_sha256_psa = psa_hash_operation_init();
3729 psa_hash_setup( &handshake->fin_sha256_psa, PSA_ALG_SHA_256 );
3730 #else
3731 mbedtls_sha256_init( &handshake->fin_sha256 );
3732 mbedtls_sha256_starts_ret( &handshake->fin_sha256, 0 );
3733 #endif
3734 #endif
3735 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
3736 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3737 handshake->fin_sha384_psa = psa_hash_operation_init();
3738 psa_hash_setup( &handshake->fin_sha384_psa, PSA_ALG_SHA_384 );
3739 #else
3740 mbedtls_sha512_init( &handshake->fin_sha512 );
3741 mbedtls_sha512_starts_ret( &handshake->fin_sha512, 1 );
3742 #endif
3743 #endif
3744 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3745
3746 handshake->update_checksum = ssl_update_checksum_start;
3747
3748 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
3749 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
3750 mbedtls_ssl_sig_hash_set_init( &handshake->hash_algs );
3751 #endif
3752
3753 #if defined(MBEDTLS_DHM_C)
3754 mbedtls_dhm_init( &handshake->dhm_ctx );
3755 #endif
3756 #if defined(MBEDTLS_ECDH_C)
3757 mbedtls_ecdh_init( &handshake->ecdh_ctx );
3758 #endif
3759 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
3760 mbedtls_ecjpake_init( &handshake->ecjpake_ctx );
3761 #if defined(MBEDTLS_SSL_CLI_C)
3762 handshake->ecjpake_cache = NULL;
3763 handshake->ecjpake_cache_len = 0;
3764 #endif
3765 #endif
3766
3767 #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
3768 mbedtls_x509_crt_restart_init( &handshake->ecrs_ctx );
3769 #endif
3770
3771 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
3772 handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
3773 #endif
3774
3775 #if defined(MBEDTLS_X509_CRT_PARSE_C) && \
3776 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
3777 mbedtls_pk_init( &handshake->peer_pubkey );
3778 #endif
3779 }
3780
mbedtls_ssl_transform_init(mbedtls_ssl_transform * transform)3781 void mbedtls_ssl_transform_init( mbedtls_ssl_transform *transform )
3782 {
3783 memset( transform, 0, sizeof(mbedtls_ssl_transform) );
3784
3785 mbedtls_cipher_init( &transform->cipher_ctx_enc );
3786 mbedtls_cipher_init( &transform->cipher_ctx_dec );
3787
3788 #if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
3789 mbedtls_md_init( &transform->md_ctx_enc );
3790 mbedtls_md_init( &transform->md_ctx_dec );
3791 #endif
3792 }
3793
mbedtls_ssl_session_init(mbedtls_ssl_session * session)3794 void mbedtls_ssl_session_init( mbedtls_ssl_session *session )
3795 {
3796 memset( session, 0, sizeof(mbedtls_ssl_session) );
3797 }
3798
ssl_handshake_init(mbedtls_ssl_context * ssl)3799 static int ssl_handshake_init( mbedtls_ssl_context *ssl )
3800 {
3801 /* Clear old handshake information if present */
3802 if( ssl->transform_negotiate )
3803 mbedtls_ssl_transform_free( ssl->transform_negotiate );
3804 if( ssl->session_negotiate )
3805 mbedtls_ssl_session_free( ssl->session_negotiate );
3806 if( ssl->handshake )
3807 mbedtls_ssl_handshake_free( ssl );
3808
3809 /*
3810 * Either the pointers are now NULL or cleared properly and can be freed.
3811 * Now allocate missing structures.
3812 */
3813 if( ssl->transform_negotiate == NULL )
3814 {
3815 ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) );
3816 }
3817
3818 if( ssl->session_negotiate == NULL )
3819 {
3820 ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) );
3821 }
3822
3823 if( ssl->handshake == NULL )
3824 {
3825 ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) );
3826 }
3827 #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3828 /* If the buffers are too small - reallocate */
3829
3830 handle_buffer_resizing( ssl, 0, MBEDTLS_SSL_IN_BUFFER_LEN,
3831 MBEDTLS_SSL_OUT_BUFFER_LEN );
3832 #endif
3833
3834 /* All pointers should exist and can be directly freed without issue */
3835 if( ssl->handshake == NULL ||
3836 ssl->transform_negotiate == NULL ||
3837 ssl->session_negotiate == NULL )
3838 {
3839 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc() of ssl sub-contexts failed" ) );
3840
3841 mbedtls_free( ssl->handshake );
3842 mbedtls_free( ssl->transform_negotiate );
3843 mbedtls_free( ssl->session_negotiate );
3844
3845 ssl->handshake = NULL;
3846 ssl->transform_negotiate = NULL;
3847 ssl->session_negotiate = NULL;
3848
3849 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
3850 }
3851
3852 /* Initialize structures */
3853 mbedtls_ssl_session_init( ssl->session_negotiate );
3854 mbedtls_ssl_transform_init( ssl->transform_negotiate );
3855 ssl_handshake_params_init( ssl->handshake );
3856
3857 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3858 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
3859 {
3860 ssl->handshake->alt_transform_out = ssl->transform_out;
3861
3862 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
3863 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
3864 else
3865 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
3866
3867 mbedtls_ssl_set_timer( ssl, 0 );
3868 }
3869 #endif
3870
3871 return( 0 );
3872 }
3873
3874 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
3875 /* Dummy cookie callbacks for defaults */
ssl_cookie_write_dummy(void * ctx,unsigned char ** p,unsigned char * end,const unsigned char * cli_id,size_t cli_id_len)3876 static int ssl_cookie_write_dummy( void *ctx,
3877 unsigned char **p, unsigned char *end,
3878 const unsigned char *cli_id, size_t cli_id_len )
3879 {
3880 ((void) ctx);
3881 ((void) p);
3882 ((void) end);
3883 ((void) cli_id);
3884 ((void) cli_id_len);
3885
3886 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3887 }
3888
ssl_cookie_check_dummy(void * ctx,const unsigned char * cookie,size_t cookie_len,const unsigned char * cli_id,size_t cli_id_len)3889 static int ssl_cookie_check_dummy( void *ctx,
3890 const unsigned char *cookie, size_t cookie_len,
3891 const unsigned char *cli_id, size_t cli_id_len )
3892 {
3893 ((void) ctx);
3894 ((void) cookie);
3895 ((void) cookie_len);
3896 ((void) cli_id);
3897 ((void) cli_id_len);
3898
3899 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3900 }
3901 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */
3902
3903 /*
3904 * Initialize an SSL context
3905 */
mbedtls_ssl_init(mbedtls_ssl_context * ssl)3906 void mbedtls_ssl_init( mbedtls_ssl_context *ssl )
3907 {
3908 memset( ssl, 0, sizeof( mbedtls_ssl_context ) );
3909 }
3910
3911 /*
3912 * Setup an SSL context
3913 */
3914
mbedtls_ssl_setup(mbedtls_ssl_context * ssl,const mbedtls_ssl_config * conf)3915 int mbedtls_ssl_setup( mbedtls_ssl_context *ssl,
3916 const mbedtls_ssl_config *conf )
3917 {
3918 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3919 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
3920 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
3921
3922 ssl->conf = conf;
3923
3924 /*
3925 * Prepare base structures
3926 */
3927
3928 /* Set to NULL in case of an error condition */
3929 ssl->out_buf = NULL;
3930
3931 #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3932 ssl->in_buf_len = in_buf_len;
3933 #endif
3934 ssl->in_buf = mbedtls_calloc( 1, in_buf_len );
3935 if( ssl->in_buf == NULL )
3936 {
3937 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", in_buf_len ) );
3938 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
3939 goto error;
3940 }
3941
3942 #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3943 ssl->out_buf_len = out_buf_len;
3944 #endif
3945 ssl->out_buf = mbedtls_calloc( 1, out_buf_len );
3946 if( ssl->out_buf == NULL )
3947 {
3948 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", out_buf_len ) );
3949 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
3950 goto error;
3951 }
3952
3953 mbedtls_ssl_reset_in_out_pointers( ssl );
3954
3955 #if defined(MBEDTLS_SSL_DTLS_SRTP)
3956 memset( &ssl->dtls_srtp_info, 0, sizeof(ssl->dtls_srtp_info) );
3957 #endif
3958
3959 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3960 goto error;
3961
3962 return( 0 );
3963
3964 error:
3965 mbedtls_free( ssl->in_buf );
3966 mbedtls_free( ssl->out_buf );
3967
3968 ssl->conf = NULL;
3969
3970 #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
3971 ssl->in_buf_len = 0;
3972 ssl->out_buf_len = 0;
3973 #endif
3974 ssl->in_buf = NULL;
3975 ssl->out_buf = NULL;
3976
3977 ssl->in_hdr = NULL;
3978 ssl->in_ctr = NULL;
3979 ssl->in_len = NULL;
3980 ssl->in_iv = NULL;
3981 ssl->in_msg = NULL;
3982
3983 ssl->out_hdr = NULL;
3984 ssl->out_ctr = NULL;
3985 ssl->out_len = NULL;
3986 ssl->out_iv = NULL;
3987 ssl->out_msg = NULL;
3988
3989 return( ret );
3990 }
3991
3992 /*
3993 * Reset an initialized and used SSL context for re-use while retaining
3994 * all application-set variables, function pointers and data.
3995 *
3996 * If partial is non-zero, keep data in the input buffer and client ID.
3997 * (Use when a DTLS client reconnects from the same port.)
3998 */
mbedtls_ssl_session_reset_int(mbedtls_ssl_context * ssl,int partial)3999 int mbedtls_ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial )
4000 {
4001 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
4002 #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
4003 size_t in_buf_len = ssl->in_buf_len;
4004 size_t out_buf_len = ssl->out_buf_len;
4005 #else
4006 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
4007 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
4008 #endif
4009
4010 #if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || \
4011 !defined(MBEDTLS_SSL_SRV_C)
4012 ((void) partial);
4013 #endif
4014
4015 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
4016
4017 /* Cancel any possibly running timer */
4018 mbedtls_ssl_set_timer( ssl, 0 );
4019
4020 #if defined(MBEDTLS_SSL_RENEGOTIATION)
4021 ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE;
4022 ssl->renego_records_seen = 0;
4023
4024 ssl->verify_data_len = 0;
4025 memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
4026 memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );
4027 #endif
4028 ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION;
4029
4030 ssl->in_offt = NULL;
4031 mbedtls_ssl_reset_in_out_pointers( ssl );
4032
4033 ssl->in_msgtype = 0;
4034 ssl->in_msglen = 0;
4035 #if defined(MBEDTLS_SSL_PROTO_DTLS)
4036 ssl->next_record_offset = 0;
4037 ssl->in_epoch = 0;
4038 #endif
4039 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
4040 mbedtls_ssl_dtls_replay_reset( ssl );
4041 #endif
4042
4043 ssl->in_hslen = 0;
4044 ssl->nb_zero = 0;
4045
4046 ssl->keep_current_message = 0;
4047
4048 ssl->out_msgtype = 0;
4049 ssl->out_msglen = 0;
4050 ssl->out_left = 0;
4051 #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
4052 if( ssl->split_done != MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED )
4053 ssl->split_done = 0;
4054 #endif
4055
4056 memset( ssl->cur_out_ctr, 0, sizeof( ssl->cur_out_ctr ) );
4057
4058 ssl->transform_in = NULL;
4059 ssl->transform_out = NULL;
4060
4061 ssl->session_in = NULL;
4062 ssl->session_out = NULL;
4063
4064 memset( ssl->out_buf, 0, out_buf_len );
4065
4066 #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)
4067 if( partial == 0 )
4068 #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */
4069 {
4070 ssl->in_left = 0;
4071 memset( ssl->in_buf, 0, in_buf_len );
4072 }
4073
4074 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
4075 if( mbedtls_ssl_hw_record_reset != NULL )
4076 {
4077 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_reset()" ) );
4078 if( ( ret = mbedtls_ssl_hw_record_reset( ssl ) ) != 0 )
4079 {
4080 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_reset", ret );
4081 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
4082 }
4083 }
4084 #endif
4085
4086 if( ssl->transform )
4087 {
4088 mbedtls_ssl_transform_free( ssl->transform );
4089 mbedtls_free( ssl->transform );
4090 ssl->transform = NULL;
4091 }
4092
4093 if( ssl->session )
4094 {
4095 mbedtls_ssl_session_free( ssl->session );
4096 mbedtls_free( ssl->session );
4097 ssl->session = NULL;
4098 }
4099
4100 #if defined(MBEDTLS_SSL_ALPN)
4101 ssl->alpn_chosen = NULL;
4102 #endif
4103
4104 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
4105 #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE)
4106 if( partial == 0 )
4107 #endif
4108 {
4109 mbedtls_free( ssl->cli_id );
4110 ssl->cli_id = NULL;
4111 ssl->cli_id_len = 0;
4112 }
4113 #endif
4114
4115 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
4116 return( ret );
4117
4118 return( 0 );
4119 }
4120
4121 /*
4122 * Reset an initialized and used SSL context for re-use while retaining
4123 * all application-set variables, function pointers and data.
4124 */
mbedtls_ssl_session_reset(mbedtls_ssl_context * ssl)4125 int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl )
4126 {
4127 return( mbedtls_ssl_session_reset_int( ssl, 0 ) );
4128 }
4129
4130 /*
4131 * SSL set accessors
4132 */
mbedtls_ssl_conf_endpoint(mbedtls_ssl_config * conf,int endpoint)4133 void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint )
4134 {
4135 conf->endpoint = endpoint;
4136 }
4137
mbedtls_ssl_conf_transport(mbedtls_ssl_config * conf,int transport)4138 void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport )
4139 {
4140 conf->transport = transport;
4141 }
4142
4143 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
mbedtls_ssl_conf_dtls_anti_replay(mbedtls_ssl_config * conf,char mode)4144 void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode )
4145 {
4146 conf->anti_replay = mode;
4147 }
4148 #endif
4149
4150 #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
mbedtls_ssl_conf_dtls_badmac_limit(mbedtls_ssl_config * conf,unsigned limit)4151 void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit )
4152 {
4153 conf->badmac_limit = limit;
4154 }
4155 #endif
4156
4157 #if defined(MBEDTLS_SSL_PROTO_DTLS)
4158
mbedtls_ssl_set_datagram_packing(mbedtls_ssl_context * ssl,unsigned allow_packing)4159 void mbedtls_ssl_set_datagram_packing( mbedtls_ssl_context *ssl,
4160 unsigned allow_packing )
4161 {
4162 ssl->disable_datagram_packing = !allow_packing;
4163 }
4164
mbedtls_ssl_conf_handshake_timeout(mbedtls_ssl_config * conf,uint32_t min,uint32_t max)4165 void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf,
4166 uint32_t min, uint32_t max )
4167 {
4168 conf->hs_timeout_min = min;
4169 conf->hs_timeout_max = max;
4170 }
4171 #endif
4172
mbedtls_ssl_conf_authmode(mbedtls_ssl_config * conf,int authmode)4173 void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode )
4174 {
4175 conf->authmode = authmode;
4176 }
4177
4178 #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_conf_verify(mbedtls_ssl_config * conf,int (* f_vrfy)(void *,mbedtls_x509_crt *,int,uint32_t *),void * p_vrfy)4179 void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf,
4180 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
4181 void *p_vrfy )
4182 {
4183 conf->f_vrfy = f_vrfy;
4184 conf->p_vrfy = p_vrfy;
4185 }
4186 #endif /* MBEDTLS_X509_CRT_PARSE_C */
4187
mbedtls_ssl_conf_rng(mbedtls_ssl_config * conf,int (* f_rng)(void *,unsigned char *,size_t),void * p_rng)4188 void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf,
4189 int (*f_rng)(void *, unsigned char *, size_t),
4190 void *p_rng )
4191 {
4192 conf->f_rng = f_rng;
4193 conf->p_rng = p_rng;
4194 }
4195
mbedtls_ssl_conf_dbg(mbedtls_ssl_config * conf,void (* f_dbg)(void *,int,const char *,int,const char *),void * p_dbg)4196 void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf,
4197 void (*f_dbg)(void *, int, const char *, int, const char *),
4198 void *p_dbg )
4199 {
4200 conf->f_dbg = f_dbg;
4201 conf->p_dbg = p_dbg;
4202 }
4203
mbedtls_ssl_set_bio(mbedtls_ssl_context * ssl,void * p_bio,mbedtls_ssl_send_t * f_send,mbedtls_ssl_recv_t * f_recv,mbedtls_ssl_recv_timeout_t * f_recv_timeout)4204 void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
4205 void *p_bio,
4206 mbedtls_ssl_send_t *f_send,
4207 mbedtls_ssl_recv_t *f_recv,
4208 mbedtls_ssl_recv_timeout_t *f_recv_timeout )
4209 {
4210 ssl->p_bio = p_bio;
4211 ssl->f_send = f_send;
4212 ssl->f_recv = f_recv;
4213 ssl->f_recv_timeout = f_recv_timeout;
4214 }
4215
4216 #if defined(MBEDTLS_SSL_PROTO_DTLS)
mbedtls_ssl_set_mtu(mbedtls_ssl_context * ssl,uint16_t mtu)4217 void mbedtls_ssl_set_mtu( mbedtls_ssl_context *ssl, uint16_t mtu )
4218 {
4219 ssl->mtu = mtu;
4220 }
4221 #endif
4222
mbedtls_ssl_conf_read_timeout(mbedtls_ssl_config * conf,uint32_t timeout)4223 void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout )
4224 {
4225 conf->read_timeout = timeout;
4226 }
4227
mbedtls_ssl_set_timer_cb(mbedtls_ssl_context * ssl,void * p_timer,mbedtls_ssl_set_timer_t * f_set_timer,mbedtls_ssl_get_timer_t * f_get_timer)4228 void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl,
4229 void *p_timer,
4230 mbedtls_ssl_set_timer_t *f_set_timer,
4231 mbedtls_ssl_get_timer_t *f_get_timer )
4232 {
4233 ssl->p_timer = p_timer;
4234 ssl->f_set_timer = f_set_timer;
4235 ssl->f_get_timer = f_get_timer;
4236
4237 /* Make sure we start with no timer running */
4238 mbedtls_ssl_set_timer( ssl, 0 );
4239 }
4240
4241 #if defined(MBEDTLS_SSL_SRV_C)
mbedtls_ssl_conf_session_cache(mbedtls_ssl_config * conf,void * p_cache,int (* f_get_cache)(void *,mbedtls_ssl_session *),int (* f_set_cache)(void *,const mbedtls_ssl_session *))4242 void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf,
4243 void *p_cache,
4244 int (*f_get_cache)(void *, mbedtls_ssl_session *),
4245 int (*f_set_cache)(void *, const mbedtls_ssl_session *) )
4246 {
4247 conf->p_cache = p_cache;
4248 conf->f_get_cache = f_get_cache;
4249 conf->f_set_cache = f_set_cache;
4250 }
4251 #endif /* MBEDTLS_SSL_SRV_C */
4252
4253 #if defined(MBEDTLS_SSL_CLI_C)
mbedtls_ssl_set_session(mbedtls_ssl_context * ssl,const mbedtls_ssl_session * session)4254 int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session )
4255 {
4256 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
4257
4258 if( ssl == NULL ||
4259 session == NULL ||
4260 ssl->session_negotiate == NULL ||
4261 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
4262 {
4263 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4264 }
4265
4266 if( ( ret = mbedtls_ssl_session_copy( ssl->session_negotiate,
4267 session ) ) != 0 )
4268 return( ret );
4269
4270 ssl->handshake->resume = 1;
4271
4272 return( 0 );
4273 }
4274 #endif /* MBEDTLS_SSL_CLI_C */
4275
mbedtls_ssl_conf_ciphersuites(mbedtls_ssl_config * conf,const int * ciphersuites)4276 void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf,
4277 const int *ciphersuites )
4278 {
4279 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = ciphersuites;
4280 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = ciphersuites;
4281 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = ciphersuites;
4282 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ciphersuites;
4283 }
4284
mbedtls_ssl_conf_ciphersuites_for_version(mbedtls_ssl_config * conf,const int * ciphersuites,int major,int minor)4285 void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf,
4286 const int *ciphersuites,
4287 int major, int minor )
4288 {
4289 if( major != MBEDTLS_SSL_MAJOR_VERSION_3 )
4290 return;
4291
4292 if( minor < MBEDTLS_SSL_MINOR_VERSION_0 || minor > MBEDTLS_SSL_MINOR_VERSION_3 )
4293 return;
4294
4295 conf->ciphersuite_list[minor] = ciphersuites;
4296 }
4297
4298 #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_conf_cert_profile(mbedtls_ssl_config * conf,const mbedtls_x509_crt_profile * profile)4299 void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf,
4300 const mbedtls_x509_crt_profile *profile )
4301 {
4302 conf->cert_profile = profile;
4303 }
4304
4305 /* Append a new keycert entry to a (possibly empty) list */
ssl_append_key_cert(mbedtls_ssl_key_cert ** head,mbedtls_x509_crt * cert,mbedtls_pk_context * key)4306 static int ssl_append_key_cert( mbedtls_ssl_key_cert **head,
4307 mbedtls_x509_crt *cert,
4308 mbedtls_pk_context *key )
4309 {
4310 mbedtls_ssl_key_cert *new_cert;
4311
4312 new_cert = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) );
4313 if( new_cert == NULL )
4314 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
4315
4316 new_cert->cert = cert;
4317 new_cert->key = key;
4318 new_cert->next = NULL;
4319
4320 /* Update head is the list was null, else add to the end */
4321 if( *head == NULL )
4322 {
4323 *head = new_cert;
4324 }
4325 else
4326 {
4327 mbedtls_ssl_key_cert *cur = *head;
4328 while( cur->next != NULL )
4329 cur = cur->next;
4330 cur->next = new_cert;
4331 }
4332
4333 return( 0 );
4334 }
4335
mbedtls_ssl_conf_own_cert(mbedtls_ssl_config * conf,mbedtls_x509_crt * own_cert,mbedtls_pk_context * pk_key)4336 int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf,
4337 mbedtls_x509_crt *own_cert,
4338 mbedtls_pk_context *pk_key )
4339 {
4340 return( ssl_append_key_cert( &conf->key_cert, own_cert, pk_key ) );
4341 }
4342
mbedtls_ssl_conf_ca_chain(mbedtls_ssl_config * conf,mbedtls_x509_crt * ca_chain,mbedtls_x509_crl * ca_crl)4343 void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
4344 mbedtls_x509_crt *ca_chain,
4345 mbedtls_x509_crl *ca_crl )
4346 {
4347 conf->ca_chain = ca_chain;
4348 conf->ca_crl = ca_crl;
4349
4350 #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
4351 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
4352 * cannot be used together. */
4353 conf->f_ca_cb = NULL;
4354 conf->p_ca_cb = NULL;
4355 #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
4356 }
4357
4358 #if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
mbedtls_ssl_conf_ca_cb(mbedtls_ssl_config * conf,mbedtls_x509_crt_ca_cb_t f_ca_cb,void * p_ca_cb)4359 void mbedtls_ssl_conf_ca_cb( mbedtls_ssl_config *conf,
4360 mbedtls_x509_crt_ca_cb_t f_ca_cb,
4361 void *p_ca_cb )
4362 {
4363 conf->f_ca_cb = f_ca_cb;
4364 conf->p_ca_cb = p_ca_cb;
4365
4366 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
4367 * cannot be used together. */
4368 conf->ca_chain = NULL;
4369 conf->ca_crl = NULL;
4370 }
4371 #endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
4372 #endif /* MBEDTLS_X509_CRT_PARSE_C */
4373
4374 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
mbedtls_ssl_set_hs_own_cert(mbedtls_ssl_context * ssl,mbedtls_x509_crt * own_cert,mbedtls_pk_context * pk_key)4375 int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl,
4376 mbedtls_x509_crt *own_cert,
4377 mbedtls_pk_context *pk_key )
4378 {
4379 return( ssl_append_key_cert( &ssl->handshake->sni_key_cert,
4380 own_cert, pk_key ) );
4381 }
4382
mbedtls_ssl_set_hs_ca_chain(mbedtls_ssl_context * ssl,mbedtls_x509_crt * ca_chain,mbedtls_x509_crl * ca_crl)4383 void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl,
4384 mbedtls_x509_crt *ca_chain,
4385 mbedtls_x509_crl *ca_crl )
4386 {
4387 ssl->handshake->sni_ca_chain = ca_chain;
4388 ssl->handshake->sni_ca_crl = ca_crl;
4389 }
4390
mbedtls_ssl_set_hs_authmode(mbedtls_ssl_context * ssl,int authmode)4391 void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl,
4392 int authmode )
4393 {
4394 ssl->handshake->sni_authmode = authmode;
4395 }
4396 #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
4397
4398 #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_set_verify(mbedtls_ssl_context * ssl,int (* f_vrfy)(void *,mbedtls_x509_crt *,int,uint32_t *),void * p_vrfy)4399 void mbedtls_ssl_set_verify( mbedtls_ssl_context *ssl,
4400 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
4401 void *p_vrfy )
4402 {
4403 ssl->f_vrfy = f_vrfy;
4404 ssl->p_vrfy = p_vrfy;
4405 }
4406 #endif
4407
4408 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
4409 /*
4410 * Set EC J-PAKE password for current handshake
4411 */
mbedtls_ssl_set_hs_ecjpake_password(mbedtls_ssl_context * ssl,const unsigned char * pw,size_t pw_len)4412 int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,
4413 const unsigned char *pw,
4414 size_t pw_len )
4415 {
4416 mbedtls_ecjpake_role role;
4417
4418 if( ssl->handshake == NULL || ssl->conf == NULL )
4419 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4420
4421 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
4422 role = MBEDTLS_ECJPAKE_SERVER;
4423 else
4424 role = MBEDTLS_ECJPAKE_CLIENT;
4425
4426 return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx,
4427 role,
4428 MBEDTLS_MD_SHA256,
4429 MBEDTLS_ECP_DP_SECP256R1,
4430 pw, pw_len ) );
4431 }
4432 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
4433
4434 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
4435
ssl_conf_remove_psk(mbedtls_ssl_config * conf)4436 static void ssl_conf_remove_psk( mbedtls_ssl_config *conf )
4437 {
4438 /* Remove reference to existing PSK, if any. */
4439 #if defined(MBEDTLS_USE_PSA_CRYPTO)
4440 if( ! mbedtls_svc_key_id_is_null( conf->psk_opaque ) )
4441 {
4442 /* The maintenance of the PSK key slot is the
4443 * user's responsibility. */
4444 conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
4445 }
4446 /* This and the following branch should never
4447 * be taken simultaenously as we maintain the
4448 * invariant that raw and opaque PSKs are never
4449 * configured simultaneously. As a safeguard,
4450 * though, `else` is omitted here. */
4451 #endif /* MBEDTLS_USE_PSA_CRYPTO */
4452 if( conf->psk != NULL )
4453 {
4454 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
4455
4456 mbedtls_free( conf->psk );
4457 conf->psk = NULL;
4458 conf->psk_len = 0;
4459 }
4460
4461 /* Remove reference to PSK identity, if any. */
4462 if( conf->psk_identity != NULL )
4463 {
4464 mbedtls_free( conf->psk_identity );
4465 conf->psk_identity = NULL;
4466 conf->psk_identity_len = 0;
4467 }
4468 }
4469
4470 /* This function assumes that PSK identity in the SSL config is unset.
4471 * It checks that the provided identity is well-formed and attempts
4472 * to make a copy of it in the SSL config.
4473 * On failure, the PSK identity in the config remains unset. */
ssl_conf_set_psk_identity(mbedtls_ssl_config * conf,unsigned char const * psk_identity,size_t psk_identity_len)4474 static int ssl_conf_set_psk_identity( mbedtls_ssl_config *conf,
4475 unsigned char const *psk_identity,
4476 size_t psk_identity_len )
4477 {
4478 /* Identity len will be encoded on two bytes */
4479 if( psk_identity == NULL ||
4480 ( psk_identity_len >> 16 ) != 0 ||
4481 psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN )
4482 {
4483 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4484 }
4485
4486 conf->psk_identity = mbedtls_calloc( 1, psk_identity_len );
4487 if( conf->psk_identity == NULL )
4488 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
4489
4490 conf->psk_identity_len = psk_identity_len;
4491 memcpy( conf->psk_identity, psk_identity, conf->psk_identity_len );
4492
4493 return( 0 );
4494 }
4495
mbedtls_ssl_conf_psk(mbedtls_ssl_config * conf,const unsigned char * psk,size_t psk_len,const unsigned char * psk_identity,size_t psk_identity_len)4496 int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,
4497 const unsigned char *psk, size_t psk_len,
4498 const unsigned char *psk_identity, size_t psk_identity_len )
4499 {
4500 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
4501 /* Remove opaque/raw PSK + PSK Identity */
4502 ssl_conf_remove_psk( conf );
4503
4504 /* Check and set raw PSK */
4505 if( psk == NULL )
4506 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4507 if( psk_len == 0 )
4508 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4509 if( psk_len > MBEDTLS_PSK_MAX_LEN )
4510 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4511
4512 if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
4513 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
4514 conf->psk_len = psk_len;
4515 memcpy( conf->psk, psk, conf->psk_len );
4516
4517 /* Check and set PSK Identity */
4518 ret = ssl_conf_set_psk_identity( conf, psk_identity, psk_identity_len );
4519 if( ret != 0 )
4520 ssl_conf_remove_psk( conf );
4521
4522 return( ret );
4523 }
4524
ssl_remove_psk(mbedtls_ssl_context * ssl)4525 static void ssl_remove_psk( mbedtls_ssl_context *ssl )
4526 {
4527 #if defined(MBEDTLS_USE_PSA_CRYPTO)
4528 if( ! mbedtls_svc_key_id_is_null( ssl->handshake->psk_opaque ) )
4529 {
4530 ssl->handshake->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
4531 }
4532 else
4533 #endif /* MBEDTLS_USE_PSA_CRYPTO */
4534 if( ssl->handshake->psk != NULL )
4535 {
4536 mbedtls_platform_zeroize( ssl->handshake->psk,
4537 ssl->handshake->psk_len );
4538 mbedtls_free( ssl->handshake->psk );
4539 ssl->handshake->psk_len = 0;
4540 }
4541 }
4542
mbedtls_ssl_set_hs_psk(mbedtls_ssl_context * ssl,const unsigned char * psk,size_t psk_len)4543 int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl,
4544 const unsigned char *psk, size_t psk_len )
4545 {
4546 if( psk == NULL || ssl->handshake == NULL )
4547 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4548
4549 if( psk_len > MBEDTLS_PSK_MAX_LEN )
4550 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4551
4552 ssl_remove_psk( ssl );
4553
4554 if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )
4555 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
4556
4557 ssl->handshake->psk_len = psk_len;
4558 memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len );
4559
4560 return( 0 );
4561 }
4562
4563 #if defined(MBEDTLS_USE_PSA_CRYPTO)
mbedtls_ssl_conf_psk_opaque(mbedtls_ssl_config * conf,psa_key_id_t psk,const unsigned char * psk_identity,size_t psk_identity_len)4564 int mbedtls_ssl_conf_psk_opaque( mbedtls_ssl_config *conf,
4565 psa_key_id_t psk,
4566 const unsigned char *psk_identity,
4567 size_t psk_identity_len )
4568 {
4569 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
4570 /* Clear opaque/raw PSK + PSK Identity, if present. */
4571 ssl_conf_remove_psk( conf );
4572
4573 /* Check and set opaque PSK */
4574 if( mbedtls_svc_key_id_is_null( psk ) )
4575 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4576 conf->psk_opaque = psk;
4577
4578 /* Check and set PSK Identity */
4579 ret = ssl_conf_set_psk_identity( conf, psk_identity,
4580 psk_identity_len );
4581 if( ret != 0 )
4582 ssl_conf_remove_psk( conf );
4583
4584 return( ret );
4585 }
4586
mbedtls_ssl_set_hs_psk_opaque(mbedtls_ssl_context * ssl,psa_key_id_t psk)4587 int mbedtls_ssl_set_hs_psk_opaque( mbedtls_ssl_context *ssl,
4588 psa_key_id_t psk )
4589 {
4590 if( ( mbedtls_svc_key_id_is_null( psk ) ) ||
4591 ( ssl->handshake == NULL ) )
4592 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4593
4594 ssl_remove_psk( ssl );
4595 ssl->handshake->psk_opaque = psk;
4596 return( 0 );
4597 }
4598 #endif /* MBEDTLS_USE_PSA_CRYPTO */
4599
mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config * conf,int (* f_psk)(void *,mbedtls_ssl_context *,const unsigned char *,size_t),void * p_psk)4600 void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,
4601 int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *,
4602 size_t),
4603 void *p_psk )
4604 {
4605 conf->f_psk = f_psk;
4606 conf->p_psk = p_psk;
4607 }
4608 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
4609
4610 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
4611
4612 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
mbedtls_ssl_conf_dh_param(mbedtls_ssl_config * conf,const char * dhm_P,const char * dhm_G)4613 int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G )
4614 {
4615 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
4616
4617 if( ( ret = mbedtls_mpi_read_string( &conf->dhm_P, 16, dhm_P ) ) != 0 ||
4618 ( ret = mbedtls_mpi_read_string( &conf->dhm_G, 16, dhm_G ) ) != 0 )
4619 {
4620 mbedtls_mpi_free( &conf->dhm_P );
4621 mbedtls_mpi_free( &conf->dhm_G );
4622 return( ret );
4623 }
4624
4625 return( 0 );
4626 }
4627 #endif /* MBEDTLS_DEPRECATED_REMOVED */
4628
mbedtls_ssl_conf_dh_param_bin(mbedtls_ssl_config * conf,const unsigned char * dhm_P,size_t P_len,const unsigned char * dhm_G,size_t G_len)4629 int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf,
4630 const unsigned char *dhm_P, size_t P_len,
4631 const unsigned char *dhm_G, size_t G_len )
4632 {
4633 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
4634
4635 if( ( ret = mbedtls_mpi_read_binary( &conf->dhm_P, dhm_P, P_len ) ) != 0 ||
4636 ( ret = mbedtls_mpi_read_binary( &conf->dhm_G, dhm_G, G_len ) ) != 0 )
4637 {
4638 mbedtls_mpi_free( &conf->dhm_P );
4639 mbedtls_mpi_free( &conf->dhm_G );
4640 return( ret );
4641 }
4642
4643 return( 0 );
4644 }
4645
mbedtls_ssl_conf_dh_param_ctx(mbedtls_ssl_config * conf,mbedtls_dhm_context * dhm_ctx)4646 int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx )
4647 {
4648 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
4649
4650 if( ( ret = mbedtls_mpi_copy( &conf->dhm_P, &dhm_ctx->P ) ) != 0 ||
4651 ( ret = mbedtls_mpi_copy( &conf->dhm_G, &dhm_ctx->G ) ) != 0 )
4652 {
4653 mbedtls_mpi_free( &conf->dhm_P );
4654 mbedtls_mpi_free( &conf->dhm_G );
4655 return( ret );
4656 }
4657
4658 return( 0 );
4659 }
4660 #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */
4661
4662 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
4663 /*
4664 * Set the minimum length for Diffie-Hellman parameters
4665 */
mbedtls_ssl_conf_dhm_min_bitlen(mbedtls_ssl_config * conf,unsigned int bitlen)4666 void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf,
4667 unsigned int bitlen )
4668 {
4669 conf->dhm_min_bitlen = bitlen;
4670 }
4671 #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */
4672
4673 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
4674 /*
4675 * Set allowed/preferred hashes for handshake signatures
4676 */
mbedtls_ssl_conf_sig_hashes(mbedtls_ssl_config * conf,const int * hashes)4677 void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf,
4678 const int *hashes )
4679 {
4680 conf->sig_hashes = hashes;
4681 }
4682 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
4683
4684 #if defined(MBEDTLS_ECP_C)
4685 /*
4686 * Set the allowed elliptic curves
4687 */
mbedtls_ssl_conf_curves(mbedtls_ssl_config * conf,const mbedtls_ecp_group_id * curve_list)4688 void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf,
4689 const mbedtls_ecp_group_id *curve_list )
4690 {
4691 conf->curve_list = curve_list;
4692 }
4693 #endif /* MBEDTLS_ECP_C */
4694
4695 #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_set_hostname(mbedtls_ssl_context * ssl,const char * hostname)4696 int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname )
4697 {
4698 /* Initialize to suppress unnecessary compiler warning */
4699 size_t hostname_len = 0;
4700
4701 /* Check if new hostname is valid before
4702 * making any change to current one */
4703 if( hostname != NULL )
4704 {
4705 hostname_len = strlen( hostname );
4706
4707 if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN )
4708 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4709 }
4710
4711 /* Now it's clear that we will overwrite the old hostname,
4712 * so we can free it safely */
4713
4714 if( ssl->hostname != NULL )
4715 {
4716 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
4717 mbedtls_free( ssl->hostname );
4718 }
4719
4720 /* Passing NULL as hostname shall clear the old one */
4721
4722 if( hostname == NULL )
4723 {
4724 ssl->hostname = NULL;
4725 }
4726 else
4727 {
4728 ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 );
4729 if( ssl->hostname == NULL )
4730 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
4731
4732 memcpy( ssl->hostname, hostname, hostname_len );
4733
4734 ssl->hostname[hostname_len] = '\0';
4735 }
4736
4737 return( 0 );
4738 }
4739 #endif /* MBEDTLS_X509_CRT_PARSE_C */
4740
4741 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
mbedtls_ssl_conf_sni(mbedtls_ssl_config * conf,int (* f_sni)(void *,mbedtls_ssl_context *,const unsigned char *,size_t),void * p_sni)4742 void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf,
4743 int (*f_sni)(void *, mbedtls_ssl_context *,
4744 const unsigned char *, size_t),
4745 void *p_sni )
4746 {
4747 conf->f_sni = f_sni;
4748 conf->p_sni = p_sni;
4749 }
4750 #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
4751
4752 #if defined(MBEDTLS_SSL_ALPN)
mbedtls_ssl_conf_alpn_protocols(mbedtls_ssl_config * conf,const char ** protos)4753 int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos )
4754 {
4755 size_t cur_len, tot_len;
4756 const char **p;
4757
4758 /*
4759 * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings
4760 * MUST NOT be truncated."
4761 * We check lengths now rather than later.
4762 */
4763 tot_len = 0;
4764 for( p = protos; *p != NULL; p++ )
4765 {
4766 cur_len = strlen( *p );
4767 tot_len += cur_len;
4768
4769 if( ( cur_len == 0 ) ||
4770 ( cur_len > MBEDTLS_SSL_MAX_ALPN_NAME_LEN ) ||
4771 ( tot_len > MBEDTLS_SSL_MAX_ALPN_LIST_LEN ) )
4772 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4773 }
4774
4775 conf->alpn_list = protos;
4776
4777 return( 0 );
4778 }
4779
mbedtls_ssl_get_alpn_protocol(const mbedtls_ssl_context * ssl)4780 const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl )
4781 {
4782 return( ssl->alpn_chosen );
4783 }
4784 #endif /* MBEDTLS_SSL_ALPN */
4785
4786 #if defined(MBEDTLS_SSL_DTLS_SRTP)
mbedtls_ssl_conf_srtp_mki_value_supported(mbedtls_ssl_config * conf,int support_mki_value)4787 void mbedtls_ssl_conf_srtp_mki_value_supported( mbedtls_ssl_config *conf,
4788 int support_mki_value )
4789 {
4790 conf->dtls_srtp_mki_support = support_mki_value;
4791 }
4792
mbedtls_ssl_dtls_srtp_set_mki_value(mbedtls_ssl_context * ssl,unsigned char * mki_value,uint16_t mki_len)4793 int mbedtls_ssl_dtls_srtp_set_mki_value( mbedtls_ssl_context *ssl,
4794 unsigned char *mki_value,
4795 uint16_t mki_len )
4796 {
4797 if( mki_len > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH )
4798 {
4799 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4800 }
4801
4802 if( ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED )
4803 {
4804 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
4805 }
4806
4807 memcpy( ssl->dtls_srtp_info.mki_value, mki_value, mki_len );
4808 ssl->dtls_srtp_info.mki_len = mki_len;
4809 return( 0 );
4810 }
4811
mbedtls_ssl_conf_dtls_srtp_protection_profiles(mbedtls_ssl_config * conf,const mbedtls_ssl_srtp_profile * profiles)4812 int mbedtls_ssl_conf_dtls_srtp_protection_profiles( mbedtls_ssl_config *conf,
4813 const mbedtls_ssl_srtp_profile *profiles )
4814 {
4815 const mbedtls_ssl_srtp_profile *p;
4816 size_t list_size = 0;
4817
4818 /* check the profiles list: all entry must be valid,
4819 * its size cannot be more than the total number of supported profiles, currently 4 */
4820 for( p = profiles; *p != MBEDTLS_TLS_SRTP_UNSET &&
4821 list_size <= MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH;
4822 p++ )
4823 {
4824 if( mbedtls_ssl_check_srtp_profile_value( *p ) != MBEDTLS_TLS_SRTP_UNSET )
4825 {
4826 list_size++;
4827 }
4828 else
4829 {
4830 /* unsupported value, stop parsing and set the size to an error value */
4831 list_size = MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH + 1;
4832 }
4833 }
4834
4835 if( list_size > MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH )
4836 {
4837 conf->dtls_srtp_profile_list = NULL;
4838 conf->dtls_srtp_profile_list_len = 0;
4839 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4840 }
4841
4842 conf->dtls_srtp_profile_list = profiles;
4843 conf->dtls_srtp_profile_list_len = list_size;
4844
4845 return( 0 );
4846 }
4847
mbedtls_ssl_get_dtls_srtp_negotiation_result(const mbedtls_ssl_context * ssl,mbedtls_dtls_srtp_info * dtls_srtp_info)4848 void mbedtls_ssl_get_dtls_srtp_negotiation_result( const mbedtls_ssl_context *ssl,
4849 mbedtls_dtls_srtp_info *dtls_srtp_info )
4850 {
4851 dtls_srtp_info->chosen_dtls_srtp_profile = ssl->dtls_srtp_info.chosen_dtls_srtp_profile;
4852 /* do not copy the mki value if there is no chosen profile */
4853 if( dtls_srtp_info->chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET )
4854 {
4855 dtls_srtp_info->mki_len = 0;
4856 }
4857 else
4858 {
4859 dtls_srtp_info->mki_len = ssl->dtls_srtp_info.mki_len;
4860 memcpy( dtls_srtp_info->mki_value, ssl->dtls_srtp_info.mki_value,
4861 ssl->dtls_srtp_info.mki_len );
4862 }
4863 }
4864 #endif /* MBEDTLS_SSL_DTLS_SRTP */
4865
mbedtls_ssl_conf_max_version(mbedtls_ssl_config * conf,int major,int minor)4866 void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor )
4867 {
4868 conf->max_major_ver = major;
4869 conf->max_minor_ver = minor;
4870 }
4871
mbedtls_ssl_conf_min_version(mbedtls_ssl_config * conf,int major,int minor)4872 void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor )
4873 {
4874 conf->min_major_ver = major;
4875 conf->min_minor_ver = minor;
4876 }
4877
4878 #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C)
mbedtls_ssl_conf_fallback(mbedtls_ssl_config * conf,char fallback)4879 void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback )
4880 {
4881 conf->fallback = fallback;
4882 }
4883 #endif
4884
4885 #if defined(MBEDTLS_SSL_SRV_C)
mbedtls_ssl_conf_cert_req_ca_list(mbedtls_ssl_config * conf,char cert_req_ca_list)4886 void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf,
4887 char cert_req_ca_list )
4888 {
4889 conf->cert_req_ca_list = cert_req_ca_list;
4890 }
4891 #endif
4892
4893 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
mbedtls_ssl_conf_encrypt_then_mac(mbedtls_ssl_config * conf,char etm)4894 void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm )
4895 {
4896 conf->encrypt_then_mac = etm;
4897 }
4898 #endif
4899
4900 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
mbedtls_ssl_conf_extended_master_secret(mbedtls_ssl_config * conf,char ems)4901 void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems )
4902 {
4903 conf->extended_ms = ems;
4904 }
4905 #endif
4906
4907 #if defined(MBEDTLS_ARC4_C)
mbedtls_ssl_conf_arc4_support(mbedtls_ssl_config * conf,char arc4)4908 void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 )
4909 {
4910 conf->arc4_disabled = arc4;
4911 }
4912 #endif
4913
4914 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
mbedtls_ssl_conf_max_frag_len(mbedtls_ssl_config * conf,unsigned char mfl_code)4915 int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code )
4916 {
4917 if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ||
4918 ssl_mfl_code_to_length( mfl_code ) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN )
4919 {
4920 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4921 }
4922
4923 conf->mfl_code = mfl_code;
4924
4925 return( 0 );
4926 }
4927 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
4928
4929 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
mbedtls_ssl_conf_truncated_hmac(mbedtls_ssl_config * conf,int truncate)4930 void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate )
4931 {
4932 conf->trunc_hmac = truncate;
4933 }
4934 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
4935
4936 #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
mbedtls_ssl_conf_cbc_record_splitting(mbedtls_ssl_config * conf,char split)4937 void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split )
4938 {
4939 conf->cbc_record_splitting = split;
4940 }
4941 #endif
4942
mbedtls_ssl_conf_legacy_renegotiation(mbedtls_ssl_config * conf,int allow_legacy)4943 void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy )
4944 {
4945 conf->allow_legacy_renegotiation = allow_legacy;
4946 }
4947
4948 #if defined(MBEDTLS_SSL_RENEGOTIATION)
mbedtls_ssl_conf_renegotiation(mbedtls_ssl_config * conf,int renegotiation)4949 void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation )
4950 {
4951 conf->disable_renegotiation = renegotiation;
4952 }
4953
mbedtls_ssl_conf_renegotiation_enforced(mbedtls_ssl_config * conf,int max_records)4954 void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records )
4955 {
4956 conf->renego_max_records = max_records;
4957 }
4958
mbedtls_ssl_conf_renegotiation_period(mbedtls_ssl_config * conf,const unsigned char period[8])4959 void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,
4960 const unsigned char period[8] )
4961 {
4962 memcpy( conf->renego_period, period, 8 );
4963 }
4964 #endif /* MBEDTLS_SSL_RENEGOTIATION */
4965
4966 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
4967 #if defined(MBEDTLS_SSL_CLI_C)
mbedtls_ssl_conf_session_tickets(mbedtls_ssl_config * conf,int use_tickets)4968 void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets )
4969 {
4970 conf->session_tickets = use_tickets;
4971 }
4972 #endif
4973
4974 #if defined(MBEDTLS_SSL_SRV_C)
mbedtls_ssl_conf_session_tickets_cb(mbedtls_ssl_config * conf,mbedtls_ssl_ticket_write_t * f_ticket_write,mbedtls_ssl_ticket_parse_t * f_ticket_parse,void * p_ticket)4975 void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,
4976 mbedtls_ssl_ticket_write_t *f_ticket_write,
4977 mbedtls_ssl_ticket_parse_t *f_ticket_parse,
4978 void *p_ticket )
4979 {
4980 conf->f_ticket_write = f_ticket_write;
4981 conf->f_ticket_parse = f_ticket_parse;
4982 conf->p_ticket = p_ticket;
4983 }
4984 #endif
4985 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
4986
4987 #if defined(MBEDTLS_SSL_EXPORT_KEYS)
mbedtls_ssl_conf_export_keys_cb(mbedtls_ssl_config * conf,mbedtls_ssl_export_keys_t * f_export_keys,void * p_export_keys)4988 void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf,
4989 mbedtls_ssl_export_keys_t *f_export_keys,
4990 void *p_export_keys )
4991 {
4992 conf->f_export_keys = f_export_keys;
4993 conf->p_export_keys = p_export_keys;
4994 }
4995
mbedtls_ssl_conf_export_keys_ext_cb(mbedtls_ssl_config * conf,mbedtls_ssl_export_keys_ext_t * f_export_keys_ext,void * p_export_keys)4996 void mbedtls_ssl_conf_export_keys_ext_cb( mbedtls_ssl_config *conf,
4997 mbedtls_ssl_export_keys_ext_t *f_export_keys_ext,
4998 void *p_export_keys )
4999 {
5000 conf->f_export_keys_ext = f_export_keys_ext;
5001 conf->p_export_keys = p_export_keys;
5002 }
5003 #endif
5004
5005 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
mbedtls_ssl_conf_async_private_cb(mbedtls_ssl_config * conf,mbedtls_ssl_async_sign_t * f_async_sign,mbedtls_ssl_async_decrypt_t * f_async_decrypt,mbedtls_ssl_async_resume_t * f_async_resume,mbedtls_ssl_async_cancel_t * f_async_cancel,void * async_config_data)5006 void mbedtls_ssl_conf_async_private_cb(
5007 mbedtls_ssl_config *conf,
5008 mbedtls_ssl_async_sign_t *f_async_sign,
5009 mbedtls_ssl_async_decrypt_t *f_async_decrypt,
5010 mbedtls_ssl_async_resume_t *f_async_resume,
5011 mbedtls_ssl_async_cancel_t *f_async_cancel,
5012 void *async_config_data )
5013 {
5014 conf->f_async_sign_start = f_async_sign;
5015 conf->f_async_decrypt_start = f_async_decrypt;
5016 conf->f_async_resume = f_async_resume;
5017 conf->f_async_cancel = f_async_cancel;
5018 conf->p_async_config_data = async_config_data;
5019 }
5020
mbedtls_ssl_conf_get_async_config_data(const mbedtls_ssl_config * conf)5021 void *mbedtls_ssl_conf_get_async_config_data( const mbedtls_ssl_config *conf )
5022 {
5023 return( conf->p_async_config_data );
5024 }
5025
mbedtls_ssl_get_async_operation_data(const mbedtls_ssl_context * ssl)5026 void *mbedtls_ssl_get_async_operation_data( const mbedtls_ssl_context *ssl )
5027 {
5028 if( ssl->handshake == NULL )
5029 return( NULL );
5030 else
5031 return( ssl->handshake->user_async_ctx );
5032 }
5033
mbedtls_ssl_set_async_operation_data(mbedtls_ssl_context * ssl,void * ctx)5034 void mbedtls_ssl_set_async_operation_data( mbedtls_ssl_context *ssl,
5035 void *ctx )
5036 {
5037 if( ssl->handshake != NULL )
5038 ssl->handshake->user_async_ctx = ctx;
5039 }
5040 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
5041
5042 /*
5043 * SSL get accessors
5044 */
mbedtls_ssl_get_verify_result(const mbedtls_ssl_context * ssl)5045 uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl )
5046 {
5047 if( ssl->session != NULL )
5048 return( ssl->session->verify_result );
5049
5050 if( ssl->session_negotiate != NULL )
5051 return( ssl->session_negotiate->verify_result );
5052
5053 return( 0xFFFFFFFF );
5054 }
5055
mbedtls_ssl_get_ciphersuite(const mbedtls_ssl_context * ssl)5056 const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl )
5057 {
5058 if( ssl == NULL || ssl->session == NULL )
5059 return( NULL );
5060
5061 return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite );
5062 }
5063
mbedtls_ssl_get_version(const mbedtls_ssl_context * ssl)5064 const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl )
5065 {
5066 #if defined(MBEDTLS_SSL_PROTO_DTLS)
5067 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
5068 {
5069 switch( ssl->minor_ver )
5070 {
5071 case MBEDTLS_SSL_MINOR_VERSION_2:
5072 return( "DTLSv1.0" );
5073
5074 case MBEDTLS_SSL_MINOR_VERSION_3:
5075 return( "DTLSv1.2" );
5076
5077 default:
5078 return( "unknown (DTLS)" );
5079 }
5080 }
5081 #endif
5082
5083 switch( ssl->minor_ver )
5084 {
5085 case MBEDTLS_SSL_MINOR_VERSION_0:
5086 return( "SSLv3.0" );
5087
5088 case MBEDTLS_SSL_MINOR_VERSION_1:
5089 return( "TLSv1.0" );
5090
5091 case MBEDTLS_SSL_MINOR_VERSION_2:
5092 return( "TLSv1.1" );
5093
5094 case MBEDTLS_SSL_MINOR_VERSION_3:
5095 return( "TLSv1.2" );
5096
5097 default:
5098 return( "unknown" );
5099 }
5100 }
5101
5102 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
mbedtls_ssl_get_input_max_frag_len(const mbedtls_ssl_context * ssl)5103 size_t mbedtls_ssl_get_input_max_frag_len( const mbedtls_ssl_context *ssl )
5104 {
5105 size_t max_len = MBEDTLS_SSL_MAX_CONTENT_LEN;
5106 size_t read_mfl;
5107
5108 /* Use the configured MFL for the client if we're past SERVER_HELLO_DONE */
5109 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
5110 ssl->state >= MBEDTLS_SSL_SERVER_HELLO_DONE )
5111 {
5112 return ssl_mfl_code_to_length( ssl->conf->mfl_code );
5113 }
5114
5115 /* Check if a smaller max length was negotiated */
5116 if( ssl->session_out != NULL )
5117 {
5118 read_mfl = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
5119 if( read_mfl < max_len )
5120 {
5121 max_len = read_mfl;
5122 }
5123 }
5124
5125 // During a handshake, use the value being negotiated
5126 if( ssl->session_negotiate != NULL )
5127 {
5128 read_mfl = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
5129 if( read_mfl < max_len )
5130 {
5131 max_len = read_mfl;
5132 }
5133 }
5134
5135 return( max_len );
5136 }
5137
mbedtls_ssl_get_output_max_frag_len(const mbedtls_ssl_context * ssl)5138 size_t mbedtls_ssl_get_output_max_frag_len( const mbedtls_ssl_context *ssl )
5139 {
5140 size_t max_len;
5141
5142 /*
5143 * Assume mfl_code is correct since it was checked when set
5144 */
5145 max_len = ssl_mfl_code_to_length( ssl->conf->mfl_code );
5146
5147 /* Check if a smaller max length was negotiated */
5148 if( ssl->session_out != NULL &&
5149 ssl_mfl_code_to_length( ssl->session_out->mfl_code ) < max_len )
5150 {
5151 max_len = ssl_mfl_code_to_length( ssl->session_out->mfl_code );
5152 }
5153
5154 /* During a handshake, use the value being negotiated */
5155 if( ssl->session_negotiate != NULL &&
5156 ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code ) < max_len )
5157 {
5158 max_len = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code );
5159 }
5160
5161 return( max_len );
5162 }
5163
5164 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
mbedtls_ssl_get_max_frag_len(const mbedtls_ssl_context * ssl)5165 size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl )
5166 {
5167 return mbedtls_ssl_get_output_max_frag_len( ssl );
5168 }
5169 #endif /* !MBEDTLS_DEPRECATED_REMOVED */
5170 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
5171
5172 #if defined(MBEDTLS_SSL_PROTO_DTLS)
mbedtls_ssl_get_current_mtu(const mbedtls_ssl_context * ssl)5173 size_t mbedtls_ssl_get_current_mtu( const mbedtls_ssl_context *ssl )
5174 {
5175 /* Return unlimited mtu for client hello messages to avoid fragmentation. */
5176 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
5177 ( ssl->state == MBEDTLS_SSL_CLIENT_HELLO ||
5178 ssl->state == MBEDTLS_SSL_SERVER_HELLO ) )
5179 return ( 0 );
5180
5181 if( ssl->handshake == NULL || ssl->handshake->mtu == 0 )
5182 return( ssl->mtu );
5183
5184 if( ssl->mtu == 0 )
5185 return( ssl->handshake->mtu );
5186
5187 return( ssl->mtu < ssl->handshake->mtu ?
5188 ssl->mtu : ssl->handshake->mtu );
5189 }
5190 #endif /* MBEDTLS_SSL_PROTO_DTLS */
5191
mbedtls_ssl_get_max_out_record_payload(const mbedtls_ssl_context * ssl)5192 int mbedtls_ssl_get_max_out_record_payload( const mbedtls_ssl_context *ssl )
5193 {
5194 size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
5195
5196 #if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
5197 !defined(MBEDTLS_SSL_PROTO_DTLS)
5198 (void) ssl;
5199 #endif
5200
5201 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
5202 const size_t mfl = mbedtls_ssl_get_output_max_frag_len( ssl );
5203
5204 if( max_len > mfl )
5205 max_len = mfl;
5206 #endif
5207
5208 #if defined(MBEDTLS_SSL_PROTO_DTLS)
5209 if( mbedtls_ssl_get_current_mtu( ssl ) != 0 )
5210 {
5211 const size_t mtu = mbedtls_ssl_get_current_mtu( ssl );
5212 const int ret = mbedtls_ssl_get_record_expansion( ssl );
5213 const size_t overhead = (size_t) ret;
5214
5215 if( ret < 0 )
5216 return( ret );
5217
5218 if( mtu <= overhead )
5219 {
5220 MBEDTLS_SSL_DEBUG_MSG( 1, ( "MTU too low for record expansion" ) );
5221 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
5222 }
5223
5224 if( max_len > mtu - overhead )
5225 max_len = mtu - overhead;
5226 }
5227 #endif /* MBEDTLS_SSL_PROTO_DTLS */
5228
5229 #if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
5230 !defined(MBEDTLS_SSL_PROTO_DTLS)
5231 ((void) ssl);
5232 #endif
5233
5234 return( (int) max_len );
5235 }
5236
5237 #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_get_peer_cert(const mbedtls_ssl_context * ssl)5238 const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl )
5239 {
5240 if( ssl == NULL || ssl->session == NULL )
5241 return( NULL );
5242
5243 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5244 return( ssl->session->peer_cert );
5245 #else
5246 return( NULL );
5247 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5248 }
5249 #endif /* MBEDTLS_X509_CRT_PARSE_C */
5250
5251 #if defined(MBEDTLS_SSL_CLI_C)
mbedtls_ssl_get_session(const mbedtls_ssl_context * ssl,mbedtls_ssl_session * dst)5252 int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl,
5253 mbedtls_ssl_session *dst )
5254 {
5255 if( ssl == NULL ||
5256 dst == NULL ||
5257 ssl->session == NULL ||
5258 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )
5259 {
5260 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5261 }
5262
5263 return( mbedtls_ssl_session_copy( dst, ssl->session ) );
5264 }
5265 #endif /* MBEDTLS_SSL_CLI_C */
5266
mbedtls_ssl_get_session_pointer(const mbedtls_ssl_context * ssl)5267 const mbedtls_ssl_session *mbedtls_ssl_get_session_pointer( const mbedtls_ssl_context *ssl )
5268 {
5269 if( ssl == NULL )
5270 return( NULL );
5271
5272 return( ssl->session );
5273 }
5274
5275 /*
5276 * Define ticket header determining Mbed TLS version
5277 * and structure of the ticket.
5278 */
5279
5280 /*
5281 * Define bitflag determining compile-time settings influencing
5282 * structure of serialized SSL sessions.
5283 */
5284
5285 #if defined(MBEDTLS_HAVE_TIME)
5286 #define SSL_SERIALIZED_SESSION_CONFIG_TIME 1
5287 #else
5288 #define SSL_SERIALIZED_SESSION_CONFIG_TIME 0
5289 #endif /* MBEDTLS_HAVE_TIME */
5290
5291 #if defined(MBEDTLS_X509_CRT_PARSE_C)
5292 #define SSL_SERIALIZED_SESSION_CONFIG_CRT 1
5293 #else
5294 #define SSL_SERIALIZED_SESSION_CONFIG_CRT 0
5295 #endif /* MBEDTLS_X509_CRT_PARSE_C */
5296
5297 #if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_SESSION_TICKETS)
5298 #define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 1
5299 #else
5300 #define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 0
5301 #endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_SESSION_TICKETS */
5302
5303 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
5304 #define SSL_SERIALIZED_SESSION_CONFIG_MFL 1
5305 #else
5306 #define SSL_SERIALIZED_SESSION_CONFIG_MFL 0
5307 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
5308
5309 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
5310 #define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC 1
5311 #else
5312 #define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC 0
5313 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
5314
5315 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
5316 #define SSL_SERIALIZED_SESSION_CONFIG_ETM 1
5317 #else
5318 #define SSL_SERIALIZED_SESSION_CONFIG_ETM 0
5319 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
5320
5321 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
5322 #define SSL_SERIALIZED_SESSION_CONFIG_TICKET 1
5323 #else
5324 #define SSL_SERIALIZED_SESSION_CONFIG_TICKET 0
5325 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
5326
5327 #define SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT 0
5328 #define SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT 1
5329 #define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT 2
5330 #define SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT 3
5331 #define SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC_BIT 4
5332 #define SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT 5
5333 #define SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT 6
5334
5335 #define SSL_SERIALIZED_SESSION_CONFIG_BITFLAG \
5336 ( (uint16_t) ( \
5337 ( SSL_SERIALIZED_SESSION_CONFIG_TIME << SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT ) | \
5338 ( SSL_SERIALIZED_SESSION_CONFIG_CRT << SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT ) | \
5339 ( SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET << SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT ) | \
5340 ( SSL_SERIALIZED_SESSION_CONFIG_MFL << SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT ) | \
5341 ( SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC << SSL_SERIALIZED_SESSION_CONFIG_TRUNC_HMAC_BIT ) | \
5342 ( SSL_SERIALIZED_SESSION_CONFIG_ETM << SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT ) | \
5343 ( SSL_SERIALIZED_SESSION_CONFIG_TICKET << SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT ) ) )
5344
5345 static unsigned char ssl_serialized_session_header[] = {
5346 MBEDTLS_VERSION_MAJOR,
5347 MBEDTLS_VERSION_MINOR,
5348 MBEDTLS_VERSION_PATCH,
5349 MBEDTLS_BYTE_1( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
5350 MBEDTLS_BYTE_0( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
5351 };
5352
5353 /*
5354 * Serialize a session in the following format:
5355 * (in the presentation language of TLS, RFC 8446 section 3)
5356 *
5357 * opaque mbedtls_version[3]; // major, minor, patch
5358 * opaque session_format[2]; // version-specific 16-bit field determining
5359 * // the format of the remaining
5360 * // serialized data.
5361 *
5362 * Note: When updating the format, remember to keep
5363 * these version+format bytes.
5364 *
5365 * // In this version, `session_format` determines
5366 * // the setting of those compile-time
5367 * // configuration options which influence
5368 * // the structure of mbedtls_ssl_session.
5369 * uint64 start_time;
5370 * uint8 ciphersuite[2]; // defined by the standard
5371 * uint8 compression; // 0 or 1
5372 * uint8 session_id_len; // at most 32
5373 * opaque session_id[32];
5374 * opaque master[48]; // fixed length in the standard
5375 * uint32 verify_result;
5376 * opaque peer_cert<0..2^24-1>; // length 0 means no peer cert
5377 * opaque ticket<0..2^24-1>; // length 0 means no ticket
5378 * uint32 ticket_lifetime;
5379 * uint8 mfl_code; // up to 255 according to standard
5380 * uint8 trunc_hmac; // 0 or 1
5381 * uint8 encrypt_then_mac; // 0 or 1
5382 *
5383 * The order is the same as in the definition of the structure, except
5384 * verify_result is put before peer_cert so that all mandatory fields come
5385 * together in one block.
5386 */
ssl_session_save(const mbedtls_ssl_session * session,unsigned char omit_header,unsigned char * buf,size_t buf_len,size_t * olen)5387 static int ssl_session_save( const mbedtls_ssl_session *session,
5388 unsigned char omit_header,
5389 unsigned char *buf,
5390 size_t buf_len,
5391 size_t *olen )
5392 {
5393 unsigned char *p = buf;
5394 size_t used = 0;
5395 #if defined(MBEDTLS_HAVE_TIME)
5396 uint64_t start;
5397 #endif
5398 #if defined(MBEDTLS_X509_CRT_PARSE_C)
5399 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5400 size_t cert_len;
5401 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5402 #endif /* MBEDTLS_X509_CRT_PARSE_C */
5403
5404
5405 if( !omit_header )
5406 {
5407 /*
5408 * Add version identifier
5409 */
5410
5411 used += sizeof( ssl_serialized_session_header );
5412
5413 if( used <= buf_len )
5414 {
5415 memcpy( p, ssl_serialized_session_header,
5416 sizeof( ssl_serialized_session_header ) );
5417 p += sizeof( ssl_serialized_session_header );
5418 }
5419 }
5420
5421 /*
5422 * Time
5423 */
5424 #if defined(MBEDTLS_HAVE_TIME)
5425 used += 8;
5426
5427 if( used <= buf_len )
5428 {
5429 start = (uint64_t) session->start;
5430
5431 MBEDTLS_PUT_UINT64_BE( start, p, 0 );
5432 p += 8;
5433 }
5434 #endif /* MBEDTLS_HAVE_TIME */
5435
5436 /*
5437 * Basic mandatory fields
5438 */
5439 used += 2 /* ciphersuite */
5440 + 1 /* compression */
5441 + 1 /* id_len */
5442 + sizeof( session->id )
5443 + sizeof( session->master )
5444 + 4; /* verify_result */
5445
5446 if( used <= buf_len )
5447 {
5448 MBEDTLS_PUT_UINT16_BE( session->ciphersuite, p, 0 );
5449 p += 2;
5450
5451 *p++ = MBEDTLS_BYTE_0( session->compression );
5452
5453 *p++ = MBEDTLS_BYTE_0( session->id_len );
5454 memcpy( p, session->id, 32 );
5455 p += 32;
5456
5457 memcpy( p, session->master, 48 );
5458 p += 48;
5459
5460 MBEDTLS_PUT_UINT32_BE( session->verify_result, p, 0 );
5461 p += 4;
5462 }
5463
5464 /*
5465 * Peer's end-entity certificate
5466 */
5467 #if defined(MBEDTLS_X509_CRT_PARSE_C)
5468 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5469 if( session->peer_cert == NULL )
5470 cert_len = 0;
5471 else
5472 cert_len = session->peer_cert->raw.len;
5473
5474 used += 3 + cert_len;
5475
5476 if( used <= buf_len )
5477 {
5478 *p++ = MBEDTLS_BYTE_2( cert_len );
5479 *p++ = MBEDTLS_BYTE_1( cert_len );
5480 *p++ = MBEDTLS_BYTE_0( cert_len );
5481
5482 if( session->peer_cert != NULL )
5483 {
5484 memcpy( p, session->peer_cert->raw.p, cert_len );
5485 p += cert_len;
5486 }
5487 }
5488 #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5489 if( session->peer_cert_digest != NULL )
5490 {
5491 used += 1 /* type */ + 1 /* length */ + session->peer_cert_digest_len;
5492 if( used <= buf_len )
5493 {
5494 *p++ = (unsigned char) session->peer_cert_digest_type;
5495 *p++ = (unsigned char) session->peer_cert_digest_len;
5496 memcpy( p, session->peer_cert_digest,
5497 session->peer_cert_digest_len );
5498 p += session->peer_cert_digest_len;
5499 }
5500 }
5501 else
5502 {
5503 used += 2;
5504 if( used <= buf_len )
5505 {
5506 *p++ = (unsigned char) MBEDTLS_MD_NONE;
5507 *p++ = 0;
5508 }
5509 }
5510 #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5511 #endif /* MBEDTLS_X509_CRT_PARSE_C */
5512
5513 /*
5514 * Session ticket if any, plus associated data
5515 */
5516 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
5517 used += 3 + session->ticket_len + 4; /* len + ticket + lifetime */
5518
5519 if( used <= buf_len )
5520 {
5521 *p++ = MBEDTLS_BYTE_2( session->ticket_len );
5522 *p++ = MBEDTLS_BYTE_1( session->ticket_len );
5523 *p++ = MBEDTLS_BYTE_0( session->ticket_len );
5524
5525 if( session->ticket != NULL )
5526 {
5527 memcpy( p, session->ticket, session->ticket_len );
5528 p += session->ticket_len;
5529 }
5530
5531 MBEDTLS_PUT_UINT32_BE( session->ticket_lifetime, p, 0 );
5532 p += 4;
5533 }
5534 #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
5535
5536 /*
5537 * Misc extension-related info
5538 */
5539 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
5540 used += 1;
5541
5542 if( used <= buf_len )
5543 *p++ = session->mfl_code;
5544 #endif
5545
5546 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
5547 used += 1;
5548
5549 if( used <= buf_len )
5550 *p++ = (unsigned char)( ( session->trunc_hmac ) & 0xFF );
5551 #endif
5552
5553 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
5554 used += 1;
5555
5556 if( used <= buf_len )
5557 *p++ = MBEDTLS_BYTE_0( session->encrypt_then_mac );
5558 #endif
5559
5560 /* Done */
5561 *olen = used;
5562
5563 if( used > buf_len )
5564 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
5565
5566 return( 0 );
5567 }
5568
5569 /*
5570 * Public wrapper for ssl_session_save()
5571 */
mbedtls_ssl_session_save(const mbedtls_ssl_session * session,unsigned char * buf,size_t buf_len,size_t * olen)5572 int mbedtls_ssl_session_save( const mbedtls_ssl_session *session,
5573 unsigned char *buf,
5574 size_t buf_len,
5575 size_t *olen )
5576 {
5577 return( ssl_session_save( session, 0, buf, buf_len, olen ) );
5578 }
5579
5580 /*
5581 * Deserialize session, see mbedtls_ssl_session_save() for format.
5582 *
5583 * This internal version is wrapped by a public function that cleans up in
5584 * case of error, and has an extra option omit_header.
5585 */
ssl_session_load(mbedtls_ssl_session * session,unsigned char omit_header,const unsigned char * buf,size_t len)5586 static int ssl_session_load( mbedtls_ssl_session *session,
5587 unsigned char omit_header,
5588 const unsigned char *buf,
5589 size_t len )
5590 {
5591 const unsigned char *p = buf;
5592 const unsigned char * const end = buf + len;
5593 #if defined(MBEDTLS_HAVE_TIME)
5594 uint64_t start;
5595 #endif
5596 #if defined(MBEDTLS_X509_CRT_PARSE_C)
5597 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5598 size_t cert_len;
5599 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5600 #endif /* MBEDTLS_X509_CRT_PARSE_C */
5601
5602 if( !omit_header )
5603 {
5604 /*
5605 * Check version identifier
5606 */
5607
5608 if( (size_t)( end - p ) < sizeof( ssl_serialized_session_header ) )
5609 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5610
5611 if( memcmp( p, ssl_serialized_session_header,
5612 sizeof( ssl_serialized_session_header ) ) != 0 )
5613 {
5614 return( MBEDTLS_ERR_SSL_VERSION_MISMATCH );
5615 }
5616 p += sizeof( ssl_serialized_session_header );
5617 }
5618
5619 /*
5620 * Time
5621 */
5622 #if defined(MBEDTLS_HAVE_TIME)
5623 if( 8 > (size_t)( end - p ) )
5624 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5625
5626 start = ( (uint64_t) p[0] << 56 ) |
5627 ( (uint64_t) p[1] << 48 ) |
5628 ( (uint64_t) p[2] << 40 ) |
5629 ( (uint64_t) p[3] << 32 ) |
5630 ( (uint64_t) p[4] << 24 ) |
5631 ( (uint64_t) p[5] << 16 ) |
5632 ( (uint64_t) p[6] << 8 ) |
5633 ( (uint64_t) p[7] );
5634 p += 8;
5635
5636 session->start = (time_t) start;
5637 #endif /* MBEDTLS_HAVE_TIME */
5638
5639 /*
5640 * Basic mandatory fields
5641 */
5642 if( 2 + 1 + 1 + 32 + 48 + 4 > (size_t)( end - p ) )
5643 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5644
5645 session->ciphersuite = ( p[0] << 8 ) | p[1];
5646 p += 2;
5647
5648 session->compression = *p++;
5649
5650 session->id_len = *p++;
5651 memcpy( session->id, p, 32 );
5652 p += 32;
5653
5654 memcpy( session->master, p, 48 );
5655 p += 48;
5656
5657 session->verify_result = ( (uint32_t) p[0] << 24 ) |
5658 ( (uint32_t) p[1] << 16 ) |
5659 ( (uint32_t) p[2] << 8 ) |
5660 ( (uint32_t) p[3] );
5661 p += 4;
5662
5663 /* Immediately clear invalid pointer values that have been read, in case
5664 * we exit early before we replaced them with valid ones. */
5665 #if defined(MBEDTLS_X509_CRT_PARSE_C)
5666 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5667 session->peer_cert = NULL;
5668 #else
5669 session->peer_cert_digest = NULL;
5670 #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5671 #endif /* MBEDTLS_X509_CRT_PARSE_C */
5672 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
5673 session->ticket = NULL;
5674 #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
5675
5676 /*
5677 * Peer certificate
5678 */
5679 #if defined(MBEDTLS_X509_CRT_PARSE_C)
5680 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5681 /* Deserialize CRT from the end of the ticket. */
5682 if( 3 > (size_t)( end - p ) )
5683 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5684
5685 cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
5686 p += 3;
5687
5688 if( cert_len != 0 )
5689 {
5690 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5691
5692 if( cert_len > (size_t)( end - p ) )
5693 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5694
5695 session->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );
5696
5697 if( session->peer_cert == NULL )
5698 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
5699
5700 mbedtls_x509_crt_init( session->peer_cert );
5701
5702 if( ( ret = mbedtls_x509_crt_parse_der( session->peer_cert,
5703 p, cert_len ) ) != 0 )
5704 {
5705 mbedtls_x509_crt_free( session->peer_cert );
5706 mbedtls_free( session->peer_cert );
5707 session->peer_cert = NULL;
5708 return( ret );
5709 }
5710
5711 p += cert_len;
5712 }
5713 #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5714 /* Deserialize CRT digest from the end of the ticket. */
5715 if( 2 > (size_t)( end - p ) )
5716 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5717
5718 session->peer_cert_digest_type = (mbedtls_md_type_t) *p++;
5719 session->peer_cert_digest_len = (size_t) *p++;
5720
5721 if( session->peer_cert_digest_len != 0 )
5722 {
5723 const mbedtls_md_info_t *md_info =
5724 mbedtls_md_info_from_type( session->peer_cert_digest_type );
5725 if( md_info == NULL )
5726 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5727 if( session->peer_cert_digest_len != mbedtls_md_get_size( md_info ) )
5728 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5729
5730 if( session->peer_cert_digest_len > (size_t)( end - p ) )
5731 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5732
5733 session->peer_cert_digest =
5734 mbedtls_calloc( 1, session->peer_cert_digest_len );
5735 if( session->peer_cert_digest == NULL )
5736 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
5737
5738 memcpy( session->peer_cert_digest, p,
5739 session->peer_cert_digest_len );
5740 p += session->peer_cert_digest_len;
5741 }
5742 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
5743 #endif /* MBEDTLS_X509_CRT_PARSE_C */
5744
5745 /*
5746 * Session ticket and associated data
5747 */
5748 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
5749 if( 3 > (size_t)( end - p ) )
5750 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5751
5752 session->ticket_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
5753 p += 3;
5754
5755 if( session->ticket_len != 0 )
5756 {
5757 if( session->ticket_len > (size_t)( end - p ) )
5758 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5759
5760 session->ticket = mbedtls_calloc( 1, session->ticket_len );
5761 if( session->ticket == NULL )
5762 return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
5763
5764 memcpy( session->ticket, p, session->ticket_len );
5765 p += session->ticket_len;
5766 }
5767
5768 if( 4 > (size_t)( end - p ) )
5769 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5770
5771 session->ticket_lifetime = ( (uint32_t) p[0] << 24 ) |
5772 ( (uint32_t) p[1] << 16 ) |
5773 ( (uint32_t) p[2] << 8 ) |
5774 ( (uint32_t) p[3] );
5775 p += 4;
5776 #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
5777
5778 /*
5779 * Misc extension-related info
5780 */
5781 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
5782 if( 1 > (size_t)( end - p ) )
5783 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5784
5785 session->mfl_code = *p++;
5786 #endif
5787
5788 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
5789 if( 1 > (size_t)( end - p ) )
5790 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5791
5792 session->trunc_hmac = *p++;
5793 #endif
5794
5795 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
5796 if( 1 > (size_t)( end - p ) )
5797 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5798
5799 session->encrypt_then_mac = *p++;
5800 #endif
5801
5802 /* Done, should have consumed entire buffer */
5803 if( p != end )
5804 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5805
5806 return( 0 );
5807 }
5808
5809 /*
5810 * Deserialize session: public wrapper for error cleaning
5811 */
mbedtls_ssl_session_load(mbedtls_ssl_session * session,const unsigned char * buf,size_t len)5812 int mbedtls_ssl_session_load( mbedtls_ssl_session *session,
5813 const unsigned char *buf,
5814 size_t len )
5815 {
5816 int ret = ssl_session_load( session, 0, buf, len );
5817
5818 if( ret != 0 )
5819 mbedtls_ssl_session_free( session );
5820
5821 return( ret );
5822 }
5823
5824 /*
5825 * Perform a single step of the SSL handshake
5826 */
mbedtls_ssl_handshake_step(mbedtls_ssl_context * ssl)5827 int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl )
5828 {
5829 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
5830
5831 if( ssl == NULL || ssl->conf == NULL )
5832 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5833
5834 #if defined(MBEDTLS_SSL_CLI_C)
5835 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )
5836 ret = mbedtls_ssl_handshake_client_step( ssl );
5837 #endif
5838 #if defined(MBEDTLS_SSL_SRV_C)
5839 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
5840 ret = mbedtls_ssl_handshake_server_step( ssl );
5841 #endif
5842
5843 return( ret );
5844 }
5845
5846 /*
5847 * Perform the SSL handshake
5848 */
mbedtls_ssl_handshake(mbedtls_ssl_context * ssl)5849 int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl )
5850 {
5851 int ret = 0;
5852
5853 /* Sanity checks */
5854
5855 if( ssl == NULL || ssl->conf == NULL )
5856 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5857
5858 #if defined(MBEDTLS_SSL_PROTO_DTLS)
5859 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
5860 ( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL ) )
5861 {
5862 MBEDTLS_SSL_DEBUG_MSG( 1, ( "You must use "
5863 "mbedtls_ssl_set_timer_cb() for DTLS" ) );
5864 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5865 }
5866 #endif /* MBEDTLS_SSL_PROTO_DTLS */
5867
5868 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
5869
5870 /* Main handshake loop */
5871 while( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
5872 {
5873 ret = mbedtls_ssl_handshake_step( ssl );
5874
5875 if( ret != 0 )
5876 break;
5877 }
5878
5879 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
5880
5881 return( ret );
5882 }
5883
5884 #if defined(MBEDTLS_SSL_RENEGOTIATION)
5885 #if defined(MBEDTLS_SSL_SRV_C)
5886 /*
5887 * Write HelloRequest to request renegotiation on server
5888 */
ssl_write_hello_request(mbedtls_ssl_context * ssl)5889 static int ssl_write_hello_request( mbedtls_ssl_context *ssl )
5890 {
5891 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5892
5893 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello request" ) );
5894
5895 ssl->out_msglen = 4;
5896 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
5897 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST;
5898
5899 if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
5900 {
5901 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
5902 return( ret );
5903 }
5904
5905 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello request" ) );
5906
5907 return( 0 );
5908 }
5909 #endif /* MBEDTLS_SSL_SRV_C */
5910
5911 /*
5912 * Actually renegotiate current connection, triggered by either:
5913 * - any side: calling mbedtls_ssl_renegotiate(),
5914 * - client: receiving a HelloRequest during mbedtls_ssl_read(),
5915 * - server: receiving any handshake message on server during mbedtls_ssl_read() after
5916 * the initial handshake is completed.
5917 * If the handshake doesn't complete due to waiting for I/O, it will continue
5918 * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively.
5919 */
mbedtls_ssl_start_renegotiation(mbedtls_ssl_context * ssl)5920 int mbedtls_ssl_start_renegotiation( mbedtls_ssl_context *ssl )
5921 {
5922 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
5923
5924 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
5925
5926 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
5927 return( ret );
5928
5929 /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and
5930 * the ServerHello will have message_seq = 1" */
5931 #if defined(MBEDTLS_SSL_PROTO_DTLS)
5932 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
5933 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )
5934 {
5935 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
5936 ssl->handshake->out_msg_seq = 1;
5937 else
5938 ssl->handshake->in_msg_seq = 1;
5939 }
5940 #endif
5941
5942 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
5943 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS;
5944
5945 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
5946 {
5947 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
5948 return( ret );
5949 }
5950
5951 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
5952
5953 return( 0 );
5954 }
5955
5956 /*
5957 * Renegotiate current connection on client,
5958 * or request renegotiation on server
5959 */
mbedtls_ssl_renegotiate(mbedtls_ssl_context * ssl)5960 int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl )
5961 {
5962 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
5963
5964 if( ssl == NULL || ssl->conf == NULL )
5965 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5966
5967 #if defined(MBEDTLS_SSL_SRV_C)
5968 /* On server, just send the request */
5969 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )
5970 {
5971 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
5972 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5973
5974 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
5975
5976 /* Did we already try/start sending HelloRequest? */
5977 if( ssl->out_left != 0 )
5978 return( mbedtls_ssl_flush_output( ssl ) );
5979
5980 return( ssl_write_hello_request( ssl ) );
5981 }
5982 #endif /* MBEDTLS_SSL_SRV_C */
5983
5984 #if defined(MBEDTLS_SSL_CLI_C)
5985 /*
5986 * On client, either start the renegotiation process or,
5987 * if already in progress, continue the handshake
5988 */
5989 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
5990 {
5991 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
5992 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
5993
5994 if( ( ret = mbedtls_ssl_start_renegotiation( ssl ) ) != 0 )
5995 {
5996 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_start_renegotiation", ret );
5997 return( ret );
5998 }
5999 }
6000 else
6001 {
6002 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )
6003 {
6004 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret );
6005 return( ret );
6006 }
6007 }
6008 #endif /* MBEDTLS_SSL_CLI_C */
6009
6010 return( ret );
6011 }
6012 #endif /* MBEDTLS_SSL_RENEGOTIATION */
6013
6014 #if defined(MBEDTLS_X509_CRT_PARSE_C)
ssl_key_cert_free(mbedtls_ssl_key_cert * key_cert)6015 static void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert )
6016 {
6017 mbedtls_ssl_key_cert *cur = key_cert, *next;
6018
6019 while( cur != NULL )
6020 {
6021 next = cur->next;
6022 mbedtls_free( cur );
6023 cur = next;
6024 }
6025 }
6026 #endif /* MBEDTLS_X509_CRT_PARSE_C */
6027
mbedtls_ssl_handshake_free(mbedtls_ssl_context * ssl)6028 void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl )
6029 {
6030 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
6031
6032 if( handshake == NULL )
6033 return;
6034
6035 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
6036 if( ssl->conf->f_async_cancel != NULL && handshake->async_in_progress != 0 )
6037 {
6038 ssl->conf->f_async_cancel( ssl );
6039 handshake->async_in_progress = 0;
6040 }
6041 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
6042
6043 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
6044 defined(MBEDTLS_SSL_PROTO_TLS1_1)
6045 mbedtls_md5_free( &handshake->fin_md5 );
6046 mbedtls_sha1_free( &handshake->fin_sha1 );
6047 #endif
6048 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
6049 #if defined(MBEDTLS_SHA256_C)
6050 #if defined(MBEDTLS_USE_PSA_CRYPTO)
6051 psa_hash_abort( &handshake->fin_sha256_psa );
6052 #else
6053 mbedtls_sha256_free( &handshake->fin_sha256 );
6054 #endif
6055 #endif
6056 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
6057 #if defined(MBEDTLS_USE_PSA_CRYPTO)
6058 psa_hash_abort( &handshake->fin_sha384_psa );
6059 #else
6060 mbedtls_sha512_free( &handshake->fin_sha512 );
6061 #endif
6062 #endif
6063 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
6064
6065 #if defined(MBEDTLS_DHM_C)
6066 mbedtls_dhm_free( &handshake->dhm_ctx );
6067 #endif
6068 #if defined(MBEDTLS_ECDH_C)
6069 mbedtls_ecdh_free( &handshake->ecdh_ctx );
6070 #endif
6071 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
6072 mbedtls_ecjpake_free( &handshake->ecjpake_ctx );
6073 #if defined(MBEDTLS_SSL_CLI_C)
6074 mbedtls_free( handshake->ecjpake_cache );
6075 handshake->ecjpake_cache = NULL;
6076 handshake->ecjpake_cache_len = 0;
6077 #endif
6078 #endif
6079
6080 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
6081 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
6082 /* explicit void pointer cast for buggy MS compiler */
6083 mbedtls_free( (void *) handshake->curves );
6084 #endif
6085
6086 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
6087 if( handshake->psk != NULL )
6088 {
6089 mbedtls_platform_zeroize( handshake->psk, handshake->psk_len );
6090 mbedtls_free( handshake->psk );
6091 }
6092 #endif
6093
6094 #if defined(MBEDTLS_X509_CRT_PARSE_C) && \
6095 defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
6096 /*
6097 * Free only the linked list wrapper, not the keys themselves
6098 * since the belong to the SNI callback
6099 */
6100 if( handshake->sni_key_cert != NULL )
6101 {
6102 mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next;
6103
6104 while( cur != NULL )
6105 {
6106 next = cur->next;
6107 mbedtls_free( cur );
6108 cur = next;
6109 }
6110 }
6111 #endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */
6112
6113 #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
6114 mbedtls_x509_crt_restart_free( &handshake->ecrs_ctx );
6115 if( handshake->ecrs_peer_cert != NULL )
6116 {
6117 mbedtls_x509_crt_free( handshake->ecrs_peer_cert );
6118 mbedtls_free( handshake->ecrs_peer_cert );
6119 }
6120 #endif
6121
6122 #if defined(MBEDTLS_X509_CRT_PARSE_C) && \
6123 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
6124 mbedtls_pk_free( &handshake->peer_pubkey );
6125 #endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
6126
6127 #if defined(MBEDTLS_SSL_PROTO_DTLS)
6128 mbedtls_free( handshake->verify_cookie );
6129 mbedtls_ssl_flight_free( handshake->flight );
6130 mbedtls_ssl_buffering_free( ssl );
6131 #endif
6132
6133 #if defined(MBEDTLS_ECDH_C) && \
6134 defined(MBEDTLS_USE_PSA_CRYPTO)
6135 psa_destroy_key( handshake->ecdh_psa_privkey );
6136 #endif /* MBEDTLS_ECDH_C && MBEDTLS_USE_PSA_CRYPTO */
6137
6138 mbedtls_platform_zeroize( handshake,
6139 sizeof( mbedtls_ssl_handshake_params ) );
6140
6141 #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
6142 /* If the buffers are too big - reallocate. Because of the way Mbed TLS
6143 * processes datagrams and the fact that a datagram is allowed to have
6144 * several records in it, it is possible that the I/O buffers are not
6145 * empty at this stage */
6146 handle_buffer_resizing( ssl, 1, mbedtls_ssl_get_input_buflen( ssl ),
6147 mbedtls_ssl_get_output_buflen( ssl ) );
6148 #endif
6149 }
6150
mbedtls_ssl_session_free(mbedtls_ssl_session * session)6151 void mbedtls_ssl_session_free( mbedtls_ssl_session *session )
6152 {
6153 if( session == NULL )
6154 return;
6155
6156 #if defined(MBEDTLS_X509_CRT_PARSE_C)
6157 ssl_clear_peer_cert( session );
6158 #endif
6159
6160 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
6161 mbedtls_free( session->ticket );
6162 #endif
6163
6164 mbedtls_platform_zeroize( session, sizeof( mbedtls_ssl_session ) );
6165 }
6166
6167 #if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
6168
6169 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
6170 #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 1u
6171 #else
6172 #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 0u
6173 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
6174
6175 #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
6176 #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 1u
6177 #else
6178 #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 0u
6179 #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */
6180
6181 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6182 #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 1u
6183 #else
6184 #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 0u
6185 #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
6186
6187 #if defined(MBEDTLS_SSL_ALPN)
6188 #define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 1u
6189 #else
6190 #define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 0u
6191 #endif /* MBEDTLS_SSL_ALPN */
6192
6193 #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT 0
6194 #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT 1
6195 #define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT 2
6196 #define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT 3
6197
6198 #define SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG \
6199 ( (uint32_t) ( \
6200 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT ) | \
6201 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT ) | \
6202 ( SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT ) | \
6203 ( SSL_SERIALIZED_CONTEXT_CONFIG_ALPN << SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT ) | \
6204 0u ) )
6205
6206 static unsigned char ssl_serialized_context_header[] = {
6207 MBEDTLS_VERSION_MAJOR,
6208 MBEDTLS_VERSION_MINOR,
6209 MBEDTLS_VERSION_PATCH,
6210 MBEDTLS_BYTE_1( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
6211 MBEDTLS_BYTE_0( SSL_SERIALIZED_SESSION_CONFIG_BITFLAG ),
6212 MBEDTLS_BYTE_2( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
6213 MBEDTLS_BYTE_1( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
6214 MBEDTLS_BYTE_0( SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG ),
6215 };
6216
6217 /*
6218 * Serialize a full SSL context
6219 *
6220 * The format of the serialized data is:
6221 * (in the presentation language of TLS, RFC 8446 section 3)
6222 *
6223 * // header
6224 * opaque mbedtls_version[3]; // major, minor, patch
6225 * opaque context_format[5]; // version-specific field determining
6226 * // the format of the remaining
6227 * // serialized data.
6228 * Note: When updating the format, remember to keep these
6229 * version+format bytes. (We may make their size part of the API.)
6230 *
6231 * // session sub-structure
6232 * opaque session<1..2^32-1>; // see mbedtls_ssl_session_save()
6233 * // transform sub-structure
6234 * uint8 random[64]; // ServerHello.random+ClientHello.random
6235 * uint8 in_cid<0..2^8-1> // Connection ID: expected incoming value
6236 * uint8 out_cid<0..2^8-1> // Connection ID: outgoing value to use
6237 * // fields from ssl_context
6238 * uint32 badmac_seen; // DTLS: number of records with failing MAC
6239 * uint64 in_window_top; // DTLS: last validated record seq_num
6240 * uint64 in_window; // DTLS: bitmask for replay protection
6241 * uint8 disable_datagram_packing; // DTLS: only one record per datagram
6242 * uint64 cur_out_ctr; // Record layer: outgoing sequence number
6243 * uint16 mtu; // DTLS: path mtu (max outgoing fragment size)
6244 * uint8 alpn_chosen<0..2^8-1> // ALPN: negotiated application protocol
6245 *
6246 * Note that many fields of the ssl_context or sub-structures are not
6247 * serialized, as they fall in one of the following categories:
6248 *
6249 * 1. forced value (eg in_left must be 0)
6250 * 2. pointer to dynamically-allocated memory (eg session, transform)
6251 * 3. value can be re-derived from other data (eg session keys from MS)
6252 * 4. value was temporary (eg content of input buffer)
6253 * 5. value will be provided by the user again (eg I/O callbacks and context)
6254 */
mbedtls_ssl_context_save(mbedtls_ssl_context * ssl,unsigned char * buf,size_t buf_len,size_t * olen)6255 int mbedtls_ssl_context_save( mbedtls_ssl_context *ssl,
6256 unsigned char *buf,
6257 size_t buf_len,
6258 size_t *olen )
6259 {
6260 unsigned char *p = buf;
6261 size_t used = 0;
6262 size_t session_len;
6263 int ret = 0;
6264
6265 /*
6266 * Enforce usage restrictions, see "return BAD_INPUT_DATA" in
6267 * this function's documentation.
6268 *
6269 * These are due to assumptions/limitations in the implementation. Some of
6270 * them are likely to stay (no handshake in progress) some might go away
6271 * (only DTLS) but are currently used to simplify the implementation.
6272 */
6273 /* The initial handshake must be over */
6274 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )
6275 {
6276 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Initial handshake isn't over" ) );
6277 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6278 }
6279 if( ssl->handshake != NULL )
6280 {
6281 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Handshake isn't completed" ) );
6282 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6283 }
6284 /* Double-check that sub-structures are indeed ready */
6285 if( ssl->transform == NULL || ssl->session == NULL )
6286 {
6287 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Serialised structures aren't ready" ) );
6288 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6289 }
6290 /* There must be no pending incoming or outgoing data */
6291 if( mbedtls_ssl_check_pending( ssl ) != 0 )
6292 {
6293 MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending incoming data" ) );
6294 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6295 }
6296 if( ssl->out_left != 0 )
6297 {
6298 MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending outgoing data" ) );
6299 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6300 }
6301 /* Protocol must be DLTS, not TLS */
6302 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM )
6303 {
6304 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only DTLS is supported" ) );
6305 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6306 }
6307 /* Version must be 1.2 */
6308 if( ssl->major_ver != MBEDTLS_SSL_MAJOR_VERSION_3 )
6309 {
6310 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only version 1.2 supported" ) );
6311 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6312 }
6313 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
6314 {
6315 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only version 1.2 supported" ) );
6316 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6317 }
6318 /* We must be using an AEAD ciphersuite */
6319 if( mbedtls_ssl_transform_uses_aead( ssl->transform ) != 1 )
6320 {
6321 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only AEAD ciphersuites supported" ) );
6322 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6323 }
6324 /* Renegotiation must not be enabled */
6325 #if defined(MBEDTLS_SSL_RENEGOTIATION)
6326 if( ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED )
6327 {
6328 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Renegotiation must not be enabled" ) );
6329 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6330 }
6331 #endif
6332
6333 /*
6334 * Version and format identifier
6335 */
6336 used += sizeof( ssl_serialized_context_header );
6337
6338 if( used <= buf_len )
6339 {
6340 memcpy( p, ssl_serialized_context_header,
6341 sizeof( ssl_serialized_context_header ) );
6342 p += sizeof( ssl_serialized_context_header );
6343 }
6344
6345 /*
6346 * Session (length + data)
6347 */
6348 ret = ssl_session_save( ssl->session, 1, NULL, 0, &session_len );
6349 if( ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL )
6350 return( ret );
6351
6352 used += 4 + session_len;
6353 if( used <= buf_len )
6354 {
6355 MBEDTLS_PUT_UINT32_BE( session_len, p, 0 );
6356 p += 4;
6357
6358 ret = ssl_session_save( ssl->session, 1,
6359 p, session_len, &session_len );
6360 if( ret != 0 )
6361 return( ret );
6362
6363 p += session_len;
6364 }
6365
6366 /*
6367 * Transform
6368 */
6369 used += sizeof( ssl->transform->randbytes );
6370 if( used <= buf_len )
6371 {
6372 memcpy( p, ssl->transform->randbytes,
6373 sizeof( ssl->transform->randbytes ) );
6374 p += sizeof( ssl->transform->randbytes );
6375 }
6376
6377 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
6378 used += 2 + ssl->transform->in_cid_len + ssl->transform->out_cid_len;
6379 if( used <= buf_len )
6380 {
6381 *p++ = ssl->transform->in_cid_len;
6382 memcpy( p, ssl->transform->in_cid, ssl->transform->in_cid_len );
6383 p += ssl->transform->in_cid_len;
6384
6385 *p++ = ssl->transform->out_cid_len;
6386 memcpy( p, ssl->transform->out_cid, ssl->transform->out_cid_len );
6387 p += ssl->transform->out_cid_len;
6388 }
6389 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
6390
6391 /*
6392 * Saved fields from top-level ssl_context structure
6393 */
6394 #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
6395 used += 4;
6396 if( used <= buf_len )
6397 {
6398 MBEDTLS_PUT_UINT32_BE( ssl->badmac_seen, p, 0 );
6399 p += 4;
6400 }
6401 #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */
6402
6403 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6404 used += 16;
6405 if( used <= buf_len )
6406 {
6407 MBEDTLS_PUT_UINT64_BE( ssl->in_window_top, p, 0 );
6408 p += 8;
6409
6410 MBEDTLS_PUT_UINT64_BE( ssl->in_window, p, 0 );
6411 p += 8;
6412 }
6413 #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
6414
6415 #if defined(MBEDTLS_SSL_PROTO_DTLS)
6416 used += 1;
6417 if( used <= buf_len )
6418 {
6419 *p++ = ssl->disable_datagram_packing;
6420 }
6421 #endif /* MBEDTLS_SSL_PROTO_DTLS */
6422
6423 used += 8;
6424 if( used <= buf_len )
6425 {
6426 memcpy( p, ssl->cur_out_ctr, 8 );
6427 p += 8;
6428 }
6429
6430 #if defined(MBEDTLS_SSL_PROTO_DTLS)
6431 used += 2;
6432 if( used <= buf_len )
6433 {
6434 MBEDTLS_PUT_UINT16_BE( ssl->mtu, p, 0 );
6435 p += 2;
6436 }
6437 #endif /* MBEDTLS_SSL_PROTO_DTLS */
6438
6439 #if defined(MBEDTLS_SSL_ALPN)
6440 {
6441 const uint8_t alpn_len = ssl->alpn_chosen
6442 ? (uint8_t) strlen( ssl->alpn_chosen )
6443 : 0;
6444
6445 used += 1 + alpn_len;
6446 if( used <= buf_len )
6447 {
6448 *p++ = alpn_len;
6449
6450 if( ssl->alpn_chosen != NULL )
6451 {
6452 memcpy( p, ssl->alpn_chosen, alpn_len );
6453 p += alpn_len;
6454 }
6455 }
6456 }
6457 #endif /* MBEDTLS_SSL_ALPN */
6458
6459 /*
6460 * Done
6461 */
6462 *olen = used;
6463
6464 if( used > buf_len )
6465 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
6466
6467 MBEDTLS_SSL_DEBUG_BUF( 4, "saved context", buf, used );
6468
6469 return( mbedtls_ssl_session_reset_int( ssl, 0 ) );
6470 }
6471
6472 /*
6473 * Helper to get TLS 1.2 PRF from ciphersuite
6474 * (Duplicates bits of logic from ssl_set_handshake_prfs().)
6475 */
6476 typedef int (*tls_prf_fn)( const unsigned char *secret, size_t slen,
6477 const char *label,
6478 const unsigned char *random, size_t rlen,
6479 unsigned char *dstbuf, size_t dlen );
ssl_tls12prf_from_cs(int ciphersuite_id)6480 static tls_prf_fn ssl_tls12prf_from_cs( int ciphersuite_id )
6481 {
6482 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
6483 const mbedtls_ssl_ciphersuite_t * const ciphersuite_info =
6484 mbedtls_ssl_ciphersuite_from_id( ciphersuite_id );
6485
6486 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
6487 return( tls_prf_sha384 );
6488 #else
6489 (void) ciphersuite_id;
6490 #endif
6491 return( tls_prf_sha256 );
6492 }
6493
6494 /*
6495 * Deserialize context, see mbedtls_ssl_context_save() for format.
6496 *
6497 * This internal version is wrapped by a public function that cleans up in
6498 * case of error.
6499 */
ssl_context_load(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)6500 static int ssl_context_load( mbedtls_ssl_context *ssl,
6501 const unsigned char *buf,
6502 size_t len )
6503 {
6504 const unsigned char *p = buf;
6505 const unsigned char * const end = buf + len;
6506 size_t session_len;
6507 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6508
6509 /*
6510 * The context should have been freshly setup or reset.
6511 * Give the user an error in case of obvious misuse.
6512 * (Checking session is useful because it won't be NULL if we're
6513 * renegotiating, or if the user mistakenly loaded a session first.)
6514 */
6515 if( ssl->state != MBEDTLS_SSL_HELLO_REQUEST ||
6516 ssl->session != NULL )
6517 {
6518 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6519 }
6520
6521 /*
6522 * We can't check that the config matches the initial one, but we can at
6523 * least check it matches the requirements for serializing.
6524 */
6525 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
6526 ssl->conf->max_major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
6527 ssl->conf->min_major_ver > MBEDTLS_SSL_MAJOR_VERSION_3 ||
6528 ssl->conf->max_minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ||
6529 ssl->conf->min_minor_ver > MBEDTLS_SSL_MINOR_VERSION_3 ||
6530 #if defined(MBEDTLS_SSL_RENEGOTIATION)
6531 ssl->conf->disable_renegotiation != MBEDTLS_SSL_RENEGOTIATION_DISABLED ||
6532 #endif
6533 0 )
6534 {
6535 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6536 }
6537
6538 MBEDTLS_SSL_DEBUG_BUF( 4, "context to load", buf, len );
6539
6540 /*
6541 * Check version identifier
6542 */
6543 if( (size_t)( end - p ) < sizeof( ssl_serialized_context_header ) )
6544 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6545
6546 if( memcmp( p, ssl_serialized_context_header,
6547 sizeof( ssl_serialized_context_header ) ) != 0 )
6548 {
6549 return( MBEDTLS_ERR_SSL_VERSION_MISMATCH );
6550 }
6551 p += sizeof( ssl_serialized_context_header );
6552
6553 /*
6554 * Session
6555 */
6556 if( (size_t)( end - p ) < 4 )
6557 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6558
6559 session_len = ( (size_t) p[0] << 24 ) |
6560 ( (size_t) p[1] << 16 ) |
6561 ( (size_t) p[2] << 8 ) |
6562 ( (size_t) p[3] );
6563 p += 4;
6564
6565 /* This has been allocated by ssl_handshake_init(), called by
6566 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
6567 ssl->session = ssl->session_negotiate;
6568 ssl->session_in = ssl->session;
6569 ssl->session_out = ssl->session;
6570 ssl->session_negotiate = NULL;
6571
6572 if( (size_t)( end - p ) < session_len )
6573 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6574
6575 ret = ssl_session_load( ssl->session, 1, p, session_len );
6576 if( ret != 0 )
6577 {
6578 mbedtls_ssl_session_free( ssl->session );
6579 return( ret );
6580 }
6581
6582 p += session_len;
6583
6584 /*
6585 * Transform
6586 */
6587
6588 /* This has been allocated by ssl_handshake_init(), called by
6589 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
6590 ssl->transform = ssl->transform_negotiate;
6591 ssl->transform_in = ssl->transform;
6592 ssl->transform_out = ssl->transform;
6593 ssl->transform_negotiate = NULL;
6594
6595 /* Read random bytes and populate structure */
6596 if( (size_t)( end - p ) < sizeof( ssl->transform->randbytes ) )
6597 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6598
6599 ret = ssl_populate_transform( ssl->transform,
6600 ssl->session->ciphersuite,
6601 ssl->session->master,
6602 #if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC)
6603 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
6604 ssl->session->encrypt_then_mac,
6605 #endif
6606 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
6607 ssl->session->trunc_hmac,
6608 #endif
6609 #endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */
6610 #if defined(MBEDTLS_ZLIB_SUPPORT)
6611 ssl->session->compression,
6612 #endif
6613 ssl_tls12prf_from_cs( ssl->session->ciphersuite ),
6614 p, /* currently pointing to randbytes */
6615 MBEDTLS_SSL_MINOR_VERSION_3, /* (D)TLS 1.2 is forced */
6616 ssl->conf->endpoint,
6617 ssl );
6618 if( ret != 0 )
6619 return( ret );
6620
6621 p += sizeof( ssl->transform->randbytes );
6622
6623 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
6624 /* Read connection IDs and store them */
6625 if( (size_t)( end - p ) < 1 )
6626 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6627
6628 ssl->transform->in_cid_len = *p++;
6629
6630 if( (size_t)( end - p ) < ssl->transform->in_cid_len + 1u )
6631 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6632
6633 memcpy( ssl->transform->in_cid, p, ssl->transform->in_cid_len );
6634 p += ssl->transform->in_cid_len;
6635
6636 ssl->transform->out_cid_len = *p++;
6637
6638 if( (size_t)( end - p ) < ssl->transform->out_cid_len )
6639 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6640
6641 memcpy( ssl->transform->out_cid, p, ssl->transform->out_cid_len );
6642 p += ssl->transform->out_cid_len;
6643 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
6644
6645 /*
6646 * Saved fields from top-level ssl_context structure
6647 */
6648 #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)
6649 if( (size_t)( end - p ) < 4 )
6650 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6651
6652 ssl->badmac_seen = ( (uint32_t) p[0] << 24 ) |
6653 ( (uint32_t) p[1] << 16 ) |
6654 ( (uint32_t) p[2] << 8 ) |
6655 ( (uint32_t) p[3] );
6656 p += 4;
6657 #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */
6658
6659 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6660 if( (size_t)( end - p ) < 16 )
6661 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6662
6663 ssl->in_window_top = ( (uint64_t) p[0] << 56 ) |
6664 ( (uint64_t) p[1] << 48 ) |
6665 ( (uint64_t) p[2] << 40 ) |
6666 ( (uint64_t) p[3] << 32 ) |
6667 ( (uint64_t) p[4] << 24 ) |
6668 ( (uint64_t) p[5] << 16 ) |
6669 ( (uint64_t) p[6] << 8 ) |
6670 ( (uint64_t) p[7] );
6671 p += 8;
6672
6673 ssl->in_window = ( (uint64_t) p[0] << 56 ) |
6674 ( (uint64_t) p[1] << 48 ) |
6675 ( (uint64_t) p[2] << 40 ) |
6676 ( (uint64_t) p[3] << 32 ) |
6677 ( (uint64_t) p[4] << 24 ) |
6678 ( (uint64_t) p[5] << 16 ) |
6679 ( (uint64_t) p[6] << 8 ) |
6680 ( (uint64_t) p[7] );
6681 p += 8;
6682 #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
6683
6684 #if defined(MBEDTLS_SSL_PROTO_DTLS)
6685 if( (size_t)( end - p ) < 1 )
6686 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6687
6688 ssl->disable_datagram_packing = *p++;
6689 #endif /* MBEDTLS_SSL_PROTO_DTLS */
6690
6691 if( (size_t)( end - p ) < 8 )
6692 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6693
6694 memcpy( ssl->cur_out_ctr, p, 8 );
6695 p += 8;
6696
6697 #if defined(MBEDTLS_SSL_PROTO_DTLS)
6698 if( (size_t)( end - p ) < 2 )
6699 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6700
6701 ssl->mtu = ( p[0] << 8 ) | p[1];
6702 p += 2;
6703 #endif /* MBEDTLS_SSL_PROTO_DTLS */
6704
6705 #if defined(MBEDTLS_SSL_ALPN)
6706 {
6707 uint8_t alpn_len;
6708 const char **cur;
6709
6710 if( (size_t)( end - p ) < 1 )
6711 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6712
6713 alpn_len = *p++;
6714
6715 if( alpn_len != 0 && ssl->conf->alpn_list != NULL )
6716 {
6717 /* alpn_chosen should point to an item in the configured list */
6718 for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
6719 {
6720 if( strlen( *cur ) == alpn_len &&
6721 memcmp( p, cur, alpn_len ) == 0 )
6722 {
6723 ssl->alpn_chosen = *cur;
6724 break;
6725 }
6726 }
6727 }
6728
6729 /* can only happen on conf mismatch */
6730 if( alpn_len != 0 && ssl->alpn_chosen == NULL )
6731 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6732
6733 p += alpn_len;
6734 }
6735 #endif /* MBEDTLS_SSL_ALPN */
6736
6737 /*
6738 * Forced fields from top-level ssl_context structure
6739 *
6740 * Most of them already set to the correct value by mbedtls_ssl_init() and
6741 * mbedtls_ssl_reset(), so we only need to set the remaining ones.
6742 */
6743 ssl->state = MBEDTLS_SSL_HANDSHAKE_OVER;
6744
6745 ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
6746 ssl->minor_ver = MBEDTLS_SSL_MINOR_VERSION_3;
6747
6748 /* Adjust pointers for header fields of outgoing records to
6749 * the given transform, accounting for explicit IV and CID. */
6750 mbedtls_ssl_update_out_pointers( ssl, ssl->transform );
6751
6752 #if defined(MBEDTLS_SSL_PROTO_DTLS)
6753 ssl->in_epoch = 1;
6754 #endif
6755
6756 /* mbedtls_ssl_reset() leaves the handshake sub-structure allocated,
6757 * which we don't want - otherwise we'd end up freeing the wrong transform
6758 * by calling mbedtls_ssl_handshake_wrapup_free_hs_transform()
6759 * inappropriately. */
6760 if( ssl->handshake != NULL )
6761 {
6762 mbedtls_ssl_handshake_free( ssl );
6763 mbedtls_free( ssl->handshake );
6764 ssl->handshake = NULL;
6765 }
6766
6767 /*
6768 * Done - should have consumed entire buffer
6769 */
6770 if( p != end )
6771 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
6772
6773 return( 0 );
6774 }
6775
6776 /*
6777 * Deserialize context: public wrapper for error cleaning
6778 */
mbedtls_ssl_context_load(mbedtls_ssl_context * context,const unsigned char * buf,size_t len)6779 int mbedtls_ssl_context_load( mbedtls_ssl_context *context,
6780 const unsigned char *buf,
6781 size_t len )
6782 {
6783 int ret = ssl_context_load( context, buf, len );
6784
6785 if( ret != 0 )
6786 mbedtls_ssl_free( context );
6787
6788 return( ret );
6789 }
6790 #endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
6791
6792 /*
6793 * Free an SSL context
6794 */
mbedtls_ssl_free(mbedtls_ssl_context * ssl)6795 void mbedtls_ssl_free( mbedtls_ssl_context *ssl )
6796 {
6797 if( ssl == NULL )
6798 return;
6799
6800 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> free" ) );
6801
6802 if( ssl->out_buf != NULL )
6803 {
6804 #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
6805 size_t out_buf_len = ssl->out_buf_len;
6806 #else
6807 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
6808 #endif
6809
6810 mbedtls_platform_zeroize( ssl->out_buf, out_buf_len );
6811 mbedtls_free( ssl->out_buf );
6812 ssl->out_buf = NULL;
6813 }
6814
6815 if( ssl->in_buf != NULL )
6816 {
6817 #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
6818 size_t in_buf_len = ssl->in_buf_len;
6819 #else
6820 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
6821 #endif
6822
6823 mbedtls_platform_zeroize( ssl->in_buf, in_buf_len );
6824 mbedtls_free( ssl->in_buf );
6825 ssl->in_buf = NULL;
6826 }
6827
6828 #if defined(MBEDTLS_ZLIB_SUPPORT)
6829 if( ssl->compress_buf != NULL )
6830 {
6831 mbedtls_platform_zeroize( ssl->compress_buf, MBEDTLS_SSL_COMPRESS_BUFFER_LEN );
6832 mbedtls_free( ssl->compress_buf );
6833 }
6834 #endif
6835
6836 if( ssl->transform )
6837 {
6838 mbedtls_ssl_transform_free( ssl->transform );
6839 mbedtls_free( ssl->transform );
6840 }
6841
6842 if( ssl->handshake )
6843 {
6844 mbedtls_ssl_handshake_free( ssl );
6845 mbedtls_ssl_transform_free( ssl->transform_negotiate );
6846 mbedtls_ssl_session_free( ssl->session_negotiate );
6847
6848 mbedtls_free( ssl->handshake );
6849 mbedtls_free( ssl->transform_negotiate );
6850 mbedtls_free( ssl->session_negotiate );
6851 }
6852
6853 if( ssl->session )
6854 {
6855 mbedtls_ssl_session_free( ssl->session );
6856 mbedtls_free( ssl->session );
6857 }
6858
6859 #if defined(MBEDTLS_X509_CRT_PARSE_C)
6860 if( ssl->hostname != NULL )
6861 {
6862 mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) );
6863 mbedtls_free( ssl->hostname );
6864 }
6865 #endif
6866
6867 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)
6868 if( mbedtls_ssl_hw_record_finish != NULL )
6869 {
6870 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_finish()" ) );
6871 mbedtls_ssl_hw_record_finish( ssl );
6872 }
6873 #endif
6874
6875 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
6876 mbedtls_free( ssl->cli_id );
6877 #endif
6878
6879 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) );
6880
6881 /* Actually clear after last debug message */
6882 mbedtls_platform_zeroize( ssl, sizeof( mbedtls_ssl_context ) );
6883 }
6884
6885 /*
6886 * Initialze mbedtls_ssl_config
6887 */
mbedtls_ssl_config_init(mbedtls_ssl_config * conf)6888 void mbedtls_ssl_config_init( mbedtls_ssl_config *conf )
6889 {
6890 memset( conf, 0, sizeof( mbedtls_ssl_config ) );
6891 }
6892
6893 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
6894 static int ssl_preset_default_hashes[] = {
6895 #if defined(MBEDTLS_SHA512_C)
6896 MBEDTLS_MD_SHA512,
6897 #endif
6898 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
6899 MBEDTLS_MD_SHA384,
6900 #endif
6901 #if defined(MBEDTLS_SHA256_C)
6902 MBEDTLS_MD_SHA256,
6903 MBEDTLS_MD_SHA224,
6904 #endif
6905 #if defined(MBEDTLS_SHA1_C) && defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE)
6906 MBEDTLS_MD_SHA1,
6907 #endif
6908 MBEDTLS_MD_NONE
6909 };
6910 #endif
6911
6912 static int ssl_preset_suiteb_ciphersuites[] = {
6913 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
6914 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
6915 0
6916 };
6917
6918 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
6919 static int ssl_preset_suiteb_hashes[] = {
6920 MBEDTLS_MD_SHA256,
6921 MBEDTLS_MD_SHA384,
6922 MBEDTLS_MD_NONE
6923 };
6924 #endif
6925
6926 #if defined(MBEDTLS_ECP_C)
6927 static mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = {
6928 #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
6929 MBEDTLS_ECP_DP_SECP256R1,
6930 #endif
6931 #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
6932 MBEDTLS_ECP_DP_SECP384R1,
6933 #endif
6934 MBEDTLS_ECP_DP_NONE
6935 };
6936 #endif
6937
6938 /*
6939 * Load default in mbedtls_ssl_config
6940 */
mbedtls_ssl_config_defaults(mbedtls_ssl_config * conf,int endpoint,int transport,int preset)6941 int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,
6942 int endpoint, int transport, int preset )
6943 {
6944 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
6945 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
6946 #endif
6947
6948 /* Use the functions here so that they are covered in tests,
6949 * but otherwise access member directly for efficiency */
6950 mbedtls_ssl_conf_endpoint( conf, endpoint );
6951 mbedtls_ssl_conf_transport( conf, transport );
6952
6953 /*
6954 * Things that are common to all presets
6955 */
6956 #if defined(MBEDTLS_SSL_CLI_C)
6957 if( endpoint == MBEDTLS_SSL_IS_CLIENT )
6958 {
6959 conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
6960 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
6961 conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED;
6962 #endif
6963 }
6964 #endif
6965
6966 #if defined(MBEDTLS_ARC4_C)
6967 conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED;
6968 #endif
6969
6970 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
6971 conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
6972 #endif
6973
6974 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
6975 conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
6976 #endif
6977
6978 #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
6979 conf->cbc_record_splitting = MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED;
6980 #endif
6981
6982 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
6983 conf->f_cookie_write = ssl_cookie_write_dummy;
6984 conf->f_cookie_check = ssl_cookie_check_dummy;
6985 #endif
6986
6987 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
6988 conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
6989 #endif
6990
6991 #if defined(MBEDTLS_SSL_SRV_C)
6992 conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED;
6993 #endif
6994
6995 #if defined(MBEDTLS_SSL_PROTO_DTLS)
6996 conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
6997 conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
6998 #endif
6999
7000 #if defined(MBEDTLS_SSL_RENEGOTIATION)
7001 conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
7002 memset( conf->renego_period, 0x00, 2 );
7003 memset( conf->renego_period + 2, 0xFF, 6 );
7004 #endif
7005
7006 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
7007 if( endpoint == MBEDTLS_SSL_IS_SERVER )
7008 {
7009 const unsigned char dhm_p[] =
7010 MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN;
7011 const unsigned char dhm_g[] =
7012 MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN;
7013
7014 if ( ( ret = mbedtls_ssl_conf_dh_param_bin( conf,
7015 dhm_p, sizeof( dhm_p ),
7016 dhm_g, sizeof( dhm_g ) ) ) != 0 )
7017 {
7018 return( ret );
7019 }
7020 }
7021 #endif
7022
7023 /*
7024 * Preset-specific defaults
7025 */
7026 switch( preset )
7027 {
7028 /*
7029 * NSA Suite B
7030 */
7031 case MBEDTLS_SSL_PRESET_SUITEB:
7032 conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
7033 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */
7034 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
7035 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
7036
7037 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
7038 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
7039 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
7040 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
7041 ssl_preset_suiteb_ciphersuites;
7042
7043 #if defined(MBEDTLS_X509_CRT_PARSE_C)
7044 conf->cert_profile = &mbedtls_x509_crt_profile_suiteb;
7045 #endif
7046
7047 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
7048 conf->sig_hashes = ssl_preset_suiteb_hashes;
7049 #endif
7050
7051 #if defined(MBEDTLS_ECP_C)
7052 conf->curve_list = ssl_preset_suiteb_curves;
7053 #endif
7054 break;
7055
7056 /*
7057 * Default
7058 */
7059 default:
7060 conf->min_major_ver = ( MBEDTLS_SSL_MIN_MAJOR_VERSION >
7061 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION ) ?
7062 MBEDTLS_SSL_MIN_MAJOR_VERSION :
7063 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION;
7064 conf->min_minor_ver = ( MBEDTLS_SSL_MIN_MINOR_VERSION >
7065 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION ) ?
7066 MBEDTLS_SSL_MIN_MINOR_VERSION :
7067 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION;
7068 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
7069 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
7070
7071 #if defined(MBEDTLS_SSL_PROTO_DTLS)
7072 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
7073 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_2;
7074 #endif
7075
7076 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =
7077 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =
7078 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =
7079 conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =
7080 mbedtls_ssl_list_ciphersuites();
7081
7082 #if defined(MBEDTLS_X509_CRT_PARSE_C)
7083 conf->cert_profile = &mbedtls_x509_crt_profile_default;
7084 #endif
7085
7086 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
7087 conf->sig_hashes = ssl_preset_default_hashes;
7088 #endif
7089
7090 #if defined(MBEDTLS_ECP_C)
7091 conf->curve_list = mbedtls_ecp_grp_id_list();
7092 #endif
7093
7094 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
7095 conf->dhm_min_bitlen = 1024;
7096 #endif
7097 }
7098
7099 return( 0 );
7100 }
7101
7102 /*
7103 * Free mbedtls_ssl_config
7104 */
mbedtls_ssl_config_free(mbedtls_ssl_config * conf)7105 void mbedtls_ssl_config_free( mbedtls_ssl_config *conf )
7106 {
7107 #if defined(MBEDTLS_DHM_C)
7108 mbedtls_mpi_free( &conf->dhm_P );
7109 mbedtls_mpi_free( &conf->dhm_G );
7110 #endif
7111
7112 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
7113 if( conf->psk != NULL )
7114 {
7115 mbedtls_platform_zeroize( conf->psk, conf->psk_len );
7116 mbedtls_free( conf->psk );
7117 conf->psk = NULL;
7118 conf->psk_len = 0;
7119 }
7120
7121 if( conf->psk_identity != NULL )
7122 {
7123 mbedtls_platform_zeroize( conf->psk_identity, conf->psk_identity_len );
7124 mbedtls_free( conf->psk_identity );
7125 conf->psk_identity = NULL;
7126 conf->psk_identity_len = 0;
7127 }
7128 #endif
7129
7130 #if defined(MBEDTLS_X509_CRT_PARSE_C)
7131 ssl_key_cert_free( conf->key_cert );
7132 #endif
7133
7134 mbedtls_platform_zeroize( conf, sizeof( mbedtls_ssl_config ) );
7135 }
7136
7137 #if defined(MBEDTLS_PK_C) && \
7138 ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) )
7139 /*
7140 * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
7141 */
mbedtls_ssl_sig_from_pk(mbedtls_pk_context * pk)7142 unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk )
7143 {
7144 #if defined(MBEDTLS_RSA_C)
7145 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) )
7146 return( MBEDTLS_SSL_SIG_RSA );
7147 #endif
7148 #if defined(MBEDTLS_ECDSA_C)
7149 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) )
7150 return( MBEDTLS_SSL_SIG_ECDSA );
7151 #endif
7152 return( MBEDTLS_SSL_SIG_ANON );
7153 }
7154
mbedtls_ssl_sig_from_pk_alg(mbedtls_pk_type_t type)7155 unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type )
7156 {
7157 switch( type ) {
7158 case MBEDTLS_PK_RSA:
7159 return( MBEDTLS_SSL_SIG_RSA );
7160 case MBEDTLS_PK_ECDSA:
7161 case MBEDTLS_PK_ECKEY:
7162 return( MBEDTLS_SSL_SIG_ECDSA );
7163 default:
7164 return( MBEDTLS_SSL_SIG_ANON );
7165 }
7166 }
7167
mbedtls_ssl_pk_alg_from_sig(unsigned char sig)7168 mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig )
7169 {
7170 switch( sig )
7171 {
7172 #if defined(MBEDTLS_RSA_C)
7173 case MBEDTLS_SSL_SIG_RSA:
7174 return( MBEDTLS_PK_RSA );
7175 #endif
7176 #if defined(MBEDTLS_ECDSA_C)
7177 case MBEDTLS_SSL_SIG_ECDSA:
7178 return( MBEDTLS_PK_ECDSA );
7179 #endif
7180 default:
7181 return( MBEDTLS_PK_NONE );
7182 }
7183 }
7184 #endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */
7185
7186 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
7187 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
7188
7189 /* Find an entry in a signature-hash set matching a given hash algorithm. */
mbedtls_ssl_sig_hash_set_find(mbedtls_ssl_sig_hash_set_t * set,mbedtls_pk_type_t sig_alg)7190 mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set,
7191 mbedtls_pk_type_t sig_alg )
7192 {
7193 switch( sig_alg )
7194 {
7195 case MBEDTLS_PK_RSA:
7196 return( set->rsa );
7197 case MBEDTLS_PK_ECDSA:
7198 return( set->ecdsa );
7199 default:
7200 return( MBEDTLS_MD_NONE );
7201 }
7202 }
7203
7204 /* Add a signature-hash-pair to a signature-hash set */
mbedtls_ssl_sig_hash_set_add(mbedtls_ssl_sig_hash_set_t * set,mbedtls_pk_type_t sig_alg,mbedtls_md_type_t md_alg)7205 void mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set,
7206 mbedtls_pk_type_t sig_alg,
7207 mbedtls_md_type_t md_alg )
7208 {
7209 switch( sig_alg )
7210 {
7211 case MBEDTLS_PK_RSA:
7212 if( set->rsa == MBEDTLS_MD_NONE )
7213 set->rsa = md_alg;
7214 break;
7215
7216 case MBEDTLS_PK_ECDSA:
7217 if( set->ecdsa == MBEDTLS_MD_NONE )
7218 set->ecdsa = md_alg;
7219 break;
7220
7221 default:
7222 break;
7223 }
7224 }
7225
7226 /* Allow exactly one hash algorithm for each signature. */
mbedtls_ssl_sig_hash_set_const_hash(mbedtls_ssl_sig_hash_set_t * set,mbedtls_md_type_t md_alg)7227 void mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set,
7228 mbedtls_md_type_t md_alg )
7229 {
7230 set->rsa = md_alg;
7231 set->ecdsa = md_alg;
7232 }
7233
7234 #endif /* MBEDTLS_SSL_PROTO_TLS1_2) &&
7235 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
7236
7237 /*
7238 * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
7239 */
mbedtls_ssl_md_alg_from_hash(unsigned char hash)7240 mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash )
7241 {
7242 switch( hash )
7243 {
7244 #if defined(MBEDTLS_MD5_C)
7245 case MBEDTLS_SSL_HASH_MD5:
7246 return( MBEDTLS_MD_MD5 );
7247 #endif
7248 #if defined(MBEDTLS_SHA1_C)
7249 case MBEDTLS_SSL_HASH_SHA1:
7250 return( MBEDTLS_MD_SHA1 );
7251 #endif
7252 #if defined(MBEDTLS_SHA256_C)
7253 case MBEDTLS_SSL_HASH_SHA224:
7254 return( MBEDTLS_MD_SHA224 );
7255 case MBEDTLS_SSL_HASH_SHA256:
7256 return( MBEDTLS_MD_SHA256 );
7257 #endif
7258 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
7259 case MBEDTLS_SSL_HASH_SHA384:
7260 return( MBEDTLS_MD_SHA384 );
7261 #endif
7262 #if defined(MBEDTLS_SHA512_C)
7263 case MBEDTLS_SSL_HASH_SHA512:
7264 return( MBEDTLS_MD_SHA512 );
7265 #endif
7266 default:
7267 return( MBEDTLS_MD_NONE );
7268 }
7269 }
7270
7271 /*
7272 * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX
7273 */
mbedtls_ssl_hash_from_md_alg(int md)7274 unsigned char mbedtls_ssl_hash_from_md_alg( int md )
7275 {
7276 switch( md )
7277 {
7278 #if defined(MBEDTLS_MD5_C)
7279 case MBEDTLS_MD_MD5:
7280 return( MBEDTLS_SSL_HASH_MD5 );
7281 #endif
7282 #if defined(MBEDTLS_SHA1_C)
7283 case MBEDTLS_MD_SHA1:
7284 return( MBEDTLS_SSL_HASH_SHA1 );
7285 #endif
7286 #if defined(MBEDTLS_SHA256_C)
7287 case MBEDTLS_MD_SHA224:
7288 return( MBEDTLS_SSL_HASH_SHA224 );
7289 case MBEDTLS_MD_SHA256:
7290 return( MBEDTLS_SSL_HASH_SHA256 );
7291 #endif
7292 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
7293 case MBEDTLS_MD_SHA384:
7294 return( MBEDTLS_SSL_HASH_SHA384 );
7295 #endif
7296 #if defined(MBEDTLS_SHA512_C)
7297 case MBEDTLS_MD_SHA512:
7298 return( MBEDTLS_SSL_HASH_SHA512 );
7299 #endif
7300 default:
7301 return( MBEDTLS_SSL_HASH_NONE );
7302 }
7303 }
7304
7305 #if defined(MBEDTLS_ECP_C)
7306 /*
7307 * Check if a curve proposed by the peer is in our list.
7308 * Return 0 if we're willing to use it, -1 otherwise.
7309 */
mbedtls_ssl_check_curve(const mbedtls_ssl_context * ssl,mbedtls_ecp_group_id grp_id)7310 int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id )
7311 {
7312 const mbedtls_ecp_group_id *gid;
7313
7314 if( ssl->conf->curve_list == NULL )
7315 return( -1 );
7316
7317 for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ )
7318 if( *gid == grp_id )
7319 return( 0 );
7320
7321 return( -1 );
7322 }
7323 #endif /* MBEDTLS_ECP_C */
7324
7325 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
7326 /*
7327 * Check if a hash proposed by the peer is in our list.
7328 * Return 0 if we're willing to use it, -1 otherwise.
7329 */
mbedtls_ssl_check_sig_hash(const mbedtls_ssl_context * ssl,mbedtls_md_type_t md)7330 int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl,
7331 mbedtls_md_type_t md )
7332 {
7333 const int *cur;
7334
7335 if( ssl->conf->sig_hashes == NULL )
7336 return( -1 );
7337
7338 for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ )
7339 if( *cur == (int) md )
7340 return( 0 );
7341
7342 return( -1 );
7343 }
7344 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
7345
7346 #if defined(MBEDTLS_X509_CRT_PARSE_C)
mbedtls_ssl_check_cert_usage(const mbedtls_x509_crt * cert,const mbedtls_ssl_ciphersuite_t * ciphersuite,int cert_endpoint,uint32_t * flags)7347 int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,
7348 const mbedtls_ssl_ciphersuite_t *ciphersuite,
7349 int cert_endpoint,
7350 uint32_t *flags )
7351 {
7352 int ret = 0;
7353 #if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
7354 int usage = 0;
7355 #endif
7356 #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
7357 const char *ext_oid;
7358 size_t ext_len;
7359 #endif
7360
7361 #if !defined(MBEDTLS_X509_CHECK_KEY_USAGE) && \
7362 !defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
7363 ((void) cert);
7364 ((void) cert_endpoint);
7365 ((void) flags);
7366 #endif
7367
7368 #if defined(MBEDTLS_X509_CHECK_KEY_USAGE)
7369 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
7370 {
7371 /* Server part of the key exchange */
7372 switch( ciphersuite->key_exchange )
7373 {
7374 case MBEDTLS_KEY_EXCHANGE_RSA:
7375 case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
7376 usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT;
7377 break;
7378
7379 case MBEDTLS_KEY_EXCHANGE_DHE_RSA:
7380 case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
7381 case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
7382 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
7383 break;
7384
7385 case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
7386 case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
7387 usage = MBEDTLS_X509_KU_KEY_AGREEMENT;
7388 break;
7389
7390 /* Don't use default: we want warnings when adding new values */
7391 case MBEDTLS_KEY_EXCHANGE_NONE:
7392 case MBEDTLS_KEY_EXCHANGE_PSK:
7393 case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
7394 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
7395 case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
7396 usage = 0;
7397 }
7398 }
7399 else
7400 {
7401 /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */
7402 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
7403 }
7404
7405 if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 )
7406 {
7407 *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE;
7408 ret = -1;
7409 }
7410 #else
7411 ((void) ciphersuite);
7412 #endif /* MBEDTLS_X509_CHECK_KEY_USAGE */
7413
7414 #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)
7415 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )
7416 {
7417 ext_oid = MBEDTLS_OID_SERVER_AUTH;
7418 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH );
7419 }
7420 else
7421 {
7422 ext_oid = MBEDTLS_OID_CLIENT_AUTH;
7423 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH );
7424 }
7425
7426 if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 )
7427 {
7428 *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE;
7429 ret = -1;
7430 }
7431 #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */
7432
7433 return( ret );
7434 }
7435 #endif /* MBEDTLS_X509_CRT_PARSE_C */
7436
mbedtls_ssl_set_calc_verify_md(mbedtls_ssl_context * ssl,int md)7437 int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md )
7438 {
7439 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
7440 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
7441 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
7442
7443 switch( md )
7444 {
7445 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)
7446 #if defined(MBEDTLS_MD5_C)
7447 case MBEDTLS_SSL_HASH_MD5:
7448 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
7449 #endif
7450 #if defined(MBEDTLS_SHA1_C)
7451 case MBEDTLS_SSL_HASH_SHA1:
7452 ssl->handshake->calc_verify = ssl_calc_verify_tls;
7453 break;
7454 #endif
7455 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */
7456 #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)
7457 case MBEDTLS_SSL_HASH_SHA384:
7458 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384;
7459 break;
7460 #endif
7461 #if defined(MBEDTLS_SHA256_C)
7462 case MBEDTLS_SSL_HASH_SHA256:
7463 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256;
7464 break;
7465 #endif
7466 default:
7467 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
7468 }
7469
7470 return 0;
7471 #else /* !MBEDTLS_SSL_PROTO_TLS1_2 */
7472 (void) ssl;
7473 (void) md;
7474
7475 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;
7476 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
7477 }
7478
7479 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
7480 defined(MBEDTLS_SSL_PROTO_TLS1_1)
mbedtls_ssl_get_key_exchange_md_ssl_tls(mbedtls_ssl_context * ssl,unsigned char * output,unsigned char * data,size_t data_len)7481 int mbedtls_ssl_get_key_exchange_md_ssl_tls( mbedtls_ssl_context *ssl,
7482 unsigned char *output,
7483 unsigned char *data, size_t data_len )
7484 {
7485 int ret = 0;
7486 mbedtls_md5_context mbedtls_md5;
7487 mbedtls_sha1_context mbedtls_sha1;
7488
7489 mbedtls_md5_init( &mbedtls_md5 );
7490 mbedtls_sha1_init( &mbedtls_sha1 );
7491
7492 /*
7493 * digitally-signed struct {
7494 * opaque md5_hash[16];
7495 * opaque sha_hash[20];
7496 * };
7497 *
7498 * md5_hash
7499 * MD5(ClientHello.random + ServerHello.random
7500 * + ServerParams);
7501 * sha_hash
7502 * SHA(ClientHello.random + ServerHello.random
7503 * + ServerParams);
7504 */
7505 if( ( ret = mbedtls_md5_starts_ret( &mbedtls_md5 ) ) != 0 )
7506 {
7507 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_starts_ret", ret );
7508 goto exit;
7509 }
7510 if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5,
7511 ssl->handshake->randbytes, 64 ) ) != 0 )
7512 {
7513 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret );
7514 goto exit;
7515 }
7516 if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5, data, data_len ) ) != 0 )
7517 {
7518 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret );
7519 goto exit;
7520 }
7521 if( ( ret = mbedtls_md5_finish_ret( &mbedtls_md5, output ) ) != 0 )
7522 {
7523 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_finish_ret", ret );
7524 goto exit;
7525 }
7526
7527 if( ( ret = mbedtls_sha1_starts_ret( &mbedtls_sha1 ) ) != 0 )
7528 {
7529 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_starts_ret", ret );
7530 goto exit;
7531 }
7532 if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1,
7533 ssl->handshake->randbytes, 64 ) ) != 0 )
7534 {
7535 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret );
7536 goto exit;
7537 }
7538 if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1, data,
7539 data_len ) ) != 0 )
7540 {
7541 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret );
7542 goto exit;
7543 }
7544 if( ( ret = mbedtls_sha1_finish_ret( &mbedtls_sha1,
7545 output + 16 ) ) != 0 )
7546 {
7547 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_finish_ret", ret );
7548 goto exit;
7549 }
7550
7551 exit:
7552 mbedtls_md5_free( &mbedtls_md5 );
7553 mbedtls_sha1_free( &mbedtls_sha1 );
7554
7555 if( ret != 0 )
7556 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7557 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7558
7559 return( ret );
7560
7561 }
7562 #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
7563 MBEDTLS_SSL_PROTO_TLS1_1 */
7564
7565 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
7566 defined(MBEDTLS_SSL_PROTO_TLS1_2)
7567
7568 #if defined(MBEDTLS_USE_PSA_CRYPTO)
mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context * ssl,unsigned char * hash,size_t * hashlen,unsigned char * data,size_t data_len,mbedtls_md_type_t md_alg)7569 int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
7570 unsigned char *hash, size_t *hashlen,
7571 unsigned char *data, size_t data_len,
7572 mbedtls_md_type_t md_alg )
7573 {
7574 psa_status_t status;
7575 psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT;
7576 psa_algorithm_t hash_alg = mbedtls_psa_translate_md( md_alg );
7577
7578 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Perform PSA-based computation of digest of ServerKeyExchange" ) );
7579
7580 if( ( status = psa_hash_setup( &hash_operation,
7581 hash_alg ) ) != PSA_SUCCESS )
7582 {
7583 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_setup", status );
7584 goto exit;
7585 }
7586
7587 if( ( status = psa_hash_update( &hash_operation, ssl->handshake->randbytes,
7588 64 ) ) != PSA_SUCCESS )
7589 {
7590 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_update", status );
7591 goto exit;
7592 }
7593
7594 if( ( status = psa_hash_update( &hash_operation,
7595 data, data_len ) ) != PSA_SUCCESS )
7596 {
7597 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_update", status );
7598 goto exit;
7599 }
7600
7601 if( ( status = psa_hash_finish( &hash_operation, hash, PSA_HASH_MAX_SIZE,
7602 hashlen ) ) != PSA_SUCCESS )
7603 {
7604 MBEDTLS_SSL_DEBUG_RET( 1, "psa_hash_finish", status );
7605 goto exit;
7606 }
7607
7608 exit:
7609 if( status != PSA_SUCCESS )
7610 {
7611 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7612 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7613 switch( status )
7614 {
7615 case PSA_ERROR_NOT_SUPPORTED:
7616 return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE );
7617 case PSA_ERROR_BAD_STATE: /* Intentional fallthrough */
7618 case PSA_ERROR_BUFFER_TOO_SMALL:
7619 return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );
7620 case PSA_ERROR_INSUFFICIENT_MEMORY:
7621 return( MBEDTLS_ERR_MD_ALLOC_FAILED );
7622 default:
7623 return( MBEDTLS_ERR_MD_HW_ACCEL_FAILED );
7624 }
7625 }
7626 return( 0 );
7627 }
7628
7629 #else
7630
mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context * ssl,unsigned char * hash,size_t * hashlen,unsigned char * data,size_t data_len,mbedtls_md_type_t md_alg)7631 int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl,
7632 unsigned char *hash, size_t *hashlen,
7633 unsigned char *data, size_t data_len,
7634 mbedtls_md_type_t md_alg )
7635 {
7636 int ret = 0;
7637 mbedtls_md_context_t ctx;
7638 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );
7639 *hashlen = mbedtls_md_get_size( md_info );
7640
7641 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Perform mbedtls-based computation of digest of ServerKeyExchange" ) );
7642
7643 mbedtls_md_init( &ctx );
7644
7645 /*
7646 * digitally-signed struct {
7647 * opaque client_random[32];
7648 * opaque server_random[32];
7649 * ServerDHParams params;
7650 * };
7651 */
7652 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )
7653 {
7654 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret );
7655 goto exit;
7656 }
7657 if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 )
7658 {
7659 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_starts", ret );
7660 goto exit;
7661 }
7662 if( ( ret = mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 ) ) != 0 )
7663 {
7664 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
7665 goto exit;
7666 }
7667 if( ( ret = mbedtls_md_update( &ctx, data, data_len ) ) != 0 )
7668 {
7669 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret );
7670 goto exit;
7671 }
7672 if( ( ret = mbedtls_md_finish( &ctx, hash ) ) != 0 )
7673 {
7674 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_finish", ret );
7675 goto exit;
7676 }
7677
7678 exit:
7679 mbedtls_md_free( &ctx );
7680
7681 if( ret != 0 )
7682 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
7683 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
7684
7685 return( ret );
7686 }
7687 #endif /* MBEDTLS_USE_PSA_CRYPTO */
7688
7689 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
7690 MBEDTLS_SSL_PROTO_TLS1_2 */
7691
7692 #endif /* MBEDTLS_SSL_TLS_C */
7693