BA
/
BaBoRo1
Embed:
(wiki syntax)
Show/hide line numbers
ssl_tls.c
00001 /* 00002 * SSLv3/TLSv1 shared functions 00003 * 00004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved 00005 * SPDX-License-Identifier: Apache-2.0 00006 * 00007 * Licensed under the Apache License, Version 2.0 (the "License"); you may 00008 * not use this file except in compliance with the License. 00009 * You may obtain a copy of the License at 00010 * 00011 * http://www.apache.org/licenses/LICENSE-2.0 00012 * 00013 * Unless required by applicable law or agreed to in writing, software 00014 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 00015 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00016 * See the License for the specific language governing permissions and 00017 * limitations under the License. 00018 * 00019 * This file is part of mbed TLS (https://tls.mbed.org) 00020 */ 00021 /* 00022 * The SSL 3.0 specification was drafted by Netscape in 1996, 00023 * and became an IETF standard in 1999. 00024 * 00025 * http://wp.netscape.com/eng/ssl3/ 00026 * http://www.ietf.org/rfc/rfc2246.txt 00027 * http://www.ietf.org/rfc/rfc4346.txt 00028 */ 00029 00030 #if !defined(MBEDTLS_CONFIG_FILE) 00031 #include "mbedtls/config.h" 00032 #else 00033 #include MBEDTLS_CONFIG_FILE 00034 #endif 00035 00036 #if defined(MBEDTLS_SSL_TLS_C) 00037 00038 #if defined(MBEDTLS_PLATFORM_C) 00039 #include "mbedtls/platform.h" 00040 #else 00041 #include <stdlib.h> 00042 #define mbedtls_calloc calloc 00043 #define mbedtls_free free 00044 #endif 00045 00046 #include "mbedtls/debug.h" 00047 #include "mbedtls/ssl.h" 00048 #include "mbedtls/ssl_internal.h" 00049 00050 #include <string.h> 00051 00052 #if defined(MBEDTLS_X509_CRT_PARSE_C) 00053 #include "mbedtls/oid.h" 00054 #endif 00055 00056 /* Implementation that should never be optimized out by the compiler */ 00057 static void mbedtls_zeroize( void *v, size_t n ) { 00058 volatile unsigned char *p = v; while( n-- ) *p++ = 0; 00059 } 00060 00061 /* Length of the "epoch" field in the record header */ 00062 static inline size_t ssl_ep_len( const mbedtls_ssl_context *ssl ) 00063 { 00064 #if defined(MBEDTLS_SSL_PROTO_DTLS) 00065 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 00066 return( 2 ); 00067 #else 00068 ((void) ssl); 00069 #endif 00070 return( 0 ); 00071 } 00072 00073 /* 00074 * Start a timer. 00075 * Passing millisecs = 0 cancels a running timer. 00076 */ 00077 static void ssl_set_timer( mbedtls_ssl_context *ssl, uint32_t millisecs ) 00078 { 00079 if( ssl->f_set_timer == NULL ) 00080 return; 00081 00082 MBEDTLS_SSL_DEBUG_MSG( 3, ( "set_timer to %d ms", (int) millisecs ) ); 00083 ssl->f_set_timer( ssl->p_timer, millisecs / 4, millisecs ); 00084 } 00085 00086 /* 00087 * Return -1 is timer is expired, 0 if it isn't. 00088 */ 00089 static int ssl_check_timer( mbedtls_ssl_context *ssl ) 00090 { 00091 if( ssl->f_get_timer == NULL ) 00092 return( 0 ); 00093 00094 if( ssl->f_get_timer( ssl->p_timer ) == 2 ) 00095 { 00096 MBEDTLS_SSL_DEBUG_MSG( 3, ( "timer expired" ) ); 00097 return( -1 ); 00098 } 00099 00100 return( 0 ); 00101 } 00102 00103 #if defined(MBEDTLS_SSL_PROTO_DTLS) 00104 /* 00105 * Double the retransmit timeout value, within the allowed range, 00106 * returning -1 if the maximum value has already been reached. 00107 */ 00108 static int ssl_double_retransmit_timeout( mbedtls_ssl_context *ssl ) 00109 { 00110 uint32_t new_timeout; 00111 00112 if( ssl->handshake->retransmit_timeout >= ssl->conf->hs_timeout_max ) 00113 return( -1 ); 00114 00115 new_timeout = 2 * ssl->handshake->retransmit_timeout; 00116 00117 /* Avoid arithmetic overflow and range overflow */ 00118 if( new_timeout < ssl->handshake->retransmit_timeout || 00119 new_timeout > ssl->conf->hs_timeout_max ) 00120 { 00121 new_timeout = ssl->conf->hs_timeout_max; 00122 } 00123 00124 ssl->handshake->retransmit_timeout = new_timeout; 00125 MBEDTLS_SSL_DEBUG_MSG( 3, ( "update timeout value to %d millisecs", 00126 ssl->handshake->retransmit_timeout ) ); 00127 00128 return( 0 ); 00129 } 00130 00131 static void ssl_reset_retransmit_timeout( mbedtls_ssl_context *ssl ) 00132 { 00133 ssl->handshake->retransmit_timeout = ssl->conf->hs_timeout_min; 00134 MBEDTLS_SSL_DEBUG_MSG( 3, ( "update timeout value to %d millisecs", 00135 ssl->handshake->retransmit_timeout ) ); 00136 } 00137 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 00138 00139 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) 00140 /* 00141 * Convert max_fragment_length codes to length. 00142 * RFC 6066 says: 00143 * enum{ 00144 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255) 00145 * } MaxFragmentLength; 00146 * and we add 0 -> extension unused 00147 */ 00148 static unsigned int mfl_code_to_length[MBEDTLS_SSL_MAX_FRAG_LEN_INVALID] = 00149 { 00150 MBEDTLS_SSL_MAX_CONTENT_LEN, /* MBEDTLS_SSL_MAX_FRAG_LEN_NONE */ 00151 512, /* MBEDTLS_SSL_MAX_FRAG_LEN_512 */ 00152 1024, /* MBEDTLS_SSL_MAX_FRAG_LEN_1024 */ 00153 2048, /* MBEDTLS_SSL_MAX_FRAG_LEN_2048 */ 00154 4096, /* MBEDTLS_SSL_MAX_FRAG_LEN_4096 */ 00155 }; 00156 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ 00157 00158 #if defined(MBEDTLS_SSL_CLI_C) 00159 static int ssl_session_copy( mbedtls_ssl_session *dst, const mbedtls_ssl_session *src ) 00160 { 00161 mbedtls_ssl_session_free( dst ); 00162 memcpy( dst, src, sizeof( mbedtls_ssl_session ) ); 00163 00164 #if defined(MBEDTLS_X509_CRT_PARSE_C) 00165 if( src->peer_cert != NULL ) 00166 { 00167 int ret; 00168 00169 dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) ); 00170 if( dst->peer_cert == NULL ) 00171 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 00172 00173 mbedtls_x509_crt_init( dst->peer_cert ); 00174 00175 if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p, 00176 src->peer_cert->raw.len ) ) != 0 ) 00177 { 00178 mbedtls_free( dst->peer_cert ); 00179 dst->peer_cert = NULL; 00180 return( ret ); 00181 } 00182 } 00183 #endif /* MBEDTLS_X509_CRT_PARSE_C */ 00184 00185 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) 00186 if( src->ticket != NULL ) 00187 { 00188 dst->ticket = mbedtls_calloc( 1, src->ticket_len ); 00189 if( dst->ticket == NULL ) 00190 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 00191 00192 memcpy( dst->ticket, src->ticket, src->ticket_len ); 00193 } 00194 #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ 00195 00196 return( 0 ); 00197 } 00198 #endif /* MBEDTLS_SSL_CLI_C */ 00199 00200 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) 00201 int (*mbedtls_ssl_hw_record_init)( mbedtls_ssl_context *ssl, 00202 const unsigned char *key_enc, const unsigned char *key_dec, 00203 size_t keylen, 00204 const unsigned char *iv_enc, const unsigned char *iv_dec, 00205 size_t ivlen, 00206 const unsigned char *mac_enc, const unsigned char *mac_dec, 00207 size_t maclen ) = NULL; 00208 int (*mbedtls_ssl_hw_record_activate)( mbedtls_ssl_context *ssl, int direction) = NULL; 00209 int (*mbedtls_ssl_hw_record_reset)( mbedtls_ssl_context *ssl ) = NULL; 00210 int (*mbedtls_ssl_hw_record_write)( mbedtls_ssl_context *ssl ) = NULL; 00211 int (*mbedtls_ssl_hw_record_read)( mbedtls_ssl_context *ssl ) = NULL; 00212 int (*mbedtls_ssl_hw_record_finish)( mbedtls_ssl_context *ssl ) = NULL; 00213 #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ 00214 00215 /* 00216 * Key material generation 00217 */ 00218 #if defined(MBEDTLS_SSL_PROTO_SSL3) 00219 static int ssl3_prf( const unsigned char *secret, size_t slen, 00220 const char *label, 00221 const unsigned char *random, size_t rlen, 00222 unsigned char *dstbuf, size_t dlen ) 00223 { 00224 int ret = 0; 00225 size_t i; 00226 mbedtls_md5_context md5; 00227 mbedtls_sha1_context sha1; 00228 unsigned char padding[16]; 00229 unsigned char sha1sum[20]; 00230 ((void)label); 00231 00232 mbedtls_md5_init( &md5 ); 00233 mbedtls_sha1_init( &sha1 ); 00234 00235 /* 00236 * SSLv3: 00237 * block = 00238 * MD5( secret + SHA1( 'A' + secret + random ) ) + 00239 * MD5( secret + SHA1( 'BB' + secret + random ) ) + 00240 * MD5( secret + SHA1( 'CCC' + secret + random ) ) + 00241 * ... 00242 */ 00243 for( i = 0; i < dlen / 16; i++ ) 00244 { 00245 memset( padding, (unsigned char) ('A' + i), 1 + i ); 00246 00247 if( ( ret = mbedtls_sha1_starts_ret( &sha1 ) ) != 0 ) 00248 goto exit; 00249 if( ( ret = mbedtls_sha1_update_ret( &sha1, padding, 1 + i ) ) != 0 ) 00250 goto exit; 00251 if( ( ret = mbedtls_sha1_update_ret( &sha1, secret, slen ) ) != 0 ) 00252 goto exit; 00253 if( ( ret = mbedtls_sha1_update_ret( &sha1, random, rlen ) ) != 0 ) 00254 goto exit; 00255 if( ( ret = mbedtls_sha1_finish_ret( &sha1, sha1sum ) ) != 0 ) 00256 goto exit; 00257 00258 if( ( ret = mbedtls_md5_starts_ret( &md5 ) ) != 0 ) 00259 goto exit; 00260 if( ( ret = mbedtls_md5_update_ret( &md5, secret, slen ) ) != 0 ) 00261 goto exit; 00262 if( ( ret = mbedtls_md5_update_ret( &md5, sha1sum, 20 ) ) != 0 ) 00263 goto exit; 00264 if( ( ret = mbedtls_md5_finish_ret( &md5, dstbuf + i * 16 ) ) != 0 ) 00265 goto exit; 00266 } 00267 00268 exit: 00269 mbedtls_md5_free( &md5 ); 00270 mbedtls_sha1_free( &sha1 ); 00271 00272 mbedtls_zeroize( padding, sizeof( padding ) ); 00273 mbedtls_zeroize( sha1sum, sizeof( sha1sum ) ); 00274 00275 return( ret ); 00276 } 00277 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ 00278 00279 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) 00280 static int tls1_prf( const unsigned char *secret, size_t slen, 00281 const char *label, 00282 const unsigned char *random, size_t rlen, 00283 unsigned char *dstbuf, size_t dlen ) 00284 { 00285 size_t nb, hs; 00286 size_t i, j, k; 00287 const unsigned char *S1, *S2; 00288 unsigned char tmp[128]; 00289 unsigned char h_i[20]; 00290 const mbedtls_md_info_t *md_info; 00291 mbedtls_md_context_t md_ctx; 00292 int ret; 00293 00294 mbedtls_md_init( &md_ctx ); 00295 00296 if( sizeof( tmp ) < 20 + strlen( label ) + rlen ) 00297 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 00298 00299 hs = ( slen + 1 ) / 2; 00300 S1 = secret; 00301 S2 = secret + slen - hs; 00302 00303 nb = strlen( label ); 00304 memcpy( tmp + 20, label, nb ); 00305 memcpy( tmp + 20 + nb, random, rlen ); 00306 nb += rlen; 00307 00308 /* 00309 * First compute P_md5(secret,label+random)[0..dlen] 00310 */ 00311 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ) ) == NULL ) 00312 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 00313 00314 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) 00315 return( ret ); 00316 00317 mbedtls_md_hmac_starts( &md_ctx, S1, hs ); 00318 mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb ); 00319 mbedtls_md_hmac_finish( &md_ctx, 4 + tmp ); 00320 00321 for( i = 0; i < dlen; i += 16 ) 00322 { 00323 mbedtls_md_hmac_reset ( &md_ctx ); 00324 mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 + nb ); 00325 mbedtls_md_hmac_finish( &md_ctx, h_i ); 00326 00327 mbedtls_md_hmac_reset ( &md_ctx ); 00328 mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 ); 00329 mbedtls_md_hmac_finish( &md_ctx, 4 + tmp ); 00330 00331 k = ( i + 16 > dlen ) ? dlen % 16 : 16; 00332 00333 for( j = 0; j < k; j++ ) 00334 dstbuf[i + j] = h_i[j]; 00335 } 00336 00337 mbedtls_md_free( &md_ctx ); 00338 00339 /* 00340 * XOR out with P_sha1(secret,label+random)[0..dlen] 00341 */ 00342 if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL ) 00343 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 00344 00345 if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) 00346 return( ret ); 00347 00348 mbedtls_md_hmac_starts( &md_ctx, S2, hs ); 00349 mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb ); 00350 mbedtls_md_hmac_finish( &md_ctx, tmp ); 00351 00352 for( i = 0; i < dlen; i += 20 ) 00353 { 00354 mbedtls_md_hmac_reset ( &md_ctx ); 00355 mbedtls_md_hmac_update( &md_ctx, tmp, 20 + nb ); 00356 mbedtls_md_hmac_finish( &md_ctx, h_i ); 00357 00358 mbedtls_md_hmac_reset ( &md_ctx ); 00359 mbedtls_md_hmac_update( &md_ctx, tmp, 20 ); 00360 mbedtls_md_hmac_finish( &md_ctx, tmp ); 00361 00362 k = ( i + 20 > dlen ) ? dlen % 20 : 20; 00363 00364 for( j = 0; j < k; j++ ) 00365 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] ); 00366 } 00367 00368 mbedtls_md_free( &md_ctx ); 00369 00370 mbedtls_zeroize( tmp, sizeof( tmp ) ); 00371 mbedtls_zeroize( h_i, sizeof( h_i ) ); 00372 00373 return( 0 ); 00374 } 00375 #endif /* MBEDTLS_SSL_PROTO_TLS1) || MBEDTLS_SSL_PROTO_TLS1_1 */ 00376 00377 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 00378 static int tls_prf_generic( mbedtls_md_type_t md_type, 00379 const unsigned char *secret, size_t slen, 00380 const char *label, 00381 const unsigned char *random, size_t rlen, 00382 unsigned char *dstbuf, size_t dlen ) 00383 { 00384 size_t nb; 00385 size_t i, j, k, md_len; 00386 unsigned char tmp[128]; 00387 unsigned char h_i[MBEDTLS_MD_MAX_SIZE]; 00388 const mbedtls_md_info_t *md_info; 00389 mbedtls_md_context_t md_ctx; 00390 int ret; 00391 00392 mbedtls_md_init( &md_ctx ); 00393 00394 if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL ) 00395 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 00396 00397 md_len = mbedtls_md_get_size( md_info ); 00398 00399 if( sizeof( tmp ) < md_len + strlen( label ) + rlen ) 00400 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 00401 00402 nb = strlen( label ); 00403 memcpy( tmp + md_len, label, nb ); 00404 memcpy( tmp + md_len + nb, random, rlen ); 00405 nb += rlen; 00406 00407 /* 00408 * Compute P_<hash>(secret, label + random)[0..dlen] 00409 */ 00410 if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) 00411 return( ret ); 00412 00413 mbedtls_md_hmac_starts( &md_ctx, secret, slen ); 00414 mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb ); 00415 mbedtls_md_hmac_finish( &md_ctx, tmp ); 00416 00417 for( i = 0; i < dlen; i += md_len ) 00418 { 00419 mbedtls_md_hmac_reset ( &md_ctx ); 00420 mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb ); 00421 mbedtls_md_hmac_finish( &md_ctx, h_i ); 00422 00423 mbedtls_md_hmac_reset ( &md_ctx ); 00424 mbedtls_md_hmac_update( &md_ctx, tmp, md_len ); 00425 mbedtls_md_hmac_finish( &md_ctx, tmp ); 00426 00427 k = ( i + md_len > dlen ) ? dlen % md_len : md_len; 00428 00429 for( j = 0; j < k; j++ ) 00430 dstbuf[i + j] = h_i[j]; 00431 } 00432 00433 mbedtls_md_free( &md_ctx ); 00434 00435 mbedtls_zeroize( tmp, sizeof( tmp ) ); 00436 mbedtls_zeroize( h_i, sizeof( h_i ) ); 00437 00438 return( 0 ); 00439 } 00440 00441 #if defined(MBEDTLS_SHA256_C) 00442 static int tls_prf_sha256( const unsigned char *secret, size_t slen, 00443 const char *label, 00444 const unsigned char *random, size_t rlen, 00445 unsigned char *dstbuf, size_t dlen ) 00446 { 00447 return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen, 00448 label, random, rlen, dstbuf, dlen ) ); 00449 } 00450 #endif /* MBEDTLS_SHA256_C */ 00451 00452 #if defined(MBEDTLS_SHA512_C) 00453 static int tls_prf_sha384( const unsigned char *secret, size_t slen, 00454 const char *label, 00455 const unsigned char *random, size_t rlen, 00456 unsigned char *dstbuf, size_t dlen ) 00457 { 00458 return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen, 00459 label, random, rlen, dstbuf, dlen ) ); 00460 } 00461 #endif /* MBEDTLS_SHA512_C */ 00462 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 00463 00464 static void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t ); 00465 00466 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 00467 defined(MBEDTLS_SSL_PROTO_TLS1_1) 00468 static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *, const unsigned char *, size_t ); 00469 #endif 00470 00471 #if defined(MBEDTLS_SSL_PROTO_SSL3) 00472 static void ssl_calc_verify_ssl( mbedtls_ssl_context *, unsigned char * ); 00473 static void ssl_calc_finished_ssl( mbedtls_ssl_context *, unsigned char *, int ); 00474 #endif 00475 00476 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) 00477 static void ssl_calc_verify_tls( mbedtls_ssl_context *, unsigned char * ); 00478 static void ssl_calc_finished_tls( mbedtls_ssl_context *, unsigned char *, int ); 00479 #endif 00480 00481 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 00482 #if defined(MBEDTLS_SHA256_C) 00483 static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t ); 00484 static void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *,unsigned char * ); 00485 static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int ); 00486 #endif 00487 00488 #if defined(MBEDTLS_SHA512_C) 00489 static void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t ); 00490 static void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *, unsigned char * ); 00491 static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int ); 00492 #endif 00493 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 00494 00495 int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl ) 00496 { 00497 int ret = 0; 00498 unsigned char tmp[64]; 00499 unsigned char keyblk[256]; 00500 unsigned char *key1; 00501 unsigned char *key2; 00502 unsigned char *mac_enc; 00503 unsigned char *mac_dec; 00504 size_t mac_key_len; 00505 size_t iv_copy_len; 00506 const mbedtls_cipher_info_t *cipher_info; 00507 const mbedtls_md_info_t *md_info; 00508 00509 mbedtls_ssl_session *session = ssl->session_negotiate; 00510 mbedtls_ssl_transform *transform = ssl->transform_negotiate; 00511 mbedtls_ssl_handshake_params *handshake = ssl->handshake; 00512 00513 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive keys" ) ); 00514 00515 cipher_info = mbedtls_cipher_info_from_type( transform->ciphersuite_info->cipher ); 00516 if( cipher_info == NULL ) 00517 { 00518 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %d not found", 00519 transform->ciphersuite_info->cipher ) ); 00520 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 00521 } 00522 00523 md_info = mbedtls_md_info_from_type( transform->ciphersuite_info->mac ); 00524 if( md_info == NULL ) 00525 { 00526 MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_md info for %d not found", 00527 transform->ciphersuite_info->mac ) ); 00528 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 00529 } 00530 00531 /* 00532 * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions 00533 */ 00534 #if defined(MBEDTLS_SSL_PROTO_SSL3) 00535 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 00536 { 00537 handshake->tls_prf = ssl3_prf; 00538 handshake->calc_verify = ssl_calc_verify_ssl; 00539 handshake->calc_finished = ssl_calc_finished_ssl; 00540 } 00541 else 00542 #endif 00543 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) 00544 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ) 00545 { 00546 handshake->tls_prf = tls1_prf; 00547 handshake->calc_verify = ssl_calc_verify_tls; 00548 handshake->calc_finished = ssl_calc_finished_tls; 00549 } 00550 else 00551 #endif 00552 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 00553 #if defined(MBEDTLS_SHA512_C) 00554 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 && 00555 transform->ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) 00556 { 00557 handshake->tls_prf = tls_prf_sha384; 00558 handshake->calc_verify = ssl_calc_verify_tls_sha384; 00559 handshake->calc_finished = ssl_calc_finished_tls_sha384; 00560 } 00561 else 00562 #endif 00563 #if defined(MBEDTLS_SHA256_C) 00564 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) 00565 { 00566 handshake->tls_prf = tls_prf_sha256; 00567 handshake->calc_verify = ssl_calc_verify_tls_sha256; 00568 handshake->calc_finished = ssl_calc_finished_tls_sha256; 00569 } 00570 else 00571 #endif 00572 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 00573 { 00574 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 00575 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 00576 } 00577 00578 /* 00579 * SSLv3: 00580 * master = 00581 * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) + 00582 * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) + 00583 * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) ) 00584 * 00585 * TLSv1+: 00586 * master = PRF( premaster, "master secret", randbytes )[0..47] 00587 */ 00588 if( handshake->resume == 0 ) 00589 { 00590 MBEDTLS_SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster, 00591 handshake->pmslen ); 00592 00593 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) 00594 if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED ) 00595 { 00596 unsigned char session_hash[48]; 00597 size_t hash_len; 00598 00599 MBEDTLS_SSL_DEBUG_MSG( 3, ( "using extended master secret" ) ); 00600 00601 ssl->handshake->calc_verify( ssl, session_hash ); 00602 00603 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 00604 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) 00605 { 00606 #if defined(MBEDTLS_SHA512_C) 00607 if( ssl->transform_negotiate->ciphersuite_info->mac == 00608 MBEDTLS_MD_SHA384 ) 00609 { 00610 hash_len = 48; 00611 } 00612 else 00613 #endif 00614 hash_len = 32; 00615 } 00616 else 00617 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 00618 hash_len = 36; 00619 00620 MBEDTLS_SSL_DEBUG_BUF( 3, "session hash", session_hash, hash_len ); 00621 00622 ret = handshake->tls_prf( handshake->premaster, handshake->pmslen, 00623 "extended master secret", 00624 session_hash, hash_len, 00625 session->master, 48 ); 00626 if( ret != 0 ) 00627 { 00628 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret ); 00629 return( ret ); 00630 } 00631 00632 } 00633 else 00634 #endif 00635 ret = handshake->tls_prf( handshake->premaster, handshake->pmslen, 00636 "master secret", 00637 handshake->randbytes, 64, 00638 session->master, 48 ); 00639 if( ret != 0 ) 00640 { 00641 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret ); 00642 return( ret ); 00643 } 00644 00645 mbedtls_zeroize( handshake->premaster, sizeof(handshake->premaster) ); 00646 } 00647 else 00648 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) ); 00649 00650 /* 00651 * Swap the client and server random values. 00652 */ 00653 memcpy( tmp, handshake->randbytes, 64 ); 00654 memcpy( handshake->randbytes, tmp + 32, 32 ); 00655 memcpy( handshake->randbytes + 32, tmp, 32 ); 00656 mbedtls_zeroize( tmp, sizeof( tmp ) ); 00657 00658 /* 00659 * SSLv3: 00660 * key block = 00661 * MD5( master + SHA1( 'A' + master + randbytes ) ) + 00662 * MD5( master + SHA1( 'BB' + master + randbytes ) ) + 00663 * MD5( master + SHA1( 'CCC' + master + randbytes ) ) + 00664 * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) + 00665 * ... 00666 * 00667 * TLSv1: 00668 * key block = PRF( master, "key expansion", randbytes ) 00669 */ 00670 ret = handshake->tls_prf( session->master, 48, "key expansion", 00671 handshake->randbytes, 64, keyblk, 256 ); 00672 if( ret != 0 ) 00673 { 00674 MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret ); 00675 return( ret ); 00676 } 00677 00678 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite = %s", 00679 mbedtls_ssl_get_ciphersuite_name( session->ciphersuite ) ) ); 00680 MBEDTLS_SSL_DEBUG_BUF( 3, "master secret", session->master, 48 ); 00681 MBEDTLS_SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 ); 00682 MBEDTLS_SSL_DEBUG_BUF( 4, "key block", keyblk, 256 ); 00683 00684 mbedtls_zeroize( handshake->randbytes, sizeof( handshake->randbytes ) ); 00685 00686 /* 00687 * Determine the appropriate key, IV and MAC length. 00688 */ 00689 00690 transform->keylen = cipher_info->key_bitlen / 8; 00691 00692 if( cipher_info->mode == MBEDTLS_MODE_GCM || 00693 cipher_info->mode == MBEDTLS_MODE_CCM ) 00694 { 00695 transform->maclen = 0; 00696 mac_key_len = 0; 00697 00698 transform->ivlen = 12; 00699 transform->fixed_ivlen = 4; 00700 00701 /* Minimum length is expicit IV + tag */ 00702 transform->minlen = transform->ivlen - transform->fixed_ivlen 00703 + ( transform->ciphersuite_info->flags & 00704 MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16 ); 00705 } 00706 else 00707 { 00708 /* Initialize HMAC contexts */ 00709 if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 || 00710 ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 ) 00711 { 00712 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret ); 00713 return( ret ); 00714 } 00715 00716 /* Get MAC length */ 00717 mac_key_len = mbedtls_md_get_size( md_info ); 00718 transform->maclen = mac_key_len; 00719 00720 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) 00721 /* 00722 * If HMAC is to be truncated, we shall keep the leftmost bytes, 00723 * (rfc 6066 page 13 or rfc 2104 section 4), 00724 * so we only need to adjust the length here. 00725 */ 00726 if( session->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED ) 00727 { 00728 transform->maclen = MBEDTLS_SSL_TRUNCATED_HMAC_LEN; 00729 00730 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) 00731 /* Fall back to old, non-compliant version of the truncated 00732 * HMAC implementation which also truncates the key 00733 * (Mbed TLS versions from 1.3 to 2.6.0) */ 00734 mac_key_len = transform->maclen; 00735 #endif 00736 } 00737 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ 00738 00739 /* IV length */ 00740 transform->ivlen = cipher_info->iv_size; 00741 00742 /* Minimum length */ 00743 if( cipher_info->mode == MBEDTLS_MODE_STREAM ) 00744 transform->minlen = transform->maclen; 00745 else 00746 { 00747 /* 00748 * GenericBlockCipher: 00749 * 1. if EtM is in use: one block plus MAC 00750 * otherwise: * first multiple of blocklen greater than maclen 00751 * 2. IV except for SSL3 and TLS 1.0 00752 */ 00753 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 00754 if( session->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED ) 00755 { 00756 transform->minlen = transform->maclen 00757 + cipher_info->block_size; 00758 } 00759 else 00760 #endif 00761 { 00762 transform->minlen = transform->maclen 00763 + cipher_info->block_size 00764 - transform->maclen % cipher_info->block_size; 00765 } 00766 00767 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) 00768 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || 00769 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_1 ) 00770 ; /* No need to adjust minlen */ 00771 else 00772 #endif 00773 #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) 00774 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_2 || 00775 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) 00776 { 00777 transform->minlen += transform->ivlen; 00778 } 00779 else 00780 #endif 00781 { 00782 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 00783 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 00784 } 00785 } 00786 } 00787 00788 MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d", 00789 transform->keylen, transform->minlen, transform->ivlen, 00790 transform->maclen ) ); 00791 00792 /* 00793 * Finally setup the cipher contexts, IVs and MAC secrets. 00794 */ 00795 #if defined(MBEDTLS_SSL_CLI_C) 00796 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) 00797 { 00798 key1 = keyblk + mac_key_len * 2; 00799 key2 = keyblk + mac_key_len * 2 + transform->keylen; 00800 00801 mac_enc = keyblk; 00802 mac_dec = keyblk + mac_key_len; 00803 00804 /* 00805 * This is not used in TLS v1.1. 00806 */ 00807 iv_copy_len = ( transform->fixed_ivlen ) ? 00808 transform->fixed_ivlen : transform->ivlen; 00809 memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len ); 00810 memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len, 00811 iv_copy_len ); 00812 } 00813 else 00814 #endif /* MBEDTLS_SSL_CLI_C */ 00815 #if defined(MBEDTLS_SSL_SRV_C) 00816 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) 00817 { 00818 key1 = keyblk + mac_key_len * 2 + transform->keylen; 00819 key2 = keyblk + mac_key_len * 2; 00820 00821 mac_enc = keyblk + mac_key_len; 00822 mac_dec = keyblk; 00823 00824 /* 00825 * This is not used in TLS v1.1. 00826 */ 00827 iv_copy_len = ( transform->fixed_ivlen ) ? 00828 transform->fixed_ivlen : transform->ivlen; 00829 memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len ); 00830 memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len, 00831 iv_copy_len ); 00832 } 00833 else 00834 #endif /* MBEDTLS_SSL_SRV_C */ 00835 { 00836 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 00837 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 00838 } 00839 00840 #if defined(MBEDTLS_SSL_PROTO_SSL3) 00841 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 00842 { 00843 if( mac_key_len > sizeof transform->mac_enc ) 00844 { 00845 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 00846 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 00847 } 00848 00849 memcpy( transform->mac_enc, mac_enc, mac_key_len ); 00850 memcpy( transform->mac_dec, mac_dec, mac_key_len ); 00851 } 00852 else 00853 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ 00854 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ 00855 defined(MBEDTLS_SSL_PROTO_TLS1_2) 00856 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 ) 00857 { 00858 mbedtls_md_hmac_starts( &transform->md_ctx_enc, mac_enc, mac_key_len ); 00859 mbedtls_md_hmac_starts( &transform->md_ctx_dec, mac_dec, mac_key_len ); 00860 } 00861 else 00862 #endif 00863 { 00864 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 00865 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 00866 } 00867 00868 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) 00869 if( mbedtls_ssl_hw_record_init != NULL ) 00870 { 00871 int ret = 0; 00872 00873 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) ); 00874 00875 if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, transform->keylen, 00876 transform->iv_enc, transform->iv_dec, 00877 iv_copy_len, 00878 mac_enc, mac_dec, 00879 mac_key_len ) ) != 0 ) 00880 { 00881 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_init", ret ); 00882 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); 00883 } 00884 } 00885 #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ 00886 00887 #if defined(MBEDTLS_SSL_EXPORT_KEYS) 00888 if( ssl->conf->f_export_keys != NULL ) 00889 { 00890 ssl->conf->f_export_keys( ssl->conf->p_export_keys, 00891 session->master, keyblk, 00892 mac_key_len, transform->keylen, 00893 iv_copy_len ); 00894 } 00895 #endif 00896 00897 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc, 00898 cipher_info ) ) != 0 ) 00899 { 00900 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret ); 00901 return( ret ); 00902 } 00903 00904 if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec, 00905 cipher_info ) ) != 0 ) 00906 { 00907 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret ); 00908 return( ret ); 00909 } 00910 00911 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1, 00912 cipher_info->key_bitlen, 00913 MBEDTLS_ENCRYPT ) ) != 0 ) 00914 { 00915 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret ); 00916 return( ret ); 00917 } 00918 00919 if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2, 00920 cipher_info->key_bitlen, 00921 MBEDTLS_DECRYPT ) ) != 0 ) 00922 { 00923 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret ); 00924 return( ret ); 00925 } 00926 00927 #if defined(MBEDTLS_CIPHER_MODE_CBC) 00928 if( cipher_info->mode == MBEDTLS_MODE_CBC ) 00929 { 00930 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc, 00931 MBEDTLS_PADDING_NONE ) ) != 0 ) 00932 { 00933 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret ); 00934 return( ret ); 00935 } 00936 00937 if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec, 00938 MBEDTLS_PADDING_NONE ) ) != 0 ) 00939 { 00940 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret ); 00941 return( ret ); 00942 } 00943 } 00944 #endif /* MBEDTLS_CIPHER_MODE_CBC */ 00945 00946 mbedtls_zeroize( keyblk, sizeof( keyblk ) ); 00947 00948 #if defined(MBEDTLS_ZLIB_SUPPORT) 00949 // Initialize compression 00950 // 00951 if( session->compression == MBEDTLS_SSL_COMPRESS_DEFLATE ) 00952 { 00953 if( ssl->compress_buf == NULL ) 00954 { 00955 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Allocating compression buffer" ) ); 00956 ssl->compress_buf = mbedtls_calloc( 1, MBEDTLS_SSL_BUFFER_LEN ); 00957 if( ssl->compress_buf == NULL ) 00958 { 00959 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", 00960 MBEDTLS_SSL_BUFFER_LEN ) ); 00961 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 00962 } 00963 } 00964 00965 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) ); 00966 00967 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) ); 00968 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) ); 00969 00970 if( deflateInit( &transform->ctx_deflate, 00971 Z_DEFAULT_COMPRESSION ) != Z_OK || 00972 inflateInit( &transform->ctx_inflate ) != Z_OK ) 00973 { 00974 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) ); 00975 return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED ); 00976 } 00977 } 00978 #endif /* MBEDTLS_ZLIB_SUPPORT */ 00979 00980 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive keys" ) ); 00981 00982 return( 0 ); 00983 } 00984 00985 #if defined(MBEDTLS_SSL_PROTO_SSL3) 00986 void ssl_calc_verify_ssl( mbedtls_ssl_context *ssl, unsigned char hash[36] ) 00987 { 00988 mbedtls_md5_context md5; 00989 mbedtls_sha1_context sha1; 00990 unsigned char pad_1[48]; 00991 unsigned char pad_2[48]; 00992 00993 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) ); 00994 00995 mbedtls_md5_init( &md5 ); 00996 mbedtls_sha1_init( &sha1 ); 00997 00998 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); 00999 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); 01000 01001 memset( pad_1, 0x36, 48 ); 01002 memset( pad_2, 0x5C, 48 ); 01003 01004 mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 ); 01005 mbedtls_md5_update_ret( &md5, pad_1, 48 ); 01006 mbedtls_md5_finish_ret( &md5, hash ); 01007 01008 mbedtls_md5_starts_ret( &md5 ); 01009 mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 ); 01010 mbedtls_md5_update_ret( &md5, pad_2, 48 ); 01011 mbedtls_md5_update_ret( &md5, hash, 16 ); 01012 mbedtls_md5_finish_ret( &md5, hash ); 01013 01014 mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 ); 01015 mbedtls_sha1_update_ret( &sha1, pad_1, 40 ); 01016 mbedtls_sha1_finish_ret( &sha1, hash + 16 ); 01017 01018 mbedtls_sha1_starts_ret( &sha1 ); 01019 mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 ); 01020 mbedtls_sha1_update_ret( &sha1, pad_2, 40 ); 01021 mbedtls_sha1_update_ret( &sha1, hash + 16, 20 ); 01022 mbedtls_sha1_finish_ret( &sha1, hash + 16 ); 01023 01024 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 ); 01025 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); 01026 01027 mbedtls_md5_free( &md5 ); 01028 mbedtls_sha1_free( &sha1 ); 01029 01030 return; 01031 } 01032 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ 01033 01034 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) 01035 void ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char hash[36] ) 01036 { 01037 mbedtls_md5_context md5; 01038 mbedtls_sha1_context sha1; 01039 01040 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) ); 01041 01042 mbedtls_md5_init( &md5 ); 01043 mbedtls_sha1_init( &sha1 ); 01044 01045 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); 01046 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); 01047 01048 mbedtls_md5_finish_ret( &md5, hash ); 01049 mbedtls_sha1_finish_ret( &sha1, hash + 16 ); 01050 01051 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 ); 01052 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); 01053 01054 mbedtls_md5_free( &md5 ); 01055 mbedtls_sha1_free( &sha1 ); 01056 01057 return; 01058 } 01059 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ 01060 01061 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 01062 #if defined(MBEDTLS_SHA256_C) 01063 void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char hash[32] ) 01064 { 01065 mbedtls_sha256_context sha256; 01066 01067 mbedtls_sha256_init( &sha256 ); 01068 01069 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) ); 01070 01071 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 ); 01072 mbedtls_sha256_finish_ret( &sha256, hash ); 01073 01074 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 ); 01075 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); 01076 01077 mbedtls_sha256_free( &sha256 ); 01078 01079 return; 01080 } 01081 #endif /* MBEDTLS_SHA256_C */ 01082 01083 #if defined(MBEDTLS_SHA512_C) 01084 void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *ssl, unsigned char hash[48] ) 01085 { 01086 mbedtls_sha512_context sha512; 01087 01088 mbedtls_sha512_init( &sha512 ); 01089 01090 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) ); 01091 01092 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 ); 01093 mbedtls_sha512_finish_ret( &sha512, hash ); 01094 01095 MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 ); 01096 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); 01097 01098 mbedtls_sha512_free( &sha512 ); 01099 01100 return; 01101 } 01102 #endif /* MBEDTLS_SHA512_C */ 01103 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 01104 01105 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) 01106 int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex ) 01107 { 01108 unsigned char *p = ssl->handshake->premaster; 01109 unsigned char *end = p + sizeof( ssl->handshake->premaster ); 01110 const unsigned char *psk = ssl->conf->psk; 01111 size_t psk_len = ssl->conf->psk_len; 01112 01113 /* If the psk callback was called, use its result */ 01114 if( ssl->handshake->psk != NULL ) 01115 { 01116 psk = ssl->handshake->psk; 01117 psk_len = ssl->handshake->psk_len; 01118 } 01119 01120 /* 01121 * PMS = struct { 01122 * opaque other_secret<0..2^16-1>; 01123 * opaque psk<0..2^16-1>; 01124 * }; 01125 * with "other_secret" depending on the particular key exchange 01126 */ 01127 #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) 01128 if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK ) 01129 { 01130 if( end - p < 2 ) 01131 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 01132 01133 *(p++) = (unsigned char)( psk_len >> 8 ); 01134 *(p++) = (unsigned char)( psk_len ); 01135 01136 if( end < p || (size_t)( end - p ) < psk_len ) 01137 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 01138 01139 memset( p, 0, psk_len ); 01140 p += psk_len; 01141 } 01142 else 01143 #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ 01144 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) 01145 if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) 01146 { 01147 /* 01148 * other_secret already set by the ClientKeyExchange message, 01149 * and is 48 bytes long 01150 */ 01151 *p++ = 0; 01152 *p++ = 48; 01153 p += 48; 01154 } 01155 else 01156 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ 01157 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) 01158 if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK ) 01159 { 01160 int ret; 01161 size_t len; 01162 01163 /* Write length only when we know the actual value */ 01164 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx, 01165 p + 2, end - ( p + 2 ), &len, 01166 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) 01167 { 01168 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret ); 01169 return( ret ); 01170 } 01171 *(p++) = (unsigned char)( len >> 8 ); 01172 *(p++) = (unsigned char)( len ); 01173 p += len; 01174 01175 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K ); 01176 } 01177 else 01178 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ 01179 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) 01180 if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) 01181 { 01182 int ret; 01183 size_t zlen; 01184 01185 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen, 01186 p + 2, end - ( p + 2 ), 01187 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) 01188 { 01189 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret ); 01190 return( ret ); 01191 } 01192 01193 *(p++) = (unsigned char)( zlen >> 8 ); 01194 *(p++) = (unsigned char)( zlen ); 01195 p += zlen; 01196 01197 MBEDTLS_SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z ); 01198 } 01199 else 01200 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ 01201 { 01202 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01203 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01204 } 01205 01206 /* opaque psk<0..2^16-1>; */ 01207 if( end - p < 2 ) 01208 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 01209 01210 *(p++) = (unsigned char)( psk_len >> 8 ); 01211 *(p++) = (unsigned char)( psk_len ); 01212 01213 if( end < p || (size_t)( end - p ) < psk_len ) 01214 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 01215 01216 memcpy( p, psk, psk_len ); 01217 p += psk_len; 01218 01219 ssl->handshake->pmslen = p - ssl->handshake->premaster; 01220 01221 return( 0 ); 01222 } 01223 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ 01224 01225 #if defined(MBEDTLS_SSL_PROTO_SSL3) 01226 /* 01227 * SSLv3.0 MAC functions 01228 */ 01229 #define SSL_MAC_MAX_BYTES 20 /* MD-5 or SHA-1 */ 01230 static void ssl_mac( mbedtls_md_context_t *md_ctx, 01231 const unsigned char *secret, 01232 const unsigned char *buf, size_t len, 01233 const unsigned char *ctr, int type, 01234 unsigned char out[SSL_MAC_MAX_BYTES] ) 01235 { 01236 unsigned char header[11]; 01237 unsigned char padding[48]; 01238 int padlen; 01239 int md_size = mbedtls_md_get_size( md_ctx->md_info ); 01240 int md_type = mbedtls_md_get_type( md_ctx->md_info ); 01241 01242 /* Only MD5 and SHA-1 supported */ 01243 if( md_type == MBEDTLS_MD_MD5 ) 01244 padlen = 48; 01245 else 01246 padlen = 40; 01247 01248 memcpy( header, ctr, 8 ); 01249 header[ 8] = (unsigned char) type; 01250 header[ 9] = (unsigned char)( len >> 8 ); 01251 header[10] = (unsigned char)( len ); 01252 01253 memset( padding, 0x36, padlen ); 01254 mbedtls_md_starts( md_ctx ); 01255 mbedtls_md_update( md_ctx, secret, md_size ); 01256 mbedtls_md_update( md_ctx, padding, padlen ); 01257 mbedtls_md_update( md_ctx, header, 11 ); 01258 mbedtls_md_update( md_ctx, buf, len ); 01259 mbedtls_md_finish( md_ctx, out ); 01260 01261 memset( padding, 0x5C, padlen ); 01262 mbedtls_md_starts( md_ctx ); 01263 mbedtls_md_update( md_ctx, secret, md_size ); 01264 mbedtls_md_update( md_ctx, padding, padlen ); 01265 mbedtls_md_update( md_ctx, out, md_size ); 01266 mbedtls_md_finish( md_ctx, out ); 01267 } 01268 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ 01269 01270 #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) || \ 01271 ( defined(MBEDTLS_CIPHER_MODE_CBC) && \ 01272 ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) ) ) 01273 #define SSL_SOME_MODES_USE_MAC 01274 #endif 01275 01276 /* 01277 * Encryption/decryption functions 01278 */ 01279 static int ssl_encrypt_buf( mbedtls_ssl_context *ssl ) 01280 { 01281 mbedtls_cipher_mode_t mode; 01282 int auth_done = 0; 01283 01284 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) ); 01285 01286 if( ssl->session_out == NULL || ssl->transform_out == NULL ) 01287 { 01288 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01289 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01290 } 01291 01292 mode = mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc ); 01293 01294 MBEDTLS_SSL_DEBUG_BUF( 4, "before encrypt: output payload", 01295 ssl->out_msg, ssl->out_msglen ); 01296 01297 if( ssl->out_msglen > MBEDTLS_SSL_MAX_CONTENT_LEN ) 01298 { 01299 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Record content %u too large, maximum %d", 01300 (unsigned) ssl->out_msglen, 01301 MBEDTLS_SSL_MAX_CONTENT_LEN ) ); 01302 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 01303 } 01304 01305 /* 01306 * Add MAC before if needed 01307 */ 01308 #if defined(SSL_SOME_MODES_USE_MAC) 01309 if( mode == MBEDTLS_MODE_STREAM || 01310 ( mode == MBEDTLS_MODE_CBC 01311 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 01312 && ssl->session_out->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED 01313 #endif 01314 ) ) 01315 { 01316 #if defined(MBEDTLS_SSL_PROTO_SSL3) 01317 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 01318 { 01319 unsigned char mac[SSL_MAC_MAX_BYTES]; 01320 01321 ssl_mac( &ssl->transform_out->md_ctx_enc, 01322 ssl->transform_out->mac_enc, 01323 ssl->out_msg, ssl->out_msglen, 01324 ssl->out_ctr, ssl->out_msgtype, 01325 mac ); 01326 01327 memcpy( ssl->out_msg + ssl->out_msglen, mac, ssl->transform_out->maclen ); 01328 } 01329 else 01330 #endif 01331 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ 01332 defined(MBEDTLS_SSL_PROTO_TLS1_2) 01333 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 ) 01334 { 01335 unsigned char mac[MBEDTLS_SSL_MAC_ADD]; 01336 01337 mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 8 ); 01338 mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_hdr, 3 ); 01339 mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_len, 2 ); 01340 mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, 01341 ssl->out_msg, ssl->out_msglen ); 01342 mbedtls_md_hmac_finish( &ssl->transform_out->md_ctx_enc, mac ); 01343 mbedtls_md_hmac_reset( &ssl->transform_out->md_ctx_enc ); 01344 01345 memcpy( ssl->out_msg + ssl->out_msglen, mac, ssl->transform_out->maclen ); 01346 } 01347 else 01348 #endif 01349 { 01350 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01351 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01352 } 01353 01354 MBEDTLS_SSL_DEBUG_BUF( 4, "computed mac", 01355 ssl->out_msg + ssl->out_msglen, 01356 ssl->transform_out->maclen ); 01357 01358 ssl->out_msglen += ssl->transform_out->maclen; 01359 auth_done++; 01360 } 01361 #endif /* AEAD not the only option */ 01362 01363 /* 01364 * Encrypt 01365 */ 01366 #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) 01367 if( mode == MBEDTLS_MODE_STREAM ) 01368 { 01369 int ret; 01370 size_t olen = 0; 01371 01372 MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " 01373 "including %d bytes of padding", 01374 ssl->out_msglen, 0 ) ); 01375 01376 if( ( ret = mbedtls_cipher_crypt( &ssl->transform_out->cipher_ctx_enc, 01377 ssl->transform_out->iv_enc, 01378 ssl->transform_out->ivlen, 01379 ssl->out_msg, ssl->out_msglen, 01380 ssl->out_msg, &olen ) ) != 0 ) 01381 { 01382 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); 01383 return( ret ); 01384 } 01385 01386 if( ssl->out_msglen != olen ) 01387 { 01388 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01389 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01390 } 01391 } 01392 else 01393 #endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */ 01394 #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) 01395 if( mode == MBEDTLS_MODE_GCM || 01396 mode == MBEDTLS_MODE_CCM ) 01397 { 01398 int ret; 01399 size_t enc_msglen, olen; 01400 unsigned char *enc_msg; 01401 unsigned char add_data[13]; 01402 unsigned char taglen = ssl->transform_out->ciphersuite_info->flags & 01403 MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16; 01404 01405 memcpy( add_data, ssl->out_ctr, 8 ); 01406 add_data[8] = ssl->out_msgtype; 01407 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, 01408 ssl->conf->transport, add_data + 9 ); 01409 add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF; 01410 add_data[12] = ssl->out_msglen & 0xFF; 01411 01412 MBEDTLS_SSL_DEBUG_BUF( 4, "additional data used for AEAD", 01413 add_data, 13 ); 01414 01415 /* 01416 * Generate IV 01417 */ 01418 if( ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen != 8 ) 01419 { 01420 /* Reminder if we ever add an AEAD mode with a different size */ 01421 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01422 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01423 } 01424 01425 memcpy( ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen, 01426 ssl->out_ctr, 8 ); 01427 memcpy( ssl->out_iv, ssl->out_ctr, 8 ); 01428 01429 MBEDTLS_SSL_DEBUG_BUF( 4, "IV used", ssl->out_iv, 01430 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen ); 01431 01432 /* 01433 * Fix pointer positions and message length with added IV 01434 */ 01435 enc_msg = ssl->out_msg; 01436 enc_msglen = ssl->out_msglen; 01437 ssl->out_msglen += ssl->transform_out->ivlen - 01438 ssl->transform_out->fixed_ivlen; 01439 01440 MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " 01441 "including %d bytes of padding", 01442 ssl->out_msglen, 0 ) ); 01443 01444 /* 01445 * Encrypt and authenticate 01446 */ 01447 if( ( ret = mbedtls_cipher_auth_encrypt( &ssl->transform_out->cipher_ctx_enc, 01448 ssl->transform_out->iv_enc, 01449 ssl->transform_out->ivlen, 01450 add_data, 13, 01451 enc_msg, enc_msglen, 01452 enc_msg, &olen, 01453 enc_msg + enc_msglen, taglen ) ) != 0 ) 01454 { 01455 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_auth_encrypt", ret ); 01456 return( ret ); 01457 } 01458 01459 if( olen != enc_msglen ) 01460 { 01461 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01462 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01463 } 01464 01465 ssl->out_msglen += taglen; 01466 auth_done++; 01467 01468 MBEDTLS_SSL_DEBUG_BUF( 4, "after encrypt: tag", enc_msg + enc_msglen, taglen ); 01469 } 01470 else 01471 #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */ 01472 #if defined(MBEDTLS_CIPHER_MODE_CBC) && \ 01473 ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) ) 01474 if( mode == MBEDTLS_MODE_CBC ) 01475 { 01476 int ret; 01477 unsigned char *enc_msg; 01478 size_t enc_msglen, padlen, olen = 0, i; 01479 01480 padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) % 01481 ssl->transform_out->ivlen; 01482 if( padlen == ssl->transform_out->ivlen ) 01483 padlen = 0; 01484 01485 for( i = 0; i <= padlen; i++ ) 01486 ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen; 01487 01488 ssl->out_msglen += padlen + 1; 01489 01490 enc_msglen = ssl->out_msglen; 01491 enc_msg = ssl->out_msg; 01492 01493 #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) 01494 /* 01495 * Prepend per-record IV for block cipher in TLS v1.1 and up as per 01496 * Method 1 (6.2.3.2. in RFC4346 and RFC5246) 01497 */ 01498 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) 01499 { 01500 /* 01501 * Generate IV 01502 */ 01503 ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->transform_out->iv_enc, 01504 ssl->transform_out->ivlen ); 01505 if( ret != 0 ) 01506 return( ret ); 01507 01508 memcpy( ssl->out_iv, ssl->transform_out->iv_enc, 01509 ssl->transform_out->ivlen ); 01510 01511 /* 01512 * Fix pointer positions and message length with added IV 01513 */ 01514 enc_msg = ssl->out_msg; 01515 enc_msglen = ssl->out_msglen; 01516 ssl->out_msglen += ssl->transform_out->ivlen; 01517 } 01518 #endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ 01519 01520 MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " 01521 "including %d bytes of IV and %d bytes of padding", 01522 ssl->out_msglen, ssl->transform_out->ivlen, 01523 padlen + 1 ) ); 01524 01525 if( ( ret = mbedtls_cipher_crypt( &ssl->transform_out->cipher_ctx_enc, 01526 ssl->transform_out->iv_enc, 01527 ssl->transform_out->ivlen, 01528 enc_msg, enc_msglen, 01529 enc_msg, &olen ) ) != 0 ) 01530 { 01531 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); 01532 return( ret ); 01533 } 01534 01535 if( enc_msglen != olen ) 01536 { 01537 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01538 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01539 } 01540 01541 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) 01542 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ) 01543 { 01544 /* 01545 * Save IV in SSL3 and TLS1 01546 */ 01547 memcpy( ssl->transform_out->iv_enc, 01548 ssl->transform_out->cipher_ctx_enc.iv, 01549 ssl->transform_out->ivlen ); 01550 } 01551 #endif 01552 01553 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 01554 if( auth_done == 0 ) 01555 { 01556 /* 01557 * MAC(MAC_write_key, seq_num + 01558 * TLSCipherText.type + 01559 * TLSCipherText.version + 01560 * length_of( (IV +) ENC(...) ) + 01561 * IV + // except for TLS 1.0 01562 * ENC(content + padding + padding_length)); 01563 */ 01564 unsigned char pseudo_hdr[13]; 01565 01566 MBEDTLS_SSL_DEBUG_MSG( 3, ( "using encrypt then mac" ) ); 01567 01568 memcpy( pseudo_hdr + 0, ssl->out_ctr, 8 ); 01569 memcpy( pseudo_hdr + 8, ssl->out_hdr, 3 ); 01570 pseudo_hdr[11] = (unsigned char)( ( ssl->out_msglen >> 8 ) & 0xFF ); 01571 pseudo_hdr[12] = (unsigned char)( ( ssl->out_msglen ) & 0xFF ); 01572 01573 MBEDTLS_SSL_DEBUG_BUF( 4, "MAC'd meta-data", pseudo_hdr, 13 ); 01574 01575 mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, pseudo_hdr, 13 ); 01576 mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, 01577 ssl->out_iv, ssl->out_msglen ); 01578 mbedtls_md_hmac_finish( &ssl->transform_out->md_ctx_enc, 01579 ssl->out_iv + ssl->out_msglen ); 01580 mbedtls_md_hmac_reset( &ssl->transform_out->md_ctx_enc ); 01581 01582 ssl->out_msglen += ssl->transform_out->maclen; 01583 auth_done++; 01584 } 01585 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ 01586 } 01587 else 01588 #endif /* MBEDTLS_CIPHER_MODE_CBC && 01589 ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C ) */ 01590 { 01591 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01592 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01593 } 01594 01595 /* Make extra sure authentication was performed, exactly once */ 01596 if( auth_done != 1 ) 01597 { 01598 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01599 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01600 } 01601 01602 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) ); 01603 01604 return( 0 ); 01605 } 01606 01607 static int ssl_decrypt_buf( mbedtls_ssl_context *ssl ) 01608 { 01609 size_t i; 01610 mbedtls_cipher_mode_t mode; 01611 int auth_done = 0; 01612 #if defined(SSL_SOME_MODES_USE_MAC) 01613 size_t padlen = 0, correct = 1; 01614 #endif 01615 01616 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) ); 01617 01618 if( ssl->session_in == NULL || ssl->transform_in == NULL ) 01619 { 01620 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01621 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01622 } 01623 01624 mode = mbedtls_cipher_get_cipher_mode( &ssl->transform_in->cipher_ctx_dec ); 01625 01626 if( ssl->in_msglen < ssl->transform_in->minlen ) 01627 { 01628 MBEDTLS_SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)", 01629 ssl->in_msglen, ssl->transform_in->minlen ) ); 01630 return( MBEDTLS_ERR_SSL_INVALID_MAC ); 01631 } 01632 01633 #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) 01634 if( mode == MBEDTLS_MODE_STREAM ) 01635 { 01636 int ret; 01637 size_t olen = 0; 01638 01639 padlen = 0; 01640 01641 if( ( ret = mbedtls_cipher_crypt( &ssl->transform_in->cipher_ctx_dec, 01642 ssl->transform_in->iv_dec, 01643 ssl->transform_in->ivlen, 01644 ssl->in_msg, ssl->in_msglen, 01645 ssl->in_msg, &olen ) ) != 0 ) 01646 { 01647 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); 01648 return( ret ); 01649 } 01650 01651 if( ssl->in_msglen != olen ) 01652 { 01653 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01654 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01655 } 01656 } 01657 else 01658 #endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */ 01659 #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) 01660 if( mode == MBEDTLS_MODE_GCM || 01661 mode == MBEDTLS_MODE_CCM ) 01662 { 01663 int ret; 01664 size_t dec_msglen, olen; 01665 unsigned char *dec_msg; 01666 unsigned char *dec_msg_result; 01667 unsigned char add_data[13]; 01668 unsigned char taglen = ssl->transform_in->ciphersuite_info->flags & 01669 MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16; 01670 size_t explicit_iv_len = ssl->transform_in->ivlen - 01671 ssl->transform_in->fixed_ivlen; 01672 01673 if( ssl->in_msglen < explicit_iv_len + taglen ) 01674 { 01675 MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < explicit_iv_len (%d) " 01676 "+ taglen (%d)", ssl->in_msglen, 01677 explicit_iv_len, taglen ) ); 01678 return( MBEDTLS_ERR_SSL_INVALID_MAC ); 01679 } 01680 dec_msglen = ssl->in_msglen - explicit_iv_len - taglen; 01681 01682 dec_msg = ssl->in_msg; 01683 dec_msg_result = ssl->in_msg; 01684 ssl->in_msglen = dec_msglen; 01685 01686 memcpy( add_data, ssl->in_ctr, 8 ); 01687 add_data[8] = ssl->in_msgtype; 01688 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, 01689 ssl->conf->transport, add_data + 9 ); 01690 add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF; 01691 add_data[12] = ssl->in_msglen & 0xFF; 01692 01693 MBEDTLS_SSL_DEBUG_BUF( 4, "additional data used for AEAD", 01694 add_data, 13 ); 01695 01696 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen, 01697 ssl->in_iv, 01698 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen ); 01699 01700 MBEDTLS_SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec, 01701 ssl->transform_in->ivlen ); 01702 MBEDTLS_SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, taglen ); 01703 01704 /* 01705 * Decrypt and authenticate 01706 */ 01707 if( ( ret = mbedtls_cipher_auth_decrypt( &ssl->transform_in->cipher_ctx_dec, 01708 ssl->transform_in->iv_dec, 01709 ssl->transform_in->ivlen, 01710 add_data, 13, 01711 dec_msg, dec_msglen, 01712 dec_msg_result, &olen, 01713 dec_msg + dec_msglen, taglen ) ) != 0 ) 01714 { 01715 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_auth_decrypt", ret ); 01716 01717 if( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED ) 01718 return( MBEDTLS_ERR_SSL_INVALID_MAC ); 01719 01720 return( ret ); 01721 } 01722 auth_done++; 01723 01724 if( olen != dec_msglen ) 01725 { 01726 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01727 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01728 } 01729 } 01730 else 01731 #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */ 01732 #if defined(MBEDTLS_CIPHER_MODE_CBC) && \ 01733 ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) ) 01734 if( mode == MBEDTLS_MODE_CBC ) 01735 { 01736 /* 01737 * Decrypt and check the padding 01738 */ 01739 int ret; 01740 unsigned char *dec_msg; 01741 unsigned char *dec_msg_result; 01742 size_t dec_msglen; 01743 size_t minlen = 0; 01744 size_t olen = 0; 01745 01746 /* 01747 * Check immediate ciphertext sanity 01748 */ 01749 #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) 01750 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) 01751 minlen += ssl->transform_in->ivlen; 01752 #endif 01753 01754 if( ssl->in_msglen < minlen + ssl->transform_in->ivlen || 01755 ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 ) 01756 { 01757 MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) " 01758 "+ 1 ) ( + expl IV )", ssl->in_msglen, 01759 ssl->transform_in->ivlen, 01760 ssl->transform_in->maclen ) ); 01761 return( MBEDTLS_ERR_SSL_INVALID_MAC ); 01762 } 01763 01764 dec_msglen = ssl->in_msglen; 01765 dec_msg = ssl->in_msg; 01766 dec_msg_result = ssl->in_msg; 01767 01768 /* 01769 * Authenticate before decrypt if enabled 01770 */ 01771 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 01772 if( ssl->session_in->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED ) 01773 { 01774 unsigned char mac_expect[MBEDTLS_SSL_MAC_ADD]; 01775 unsigned char pseudo_hdr[13]; 01776 01777 MBEDTLS_SSL_DEBUG_MSG( 3, ( "using encrypt then mac" ) ); 01778 01779 dec_msglen -= ssl->transform_in->maclen; 01780 ssl->in_msglen -= ssl->transform_in->maclen; 01781 01782 memcpy( pseudo_hdr + 0, ssl->in_ctr, 8 ); 01783 memcpy( pseudo_hdr + 8, ssl->in_hdr, 3 ); 01784 pseudo_hdr[11] = (unsigned char)( ( ssl->in_msglen >> 8 ) & 0xFF ); 01785 pseudo_hdr[12] = (unsigned char)( ( ssl->in_msglen ) & 0xFF ); 01786 01787 MBEDTLS_SSL_DEBUG_BUF( 4, "MAC'd meta-data", pseudo_hdr, 13 ); 01788 01789 mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, pseudo_hdr, 13 ); 01790 mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, 01791 ssl->in_iv, ssl->in_msglen ); 01792 mbedtls_md_hmac_finish( &ssl->transform_in->md_ctx_dec, mac_expect ); 01793 mbedtls_md_hmac_reset( &ssl->transform_in->md_ctx_dec ); 01794 01795 MBEDTLS_SSL_DEBUG_BUF( 4, "message mac", ssl->in_iv + ssl->in_msglen, 01796 ssl->transform_in->maclen ); 01797 MBEDTLS_SSL_DEBUG_BUF( 4, "expected mac", mac_expect, 01798 ssl->transform_in->maclen ); 01799 01800 if( mbedtls_ssl_safer_memcmp( ssl->in_iv + ssl->in_msglen, mac_expect, 01801 ssl->transform_in->maclen ) != 0 ) 01802 { 01803 MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) ); 01804 01805 return( MBEDTLS_ERR_SSL_INVALID_MAC ); 01806 } 01807 auth_done++; 01808 } 01809 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ 01810 01811 /* 01812 * Check length sanity 01813 */ 01814 if( ssl->in_msglen % ssl->transform_in->ivlen != 0 ) 01815 { 01816 MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0", 01817 ssl->in_msglen, ssl->transform_in->ivlen ) ); 01818 return( MBEDTLS_ERR_SSL_INVALID_MAC ); 01819 } 01820 01821 #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) 01822 /* 01823 * Initialize for prepended IV for block cipher in TLS v1.1 and up 01824 */ 01825 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) 01826 { 01827 dec_msglen -= ssl->transform_in->ivlen; 01828 ssl->in_msglen -= ssl->transform_in->ivlen; 01829 01830 for( i = 0; i < ssl->transform_in->ivlen; i++ ) 01831 ssl->transform_in->iv_dec[i] = ssl->in_iv[i]; 01832 } 01833 #endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ 01834 01835 if( ( ret = mbedtls_cipher_crypt( &ssl->transform_in->cipher_ctx_dec, 01836 ssl->transform_in->iv_dec, 01837 ssl->transform_in->ivlen, 01838 dec_msg, dec_msglen, 01839 dec_msg_result, &olen ) ) != 0 ) 01840 { 01841 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); 01842 return( ret ); 01843 } 01844 01845 if( dec_msglen != olen ) 01846 { 01847 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01848 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01849 } 01850 01851 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) 01852 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ) 01853 { 01854 /* 01855 * Save IV in SSL3 and TLS1 01856 */ 01857 memcpy( ssl->transform_in->iv_dec, 01858 ssl->transform_in->cipher_ctx_dec.iv, 01859 ssl->transform_in->ivlen ); 01860 } 01861 #endif 01862 01863 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1]; 01864 01865 if( ssl->in_msglen < ssl->transform_in->maclen + padlen && 01866 auth_done == 0 ) 01867 { 01868 #if defined(MBEDTLS_SSL_DEBUG_ALL) 01869 MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)", 01870 ssl->in_msglen, ssl->transform_in->maclen, padlen ) ); 01871 #endif 01872 padlen = 0; 01873 correct = 0; 01874 } 01875 01876 #if defined(MBEDTLS_SSL_PROTO_SSL3) 01877 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 01878 { 01879 if( padlen > ssl->transform_in->ivlen ) 01880 { 01881 #if defined(MBEDTLS_SSL_DEBUG_ALL) 01882 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, " 01883 "should be no more than %d", 01884 padlen, ssl->transform_in->ivlen ) ); 01885 #endif 01886 correct = 0; 01887 } 01888 } 01889 else 01890 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ 01891 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ 01892 defined(MBEDTLS_SSL_PROTO_TLS1_2) 01893 if( ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 ) 01894 { 01895 /* 01896 * TLSv1+: always check the padding up to the first failure 01897 * and fake check up to 256 bytes of padding 01898 */ 01899 size_t pad_count = 0, real_count = 1; 01900 size_t padding_idx = ssl->in_msglen - padlen - 1; 01901 01902 /* 01903 * Padding is guaranteed to be incorrect if: 01904 * 1. padlen >= ssl->in_msglen 01905 * 01906 * 2. padding_idx >= MBEDTLS_SSL_MAX_CONTENT_LEN + 01907 * ssl->transform_in->maclen 01908 * 01909 * In both cases we reset padding_idx to a safe value (0) to 01910 * prevent out-of-buffer reads. 01911 */ 01912 correct &= ( ssl->in_msglen >= padlen + 1 ); 01913 correct &= ( padding_idx < MBEDTLS_SSL_MAX_CONTENT_LEN + 01914 ssl->transform_in->maclen ); 01915 01916 padding_idx *= correct; 01917 01918 for( i = 1; i <= 256; i++ ) 01919 { 01920 real_count &= ( i <= padlen ); 01921 pad_count += real_count * 01922 ( ssl->in_msg[padding_idx + i] == padlen - 1 ); 01923 } 01924 01925 correct &= ( pad_count == padlen ); /* Only 1 on correct padding */ 01926 01927 #if defined(MBEDTLS_SSL_DEBUG_ALL) 01928 if( padlen > 0 && correct == 0 ) 01929 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) ); 01930 #endif 01931 padlen &= correct * 0x1FF; 01932 } 01933 else 01934 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ 01935 MBEDTLS_SSL_PROTO_TLS1_2 */ 01936 { 01937 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01938 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01939 } 01940 01941 ssl->in_msglen -= padlen; 01942 } 01943 else 01944 #endif /* MBEDTLS_CIPHER_MODE_CBC && 01945 ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C ) */ 01946 { 01947 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 01948 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 01949 } 01950 01951 MBEDTLS_SSL_DEBUG_BUF( 4, "raw buffer after decryption", 01952 ssl->in_msg, ssl->in_msglen ); 01953 01954 /* 01955 * Authenticate if not done yet. 01956 * Compute the MAC regardless of the padding result (RFC4346, CBCTIME). 01957 */ 01958 #if defined(SSL_SOME_MODES_USE_MAC) 01959 if( auth_done == 0 ) 01960 { 01961 unsigned char mac_expect[MBEDTLS_SSL_MAC_ADD]; 01962 01963 ssl->in_msglen -= ssl->transform_in->maclen; 01964 01965 ssl->in_len[0] = (unsigned char)( ssl->in_msglen >> 8 ); 01966 ssl->in_len[1] = (unsigned char)( ssl->in_msglen ); 01967 01968 #if defined(MBEDTLS_SSL_PROTO_SSL3) 01969 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 01970 { 01971 ssl_mac( &ssl->transform_in->md_ctx_dec, 01972 ssl->transform_in->mac_dec, 01973 ssl->in_msg, ssl->in_msglen, 01974 ssl->in_ctr, ssl->in_msgtype, 01975 mac_expect ); 01976 } 01977 else 01978 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ 01979 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ 01980 defined(MBEDTLS_SSL_PROTO_TLS1_2) 01981 if( ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 ) 01982 { 01983 /* 01984 * Process MAC and always update for padlen afterwards to make 01985 * total time independent of padlen 01986 * 01987 * extra_run compensates MAC check for padlen 01988 * 01989 * Known timing attacks: 01990 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf) 01991 * 01992 * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values 01993 * correctly. (We round down instead of up, so -56 is the correct 01994 * value for our calculations instead of -55) 01995 */ 01996 size_t j, extra_run = 0; 01997 extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 - 01998 ( 13 + ssl->in_msglen + 8 ) / 64; 01999 02000 extra_run &= correct * 0xFF; 02001 02002 mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 8 ); 02003 mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_hdr, 3 ); 02004 mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_len, 2 ); 02005 mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg, 02006 ssl->in_msglen ); 02007 mbedtls_md_hmac_finish( &ssl->transform_in->md_ctx_dec, mac_expect ); 02008 /* Call mbedtls_md_process at least once due to cache attacks */ 02009 for( j = 0; j < extra_run + 1; j++ ) 02010 mbedtls_md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg ); 02011 02012 mbedtls_md_hmac_reset( &ssl->transform_in->md_ctx_dec ); 02013 } 02014 else 02015 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ 02016 MBEDTLS_SSL_PROTO_TLS1_2 */ 02017 { 02018 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 02019 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 02020 } 02021 02022 MBEDTLS_SSL_DEBUG_BUF( 4, "expected mac", mac_expect, ssl->transform_in->maclen ); 02023 MBEDTLS_SSL_DEBUG_BUF( 4, "message mac", ssl->in_msg + ssl->in_msglen, 02024 ssl->transform_in->maclen ); 02025 02026 if( mbedtls_ssl_safer_memcmp( ssl->in_msg + ssl->in_msglen, mac_expect, 02027 ssl->transform_in->maclen ) != 0 ) 02028 { 02029 #if defined(MBEDTLS_SSL_DEBUG_ALL) 02030 MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) ); 02031 #endif 02032 correct = 0; 02033 } 02034 auth_done++; 02035 02036 /* 02037 * Finally check the correct flag 02038 */ 02039 if( correct == 0 ) 02040 return( MBEDTLS_ERR_SSL_INVALID_MAC ); 02041 } 02042 #endif /* SSL_SOME_MODES_USE_MAC */ 02043 02044 /* Make extra sure authentication was performed, exactly once */ 02045 if( auth_done != 1 ) 02046 { 02047 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 02048 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 02049 } 02050 02051 if( ssl->in_msglen == 0 ) 02052 { 02053 ssl->nb_zero++; 02054 02055 /* 02056 * Three or more empty messages may be a DoS attack 02057 * (excessive CPU consumption). 02058 */ 02059 if( ssl->nb_zero > 3 ) 02060 { 02061 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received four consecutive empty " 02062 "messages, possible DoS attack" ) ); 02063 return( MBEDTLS_ERR_SSL_INVALID_MAC ); 02064 } 02065 } 02066 else 02067 ssl->nb_zero = 0; 02068 02069 #if defined(MBEDTLS_SSL_PROTO_DTLS) 02070 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 02071 { 02072 ; /* in_ctr read from peer, not maintained internally */ 02073 } 02074 else 02075 #endif 02076 { 02077 for( i = 8; i > ssl_ep_len( ssl ); i-- ) 02078 if( ++ssl->in_ctr[i - 1] != 0 ) 02079 break; 02080 02081 /* The loop goes to its end iff the counter is wrapping */ 02082 if( i == ssl_ep_len( ssl ) ) 02083 { 02084 MBEDTLS_SSL_DEBUG_MSG( 1, ( "incoming message counter would wrap" ) ); 02085 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); 02086 } 02087 } 02088 02089 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) ); 02090 02091 return( 0 ); 02092 } 02093 02094 #undef MAC_NONE 02095 #undef MAC_PLAINTEXT 02096 #undef MAC_CIPHERTEXT 02097 02098 #if defined(MBEDTLS_ZLIB_SUPPORT) 02099 /* 02100 * Compression/decompression functions 02101 */ 02102 static int ssl_compress_buf( mbedtls_ssl_context *ssl ) 02103 { 02104 int ret; 02105 unsigned char *msg_post = ssl->out_msg; 02106 size_t len_pre = ssl->out_msglen; 02107 unsigned char *msg_pre = ssl->compress_buf; 02108 02109 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> compress buf" ) ); 02110 02111 if( len_pre == 0 ) 02112 return( 0 ); 02113 02114 memcpy( msg_pre, ssl->out_msg, len_pre ); 02115 02116 MBEDTLS_SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ", 02117 ssl->out_msglen ) ); 02118 02119 MBEDTLS_SSL_DEBUG_BUF( 4, "before compression: output payload", 02120 ssl->out_msg, ssl->out_msglen ); 02121 02122 ssl->transform_out->ctx_deflate.next_in = msg_pre; 02123 ssl->transform_out->ctx_deflate.avail_in = len_pre; 02124 ssl->transform_out->ctx_deflate.next_out = msg_post; 02125 ssl->transform_out->ctx_deflate.avail_out = MBEDTLS_SSL_BUFFER_LEN; 02126 02127 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH ); 02128 if( ret != Z_OK ) 02129 { 02130 MBEDTLS_SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) ); 02131 return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED ); 02132 } 02133 02134 ssl->out_msglen = MBEDTLS_SSL_BUFFER_LEN - 02135 ssl->transform_out->ctx_deflate.avail_out; 02136 02137 MBEDTLS_SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ", 02138 ssl->out_msglen ) ); 02139 02140 MBEDTLS_SSL_DEBUG_BUF( 4, "after compression: output payload", 02141 ssl->out_msg, ssl->out_msglen ); 02142 02143 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= compress buf" ) ); 02144 02145 return( 0 ); 02146 } 02147 02148 static int ssl_decompress_buf( mbedtls_ssl_context *ssl ) 02149 { 02150 int ret; 02151 unsigned char *msg_post = ssl->in_msg; 02152 size_t len_pre = ssl->in_msglen; 02153 unsigned char *msg_pre = ssl->compress_buf; 02154 02155 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) ); 02156 02157 if( len_pre == 0 ) 02158 return( 0 ); 02159 02160 memcpy( msg_pre, ssl->in_msg, len_pre ); 02161 02162 MBEDTLS_SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ", 02163 ssl->in_msglen ) ); 02164 02165 MBEDTLS_SSL_DEBUG_BUF( 4, "before decompression: input payload", 02166 ssl->in_msg, ssl->in_msglen ); 02167 02168 ssl->transform_in->ctx_inflate.next_in = msg_pre; 02169 ssl->transform_in->ctx_inflate.avail_in = len_pre; 02170 ssl->transform_in->ctx_inflate.next_out = msg_post; 02171 ssl->transform_in->ctx_inflate.avail_out = MBEDTLS_SSL_MAX_CONTENT_LEN; 02172 02173 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH ); 02174 if( ret != Z_OK ) 02175 { 02176 MBEDTLS_SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) ); 02177 return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED ); 02178 } 02179 02180 ssl->in_msglen = MBEDTLS_SSL_MAX_CONTENT_LEN - 02181 ssl->transform_in->ctx_inflate.avail_out; 02182 02183 MBEDTLS_SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ", 02184 ssl->in_msglen ) ); 02185 02186 MBEDTLS_SSL_DEBUG_BUF( 4, "after decompression: input payload", 02187 ssl->in_msg, ssl->in_msglen ); 02188 02189 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) ); 02190 02191 return( 0 ); 02192 } 02193 #endif /* MBEDTLS_ZLIB_SUPPORT */ 02194 02195 #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) 02196 static int ssl_write_hello_request( mbedtls_ssl_context *ssl ); 02197 02198 #if defined(MBEDTLS_SSL_PROTO_DTLS) 02199 static int ssl_resend_hello_request( mbedtls_ssl_context *ssl ) 02200 { 02201 /* If renegotiation is not enforced, retransmit until we would reach max 02202 * timeout if we were using the usual handshake doubling scheme */ 02203 if( ssl->conf->renego_max_records < 0 ) 02204 { 02205 uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1; 02206 unsigned char doublings = 1; 02207 02208 while( ratio != 0 ) 02209 { 02210 ++doublings; 02211 ratio >>= 1; 02212 } 02213 02214 if( ++ssl->renego_records_seen > doublings ) 02215 { 02216 MBEDTLS_SSL_DEBUG_MSG( 2, ( "no longer retransmitting hello request" ) ); 02217 return( 0 ); 02218 } 02219 } 02220 02221 return( ssl_write_hello_request( ssl ) ); 02222 } 02223 #endif 02224 #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ 02225 02226 /* 02227 * Fill the input message buffer by appending data to it. 02228 * The amount of data already fetched is in ssl->in_left. 02229 * 02230 * If we return 0, is it guaranteed that (at least) nb_want bytes are 02231 * available (from this read and/or a previous one). Otherwise, an error code 02232 * is returned (possibly EOF or WANT_READ). 02233 * 02234 * With stream transport (TLS) on success ssl->in_left == nb_want, but 02235 * with datagram transport (DTLS) on success ssl->in_left >= nb_want, 02236 * since we always read a whole datagram at once. 02237 * 02238 * For DTLS, it is up to the caller to set ssl->next_record_offset when 02239 * they're done reading a record. 02240 */ 02241 int mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want ) 02242 { 02243 int ret; 02244 size_t len; 02245 02246 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> fetch input" ) ); 02247 02248 if( ssl->f_recv == NULL && ssl->f_recv_timeout == NULL ) 02249 { 02250 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() " 02251 "or mbedtls_ssl_set_bio()" ) ); 02252 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 02253 } 02254 02255 if( nb_want > MBEDTLS_SSL_BUFFER_LEN - (size_t)( ssl->in_hdr - ssl->in_buf ) ) 02256 { 02257 MBEDTLS_SSL_DEBUG_MSG( 1, ( "requesting more data than fits" ) ); 02258 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 02259 } 02260 02261 #if defined(MBEDTLS_SSL_PROTO_DTLS) 02262 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 02263 { 02264 uint32_t timeout; 02265 02266 /* Just to be sure */ 02267 if( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL ) 02268 { 02269 MBEDTLS_SSL_DEBUG_MSG( 1, ( "You must use " 02270 "mbedtls_ssl_set_timer_cb() for DTLS" ) ); 02271 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 02272 } 02273 02274 /* 02275 * The point is, we need to always read a full datagram at once, so we 02276 * sometimes read more then requested, and handle the additional data. 02277 * It could be the rest of the current record (while fetching the 02278 * header) and/or some other records in the same datagram. 02279 */ 02280 02281 /* 02282 * Move to the next record in the already read datagram if applicable 02283 */ 02284 if( ssl->next_record_offset != 0 ) 02285 { 02286 if( ssl->in_left < ssl->next_record_offset ) 02287 { 02288 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 02289 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 02290 } 02291 02292 ssl->in_left -= ssl->next_record_offset; 02293 02294 if( ssl->in_left != 0 ) 02295 { 02296 MBEDTLS_SSL_DEBUG_MSG( 2, ( "next record in same datagram, offset: %d", 02297 ssl->next_record_offset ) ); 02298 memmove( ssl->in_hdr, 02299 ssl->in_hdr + ssl->next_record_offset, 02300 ssl->in_left ); 02301 } 02302 02303 ssl->next_record_offset = 0; 02304 } 02305 02306 MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d", 02307 ssl->in_left, nb_want ) ); 02308 02309 /* 02310 * Done if we already have enough data. 02311 */ 02312 if( nb_want <= ssl->in_left) 02313 { 02314 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= fetch input" ) ); 02315 return( 0 ); 02316 } 02317 02318 /* 02319 * A record can't be split accross datagrams. If we need to read but 02320 * are not at the beginning of a new record, the caller did something 02321 * wrong. 02322 */ 02323 if( ssl->in_left != 0 ) 02324 { 02325 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 02326 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 02327 } 02328 02329 /* 02330 * Don't even try to read if time's out already. 02331 * This avoids by-passing the timer when repeatedly receiving messages 02332 * that will end up being dropped. 02333 */ 02334 if( ssl_check_timer( ssl ) != 0 ) 02335 ret = MBEDTLS_ERR_SSL_TIMEOUT; 02336 else 02337 { 02338 len = MBEDTLS_SSL_BUFFER_LEN - ( ssl->in_hdr - ssl->in_buf ); 02339 02340 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) 02341 timeout = ssl->handshake->retransmit_timeout; 02342 else 02343 timeout = ssl->conf->read_timeout; 02344 02345 MBEDTLS_SSL_DEBUG_MSG( 3, ( "f_recv_timeout: %u ms", timeout ) ); 02346 02347 if( ssl->f_recv_timeout != NULL ) 02348 ret = ssl->f_recv_timeout( ssl->p_bio, ssl->in_hdr, len, 02349 timeout ); 02350 else 02351 ret = ssl->f_recv( ssl->p_bio, ssl->in_hdr, len ); 02352 02353 MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_recv(_timeout)", ret ); 02354 02355 if( ret == 0 ) 02356 return( MBEDTLS_ERR_SSL_CONN_EOF ); 02357 } 02358 02359 if( ret == MBEDTLS_ERR_SSL_TIMEOUT ) 02360 { 02361 MBEDTLS_SSL_DEBUG_MSG( 2, ( "timeout" ) ); 02362 ssl_set_timer( ssl, 0 ); 02363 02364 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) 02365 { 02366 if( ssl_double_retransmit_timeout( ssl ) != 0 ) 02367 { 02368 MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake timeout" ) ); 02369 return( MBEDTLS_ERR_SSL_TIMEOUT ); 02370 } 02371 02372 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 ) 02373 { 02374 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret ); 02375 return( ret ); 02376 } 02377 02378 return( MBEDTLS_ERR_SSL_WANT_READ ); 02379 } 02380 #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) 02381 else if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && 02382 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) 02383 { 02384 if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 ) 02385 { 02386 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_resend_hello_request", ret ); 02387 return( ret ); 02388 } 02389 02390 return( MBEDTLS_ERR_SSL_WANT_READ ); 02391 } 02392 #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ 02393 } 02394 02395 if( ret < 0 ) 02396 return( ret ); 02397 02398 ssl->in_left = ret; 02399 } 02400 else 02401 #endif 02402 { 02403 MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d", 02404 ssl->in_left, nb_want ) ); 02405 02406 while( ssl->in_left < nb_want ) 02407 { 02408 len = nb_want - ssl->in_left; 02409 02410 if( ssl_check_timer( ssl ) != 0 ) 02411 ret = MBEDTLS_ERR_SSL_TIMEOUT; 02412 else 02413 { 02414 if( ssl->f_recv_timeout != NULL ) 02415 { 02416 ret = ssl->f_recv_timeout( ssl->p_bio, 02417 ssl->in_hdr + ssl->in_left, len, 02418 ssl->conf->read_timeout ); 02419 } 02420 else 02421 { 02422 ret = ssl->f_recv( ssl->p_bio, 02423 ssl->in_hdr + ssl->in_left, len ); 02424 } 02425 } 02426 02427 MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d", 02428 ssl->in_left, nb_want ) ); 02429 MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_recv(_timeout)", ret ); 02430 02431 if( ret == 0 ) 02432 return( MBEDTLS_ERR_SSL_CONN_EOF ); 02433 02434 if( ret < 0 ) 02435 return( ret ); 02436 02437 ssl->in_left += ret; 02438 } 02439 } 02440 02441 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= fetch input" ) ); 02442 02443 return( 0 ); 02444 } 02445 02446 /* 02447 * Flush any data not yet written 02448 */ 02449 int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl ) 02450 { 02451 int ret; 02452 unsigned char *buf, i; 02453 02454 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> flush output" ) ); 02455 02456 if( ssl->f_send == NULL ) 02457 { 02458 MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() " 02459 "or mbedtls_ssl_set_bio()" ) ); 02460 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 02461 } 02462 02463 /* Avoid incrementing counter if data is flushed */ 02464 if( ssl->out_left == 0 ) 02465 { 02466 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= flush output" ) ); 02467 return( 0 ); 02468 } 02469 02470 while( ssl->out_left > 0 ) 02471 { 02472 MBEDTLS_SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d", 02473 mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen, ssl->out_left ) ); 02474 02475 buf = ssl->out_hdr + mbedtls_ssl_hdr_len( ssl ) + 02476 ssl->out_msglen - ssl->out_left; 02477 ret = ssl->f_send( ssl->p_bio, buf, ssl->out_left ); 02478 02479 MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_send", ret ); 02480 02481 if( ret <= 0 ) 02482 return( ret ); 02483 02484 ssl->out_left -= ret; 02485 } 02486 02487 for( i = 8; i > ssl_ep_len( ssl ); i-- ) 02488 if( ++ssl->out_ctr[i - 1] != 0 ) 02489 break; 02490 02491 /* The loop goes to its end iff the counter is wrapping */ 02492 if( i == ssl_ep_len( ssl ) ) 02493 { 02494 MBEDTLS_SSL_DEBUG_MSG( 1, ( "outgoing message counter would wrap" ) ); 02495 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); 02496 } 02497 02498 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= flush output" ) ); 02499 02500 return( 0 ); 02501 } 02502 02503 /* 02504 * Functions to handle the DTLS retransmission state machine 02505 */ 02506 #if defined(MBEDTLS_SSL_PROTO_DTLS) 02507 /* 02508 * Append current handshake message to current outgoing flight 02509 */ 02510 static int ssl_flight_append( mbedtls_ssl_context *ssl ) 02511 { 02512 mbedtls_ssl_flight_item *msg; 02513 02514 /* Allocate space for current message */ 02515 if( ( msg = mbedtls_calloc( 1, sizeof( mbedtls_ssl_flight_item ) ) ) == NULL ) 02516 { 02517 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc %d bytes failed", 02518 sizeof( mbedtls_ssl_flight_item ) ) ); 02519 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 02520 } 02521 02522 if( ( msg->p = mbedtls_calloc( 1, ssl->out_msglen ) ) == NULL ) 02523 { 02524 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc %d bytes failed", ssl->out_msglen ) ); 02525 mbedtls_free( msg ); 02526 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 02527 } 02528 02529 /* Copy current handshake message with headers */ 02530 memcpy( msg->p, ssl->out_msg, ssl->out_msglen ); 02531 msg->len = ssl->out_msglen; 02532 msg->type = ssl->out_msgtype; 02533 msg->next = NULL; 02534 02535 /* Append to the current flight */ 02536 if( ssl->handshake->flight == NULL ) 02537 ssl->handshake->flight = msg; 02538 else 02539 { 02540 mbedtls_ssl_flight_item *cur = ssl->handshake->flight; 02541 while( cur->next != NULL ) 02542 cur = cur->next; 02543 cur->next = msg; 02544 } 02545 02546 return( 0 ); 02547 } 02548 02549 /* 02550 * Free the current flight of handshake messages 02551 */ 02552 static void ssl_flight_free( mbedtls_ssl_flight_item *flight ) 02553 { 02554 mbedtls_ssl_flight_item *cur = flight; 02555 mbedtls_ssl_flight_item *next; 02556 02557 while( cur != NULL ) 02558 { 02559 next = cur->next; 02560 02561 mbedtls_free( cur->p ); 02562 mbedtls_free( cur ); 02563 02564 cur = next; 02565 } 02566 } 02567 02568 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) 02569 static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl ); 02570 #endif 02571 02572 /* 02573 * Swap transform_out and out_ctr with the alternative ones 02574 */ 02575 static void ssl_swap_epochs( mbedtls_ssl_context *ssl ) 02576 { 02577 mbedtls_ssl_transform *tmp_transform; 02578 unsigned char tmp_out_ctr[8]; 02579 02580 if( ssl->transform_out == ssl->handshake->alt_transform_out ) 02581 { 02582 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip swap epochs" ) ); 02583 return; 02584 } 02585 02586 MBEDTLS_SSL_DEBUG_MSG( 3, ( "swap epochs" ) ); 02587 02588 /* Swap transforms */ 02589 tmp_transform = ssl->transform_out; 02590 ssl->transform_out = ssl->handshake->alt_transform_out; 02591 ssl->handshake->alt_transform_out = tmp_transform; 02592 02593 /* Swap epoch + sequence_number */ 02594 memcpy( tmp_out_ctr, ssl->out_ctr, 8 ); 02595 memcpy( ssl->out_ctr, ssl->handshake->alt_out_ctr, 8 ); 02596 memcpy( ssl->handshake->alt_out_ctr, tmp_out_ctr, 8 ); 02597 02598 /* Adjust to the newly activated transform */ 02599 if( ssl->transform_out != NULL && 02600 ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) 02601 { 02602 ssl->out_msg = ssl->out_iv + ssl->transform_out->ivlen - 02603 ssl->transform_out->fixed_ivlen; 02604 } 02605 else 02606 ssl->out_msg = ssl->out_iv; 02607 02608 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) 02609 if( mbedtls_ssl_hw_record_activate != NULL ) 02610 { 02611 if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 ) 02612 { 02613 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret ); 02614 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); 02615 } 02616 } 02617 #endif 02618 } 02619 02620 /* 02621 * Retransmit the current flight of messages. 02622 * 02623 * Need to remember the current message in case flush_output returns 02624 * WANT_WRITE, causing us to exit this function and come back later. 02625 * This function must be called until state is no longer SENDING. 02626 */ 02627 int mbedtls_ssl_resend( mbedtls_ssl_context *ssl ) 02628 { 02629 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> mbedtls_ssl_resend" ) ); 02630 02631 if( ssl->handshake->retransmit_state != MBEDTLS_SSL_RETRANS_SENDING ) 02632 { 02633 MBEDTLS_SSL_DEBUG_MSG( 2, ( "initialise resending" ) ); 02634 02635 ssl->handshake->cur_msg = ssl->handshake->flight; 02636 ssl_swap_epochs( ssl ); 02637 02638 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_SENDING; 02639 } 02640 02641 while( ssl->handshake->cur_msg != NULL ) 02642 { 02643 int ret; 02644 mbedtls_ssl_flight_item *cur = ssl->handshake->cur_msg; 02645 02646 /* Swap epochs before sending Finished: we can't do it after 02647 * sending ChangeCipherSpec, in case write returns WANT_READ. 02648 * Must be done before copying, may change out_msg pointer */ 02649 if( cur->type == MBEDTLS_SSL_MSG_HANDSHAKE && 02650 cur->p[0] == MBEDTLS_SSL_HS_FINISHED ) 02651 { 02652 ssl_swap_epochs( ssl ); 02653 } 02654 02655 memcpy( ssl->out_msg, cur->p, cur->len ); 02656 ssl->out_msglen = cur->len; 02657 ssl->out_msgtype = cur->type; 02658 02659 ssl->handshake->cur_msg = cur->next; 02660 02661 MBEDTLS_SSL_DEBUG_BUF( 3, "resent handshake message header", ssl->out_msg, 12 ); 02662 02663 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 02664 { 02665 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 02666 return( ret ); 02667 } 02668 } 02669 02670 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) 02671 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; 02672 else 02673 { 02674 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; 02675 ssl_set_timer( ssl, ssl->handshake->retransmit_timeout ); 02676 } 02677 02678 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= mbedtls_ssl_resend" ) ); 02679 02680 return( 0 ); 02681 } 02682 02683 /* 02684 * To be called when the last message of an incoming flight is received. 02685 */ 02686 void mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl ) 02687 { 02688 /* We won't need to resend that one any more */ 02689 ssl_flight_free( ssl->handshake->flight ); 02690 ssl->handshake->flight = NULL; 02691 ssl->handshake->cur_msg = NULL; 02692 02693 /* The next incoming flight will start with this msg_seq */ 02694 ssl->handshake->in_flight_start_seq = ssl->handshake->in_msg_seq; 02695 02696 /* Cancel timer */ 02697 ssl_set_timer( ssl, 0 ); 02698 02699 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && 02700 ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED ) 02701 { 02702 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; 02703 } 02704 else 02705 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING; 02706 } 02707 02708 /* 02709 * To be called when the last message of an outgoing flight is send. 02710 */ 02711 void mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl ) 02712 { 02713 ssl_reset_retransmit_timeout( ssl ); 02714 ssl_set_timer( ssl, ssl->handshake->retransmit_timeout ); 02715 02716 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && 02717 ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED ) 02718 { 02719 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; 02720 } 02721 else 02722 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; 02723 } 02724 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 02725 02726 /* 02727 * Record layer functions 02728 */ 02729 02730 /* 02731 * Write current record. 02732 * Uses ssl->out_msgtype, ssl->out_msglen and bytes at ssl->out_msg. 02733 */ 02734 int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl ) 02735 { 02736 int ret, done = 0, out_msg_type; 02737 size_t len = ssl->out_msglen; 02738 02739 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write record" ) ); 02740 02741 #if defined(MBEDTLS_SSL_PROTO_DTLS) 02742 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 02743 ssl->handshake != NULL && 02744 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) 02745 { 02746 ; /* Skip special handshake treatment when resending */ 02747 } 02748 else 02749 #endif 02750 if( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) 02751 { 02752 out_msg_type = ssl->out_msg[0]; 02753 02754 if( out_msg_type != MBEDTLS_SSL_HS_HELLO_REQUEST && 02755 ssl->handshake == NULL ) 02756 { 02757 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 02758 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 02759 } 02760 02761 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 ); 02762 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 ); 02763 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) ); 02764 02765 /* 02766 * DTLS has additional fields in the Handshake layer, 02767 * between the length field and the actual payload: 02768 * uint16 message_seq; 02769 * uint24 fragment_offset; 02770 * uint24 fragment_length; 02771 */ 02772 #if defined(MBEDTLS_SSL_PROTO_DTLS) 02773 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 02774 { 02775 /* Make room for the additional DTLS fields */ 02776 if( MBEDTLS_SSL_MAX_CONTENT_LEN - ssl->out_msglen < 8 ) 02777 { 02778 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS handshake message too large: " 02779 "size %u, maximum %u", 02780 (unsigned) ( ssl->in_hslen - 4 ), 02781 (unsigned) ( MBEDTLS_SSL_MAX_CONTENT_LEN - 12 ) ) ); 02782 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 02783 } 02784 02785 memmove( ssl->out_msg + 12, ssl->out_msg + 4, len - 4 ); 02786 ssl->out_msglen += 8; 02787 len += 8; 02788 02789 /* Write message_seq and update it, except for HelloRequest */ 02790 if( out_msg_type != MBEDTLS_SSL_HS_HELLO_REQUEST ) 02791 { 02792 ssl->out_msg[4] = ( ssl->handshake->out_msg_seq >> 8 ) & 0xFF; 02793 ssl->out_msg[5] = ( ssl->handshake->out_msg_seq ) & 0xFF; 02794 ++( ssl->handshake->out_msg_seq ); 02795 } 02796 else 02797 { 02798 ssl->out_msg[4] = 0; 02799 ssl->out_msg[5] = 0; 02800 } 02801 02802 /* We don't fragment, so frag_offset = 0 and frag_len = len */ 02803 memset( ssl->out_msg + 6, 0x00, 3 ); 02804 memcpy( ssl->out_msg + 9, ssl->out_msg + 1, 3 ); 02805 } 02806 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 02807 02808 if( out_msg_type != MBEDTLS_SSL_HS_HELLO_REQUEST ) 02809 ssl->handshake->update_checksum( ssl, ssl->out_msg, len ); 02810 } 02811 02812 /* Save handshake and CCS messages for resending */ 02813 #if defined(MBEDTLS_SSL_PROTO_DTLS) 02814 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 02815 ssl->handshake != NULL && 02816 ssl->handshake->retransmit_state != MBEDTLS_SSL_RETRANS_SENDING && 02817 ( ssl->out_msgtype == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC || 02818 ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) ) 02819 { 02820 if( ( ret = ssl_flight_append( ssl ) ) != 0 ) 02821 { 02822 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_flight_append", ret ); 02823 return( ret ); 02824 } 02825 } 02826 #endif 02827 02828 #if defined(MBEDTLS_ZLIB_SUPPORT) 02829 if( ssl->transform_out != NULL && 02830 ssl->session_out->compression == MBEDTLS_SSL_COMPRESS_DEFLATE ) 02831 { 02832 if( ( ret = ssl_compress_buf( ssl ) ) != 0 ) 02833 { 02834 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_compress_buf", ret ); 02835 return( ret ); 02836 } 02837 02838 len = ssl->out_msglen; 02839 } 02840 #endif /*MBEDTLS_ZLIB_SUPPORT */ 02841 02842 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) 02843 if( mbedtls_ssl_hw_record_write != NULL ) 02844 { 02845 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_write()" ) ); 02846 02847 ret = mbedtls_ssl_hw_record_write( ssl ); 02848 if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH ) 02849 { 02850 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_write", ret ); 02851 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); 02852 } 02853 02854 if( ret == 0 ) 02855 done = 1; 02856 } 02857 #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ 02858 if( !done ) 02859 { 02860 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype; 02861 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, 02862 ssl->conf->transport, ssl->out_hdr + 1 ); 02863 02864 ssl->out_len[0] = (unsigned char)( len >> 8 ); 02865 ssl->out_len[1] = (unsigned char)( len ); 02866 02867 if( ssl->transform_out != NULL ) 02868 { 02869 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 ) 02870 { 02871 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret ); 02872 return( ret ); 02873 } 02874 02875 len = ssl->out_msglen; 02876 ssl->out_len[0] = (unsigned char)( len >> 8 ); 02877 ssl->out_len[1] = (unsigned char)( len ); 02878 } 02879 02880 ssl->out_left = mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen; 02881 02882 MBEDTLS_SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, " 02883 "version = [%d:%d], msglen = %d", 02884 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2], 02885 ( ssl->out_len[0] << 8 ) | ssl->out_len[1] ) ); 02886 02887 MBEDTLS_SSL_DEBUG_BUF( 4, "output record sent to network", 02888 ssl->out_hdr, mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen ); 02889 } 02890 02891 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) 02892 { 02893 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flush_output", ret ); 02894 return( ret ); 02895 } 02896 02897 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write record" ) ); 02898 02899 return( 0 ); 02900 } 02901 02902 #if defined(MBEDTLS_SSL_PROTO_DTLS) 02903 /* 02904 * Mark bits in bitmask (used for DTLS HS reassembly) 02905 */ 02906 static void ssl_bitmask_set( unsigned char *mask, size_t offset, size_t len ) 02907 { 02908 unsigned int start_bits, end_bits; 02909 02910 start_bits = 8 - ( offset % 8 ); 02911 if( start_bits != 8 ) 02912 { 02913 size_t first_byte_idx = offset / 8; 02914 02915 /* Special case */ 02916 if( len <= start_bits ) 02917 { 02918 for( ; len != 0; len-- ) 02919 mask[first_byte_idx] |= 1 << ( start_bits - len ); 02920 02921 /* Avoid potential issues with offset or len becoming invalid */ 02922 return; 02923 } 02924 02925 offset += start_bits; /* Now offset % 8 == 0 */ 02926 len -= start_bits; 02927 02928 for( ; start_bits != 0; start_bits-- ) 02929 mask[first_byte_idx] |= 1 << ( start_bits - 1 ); 02930 } 02931 02932 end_bits = len % 8; 02933 if( end_bits != 0 ) 02934 { 02935 size_t last_byte_idx = ( offset + len ) / 8; 02936 02937 len -= end_bits; /* Now len % 8 == 0 */ 02938 02939 for( ; end_bits != 0; end_bits-- ) 02940 mask[last_byte_idx] |= 1 << ( 8 - end_bits ); 02941 } 02942 02943 memset( mask + offset / 8, 0xFF, len / 8 ); 02944 } 02945 02946 /* 02947 * Check that bitmask is full 02948 */ 02949 static int ssl_bitmask_check( unsigned char *mask, size_t len ) 02950 { 02951 size_t i; 02952 02953 for( i = 0; i < len / 8; i++ ) 02954 if( mask[i] != 0xFF ) 02955 return( -1 ); 02956 02957 for( i = 0; i < len % 8; i++ ) 02958 if( ( mask[len / 8] & ( 1 << ( 7 - i ) ) ) == 0 ) 02959 return( -1 ); 02960 02961 return( 0 ); 02962 } 02963 02964 /* 02965 * Reassemble fragmented DTLS handshake messages. 02966 * 02967 * Use a temporary buffer for reassembly, divided in two parts: 02968 * - the first holds the reassembled message (including handshake header), 02969 * - the second holds a bitmask indicating which parts of the message 02970 * (excluding headers) have been received so far. 02971 */ 02972 static int ssl_reassemble_dtls_handshake( mbedtls_ssl_context *ssl ) 02973 { 02974 unsigned char *msg, *bitmask; 02975 size_t frag_len, frag_off; 02976 size_t msg_len = ssl->in_hslen - 12; /* Without headers */ 02977 02978 if( ssl->handshake == NULL ) 02979 { 02980 MBEDTLS_SSL_DEBUG_MSG( 1, ( "not supported outside handshake (for now)" ) ); 02981 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); 02982 } 02983 02984 /* 02985 * For first fragment, check size and allocate buffer 02986 */ 02987 if( ssl->handshake->hs_msg == NULL ) 02988 { 02989 size_t alloc_len; 02990 02991 MBEDTLS_SSL_DEBUG_MSG( 2, ( "initialize reassembly, total length = %d", 02992 msg_len ) ); 02993 02994 if( ssl->in_hslen > MBEDTLS_SSL_MAX_CONTENT_LEN ) 02995 { 02996 MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake message too large" ) ); 02997 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); 02998 } 02999 03000 /* The bitmask needs one bit per byte of message excluding header */ 03001 alloc_len = 12 + msg_len + msg_len / 8 + ( msg_len % 8 != 0 ); 03002 03003 ssl->handshake->hs_msg = mbedtls_calloc( 1, alloc_len ); 03004 if( ssl->handshake->hs_msg == NULL ) 03005 { 03006 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", alloc_len ) ); 03007 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 03008 } 03009 03010 /* Prepare final header: copy msg_type, length and message_seq, 03011 * then add standardised fragment_offset and fragment_length */ 03012 memcpy( ssl->handshake->hs_msg, ssl->in_msg, 6 ); 03013 memset( ssl->handshake->hs_msg + 6, 0, 3 ); 03014 memcpy( ssl->handshake->hs_msg + 9, 03015 ssl->handshake->hs_msg + 1, 3 ); 03016 } 03017 else 03018 { 03019 /* Make sure msg_type and length are consistent */ 03020 if( memcmp( ssl->handshake->hs_msg, ssl->in_msg, 4 ) != 0 ) 03021 { 03022 MBEDTLS_SSL_DEBUG_MSG( 1, ( "fragment header mismatch" ) ); 03023 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03024 } 03025 } 03026 03027 msg = ssl->handshake->hs_msg + 12; 03028 bitmask = msg + msg_len; 03029 03030 /* 03031 * Check and copy current fragment 03032 */ 03033 frag_off = ( ssl->in_msg[6] << 16 ) | 03034 ( ssl->in_msg[7] << 8 ) | 03035 ssl->in_msg[8]; 03036 frag_len = ( ssl->in_msg[9] << 16 ) | 03037 ( ssl->in_msg[10] << 8 ) | 03038 ssl->in_msg[11]; 03039 03040 if( frag_off + frag_len > msg_len ) 03041 { 03042 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid fragment offset/len: %d + %d > %d", 03043 frag_off, frag_len, msg_len ) ); 03044 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03045 } 03046 03047 if( frag_len + 12 > ssl->in_msglen ) 03048 { 03049 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid fragment length: %d + 12 > %d", 03050 frag_len, ssl->in_msglen ) ); 03051 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03052 } 03053 03054 MBEDTLS_SSL_DEBUG_MSG( 2, ( "adding fragment, offset = %d, length = %d", 03055 frag_off, frag_len ) ); 03056 03057 memcpy( msg + frag_off, ssl->in_msg + 12, frag_len ); 03058 ssl_bitmask_set( bitmask, frag_off, frag_len ); 03059 03060 /* 03061 * Do we have the complete message by now? 03062 * If yes, finalize it, else ask to read the next record. 03063 */ 03064 if( ssl_bitmask_check( bitmask, msg_len ) != 0 ) 03065 { 03066 MBEDTLS_SSL_DEBUG_MSG( 2, ( "message is not complete yet" ) ); 03067 return( MBEDTLS_ERR_SSL_WANT_READ ); 03068 } 03069 03070 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake message completed" ) ); 03071 03072 if( frag_len + 12 < ssl->in_msglen ) 03073 { 03074 /* 03075 * We'got more handshake messages in the same record. 03076 * This case is not handled now because no know implementation does 03077 * that and it's hard to test, so we prefer to fail cleanly for now. 03078 */ 03079 MBEDTLS_SSL_DEBUG_MSG( 1, ( "last fragment not alone in its record" ) ); 03080 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); 03081 } 03082 03083 if( ssl->in_left > ssl->next_record_offset ) 03084 { 03085 /* 03086 * We've got more data in the buffer after the current record, 03087 * that we don't want to overwrite. Move it before writing the 03088 * reassembled message, and adjust in_left and next_record_offset. 03089 */ 03090 unsigned char *cur_remain = ssl->in_hdr + ssl->next_record_offset; 03091 unsigned char *new_remain = ssl->in_msg + ssl->in_hslen; 03092 size_t remain_len = ssl->in_left - ssl->next_record_offset; 03093 03094 /* First compute and check new lengths */ 03095 ssl->next_record_offset = new_remain - ssl->in_hdr; 03096 ssl->in_left = ssl->next_record_offset + remain_len; 03097 03098 if( ssl->in_left > MBEDTLS_SSL_BUFFER_LEN - 03099 (size_t)( ssl->in_hdr - ssl->in_buf ) ) 03100 { 03101 MBEDTLS_SSL_DEBUG_MSG( 1, ( "reassembled message too large for buffer" ) ); 03102 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); 03103 } 03104 03105 memmove( new_remain, cur_remain, remain_len ); 03106 } 03107 03108 memcpy( ssl->in_msg, ssl->handshake->hs_msg, ssl->in_hslen ); 03109 03110 mbedtls_free( ssl->handshake->hs_msg ); 03111 ssl->handshake->hs_msg = NULL; 03112 03113 MBEDTLS_SSL_DEBUG_BUF( 3, "reassembled handshake message", 03114 ssl->in_msg, ssl->in_hslen ); 03115 03116 return( 0 ); 03117 } 03118 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 03119 03120 int mbedtls_ssl_prepare_handshake_record( mbedtls_ssl_context *ssl ) 03121 { 03122 if( ssl->in_msglen < mbedtls_ssl_hs_hdr_len( ssl ) ) 03123 { 03124 MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake message too short: %d", 03125 ssl->in_msglen ) ); 03126 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03127 } 03128 03129 ssl->in_hslen = mbedtls_ssl_hs_hdr_len( ssl ) + ( 03130 ( ssl->in_msg[1] << 16 ) | 03131 ( ssl->in_msg[2] << 8 ) | 03132 ssl->in_msg[3] ); 03133 03134 MBEDTLS_SSL_DEBUG_MSG( 3, ( "handshake message: msglen =" 03135 " %d, type = %d, hslen = %d", 03136 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) ); 03137 03138 #if defined(MBEDTLS_SSL_PROTO_DTLS) 03139 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 03140 { 03141 int ret; 03142 unsigned int recv_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5]; 03143 03144 /* ssl->handshake is NULL when receiving ClientHello for renego */ 03145 if( ssl->handshake != NULL && 03146 recv_msg_seq != ssl->handshake->in_msg_seq ) 03147 { 03148 /* Retransmit only on last message from previous flight, to avoid 03149 * too many retransmissions. 03150 * Besides, No sane server ever retransmits HelloVerifyRequest */ 03151 if( recv_msg_seq == ssl->handshake->in_flight_start_seq - 1 && 03152 ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST ) 03153 { 03154 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received message from last flight, " 03155 "message_seq = %d, start_of_flight = %d", 03156 recv_msg_seq, 03157 ssl->handshake->in_flight_start_seq ) ); 03158 03159 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 ) 03160 { 03161 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret ); 03162 return( ret ); 03163 } 03164 } 03165 else 03166 { 03167 MBEDTLS_SSL_DEBUG_MSG( 2, ( "dropping out-of-sequence message: " 03168 "message_seq = %d, expected = %d", 03169 recv_msg_seq, 03170 ssl->handshake->in_msg_seq ) ); 03171 } 03172 03173 return( MBEDTLS_ERR_SSL_WANT_READ ); 03174 } 03175 /* Wait until message completion to increment in_msg_seq */ 03176 03177 /* Reassemble if current message is fragmented or reassembly is 03178 * already in progress */ 03179 if( ssl->in_msglen < ssl->in_hslen || 03180 memcmp( ssl->in_msg + 6, "\0\0\0", 3 ) != 0 || 03181 memcmp( ssl->in_msg + 9, ssl->in_msg + 1, 3 ) != 0 || 03182 ( ssl->handshake != NULL && ssl->handshake->hs_msg != NULL ) ) 03183 { 03184 MBEDTLS_SSL_DEBUG_MSG( 2, ( "found fragmented DTLS handshake message" ) ); 03185 03186 if( ( ret = ssl_reassemble_dtls_handshake( ssl ) ) != 0 ) 03187 { 03188 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_reassemble_dtls_handshake", ret ); 03189 return( ret ); 03190 } 03191 } 03192 } 03193 else 03194 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 03195 /* With TLS we don't handle fragmentation (for now) */ 03196 if( ssl->in_msglen < ssl->in_hslen ) 03197 { 03198 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLS handshake fragmentation not supported" ) ); 03199 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); 03200 } 03201 03202 return( 0 ); 03203 } 03204 03205 void mbedtls_ssl_update_handshake_status( mbedtls_ssl_context *ssl ) 03206 { 03207 03208 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER && 03209 ssl->handshake != NULL ) 03210 { 03211 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen ); 03212 } 03213 03214 /* Handshake message is complete, increment counter */ 03215 #if defined(MBEDTLS_SSL_PROTO_DTLS) 03216 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 03217 ssl->handshake != NULL ) 03218 { 03219 ssl->handshake->in_msg_seq++; 03220 } 03221 #endif 03222 } 03223 03224 /* 03225 * DTLS anti-replay: RFC 6347 4.1.2.6 03226 * 03227 * in_window is a field of bits numbered from 0 (lsb) to 63 (msb). 03228 * Bit n is set iff record number in_window_top - n has been seen. 03229 * 03230 * Usually, in_window_top is the last record number seen and the lsb of 03231 * in_window is set. The only exception is the initial state (record number 0 03232 * not seen yet). 03233 */ 03234 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) 03235 static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl ) 03236 { 03237 ssl->in_window_top = 0; 03238 ssl->in_window = 0; 03239 } 03240 03241 static inline uint64_t ssl_load_six_bytes( unsigned char *buf ) 03242 { 03243 return( ( (uint64_t) buf[0] << 40 ) | 03244 ( (uint64_t) buf[1] << 32 ) | 03245 ( (uint64_t) buf[2] << 24 ) | 03246 ( (uint64_t) buf[3] << 16 ) | 03247 ( (uint64_t) buf[4] << 8 ) | 03248 ( (uint64_t) buf[5] ) ); 03249 } 03250 03251 /* 03252 * Return 0 if sequence number is acceptable, -1 otherwise 03253 */ 03254 int mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl ) 03255 { 03256 uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 ); 03257 uint64_t bit; 03258 03259 if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED ) 03260 return( 0 ); 03261 03262 if( rec_seqnum > ssl->in_window_top ) 03263 return( 0 ); 03264 03265 bit = ssl->in_window_top - rec_seqnum; 03266 03267 if( bit >= 64 ) 03268 return( -1 ); 03269 03270 if( ( ssl->in_window & ( (uint64_t) 1 << bit ) ) != 0 ) 03271 return( -1 ); 03272 03273 return( 0 ); 03274 } 03275 03276 /* 03277 * Update replay window on new validated record 03278 */ 03279 void mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl ) 03280 { 03281 uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 ); 03282 03283 if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED ) 03284 return; 03285 03286 if( rec_seqnum > ssl->in_window_top ) 03287 { 03288 /* Update window_top and the contents of the window */ 03289 uint64_t shift = rec_seqnum - ssl->in_window_top; 03290 03291 if( shift >= 64 ) 03292 ssl->in_window = 1; 03293 else 03294 { 03295 ssl->in_window <<= shift; 03296 ssl->in_window |= 1; 03297 } 03298 03299 ssl->in_window_top = rec_seqnum; 03300 } 03301 else 03302 { 03303 /* Mark that number as seen in the current window */ 03304 uint64_t bit = ssl->in_window_top - rec_seqnum; 03305 03306 if( bit < 64 ) /* Always true, but be extra sure */ 03307 ssl->in_window |= (uint64_t) 1 << bit; 03308 } 03309 } 03310 #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ 03311 03312 #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) 03313 /* Forward declaration */ 03314 static int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial ); 03315 03316 /* 03317 * Without any SSL context, check if a datagram looks like a ClientHello with 03318 * a valid cookie, and if it doesn't, generate a HelloVerifyRequest message. 03319 * Both input and output include full DTLS headers. 03320 * 03321 * - if cookie is valid, return 0 03322 * - if ClientHello looks superficially valid but cookie is not, 03323 * fill obuf and set olen, then 03324 * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED 03325 * - otherwise return a specific error code 03326 */ 03327 static int ssl_check_dtls_clihlo_cookie( 03328 mbedtls_ssl_cookie_write_t *f_cookie_write, 03329 mbedtls_ssl_cookie_check_t *f_cookie_check, 03330 void *p_cookie, 03331 const unsigned char *cli_id, size_t cli_id_len, 03332 const unsigned char *in, size_t in_len, 03333 unsigned char *obuf, size_t buf_len, size_t *olen ) 03334 { 03335 size_t sid_len, cookie_len; 03336 unsigned char *p; 03337 03338 if( f_cookie_write == NULL || f_cookie_check == NULL ) 03339 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 03340 03341 /* 03342 * Structure of ClientHello with record and handshake headers, 03343 * and expected values. We don't need to check a lot, more checks will be 03344 * done when actually parsing the ClientHello - skipping those checks 03345 * avoids code duplication and does not make cookie forging any easier. 03346 * 03347 * 0-0 ContentType type; copied, must be handshake 03348 * 1-2 ProtocolVersion version; copied 03349 * 3-4 uint16 epoch; copied, must be 0 03350 * 5-10 uint48 sequence_number; copied 03351 * 11-12 uint16 length; (ignored) 03352 * 03353 * 13-13 HandshakeType msg_type; (ignored) 03354 * 14-16 uint24 length; (ignored) 03355 * 17-18 uint16 message_seq; copied 03356 * 19-21 uint24 fragment_offset; copied, must be 0 03357 * 22-24 uint24 fragment_length; (ignored) 03358 * 03359 * 25-26 ProtocolVersion client_version; (ignored) 03360 * 27-58 Random random; (ignored) 03361 * 59-xx SessionID session_id; 1 byte len + sid_len content 03362 * 60+ opaque cookie<0..2^8-1>; 1 byte len + content 03363 * ... 03364 * 03365 * Minimum length is 61 bytes. 03366 */ 03367 if( in_len < 61 || 03368 in[0] != MBEDTLS_SSL_MSG_HANDSHAKE || 03369 in[3] != 0 || in[4] != 0 || 03370 in[19] != 0 || in[20] != 0 || in[21] != 0 ) 03371 { 03372 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 03373 } 03374 03375 sid_len = in[59]; 03376 if( sid_len > in_len - 61 ) 03377 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 03378 03379 cookie_len = in[60 + sid_len]; 03380 if( cookie_len > in_len - 60 ) 03381 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 03382 03383 if( f_cookie_check( p_cookie, in + sid_len + 61, cookie_len, 03384 cli_id, cli_id_len ) == 0 ) 03385 { 03386 /* Valid cookie */ 03387 return( 0 ); 03388 } 03389 03390 /* 03391 * If we get here, we've got an invalid cookie, let's prepare HVR. 03392 * 03393 * 0-0 ContentType type; copied 03394 * 1-2 ProtocolVersion version; copied 03395 * 3-4 uint16 epoch; copied 03396 * 5-10 uint48 sequence_number; copied 03397 * 11-12 uint16 length; olen - 13 03398 * 03399 * 13-13 HandshakeType msg_type; hello_verify_request 03400 * 14-16 uint24 length; olen - 25 03401 * 17-18 uint16 message_seq; copied 03402 * 19-21 uint24 fragment_offset; copied 03403 * 22-24 uint24 fragment_length; olen - 25 03404 * 03405 * 25-26 ProtocolVersion server_version; 0xfe 0xff 03406 * 27-27 opaque cookie<0..2^8-1>; cookie_len = olen - 27, cookie 03407 * 03408 * Minimum length is 28. 03409 */ 03410 if( buf_len < 28 ) 03411 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); 03412 03413 /* Copy most fields and adapt others */ 03414 memcpy( obuf, in, 25 ); 03415 obuf[13] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST; 03416 obuf[25] = 0xfe; 03417 obuf[26] = 0xff; 03418 03419 /* Generate and write actual cookie */ 03420 p = obuf + 28; 03421 if( f_cookie_write( p_cookie, 03422 &p, obuf + buf_len, cli_id, cli_id_len ) != 0 ) 03423 { 03424 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 03425 } 03426 03427 *olen = p - obuf; 03428 03429 /* Go back and fill length fields */ 03430 obuf[27] = (unsigned char)( *olen - 28 ); 03431 03432 obuf[14] = obuf[22] = (unsigned char)( ( *olen - 25 ) >> 16 ); 03433 obuf[15] = obuf[23] = (unsigned char)( ( *olen - 25 ) >> 8 ); 03434 obuf[16] = obuf[24] = (unsigned char)( ( *olen - 25 ) ); 03435 03436 obuf[11] = (unsigned char)( ( *olen - 13 ) >> 8 ); 03437 obuf[12] = (unsigned char)( ( *olen - 13 ) ); 03438 03439 return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ); 03440 } 03441 03442 /* 03443 * Handle possible client reconnect with the same UDP quadruplet 03444 * (RFC 6347 Section 4.2.8). 03445 * 03446 * Called by ssl_parse_record_header() in case we receive an epoch 0 record 03447 * that looks like a ClientHello. 03448 * 03449 * - if the input looks like a ClientHello without cookies, 03450 * send back HelloVerifyRequest, then 03451 * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED 03452 * - if the input looks like a ClientHello with a valid cookie, 03453 * reset the session of the current context, and 03454 * return MBEDTLS_ERR_SSL_CLIENT_RECONNECT 03455 * - if anything goes wrong, return a specific error code 03456 * 03457 * mbedtls_ssl_read_record() will ignore the record if anything else than 03458 * MBEDTLS_ERR_SSL_CLIENT_RECONNECT or 0 is returned, although this function 03459 * cannot not return 0. 03460 */ 03461 static int ssl_handle_possible_reconnect( mbedtls_ssl_context *ssl ) 03462 { 03463 int ret; 03464 size_t len; 03465 03466 ret = ssl_check_dtls_clihlo_cookie( 03467 ssl->conf->f_cookie_write, 03468 ssl->conf->f_cookie_check, 03469 ssl->conf->p_cookie, 03470 ssl->cli_id, ssl->cli_id_len, 03471 ssl->in_buf, ssl->in_left, 03472 ssl->out_buf, MBEDTLS_SSL_MAX_CONTENT_LEN, &len ); 03473 03474 MBEDTLS_SSL_DEBUG_RET( 2, "ssl_check_dtls_clihlo_cookie", ret ); 03475 03476 if( ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ) 03477 { 03478 /* Don't check write errors as we can't do anything here. 03479 * If the error is permanent we'll catch it later, 03480 * if it's not, then hopefully it'll work next time. */ 03481 (void) ssl->f_send( ssl->p_bio, ssl->out_buf, len ); 03482 03483 return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ); 03484 } 03485 03486 if( ret == 0 ) 03487 { 03488 /* Got a valid cookie, partially reset context */ 03489 if( ( ret = ssl_session_reset_int( ssl, 1 ) ) != 0 ) 03490 { 03491 MBEDTLS_SSL_DEBUG_RET( 1, "reset", ret ); 03492 return( ret ); 03493 } 03494 03495 return( MBEDTLS_ERR_SSL_CLIENT_RECONNECT ); 03496 } 03497 03498 return( ret ); 03499 } 03500 #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ 03501 03502 /* 03503 * ContentType type; 03504 * ProtocolVersion version; 03505 * uint16 epoch; // DTLS only 03506 * uint48 sequence_number; // DTLS only 03507 * uint16 length; 03508 * 03509 * Return 0 if header looks sane (and, for DTLS, the record is expected) 03510 * MBEDTLS_ERR_SSL_INVALID_RECORD if the header looks bad, 03511 * MBEDTLS_ERR_SSL_UNEXPECTED_RECORD (DTLS only) if sane but unexpected. 03512 * 03513 * With DTLS, mbedtls_ssl_read_record() will: 03514 * 1. proceed with the record if this function returns 0 03515 * 2. drop only the current record if this function returns UNEXPECTED_RECORD 03516 * 3. return CLIENT_RECONNECT if this function return that value 03517 * 4. drop the whole datagram if this function returns anything else. 03518 * Point 2 is needed when the peer is resending, and we have already received 03519 * the first record from a datagram but are still waiting for the others. 03520 */ 03521 static int ssl_parse_record_header( mbedtls_ssl_context *ssl ) 03522 { 03523 int major_ver, minor_ver; 03524 03525 MBEDTLS_SSL_DEBUG_BUF( 4, "input record header", ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) ); 03526 03527 ssl->in_msgtype = ssl->in_hdr[0]; 03528 ssl->in_msglen = ( ssl->in_len[0] << 8 ) | ssl->in_len[1]; 03529 mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, ssl->in_hdr + 1 ); 03530 03531 MBEDTLS_SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, " 03532 "version = [%d:%d], msglen = %d", 03533 ssl->in_msgtype, 03534 major_ver, minor_ver, ssl->in_msglen ) ); 03535 03536 /* Check record type */ 03537 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE && 03538 ssl->in_msgtype != MBEDTLS_SSL_MSG_ALERT && 03539 ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC && 03540 ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA ) 03541 { 03542 MBEDTLS_SSL_DEBUG_MSG( 1, ( "unknown record type" ) ); 03543 03544 #if defined(MBEDTLS_SSL_PROTO_DTLS) 03545 /* Silently ignore invalid DTLS records as recommended by RFC 6347 03546 * Section 4.1.2.7 */ 03547 if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 03548 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 03549 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 03550 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); 03551 03552 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03553 } 03554 03555 /* Check version */ 03556 if( major_ver != ssl->major_ver ) 03557 { 03558 MBEDTLS_SSL_DEBUG_MSG( 1, ( "major version mismatch" ) ); 03559 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03560 } 03561 03562 if( minor_ver > ssl->conf->max_minor_ver ) 03563 { 03564 MBEDTLS_SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) ); 03565 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03566 } 03567 03568 /* Check length against the size of our buffer */ 03569 if( ssl->in_msglen > MBEDTLS_SSL_BUFFER_LEN 03570 - (size_t)( ssl->in_msg - ssl->in_buf ) ) 03571 { 03572 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); 03573 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03574 } 03575 03576 /* Check length against bounds of the current transform and version */ 03577 if( ssl->transform_in == NULL ) 03578 { 03579 if( ssl->in_msglen < 1 || 03580 ssl->in_msglen > MBEDTLS_SSL_MAX_CONTENT_LEN ) 03581 { 03582 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); 03583 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03584 } 03585 } 03586 else 03587 { 03588 if( ssl->in_msglen < ssl->transform_in->minlen ) 03589 { 03590 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); 03591 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03592 } 03593 03594 #if defined(MBEDTLS_SSL_PROTO_SSL3) 03595 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 && 03596 ssl->in_msglen > ssl->transform_in->minlen + MBEDTLS_SSL_MAX_CONTENT_LEN ) 03597 { 03598 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); 03599 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03600 } 03601 #endif 03602 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ 03603 defined(MBEDTLS_SSL_PROTO_TLS1_2) 03604 /* 03605 * TLS encrypted messages can have up to 256 bytes of padding 03606 */ 03607 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 && 03608 ssl->in_msglen > ssl->transform_in->minlen + 03609 MBEDTLS_SSL_MAX_CONTENT_LEN + 256 ) 03610 { 03611 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); 03612 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03613 } 03614 #endif 03615 } 03616 03617 /* 03618 * DTLS-related tests done last, because most of them may result in 03619 * silently dropping the record (but not the whole datagram), and we only 03620 * want to consider that after ensuring that the "basic" fields (type, 03621 * version, length) are sane. 03622 */ 03623 #if defined(MBEDTLS_SSL_PROTO_DTLS) 03624 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 03625 { 03626 unsigned int rec_epoch = ( ssl->in_ctr[0] << 8 ) | ssl->in_ctr[1]; 03627 03628 /* Drop unexpected ChangeCipherSpec messages */ 03629 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC && 03630 ssl->state != MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC && 03631 ssl->state != MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC ) 03632 { 03633 MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping unexpected ChangeCipherSpec" ) ); 03634 return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); 03635 } 03636 03637 /* Drop unexpected ApplicationData records, 03638 * except at the beginning of renegotiations */ 03639 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA && 03640 ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER 03641 #if defined(MBEDTLS_SSL_RENEGOTIATION) 03642 && ! ( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && 03643 ssl->state == MBEDTLS_SSL_SERVER_HELLO ) 03644 #endif 03645 ) 03646 { 03647 MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping unexpected ApplicationData" ) ); 03648 return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); 03649 } 03650 03651 /* Check epoch (and sequence number) with DTLS */ 03652 if( rec_epoch != ssl->in_epoch ) 03653 { 03654 MBEDTLS_SSL_DEBUG_MSG( 1, ( "record from another epoch: " 03655 "expected %d, received %d", 03656 ssl->in_epoch, rec_epoch ) ); 03657 03658 #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) 03659 /* 03660 * Check for an epoch 0 ClientHello. We can't use in_msg here to 03661 * access the first byte of record content (handshake type), as we 03662 * have an active transform (possibly iv_len != 0), so use the 03663 * fact that the record header len is 13 instead. 03664 */ 03665 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && 03666 ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER && 03667 rec_epoch == 0 && 03668 ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && 03669 ssl->in_left > 13 && 03670 ssl->in_buf[13] == MBEDTLS_SSL_HS_CLIENT_HELLO ) 03671 { 03672 MBEDTLS_SSL_DEBUG_MSG( 1, ( "possible client reconnect " 03673 "from the same port" ) ); 03674 return( ssl_handle_possible_reconnect( ssl ) ); 03675 } 03676 else 03677 #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ 03678 return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); 03679 } 03680 03681 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) 03682 /* Replay detection only works for the current epoch */ 03683 if( rec_epoch == ssl->in_epoch && 03684 mbedtls_ssl_dtls_replay_check( ssl ) != 0 ) 03685 { 03686 MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record" ) ); 03687 return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); 03688 } 03689 #endif 03690 } 03691 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 03692 03693 return( 0 ); 03694 } 03695 03696 /* 03697 * If applicable, decrypt (and decompress) record content 03698 */ 03699 static int ssl_prepare_record_content( mbedtls_ssl_context *ssl ) 03700 { 03701 int ret, done = 0; 03702 03703 MBEDTLS_SSL_DEBUG_BUF( 4, "input record from network", 03704 ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen ); 03705 03706 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) 03707 if( mbedtls_ssl_hw_record_read != NULL ) 03708 { 03709 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_read()" ) ); 03710 03711 ret = mbedtls_ssl_hw_record_read( ssl ); 03712 if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH ) 03713 { 03714 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_read", ret ); 03715 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); 03716 } 03717 03718 if( ret == 0 ) 03719 done = 1; 03720 } 03721 #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ 03722 if( !done && ssl->transform_in != NULL ) 03723 { 03724 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 ) 03725 { 03726 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret ); 03727 return( ret ); 03728 } 03729 03730 MBEDTLS_SSL_DEBUG_BUF( 4, "input payload after decrypt", 03731 ssl->in_msg, ssl->in_msglen ); 03732 03733 if( ssl->in_msglen > MBEDTLS_SSL_MAX_CONTENT_LEN ) 03734 { 03735 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); 03736 return( MBEDTLS_ERR_SSL_INVALID_RECORD ); 03737 } 03738 } 03739 03740 #if defined(MBEDTLS_ZLIB_SUPPORT) 03741 if( ssl->transform_in != NULL && 03742 ssl->session_in->compression == MBEDTLS_SSL_COMPRESS_DEFLATE ) 03743 { 03744 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 ) 03745 { 03746 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret ); 03747 return( ret ); 03748 } 03749 } 03750 #endif /* MBEDTLS_ZLIB_SUPPORT */ 03751 03752 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) 03753 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 03754 { 03755 mbedtls_ssl_dtls_replay_update( ssl ); 03756 } 03757 #endif 03758 03759 return( 0 ); 03760 } 03761 03762 static void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl ); 03763 03764 /* 03765 * Read a record. 03766 * 03767 * Silently ignore non-fatal alert (and for DTLS, invalid records as well, 03768 * RFC 6347 4.1.2.7) and continue reading until a valid record is found. 03769 * 03770 */ 03771 int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl ) 03772 { 03773 int ret; 03774 03775 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> read record" ) ); 03776 03777 if( ssl->keep_current_message == 0 ) 03778 { 03779 do { 03780 03781 if( ( ret = mbedtls_ssl_read_record_layer( ssl ) ) != 0 ) 03782 { 03783 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_read_record_layer" ), ret ); 03784 return( ret ); 03785 } 03786 03787 ret = mbedtls_ssl_handle_message_type( ssl ); 03788 03789 } while( MBEDTLS_ERR_SSL_NON_FATAL == ret ); 03790 03791 if( 0 != ret ) 03792 { 03793 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_read_record_layer" ), ret ); 03794 return( ret ); 03795 } 03796 03797 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) 03798 { 03799 mbedtls_ssl_update_handshake_status( ssl ); 03800 } 03801 } 03802 else 03803 { 03804 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= reuse previously read message" ) ); 03805 ssl->keep_current_message = 0; 03806 } 03807 03808 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= read record" ) ); 03809 03810 return( 0 ); 03811 } 03812 03813 int mbedtls_ssl_read_record_layer( mbedtls_ssl_context *ssl ) 03814 { 03815 int ret; 03816 03817 /* 03818 * Step A 03819 * 03820 * Consume last content-layer message and potentially 03821 * update in_msglen which keeps track of the contents' 03822 * consumption state. 03823 * 03824 * (1) Handshake messages: 03825 * Remove last handshake message, move content 03826 * and adapt in_msglen. 03827 * 03828 * (2) Alert messages: 03829 * Consume whole record content, in_msglen = 0. 03830 * 03831 * NOTE: This needs to be fixed, since like for 03832 * handshake messages it is allowed to have 03833 * multiple alerts witin a single record. 03834 * Internal reference IOTSSL-1321. 03835 * 03836 * (3) Change cipher spec: 03837 * Consume whole record content, in_msglen = 0. 03838 * 03839 * (4) Application data: 03840 * Don't do anything - the record layer provides 03841 * the application data as a stream transport 03842 * and consumes through mbedtls_ssl_read only. 03843 * 03844 */ 03845 03846 /* Case (1): Handshake messages */ 03847 if( ssl->in_hslen != 0 ) 03848 { 03849 /* Hard assertion to be sure that no application data 03850 * is in flight, as corrupting ssl->in_msglen during 03851 * ssl->in_offt != NULL is fatal. */ 03852 if( ssl->in_offt != NULL ) 03853 { 03854 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 03855 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 03856 } 03857 03858 /* 03859 * Get next Handshake message in the current record 03860 */ 03861 03862 /* Notes: 03863 * (1) in_hslen is *NOT* necessarily the size of the 03864 * current handshake content: If DTLS handshake 03865 * fragmentation is used, that's the fragment 03866 * size instead. Using the total handshake message 03867 * size here is FAULTY and should be changed at 03868 * some point. Internal reference IOTSSL-1414. 03869 * (2) While it doesn't seem to cause problems, one 03870 * has to be very careful not to assume that in_hslen 03871 * is always <= in_msglen in a sensible communication. 03872 * Again, it's wrong for DTLS handshake fragmentation. 03873 * The following check is therefore mandatory, and 03874 * should not be treated as a silently corrected assertion. 03875 * Additionally, ssl->in_hslen might be arbitrarily out of 03876 * bounds after handling a DTLS message with an unexpected 03877 * sequence number, see mbedtls_ssl_prepare_handshake_record. 03878 */ 03879 if( ssl->in_hslen < ssl->in_msglen ) 03880 { 03881 ssl->in_msglen -= ssl->in_hslen; 03882 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen, 03883 ssl->in_msglen ); 03884 03885 MBEDTLS_SSL_DEBUG_BUF( 4, "remaining content in record", 03886 ssl->in_msg, ssl->in_msglen ); 03887 } 03888 else 03889 { 03890 ssl->in_msglen = 0; 03891 } 03892 03893 ssl->in_hslen = 0; 03894 } 03895 /* Case (4): Application data */ 03896 else if( ssl->in_offt != NULL ) 03897 { 03898 return( 0 ); 03899 } 03900 /* Everything else (CCS & Alerts) */ 03901 else 03902 { 03903 ssl->in_msglen = 0; 03904 } 03905 03906 /* 03907 * Step B 03908 * 03909 * Fetch and decode new record if current one is fully consumed. 03910 * 03911 */ 03912 03913 if( ssl->in_msglen > 0 ) 03914 { 03915 /* There's something left to be processed in the current record. */ 03916 return( 0 ); 03917 } 03918 03919 /* Need to fetch a new record */ 03920 03921 #if defined(MBEDTLS_SSL_PROTO_DTLS) 03922 read_record_header: 03923 #endif 03924 03925 /* Current record either fully processed or to be discarded. */ 03926 03927 if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) ) ) != 0 ) 03928 { 03929 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); 03930 return( ret ); 03931 } 03932 03933 if( ( ret = ssl_parse_record_header( ssl ) ) != 0 ) 03934 { 03935 #if defined(MBEDTLS_SSL_PROTO_DTLS) 03936 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 03937 ret != MBEDTLS_ERR_SSL_CLIENT_RECONNECT ) 03938 { 03939 if( ret == MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ) 03940 { 03941 /* Skip unexpected record (but not whole datagram) */ 03942 ssl->next_record_offset = ssl->in_msglen 03943 + mbedtls_ssl_hdr_len( ssl ); 03944 03945 MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding unexpected record " 03946 "(header)" ) ); 03947 } 03948 else 03949 { 03950 /* Skip invalid record and the rest of the datagram */ 03951 ssl->next_record_offset = 0; 03952 ssl->in_left = 0; 03953 03954 MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding invalid record " 03955 "(header)" ) ); 03956 } 03957 03958 /* Get next record */ 03959 goto read_record_header; 03960 } 03961 #endif 03962 return( ret ); 03963 } 03964 03965 /* 03966 * Read and optionally decrypt the message contents 03967 */ 03968 if( ( ret = mbedtls_ssl_fetch_input( ssl, 03969 mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen ) ) != 0 ) 03970 { 03971 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); 03972 return( ret ); 03973 } 03974 03975 /* Done reading this record, get ready for the next one */ 03976 #if defined(MBEDTLS_SSL_PROTO_DTLS) 03977 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 03978 ssl->next_record_offset = ssl->in_msglen + mbedtls_ssl_hdr_len( ssl ); 03979 else 03980 #endif 03981 ssl->in_left = 0; 03982 03983 if( ( ret = ssl_prepare_record_content( ssl ) ) != 0 ) 03984 { 03985 #if defined(MBEDTLS_SSL_PROTO_DTLS) 03986 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 03987 { 03988 /* Silently discard invalid records */ 03989 if( ret == MBEDTLS_ERR_SSL_INVALID_RECORD || 03990 ret == MBEDTLS_ERR_SSL_INVALID_MAC ) 03991 { 03992 /* Except when waiting for Finished as a bad mac here 03993 * probably means something went wrong in the handshake 03994 * (eg wrong psk used, mitm downgrade attempt, etc.) */ 03995 if( ssl->state == MBEDTLS_SSL_CLIENT_FINISHED || 03996 ssl->state == MBEDTLS_SSL_SERVER_FINISHED ) 03997 { 03998 #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) 03999 if( ret == MBEDTLS_ERR_SSL_INVALID_MAC ) 04000 { 04001 mbedtls_ssl_send_alert_message( ssl, 04002 MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04003 MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC ); 04004 } 04005 #endif 04006 return( ret ); 04007 } 04008 04009 #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) 04010 if( ssl->conf->badmac_limit != 0 && 04011 ++ssl->badmac_seen >= ssl->conf->badmac_limit ) 04012 { 04013 MBEDTLS_SSL_DEBUG_MSG( 1, ( "too many records with bad MAC" ) ); 04014 return( MBEDTLS_ERR_SSL_INVALID_MAC ); 04015 } 04016 #endif 04017 04018 /* As above, invalid records cause 04019 * dismissal of the whole datagram. */ 04020 04021 ssl->next_record_offset = 0; 04022 ssl->in_left = 0; 04023 04024 MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding invalid record (mac)" ) ); 04025 goto read_record_header; 04026 } 04027 04028 return( ret ); 04029 } 04030 else 04031 #endif 04032 { 04033 /* Error out (and send alert) on invalid records */ 04034 #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) 04035 if( ret == MBEDTLS_ERR_SSL_INVALID_MAC ) 04036 { 04037 mbedtls_ssl_send_alert_message( ssl, 04038 MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04039 MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC ); 04040 } 04041 #endif 04042 return( ret ); 04043 } 04044 } 04045 04046 /* 04047 * When we sent the last flight of the handshake, we MUST respond to a 04048 * retransmit of the peer's previous flight with a retransmit. (In 04049 * practice, only the Finished message will make it, other messages 04050 * including CCS use the old transform so they're dropped as invalid.) 04051 * 04052 * If the record we received is not a handshake message, however, it 04053 * means the peer received our last flight so we can clean up 04054 * handshake info. 04055 * 04056 * This check needs to be done before prepare_handshake() due to an edge 04057 * case: if the client immediately requests renegotiation, this 04058 * finishes the current handshake first, avoiding the new ClientHello 04059 * being mistaken for an ancient message in the current handshake. 04060 */ 04061 #if defined(MBEDTLS_SSL_PROTO_DTLS) 04062 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 04063 ssl->handshake != NULL && 04064 ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) 04065 { 04066 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && 04067 ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED ) 04068 { 04069 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received retransmit of last flight" ) ); 04070 04071 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 ) 04072 { 04073 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret ); 04074 return( ret ); 04075 } 04076 04077 return( MBEDTLS_ERR_SSL_WANT_READ ); 04078 } 04079 else 04080 { 04081 ssl_handshake_wrapup_free_hs_transform( ssl ); 04082 } 04083 } 04084 #endif 04085 04086 return( 0 ); 04087 } 04088 04089 int mbedtls_ssl_handle_message_type( mbedtls_ssl_context *ssl ) 04090 { 04091 int ret; 04092 04093 /* 04094 * Handle particular types of records 04095 */ 04096 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) 04097 { 04098 if( ( ret = mbedtls_ssl_prepare_handshake_record( ssl ) ) != 0 ) 04099 { 04100 return( ret ); 04101 } 04102 } 04103 04104 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT ) 04105 { 04106 MBEDTLS_SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]", 04107 ssl->in_msg[0], ssl->in_msg[1] ) ); 04108 04109 /* 04110 * Ignore non-fatal alerts, except close_notify and no_renegotiation 04111 */ 04112 if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_FATAL ) 04113 { 04114 MBEDTLS_SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)", 04115 ssl->in_msg[1] ) ); 04116 return( MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE ); 04117 } 04118 04119 if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && 04120 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY ) 04121 { 04122 MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a close notify message" ) ); 04123 return( MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY ); 04124 } 04125 04126 #if defined(MBEDTLS_SSL_RENEGOTIATION_ENABLED) 04127 if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && 04128 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION ) 04129 { 04130 MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a SSLv3 no_cert" ) ); 04131 /* Will be handled when trying to parse ServerHello */ 04132 return( 0 ); 04133 } 04134 #endif 04135 04136 #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_SRV_C) 04137 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 && 04138 ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && 04139 ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && 04140 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT ) 04141 { 04142 MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a SSLv3 no_cert" ) ); 04143 /* Will be handled in mbedtls_ssl_parse_certificate() */ 04144 return( 0 ); 04145 } 04146 #endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */ 04147 04148 /* Silently ignore: fetch new message */ 04149 return MBEDTLS_ERR_SSL_NON_FATAL; 04150 } 04151 04152 return( 0 ); 04153 } 04154 04155 int mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl ) 04156 { 04157 int ret; 04158 04159 if( ( ret = mbedtls_ssl_send_alert_message( ssl, 04160 MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04161 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 ) 04162 { 04163 return( ret ); 04164 } 04165 04166 return( 0 ); 04167 } 04168 04169 int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl, 04170 unsigned char level, 04171 unsigned char message ) 04172 { 04173 int ret; 04174 04175 if( ssl == NULL || ssl->conf == NULL ) 04176 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 04177 04178 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> send alert message" ) ); 04179 MBEDTLS_SSL_DEBUG_MSG( 3, ( "send alert level=%u message=%u", level, message )); 04180 04181 ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT; 04182 ssl->out_msglen = 2; 04183 ssl->out_msg[0] = level; 04184 ssl->out_msg[1] = message; 04185 04186 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 04187 { 04188 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 04189 return( ret ); 04190 } 04191 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= send alert message" ) ); 04192 04193 return( 0 ); 04194 } 04195 04196 /* 04197 * Handshake functions 04198 */ 04199 #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ 04200 !defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \ 04201 !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ 04202 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ 04203 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \ 04204 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ 04205 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) 04206 /* No certificate support -> dummy functions */ 04207 int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl ) 04208 { 04209 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; 04210 04211 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) ); 04212 04213 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || 04214 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || 04215 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || 04216 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) 04217 { 04218 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) ); 04219 ssl->state++; 04220 return( 0 ); 04221 } 04222 04223 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 04224 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 04225 } 04226 04227 int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) 04228 { 04229 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; 04230 04231 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) ); 04232 04233 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || 04234 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || 04235 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || 04236 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) 04237 { 04238 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); 04239 ssl->state++; 04240 return( 0 ); 04241 } 04242 04243 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 04244 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 04245 } 04246 04247 #else 04248 /* Some certificate support -> implement write and parse */ 04249 04250 int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl ) 04251 { 04252 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; 04253 size_t i, n; 04254 const mbedtls_x509_crt *crt; 04255 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; 04256 04257 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) ); 04258 04259 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || 04260 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || 04261 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || 04262 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) 04263 { 04264 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) ); 04265 ssl->state++; 04266 return( 0 ); 04267 } 04268 04269 #if defined(MBEDTLS_SSL_CLI_C) 04270 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) 04271 { 04272 if( ssl->client_auth == 0 ) 04273 { 04274 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) ); 04275 ssl->state++; 04276 return( 0 ); 04277 } 04278 04279 #if defined(MBEDTLS_SSL_PROTO_SSL3) 04280 /* 04281 * If using SSLv3 and got no cert, send an Alert message 04282 * (otherwise an empty Certificate message will be sent). 04283 */ 04284 if( mbedtls_ssl_own_cert( ssl ) == NULL && 04285 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 04286 { 04287 ssl->out_msglen = 2; 04288 ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT; 04289 ssl->out_msg[0] = MBEDTLS_SSL_ALERT_LEVEL_WARNING; 04290 ssl->out_msg[1] = MBEDTLS_SSL_ALERT_MSG_NO_CERT; 04291 04292 MBEDTLS_SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) ); 04293 goto write_msg; 04294 } 04295 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ 04296 } 04297 #endif /* MBEDTLS_SSL_CLI_C */ 04298 #if defined(MBEDTLS_SSL_SRV_C) 04299 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) 04300 { 04301 if( mbedtls_ssl_own_cert( ssl ) == NULL ) 04302 { 04303 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) ); 04304 return( MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED ); 04305 } 04306 } 04307 #endif 04308 04309 MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", mbedtls_ssl_own_cert( ssl ) ); 04310 04311 /* 04312 * 0 . 0 handshake type 04313 * 1 . 3 handshake length 04314 * 4 . 6 length of all certs 04315 * 7 . 9 length of cert. 1 04316 * 10 . n-1 peer certificate 04317 * n . n+2 length of cert. 2 04318 * n+3 . ... upper level cert, etc. 04319 */ 04320 i = 7; 04321 crt = mbedtls_ssl_own_cert( ssl ); 04322 04323 while( crt != NULL ) 04324 { 04325 n = crt->raw.len; 04326 if( n > MBEDTLS_SSL_MAX_CONTENT_LEN - 3 - i ) 04327 { 04328 MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d", 04329 i + 3 + n, MBEDTLS_SSL_MAX_CONTENT_LEN ) ); 04330 return( MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE ); 04331 } 04332 04333 ssl->out_msg[i ] = (unsigned char)( n >> 16 ); 04334 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 ); 04335 ssl->out_msg[i + 2] = (unsigned char)( n ); 04336 04337 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n ); 04338 i += n; crt = crt->next; 04339 } 04340 04341 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 ); 04342 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 ); 04343 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) ); 04344 04345 ssl->out_msglen = i; 04346 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; 04347 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE; 04348 04349 #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C) 04350 write_msg: 04351 #endif 04352 04353 ssl->state++; 04354 04355 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 04356 { 04357 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 04358 return( ret ); 04359 } 04360 04361 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) ); 04362 04363 return( ret ); 04364 } 04365 04366 int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) 04367 { 04368 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; 04369 size_t i, n; 04370 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; 04371 int authmode = ssl->conf->authmode; 04372 uint8_t alert; 04373 04374 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) ); 04375 04376 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || 04377 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || 04378 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || 04379 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) 04380 { 04381 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); 04382 ssl->state++; 04383 return( 0 ); 04384 } 04385 04386 #if defined(MBEDTLS_SSL_SRV_C) 04387 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && 04388 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) 04389 { 04390 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); 04391 ssl->state++; 04392 return( 0 ); 04393 } 04394 04395 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 04396 if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET ) 04397 authmode = ssl->handshake->sni_authmode; 04398 #endif 04399 04400 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && 04401 authmode == MBEDTLS_SSL_VERIFY_NONE ) 04402 { 04403 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_SKIP_VERIFY; 04404 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); 04405 ssl->state++; 04406 return( 0 ); 04407 } 04408 #endif 04409 04410 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 ) 04411 { 04412 /* mbedtls_ssl_read_record may have sent an alert already. We 04413 let it decide whether to alert. */ 04414 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); 04415 return( ret ); 04416 } 04417 04418 ssl->state++; 04419 04420 #if defined(MBEDTLS_SSL_SRV_C) 04421 #if defined(MBEDTLS_SSL_PROTO_SSL3) 04422 /* 04423 * Check if the client sent an empty certificate 04424 */ 04425 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && 04426 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 04427 { 04428 if( ssl->in_msglen == 2 && 04429 ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT && 04430 ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && 04431 ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT ) 04432 { 04433 MBEDTLS_SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) ); 04434 04435 /* The client was asked for a certificate but didn't send 04436 one. The client should know what's going on, so we 04437 don't send an alert. */ 04438 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING; 04439 if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL ) 04440 return( 0 ); 04441 else 04442 return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE ); 04443 } 04444 } 04445 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ 04446 04447 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ 04448 defined(MBEDTLS_SSL_PROTO_TLS1_2) 04449 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && 04450 ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) 04451 { 04452 if( ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len( ssl ) && 04453 ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && 04454 ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE && 04455 memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), "\0\0\0", 3 ) == 0 ) 04456 { 04457 MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) ); 04458 04459 /* The client was asked for a certificate but didn't send 04460 one. The client should know what's going on, so we 04461 don't send an alert. */ 04462 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING; 04463 if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL ) 04464 return( 0 ); 04465 else 04466 return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE ); 04467 } 04468 } 04469 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ 04470 MBEDTLS_SSL_PROTO_TLS1_2 */ 04471 #endif /* MBEDTLS_SSL_SRV_C */ 04472 04473 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) 04474 { 04475 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); 04476 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04477 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); 04478 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); 04479 } 04480 04481 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE || 04482 ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 ) 04483 { 04484 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); 04485 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04486 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 04487 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); 04488 } 04489 04490 i = mbedtls_ssl_hs_hdr_len( ssl ); 04491 04492 /* 04493 * Same message structure as in mbedtls_ssl_write_certificate() 04494 */ 04495 n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2]; 04496 04497 if( ssl->in_msg[i] != 0 || 04498 ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) ) 04499 { 04500 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); 04501 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04502 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 04503 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); 04504 } 04505 04506 /* In case we tried to reuse a session but it failed */ 04507 if( ssl->session_negotiate->peer_cert != NULL ) 04508 { 04509 mbedtls_x509_crt_free( ssl->session_negotiate->peer_cert ); 04510 mbedtls_free( ssl->session_negotiate->peer_cert ); 04511 } 04512 04513 if( ( ssl->session_negotiate->peer_cert = mbedtls_calloc( 1, 04514 sizeof( mbedtls_x509_crt ) ) ) == NULL ) 04515 { 04516 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", 04517 sizeof( mbedtls_x509_crt ) ) ); 04518 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04519 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); 04520 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 04521 } 04522 04523 mbedtls_x509_crt_init( ssl->session_negotiate->peer_cert ); 04524 04525 i += 3; 04526 04527 while( i < ssl->in_hslen ) 04528 { 04529 if( ssl->in_msg[i] != 0 ) 04530 { 04531 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); 04532 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04533 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 04534 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); 04535 } 04536 04537 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 ) 04538 | (unsigned int) ssl->in_msg[i + 2]; 04539 i += 3; 04540 04541 if( n < 128 || i + n > ssl->in_hslen ) 04542 { 04543 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); 04544 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04545 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 04546 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); 04547 } 04548 04549 ret = mbedtls_x509_crt_parse_der( ssl->session_negotiate->peer_cert, 04550 ssl->in_msg + i, n ); 04551 switch( ret ) 04552 { 04553 case 0: /*ok*/ 04554 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND: 04555 /* Ignore certificate with an unknown algorithm: maybe a 04556 prior certificate was already trusted. */ 04557 break; 04558 04559 case MBEDTLS_ERR_X509_ALLOC_FAILED: 04560 alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR; 04561 goto crt_parse_der_failed; 04562 04563 case MBEDTLS_ERR_X509_UNKNOWN_VERSION: 04564 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; 04565 goto crt_parse_der_failed; 04566 04567 default: 04568 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT; 04569 crt_parse_der_failed: 04570 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert ); 04571 MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret ); 04572 return( ret ); 04573 } 04574 04575 i += n; 04576 } 04577 04578 MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert ); 04579 04580 /* 04581 * On client, make sure the server cert doesn't change during renego to 04582 * avoid "triple handshake" attack: https://secure-resumption.com/ 04583 */ 04584 #if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C) 04585 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && 04586 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) 04587 { 04588 if( ssl->session->peer_cert == NULL ) 04589 { 04590 MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) ); 04591 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04592 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED ); 04593 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); 04594 } 04595 04596 if( ssl->session->peer_cert->raw.len != 04597 ssl->session_negotiate->peer_cert->raw.len || 04598 memcmp( ssl->session->peer_cert->raw.p, 04599 ssl->session_negotiate->peer_cert->raw.p, 04600 ssl->session->peer_cert->raw.len ) != 0 ) 04601 { 04602 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server cert changed during renegotiation" ) ); 04603 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04604 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED ); 04605 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); 04606 } 04607 } 04608 #endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */ 04609 04610 if( authmode != MBEDTLS_SSL_VERIFY_NONE ) 04611 { 04612 mbedtls_x509_crt *ca_chain; 04613 mbedtls_x509_crl *ca_crl; 04614 04615 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 04616 if( ssl->handshake->sni_ca_chain != NULL ) 04617 { 04618 ca_chain = ssl->handshake->sni_ca_chain; 04619 ca_crl = ssl->handshake->sni_ca_crl; 04620 } 04621 else 04622 #endif 04623 { 04624 ca_chain = ssl->conf->ca_chain; 04625 ca_crl = ssl->conf->ca_crl; 04626 } 04627 04628 /* 04629 * Main check: verify certificate 04630 */ 04631 ret = mbedtls_x509_crt_verify_with_profile( 04632 ssl->session_negotiate->peer_cert, 04633 ca_chain, ca_crl, 04634 ssl->conf->cert_profile, 04635 ssl->hostname, 04636 &ssl->session_negotiate->verify_result, 04637 ssl->conf->f_vrfy, ssl->conf->p_vrfy ); 04638 04639 if( ret != 0 ) 04640 { 04641 MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret ); 04642 } 04643 04644 /* 04645 * Secondary checks: always done, but change 'ret' only if it was 0 04646 */ 04647 04648 #if defined(MBEDTLS_ECP_C) 04649 { 04650 const mbedtls_pk_context *pk = &ssl->session_negotiate->peer_cert->pk; 04651 04652 /* If certificate uses an EC key, make sure the curve is OK */ 04653 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) && 04654 mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp .id ) != 0 ) 04655 { 04656 ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY; 04657 04658 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) ); 04659 if( ret == 0 ) 04660 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; 04661 } 04662 } 04663 #endif /* MBEDTLS_ECP_C */ 04664 04665 if( mbedtls_ssl_check_cert_usage( ssl->session_negotiate->peer_cert, 04666 ciphersuite_info, 04667 ! ssl->conf->endpoint, 04668 &ssl->session_negotiate->verify_result ) != 0 ) 04669 { 04670 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) ); 04671 if( ret == 0 ) 04672 ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; 04673 } 04674 04675 /* mbedtls_x509_crt_verify_with_profile is supposed to report a 04676 * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED, 04677 * with details encoded in the verification flags. All other kinds 04678 * of error codes, including those from the user provided f_vrfy 04679 * functions, are treated as fatal and lead to a failure of 04680 * ssl_parse_certificate even if verification was optional. */ 04681 if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL && 04682 ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED || 04683 ret == MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ) ) 04684 { 04685 ret = 0; 04686 } 04687 04688 if( ca_chain == NULL && authmode == MBEDTLS_SSL_VERIFY_REQUIRED ) 04689 { 04690 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) ); 04691 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED; 04692 } 04693 04694 if( ret != 0 ) 04695 { 04696 /* The certificate may have been rejected for several reasons. 04697 Pick one and send the corresponding alert. Which alert to send 04698 may be a subject of debate in some cases. */ 04699 if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER ) 04700 alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED; 04701 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH ) 04702 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT; 04703 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE ) 04704 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; 04705 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE ) 04706 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; 04707 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE ) 04708 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; 04709 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK ) 04710 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; 04711 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY ) 04712 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; 04713 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED ) 04714 alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED; 04715 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED ) 04716 alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED; 04717 else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED ) 04718 alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA; 04719 else 04720 alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN; 04721 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04722 alert ); 04723 } 04724 04725 #if defined(MBEDTLS_DEBUG_C) 04726 if( ssl->session_negotiate->verify_result != 0 ) 04727 { 04728 MBEDTLS_SSL_DEBUG_MSG( 3, ( "! Certificate verification flags %x", 04729 ssl->session_negotiate->verify_result ) ); 04730 } 04731 else 04732 { 04733 MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate verification flags clear" ) ); 04734 } 04735 #endif /* MBEDTLS_DEBUG_C */ 04736 } 04737 04738 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) ); 04739 04740 return( ret ); 04741 } 04742 #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED 04743 !MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED 04744 !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED 04745 !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED 04746 !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED 04747 !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED 04748 !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ 04749 04750 int mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl ) 04751 { 04752 int ret; 04753 04754 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) ); 04755 04756 ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC; 04757 ssl->out_msglen = 1; 04758 ssl->out_msg[0] = 1; 04759 04760 ssl->state++; 04761 04762 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 04763 { 04764 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 04765 return( ret ); 04766 } 04767 04768 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) ); 04769 04770 return( 0 ); 04771 } 04772 04773 int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl ) 04774 { 04775 int ret; 04776 04777 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) ); 04778 04779 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 ) 04780 { 04781 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); 04782 return( ret ); 04783 } 04784 04785 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ) 04786 { 04787 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) ); 04788 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04789 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); 04790 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); 04791 } 04792 04793 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 ) 04794 { 04795 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) ); 04796 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04797 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 04798 return( MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC ); 04799 } 04800 04801 /* 04802 * Switch to our negotiated transform and session parameters for inbound 04803 * data. 04804 */ 04805 MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) ); 04806 ssl->transform_in = ssl->transform_negotiate; 04807 ssl->session_in = ssl->session_negotiate; 04808 04809 #if defined(MBEDTLS_SSL_PROTO_DTLS) 04810 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 04811 { 04812 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) 04813 ssl_dtls_replay_reset( ssl ); 04814 #endif 04815 04816 /* Increment epoch */ 04817 if( ++ssl->in_epoch == 0 ) 04818 { 04819 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) ); 04820 /* This is highly unlikely to happen for legitimate reasons, so 04821 treat it as an attack and don't send an alert. */ 04822 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); 04823 } 04824 } 04825 else 04826 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 04827 memset( ssl->in_ctr, 0, 8 ); 04828 04829 /* 04830 * Set the in_msg pointer to the correct location based on IV length 04831 */ 04832 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) 04833 { 04834 ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen - 04835 ssl->transform_negotiate->fixed_ivlen; 04836 } 04837 else 04838 ssl->in_msg = ssl->in_iv; 04839 04840 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) 04841 if( mbedtls_ssl_hw_record_activate != NULL ) 04842 { 04843 if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_INBOUND ) ) != 0 ) 04844 { 04845 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret ); 04846 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 04847 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); 04848 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); 04849 } 04850 } 04851 #endif 04852 04853 ssl->state++; 04854 04855 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) ); 04856 04857 return( 0 ); 04858 } 04859 04860 void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl, 04861 const mbedtls_ssl_ciphersuite_t *ciphersuite_info ) 04862 { 04863 ((void) ciphersuite_info); 04864 04865 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 04866 defined(MBEDTLS_SSL_PROTO_TLS1_1) 04867 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ) 04868 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1; 04869 else 04870 #endif 04871 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 04872 #if defined(MBEDTLS_SHA512_C) 04873 if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) 04874 ssl->handshake->update_checksum = ssl_update_checksum_sha384; 04875 else 04876 #endif 04877 #if defined(MBEDTLS_SHA256_C) 04878 if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 ) 04879 ssl->handshake->update_checksum = ssl_update_checksum_sha256; 04880 else 04881 #endif 04882 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 04883 { 04884 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 04885 return; 04886 } 04887 } 04888 04889 void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl ) 04890 { 04891 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 04892 defined(MBEDTLS_SSL_PROTO_TLS1_1) 04893 mbedtls_md5_starts_ret( &ssl->handshake->fin_md5 ); 04894 mbedtls_sha1_starts_ret( &ssl->handshake->fin_sha1 ); 04895 #endif 04896 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 04897 #if defined(MBEDTLS_SHA256_C) 04898 mbedtls_sha256_starts_ret( &ssl->handshake->fin_sha256, 0 ); 04899 #endif 04900 #if defined(MBEDTLS_SHA512_C) 04901 mbedtls_sha512_starts_ret( &ssl->handshake->fin_sha512, 1 ); 04902 #endif 04903 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 04904 } 04905 04906 static void ssl_update_checksum_start( mbedtls_ssl_context *ssl, 04907 const unsigned char *buf, size_t len ) 04908 { 04909 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 04910 defined(MBEDTLS_SSL_PROTO_TLS1_1) 04911 mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len ); 04912 mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len ); 04913 #endif 04914 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 04915 #if defined(MBEDTLS_SHA256_C) 04916 mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len ); 04917 #endif 04918 #if defined(MBEDTLS_SHA512_C) 04919 mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len ); 04920 #endif 04921 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 04922 } 04923 04924 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 04925 defined(MBEDTLS_SSL_PROTO_TLS1_1) 04926 static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *ssl, 04927 const unsigned char *buf, size_t len ) 04928 { 04929 mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len ); 04930 mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len ); 04931 } 04932 #endif 04933 04934 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 04935 #if defined(MBEDTLS_SHA256_C) 04936 static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl, 04937 const unsigned char *buf, size_t len ) 04938 { 04939 mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len ); 04940 } 04941 #endif 04942 04943 #if defined(MBEDTLS_SHA512_C) 04944 static void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl, 04945 const unsigned char *buf, size_t len ) 04946 { 04947 mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len ); 04948 } 04949 #endif 04950 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 04951 04952 #if defined(MBEDTLS_SSL_PROTO_SSL3) 04953 static void ssl_calc_finished_ssl( 04954 mbedtls_ssl_context *ssl, unsigned char *buf, int from ) 04955 { 04956 const char *sender; 04957 mbedtls_md5_context md5; 04958 mbedtls_sha1_context sha1; 04959 04960 unsigned char padbuf[48]; 04961 unsigned char md5sum[16]; 04962 unsigned char sha1sum[20]; 04963 04964 mbedtls_ssl_session *session = ssl->session_negotiate; 04965 if( !session ) 04966 session = ssl->session; 04967 04968 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) ); 04969 04970 mbedtls_md5_init( &md5 ); 04971 mbedtls_sha1_init( &sha1 ); 04972 04973 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); 04974 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); 04975 04976 /* 04977 * SSLv3: 04978 * hash = 04979 * MD5( master + pad2 + 04980 * MD5( handshake + sender + master + pad1 ) ) 04981 * + SHA1( master + pad2 + 04982 * SHA1( handshake + sender + master + pad1 ) ) 04983 */ 04984 04985 #if !defined(MBEDTLS_MD5_ALT) 04986 MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *) 04987 md5.state , sizeof( md5.state ) ); 04988 #endif 04989 04990 #if !defined(MBEDTLS_SHA1_ALT) 04991 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *) 04992 sha1.state , sizeof( sha1.state ) ); 04993 #endif 04994 04995 sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "CLNT" 04996 : "SRVR"; 04997 04998 memset( padbuf, 0x36, 48 ); 04999 05000 mbedtls_md5_update_ret( &md5, (const unsigned char *) sender, 4 ); 05001 mbedtls_md5_update_ret( &md5, session->master, 48 ); 05002 mbedtls_md5_update_ret( &md5, padbuf, 48 ); 05003 mbedtls_md5_finish_ret( &md5, md5sum ); 05004 05005 mbedtls_sha1_update_ret( &sha1, (const unsigned char *) sender, 4 ); 05006 mbedtls_sha1_update_ret( &sha1, session->master, 48 ); 05007 mbedtls_sha1_update_ret( &sha1, padbuf, 40 ); 05008 mbedtls_sha1_finish_ret( &sha1, sha1sum ); 05009 05010 memset( padbuf, 0x5C, 48 ); 05011 05012 mbedtls_md5_starts_ret( &md5 ); 05013 mbedtls_md5_update_ret( &md5, session->master, 48 ); 05014 mbedtls_md5_update_ret( &md5, padbuf, 48 ); 05015 mbedtls_md5_update_ret( &md5, md5sum, 16 ); 05016 mbedtls_md5_finish_ret( &md5, buf ); 05017 05018 mbedtls_sha1_starts_ret( &sha1 ); 05019 mbedtls_sha1_update_ret( &sha1, session->master, 48 ); 05020 mbedtls_sha1_update_ret( &sha1, padbuf , 40 ); 05021 mbedtls_sha1_update_ret( &sha1, sha1sum, 20 ); 05022 mbedtls_sha1_finish_ret( &sha1, buf + 16 ); 05023 05024 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 ); 05025 05026 mbedtls_md5_free( &md5 ); 05027 mbedtls_sha1_free( &sha1 ); 05028 05029 mbedtls_zeroize( padbuf, sizeof( padbuf ) ); 05030 mbedtls_zeroize( md5sum, sizeof( md5sum ) ); 05031 mbedtls_zeroize( sha1sum, sizeof( sha1sum ) ); 05032 05033 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); 05034 } 05035 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ 05036 05037 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) 05038 static void ssl_calc_finished_tls( 05039 mbedtls_ssl_context *ssl, unsigned char *buf, int from ) 05040 { 05041 int len = 12; 05042 const char *sender; 05043 mbedtls_md5_context md5; 05044 mbedtls_sha1_context sha1; 05045 unsigned char padbuf[36]; 05046 05047 mbedtls_ssl_session *session = ssl->session_negotiate; 05048 if( !session ) 05049 session = ssl->session; 05050 05051 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) ); 05052 05053 mbedtls_md5_init( &md5 ); 05054 mbedtls_sha1_init( &sha1 ); 05055 05056 mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); 05057 mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); 05058 05059 /* 05060 * TLSv1: 05061 * hash = PRF( master, finished_label, 05062 * MD5( handshake ) + SHA1( handshake ) )[0..11] 05063 */ 05064 05065 #if !defined(MBEDTLS_MD5_ALT) 05066 MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *) 05067 md5.state , sizeof( md5.state ) ); 05068 #endif 05069 05070 #if !defined(MBEDTLS_SHA1_ALT) 05071 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *) 05072 sha1.state , sizeof( sha1.state ) ); 05073 #endif 05074 05075 sender = ( from == MBEDTLS_SSL_IS_CLIENT ) 05076 ? "client finished" 05077 : "server finished"; 05078 05079 mbedtls_md5_finish_ret( &md5, padbuf ); 05080 mbedtls_sha1_finish_ret( &sha1, padbuf + 16 ); 05081 05082 ssl->handshake->tls_prf( session->master, 48, sender, 05083 padbuf, 36, buf, len ); 05084 05085 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); 05086 05087 mbedtls_md5_free( &md5 ); 05088 mbedtls_sha1_free( &sha1 ); 05089 05090 mbedtls_zeroize( padbuf, sizeof( padbuf ) ); 05091 05092 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); 05093 } 05094 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ 05095 05096 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 05097 #if defined(MBEDTLS_SHA256_C) 05098 static void ssl_calc_finished_tls_sha256( 05099 mbedtls_ssl_context *ssl, unsigned char *buf, int from ) 05100 { 05101 int len = 12; 05102 const char *sender; 05103 mbedtls_sha256_context sha256; 05104 unsigned char padbuf[32]; 05105 05106 mbedtls_ssl_session *session = ssl->session_negotiate; 05107 if( !session ) 05108 session = ssl->session; 05109 05110 mbedtls_sha256_init( &sha256 ); 05111 05112 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) ); 05113 05114 mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 ); 05115 05116 /* 05117 * TLSv1.2: 05118 * hash = PRF( master, finished_label, 05119 * Hash( handshake ) )[0.11] 05120 */ 05121 05122 #if !defined(MBEDTLS_SHA256_ALT) 05123 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *) 05124 sha256.state , sizeof( sha256.state ) ); 05125 #endif 05126 05127 sender = ( from == MBEDTLS_SSL_IS_CLIENT ) 05128 ? "client finished" 05129 : "server finished"; 05130 05131 mbedtls_sha256_finish_ret( &sha256, padbuf ); 05132 05133 ssl->handshake->tls_prf( session->master, 48, sender, 05134 padbuf, 32, buf, len ); 05135 05136 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); 05137 05138 mbedtls_sha256_free( &sha256 ); 05139 05140 mbedtls_zeroize( padbuf, sizeof( padbuf ) ); 05141 05142 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); 05143 } 05144 #endif /* MBEDTLS_SHA256_C */ 05145 05146 #if defined(MBEDTLS_SHA512_C) 05147 static void ssl_calc_finished_tls_sha384( 05148 mbedtls_ssl_context *ssl, unsigned char *buf, int from ) 05149 { 05150 int len = 12; 05151 const char *sender; 05152 mbedtls_sha512_context sha512; 05153 unsigned char padbuf[48]; 05154 05155 mbedtls_ssl_session *session = ssl->session_negotiate; 05156 if( !session ) 05157 session = ssl->session; 05158 05159 mbedtls_sha512_init( &sha512 ); 05160 05161 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) ); 05162 05163 mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 ); 05164 05165 /* 05166 * TLSv1.2: 05167 * hash = PRF( master, finished_label, 05168 * Hash( handshake ) )[0.11] 05169 */ 05170 05171 #if !defined(MBEDTLS_SHA512_ALT) 05172 MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *) 05173 sha512.state , sizeof( sha512.state ) ); 05174 #endif 05175 05176 sender = ( from == MBEDTLS_SSL_IS_CLIENT ) 05177 ? "client finished" 05178 : "server finished"; 05179 05180 mbedtls_sha512_finish_ret( &sha512, padbuf ); 05181 05182 ssl->handshake->tls_prf( session->master, 48, sender, 05183 padbuf, 48, buf, len ); 05184 05185 MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); 05186 05187 mbedtls_sha512_free( &sha512 ); 05188 05189 mbedtls_zeroize( padbuf, sizeof( padbuf ) ); 05190 05191 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); 05192 } 05193 #endif /* MBEDTLS_SHA512_C */ 05194 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 05195 05196 static void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl ) 05197 { 05198 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup: final free" ) ); 05199 05200 /* 05201 * Free our handshake params 05202 */ 05203 mbedtls_ssl_handshake_free( ssl->handshake ); 05204 mbedtls_free( ssl->handshake ); 05205 ssl->handshake = NULL; 05206 05207 /* 05208 * Free the previous transform and swith in the current one 05209 */ 05210 if( ssl->transform ) 05211 { 05212 mbedtls_ssl_transform_free( ssl->transform ); 05213 mbedtls_free( ssl->transform ); 05214 } 05215 ssl->transform = ssl->transform_negotiate; 05216 ssl->transform_negotiate = NULL; 05217 05218 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup: final free" ) ); 05219 } 05220 05221 void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl ) 05222 { 05223 int resume = ssl->handshake->resume; 05224 05225 MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) ); 05226 05227 #if defined(MBEDTLS_SSL_RENEGOTIATION) 05228 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) 05229 { 05230 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE; 05231 ssl->renego_records_seen = 0; 05232 } 05233 #endif 05234 05235 /* 05236 * Free the previous session and switch in the current one 05237 */ 05238 if( ssl->session ) 05239 { 05240 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 05241 /* RFC 7366 3.1: keep the EtM state */ 05242 ssl->session_negotiate->encrypt_then_mac = 05243 ssl->session->encrypt_then_mac; 05244 #endif 05245 05246 mbedtls_ssl_session_free( ssl->session ); 05247 mbedtls_free( ssl->session ); 05248 } 05249 ssl->session = ssl->session_negotiate; 05250 ssl->session_negotiate = NULL; 05251 05252 /* 05253 * Add cache entry 05254 */ 05255 if( ssl->conf->f_set_cache != NULL && 05256 ssl->session->id_len != 0 && 05257 resume == 0 ) 05258 { 05259 if( ssl->conf->f_set_cache( ssl->conf->p_cache, ssl->session ) != 0 ) 05260 MBEDTLS_SSL_DEBUG_MSG( 1, ( "cache did not store session" ) ); 05261 } 05262 05263 #if defined(MBEDTLS_SSL_PROTO_DTLS) 05264 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 05265 ssl->handshake->flight != NULL ) 05266 { 05267 /* Cancel handshake timer */ 05268 ssl_set_timer( ssl, 0 ); 05269 05270 /* Keep last flight around in case we need to resend it: 05271 * we need the handshake and transform structures for that */ 05272 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip freeing handshake and transform" ) ); 05273 } 05274 else 05275 #endif 05276 ssl_handshake_wrapup_free_hs_transform( ssl ); 05277 05278 ssl->state++; 05279 05280 MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) ); 05281 } 05282 05283 int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl ) 05284 { 05285 int ret, hash_len; 05286 05287 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished" ) ); 05288 05289 /* 05290 * Set the out_msg pointer to the correct location based on IV length 05291 */ 05292 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) 05293 { 05294 ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen - 05295 ssl->transform_negotiate->fixed_ivlen; 05296 } 05297 else 05298 ssl->out_msg = ssl->out_iv; 05299 05300 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint ); 05301 05302 /* 05303 * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites 05304 * may define some other value. Currently (early 2016), no defined 05305 * ciphersuite does this (and this is unlikely to change as activity has 05306 * moved to TLS 1.3 now) so we can keep the hardcoded 12 here. 05307 */ 05308 hash_len = ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) ? 36 : 12; 05309 05310 #if defined(MBEDTLS_SSL_RENEGOTIATION) 05311 ssl->verify_data_len = hash_len; 05312 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len ); 05313 #endif 05314 05315 ssl->out_msglen = 4 + hash_len; 05316 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; 05317 ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED; 05318 05319 /* 05320 * In case of session resuming, invert the client and server 05321 * ChangeCipherSpec messages order. 05322 */ 05323 if( ssl->handshake->resume != 0 ) 05324 { 05325 #if defined(MBEDTLS_SSL_CLI_C) 05326 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) 05327 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; 05328 #endif 05329 #if defined(MBEDTLS_SSL_SRV_C) 05330 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) 05331 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC; 05332 #endif 05333 } 05334 else 05335 ssl->state++; 05336 05337 /* 05338 * Switch to our negotiated transform and session parameters for outbound 05339 * data. 05340 */ 05341 MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) ); 05342 05343 #if defined(MBEDTLS_SSL_PROTO_DTLS) 05344 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 05345 { 05346 unsigned char i; 05347 05348 /* Remember current epoch settings for resending */ 05349 ssl->handshake->alt_transform_out = ssl->transform_out; 05350 memcpy( ssl->handshake->alt_out_ctr, ssl->out_ctr, 8 ); 05351 05352 /* Set sequence_number to zero */ 05353 memset( ssl->out_ctr + 2, 0, 6 ); 05354 05355 /* Increment epoch */ 05356 for( i = 2; i > 0; i-- ) 05357 if( ++ssl->out_ctr[i - 1] != 0 ) 05358 break; 05359 05360 /* The loop goes to its end iff the counter is wrapping */ 05361 if( i == 0 ) 05362 { 05363 MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) ); 05364 return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); 05365 } 05366 } 05367 else 05368 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 05369 memset( ssl->out_ctr, 0, 8 ); 05370 05371 ssl->transform_out = ssl->transform_negotiate; 05372 ssl->session_out = ssl->session_negotiate; 05373 05374 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) 05375 if( mbedtls_ssl_hw_record_activate != NULL ) 05376 { 05377 if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 ) 05378 { 05379 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret ); 05380 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); 05381 } 05382 } 05383 #endif 05384 05385 #if defined(MBEDTLS_SSL_PROTO_DTLS) 05386 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 05387 mbedtls_ssl_send_flight_completed( ssl ); 05388 #endif 05389 05390 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 05391 { 05392 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 05393 return( ret ); 05394 } 05395 05396 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished" ) ); 05397 05398 return( 0 ); 05399 } 05400 05401 #if defined(MBEDTLS_SSL_PROTO_SSL3) 05402 #define SSL_MAX_HASH_LEN 36 05403 #else 05404 #define SSL_MAX_HASH_LEN 12 05405 #endif 05406 05407 int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl ) 05408 { 05409 int ret; 05410 unsigned int hash_len; 05411 unsigned char buf[SSL_MAX_HASH_LEN]; 05412 05413 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished" ) ); 05414 05415 ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 ); 05416 05417 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 ) 05418 { 05419 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); 05420 return( ret ); 05421 } 05422 05423 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) 05424 { 05425 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); 05426 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 05427 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); 05428 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); 05429 } 05430 05431 /* There is currently no ciphersuite using another length with TLS 1.2 */ 05432 #if defined(MBEDTLS_SSL_PROTO_SSL3) 05433 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 05434 hash_len = 36; 05435 else 05436 #endif 05437 hash_len = 12; 05438 05439 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED || 05440 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len ) 05441 { 05442 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); 05443 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 05444 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 05445 return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED ); 05446 } 05447 05448 if( mbedtls_ssl_safer_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), 05449 buf, hash_len ) != 0 ) 05450 { 05451 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); 05452 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 05453 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 05454 return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED ); 05455 } 05456 05457 #if defined(MBEDTLS_SSL_RENEGOTIATION) 05458 ssl->verify_data_len = hash_len; 05459 memcpy( ssl->peer_verify_data, buf, hash_len ); 05460 #endif 05461 05462 if( ssl->handshake->resume != 0 ) 05463 { 05464 #if defined(MBEDTLS_SSL_CLI_C) 05465 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) 05466 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC; 05467 #endif 05468 #if defined(MBEDTLS_SSL_SRV_C) 05469 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) 05470 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; 05471 #endif 05472 } 05473 else 05474 ssl->state++; 05475 05476 #if defined(MBEDTLS_SSL_PROTO_DTLS) 05477 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 05478 mbedtls_ssl_recv_flight_completed( ssl ); 05479 #endif 05480 05481 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished" ) ); 05482 05483 return( 0 ); 05484 } 05485 05486 static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake ) 05487 { 05488 memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) ); 05489 05490 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 05491 defined(MBEDTLS_SSL_PROTO_TLS1_1) 05492 mbedtls_md5_init( &handshake->fin_md5 ); 05493 mbedtls_sha1_init( &handshake->fin_sha1 ); 05494 mbedtls_md5_starts_ret( &handshake->fin_md5 ); 05495 mbedtls_sha1_starts_ret( &handshake->fin_sha1 ); 05496 #endif 05497 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 05498 #if defined(MBEDTLS_SHA256_C) 05499 mbedtls_sha256_init( &handshake->fin_sha256 ); 05500 mbedtls_sha256_starts_ret( &handshake->fin_sha256, 0 ); 05501 #endif 05502 #if defined(MBEDTLS_SHA512_C) 05503 mbedtls_sha512_init( &handshake->fin_sha512 ); 05504 mbedtls_sha512_starts_ret( &handshake->fin_sha512, 1 ); 05505 #endif 05506 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 05507 05508 handshake->update_checksum = ssl_update_checksum_start; 05509 05510 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ 05511 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 05512 mbedtls_ssl_sig_hash_set_init( &handshake->hash_algs ); 05513 #endif 05514 05515 #if defined(MBEDTLS_DHM_C) 05516 mbedtls_dhm_init( &handshake->dhm_ctx ); 05517 #endif 05518 #if defined(MBEDTLS_ECDH_C) 05519 mbedtls_ecdh_init( &handshake->ecdh_ctx ); 05520 #endif 05521 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 05522 mbedtls_ecjpake_init( &handshake->ecjpake_ctx ); 05523 #if defined(MBEDTLS_SSL_CLI_C) 05524 handshake->ecjpake_cache = NULL; 05525 handshake->ecjpake_cache_len = 0; 05526 #endif 05527 #endif 05528 05529 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 05530 handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET; 05531 #endif 05532 } 05533 05534 static void ssl_transform_init( mbedtls_ssl_transform *transform ) 05535 { 05536 memset( transform, 0, sizeof(mbedtls_ssl_transform) ); 05537 05538 mbedtls_cipher_init( &transform->cipher_ctx_enc ); 05539 mbedtls_cipher_init( &transform->cipher_ctx_dec ); 05540 05541 mbedtls_md_init( &transform->md_ctx_enc ); 05542 mbedtls_md_init( &transform->md_ctx_dec ); 05543 } 05544 05545 void mbedtls_ssl_session_init( mbedtls_ssl_session *session ) 05546 { 05547 memset( session, 0, sizeof(mbedtls_ssl_session) ); 05548 } 05549 05550 static int ssl_handshake_init( mbedtls_ssl_context *ssl ) 05551 { 05552 /* Clear old handshake information if present */ 05553 if( ssl->transform_negotiate ) 05554 mbedtls_ssl_transform_free( ssl->transform_negotiate ); 05555 if( ssl->session_negotiate ) 05556 mbedtls_ssl_session_free( ssl->session_negotiate ); 05557 if( ssl->handshake ) 05558 mbedtls_ssl_handshake_free( ssl->handshake ); 05559 05560 /* 05561 * Either the pointers are now NULL or cleared properly and can be freed. 05562 * Now allocate missing structures. 05563 */ 05564 if( ssl->transform_negotiate == NULL ) 05565 { 05566 ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) ); 05567 } 05568 05569 if( ssl->session_negotiate == NULL ) 05570 { 05571 ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) ); 05572 } 05573 05574 if( ssl->handshake == NULL ) 05575 { 05576 ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) ); 05577 } 05578 05579 /* All pointers should exist and can be directly freed without issue */ 05580 if( ssl->handshake == NULL || 05581 ssl->transform_negotiate == NULL || 05582 ssl->session_negotiate == NULL ) 05583 { 05584 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc() of ssl sub-contexts failed" ) ); 05585 05586 mbedtls_free( ssl->handshake ); 05587 mbedtls_free( ssl->transform_negotiate ); 05588 mbedtls_free( ssl->session_negotiate ); 05589 05590 ssl->handshake = NULL; 05591 ssl->transform_negotiate = NULL; 05592 ssl->session_negotiate = NULL; 05593 05594 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 05595 } 05596 05597 /* Initialize structures */ 05598 mbedtls_ssl_session_init( ssl->session_negotiate ); 05599 ssl_transform_init( ssl->transform_negotiate ); 05600 ssl_handshake_params_init( ssl->handshake ); 05601 05602 #if defined(MBEDTLS_SSL_PROTO_DTLS) 05603 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 05604 { 05605 ssl->handshake->alt_transform_out = ssl->transform_out; 05606 05607 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) 05608 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING; 05609 else 05610 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; 05611 05612 ssl_set_timer( ssl, 0 ); 05613 } 05614 #endif 05615 05616 return( 0 ); 05617 } 05618 05619 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) 05620 /* Dummy cookie callbacks for defaults */ 05621 static int ssl_cookie_write_dummy( void *ctx, 05622 unsigned char **p, unsigned char *end, 05623 const unsigned char *cli_id, size_t cli_id_len ) 05624 { 05625 ((void) ctx); 05626 ((void) p); 05627 ((void) end); 05628 ((void) cli_id); 05629 ((void) cli_id_len); 05630 05631 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); 05632 } 05633 05634 static int ssl_cookie_check_dummy( void *ctx, 05635 const unsigned char *cookie, size_t cookie_len, 05636 const unsigned char *cli_id, size_t cli_id_len ) 05637 { 05638 ((void) ctx); 05639 ((void) cookie); 05640 ((void) cookie_len); 05641 ((void) cli_id); 05642 ((void) cli_id_len); 05643 05644 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); 05645 } 05646 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ 05647 05648 /* 05649 * Initialize an SSL context 05650 */ 05651 void mbedtls_ssl_init( mbedtls_ssl_context *ssl ) 05652 { 05653 memset( ssl, 0, sizeof( mbedtls_ssl_context ) ); 05654 } 05655 05656 /* 05657 * Setup an SSL context 05658 */ 05659 int mbedtls_ssl_setup( mbedtls_ssl_context *ssl, 05660 const mbedtls_ssl_config *conf ) 05661 { 05662 int ret; 05663 const size_t len = MBEDTLS_SSL_BUFFER_LEN; 05664 05665 ssl->conf = conf; 05666 05667 /* 05668 * Prepare base structures 05669 */ 05670 if( ( ssl-> in_buf = mbedtls_calloc( 1, len ) ) == NULL || 05671 ( ssl->out_buf = mbedtls_calloc( 1, len ) ) == NULL ) 05672 { 05673 MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", len ) ); 05674 mbedtls_free( ssl->in_buf ); 05675 ssl->in_buf = NULL; 05676 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 05677 } 05678 05679 #if defined(MBEDTLS_SSL_PROTO_DTLS) 05680 if( conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 05681 { 05682 ssl->out_hdr = ssl->out_buf; 05683 ssl->out_ctr = ssl->out_buf + 3; 05684 ssl->out_len = ssl->out_buf + 11; 05685 ssl->out_iv = ssl->out_buf + 13; 05686 ssl->out_msg = ssl->out_buf + 13; 05687 05688 ssl->in_hdr = ssl->in_buf; 05689 ssl->in_ctr = ssl->in_buf + 3; 05690 ssl->in_len = ssl->in_buf + 11; 05691 ssl->in_iv = ssl->in_buf + 13; 05692 ssl->in_msg = ssl->in_buf + 13; 05693 } 05694 else 05695 #endif 05696 { 05697 ssl->out_ctr = ssl->out_buf; 05698 ssl->out_hdr = ssl->out_buf + 8; 05699 ssl->out_len = ssl->out_buf + 11; 05700 ssl->out_iv = ssl->out_buf + 13; 05701 ssl->out_msg = ssl->out_buf + 13; 05702 05703 ssl->in_ctr = ssl->in_buf; 05704 ssl->in_hdr = ssl->in_buf + 8; 05705 ssl->in_len = ssl->in_buf + 11; 05706 ssl->in_iv = ssl->in_buf + 13; 05707 ssl->in_msg = ssl->in_buf + 13; 05708 } 05709 05710 if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) 05711 return( ret ); 05712 05713 return( 0 ); 05714 } 05715 05716 /* 05717 * Reset an initialized and used SSL context for re-use while retaining 05718 * all application-set variables, function pointers and data. 05719 * 05720 * If partial is non-zero, keep data in the input buffer and client ID. 05721 * (Use when a DTLS client reconnects from the same port.) 05722 */ 05723 static int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial ) 05724 { 05725 int ret; 05726 05727 ssl->state = MBEDTLS_SSL_HELLO_REQUEST; 05728 05729 /* Cancel any possibly running timer */ 05730 ssl_set_timer( ssl, 0 ); 05731 05732 #if defined(MBEDTLS_SSL_RENEGOTIATION) 05733 ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE; 05734 ssl->renego_records_seen = 0; 05735 05736 ssl->verify_data_len = 0; 05737 memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN ); 05738 memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN ); 05739 #endif 05740 ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION; 05741 05742 ssl->in_offt = NULL; 05743 05744 ssl->in_msg = ssl->in_buf + 13; 05745 ssl->in_msgtype = 0; 05746 ssl->in_msglen = 0; 05747 if( partial == 0 ) 05748 ssl->in_left = 0; 05749 #if defined(MBEDTLS_SSL_PROTO_DTLS) 05750 ssl->next_record_offset = 0; 05751 ssl->in_epoch = 0; 05752 #endif 05753 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) 05754 ssl_dtls_replay_reset( ssl ); 05755 #endif 05756 05757 ssl->in_hslen = 0; 05758 ssl->nb_zero = 0; 05759 05760 ssl->keep_current_message = 0; 05761 05762 ssl->out_msg = ssl->out_buf + 13; 05763 ssl->out_msgtype = 0; 05764 ssl->out_msglen = 0; 05765 ssl->out_left = 0; 05766 #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) 05767 if( ssl->split_done != MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED ) 05768 ssl->split_done = 0; 05769 #endif 05770 05771 ssl->transform_in = NULL; 05772 ssl->transform_out = NULL; 05773 05774 memset( ssl->out_buf, 0, MBEDTLS_SSL_BUFFER_LEN ); 05775 if( partial == 0 ) 05776 memset( ssl->in_buf, 0, MBEDTLS_SSL_BUFFER_LEN ); 05777 05778 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) 05779 if( mbedtls_ssl_hw_record_reset != NULL ) 05780 { 05781 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_reset()" ) ); 05782 if( ( ret = mbedtls_ssl_hw_record_reset( ssl ) ) != 0 ) 05783 { 05784 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_reset", ret ); 05785 return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); 05786 } 05787 } 05788 #endif 05789 05790 if( ssl->transform ) 05791 { 05792 mbedtls_ssl_transform_free( ssl->transform ); 05793 mbedtls_free( ssl->transform ); 05794 ssl->transform = NULL; 05795 } 05796 05797 if( ssl->session ) 05798 { 05799 mbedtls_ssl_session_free( ssl->session ); 05800 mbedtls_free( ssl->session ); 05801 ssl->session = NULL; 05802 } 05803 05804 #if defined(MBEDTLS_SSL_ALPN) 05805 ssl->alpn_chosen = NULL; 05806 #endif 05807 05808 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) 05809 if( partial == 0 ) 05810 { 05811 mbedtls_free( ssl->cli_id ); 05812 ssl->cli_id = NULL; 05813 ssl->cli_id_len = 0; 05814 } 05815 #endif 05816 05817 if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) 05818 return( ret ); 05819 05820 return( 0 ); 05821 } 05822 05823 /* 05824 * Reset an initialized and used SSL context for re-use while retaining 05825 * all application-set variables, function pointers and data. 05826 */ 05827 int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl ) 05828 { 05829 return( ssl_session_reset_int( ssl, 0 ) ); 05830 } 05831 05832 /* 05833 * SSL set accessors 05834 */ 05835 void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint ) 05836 { 05837 conf->endpoint = endpoint; 05838 } 05839 05840 void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport ) 05841 { 05842 conf->transport = transport; 05843 } 05844 05845 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) 05846 void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode ) 05847 { 05848 conf->anti_replay = mode; 05849 } 05850 #endif 05851 05852 #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) 05853 void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit ) 05854 { 05855 conf->badmac_limit = limit; 05856 } 05857 #endif 05858 05859 #if defined(MBEDTLS_SSL_PROTO_DTLS) 05860 void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf, uint32_t min, uint32_t max ) 05861 { 05862 conf->hs_timeout_min = min; 05863 conf->hs_timeout_max = max; 05864 } 05865 #endif 05866 05867 void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode ) 05868 { 05869 conf->authmode = authmode; 05870 } 05871 05872 #if defined(MBEDTLS_X509_CRT_PARSE_C) 05873 void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf, 05874 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), 05875 void *p_vrfy ) 05876 { 05877 conf->f_vrfy = f_vrfy; 05878 conf->p_vrfy = p_vrfy; 05879 } 05880 #endif /* MBEDTLS_X509_CRT_PARSE_C */ 05881 05882 void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf, 05883 int (*f_rng)(void *, unsigned char *, size_t), 05884 void *p_rng ) 05885 { 05886 conf->f_rng = f_rng; 05887 conf->p_rng = p_rng; 05888 } 05889 05890 void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf, 05891 void (*f_dbg)(void *, int, const char *, int, const char *), 05892 void *p_dbg ) 05893 { 05894 conf->f_dbg = f_dbg; 05895 conf->p_dbg = p_dbg; 05896 } 05897 05898 void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl, 05899 void *p_bio, 05900 mbedtls_ssl_send_t *f_send, 05901 mbedtls_ssl_recv_t *f_recv, 05902 mbedtls_ssl_recv_timeout_t *f_recv_timeout ) 05903 { 05904 ssl->p_bio = p_bio; 05905 ssl->f_send = f_send; 05906 ssl->f_recv = f_recv; 05907 ssl->f_recv_timeout = f_recv_timeout; 05908 } 05909 05910 void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout ) 05911 { 05912 conf->read_timeout = timeout; 05913 } 05914 05915 void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl, 05916 void *p_timer, 05917 mbedtls_ssl_set_timer_t *f_set_timer, 05918 mbedtls_ssl_get_timer_t *f_get_timer ) 05919 { 05920 ssl->p_timer = p_timer; 05921 ssl->f_set_timer = f_set_timer; 05922 ssl->f_get_timer = f_get_timer; 05923 05924 /* Make sure we start with no timer running */ 05925 ssl_set_timer( ssl, 0 ); 05926 } 05927 05928 #if defined(MBEDTLS_SSL_SRV_C) 05929 void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf, 05930 void *p_cache, 05931 int (*f_get_cache)(void *, mbedtls_ssl_session *), 05932 int (*f_set_cache)(void *, const mbedtls_ssl_session *) ) 05933 { 05934 conf->p_cache = p_cache; 05935 conf->f_get_cache = f_get_cache; 05936 conf->f_set_cache = f_set_cache; 05937 } 05938 #endif /* MBEDTLS_SSL_SRV_C */ 05939 05940 #if defined(MBEDTLS_SSL_CLI_C) 05941 int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session ) 05942 { 05943 int ret; 05944 05945 if( ssl == NULL || 05946 session == NULL || 05947 ssl->session_negotiate == NULL || 05948 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT ) 05949 { 05950 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 05951 } 05952 05953 if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 ) 05954 return( ret ); 05955 05956 ssl->handshake->resume = 1; 05957 05958 return( 0 ); 05959 } 05960 #endif /* MBEDTLS_SSL_CLI_C */ 05961 05962 void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf, 05963 const int *ciphersuites ) 05964 { 05965 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_0] = ciphersuites; 05966 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_1] = ciphersuites; 05967 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_2] = ciphersuites; 05968 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_3] = ciphersuites; 05969 } 05970 05971 void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf, 05972 const int *ciphersuites, 05973 int major, int minor ) 05974 { 05975 if( major != MBEDTLS_SSL_MAJOR_VERSION_3 ) 05976 return; 05977 05978 if( minor < MBEDTLS_SSL_MINOR_VERSION_0 || minor > MBEDTLS_SSL_MINOR_VERSION_3 ) 05979 return; 05980 05981 conf->ciphersuite_list [minor] = ciphersuites; 05982 } 05983 05984 #if defined(MBEDTLS_X509_CRT_PARSE_C) 05985 void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf, 05986 const mbedtls_x509_crt_profile *profile ) 05987 { 05988 conf->cert_profile = profile; 05989 } 05990 05991 /* Append a new keycert entry to a (possibly empty) list */ 05992 static int ssl_append_key_cert( mbedtls_ssl_key_cert **head, 05993 mbedtls_x509_crt *cert, 05994 mbedtls_pk_context *key ) 05995 { 05996 mbedtls_ssl_key_cert *new; 05997 05998 new = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) ); 05999 if( new == NULL ) 06000 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 06001 06002 new->cert = cert; 06003 new->key = key; 06004 new->next = NULL; 06005 06006 /* Update head is the list was null, else add to the end */ 06007 if( *head == NULL ) 06008 { 06009 *head = new; 06010 } 06011 else 06012 { 06013 mbedtls_ssl_key_cert *cur = *head; 06014 while( cur->next != NULL ) 06015 cur = cur->next; 06016 cur->next = new; 06017 } 06018 06019 return( 0 ); 06020 } 06021 06022 int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf, 06023 mbedtls_x509_crt *own_cert, 06024 mbedtls_pk_context *pk_key ) 06025 { 06026 return( ssl_append_key_cert( &conf->key_cert , own_cert, pk_key ) ); 06027 } 06028 06029 void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf, 06030 mbedtls_x509_crt *ca_chain, 06031 mbedtls_x509_crl *ca_crl ) 06032 { 06033 conf->ca_chain = ca_chain; 06034 conf->ca_crl = ca_crl; 06035 } 06036 #endif /* MBEDTLS_X509_CRT_PARSE_C */ 06037 06038 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 06039 int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl, 06040 mbedtls_x509_crt *own_cert, 06041 mbedtls_pk_context *pk_key ) 06042 { 06043 return( ssl_append_key_cert( &ssl->handshake->sni_key_cert, 06044 own_cert, pk_key ) ); 06045 } 06046 06047 void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl, 06048 mbedtls_x509_crt *ca_chain, 06049 mbedtls_x509_crl *ca_crl ) 06050 { 06051 ssl->handshake->sni_ca_chain = ca_chain; 06052 ssl->handshake->sni_ca_crl = ca_crl; 06053 } 06054 06055 void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl, 06056 int authmode ) 06057 { 06058 ssl->handshake->sni_authmode = authmode; 06059 } 06060 #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ 06061 06062 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 06063 /* 06064 * Set EC J-PAKE password for current handshake 06065 */ 06066 int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl, 06067 const unsigned char *pw, 06068 size_t pw_len ) 06069 { 06070 mbedtls_ecjpake_role role; 06071 06072 if( ssl->handshake == NULL || ssl->conf == NULL ) 06073 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06074 06075 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) 06076 role = MBEDTLS_ECJPAKE_SERVER; 06077 else 06078 role = MBEDTLS_ECJPAKE_CLIENT; 06079 06080 return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx, 06081 role, 06082 MBEDTLS_MD_SHA256, 06083 MBEDTLS_ECP_DP_SECP256R1, 06084 pw, pw_len ) ); 06085 } 06086 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 06087 06088 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) 06089 int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf, 06090 const unsigned char *psk, size_t psk_len, 06091 const unsigned char *psk_identity, size_t psk_identity_len ) 06092 { 06093 if( psk == NULL || psk_identity == NULL ) 06094 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06095 06096 if( psk_len > MBEDTLS_PSK_MAX_LEN ) 06097 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06098 06099 /* Identity len will be encoded on two bytes */ 06100 if( ( psk_identity_len >> 16 ) != 0 || 06101 psk_identity_len > MBEDTLS_SSL_MAX_CONTENT_LEN ) 06102 { 06103 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06104 } 06105 06106 if( conf->psk != NULL ) 06107 { 06108 mbedtls_zeroize( conf->psk , conf->psk_len ); 06109 06110 mbedtls_free( conf->psk ); 06111 conf->psk = NULL; 06112 conf->psk_len = 0; 06113 } 06114 if( conf->psk_identity != NULL ) 06115 { 06116 mbedtls_free( conf->psk_identity ); 06117 conf->psk_identity = NULL; 06118 conf->psk_identity_len = 0; 06119 } 06120 06121 if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL || 06122 ( conf->psk_identity = mbedtls_calloc( 1, psk_identity_len ) ) == NULL ) 06123 { 06124 mbedtls_free( conf->psk ); 06125 mbedtls_free( conf->psk_identity ); 06126 conf->psk = NULL; 06127 conf->psk_identity = NULL; 06128 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 06129 } 06130 06131 conf->psk_len = psk_len; 06132 conf->psk_identity_len = psk_identity_len; 06133 06134 memcpy( conf->psk , psk, conf->psk_len ); 06135 memcpy( conf->psk_identity , psk_identity, conf->psk_identity_len ); 06136 06137 return( 0 ); 06138 } 06139 06140 int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl, 06141 const unsigned char *psk, size_t psk_len ) 06142 { 06143 if( psk == NULL || ssl->handshake == NULL ) 06144 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06145 06146 if( psk_len > MBEDTLS_PSK_MAX_LEN ) 06147 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06148 06149 if( ssl->handshake->psk != NULL ) 06150 { 06151 mbedtls_zeroize( ssl->handshake->psk, ssl->handshake->psk_len ); 06152 mbedtls_free( ssl->handshake->psk ); 06153 ssl->handshake->psk_len = 0; 06154 } 06155 06156 if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL ) 06157 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 06158 06159 ssl->handshake->psk_len = psk_len; 06160 memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len ); 06161 06162 return( 0 ); 06163 } 06164 06165 void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf, 06166 int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, 06167 size_t), 06168 void *p_psk ) 06169 { 06170 conf->f_psk = f_psk; 06171 conf->p_psk = p_psk; 06172 } 06173 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ 06174 06175 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) 06176 06177 #if !defined(MBEDTLS_DEPRECATED_REMOVED) 06178 int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G ) 06179 { 06180 int ret; 06181 06182 if( ( ret = mbedtls_mpi_read_string( &conf->dhm_P , 16, dhm_P ) ) != 0 || 06183 ( ret = mbedtls_mpi_read_string( &conf->dhm_G , 16, dhm_G ) ) != 0 ) 06184 { 06185 mbedtls_mpi_free( &conf->dhm_P ); 06186 mbedtls_mpi_free( &conf->dhm_G ); 06187 return( ret ); 06188 } 06189 06190 return( 0 ); 06191 } 06192 #endif /* MBEDTLS_DEPRECATED_REMOVED */ 06193 06194 int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf, 06195 const unsigned char *dhm_P, size_t P_len, 06196 const unsigned char *dhm_G, size_t G_len ) 06197 { 06198 int ret; 06199 06200 if( ( ret = mbedtls_mpi_read_binary( &conf->dhm_P , dhm_P, P_len ) ) != 0 || 06201 ( ret = mbedtls_mpi_read_binary( &conf->dhm_G , dhm_G, G_len ) ) != 0 ) 06202 { 06203 mbedtls_mpi_free( &conf->dhm_P ); 06204 mbedtls_mpi_free( &conf->dhm_G ); 06205 return( ret ); 06206 } 06207 06208 return( 0 ); 06209 } 06210 06211 int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx ) 06212 { 06213 int ret; 06214 06215 if( ( ret = mbedtls_mpi_copy( &conf->dhm_P , &dhm_ctx->P ) ) != 0 || 06216 ( ret = mbedtls_mpi_copy( &conf->dhm_G , &dhm_ctx->G ) ) != 0 ) 06217 { 06218 mbedtls_mpi_free( &conf->dhm_P ); 06219 mbedtls_mpi_free( &conf->dhm_G ); 06220 return( ret ); 06221 } 06222 06223 return( 0 ); 06224 } 06225 #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */ 06226 06227 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) 06228 /* 06229 * Set the minimum length for Diffie-Hellman parameters 06230 */ 06231 void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf, 06232 unsigned int bitlen ) 06233 { 06234 conf->dhm_min_bitlen = bitlen; 06235 } 06236 #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ 06237 06238 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 06239 /* 06240 * Set allowed/preferred hashes for handshake signatures 06241 */ 06242 void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf, 06243 const int *hashes ) 06244 { 06245 conf->sig_hashes = hashes; 06246 } 06247 #endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ 06248 06249 #if defined(MBEDTLS_ECP_C) 06250 /* 06251 * Set the allowed elliptic curves 06252 */ 06253 void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf, 06254 const mbedtls_ecp_group_id *curve_list ) 06255 { 06256 conf->curve_list = curve_list; 06257 } 06258 #endif /* MBEDTLS_ECP_C */ 06259 06260 #if defined(MBEDTLS_X509_CRT_PARSE_C) 06261 int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname ) 06262 { 06263 /* Initialize to suppress unnecessary compiler warning */ 06264 size_t hostname_len = 0; 06265 06266 /* Check if new hostname is valid before 06267 * making any change to current one */ 06268 if( hostname != NULL ) 06269 { 06270 hostname_len = strlen( hostname ); 06271 06272 if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN ) 06273 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06274 } 06275 06276 /* Now it's clear that we will overwrite the old hostname, 06277 * so we can free it safely */ 06278 06279 if( ssl->hostname != NULL ) 06280 { 06281 mbedtls_zeroize( ssl->hostname, strlen( ssl->hostname ) ); 06282 mbedtls_free( ssl->hostname ); 06283 } 06284 06285 /* Passing NULL as hostname shall clear the old one */ 06286 06287 if( hostname == NULL ) 06288 { 06289 ssl->hostname = NULL; 06290 } 06291 else 06292 { 06293 ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 ); 06294 if( ssl->hostname == NULL ) 06295 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 06296 06297 memcpy( ssl->hostname, hostname, hostname_len ); 06298 06299 ssl->hostname[hostname_len] = '\0'; 06300 } 06301 06302 return( 0 ); 06303 } 06304 #endif /* MBEDTLS_X509_CRT_PARSE_C */ 06305 06306 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 06307 void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf, 06308 int (*f_sni)(void *, mbedtls_ssl_context *, 06309 const unsigned char *, size_t), 06310 void *p_sni ) 06311 { 06312 conf->f_sni = f_sni; 06313 conf->p_sni = p_sni; 06314 } 06315 #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ 06316 06317 #if defined(MBEDTLS_SSL_ALPN) 06318 int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos ) 06319 { 06320 size_t cur_len, tot_len; 06321 const char **p; 06322 06323 /* 06324 * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings 06325 * MUST NOT be truncated." 06326 * We check lengths now rather than later. 06327 */ 06328 tot_len = 0; 06329 for( p = protos; *p != NULL; p++ ) 06330 { 06331 cur_len = strlen( *p ); 06332 tot_len += cur_len; 06333 06334 if( cur_len == 0 || cur_len > 255 || tot_len > 65535 ) 06335 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06336 } 06337 06338 conf->alpn_list = protos; 06339 06340 return( 0 ); 06341 } 06342 06343 const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl ) 06344 { 06345 return( ssl->alpn_chosen ); 06346 } 06347 #endif /* MBEDTLS_SSL_ALPN */ 06348 06349 void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor ) 06350 { 06351 conf->max_major_ver = major; 06352 conf->max_minor_ver = minor; 06353 } 06354 06355 void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor ) 06356 { 06357 conf->min_major_ver = major; 06358 conf->min_minor_ver = minor; 06359 } 06360 06361 #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) 06362 void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback ) 06363 { 06364 conf->fallback = fallback; 06365 } 06366 #endif 06367 06368 #if defined(MBEDTLS_SSL_SRV_C) 06369 void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf, 06370 char cert_req_ca_list ) 06371 { 06372 conf->cert_req_ca_list = cert_req_ca_list; 06373 } 06374 #endif 06375 06376 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 06377 void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm ) 06378 { 06379 conf->encrypt_then_mac = etm; 06380 } 06381 #endif 06382 06383 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) 06384 void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems ) 06385 { 06386 conf->extended_ms = ems; 06387 } 06388 #endif 06389 06390 #if defined(MBEDTLS_ARC4_C) 06391 void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 ) 06392 { 06393 conf->arc4_disabled = arc4; 06394 } 06395 #endif 06396 06397 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) 06398 int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code ) 06399 { 06400 if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID || 06401 mfl_code_to_length[mfl_code] > MBEDTLS_SSL_MAX_CONTENT_LEN ) 06402 { 06403 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06404 } 06405 06406 conf->mfl_code = mfl_code; 06407 06408 return( 0 ); 06409 } 06410 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ 06411 06412 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) 06413 void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate ) 06414 { 06415 conf->trunc_hmac = truncate; 06416 } 06417 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ 06418 06419 #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) 06420 void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split ) 06421 { 06422 conf->cbc_record_splitting = split; 06423 } 06424 #endif 06425 06426 void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy ) 06427 { 06428 conf->allow_legacy_renegotiation = allow_legacy; 06429 } 06430 06431 #if defined(MBEDTLS_SSL_RENEGOTIATION) 06432 void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation ) 06433 { 06434 conf->disable_renegotiation = renegotiation; 06435 } 06436 06437 void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records ) 06438 { 06439 conf->renego_max_records = max_records; 06440 } 06441 06442 void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf, 06443 const unsigned char period[8] ) 06444 { 06445 memcpy( conf->renego_period , period, 8 ); 06446 } 06447 #endif /* MBEDTLS_SSL_RENEGOTIATION */ 06448 06449 #if defined(MBEDTLS_SSL_SESSION_TICKETS) 06450 #if defined(MBEDTLS_SSL_CLI_C) 06451 void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets ) 06452 { 06453 conf->session_tickets = use_tickets; 06454 } 06455 #endif 06456 06457 #if defined(MBEDTLS_SSL_SRV_C) 06458 void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf, 06459 mbedtls_ssl_ticket_write_t *f_ticket_write, 06460 mbedtls_ssl_ticket_parse_t *f_ticket_parse, 06461 void *p_ticket ) 06462 { 06463 conf->f_ticket_write = f_ticket_write; 06464 conf->f_ticket_parse = f_ticket_parse; 06465 conf->p_ticket = p_ticket; 06466 } 06467 #endif 06468 #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 06469 06470 #if defined(MBEDTLS_SSL_EXPORT_KEYS) 06471 void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf, 06472 mbedtls_ssl_export_keys_t *f_export_keys, 06473 void *p_export_keys ) 06474 { 06475 conf->f_export_keys = f_export_keys; 06476 conf->p_export_keys = p_export_keys; 06477 } 06478 #endif 06479 06480 /* 06481 * SSL get accessors 06482 */ 06483 size_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl ) 06484 { 06485 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen ); 06486 } 06487 06488 uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl ) 06489 { 06490 if( ssl->session != NULL ) 06491 return( ssl->session->verify_result ); 06492 06493 if( ssl->session_negotiate != NULL ) 06494 return( ssl->session_negotiate->verify_result ); 06495 06496 return( 0xFFFFFFFF ); 06497 } 06498 06499 const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl ) 06500 { 06501 if( ssl == NULL || ssl->session == NULL ) 06502 return( NULL ); 06503 06504 return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite ); 06505 } 06506 06507 const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl ) 06508 { 06509 #if defined(MBEDTLS_SSL_PROTO_DTLS) 06510 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 06511 { 06512 switch( ssl->minor_ver ) 06513 { 06514 case MBEDTLS_SSL_MINOR_VERSION_2: 06515 return( "DTLSv1.0" ); 06516 06517 case MBEDTLS_SSL_MINOR_VERSION_3: 06518 return( "DTLSv1.2" ); 06519 06520 default: 06521 return( "unknown (DTLS)" ); 06522 } 06523 } 06524 #endif 06525 06526 switch( ssl->minor_ver ) 06527 { 06528 case MBEDTLS_SSL_MINOR_VERSION_0: 06529 return( "SSLv3.0" ); 06530 06531 case MBEDTLS_SSL_MINOR_VERSION_1: 06532 return( "TLSv1.0" ); 06533 06534 case MBEDTLS_SSL_MINOR_VERSION_2: 06535 return( "TLSv1.1" ); 06536 06537 case MBEDTLS_SSL_MINOR_VERSION_3: 06538 return( "TLSv1.2" ); 06539 06540 default: 06541 return( "unknown" ); 06542 } 06543 } 06544 06545 int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl ) 06546 { 06547 size_t transform_expansion; 06548 const mbedtls_ssl_transform *transform = ssl->transform_out; 06549 06550 #if defined(MBEDTLS_ZLIB_SUPPORT) 06551 if( ssl->session_out->compression != MBEDTLS_SSL_COMPRESS_NULL ) 06552 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); 06553 #endif 06554 06555 if( transform == NULL ) 06556 return( (int) mbedtls_ssl_hdr_len( ssl ) ); 06557 06558 switch( mbedtls_cipher_get_cipher_mode( &transform->cipher_ctx_enc ) ) 06559 { 06560 case MBEDTLS_MODE_GCM: 06561 case MBEDTLS_MODE_CCM: 06562 case MBEDTLS_MODE_STREAM: 06563 transform_expansion = transform->minlen; 06564 break; 06565 06566 case MBEDTLS_MODE_CBC: 06567 transform_expansion = transform->maclen 06568 + mbedtls_cipher_get_block_size( &transform->cipher_ctx_enc ); 06569 break; 06570 06571 default: 06572 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 06573 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 06574 } 06575 06576 return( (int)( mbedtls_ssl_hdr_len( ssl ) + transform_expansion ) ); 06577 } 06578 06579 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) 06580 size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl ) 06581 { 06582 size_t max_len; 06583 06584 /* 06585 * Assume mfl_code is correct since it was checked when set 06586 */ 06587 max_len = mfl_code_to_length[ssl->conf->mfl_code]; 06588 06589 /* 06590 * Check if a smaller max length was negotiated 06591 */ 06592 if( ssl->session_out != NULL && 06593 mfl_code_to_length[ssl->session_out->mfl_code] < max_len ) 06594 { 06595 max_len = mfl_code_to_length[ssl->session_out->mfl_code]; 06596 } 06597 06598 return max_len; 06599 } 06600 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ 06601 06602 #if defined(MBEDTLS_X509_CRT_PARSE_C) 06603 const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl ) 06604 { 06605 if( ssl == NULL || ssl->session == NULL ) 06606 return( NULL ); 06607 06608 return( ssl->session->peer_cert ); 06609 } 06610 #endif /* MBEDTLS_X509_CRT_PARSE_C */ 06611 06612 #if defined(MBEDTLS_SSL_CLI_C) 06613 int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *dst ) 06614 { 06615 if( ssl == NULL || 06616 dst == NULL || 06617 ssl->session == NULL || 06618 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT ) 06619 { 06620 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06621 } 06622 06623 return( ssl_session_copy( dst, ssl->session ) ); 06624 } 06625 #endif /* MBEDTLS_SSL_CLI_C */ 06626 06627 /* 06628 * Perform a single step of the SSL handshake 06629 */ 06630 int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl ) 06631 { 06632 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; 06633 06634 if( ssl == NULL || ssl->conf == NULL ) 06635 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06636 06637 #if defined(MBEDTLS_SSL_CLI_C) 06638 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) 06639 ret = mbedtls_ssl_handshake_client_step( ssl ); 06640 #endif 06641 #if defined(MBEDTLS_SSL_SRV_C) 06642 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) 06643 ret = mbedtls_ssl_handshake_server_step( ssl ); 06644 #endif 06645 06646 return( ret ); 06647 } 06648 06649 /* 06650 * Perform the SSL handshake 06651 */ 06652 int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl ) 06653 { 06654 int ret = 0; 06655 06656 if( ssl == NULL || ssl->conf == NULL ) 06657 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06658 06659 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> handshake" ) ); 06660 06661 while( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) 06662 { 06663 ret = mbedtls_ssl_handshake_step( ssl ); 06664 06665 if( ret != 0 ) 06666 break; 06667 } 06668 06669 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= handshake" ) ); 06670 06671 return( ret ); 06672 } 06673 06674 #if defined(MBEDTLS_SSL_RENEGOTIATION) 06675 #if defined(MBEDTLS_SSL_SRV_C) 06676 /* 06677 * Write HelloRequest to request renegotiation on server 06678 */ 06679 static int ssl_write_hello_request( mbedtls_ssl_context *ssl ) 06680 { 06681 int ret; 06682 06683 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello request" ) ); 06684 06685 ssl->out_msglen = 4; 06686 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; 06687 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST; 06688 06689 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 06690 { 06691 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 06692 return( ret ); 06693 } 06694 06695 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello request" ) ); 06696 06697 return( 0 ); 06698 } 06699 #endif /* MBEDTLS_SSL_SRV_C */ 06700 06701 /* 06702 * Actually renegotiate current connection, triggered by either: 06703 * - any side: calling mbedtls_ssl_renegotiate(), 06704 * - client: receiving a HelloRequest during mbedtls_ssl_read(), 06705 * - server: receiving any handshake message on server during mbedtls_ssl_read() after 06706 * the initial handshake is completed. 06707 * If the handshake doesn't complete due to waiting for I/O, it will continue 06708 * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively. 06709 */ 06710 static int ssl_start_renegotiation( mbedtls_ssl_context *ssl ) 06711 { 06712 int ret; 06713 06714 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) ); 06715 06716 if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) 06717 return( ret ); 06718 06719 /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and 06720 * the ServerHello will have message_seq = 1" */ 06721 #if defined(MBEDTLS_SSL_PROTO_DTLS) 06722 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 06723 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) 06724 { 06725 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) 06726 ssl->handshake->out_msg_seq = 1; 06727 else 06728 ssl->handshake->in_msg_seq = 1; 06729 } 06730 #endif 06731 06732 ssl->state = MBEDTLS_SSL_HELLO_REQUEST; 06733 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS; 06734 06735 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 ) 06736 { 06737 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); 06738 return( ret ); 06739 } 06740 06741 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) ); 06742 06743 return( 0 ); 06744 } 06745 06746 /* 06747 * Renegotiate current connection on client, 06748 * or request renegotiation on server 06749 */ 06750 int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl ) 06751 { 06752 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; 06753 06754 if( ssl == NULL || ssl->conf == NULL ) 06755 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06756 06757 #if defined(MBEDTLS_SSL_SRV_C) 06758 /* On server, just send the request */ 06759 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) 06760 { 06761 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) 06762 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06763 06764 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING; 06765 06766 /* Did we already try/start sending HelloRequest? */ 06767 if( ssl->out_left != 0 ) 06768 return( mbedtls_ssl_flush_output( ssl ) ); 06769 06770 return( ssl_write_hello_request( ssl ) ); 06771 } 06772 #endif /* MBEDTLS_SSL_SRV_C */ 06773 06774 #if defined(MBEDTLS_SSL_CLI_C) 06775 /* 06776 * On client, either start the renegotiation process or, 06777 * if already in progress, continue the handshake 06778 */ 06779 if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) 06780 { 06781 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) 06782 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06783 06784 if( ( ret = ssl_start_renegotiation( ssl ) ) != 0 ) 06785 { 06786 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret ); 06787 return( ret ); 06788 } 06789 } 06790 else 06791 { 06792 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 ) 06793 { 06794 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); 06795 return( ret ); 06796 } 06797 } 06798 #endif /* MBEDTLS_SSL_CLI_C */ 06799 06800 return( ret ); 06801 } 06802 06803 /* 06804 * Check record counters and renegotiate if they're above the limit. 06805 */ 06806 static int ssl_check_ctr_renegotiate( mbedtls_ssl_context *ssl ) 06807 { 06808 size_t ep_len = ssl_ep_len( ssl ); 06809 int in_ctr_cmp; 06810 int out_ctr_cmp; 06811 06812 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER || 06813 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING || 06814 ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED ) 06815 { 06816 return( 0 ); 06817 } 06818 06819 in_ctr_cmp = memcmp( ssl->in_ctr + ep_len, 06820 ssl->conf->renego_period + ep_len, 8 - ep_len ); 06821 out_ctr_cmp = memcmp( ssl->out_ctr + ep_len, 06822 ssl->conf->renego_period + ep_len, 8 - ep_len ); 06823 06824 if( in_ctr_cmp <= 0 && out_ctr_cmp <= 0 ) 06825 { 06826 return( 0 ); 06827 } 06828 06829 MBEDTLS_SSL_DEBUG_MSG( 1, ( "record counter limit reached: renegotiate" ) ); 06830 return( mbedtls_ssl_renegotiate( ssl ) ); 06831 } 06832 #endif /* MBEDTLS_SSL_RENEGOTIATION */ 06833 06834 /* 06835 * Receive application data decrypted from the SSL layer 06836 */ 06837 int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len ) 06838 { 06839 int ret; 06840 size_t n; 06841 06842 if( ssl == NULL || ssl->conf == NULL ) 06843 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 06844 06845 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> read" ) ); 06846 06847 #if defined(MBEDTLS_SSL_PROTO_DTLS) 06848 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 06849 { 06850 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) 06851 return( ret ); 06852 06853 if( ssl->handshake != NULL && 06854 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) 06855 { 06856 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 ) 06857 return( ret ); 06858 } 06859 } 06860 #endif 06861 06862 /* 06863 * Check if renegotiation is necessary and/or handshake is 06864 * in process. If yes, perform/continue, and fall through 06865 * if an unexpected packet is received while the client 06866 * is waiting for the ServerHello. 06867 * 06868 * (There is no equivalent to the last condition on 06869 * the server-side as it is not treated as within 06870 * a handshake while waiting for the ClientHello 06871 * after a renegotiation request.) 06872 */ 06873 06874 #if defined(MBEDTLS_SSL_RENEGOTIATION) 06875 ret = ssl_check_ctr_renegotiate( ssl ); 06876 if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && 06877 ret != 0 ) 06878 { 06879 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_check_ctr_renegotiate", ret ); 06880 return( ret ); 06881 } 06882 #endif 06883 06884 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) 06885 { 06886 ret = mbedtls_ssl_handshake( ssl ); 06887 if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && 06888 ret != 0 ) 06889 { 06890 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); 06891 return( ret ); 06892 } 06893 } 06894 06895 /* 06896 * TODO 06897 * 06898 * The logic should be streamlined here: 06899 * 06900 * Instead of 06901 * 06902 * - Manually checking whether ssl->in_offt is NULL 06903 * - Fetching a new record if yes 06904 * - Setting ssl->in_offt if one finds an application record 06905 * - Resetting keep_current_message after handling the application data 06906 * 06907 * one should 06908 * 06909 * - Adapt read_record to set ssl->in_offt automatically 06910 * when a new application data record is processed. 06911 * - Always call mbedtls_ssl_read_record here. 06912 * 06913 * This way, the logic of ssl_read would be much clearer: 06914 * 06915 * (1) Always call record layer and see what kind of record is on 06916 * and have it ready for consumption (in particular, in_offt 06917 * properly set for application data records). 06918 * (2) If it's application data (either freshly fetched 06919 * or something already being partially processed), 06920 * serve the read request from it. 06921 * (3) If it's something different from application data, 06922 * handle it accordingly, e.g. potentially start a 06923 * renegotiation. 06924 * 06925 * This will also remove the need to manually reset 06926 * ssl->keep_current_message = 0 below. 06927 * 06928 */ 06929 06930 if( ssl->in_offt == NULL ) 06931 { 06932 /* Start timer if not already running */ 06933 if( ssl->f_get_timer != NULL && 06934 ssl->f_get_timer( ssl->p_timer ) == -1 ) 06935 { 06936 ssl_set_timer( ssl, ssl->conf->read_timeout ); 06937 } 06938 06939 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 ) 06940 { 06941 if( ret == MBEDTLS_ERR_SSL_CONN_EOF ) 06942 return( 0 ); 06943 06944 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); 06945 return( ret ); 06946 } 06947 06948 if( ssl->in_msglen == 0 && 06949 ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA ) 06950 { 06951 /* 06952 * OpenSSL sends empty messages to randomize the IV 06953 */ 06954 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 ) 06955 { 06956 if( ret == MBEDTLS_ERR_SSL_CONN_EOF ) 06957 return( 0 ); 06958 06959 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); 06960 return( ret ); 06961 } 06962 } 06963 06964 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) 06965 { 06966 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received handshake message" ) ); 06967 06968 /* 06969 * - For client-side, expect SERVER_HELLO_REQUEST. 06970 * - For server-side, expect CLIENT_HELLO. 06971 * - Fail (TLS) or silently drop record (DTLS) in other cases. 06972 */ 06973 06974 #if defined(MBEDTLS_SSL_CLI_C) 06975 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && 06976 ( ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST || 06977 ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ) ) 06978 { 06979 MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) ); 06980 06981 /* With DTLS, drop the packet (probably from last handshake) */ 06982 #if defined(MBEDTLS_SSL_PROTO_DTLS) 06983 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 06984 return( MBEDTLS_ERR_SSL_WANT_READ ); 06985 #endif 06986 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); 06987 } 06988 #endif /* MBEDTLS_SSL_CLI_C */ 06989 06990 #if defined(MBEDTLS_SSL_SRV_C) 06991 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && 06992 ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO ) 06993 { 06994 MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not ClientHello)" ) ); 06995 06996 /* With DTLS, drop the packet (probably from last handshake) */ 06997 #if defined(MBEDTLS_SSL_PROTO_DTLS) 06998 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 06999 return( MBEDTLS_ERR_SSL_WANT_READ ); 07000 #endif 07001 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); 07002 } 07003 #endif /* MBEDTLS_SSL_SRV_C */ 07004 07005 #if defined(MBEDTLS_SSL_RENEGOTIATION) 07006 /* Determine whether renegotiation attempt should be accepted */ 07007 if( ! ( ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED || 07008 ( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && 07009 ssl->conf->allow_legacy_renegotiation == 07010 MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) ) ) 07011 { 07012 /* 07013 * Accept renegotiation request 07014 */ 07015 07016 /* DTLS clients need to know renego is server-initiated */ 07017 #if defined(MBEDTLS_SSL_PROTO_DTLS) 07018 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 07019 ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) 07020 { 07021 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING; 07022 } 07023 #endif 07024 ret = ssl_start_renegotiation( ssl ); 07025 if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && 07026 ret != 0 ) 07027 { 07028 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret ); 07029 return( ret ); 07030 } 07031 } 07032 else 07033 #endif /* MBEDTLS_SSL_RENEGOTIATION */ 07034 { 07035 /* 07036 * Refuse renegotiation 07037 */ 07038 07039 MBEDTLS_SSL_DEBUG_MSG( 3, ( "refusing renegotiation, sending alert" ) ); 07040 07041 #if defined(MBEDTLS_SSL_PROTO_SSL3) 07042 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 07043 { 07044 /* SSLv3 does not have a "no_renegotiation" warning, so 07045 we send a fatal alert and abort the connection. */ 07046 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 07047 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); 07048 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); 07049 } 07050 else 07051 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ 07052 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ 07053 defined(MBEDTLS_SSL_PROTO_TLS1_2) 07054 if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 ) 07055 { 07056 if( ( ret = mbedtls_ssl_send_alert_message( ssl, 07057 MBEDTLS_SSL_ALERT_LEVEL_WARNING, 07058 MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 ) 07059 { 07060 return( ret ); 07061 } 07062 } 07063 else 07064 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || 07065 MBEDTLS_SSL_PROTO_TLS1_2 */ 07066 { 07067 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 07068 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 07069 } 07070 } 07071 07072 return( MBEDTLS_ERR_SSL_WANT_READ ); 07073 } 07074 #if defined(MBEDTLS_SSL_RENEGOTIATION) 07075 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) 07076 { 07077 if( ssl->conf->renego_max_records >= 0 ) 07078 { 07079 if( ++ssl->renego_records_seen > ssl->conf->renego_max_records ) 07080 { 07081 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, " 07082 "but not honored by client" ) ); 07083 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); 07084 } 07085 } 07086 } 07087 #endif /* MBEDTLS_SSL_RENEGOTIATION */ 07088 07089 /* Fatal and closure alerts handled by mbedtls_ssl_read_record() */ 07090 if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT ) 07091 { 07092 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ignoring non-fatal non-closure alert" ) ); 07093 return( MBEDTLS_ERR_SSL_WANT_READ ); 07094 } 07095 07096 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA ) 07097 { 07098 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad application data message" ) ); 07099 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); 07100 } 07101 07102 ssl->in_offt = ssl->in_msg; 07103 07104 /* We're going to return something now, cancel timer, 07105 * except if handshake (renegotiation) is in progress */ 07106 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) 07107 ssl_set_timer( ssl, 0 ); 07108 07109 #if defined(MBEDTLS_SSL_PROTO_DTLS) 07110 /* If we requested renego but received AppData, resend HelloRequest. 07111 * Do it now, after setting in_offt, to avoid taking this branch 07112 * again if ssl_write_hello_request() returns WANT_WRITE */ 07113 #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) 07114 if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && 07115 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) 07116 { 07117 if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 ) 07118 { 07119 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_resend_hello_request", ret ); 07120 return( ret ); 07121 } 07122 } 07123 #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ 07124 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 07125 } 07126 07127 n = ( len < ssl->in_msglen ) 07128 ? len : ssl->in_msglen; 07129 07130 memcpy( buf, ssl->in_offt, n ); 07131 ssl->in_msglen -= n; 07132 07133 if( ssl->in_msglen == 0 ) 07134 { 07135 /* all bytes consumed */ 07136 ssl->in_offt = NULL; 07137 ssl->keep_current_message = 0; 07138 } 07139 else 07140 { 07141 /* more data available */ 07142 ssl->in_offt += n; 07143 } 07144 07145 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= read" ) ); 07146 07147 return( (int) n ); 07148 } 07149 07150 /* 07151 * Send application data to be encrypted by the SSL layer, 07152 * taking care of max fragment length and buffer size 07153 */ 07154 static int ssl_write_real( mbedtls_ssl_context *ssl, 07155 const unsigned char *buf, size_t len ) 07156 { 07157 int ret; 07158 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) 07159 size_t max_len = mbedtls_ssl_get_max_frag_len( ssl ); 07160 #else 07161 size_t max_len = MBEDTLS_SSL_MAX_CONTENT_LEN; 07162 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ 07163 if( len > max_len ) 07164 { 07165 #if defined(MBEDTLS_SSL_PROTO_DTLS) 07166 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 07167 { 07168 MBEDTLS_SSL_DEBUG_MSG( 1, ( "fragment larger than the (negotiated) " 07169 "maximum fragment length: %d > %d", 07170 len, max_len ) ); 07171 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 07172 } 07173 else 07174 #endif 07175 len = max_len; 07176 } 07177 07178 if( ssl->out_left != 0 ) 07179 { 07180 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) 07181 { 07182 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flush_output", ret ); 07183 return( ret ); 07184 } 07185 } 07186 else 07187 { 07188 ssl->out_msglen = len; 07189 ssl->out_msgtype = MBEDTLS_SSL_MSG_APPLICATION_DATA; 07190 memcpy( ssl->out_msg, buf, len ); 07191 07192 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 07193 { 07194 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 07195 return( ret ); 07196 } 07197 } 07198 07199 return( (int) len ); 07200 } 07201 07202 /* 07203 * Write application data, doing 1/n-1 splitting if necessary. 07204 * 07205 * With non-blocking I/O, ssl_write_real() may return WANT_WRITE, 07206 * then the caller will call us again with the same arguments, so 07207 * remember whether we already did the split or not. 07208 */ 07209 #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) 07210 static int ssl_write_split( mbedtls_ssl_context *ssl, 07211 const unsigned char *buf, size_t len ) 07212 { 07213 int ret; 07214 07215 if( ssl->conf->cbc_record_splitting == 07216 MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED || 07217 len <= 1 || 07218 ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_1 || 07219 mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc ) 07220 != MBEDTLS_MODE_CBC ) 07221 { 07222 return( ssl_write_real( ssl, buf, len ) ); 07223 } 07224 07225 if( ssl->split_done == 0 ) 07226 { 07227 if( ( ret = ssl_write_real( ssl, buf, 1 ) ) <= 0 ) 07228 return( ret ); 07229 ssl->split_done = 1; 07230 } 07231 07232 if( ( ret = ssl_write_real( ssl, buf + 1, len - 1 ) ) <= 0 ) 07233 return( ret ); 07234 ssl->split_done = 0; 07235 07236 return( ret + 1 ); 07237 } 07238 #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ 07239 07240 /* 07241 * Write application data (public-facing wrapper) 07242 */ 07243 int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) 07244 { 07245 int ret; 07246 07247 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write" ) ); 07248 07249 if( ssl == NULL || ssl->conf == NULL ) 07250 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 07251 07252 #if defined(MBEDTLS_SSL_RENEGOTIATION) 07253 if( ( ret = ssl_check_ctr_renegotiate( ssl ) ) != 0 ) 07254 { 07255 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_check_ctr_renegotiate", ret ); 07256 return( ret ); 07257 } 07258 #endif 07259 07260 if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) 07261 { 07262 if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 ) 07263 { 07264 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); 07265 return( ret ); 07266 } 07267 } 07268 07269 #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) 07270 ret = ssl_write_split( ssl, buf, len ); 07271 #else 07272 ret = ssl_write_real( ssl, buf, len ); 07273 #endif 07274 07275 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write" ) ); 07276 07277 return( ret ); 07278 } 07279 07280 /* 07281 * Notify the peer that the connection is being closed 07282 */ 07283 int mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl ) 07284 { 07285 int ret; 07286 07287 if( ssl == NULL || ssl->conf == NULL ) 07288 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 07289 07290 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write close notify" ) ); 07291 07292 if( ssl->out_left != 0 ) 07293 return( mbedtls_ssl_flush_output( ssl ) ); 07294 07295 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) 07296 { 07297 if( ( ret = mbedtls_ssl_send_alert_message( ssl, 07298 MBEDTLS_SSL_ALERT_LEVEL_WARNING, 07299 MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 ) 07300 { 07301 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_send_alert_message", ret ); 07302 return( ret ); 07303 } 07304 } 07305 07306 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write close notify" ) ); 07307 07308 return( 0 ); 07309 } 07310 07311 void mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform ) 07312 { 07313 if( transform == NULL ) 07314 return; 07315 07316 #if defined(MBEDTLS_ZLIB_SUPPORT) 07317 deflateEnd( &transform->ctx_deflate ); 07318 inflateEnd( &transform->ctx_inflate ); 07319 #endif 07320 07321 mbedtls_cipher_free( &transform->cipher_ctx_enc ); 07322 mbedtls_cipher_free( &transform->cipher_ctx_dec ); 07323 07324 mbedtls_md_free( &transform->md_ctx_enc ); 07325 mbedtls_md_free( &transform->md_ctx_dec ); 07326 07327 mbedtls_zeroize( transform, sizeof( mbedtls_ssl_transform ) ); 07328 } 07329 07330 #if defined(MBEDTLS_X509_CRT_PARSE_C) 07331 static void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert ) 07332 { 07333 mbedtls_ssl_key_cert *cur = key_cert, *next; 07334 07335 while( cur != NULL ) 07336 { 07337 next = cur->next; 07338 mbedtls_free( cur ); 07339 cur = next; 07340 } 07341 } 07342 #endif /* MBEDTLS_X509_CRT_PARSE_C */ 07343 07344 void mbedtls_ssl_handshake_free( mbedtls_ssl_handshake_params *handshake ) 07345 { 07346 if( handshake == NULL ) 07347 return; 07348 07349 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 07350 defined(MBEDTLS_SSL_PROTO_TLS1_1) 07351 mbedtls_md5_free( &handshake->fin_md5 ); 07352 mbedtls_sha1_free( &handshake->fin_sha1 ); 07353 #endif 07354 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 07355 #if defined(MBEDTLS_SHA256_C) 07356 mbedtls_sha256_free( &handshake->fin_sha256 ); 07357 #endif 07358 #if defined(MBEDTLS_SHA512_C) 07359 mbedtls_sha512_free( &handshake->fin_sha512 ); 07360 #endif 07361 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 07362 07363 #if defined(MBEDTLS_DHM_C) 07364 mbedtls_dhm_free( &handshake->dhm_ctx ); 07365 #endif 07366 #if defined(MBEDTLS_ECDH_C) 07367 mbedtls_ecdh_free( &handshake->ecdh_ctx ); 07368 #endif 07369 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 07370 mbedtls_ecjpake_free( &handshake->ecjpake_ctx ); 07371 #if defined(MBEDTLS_SSL_CLI_C) 07372 mbedtls_free( handshake->ecjpake_cache ); 07373 handshake->ecjpake_cache = NULL; 07374 handshake->ecjpake_cache_len = 0; 07375 #endif 07376 #endif 07377 07378 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ 07379 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 07380 /* explicit void pointer cast for buggy MS compiler */ 07381 mbedtls_free( (void *) handshake->curves ); 07382 #endif 07383 07384 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) 07385 if( handshake->psk != NULL ) 07386 { 07387 mbedtls_zeroize( handshake->psk, handshake->psk_len ); 07388 mbedtls_free( handshake->psk ); 07389 } 07390 #endif 07391 07392 #if defined(MBEDTLS_X509_CRT_PARSE_C) && \ 07393 defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 07394 /* 07395 * Free only the linked list wrapper, not the keys themselves 07396 * since the belong to the SNI callback 07397 */ 07398 if( handshake->sni_key_cert != NULL ) 07399 { 07400 mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next; 07401 07402 while( cur != NULL ) 07403 { 07404 next = cur->next; 07405 mbedtls_free( cur ); 07406 cur = next; 07407 } 07408 } 07409 #endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */ 07410 07411 #if defined(MBEDTLS_SSL_PROTO_DTLS) 07412 mbedtls_free( handshake->verify_cookie ); 07413 mbedtls_free( handshake->hs_msg ); 07414 ssl_flight_free( handshake->flight ); 07415 #endif 07416 07417 mbedtls_zeroize( handshake, sizeof( mbedtls_ssl_handshake_params ) ); 07418 } 07419 07420 void mbedtls_ssl_session_free( mbedtls_ssl_session *session ) 07421 { 07422 if( session == NULL ) 07423 return; 07424 07425 #if defined(MBEDTLS_X509_CRT_PARSE_C) 07426 if( session->peer_cert != NULL ) 07427 { 07428 mbedtls_x509_crt_free( session->peer_cert ); 07429 mbedtls_free( session->peer_cert ); 07430 } 07431 #endif 07432 07433 #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) 07434 mbedtls_free( session->ticket ); 07435 #endif 07436 07437 mbedtls_zeroize( session, sizeof( mbedtls_ssl_session ) ); 07438 } 07439 07440 /* 07441 * Free an SSL context 07442 */ 07443 void mbedtls_ssl_free( mbedtls_ssl_context *ssl ) 07444 { 07445 if( ssl == NULL ) 07446 return; 07447 07448 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> free" ) ); 07449 07450 if( ssl->out_buf != NULL ) 07451 { 07452 mbedtls_zeroize( ssl->out_buf, MBEDTLS_SSL_BUFFER_LEN ); 07453 mbedtls_free( ssl->out_buf ); 07454 } 07455 07456 if( ssl->in_buf != NULL ) 07457 { 07458 mbedtls_zeroize( ssl->in_buf, MBEDTLS_SSL_BUFFER_LEN ); 07459 mbedtls_free( ssl->in_buf ); 07460 } 07461 07462 #if defined(MBEDTLS_ZLIB_SUPPORT) 07463 if( ssl->compress_buf != NULL ) 07464 { 07465 mbedtls_zeroize( ssl->compress_buf, MBEDTLS_SSL_BUFFER_LEN ); 07466 mbedtls_free( ssl->compress_buf ); 07467 } 07468 #endif 07469 07470 if( ssl->transform ) 07471 { 07472 mbedtls_ssl_transform_free( ssl->transform ); 07473 mbedtls_free( ssl->transform ); 07474 } 07475 07476 if( ssl->handshake ) 07477 { 07478 mbedtls_ssl_handshake_free( ssl->handshake ); 07479 mbedtls_ssl_transform_free( ssl->transform_negotiate ); 07480 mbedtls_ssl_session_free( ssl->session_negotiate ); 07481 07482 mbedtls_free( ssl->handshake ); 07483 mbedtls_free( ssl->transform_negotiate ); 07484 mbedtls_free( ssl->session_negotiate ); 07485 } 07486 07487 if( ssl->session ) 07488 { 07489 mbedtls_ssl_session_free( ssl->session ); 07490 mbedtls_free( ssl->session ); 07491 } 07492 07493 #if defined(MBEDTLS_X509_CRT_PARSE_C) 07494 if( ssl->hostname != NULL ) 07495 { 07496 mbedtls_zeroize( ssl->hostname, strlen( ssl->hostname ) ); 07497 mbedtls_free( ssl->hostname ); 07498 } 07499 #endif 07500 07501 #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) 07502 if( mbedtls_ssl_hw_record_finish != NULL ) 07503 { 07504 MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_finish()" ) ); 07505 mbedtls_ssl_hw_record_finish( ssl ); 07506 } 07507 #endif 07508 07509 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) 07510 mbedtls_free( ssl->cli_id ); 07511 #endif 07512 07513 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) ); 07514 07515 /* Actually clear after last debug message */ 07516 mbedtls_zeroize( ssl, sizeof( mbedtls_ssl_context ) ); 07517 } 07518 07519 /* 07520 * Initialze mbedtls_ssl_config 07521 */ 07522 void mbedtls_ssl_config_init( mbedtls_ssl_config *conf ) 07523 { 07524 memset( conf, 0, sizeof( mbedtls_ssl_config ) ); 07525 } 07526 07527 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 07528 static int ssl_preset_default_hashes[] = { 07529 #if defined(MBEDTLS_SHA512_C) 07530 MBEDTLS_MD_SHA512, 07531 MBEDTLS_MD_SHA384, 07532 #endif 07533 #if defined(MBEDTLS_SHA256_C) 07534 MBEDTLS_MD_SHA256, 07535 MBEDTLS_MD_SHA224, 07536 #endif 07537 #if defined(MBEDTLS_SHA1_C) && defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE) 07538 MBEDTLS_MD_SHA1, 07539 #endif 07540 MBEDTLS_MD_NONE 07541 }; 07542 #endif 07543 07544 static int ssl_preset_suiteb_ciphersuites[] = { 07545 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 07546 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 07547 0 07548 }; 07549 07550 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 07551 static int ssl_preset_suiteb_hashes[] = { 07552 MBEDTLS_MD_SHA256, 07553 MBEDTLS_MD_SHA384, 07554 MBEDTLS_MD_NONE 07555 }; 07556 #endif 07557 07558 #if defined(MBEDTLS_ECP_C) 07559 static mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = { 07560 MBEDTLS_ECP_DP_SECP256R1, 07561 MBEDTLS_ECP_DP_SECP384R1, 07562 MBEDTLS_ECP_DP_NONE 07563 }; 07564 #endif 07565 07566 /* 07567 * Load default in mbedtls_ssl_config 07568 */ 07569 int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf, 07570 int endpoint, int transport, int preset ) 07571 { 07572 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) 07573 int ret; 07574 #endif 07575 07576 /* Use the functions here so that they are covered in tests, 07577 * but otherwise access member directly for efficiency */ 07578 mbedtls_ssl_conf_endpoint( conf, endpoint ); 07579 mbedtls_ssl_conf_transport( conf, transport ); 07580 07581 /* 07582 * Things that are common to all presets 07583 */ 07584 #if defined(MBEDTLS_SSL_CLI_C) 07585 if( endpoint == MBEDTLS_SSL_IS_CLIENT ) 07586 { 07587 conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED; 07588 #if defined(MBEDTLS_SSL_SESSION_TICKETS) 07589 conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED; 07590 #endif 07591 } 07592 #endif 07593 07594 #if defined(MBEDTLS_ARC4_C) 07595 conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED; 07596 #endif 07597 07598 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 07599 conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; 07600 #endif 07601 07602 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) 07603 conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; 07604 #endif 07605 07606 #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) 07607 conf->cbc_record_splitting = MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED; 07608 #endif 07609 07610 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) 07611 conf->f_cookie_write = ssl_cookie_write_dummy; 07612 conf->f_cookie_check = ssl_cookie_check_dummy; 07613 #endif 07614 07615 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) 07616 conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED; 07617 #endif 07618 07619 #if defined(MBEDTLS_SSL_SRV_C) 07620 conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED; 07621 #endif 07622 07623 #if defined(MBEDTLS_SSL_PROTO_DTLS) 07624 conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN; 07625 conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX; 07626 #endif 07627 07628 #if defined(MBEDTLS_SSL_RENEGOTIATION) 07629 conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT; 07630 memset( conf->renego_period , 0x00, 2 ); 07631 memset( conf->renego_period + 2, 0xFF, 6 ); 07632 #endif 07633 07634 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) 07635 if( endpoint == MBEDTLS_SSL_IS_SERVER ) 07636 { 07637 const unsigned char dhm_p[] = 07638 MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN; 07639 const unsigned char dhm_g[] = 07640 MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN; 07641 07642 if ( ( ret = mbedtls_ssl_conf_dh_param_bin( conf, 07643 dhm_p, sizeof( dhm_p ), 07644 dhm_g, sizeof( dhm_g ) ) ) != 0 ) 07645 { 07646 return( ret ); 07647 } 07648 } 07649 #endif 07650 07651 /* 07652 * Preset-specific defaults 07653 */ 07654 switch( preset ) 07655 { 07656 /* 07657 * NSA Suite B 07658 */ 07659 case MBEDTLS_SSL_PRESET_SUITEB: 07660 conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3; 07661 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */ 07662 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION; 07663 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION; 07664 07665 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_0] = 07666 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_1] = 07667 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_2] = 07668 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_3] = 07669 ssl_preset_suiteb_ciphersuites; 07670 07671 #if defined(MBEDTLS_X509_CRT_PARSE_C) 07672 conf->cert_profile = &mbedtls_x509_crt_profile_suiteb; 07673 #endif 07674 07675 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 07676 conf->sig_hashes = ssl_preset_suiteb_hashes; 07677 #endif 07678 07679 #if defined(MBEDTLS_ECP_C) 07680 conf->curve_list = ssl_preset_suiteb_curves; 07681 #endif 07682 break; 07683 07684 /* 07685 * Default 07686 */ 07687 default: 07688 conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3; 07689 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_1; /* TLS 1.0 */ 07690 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION; 07691 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION; 07692 07693 #if defined(MBEDTLS_SSL_PROTO_DTLS) 07694 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 07695 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_2; 07696 #endif 07697 07698 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_0] = 07699 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_1] = 07700 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_2] = 07701 conf->ciphersuite_list [MBEDTLS_SSL_MINOR_VERSION_3] = 07702 mbedtls_ssl_list_ciphersuites(); 07703 07704 #if defined(MBEDTLS_X509_CRT_PARSE_C) 07705 conf->cert_profile = &mbedtls_x509_crt_profile_default; 07706 #endif 07707 07708 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 07709 conf->sig_hashes = ssl_preset_default_hashes; 07710 #endif 07711 07712 #if defined(MBEDTLS_ECP_C) 07713 conf->curve_list = mbedtls_ecp_grp_id_list(); 07714 #endif 07715 07716 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) 07717 conf->dhm_min_bitlen = 1024; 07718 #endif 07719 } 07720 07721 return( 0 ); 07722 } 07723 07724 /* 07725 * Free mbedtls_ssl_config 07726 */ 07727 void mbedtls_ssl_config_free( mbedtls_ssl_config *conf ) 07728 { 07729 #if defined(MBEDTLS_DHM_C) 07730 mbedtls_mpi_free( &conf->dhm_P ); 07731 mbedtls_mpi_free( &conf->dhm_G ); 07732 #endif 07733 07734 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) 07735 if( conf->psk != NULL ) 07736 { 07737 mbedtls_zeroize( conf->psk , conf->psk_len ); 07738 mbedtls_zeroize( conf->psk_identity , conf->psk_identity_len ); 07739 mbedtls_free( conf->psk ); 07740 mbedtls_free( conf->psk_identity ); 07741 conf->psk_len = 0; 07742 conf->psk_identity_len = 0; 07743 } 07744 #endif 07745 07746 #if defined(MBEDTLS_X509_CRT_PARSE_C) 07747 ssl_key_cert_free( conf->key_cert ); 07748 #endif 07749 07750 mbedtls_zeroize( conf, sizeof( mbedtls_ssl_config ) ); 07751 } 07752 07753 #if defined(MBEDTLS_PK_C) && \ 07754 ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) ) 07755 /* 07756 * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX 07757 */ 07758 unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk ) 07759 { 07760 #if defined(MBEDTLS_RSA_C) 07761 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) ) 07762 return( MBEDTLS_SSL_SIG_RSA ); 07763 #endif 07764 #if defined(MBEDTLS_ECDSA_C) 07765 if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) ) 07766 return( MBEDTLS_SSL_SIG_ECDSA ); 07767 #endif 07768 return( MBEDTLS_SSL_SIG_ANON ); 07769 } 07770 07771 unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type ) 07772 { 07773 switch( type ) { 07774 case MBEDTLS_PK_RSA: 07775 return( MBEDTLS_SSL_SIG_RSA ); 07776 case MBEDTLS_PK_ECDSA: 07777 case MBEDTLS_PK_ECKEY: 07778 return( MBEDTLS_SSL_SIG_ECDSA ); 07779 default: 07780 return( MBEDTLS_SSL_SIG_ANON ); 07781 } 07782 } 07783 07784 mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig ) 07785 { 07786 switch( sig ) 07787 { 07788 #if defined(MBEDTLS_RSA_C) 07789 case MBEDTLS_SSL_SIG_RSA: 07790 return( MBEDTLS_PK_RSA ); 07791 #endif 07792 #if defined(MBEDTLS_ECDSA_C) 07793 case MBEDTLS_SSL_SIG_ECDSA: 07794 return( MBEDTLS_PK_ECDSA ); 07795 #endif 07796 default: 07797 return( MBEDTLS_PK_NONE ); 07798 } 07799 } 07800 #endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */ 07801 07802 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ 07803 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 07804 07805 /* Find an entry in a signature-hash set matching a given hash algorithm. */ 07806 mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set, 07807 mbedtls_pk_type_t sig_alg ) 07808 { 07809 switch( sig_alg ) 07810 { 07811 case MBEDTLS_PK_RSA: 07812 return( set->rsa ); 07813 case MBEDTLS_PK_ECDSA: 07814 return( set->ecdsa ); 07815 default: 07816 return( MBEDTLS_MD_NONE ); 07817 } 07818 } 07819 07820 /* Add a signature-hash-pair to a signature-hash set */ 07821 void mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set, 07822 mbedtls_pk_type_t sig_alg, 07823 mbedtls_md_type_t md_alg ) 07824 { 07825 switch( sig_alg ) 07826 { 07827 case MBEDTLS_PK_RSA: 07828 if( set->rsa == MBEDTLS_MD_NONE ) 07829 set->rsa = md_alg; 07830 break; 07831 07832 case MBEDTLS_PK_ECDSA: 07833 if( set->ecdsa == MBEDTLS_MD_NONE ) 07834 set->ecdsa = md_alg; 07835 break; 07836 07837 default: 07838 break; 07839 } 07840 } 07841 07842 /* Allow exactly one hash algorithm for each signature. */ 07843 void mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set, 07844 mbedtls_md_type_t md_alg ) 07845 { 07846 set->rsa = md_alg; 07847 set->ecdsa = md_alg; 07848 } 07849 07850 #endif /* MBEDTLS_SSL_PROTO_TLS1_2) && 07851 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ 07852 07853 /* 07854 * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX 07855 */ 07856 mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash ) 07857 { 07858 switch( hash ) 07859 { 07860 #if defined(MBEDTLS_MD5_C) 07861 case MBEDTLS_SSL_HASH_MD5: 07862 return( MBEDTLS_MD_MD5 ); 07863 #endif 07864 #if defined(MBEDTLS_SHA1_C) 07865 case MBEDTLS_SSL_HASH_SHA1: 07866 return( MBEDTLS_MD_SHA1 ); 07867 #endif 07868 #if defined(MBEDTLS_SHA256_C) 07869 case MBEDTLS_SSL_HASH_SHA224: 07870 return( MBEDTLS_MD_SHA224 ); 07871 case MBEDTLS_SSL_HASH_SHA256: 07872 return( MBEDTLS_MD_SHA256 ); 07873 #endif 07874 #if defined(MBEDTLS_SHA512_C) 07875 case MBEDTLS_SSL_HASH_SHA384: 07876 return( MBEDTLS_MD_SHA384 ); 07877 case MBEDTLS_SSL_HASH_SHA512: 07878 return( MBEDTLS_MD_SHA512 ); 07879 #endif 07880 default: 07881 return( MBEDTLS_MD_NONE ); 07882 } 07883 } 07884 07885 /* 07886 * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX 07887 */ 07888 unsigned char mbedtls_ssl_hash_from_md_alg( int md ) 07889 { 07890 switch( md ) 07891 { 07892 #if defined(MBEDTLS_MD5_C) 07893 case MBEDTLS_MD_MD5: 07894 return( MBEDTLS_SSL_HASH_MD5 ); 07895 #endif 07896 #if defined(MBEDTLS_SHA1_C) 07897 case MBEDTLS_MD_SHA1: 07898 return( MBEDTLS_SSL_HASH_SHA1 ); 07899 #endif 07900 #if defined(MBEDTLS_SHA256_C) 07901 case MBEDTLS_MD_SHA224: 07902 return( MBEDTLS_SSL_HASH_SHA224 ); 07903 case MBEDTLS_MD_SHA256: 07904 return( MBEDTLS_SSL_HASH_SHA256 ); 07905 #endif 07906 #if defined(MBEDTLS_SHA512_C) 07907 case MBEDTLS_MD_SHA384: 07908 return( MBEDTLS_SSL_HASH_SHA384 ); 07909 case MBEDTLS_MD_SHA512: 07910 return( MBEDTLS_SSL_HASH_SHA512 ); 07911 #endif 07912 default: 07913 return( MBEDTLS_SSL_HASH_NONE ); 07914 } 07915 } 07916 07917 #if defined(MBEDTLS_ECP_C) 07918 /* 07919 * Check if a curve proposed by the peer is in our list. 07920 * Return 0 if we're willing to use it, -1 otherwise. 07921 */ 07922 int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id ) 07923 { 07924 const mbedtls_ecp_group_id *gid; 07925 07926 if( ssl->conf->curve_list == NULL ) 07927 return( -1 ); 07928 07929 for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ ) 07930 if( *gid == grp_id ) 07931 return( 0 ); 07932 07933 return( -1 ); 07934 } 07935 #endif /* MBEDTLS_ECP_C */ 07936 07937 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 07938 /* 07939 * Check if a hash proposed by the peer is in our list. 07940 * Return 0 if we're willing to use it, -1 otherwise. 07941 */ 07942 int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl, 07943 mbedtls_md_type_t md ) 07944 { 07945 const int *cur; 07946 07947 if( ssl->conf->sig_hashes == NULL ) 07948 return( -1 ); 07949 07950 for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ ) 07951 if( *cur == (int) md ) 07952 return( 0 ); 07953 07954 return( -1 ); 07955 } 07956 #endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ 07957 07958 #if defined(MBEDTLS_X509_CRT_PARSE_C) 07959 int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert, 07960 const mbedtls_ssl_ciphersuite_t *ciphersuite, 07961 int cert_endpoint, 07962 uint32_t *flags ) 07963 { 07964 int ret = 0; 07965 #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) 07966 int usage = 0; 07967 #endif 07968 #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) 07969 const char *ext_oid; 07970 size_t ext_len; 07971 #endif 07972 07973 #if !defined(MBEDTLS_X509_CHECK_KEY_USAGE) && \ 07974 !defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) 07975 ((void) cert); 07976 ((void) cert_endpoint); 07977 ((void) flags); 07978 #endif 07979 07980 #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) 07981 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER ) 07982 { 07983 /* Server part of the key exchange */ 07984 switch( ciphersuite->key_exchange ) 07985 { 07986 case MBEDTLS_KEY_EXCHANGE_RSA: 07987 case MBEDTLS_KEY_EXCHANGE_RSA_PSK: 07988 usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT; 07989 break; 07990 07991 case MBEDTLS_KEY_EXCHANGE_DHE_RSA: 07992 case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: 07993 case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: 07994 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE; 07995 break; 07996 07997 case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: 07998 case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: 07999 usage = MBEDTLS_X509_KU_KEY_AGREEMENT; 08000 break; 08001 08002 /* Don't use default: we want warnings when adding new values */ 08003 case MBEDTLS_KEY_EXCHANGE_NONE: 08004 case MBEDTLS_KEY_EXCHANGE_PSK: 08005 case MBEDTLS_KEY_EXCHANGE_DHE_PSK: 08006 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: 08007 case MBEDTLS_KEY_EXCHANGE_ECJPAKE: 08008 usage = 0; 08009 } 08010 } 08011 else 08012 { 08013 /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */ 08014 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE; 08015 } 08016 08017 if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 ) 08018 { 08019 *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE; 08020 ret = -1; 08021 } 08022 #else 08023 ((void) ciphersuite); 08024 #endif /* MBEDTLS_X509_CHECK_KEY_USAGE */ 08025 08026 #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) 08027 if( cert_endpoint == MBEDTLS_SSL_IS_SERVER ) 08028 { 08029 ext_oid = MBEDTLS_OID_SERVER_AUTH; 08030 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH ); 08031 } 08032 else 08033 { 08034 ext_oid = MBEDTLS_OID_CLIENT_AUTH; 08035 ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH ); 08036 } 08037 08038 if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 ) 08039 { 08040 *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE; 08041 ret = -1; 08042 } 08043 #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ 08044 08045 return( ret ); 08046 } 08047 #endif /* MBEDTLS_X509_CRT_PARSE_C */ 08048 08049 /* 08050 * Convert version numbers to/from wire format 08051 * and, for DTLS, to/from TLS equivalent. 08052 * 08053 * For TLS this is the identity. 08054 * For DTLS, use 1's complement (v -> 255 - v, and then map as follows: 08055 * 1.0 <-> 3.2 (DTLS 1.0 is based on TLS 1.1) 08056 * 1.x <-> 3.x+1 for x != 0 (DTLS 1.2 based on TLS 1.2) 08057 */ 08058 void mbedtls_ssl_write_version( int major, int minor, int transport, 08059 unsigned char ver[2] ) 08060 { 08061 #if defined(MBEDTLS_SSL_PROTO_DTLS) 08062 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 08063 { 08064 if( minor == MBEDTLS_SSL_MINOR_VERSION_2 ) 08065 --minor; /* DTLS 1.0 stored as TLS 1.1 internally */ 08066 08067 ver[0] = (unsigned char)( 255 - ( major - 2 ) ); 08068 ver[1] = (unsigned char)( 255 - ( minor - 1 ) ); 08069 } 08070 else 08071 #else 08072 ((void) transport); 08073 #endif 08074 { 08075 ver[0] = (unsigned char) major; 08076 ver[1] = (unsigned char) minor; 08077 } 08078 } 08079 08080 void mbedtls_ssl_read_version( int *major, int *minor, int transport, 08081 const unsigned char ver[2] ) 08082 { 08083 #if defined(MBEDTLS_SSL_PROTO_DTLS) 08084 if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 08085 { 08086 *major = 255 - ver[0] + 2; 08087 *minor = 255 - ver[1] + 1; 08088 08089 if( *minor == MBEDTLS_SSL_MINOR_VERSION_1 ) 08090 ++*minor; /* DTLS 1.0 stored as TLS 1.1 internally */ 08091 } 08092 else 08093 #else 08094 ((void) transport); 08095 #endif 08096 { 08097 *major = ver[0]; 08098 *minor = ver[1]; 08099 } 08100 } 08101 08102 int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md ) 08103 { 08104 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 08105 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) 08106 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; 08107 08108 switch( md ) 08109 { 08110 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) 08111 #if defined(MBEDTLS_MD5_C) 08112 case MBEDTLS_SSL_HASH_MD5: 08113 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; 08114 #endif 08115 #if defined(MBEDTLS_SHA1_C) 08116 case MBEDTLS_SSL_HASH_SHA1: 08117 ssl->handshake->calc_verify = ssl_calc_verify_tls; 08118 break; 08119 #endif 08120 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ 08121 #if defined(MBEDTLS_SHA512_C) 08122 case MBEDTLS_SSL_HASH_SHA384: 08123 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384; 08124 break; 08125 #endif 08126 #if defined(MBEDTLS_SHA256_C) 08127 case MBEDTLS_SSL_HASH_SHA256: 08128 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256; 08129 break; 08130 #endif 08131 default: 08132 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; 08133 } 08134 08135 return 0; 08136 #else /* !MBEDTLS_SSL_PROTO_TLS1_2 */ 08137 (void) ssl; 08138 (void) md; 08139 08140 return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; 08141 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 08142 } 08143 08144 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 08145 defined(MBEDTLS_SSL_PROTO_TLS1_1) 08146 int mbedtls_ssl_get_key_exchange_md_ssl_tls( mbedtls_ssl_context *ssl, 08147 unsigned char *output, 08148 unsigned char *data, size_t data_len ) 08149 { 08150 int ret = 0; 08151 mbedtls_md5_context mbedtls_md5; 08152 mbedtls_sha1_context mbedtls_sha1; 08153 08154 mbedtls_md5_init( &mbedtls_md5 ); 08155 mbedtls_sha1_init( &mbedtls_sha1 ); 08156 08157 /* 08158 * digitally-signed struct { 08159 * opaque md5_hash[16]; 08160 * opaque sha_hash[20]; 08161 * }; 08162 * 08163 * md5_hash 08164 * MD5(ClientHello.random + ServerHello.random 08165 * + ServerParams); 08166 * sha_hash 08167 * SHA(ClientHello.random + ServerHello.random 08168 * + ServerParams); 08169 */ 08170 if( ( ret = mbedtls_md5_starts_ret( &mbedtls_md5 ) ) != 0 ) 08171 { 08172 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_starts_ret", ret ); 08173 goto exit; 08174 } 08175 if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5, 08176 ssl->handshake->randbytes, 64 ) ) != 0 ) 08177 { 08178 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret ); 08179 goto exit; 08180 } 08181 if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5, data, data_len ) ) != 0 ) 08182 { 08183 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret ); 08184 goto exit; 08185 } 08186 if( ( ret = mbedtls_md5_finish_ret( &mbedtls_md5, output ) ) != 0 ) 08187 { 08188 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_finish_ret", ret ); 08189 goto exit; 08190 } 08191 08192 if( ( ret = mbedtls_sha1_starts_ret( &mbedtls_sha1 ) ) != 0 ) 08193 { 08194 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_starts_ret", ret ); 08195 goto exit; 08196 } 08197 if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1, 08198 ssl->handshake->randbytes, 64 ) ) != 0 ) 08199 { 08200 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret ); 08201 goto exit; 08202 } 08203 if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1, data, 08204 data_len ) ) != 0 ) 08205 { 08206 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret ); 08207 goto exit; 08208 } 08209 if( ( ret = mbedtls_sha1_finish_ret( &mbedtls_sha1, 08210 output + 16 ) ) != 0 ) 08211 { 08212 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_finish_ret", ret ); 08213 goto exit; 08214 } 08215 08216 exit: 08217 mbedtls_md5_free( &mbedtls_md5 ); 08218 mbedtls_sha1_free( &mbedtls_sha1 ); 08219 08220 if( ret != 0 ) 08221 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 08222 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); 08223 08224 return( ret ); 08225 08226 } 08227 #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ 08228 MBEDTLS_SSL_PROTO_TLS1_1 */ 08229 08230 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ 08231 defined(MBEDTLS_SSL_PROTO_TLS1_2) 08232 int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl, 08233 unsigned char *output, 08234 unsigned char *data, size_t data_len, 08235 mbedtls_md_type_t md_alg ) 08236 { 08237 int ret = 0; 08238 mbedtls_md_context_t ctx; 08239 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg ); 08240 08241 mbedtls_md_init( &ctx ); 08242 08243 /* 08244 * digitally-signed struct { 08245 * opaque client_random[32]; 08246 * opaque server_random[32]; 08247 * ServerDHParams params; 08248 * }; 08249 */ 08250 if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 ) 08251 { 08252 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret ); 08253 goto exit; 08254 } 08255 if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 ) 08256 { 08257 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_starts", ret ); 08258 goto exit; 08259 } 08260 if( ( ret = mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 ) ) != 0 ) 08261 { 08262 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret ); 08263 goto exit; 08264 } 08265 if( ( ret = mbedtls_md_update( &ctx, data, data_len ) ) != 0 ) 08266 { 08267 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret ); 08268 goto exit; 08269 } 08270 if( ( ret = mbedtls_md_finish( &ctx, output ) ) != 0 ) 08271 { 08272 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_finish", ret ); 08273 goto exit; 08274 } 08275 08276 exit: 08277 mbedtls_md_free( &ctx ); 08278 08279 if( ret != 0 ) 08280 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 08281 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); 08282 08283 return( ret ); 08284 } 08285 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ 08286 MBEDTLS_SSL_PROTO_TLS1_2 */ 08287 08288 #endif /* MBEDTLS_SSL_TLS_C */
Generated on Tue Jul 12 2022 12:22:22 by
