Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ssl_srv.c
00001 /* 00002 * SSLv3/TLSv1 server-side 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 #if !defined(MBEDTLS_CONFIG_FILE) 00023 #include "mbedtls/config.h" 00024 #else 00025 #include MBEDTLS_CONFIG_FILE 00026 #endif 00027 00028 #if defined(MBEDTLS_SSL_SRV_C) 00029 00030 #if defined(MBEDTLS_PLATFORM_C) 00031 #include "mbedtls/platform.h" 00032 #else 00033 #include <stdlib.h> 00034 #define mbedtls_calloc calloc 00035 #define mbedtls_free free 00036 #endif 00037 00038 #include "mbedtls/debug.h" 00039 #include "mbedtls/ssl.h" 00040 #include "mbedtls/ssl_internal.h" 00041 00042 #include <string.h> 00043 00044 #if defined(MBEDTLS_ECP_C) 00045 #include "mbedtls/ecp.h" 00046 #endif 00047 00048 #if defined(MBEDTLS_HAVE_TIME) 00049 #include "mbedtls/platform_time.h" 00050 #endif 00051 00052 #if defined(MBEDTLS_SSL_SESSION_TICKETS) 00053 /* Implementation that should never be optimized out by the compiler */ 00054 static void mbedtls_zeroize( void *v, size_t n ) { 00055 volatile unsigned char *p = v; while( n-- ) *p++ = 0; 00056 } 00057 #endif 00058 00059 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) 00060 int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl, 00061 const unsigned char *info, 00062 size_t ilen ) 00063 { 00064 if( ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER ) 00065 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 00066 00067 mbedtls_free( ssl->cli_id ); 00068 00069 if( ( ssl->cli_id = mbedtls_calloc( 1, ilen ) ) == NULL ) 00070 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 00071 00072 memcpy( ssl->cli_id, info, ilen ); 00073 ssl->cli_id_len = ilen; 00074 00075 return( 0 ); 00076 } 00077 00078 void mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf, 00079 mbedtls_ssl_cookie_write_t *f_cookie_write, 00080 mbedtls_ssl_cookie_check_t *f_cookie_check, 00081 void *p_cookie ) 00082 { 00083 conf->f_cookie_write = f_cookie_write; 00084 conf->f_cookie_check = f_cookie_check; 00085 conf->p_cookie = p_cookie; 00086 } 00087 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ 00088 00089 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 00090 static int ssl_parse_servername_ext( mbedtls_ssl_context *ssl, 00091 const unsigned char *buf, 00092 size_t len ) 00093 { 00094 int ret; 00095 size_t servername_list_size, hostname_len; 00096 const unsigned char *p; 00097 00098 MBEDTLS_SSL_DEBUG_MSG( 3, ( "parse ServerName extension" ) ); 00099 00100 servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); 00101 if( servername_list_size + 2 != len ) 00102 { 00103 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00104 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00105 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00106 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00107 } 00108 00109 p = buf + 2; 00110 while( servername_list_size > 0 ) 00111 { 00112 hostname_len = ( ( p[1] << 8 ) | p[2] ); 00113 if( hostname_len + 3 > servername_list_size ) 00114 { 00115 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00116 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00117 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00118 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00119 } 00120 00121 if( p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) 00122 { 00123 ret = ssl->conf->f_sni( ssl->conf->p_sni, 00124 ssl, p + 3, hostname_len ); 00125 if( ret != 0 ) 00126 { 00127 MBEDTLS_SSL_DEBUG_RET( 1, "ssl_sni_wrapper", ret ); 00128 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00129 MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME ); 00130 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00131 } 00132 return( 0 ); 00133 } 00134 00135 servername_list_size -= hostname_len + 3; 00136 p += hostname_len + 3; 00137 } 00138 00139 if( servername_list_size != 0 ) 00140 { 00141 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00142 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00143 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); 00144 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00145 } 00146 00147 return( 0 ); 00148 } 00149 #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ 00150 00151 static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl, 00152 const unsigned char *buf, 00153 size_t len ) 00154 { 00155 #if defined(MBEDTLS_SSL_RENEGOTIATION) 00156 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) 00157 { 00158 /* Check verify-data in constant-time. The length OTOH is no secret */ 00159 if( len != 1 + ssl->verify_data_len || 00160 buf[0] != ssl->verify_data_len || 00161 mbedtls_ssl_safer_memcmp( buf + 1, ssl->peer_verify_data, 00162 ssl->verify_data_len ) != 0 ) 00163 { 00164 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) ); 00165 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00166 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); 00167 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00168 } 00169 } 00170 else 00171 #endif /* MBEDTLS_SSL_RENEGOTIATION */ 00172 { 00173 if( len != 1 || buf[0] != 0x0 ) 00174 { 00175 MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) ); 00176 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00177 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); 00178 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00179 } 00180 00181 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; 00182 } 00183 00184 return( 0 ); 00185 } 00186 00187 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ 00188 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 00189 00190 /* 00191 * Status of the implementation of signature-algorithms extension: 00192 * 00193 * Currently, we are only considering the signature-algorithm extension 00194 * to pick a ciphersuite which allows us to send the ServerKeyExchange 00195 * message with a signature-hash combination that the user allows. 00196 * 00197 * We do *not* check whether all certificates in our certificate 00198 * chain are signed with an allowed signature-hash pair. 00199 * This needs to be done at a later stage. 00200 * 00201 */ 00202 static int ssl_parse_signature_algorithms_ext( mbedtls_ssl_context *ssl, 00203 const unsigned char *buf, 00204 size_t len ) 00205 { 00206 size_t sig_alg_list_size; 00207 00208 const unsigned char *p; 00209 const unsigned char *end = buf + len; 00210 00211 mbedtls_md_type_t md_cur; 00212 mbedtls_pk_type_t sig_cur; 00213 00214 sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); 00215 if( sig_alg_list_size + 2 != len || 00216 sig_alg_list_size % 2 != 0 ) 00217 { 00218 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00219 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00220 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00221 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00222 } 00223 00224 /* Currently we only guarantee signing the ServerKeyExchange message according 00225 * to the constraints specified in this extension (see above), so it suffices 00226 * to remember only one suitable hash for each possible signature algorithm. 00227 * 00228 * This will change when we also consider certificate signatures, 00229 * in which case we will need to remember the whole signature-hash 00230 * pair list from the extension. 00231 */ 00232 00233 for( p = buf + 2; p < end; p += 2 ) 00234 { 00235 /* Silently ignore unknown signature or hash algorithms. */ 00236 00237 if( ( sig_cur = mbedtls_ssl_pk_alg_from_sig( p[1] ) ) == MBEDTLS_PK_NONE ) 00238 { 00239 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext" 00240 " unknown sig alg encoding %d", p[1] ) ); 00241 continue; 00242 } 00243 00244 /* Check if we support the hash the user proposes */ 00245 md_cur = mbedtls_ssl_md_alg_from_hash( p[0] ); 00246 if( md_cur == MBEDTLS_MD_NONE ) 00247 { 00248 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext:" 00249 " unknown hash alg encoding %d", p[0] ) ); 00250 continue; 00251 } 00252 00253 if( mbedtls_ssl_check_sig_hash( ssl, md_cur ) == 0 ) 00254 { 00255 mbedtls_ssl_sig_hash_set_add( &ssl->handshake->hash_algs, sig_cur, md_cur ); 00256 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext:" 00257 " match sig %d and hash %d", 00258 sig_cur, md_cur ) ); 00259 } 00260 else 00261 { 00262 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: " 00263 "hash alg %d not supported", md_cur ) ); 00264 } 00265 } 00266 00267 return( 0 ); 00268 } 00269 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && 00270 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ 00271 00272 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ 00273 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 00274 static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl, 00275 const unsigned char *buf, 00276 size_t len ) 00277 { 00278 size_t list_size, our_size; 00279 const unsigned char *p; 00280 const mbedtls_ecp_curve_info *curve_info, **curves; 00281 00282 list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); 00283 if( list_size + 2 != len || 00284 list_size % 2 != 0 ) 00285 { 00286 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00287 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00288 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00289 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00290 } 00291 00292 /* Should never happen unless client duplicates the extension */ 00293 if( ssl->handshake->curves != NULL ) 00294 { 00295 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00296 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00297 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00298 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00299 } 00300 00301 /* Don't allow our peer to make us allocate too much memory, 00302 * and leave room for a final 0 */ 00303 our_size = list_size / 2 + 1; 00304 if( our_size > MBEDTLS_ECP_DP_MAX ) 00305 our_size = MBEDTLS_ECP_DP_MAX; 00306 00307 if( ( curves = mbedtls_calloc( our_size, sizeof( *curves ) ) ) == NULL ) 00308 { 00309 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00310 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); 00311 return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); 00312 } 00313 00314 ssl->handshake->curves = curves; 00315 00316 p = buf + 2; 00317 while( list_size > 0 && our_size > 1 ) 00318 { 00319 curve_info = mbedtls_ecp_curve_info_from_tls_id( ( p[0] << 8 ) | p[1] ); 00320 00321 if( curve_info != NULL ) 00322 { 00323 *curves++ = curve_info; 00324 our_size--; 00325 } 00326 00327 list_size -= 2; 00328 p += 2; 00329 } 00330 00331 return( 0 ); 00332 } 00333 00334 static int ssl_parse_supported_point_formats( mbedtls_ssl_context *ssl, 00335 const unsigned char *buf, 00336 size_t len ) 00337 { 00338 size_t list_size; 00339 const unsigned char *p; 00340 00341 list_size = buf[0]; 00342 if( list_size + 1 != len ) 00343 { 00344 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00345 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00346 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00347 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00348 } 00349 00350 p = buf + 1; 00351 while( list_size > 0 ) 00352 { 00353 if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED || 00354 p[0] == MBEDTLS_ECP_PF_COMPRESSED ) 00355 { 00356 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) 00357 ssl->handshake->ecdh_ctx.point_format = p[0]; 00358 #endif 00359 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 00360 ssl->handshake->ecjpake_ctx.point_format = p[0]; 00361 #endif 00362 MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) ); 00363 return( 0 ); 00364 } 00365 00366 list_size--; 00367 p++; 00368 } 00369 00370 return( 0 ); 00371 } 00372 #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || 00373 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 00374 00375 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 00376 static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl, 00377 const unsigned char *buf, 00378 size_t len ) 00379 { 00380 int ret; 00381 00382 if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 ) 00383 { 00384 MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) ); 00385 return( 0 ); 00386 } 00387 00388 if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx, 00389 buf, len ) ) != 0 ) 00390 { 00391 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret ); 00392 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00393 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); 00394 return( ret ); 00395 } 00396 00397 /* Only mark the extension as OK when we're sure it is */ 00398 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK; 00399 00400 return( 0 ); 00401 } 00402 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 00403 00404 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) 00405 static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl, 00406 const unsigned char *buf, 00407 size_t len ) 00408 { 00409 if( len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ) 00410 { 00411 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00412 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00413 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); 00414 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00415 } 00416 00417 ssl->session_negotiate->mfl_code = buf[0]; 00418 00419 return( 0 ); 00420 } 00421 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ 00422 00423 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) 00424 static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl, 00425 const unsigned char *buf, 00426 size_t len ) 00427 { 00428 if( len != 0 ) 00429 { 00430 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00431 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00432 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00433 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00434 } 00435 00436 ((void) buf); 00437 00438 if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED ) 00439 ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; 00440 00441 return( 0 ); 00442 } 00443 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ 00444 00445 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 00446 static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, 00447 const unsigned char *buf, 00448 size_t len ) 00449 { 00450 if( len != 0 ) 00451 { 00452 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00453 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00454 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00455 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00456 } 00457 00458 ((void) buf); 00459 00460 if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED && 00461 ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) 00462 { 00463 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; 00464 } 00465 00466 return( 0 ); 00467 } 00468 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ 00469 00470 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) 00471 static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl, 00472 const unsigned char *buf, 00473 size_t len ) 00474 { 00475 if( len != 0 ) 00476 { 00477 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00478 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00479 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00480 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00481 } 00482 00483 ((void) buf); 00484 00485 if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED && 00486 ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) 00487 { 00488 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; 00489 } 00490 00491 return( 0 ); 00492 } 00493 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ 00494 00495 #if defined(MBEDTLS_SSL_SESSION_TICKETS) 00496 static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl, 00497 unsigned char *buf, 00498 size_t len ) 00499 { 00500 int ret; 00501 mbedtls_ssl_session session; 00502 00503 mbedtls_ssl_session_init( &session ); 00504 00505 if( ssl->conf->f_ticket_parse == NULL || 00506 ssl->conf->f_ticket_write == NULL ) 00507 { 00508 return( 0 ); 00509 } 00510 00511 /* Remember the client asked us to send a new ticket */ 00512 ssl->handshake->new_session_ticket = 1; 00513 00514 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", len ) ); 00515 00516 if( len == 0 ) 00517 return( 0 ); 00518 00519 #if defined(MBEDTLS_SSL_RENEGOTIATION) 00520 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) 00521 { 00522 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket rejected: renegotiating" ) ); 00523 return( 0 ); 00524 } 00525 #endif /* MBEDTLS_SSL_RENEGOTIATION */ 00526 00527 /* 00528 * Failures are ok: just ignore the ticket and proceed. 00529 */ 00530 if( ( ret = ssl->conf->f_ticket_parse( ssl->conf->p_ticket, &session, 00531 buf, len ) ) != 0 ) 00532 { 00533 mbedtls_ssl_session_free( &session ); 00534 00535 if( ret == MBEDTLS_ERR_SSL_INVALID_MAC ) 00536 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is not authentic" ) ); 00537 else if( ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED ) 00538 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is expired" ) ); 00539 else 00540 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_parse", ret ); 00541 00542 return( 0 ); 00543 } 00544 00545 /* 00546 * Keep the session ID sent by the client, since we MUST send it back to 00547 * inform them we're accepting the ticket (RFC 5077 section 3.4) 00548 */ 00549 session.id_len = ssl->session_negotiate->id_len; 00550 memcpy( &session.id, ssl->session_negotiate->id, session.id_len ); 00551 00552 mbedtls_ssl_session_free( ssl->session_negotiate ); 00553 memcpy( ssl->session_negotiate, &session, sizeof( mbedtls_ssl_session ) ); 00554 00555 /* Zeroize instead of free as we copied the content */ 00556 mbedtls_zeroize( &session, sizeof( mbedtls_ssl_session ) ); 00557 00558 MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from ticket" ) ); 00559 00560 ssl->handshake->resume = 1; 00561 00562 /* Don't send a new ticket after all, this one is OK */ 00563 ssl->handshake->new_session_ticket = 0; 00564 00565 return( 0 ); 00566 } 00567 #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 00568 00569 #if defined(MBEDTLS_SSL_ALPN) 00570 static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl, 00571 const unsigned char *buf, size_t len ) 00572 { 00573 size_t list_len, cur_len, ours_len; 00574 const unsigned char *theirs, *start, *end; 00575 const char **ours; 00576 00577 /* If ALPN not configured, just ignore the extension */ 00578 if( ssl->conf->alpn_list == NULL ) 00579 return( 0 ); 00580 00581 /* 00582 * opaque ProtocolName<1..2^8-1>; 00583 * 00584 * struct { 00585 * ProtocolName protocol_name_list<2..2^16-1> 00586 * } ProtocolNameList; 00587 */ 00588 00589 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */ 00590 if( len < 4 ) 00591 { 00592 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00593 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00594 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00595 } 00596 00597 list_len = ( buf[0] << 8 ) | buf[1]; 00598 if( list_len != len - 2 ) 00599 { 00600 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00601 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00602 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00603 } 00604 00605 /* 00606 * Validate peer's list (lengths) 00607 */ 00608 start = buf + 2; 00609 end = buf + len; 00610 for( theirs = start; theirs != end; theirs += cur_len ) 00611 { 00612 cur_len = *theirs++; 00613 00614 /* Current identifier must fit in list */ 00615 if( cur_len > (size_t)( end - theirs ) ) 00616 { 00617 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00618 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 00619 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00620 } 00621 00622 /* Empty strings MUST NOT be included */ 00623 if( cur_len == 0 ) 00624 { 00625 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00626 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); 00627 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00628 } 00629 } 00630 00631 /* 00632 * Use our order of preference 00633 */ 00634 for( ours = ssl->conf->alpn_list; *ours != NULL; ours++ ) 00635 { 00636 ours_len = strlen( *ours ); 00637 for( theirs = start; theirs != end; theirs += cur_len ) 00638 { 00639 cur_len = *theirs++; 00640 00641 if( cur_len == ours_len && 00642 memcmp( theirs, *ours, cur_len ) == 0 ) 00643 { 00644 ssl->alpn_chosen = *ours; 00645 return( 0 ); 00646 } 00647 } 00648 } 00649 00650 /* If we get there, no match was found */ 00651 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00652 MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL ); 00653 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00654 } 00655 #endif /* MBEDTLS_SSL_ALPN */ 00656 00657 /* 00658 * Auxiliary functions for ServerHello parsing and related actions 00659 */ 00660 00661 #if defined(MBEDTLS_X509_CRT_PARSE_C) 00662 /* 00663 * Return 0 if the given key uses one of the acceptable curves, -1 otherwise 00664 */ 00665 #if defined(MBEDTLS_ECDSA_C) 00666 static int ssl_check_key_curve( mbedtls_pk_context *pk, 00667 const mbedtls_ecp_curve_info **curves ) 00668 { 00669 const mbedtls_ecp_curve_info **crv = curves; 00670 mbedtls_ecp_group_id grp_id = mbedtls_pk_ec( *pk )->grp .id ; 00671 00672 while( *crv != NULL ) 00673 { 00674 if( (*crv)->grp_id == grp_id ) 00675 return( 0 ); 00676 crv++; 00677 } 00678 00679 return( -1 ); 00680 } 00681 #endif /* MBEDTLS_ECDSA_C */ 00682 00683 /* 00684 * Try picking a certificate for this ciphersuite, 00685 * return 0 on success and -1 on failure. 00686 */ 00687 static int ssl_pick_cert( mbedtls_ssl_context *ssl, 00688 const mbedtls_ssl_ciphersuite_t * ciphersuite_info ) 00689 { 00690 mbedtls_ssl_key_cert *cur, *list, *fallback = NULL; 00691 mbedtls_pk_type_t pk_alg = 00692 mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ); 00693 uint32_t flags; 00694 00695 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 00696 if( ssl->handshake->sni_key_cert != NULL ) 00697 list = ssl->handshake->sni_key_cert; 00698 else 00699 #endif 00700 list = ssl->conf->key_cert; 00701 00702 if( pk_alg == MBEDTLS_PK_NONE ) 00703 return( 0 ); 00704 00705 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite requires certificate" ) ); 00706 00707 if( list == NULL ) 00708 { 00709 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server has no certificate" ) ); 00710 return( -1 ); 00711 } 00712 00713 for( cur = list; cur != NULL; cur = cur->next ) 00714 { 00715 MBEDTLS_SSL_DEBUG_CRT( 3, "candidate certificate chain, certificate", 00716 cur->cert ); 00717 00718 if( ! mbedtls_pk_can_do( cur->key, pk_alg ) ) 00719 { 00720 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: key type" ) ); 00721 continue; 00722 } 00723 00724 /* 00725 * This avoids sending the client a cert it'll reject based on 00726 * keyUsage or other extensions. 00727 * 00728 * It also allows the user to provision different certificates for 00729 * different uses based on keyUsage, eg if they want to avoid signing 00730 * and decrypting with the same RSA key. 00731 */ 00732 if( mbedtls_ssl_check_cert_usage( cur->cert, ciphersuite_info, 00733 MBEDTLS_SSL_IS_SERVER, &flags ) != 0 ) 00734 { 00735 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: " 00736 "(extended) key usage extension" ) ); 00737 continue; 00738 } 00739 00740 #if defined(MBEDTLS_ECDSA_C) 00741 if( pk_alg == MBEDTLS_PK_ECDSA && 00742 ssl_check_key_curve( cur->key, ssl->handshake->curves ) != 0 ) 00743 { 00744 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: elliptic curve" ) ); 00745 continue; 00746 } 00747 #endif 00748 00749 /* 00750 * Try to select a SHA-1 certificate for pre-1.2 clients, but still 00751 * present them a SHA-higher cert rather than failing if it's the only 00752 * one we got that satisfies the other conditions. 00753 */ 00754 if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 && 00755 cur->cert->sig_md != MBEDTLS_MD_SHA1 ) 00756 { 00757 if( fallback == NULL ) 00758 fallback = cur; 00759 { 00760 MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate not preferred: " 00761 "sha-2 with pre-TLS 1.2 client" ) ); 00762 continue; 00763 } 00764 } 00765 00766 /* If we get there, we got a winner */ 00767 break; 00768 } 00769 00770 if( cur == NULL ) 00771 cur = fallback; 00772 00773 /* Do not update ssl->handshake->key_cert unless there is a match */ 00774 if( cur != NULL ) 00775 { 00776 ssl->handshake->key_cert = cur; 00777 MBEDTLS_SSL_DEBUG_CRT( 3, "selected certificate chain, certificate", 00778 ssl->handshake->key_cert->cert ); 00779 return( 0 ); 00780 } 00781 00782 return( -1 ); 00783 } 00784 #endif /* MBEDTLS_X509_CRT_PARSE_C */ 00785 00786 /* 00787 * Check if a given ciphersuite is suitable for use with our config/keys/etc 00788 * Sets ciphersuite_info only if the suite matches. 00789 */ 00790 static int ssl_ciphersuite_match( mbedtls_ssl_context *ssl, int suite_id, 00791 const mbedtls_ssl_ciphersuite_t **ciphersuite_info ) 00792 { 00793 const mbedtls_ssl_ciphersuite_t *suite_info; 00794 00795 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ 00796 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 00797 mbedtls_pk_type_t sig_type; 00798 #endif 00799 00800 suite_info = mbedtls_ssl_ciphersuite_from_id( suite_id ); 00801 if( suite_info == NULL ) 00802 { 00803 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 00804 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 00805 } 00806 00807 MBEDTLS_SSL_DEBUG_MSG( 3, ( "trying ciphersuite: %s", suite_info->name ) ); 00808 00809 if( suite_info->min_minor_ver > ssl->minor_ver || 00810 suite_info->max_minor_ver < ssl->minor_ver ) 00811 { 00812 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: version" ) ); 00813 return( 0 ); 00814 } 00815 00816 #if defined(MBEDTLS_SSL_PROTO_DTLS) 00817 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 00818 ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) ) 00819 return( 0 ); 00820 #endif 00821 00822 #if defined(MBEDTLS_ARC4_C) 00823 if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED && 00824 suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 ) 00825 { 00826 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: rc4" ) ); 00827 return( 0 ); 00828 } 00829 #endif 00830 00831 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 00832 if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE && 00833 ( ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK ) == 0 ) 00834 { 00835 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: ecjpake " 00836 "not configured or ext missing" ) ); 00837 return( 0 ); 00838 } 00839 #endif 00840 00841 00842 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) 00843 if( mbedtls_ssl_ciphersuite_uses_ec( suite_info ) && 00844 ( ssl->handshake->curves == NULL || 00845 ssl->handshake->curves[0] == NULL ) ) 00846 { 00847 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: " 00848 "no common elliptic curve" ) ); 00849 return( 0 ); 00850 } 00851 #endif 00852 00853 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) 00854 /* If the ciphersuite requires a pre-shared key and we don't 00855 * have one, skip it now rather than failing later */ 00856 if( mbedtls_ssl_ciphersuite_uses_psk( suite_info ) && 00857 ssl->conf->f_psk == NULL && 00858 ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL || 00859 ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) ) 00860 { 00861 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no pre-shared key" ) ); 00862 return( 0 ); 00863 } 00864 #endif 00865 00866 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ 00867 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 00868 /* If the ciphersuite requires signing, check whether 00869 * a suitable hash algorithm is present. */ 00870 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) 00871 { 00872 sig_type = mbedtls_ssl_get_ciphersuite_sig_alg( suite_info ); 00873 if( sig_type != MBEDTLS_PK_NONE && 00874 mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, sig_type ) == MBEDTLS_MD_NONE ) 00875 { 00876 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no suitable hash algorithm " 00877 "for signature algorithm %d", sig_type ) ); 00878 return( 0 ); 00879 } 00880 } 00881 00882 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && 00883 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ 00884 00885 #if defined(MBEDTLS_X509_CRT_PARSE_C) 00886 /* 00887 * Final check: if ciphersuite requires us to have a 00888 * certificate/key of a particular type: 00889 * - select the appropriate certificate if we have one, or 00890 * - try the next ciphersuite if we don't 00891 * This must be done last since we modify the key_cert list. 00892 */ 00893 if( ssl_pick_cert( ssl, suite_info ) != 0 ) 00894 { 00895 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: " 00896 "no suitable certificate" ) ); 00897 return( 0 ); 00898 } 00899 #endif 00900 00901 *ciphersuite_info = suite_info; 00902 return( 0 ); 00903 } 00904 00905 #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) 00906 static int ssl_parse_client_hello_v2( mbedtls_ssl_context *ssl ) 00907 { 00908 int ret, got_common_suite; 00909 unsigned int i, j; 00910 size_t n; 00911 unsigned int ciph_len, sess_len, chal_len; 00912 unsigned char *buf, *p; 00913 const int *ciphersuites; 00914 const mbedtls_ssl_ciphersuite_t *ciphersuite_info; 00915 00916 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) ); 00917 00918 #if defined(MBEDTLS_SSL_RENEGOTIATION) 00919 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) 00920 { 00921 MBEDTLS_SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) ); 00922 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00923 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); 00924 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00925 } 00926 #endif /* MBEDTLS_SSL_RENEGOTIATION */ 00927 00928 buf = ssl->in_hdr; 00929 00930 MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, 5 ); 00931 00932 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d", 00933 buf[2] ) ); 00934 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d", 00935 ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) ); 00936 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]", 00937 buf[3], buf[4] ) ); 00938 00939 /* 00940 * SSLv2 Client Hello 00941 * 00942 * Record layer: 00943 * 0 . 1 message length 00944 * 00945 * SSL layer: 00946 * 2 . 2 message type 00947 * 3 . 4 protocol version 00948 */ 00949 if( buf[2] != MBEDTLS_SSL_HS_CLIENT_HELLO || 00950 buf[3] != MBEDTLS_SSL_MAJOR_VERSION_3 ) 00951 { 00952 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00953 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00954 } 00955 00956 n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF; 00957 00958 if( n < 17 || n > 512 ) 00959 { 00960 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 00961 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 00962 } 00963 00964 ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3; 00965 ssl->minor_ver = ( buf[4] <= ssl->conf->max_minor_ver ) 00966 ? buf[4] : ssl->conf->max_minor_ver; 00967 00968 if( ssl->minor_ver < ssl->conf->min_minor_ver ) 00969 { 00970 MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum" 00971 " [%d:%d] < [%d:%d]", 00972 ssl->major_ver, ssl->minor_ver, 00973 ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) ); 00974 00975 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 00976 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); 00977 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); 00978 } 00979 00980 ssl->handshake->max_major_ver = buf[3]; 00981 ssl->handshake->max_minor_ver = buf[4]; 00982 00983 if( ( ret = mbedtls_ssl_fetch_input( ssl, 2 + n ) ) != 0 ) 00984 { 00985 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); 00986 return( ret ); 00987 } 00988 00989 ssl->handshake->update_checksum( ssl, buf + 2, n ); 00990 00991 buf = ssl->in_msg; 00992 n = ssl->in_left - 5; 00993 00994 /* 00995 * 0 . 1 ciphersuitelist length 00996 * 2 . 3 session id length 00997 * 4 . 5 challenge length 00998 * 6 . .. ciphersuitelist 00999 * .. . .. session id 01000 * .. . .. challenge 01001 */ 01002 MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, n ); 01003 01004 ciph_len = ( buf[0] << 8 ) | buf[1]; 01005 sess_len = ( buf[2] << 8 ) | buf[3]; 01006 chal_len = ( buf[4] << 8 ) | buf[5]; 01007 01008 MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d", 01009 ciph_len, sess_len, chal_len ) ); 01010 01011 /* 01012 * Make sure each parameter length is valid 01013 */ 01014 if( ciph_len < 3 || ( ciph_len % 3 ) != 0 ) 01015 { 01016 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01017 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01018 } 01019 01020 if( sess_len > 32 ) 01021 { 01022 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01023 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01024 } 01025 01026 if( chal_len < 8 || chal_len > 32 ) 01027 { 01028 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01029 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01030 } 01031 01032 if( n != 6 + ciph_len + sess_len + chal_len ) 01033 { 01034 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01035 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01036 } 01037 01038 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist", 01039 buf + 6, ciph_len ); 01040 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", 01041 buf + 6 + ciph_len, sess_len ); 01042 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, challenge", 01043 buf + 6 + ciph_len + sess_len, chal_len ); 01044 01045 p = buf + 6 + ciph_len; 01046 ssl->session_negotiate->id_len = sess_len; 01047 memset( ssl->session_negotiate->id, 0, 01048 sizeof( ssl->session_negotiate->id ) ); 01049 memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->id_len ); 01050 01051 p += sess_len; 01052 memset( ssl->handshake->randbytes, 0, 64 ); 01053 memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len ); 01054 01055 /* 01056 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV 01057 */ 01058 for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 ) 01059 { 01060 if( p[0] == 0 && p[1] == 0 && p[2] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO ) 01061 { 01062 MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) ); 01063 #if defined(MBEDTLS_SSL_RENEGOTIATION) 01064 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) 01065 { 01066 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV " 01067 "during renegotiation" ) ); 01068 01069 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01070 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); 01071 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01072 } 01073 #endif /* MBEDTLS_SSL_RENEGOTIATION */ 01074 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; 01075 break; 01076 } 01077 } 01078 01079 #if defined(MBEDTLS_SSL_FALLBACK_SCSV) 01080 for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 ) 01081 { 01082 if( p[0] == 0 && 01083 p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) && 01084 p[2] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) ) 01085 { 01086 MBEDTLS_SSL_DEBUG_MSG( 3, ( "received FALLBACK_SCSV" ) ); 01087 01088 if( ssl->minor_ver < ssl->conf->max_minor_ver ) 01089 { 01090 MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) ); 01091 01092 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01093 MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK ); 01094 01095 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01096 } 01097 01098 break; 01099 } 01100 } 01101 #endif /* MBEDTLS_SSL_FALLBACK_SCSV */ 01102 01103 got_common_suite = 0; 01104 ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; 01105 ciphersuite_info = NULL; 01106 #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) 01107 for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 ) 01108 for( i = 0; ciphersuites[i] != 0; i++ ) 01109 #else 01110 for( i = 0; ciphersuites[i] != 0; i++ ) 01111 for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 ) 01112 #endif 01113 { 01114 if( p[0] != 0 || 01115 p[1] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) || 01116 p[2] != ( ( ciphersuites[i] ) & 0xFF ) ) 01117 continue; 01118 01119 got_common_suite = 1; 01120 01121 if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i], 01122 &ciphersuite_info ) ) != 0 ) 01123 return( ret ); 01124 01125 if( ciphersuite_info != NULL ) 01126 goto have_ciphersuite_v2; 01127 } 01128 01129 if( got_common_suite ) 01130 { 01131 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, " 01132 "but none of them usable" ) ); 01133 return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE ); 01134 } 01135 else 01136 { 01137 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) ); 01138 return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN ); 01139 } 01140 01141 have_ciphersuite_v2: 01142 MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) ); 01143 01144 ssl->session_negotiate->ciphersuite = ciphersuites[i]; 01145 ssl->transform_negotiate->ciphersuite_info = ciphersuite_info; 01146 01147 /* 01148 * SSLv2 Client Hello relevant renegotiation security checks 01149 */ 01150 if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && 01151 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE ) 01152 { 01153 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); 01154 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01155 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); 01156 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01157 } 01158 01159 ssl->in_left = 0; 01160 ssl->state++; 01161 01162 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) ); 01163 01164 return( 0 ); 01165 } 01166 #endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */ 01167 01168 /* This function doesn't alert on errors that happen early during 01169 ClientHello parsing because they might indicate that the client is 01170 not talking SSL/TLS at all and would not understand our alert. */ 01171 static int ssl_parse_client_hello( mbedtls_ssl_context *ssl ) 01172 { 01173 int ret, got_common_suite; 01174 size_t i, j; 01175 size_t ciph_offset, comp_offset, ext_offset; 01176 size_t msg_len, ciph_len, sess_len, comp_len, ext_len; 01177 #if defined(MBEDTLS_SSL_PROTO_DTLS) 01178 size_t cookie_offset, cookie_len; 01179 #endif 01180 unsigned char *buf, *p, *ext; 01181 #if defined(MBEDTLS_SSL_RENEGOTIATION) 01182 int renegotiation_info_seen = 0; 01183 #endif 01184 int handshake_failure = 0; 01185 const int *ciphersuites; 01186 const mbedtls_ssl_ciphersuite_t *ciphersuite_info; 01187 int major, minor; 01188 01189 /* If there is no signature-algorithm extension present, 01190 * we need to fall back to the default values for allowed 01191 * signature-hash pairs. */ 01192 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ 01193 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 01194 int sig_hash_alg_ext_present = 0; 01195 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && 01196 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ 01197 01198 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) ); 01199 01200 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) 01201 read_record_header: 01202 #endif 01203 /* 01204 * If renegotiating, then the input was read with mbedtls_ssl_read_record(), 01205 * otherwise read it ourselves manually in order to support SSLv2 01206 * ClientHello, which doesn't use the same record layer format. 01207 */ 01208 #if defined(MBEDTLS_SSL_RENEGOTIATION) 01209 if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) 01210 #endif 01211 { 01212 if( ( ret = mbedtls_ssl_fetch_input( ssl, 5 ) ) != 0 ) 01213 { 01214 /* No alert on a read error. */ 01215 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); 01216 return( ret ); 01217 } 01218 } 01219 01220 buf = ssl->in_hdr; 01221 01222 #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) 01223 #if defined(MBEDTLS_SSL_PROTO_DTLS) 01224 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_STREAM ) 01225 #endif 01226 if( ( buf[0] & 0x80 ) != 0 ) 01227 return( ssl_parse_client_hello_v2( ssl ) ); 01228 #endif 01229 01230 MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, mbedtls_ssl_hdr_len( ssl ) ); 01231 01232 /* 01233 * SSLv3/TLS Client Hello 01234 * 01235 * Record layer: 01236 * 0 . 0 message type 01237 * 1 . 2 protocol version 01238 * 3 . 11 DTLS: epoch + record sequence number 01239 * 3 . 4 message length 01240 */ 01241 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d", 01242 buf[0] ) ); 01243 01244 if( buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE ) 01245 { 01246 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01247 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01248 } 01249 01250 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d", 01251 ( ssl->in_len[0] << 8 ) | ssl->in_len[1] ) ); 01252 01253 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, protocol version: [%d:%d]", 01254 buf[1], buf[2] ) ); 01255 01256 mbedtls_ssl_read_version( &major, &minor, ssl->conf->transport, buf + 1 ); 01257 01258 /* According to RFC 5246 Appendix E.1, the version here is typically 01259 * "{03,00}, the lowest version number supported by the client, [or] the 01260 * value of ClientHello.client_version", so the only meaningful check here 01261 * is the major version shouldn't be less than 3 */ 01262 if( major < MBEDTLS_SSL_MAJOR_VERSION_3 ) 01263 { 01264 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01265 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01266 } 01267 01268 /* For DTLS if this is the initial handshake, remember the client sequence 01269 * number to use it in our next message (RFC 6347 4.2.1) */ 01270 #if defined(MBEDTLS_SSL_PROTO_DTLS) 01271 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM 01272 #if defined(MBEDTLS_SSL_RENEGOTIATION) 01273 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE 01274 #endif 01275 ) 01276 { 01277 /* Epoch should be 0 for initial handshakes */ 01278 if( ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0 ) 01279 { 01280 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01281 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01282 } 01283 01284 memcpy( ssl->out_ctr + 2, ssl->in_ctr + 2, 6 ); 01285 01286 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) 01287 if( mbedtls_ssl_dtls_replay_check( ssl ) != 0 ) 01288 { 01289 MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record, discarding" ) ); 01290 ssl->next_record_offset = 0; 01291 ssl->in_left = 0; 01292 goto read_record_header; 01293 } 01294 01295 /* No MAC to check yet, so we can update right now */ 01296 mbedtls_ssl_dtls_replay_update( ssl ); 01297 #endif 01298 } 01299 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 01300 01301 msg_len = ( ssl->in_len[0] << 8 ) | ssl->in_len[1]; 01302 01303 #if defined(MBEDTLS_SSL_RENEGOTIATION) 01304 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) 01305 { 01306 /* Set by mbedtls_ssl_read_record() */ 01307 msg_len = ssl->in_hslen; 01308 } 01309 else 01310 #endif 01311 { 01312 if( msg_len > MBEDTLS_SSL_MAX_CONTENT_LEN ) 01313 { 01314 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01315 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01316 } 01317 01318 if( ( ret = mbedtls_ssl_fetch_input( ssl, 01319 mbedtls_ssl_hdr_len( ssl ) + msg_len ) ) != 0 ) 01320 { 01321 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); 01322 return( ret ); 01323 } 01324 01325 /* Done reading this record, get ready for the next one */ 01326 #if defined(MBEDTLS_SSL_PROTO_DTLS) 01327 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 01328 ssl->next_record_offset = msg_len + mbedtls_ssl_hdr_len( ssl ); 01329 else 01330 #endif 01331 ssl->in_left = 0; 01332 } 01333 01334 buf = ssl->in_msg; 01335 01336 MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, msg_len ); 01337 01338 ssl->handshake->update_checksum( ssl, buf, msg_len ); 01339 01340 /* 01341 * Handshake layer: 01342 * 0 . 0 handshake type 01343 * 1 . 3 handshake length 01344 * 4 . 5 DTLS only: message seqence number 01345 * 6 . 8 DTLS only: fragment offset 01346 * 9 . 11 DTLS only: fragment length 01347 */ 01348 if( msg_len < mbedtls_ssl_hs_hdr_len( ssl ) ) 01349 { 01350 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01351 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01352 } 01353 01354 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d", buf[0] ) ); 01355 01356 if( buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO ) 01357 { 01358 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01359 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01360 } 01361 01362 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d", 01363 ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) ); 01364 01365 /* We don't support fragmentation of ClientHello (yet?) */ 01366 if( buf[1] != 0 || 01367 msg_len != mbedtls_ssl_hs_hdr_len( ssl ) + ( ( buf[2] << 8 ) | buf[3] ) ) 01368 { 01369 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01370 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01371 } 01372 01373 #if defined(MBEDTLS_SSL_PROTO_DTLS) 01374 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 01375 { 01376 /* 01377 * Copy the client's handshake message_seq on initial handshakes, 01378 * check sequence number on renego. 01379 */ 01380 #if defined(MBEDTLS_SSL_RENEGOTIATION) 01381 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) 01382 { 01383 /* This couldn't be done in ssl_prepare_handshake_record() */ 01384 unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) | 01385 ssl->in_msg[5]; 01386 01387 if( cli_msg_seq != ssl->handshake->in_msg_seq ) 01388 { 01389 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message_seq: " 01390 "%d (expected %d)", cli_msg_seq, 01391 ssl->handshake->in_msg_seq ) ); 01392 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01393 } 01394 01395 ssl->handshake->in_msg_seq++; 01396 } 01397 else 01398 #endif 01399 { 01400 unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) | 01401 ssl->in_msg[5]; 01402 ssl->handshake->out_msg_seq = cli_msg_seq; 01403 ssl->handshake->in_msg_seq = cli_msg_seq + 1; 01404 } 01405 01406 /* 01407 * For now we don't support fragmentation, so make sure 01408 * fragment_offset == 0 and fragment_length == length 01409 */ 01410 if( ssl->in_msg[6] != 0 || ssl->in_msg[7] != 0 || ssl->in_msg[8] != 0 || 01411 memcmp( ssl->in_msg + 1, ssl->in_msg + 9, 3 ) != 0 ) 01412 { 01413 MBEDTLS_SSL_DEBUG_MSG( 1, ( "ClientHello fragmentation not supported" ) ); 01414 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); 01415 } 01416 } 01417 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 01418 01419 buf += mbedtls_ssl_hs_hdr_len( ssl ); 01420 msg_len -= mbedtls_ssl_hs_hdr_len( ssl ); 01421 01422 /* 01423 * ClientHello layer: 01424 * 0 . 1 protocol version 01425 * 2 . 33 random bytes (starting with 4 bytes of Unix time) 01426 * 34 . 35 session id length (1 byte) 01427 * 35 . 34+x session id 01428 * 35+x . 35+x DTLS only: cookie length (1 byte) 01429 * 36+x . .. DTLS only: cookie 01430 * .. . .. ciphersuite list length (2 bytes) 01431 * .. . .. ciphersuite list 01432 * .. . .. compression alg. list length (1 byte) 01433 * .. . .. compression alg. list 01434 * .. . .. extensions length (2 bytes, optional) 01435 * .. . .. extensions (optional) 01436 */ 01437 01438 /* 01439 * Minimal length (with everything empty and extensions ommitted) is 01440 * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can 01441 * read at least up to session id length without worrying. 01442 */ 01443 if( msg_len < 38 ) 01444 { 01445 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01446 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01447 } 01448 01449 /* 01450 * Check and save the protocol version 01451 */ 01452 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, version", buf, 2 ); 01453 01454 mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver, 01455 ssl->conf->transport, buf ); 01456 01457 ssl->handshake->max_major_ver = ssl->major_ver; 01458 ssl->handshake->max_minor_ver = ssl->minor_ver; 01459 01460 if( ssl->major_ver < ssl->conf->min_major_ver || 01461 ssl->minor_ver < ssl->conf->min_minor_ver ) 01462 { 01463 MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum" 01464 " [%d:%d] < [%d:%d]", 01465 ssl->major_ver, ssl->minor_ver, 01466 ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) ); 01467 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01468 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); 01469 return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); 01470 } 01471 01472 if( ssl->major_ver > ssl->conf->max_major_ver ) 01473 { 01474 ssl->major_ver = ssl->conf->max_major_ver; 01475 ssl->minor_ver = ssl->conf->max_minor_ver; 01476 } 01477 else if( ssl->minor_ver > ssl->conf->max_minor_ver ) 01478 ssl->minor_ver = ssl->conf->max_minor_ver; 01479 01480 /* 01481 * Save client random (inc. Unix time) 01482 */ 01483 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 2, 32 ); 01484 01485 memcpy( ssl->handshake->randbytes, buf + 2, 32 ); 01486 01487 /* 01488 * Check the session ID length and save session ID 01489 */ 01490 sess_len = buf[34]; 01491 01492 if( sess_len > sizeof( ssl->session_negotiate->id ) || 01493 sess_len + 34 + 2 > msg_len ) /* 2 for cipherlist length field */ 01494 { 01495 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01496 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01497 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 01498 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01499 } 01500 01501 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 35, sess_len ); 01502 01503 ssl->session_negotiate->id_len = sess_len; 01504 memset( ssl->session_negotiate->id, 0, 01505 sizeof( ssl->session_negotiate->id ) ); 01506 memcpy( ssl->session_negotiate->id, buf + 35, 01507 ssl->session_negotiate->id_len ); 01508 01509 /* 01510 * Check the cookie length and content 01511 */ 01512 #if defined(MBEDTLS_SSL_PROTO_DTLS) 01513 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 01514 { 01515 cookie_offset = 35 + sess_len; 01516 cookie_len = buf[cookie_offset]; 01517 01518 if( cookie_offset + 1 + cookie_len + 2 > msg_len ) 01519 { 01520 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01521 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01522 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); 01523 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01524 } 01525 01526 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie", 01527 buf + cookie_offset + 1, cookie_len ); 01528 01529 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) 01530 if( ssl->conf->f_cookie_check != NULL 01531 #if defined(MBEDTLS_SSL_RENEGOTIATION) 01532 && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE 01533 #endif 01534 ) 01535 { 01536 if( ssl->conf->f_cookie_check( ssl->conf->p_cookie, 01537 buf + cookie_offset + 1, cookie_len, 01538 ssl->cli_id, ssl->cli_id_len ) != 0 ) 01539 { 01540 MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification failed" ) ); 01541 ssl->handshake->verify_cookie_len = 1; 01542 } 01543 else 01544 { 01545 MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification passed" ) ); 01546 ssl->handshake->verify_cookie_len = 0; 01547 } 01548 } 01549 else 01550 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ 01551 { 01552 /* We know we didn't send a cookie, so it should be empty */ 01553 if( cookie_len != 0 ) 01554 { 01555 /* This may be an attacker's probe, so don't send an alert */ 01556 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01557 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01558 } 01559 01560 MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification skipped" ) ); 01561 } 01562 01563 /* 01564 * Check the ciphersuitelist length (will be parsed later) 01565 */ 01566 ciph_offset = cookie_offset + 1 + cookie_len; 01567 } 01568 else 01569 #endif /* MBEDTLS_SSL_PROTO_DTLS */ 01570 ciph_offset = 35 + sess_len; 01571 01572 ciph_len = ( buf[ciph_offset + 0] << 8 ) 01573 | ( buf[ciph_offset + 1] ); 01574 01575 if( ciph_len < 2 || 01576 ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */ 01577 ( ciph_len % 2 ) != 0 ) 01578 { 01579 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01580 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01581 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 01582 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01583 } 01584 01585 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist", 01586 buf + ciph_offset + 2, ciph_len ); 01587 01588 /* 01589 * Check the compression algorithms length and pick one 01590 */ 01591 comp_offset = ciph_offset + 2 + ciph_len; 01592 01593 comp_len = buf[comp_offset]; 01594 01595 if( comp_len < 1 || 01596 comp_len > 16 || 01597 comp_len + comp_offset + 1 > msg_len ) 01598 { 01599 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01600 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01601 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 01602 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01603 } 01604 01605 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, compression", 01606 buf + comp_offset + 1, comp_len ); 01607 01608 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL; 01609 #if defined(MBEDTLS_ZLIB_SUPPORT) 01610 for( i = 0; i < comp_len; ++i ) 01611 { 01612 if( buf[comp_offset + 1 + i] == MBEDTLS_SSL_COMPRESS_DEFLATE ) 01613 { 01614 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_DEFLATE; 01615 break; 01616 } 01617 } 01618 #endif 01619 01620 /* See comments in ssl_write_client_hello() */ 01621 #if defined(MBEDTLS_SSL_PROTO_DTLS) 01622 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 01623 ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL; 01624 #endif 01625 01626 /* Do not parse the extensions if the protocol is SSLv3 */ 01627 #if defined(MBEDTLS_SSL_PROTO_SSL3) 01628 if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) ) 01629 { 01630 #endif 01631 /* 01632 * Check the extension length 01633 */ 01634 ext_offset = comp_offset + 1 + comp_len; 01635 if( msg_len > ext_offset ) 01636 { 01637 if( msg_len < ext_offset + 2 ) 01638 { 01639 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01640 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01641 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 01642 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01643 } 01644 01645 ext_len = ( buf[ext_offset + 0] << 8 ) 01646 | ( buf[ext_offset + 1] ); 01647 01648 if( ( ext_len > 0 && ext_len < 4 ) || 01649 msg_len != ext_offset + 2 + ext_len ) 01650 { 01651 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01652 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01653 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 01654 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01655 } 01656 } 01657 else 01658 ext_len = 0; 01659 01660 ext = buf + ext_offset + 2; 01661 MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", ext, ext_len ); 01662 01663 while( ext_len != 0 ) 01664 { 01665 unsigned int ext_id = ( ( ext[0] << 8 ) 01666 | ( ext[1] ) ); 01667 unsigned int ext_size = ( ( ext[2] << 8 ) 01668 | ( ext[3] ) ); 01669 01670 if( ext_size + 4 > ext_len ) 01671 { 01672 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01673 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01674 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 01675 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01676 } 01677 switch( ext_id ) 01678 { 01679 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 01680 case MBEDTLS_TLS_EXT_SERVERNAME: 01681 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) ); 01682 if( ssl->conf->f_sni == NULL ) 01683 break; 01684 01685 ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size ); 01686 if( ret != 0 ) 01687 return( ret ); 01688 break; 01689 #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ 01690 01691 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO: 01692 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) ); 01693 #if defined(MBEDTLS_SSL_RENEGOTIATION) 01694 renegotiation_info_seen = 1; 01695 #endif 01696 01697 ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ); 01698 if( ret != 0 ) 01699 return( ret ); 01700 break; 01701 01702 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ 01703 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 01704 case MBEDTLS_TLS_EXT_SIG_ALG: 01705 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) ); 01706 01707 ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size ); 01708 if( ret != 0 ) 01709 return( ret ); 01710 01711 sig_hash_alg_ext_present = 1; 01712 break; 01713 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && 01714 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ 01715 01716 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ 01717 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 01718 case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES: 01719 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) ); 01720 01721 ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size ); 01722 if( ret != 0 ) 01723 return( ret ); 01724 break; 01725 01726 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS: 01727 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported point formats extension" ) ); 01728 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT; 01729 01730 ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size ); 01731 if( ret != 0 ) 01732 return( ret ); 01733 break; 01734 #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || 01735 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 01736 01737 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 01738 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP: 01739 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake kkpp extension" ) ); 01740 01741 ret = ssl_parse_ecjpake_kkpp( ssl, ext + 4, ext_size ); 01742 if( ret != 0 ) 01743 return( ret ); 01744 break; 01745 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 01746 01747 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) 01748 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH: 01749 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) ); 01750 01751 ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size ); 01752 if( ret != 0 ) 01753 return( ret ); 01754 break; 01755 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ 01756 01757 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) 01758 case MBEDTLS_TLS_EXT_TRUNCATED_HMAC: 01759 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) ); 01760 01761 ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size ); 01762 if( ret != 0 ) 01763 return( ret ); 01764 break; 01765 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ 01766 01767 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 01768 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC: 01769 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt then mac extension" ) ); 01770 01771 ret = ssl_parse_encrypt_then_mac_ext( ssl, ext + 4, ext_size ); 01772 if( ret != 0 ) 01773 return( ret ); 01774 break; 01775 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ 01776 01777 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) 01778 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET: 01779 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended master secret extension" ) ); 01780 01781 ret = ssl_parse_extended_ms_ext( ssl, ext + 4, ext_size ); 01782 if( ret != 0 ) 01783 return( ret ); 01784 break; 01785 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ 01786 01787 #if defined(MBEDTLS_SSL_SESSION_TICKETS) 01788 case MBEDTLS_TLS_EXT_SESSION_TICKET: 01789 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) ); 01790 01791 ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size ); 01792 if( ret != 0 ) 01793 return( ret ); 01794 break; 01795 #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 01796 01797 #if defined(MBEDTLS_SSL_ALPN) 01798 case MBEDTLS_TLS_EXT_ALPN: 01799 MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) ); 01800 01801 ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ); 01802 if( ret != 0 ) 01803 return( ret ); 01804 break; 01805 #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 01806 01807 default: 01808 MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)", 01809 ext_id ) ); 01810 } 01811 01812 ext_len -= 4 + ext_size; 01813 ext += 4 + ext_size; 01814 01815 if( ext_len > 0 && ext_len < 4 ) 01816 { 01817 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); 01818 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01819 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); 01820 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01821 } 01822 } 01823 #if defined(MBEDTLS_SSL_PROTO_SSL3) 01824 } 01825 #endif 01826 01827 #if defined(MBEDTLS_SSL_FALLBACK_SCSV) 01828 for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 ) 01829 { 01830 if( p[0] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) && 01831 p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) ) 01832 { 01833 MBEDTLS_SSL_DEBUG_MSG( 2, ( "received FALLBACK_SCSV" ) ); 01834 01835 if( ssl->minor_ver < ssl->conf->max_minor_ver ) 01836 { 01837 MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) ); 01838 01839 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01840 MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK ); 01841 01842 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01843 } 01844 01845 break; 01846 } 01847 } 01848 #endif /* MBEDTLS_SSL_FALLBACK_SCSV */ 01849 01850 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ 01851 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 01852 01853 /* 01854 * Try to fall back to default hash SHA1 if the client 01855 * hasn't provided any preferred signature-hash combinations. 01856 */ 01857 if( sig_hash_alg_ext_present == 0 ) 01858 { 01859 mbedtls_md_type_t md_default = MBEDTLS_MD_SHA1; 01860 01861 if( mbedtls_ssl_check_sig_hash( ssl, md_default ) != 0 ) 01862 md_default = MBEDTLS_MD_NONE; 01863 01864 mbedtls_ssl_sig_hash_set_const_hash( &ssl->handshake->hash_algs, md_default ); 01865 } 01866 01867 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && 01868 MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ 01869 01870 /* 01871 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV 01872 */ 01873 for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 ) 01874 { 01875 if( p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO ) 01876 { 01877 MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) ); 01878 #if defined(MBEDTLS_SSL_RENEGOTIATION) 01879 if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) 01880 { 01881 MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV " 01882 "during renegotiation" ) ); 01883 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01884 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); 01885 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01886 } 01887 #endif 01888 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; 01889 break; 01890 } 01891 } 01892 01893 /* 01894 * Renegotiation security checks 01895 */ 01896 if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION && 01897 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE ) 01898 { 01899 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); 01900 handshake_failure = 1; 01901 } 01902 #if defined(MBEDTLS_SSL_RENEGOTIATION) 01903 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && 01904 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION && 01905 renegotiation_info_seen == 0 ) 01906 { 01907 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) ); 01908 handshake_failure = 1; 01909 } 01910 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && 01911 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && 01912 ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) 01913 { 01914 MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) ); 01915 handshake_failure = 1; 01916 } 01917 else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && 01918 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && 01919 renegotiation_info_seen == 1 ) 01920 { 01921 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) ); 01922 handshake_failure = 1; 01923 } 01924 #endif /* MBEDTLS_SSL_RENEGOTIATION */ 01925 01926 if( handshake_failure == 1 ) 01927 { 01928 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01929 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); 01930 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); 01931 } 01932 01933 /* 01934 * Search for a matching ciphersuite 01935 * (At the end because we need information from the EC-based extensions 01936 * and certificate from the SNI callback triggered by the SNI extension.) 01937 */ 01938 got_common_suite = 0; 01939 ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; 01940 ciphersuite_info = NULL; 01941 #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) 01942 for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 ) 01943 for( i = 0; ciphersuites[i] != 0; i++ ) 01944 #else 01945 for( i = 0; ciphersuites[i] != 0; i++ ) 01946 for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 ) 01947 #endif 01948 { 01949 if( p[0] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) || 01950 p[1] != ( ( ciphersuites[i] ) & 0xFF ) ) 01951 continue; 01952 01953 got_common_suite = 1; 01954 01955 if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i], 01956 &ciphersuite_info ) ) != 0 ) 01957 return( ret ); 01958 01959 if( ciphersuite_info != NULL ) 01960 goto have_ciphersuite; 01961 } 01962 01963 if( got_common_suite ) 01964 { 01965 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, " 01966 "but none of them usable" ) ); 01967 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01968 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); 01969 return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE ); 01970 } 01971 else 01972 { 01973 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) ); 01974 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 01975 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); 01976 return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN ); 01977 } 01978 01979 have_ciphersuite: 01980 MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) ); 01981 01982 ssl->session_negotiate->ciphersuite = ciphersuites[i]; 01983 ssl->transform_negotiate->ciphersuite_info = ciphersuite_info; 01984 01985 ssl->state++; 01986 01987 #if defined(MBEDTLS_SSL_PROTO_DTLS) 01988 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 01989 mbedtls_ssl_recv_flight_completed( ssl ); 01990 #endif 01991 01992 /* Debugging-only output for testsuite */ 01993 #if defined(MBEDTLS_DEBUG_C) && \ 01994 defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ 01995 defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) 01996 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) 01997 { 01998 mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg( ciphersuite_info ); 01999 if( sig_alg != MBEDTLS_PK_NONE ) 02000 { 02001 mbedtls_md_type_t md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, 02002 sig_alg ); 02003 MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d", 02004 mbedtls_ssl_hash_from_md_alg( md_alg ) ) ); 02005 } 02006 else 02007 { 02008 MBEDTLS_SSL_DEBUG_MSG( 3, ( "no hash algorithm for signature algorithm " 02009 "%d - should not happen", sig_alg ) ); 02010 } 02011 } 02012 #endif 02013 02014 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) ); 02015 02016 return( 0 ); 02017 } 02018 02019 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) 02020 static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl, 02021 unsigned char *buf, 02022 size_t *olen ) 02023 { 02024 unsigned char *p = buf; 02025 02026 if( ssl->session_negotiate->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ) 02027 { 02028 *olen = 0; 02029 return; 02030 } 02031 02032 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding truncated hmac extension" ) ); 02033 02034 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF ); 02035 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF ); 02036 02037 *p++ = 0x00; 02038 *p++ = 0x00; 02039 02040 *olen = 4; 02041 } 02042 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ 02043 02044 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 02045 static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, 02046 unsigned char *buf, 02047 size_t *olen ) 02048 { 02049 unsigned char *p = buf; 02050 const mbedtls_ssl_ciphersuite_t *suite = NULL; 02051 const mbedtls_cipher_info_t *cipher = NULL; 02052 02053 if( ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED || 02054 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 02055 { 02056 *olen = 0; 02057 return; 02058 } 02059 02060 /* 02061 * RFC 7366: "If a server receives an encrypt-then-MAC request extension 02062 * from a client and then selects a stream or Authenticated Encryption 02063 * with Associated Data (AEAD) ciphersuite, it MUST NOT send an 02064 * encrypt-then-MAC response extension back to the client." 02065 */ 02066 if( ( suite = mbedtls_ssl_ciphersuite_from_id( 02067 ssl->session_negotiate->ciphersuite ) ) == NULL || 02068 ( cipher = mbedtls_cipher_info_from_type( suite->cipher ) ) == NULL || 02069 cipher->mode != MBEDTLS_MODE_CBC ) 02070 { 02071 *olen = 0; 02072 return; 02073 } 02074 02075 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding encrypt then mac extension" ) ); 02076 02077 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF ); 02078 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF ); 02079 02080 *p++ = 0x00; 02081 *p++ = 0x00; 02082 02083 *olen = 4; 02084 } 02085 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ 02086 02087 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) 02088 static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl, 02089 unsigned char *buf, 02090 size_t *olen ) 02091 { 02092 unsigned char *p = buf; 02093 02094 if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED || 02095 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) 02096 { 02097 *olen = 0; 02098 return; 02099 } 02100 02101 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding extended master secret " 02102 "extension" ) ); 02103 02104 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF ); 02105 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF ); 02106 02107 *p++ = 0x00; 02108 *p++ = 0x00; 02109 02110 *olen = 4; 02111 } 02112 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ 02113 02114 #if defined(MBEDTLS_SSL_SESSION_TICKETS) 02115 static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl, 02116 unsigned char *buf, 02117 size_t *olen ) 02118 { 02119 unsigned char *p = buf; 02120 02121 if( ssl->handshake->new_session_ticket == 0 ) 02122 { 02123 *olen = 0; 02124 return; 02125 } 02126 02127 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding session ticket extension" ) ); 02128 02129 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF ); 02130 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF ); 02131 02132 *p++ = 0x00; 02133 *p++ = 0x00; 02134 02135 *olen = 4; 02136 } 02137 #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 02138 02139 static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl, 02140 unsigned char *buf, 02141 size_t *olen ) 02142 { 02143 unsigned char *p = buf; 02144 02145 if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION ) 02146 { 02147 *olen = 0; 02148 return; 02149 } 02150 02151 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, secure renegotiation extension" ) ); 02152 02153 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF ); 02154 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF ); 02155 02156 #if defined(MBEDTLS_SSL_RENEGOTIATION) 02157 if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) 02158 { 02159 *p++ = 0x00; 02160 *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF; 02161 *p++ = ssl->verify_data_len * 2 & 0xFF; 02162 02163 memcpy( p, ssl->peer_verify_data, ssl->verify_data_len ); 02164 p += ssl->verify_data_len; 02165 memcpy( p, ssl->own_verify_data, ssl->verify_data_len ); 02166 p += ssl->verify_data_len; 02167 } 02168 else 02169 #endif /* MBEDTLS_SSL_RENEGOTIATION */ 02170 { 02171 *p++ = 0x00; 02172 *p++ = 0x01; 02173 *p++ = 0x00; 02174 } 02175 02176 *olen = p - buf; 02177 } 02178 02179 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) 02180 static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl, 02181 unsigned char *buf, 02182 size_t *olen ) 02183 { 02184 unsigned char *p = buf; 02185 02186 if( ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) 02187 { 02188 *olen = 0; 02189 return; 02190 } 02191 02192 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, max_fragment_length extension" ) ); 02193 02194 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF ); 02195 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF ); 02196 02197 *p++ = 0x00; 02198 *p++ = 1; 02199 02200 *p++ = ssl->session_negotiate->mfl_code; 02201 02202 *olen = 5; 02203 } 02204 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ 02205 02206 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ 02207 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 02208 static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl, 02209 unsigned char *buf, 02210 size_t *olen ) 02211 { 02212 unsigned char *p = buf; 02213 ((void) ssl); 02214 02215 if( ( ssl->handshake->cli_exts & 02216 MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT ) == 0 ) 02217 { 02218 *olen = 0; 02219 return; 02220 } 02221 02222 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, supported_point_formats extension" ) ); 02223 02224 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF ); 02225 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF ); 02226 02227 *p++ = 0x00; 02228 *p++ = 2; 02229 02230 *p++ = 1; 02231 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED; 02232 02233 *olen = 6; 02234 } 02235 #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 02236 02237 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 02238 static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl, 02239 unsigned char *buf, 02240 size_t *olen ) 02241 { 02242 int ret; 02243 unsigned char *p = buf; 02244 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN; 02245 size_t kkpp_len; 02246 02247 *olen = 0; 02248 02249 /* Skip costly computation if not needed */ 02250 if( ssl->transform_negotiate->ciphersuite_info->key_exchange != 02251 MBEDTLS_KEY_EXCHANGE_ECJPAKE ) 02252 return; 02253 02254 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, ecjpake kkpp extension" ) ); 02255 02256 if( end - p < 4 ) 02257 { 02258 MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); 02259 return; 02260 } 02261 02262 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF ); 02263 *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF ); 02264 02265 ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx, 02266 p + 2, end - p - 2, &kkpp_len, 02267 ssl->conf->f_rng, ssl->conf->p_rng ); 02268 if( ret != 0 ) 02269 { 02270 MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret ); 02271 return; 02272 } 02273 02274 *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF ); 02275 *p++ = (unsigned char)( ( kkpp_len ) & 0xFF ); 02276 02277 *olen = kkpp_len + 4; 02278 } 02279 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 02280 02281 #if defined(MBEDTLS_SSL_ALPN ) 02282 static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl, 02283 unsigned char *buf, size_t *olen ) 02284 { 02285 if( ssl->alpn_chosen == NULL ) 02286 { 02287 *olen = 0; 02288 return; 02289 } 02290 02291 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding alpn extension" ) ); 02292 02293 /* 02294 * 0 . 1 ext identifier 02295 * 2 . 3 ext length 02296 * 4 . 5 protocol list length 02297 * 6 . 6 protocol name length 02298 * 7 . 7+n protocol name 02299 */ 02300 buf[0] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF ); 02301 buf[1] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF ); 02302 02303 *olen = 7 + strlen( ssl->alpn_chosen ); 02304 02305 buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF ); 02306 buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF ); 02307 02308 buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF ); 02309 buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF ); 02310 02311 buf[6] = (unsigned char)( ( ( *olen - 7 ) ) & 0xFF ); 02312 02313 memcpy( buf + 7, ssl->alpn_chosen, *olen - 7 ); 02314 } 02315 #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */ 02316 02317 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) 02318 static int ssl_write_hello_verify_request( mbedtls_ssl_context *ssl ) 02319 { 02320 int ret; 02321 unsigned char *p = ssl->out_msg + 4; 02322 unsigned char *cookie_len_byte; 02323 02324 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello verify request" ) ); 02325 02326 /* 02327 * struct { 02328 * ProtocolVersion server_version; 02329 * opaque cookie<0..2^8-1>; 02330 * } HelloVerifyRequest; 02331 */ 02332 02333 /* The RFC is not clear on this point, but sending the actual negotiated 02334 * version looks like the most interoperable thing to do. */ 02335 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, 02336 ssl->conf->transport, p ); 02337 MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 ); 02338 p += 2; 02339 02340 /* If we get here, f_cookie_check is not null */ 02341 if( ssl->conf->f_cookie_write == NULL ) 02342 { 02343 MBEDTLS_SSL_DEBUG_MSG( 1, ( "inconsistent cookie callbacks" ) ); 02344 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 02345 } 02346 02347 /* Skip length byte until we know the length */ 02348 cookie_len_byte = p++; 02349 02350 if( ( ret = ssl->conf->f_cookie_write( ssl->conf->p_cookie, 02351 &p, ssl->out_buf + MBEDTLS_SSL_BUFFER_LEN, 02352 ssl->cli_id, ssl->cli_id_len ) ) != 0 ) 02353 { 02354 MBEDTLS_SSL_DEBUG_RET( 1, "f_cookie_write", ret ); 02355 return( ret ); 02356 } 02357 02358 *cookie_len_byte = (unsigned char)( p - ( cookie_len_byte + 1 ) ); 02359 02360 MBEDTLS_SSL_DEBUG_BUF( 3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte ); 02361 02362 ssl->out_msglen = p - ssl->out_msg; 02363 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; 02364 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST; 02365 02366 ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT; 02367 02368 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 02369 { 02370 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 02371 return( ret ); 02372 } 02373 02374 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello verify request" ) ); 02375 02376 return( 0 ); 02377 } 02378 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ 02379 02380 static int ssl_write_server_hello( mbedtls_ssl_context *ssl ) 02381 { 02382 #if defined(MBEDTLS_HAVE_TIME) 02383 mbedtls_time_t t; 02384 #endif 02385 int ret; 02386 size_t olen, ext_len = 0, n; 02387 unsigned char *buf, *p; 02388 02389 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello" ) ); 02390 02391 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) 02392 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 02393 ssl->handshake->verify_cookie_len != 0 ) 02394 { 02395 MBEDTLS_SSL_DEBUG_MSG( 2, ( "client hello was not authenticated" ) ); 02396 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) ); 02397 02398 return( ssl_write_hello_verify_request( ssl ) ); 02399 } 02400 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ 02401 02402 if( ssl->conf->f_rng == NULL ) 02403 { 02404 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") ); 02405 return( MBEDTLS_ERR_SSL_NO_RNG ); 02406 } 02407 02408 /* 02409 * 0 . 0 handshake type 02410 * 1 . 3 handshake length 02411 * 4 . 5 protocol version 02412 * 6 . 9 UNIX time() 02413 * 10 . 37 random bytes 02414 */ 02415 buf = ssl->out_msg; 02416 p = buf + 4; 02417 02418 mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, 02419 ssl->conf->transport, p ); 02420 p += 2; 02421 02422 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]", 02423 buf[4], buf[5] ) ); 02424 02425 #if defined(MBEDTLS_HAVE_TIME) 02426 t = mbedtls_time( NULL ); 02427 *p++ = (unsigned char)( t >> 24 ); 02428 *p++ = (unsigned char)( t >> 16 ); 02429 *p++ = (unsigned char)( t >> 8 ); 02430 *p++ = (unsigned char)( t ); 02431 02432 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) ); 02433 #else 02434 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 ) 02435 return( ret ); 02436 02437 p += 4; 02438 #endif /* MBEDTLS_HAVE_TIME */ 02439 02440 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 ) 02441 return( ret ); 02442 02443 p += 28; 02444 02445 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 ); 02446 02447 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 ); 02448 02449 /* 02450 * Resume is 0 by default, see ssl_handshake_init(). 02451 * It may be already set to 1 by ssl_parse_session_ticket_ext(). 02452 * If not, try looking up session ID in our cache. 02453 */ 02454 if( ssl->handshake->resume == 0 && 02455 #if defined(MBEDTLS_SSL_RENEGOTIATION) 02456 ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE && 02457 #endif 02458 ssl->session_negotiate->id_len != 0 && 02459 ssl->conf->f_get_cache != NULL && 02460 ssl->conf->f_get_cache( ssl->conf->p_cache, ssl->session_negotiate ) == 0 ) 02461 { 02462 MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from cache" ) ); 02463 ssl->handshake->resume = 1; 02464 } 02465 02466 if( ssl->handshake->resume == 0 ) 02467 { 02468 /* 02469 * New session, create a new session id, 02470 * unless we're about to issue a session ticket 02471 */ 02472 ssl->state++; 02473 02474 #if defined(MBEDTLS_HAVE_TIME) 02475 ssl->session_negotiate->start = mbedtls_time( NULL ); 02476 #endif 02477 02478 #if defined(MBEDTLS_SSL_SESSION_TICKETS) 02479 if( ssl->handshake->new_session_ticket != 0 ) 02480 { 02481 ssl->session_negotiate->id_len = n = 0; 02482 memset( ssl->session_negotiate->id, 0, 32 ); 02483 } 02484 else 02485 #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 02486 { 02487 ssl->session_negotiate->id_len = n = 32; 02488 if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id, 02489 n ) ) != 0 ) 02490 return( ret ); 02491 } 02492 } 02493 else 02494 { 02495 /* 02496 * Resuming a session 02497 */ 02498 n = ssl->session_negotiate->id_len; 02499 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC; 02500 02501 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) 02502 { 02503 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); 02504 return( ret ); 02505 } 02506 } 02507 02508 /* 02509 * 38 . 38 session id length 02510 * 39 . 38+n session id 02511 * 39+n . 40+n chosen ciphersuite 02512 * 41+n . 41+n chosen compression alg. 02513 * 42+n . 43+n extensions length 02514 * 44+n . 43+n+m extensions 02515 */ 02516 *p++ = (unsigned char) ssl->session_negotiate->id_len; 02517 memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->id_len ); 02518 p += ssl->session_negotiate->id_len; 02519 02520 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) ); 02521 MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n ); 02522 MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed", 02523 ssl->handshake->resume ? "a" : "no" ) ); 02524 02525 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 ); 02526 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite ); 02527 *p++ = (unsigned char)( ssl->session_negotiate->compression ); 02528 02529 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s", 02530 mbedtls_ssl_get_ciphersuite_name( ssl->session_negotiate->ciphersuite ) ) ); 02531 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: 0x%02X", 02532 ssl->session_negotiate->compression ) ); 02533 02534 /* Do not write the extensions if the protocol is SSLv3 */ 02535 #if defined(MBEDTLS_SSL_PROTO_SSL3) 02536 if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) ) 02537 { 02538 #endif 02539 02540 /* 02541 * First write extensions, then the total length 02542 */ 02543 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen ); 02544 ext_len += olen; 02545 02546 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) 02547 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen ); 02548 ext_len += olen; 02549 #endif 02550 02551 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) 02552 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen ); 02553 ext_len += olen; 02554 #endif 02555 02556 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) 02557 ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen ); 02558 ext_len += olen; 02559 #endif 02560 02561 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) 02562 ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen ); 02563 ext_len += olen; 02564 #endif 02565 02566 #if defined(MBEDTLS_SSL_SESSION_TICKETS) 02567 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen ); 02568 ext_len += olen; 02569 #endif 02570 02571 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ 02572 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 02573 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen ); 02574 ext_len += olen; 02575 #endif 02576 02577 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 02578 ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen ); 02579 ext_len += olen; 02580 #endif 02581 02582 #if defined(MBEDTLS_SSL_ALPN) 02583 ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen ); 02584 ext_len += olen; 02585 #endif 02586 02587 MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d", ext_len ) ); 02588 02589 if( ext_len > 0 ) 02590 { 02591 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF ); 02592 *p++ = (unsigned char)( ( ext_len ) & 0xFF ); 02593 p += ext_len; 02594 } 02595 02596 #if defined(MBEDTLS_SSL_PROTO_SSL3) 02597 } 02598 #endif 02599 02600 ssl->out_msglen = p - buf; 02601 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; 02602 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO; 02603 02604 ret = mbedtls_ssl_write_record( ssl ); 02605 02606 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) ); 02607 02608 return( ret ); 02609 } 02610 02611 #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ 02612 !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ 02613 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ 02614 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ 02615 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \ 02616 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) 02617 static int ssl_write_certificate_request( mbedtls_ssl_context *ssl ) 02618 { 02619 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = 02620 ssl->transform_negotiate->ciphersuite_info; 02621 02622 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) ); 02623 02624 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || 02625 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || 02626 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || 02627 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || 02628 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) 02629 { 02630 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) ); 02631 ssl->state++; 02632 return( 0 ); 02633 } 02634 02635 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 02636 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 02637 } 02638 #else 02639 static int ssl_write_certificate_request( mbedtls_ssl_context *ssl ) 02640 { 02641 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; 02642 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = 02643 ssl->transform_negotiate->ciphersuite_info; 02644 size_t dn_size, total_dn_size; /* excluding length bytes */ 02645 size_t ct_len, sa_len; /* including length bytes */ 02646 unsigned char *buf, *p; 02647 const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN; 02648 const mbedtls_x509_crt *crt; 02649 int authmode; 02650 02651 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) ); 02652 02653 ssl->state++; 02654 02655 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 02656 if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET ) 02657 authmode = ssl->handshake->sni_authmode; 02658 else 02659 #endif 02660 authmode = ssl->conf->authmode; 02661 02662 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || 02663 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || 02664 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || 02665 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || 02666 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE || 02667 authmode == MBEDTLS_SSL_VERIFY_NONE ) 02668 { 02669 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) ); 02670 return( 0 ); 02671 } 02672 02673 /* 02674 * 0 . 0 handshake type 02675 * 1 . 3 handshake length 02676 * 4 . 4 cert type count 02677 * 5 .. m-1 cert types 02678 * m .. m+1 sig alg length (TLS 1.2 only) 02679 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only) 02680 * n .. n+1 length of all DNs 02681 * n+2 .. n+3 length of DN 1 02682 * n+4 .. ... Distinguished Name #1 02683 * ... .. ... length of DN 2, etc. 02684 */ 02685 buf = ssl->out_msg; 02686 p = buf + 4; 02687 02688 /* 02689 * Supported certificate types 02690 * 02691 * ClientCertificateType certificate_types<1..2^8-1>; 02692 * enum { (255) } ClientCertificateType; 02693 */ 02694 ct_len = 0; 02695 02696 #if defined(MBEDTLS_RSA_C) 02697 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN; 02698 #endif 02699 #if defined(MBEDTLS_ECDSA_C) 02700 p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN; 02701 #endif 02702 02703 p[0] = (unsigned char) ct_len++; 02704 p += ct_len; 02705 02706 sa_len = 0; 02707 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 02708 /* 02709 * Add signature_algorithms for verify (TLS 1.2) 02710 * 02711 * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>; 02712 * 02713 * struct { 02714 * HashAlgorithm hash; 02715 * SignatureAlgorithm signature; 02716 * } SignatureAndHashAlgorithm; 02717 * 02718 * enum { (255) } HashAlgorithm; 02719 * enum { (255) } SignatureAlgorithm; 02720 */ 02721 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) 02722 { 02723 const int *cur; 02724 02725 /* 02726 * Supported signature algorithms 02727 */ 02728 for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ ) 02729 { 02730 unsigned char hash = mbedtls_ssl_hash_from_md_alg( *cur ); 02731 02732 if( MBEDTLS_SSL_HASH_NONE == hash || mbedtls_ssl_set_calc_verify_md( ssl, hash ) ) 02733 continue; 02734 02735 #if defined(MBEDTLS_RSA_C) 02736 p[2 + sa_len++] = hash; 02737 p[2 + sa_len++] = MBEDTLS_SSL_SIG_RSA; 02738 #endif 02739 #if defined(MBEDTLS_ECDSA_C) 02740 p[2 + sa_len++] = hash; 02741 p[2 + sa_len++] = MBEDTLS_SSL_SIG_ECDSA; 02742 #endif 02743 } 02744 02745 p[0] = (unsigned char)( sa_len >> 8 ); 02746 p[1] = (unsigned char)( sa_len ); 02747 sa_len += 2; 02748 p += sa_len; 02749 } 02750 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 02751 02752 /* 02753 * DistinguishedName certificate_authorities<0..2^16-1>; 02754 * opaque DistinguishedName<1..2^16-1>; 02755 */ 02756 p += 2; 02757 02758 total_dn_size = 0; 02759 02760 if( ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED ) 02761 { 02762 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) 02763 if( ssl->handshake->sni_ca_chain != NULL ) 02764 crt = ssl->handshake->sni_ca_chain; 02765 else 02766 #endif 02767 crt = ssl->conf->ca_chain; 02768 02769 while( crt != NULL && crt->version != 0 ) 02770 { 02771 dn_size = crt->subject_raw.len; 02772 02773 if( end < p || 02774 (size_t)( end - p ) < dn_size || 02775 (size_t)( end - p ) < 2 + dn_size ) 02776 { 02777 MBEDTLS_SSL_DEBUG_MSG( 1, ( "skipping CAs: buffer too short" ) ); 02778 break; 02779 } 02780 02781 *p++ = (unsigned char)( dn_size >> 8 ); 02782 *p++ = (unsigned char)( dn_size ); 02783 memcpy( p, crt->subject_raw.p, dn_size ); 02784 p += dn_size; 02785 02786 MBEDTLS_SSL_DEBUG_BUF( 3, "requested DN", p - dn_size, dn_size ); 02787 02788 total_dn_size += 2 + dn_size; 02789 crt = crt->next; 02790 } 02791 } 02792 02793 ssl->out_msglen = p - buf; 02794 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; 02795 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST; 02796 ssl->out_msg[4 + ct_len + sa_len] = (unsigned char)( total_dn_size >> 8 ); 02797 ssl->out_msg[5 + ct_len + sa_len] = (unsigned char)( total_dn_size ); 02798 02799 ret = mbedtls_ssl_write_record( ssl ); 02800 02801 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) ); 02802 02803 return( ret ); 02804 } 02805 #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED && 02806 !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED && 02807 !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED && 02808 !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED && 02809 !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED && 02810 !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ 02811 02812 #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ 02813 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) 02814 static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl ) 02815 { 02816 int ret; 02817 02818 if( ! mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECKEY ) ) 02819 { 02820 MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) ); 02821 return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ); 02822 } 02823 02824 if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, 02825 mbedtls_pk_ec( *mbedtls_ssl_own_key( ssl ) ), 02826 MBEDTLS_ECDH_OURS ) ) != 0 ) 02827 { 02828 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret ); 02829 return( ret ); 02830 } 02831 02832 return( 0 ); 02833 } 02834 #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || 02835 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ 02836 02837 static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl ) 02838 { 02839 int ret; 02840 size_t n = 0; 02841 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = 02842 ssl->transform_negotiate->ciphersuite_info; 02843 02844 #if defined(MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED) 02845 unsigned char *p = ssl->out_msg + 4; 02846 size_t len; 02847 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) 02848 unsigned char *dig_signed = p; 02849 size_t dig_signed_len = 0; 02850 #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ 02851 #endif /* MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED */ 02852 02853 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) ); 02854 02855 /* 02856 * 02857 * Part 1: Extract static ECDH parameters and abort 02858 * if ServerKeyExchange not needed. 02859 * 02860 */ 02861 02862 /* For suites involving ECDH, extract DH parameters 02863 * from certificate at this point. */ 02864 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED) 02865 if( mbedtls_ssl_ciphersuite_uses_ecdh( ciphersuite_info ) ) 02866 { 02867 ssl_get_ecdh_params_from_cert( ssl ); 02868 } 02869 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED */ 02870 02871 /* Key exchanges not involving ephemeral keys don't use 02872 * ServerKeyExchange, so end here. */ 02873 #if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED) 02874 if( mbedtls_ssl_ciphersuite_no_pfs( ciphersuite_info ) ) 02875 { 02876 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) ); 02877 ssl->state++; 02878 return( 0 ); 02879 } 02880 #endif /* MBEDTLS_KEY_EXCHANGE__NON_PFS__ENABLED */ 02881 02882 /* 02883 * 02884 * Part 2: Provide key exchange parameters for chosen ciphersuite. 02885 * 02886 */ 02887 02888 /* 02889 * - ECJPAKE key exchanges 02890 */ 02891 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 02892 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) 02893 { 02894 const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN; 02895 02896 ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx, 02897 p, end - p, &len, ssl->conf->f_rng, ssl->conf->p_rng ); 02898 if( ret != 0 ) 02899 { 02900 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret ); 02901 return( ret ); 02902 } 02903 02904 p += len; 02905 n += len; 02906 } 02907 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 02908 02909 /* 02910 * For (EC)DHE key exchanges with PSK, parameters are prefixed by support 02911 * identity hint (RFC 4279, Sec. 3). Until someone needs this feature, 02912 * we use empty support identity hints here. 02913 **/ 02914 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ 02915 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) 02916 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || 02917 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) 02918 { 02919 *(p++) = 0x00; 02920 *(p++) = 0x00; 02921 02922 n += 2; 02923 } 02924 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED || 02925 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ 02926 02927 /* 02928 * - DHE key exchanges 02929 */ 02930 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED) 02931 if( mbedtls_ssl_ciphersuite_uses_dhe( ciphersuite_info ) ) 02932 { 02933 if( ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL ) 02934 { 02935 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no DH parameters set" ) ); 02936 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 02937 } 02938 02939 /* 02940 * Ephemeral DH parameters: 02941 * 02942 * struct { 02943 * opaque dh_p<1..2^16-1>; 02944 * opaque dh_g<1..2^16-1>; 02945 * opaque dh_Ys<1..2^16-1>; 02946 * } ServerDHParams; 02947 */ 02948 if( ( ret = mbedtls_dhm_set_group( &ssl->handshake->dhm_ctx, 02949 &ssl->conf->dhm_P, 02950 &ssl->conf->dhm_G ) ) != 0 ) 02951 { 02952 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_set_group", ret ); 02953 return( ret ); 02954 } 02955 02956 if( ( ret = mbedtls_dhm_make_params( &ssl->handshake->dhm_ctx, 02957 (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ), 02958 p, &len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) 02959 { 02960 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_params", ret ); 02961 return( ret ); 02962 } 02963 02964 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) 02965 dig_signed = p; 02966 dig_signed_len = len; 02967 #endif 02968 02969 p += len; 02970 n += len; 02971 02972 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X ); 02973 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P ); 02974 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G ); 02975 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX ); 02976 } 02977 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED */ 02978 02979 /* 02980 * - ECDHE key exchanges 02981 */ 02982 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED) 02983 if( mbedtls_ssl_ciphersuite_uses_ecdhe( ciphersuite_info ) ) 02984 { 02985 /* 02986 * Ephemeral ECDH parameters: 02987 * 02988 * struct { 02989 * ECParameters curve_params; 02990 * ECPoint public; 02991 * } ServerECDHParams; 02992 */ 02993 const mbedtls_ecp_curve_info **curve = NULL; 02994 const mbedtls_ecp_group_id *gid; 02995 02996 /* Match our preference list against the offered curves */ 02997 for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ ) 02998 for( curve = ssl->handshake->curves; *curve != NULL; curve++ ) 02999 if( (*curve)->grp_id == *gid ) 03000 goto curve_matching_done; 03001 03002 curve_matching_done: 03003 if( curve == NULL || *curve == NULL ) 03004 { 03005 MBEDTLS_SSL_DEBUG_MSG( 1, ( "no matching curve for ECDHE" ) ); 03006 return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN ); 03007 } 03008 03009 MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDHE curve: %s", (*curve)->name ) ); 03010 03011 if( ( ret = mbedtls_ecp_group_load( &ssl->handshake->ecdh_ctx.grp, 03012 (*curve)->grp_id ) ) != 0 ) 03013 { 03014 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecp_group_load", ret ); 03015 return( ret ); 03016 } 03017 03018 if( ( ret = mbedtls_ecdh_make_params( &ssl->handshake->ecdh_ctx, &len, 03019 p, MBEDTLS_SSL_MAX_CONTENT_LEN - n, 03020 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) 03021 { 03022 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_params", ret ); 03023 return( ret ); 03024 } 03025 03026 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) 03027 dig_signed = p; 03028 dig_signed_len = len; 03029 #endif 03030 03031 p += len; 03032 n += len; 03033 03034 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Q ", &ssl->handshake->ecdh_ctx.Q ); 03035 } 03036 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED */ 03037 03038 /* 03039 * 03040 * Part 3: For key exchanges involving the server signing the 03041 * exchange parameters, compute and add the signature here. 03042 * 03043 */ 03044 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) 03045 if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) ) 03046 { 03047 size_t signature_len = 0; 03048 unsigned int hashlen = 0; 03049 unsigned char hash[64]; 03050 03051 /* 03052 * 3.1: Choose hash algorithm: 03053 * A: For TLS 1.2, obey signature-hash-algorithm extension 03054 * to choose appropriate hash. 03055 * B: For SSL3, TLS1.0, TLS1.1 and ECDHE_ECDSA, use SHA1 03056 * (RFC 4492, Sec. 5.4) 03057 * C: Otherwise, use MD5 + SHA1 (RFC 4346, Sec. 7.4.3) 03058 */ 03059 03060 mbedtls_md_type_t md_alg; 03061 03062 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 03063 mbedtls_pk_type_t sig_alg = 03064 mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ); 03065 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) 03066 { 03067 /* A: For TLS 1.2, obey signature-hash-algorithm extension 03068 * (RFC 5246, Sec. 7.4.1.4.1). */ 03069 if( sig_alg == MBEDTLS_PK_NONE || 03070 ( md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, 03071 sig_alg ) ) == MBEDTLS_MD_NONE ) 03072 { 03073 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 03074 /* (... because we choose a cipher suite 03075 * only if there is a matching hash.) */ 03076 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 03077 } 03078 } 03079 else 03080 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 03081 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 03082 defined(MBEDTLS_SSL_PROTO_TLS1_1) 03083 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ) 03084 { 03085 /* B: Default hash SHA1 */ 03086 md_alg = MBEDTLS_MD_SHA1; 03087 } 03088 else 03089 #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ 03090 MBEDTLS_SSL_PROTO_TLS1_1 */ 03091 { 03092 /* C: MD5 + SHA1 */ 03093 md_alg = MBEDTLS_MD_NONE; 03094 } 03095 03096 MBEDTLS_SSL_DEBUG_MSG( 3, ( "pick hash algorithm %d for signing", md_alg ) ); 03097 03098 /* 03099 * 3.2: Compute the hash to be signed 03100 */ 03101 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 03102 defined(MBEDTLS_SSL_PROTO_TLS1_1) 03103 if( md_alg == MBEDTLS_MD_NONE ) 03104 { 03105 hashlen = 36; 03106 ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash, 03107 dig_signed, 03108 dig_signed_len ); 03109 if( ret != 0 ) 03110 return( ret ); 03111 } 03112 else 03113 #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ 03114 MBEDTLS_SSL_PROTO_TLS1_1 */ 03115 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ 03116 defined(MBEDTLS_SSL_PROTO_TLS1_2) 03117 if( md_alg != MBEDTLS_MD_NONE ) 03118 { 03119 /* Info from md_alg will be used instead */ 03120 hashlen = 0; 03121 ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, 03122 dig_signed, 03123 dig_signed_len, 03124 md_alg ); 03125 if( ret != 0 ) 03126 return( ret ); 03127 } 03128 else 03129 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ 03130 MBEDTLS_SSL_PROTO_TLS1_2 */ 03131 { 03132 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 03133 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 03134 } 03135 03136 MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen != 0 ? hashlen : 03137 (unsigned int) ( mbedtls_md_get_size( mbedtls_md_info_from_type( md_alg ) ) ) ); 03138 03139 /* 03140 * 3.3: Compute and add the signature 03141 */ 03142 if( mbedtls_ssl_own_key( ssl ) == NULL ) 03143 { 03144 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key" ) ); 03145 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); 03146 } 03147 03148 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 03149 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) 03150 { 03151 /* 03152 * For TLS 1.2, we need to specify signature and hash algorithm 03153 * explicitly through a prefix to the signature. 03154 * 03155 * struct { 03156 * HashAlgorithm hash; 03157 * SignatureAlgorithm signature; 03158 * } SignatureAndHashAlgorithm; 03159 * 03160 * struct { 03161 * SignatureAndHashAlgorithm algorithm; 03162 * opaque signature<0..2^16-1>; 03163 * } DigitallySigned; 03164 * 03165 */ 03166 03167 *(p++) = mbedtls_ssl_hash_from_md_alg( md_alg ); 03168 *(p++) = mbedtls_ssl_sig_from_pk_alg( sig_alg ); 03169 03170 n += 2; 03171 } 03172 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 03173 03174 if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash, hashlen, 03175 p + 2 , &signature_len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) 03176 { 03177 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret ); 03178 return( ret ); 03179 } 03180 03181 *(p++) = (unsigned char)( signature_len >> 8 ); 03182 *(p++) = (unsigned char)( signature_len ); 03183 n += 2; 03184 03185 MBEDTLS_SSL_DEBUG_BUF( 3, "my signature", p, signature_len ); 03186 03187 n += signature_len; 03188 } 03189 #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ 03190 03191 /* Done with actual work; add header and send. */ 03192 03193 ssl->out_msglen = 4 + n; 03194 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; 03195 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE; 03196 03197 ssl->state++; 03198 03199 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 03200 { 03201 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 03202 return( ret ); 03203 } 03204 03205 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) ); 03206 03207 return( 0 ); 03208 } 03209 03210 static int ssl_write_server_hello_done( mbedtls_ssl_context *ssl ) 03211 { 03212 int ret; 03213 03214 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) ); 03215 03216 ssl->out_msglen = 4; 03217 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; 03218 ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE; 03219 03220 ssl->state++; 03221 03222 #if defined(MBEDTLS_SSL_PROTO_DTLS) 03223 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) 03224 mbedtls_ssl_send_flight_completed( ssl ); 03225 #endif 03226 03227 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 03228 { 03229 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 03230 return( ret ); 03231 } 03232 03233 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) ); 03234 03235 return( 0 ); 03236 } 03237 03238 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ 03239 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) 03240 static int ssl_parse_client_dh_public( mbedtls_ssl_context *ssl, unsigned char **p, 03241 const unsigned char *end ) 03242 { 03243 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; 03244 size_t n; 03245 03246 /* 03247 * Receive G^Y mod P, premaster = (G^Y)^X mod P 03248 */ 03249 if( *p + 2 > end ) 03250 { 03251 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); 03252 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03253 } 03254 03255 n = ( (*p)[0] << 8 ) | (*p)[1]; 03256 *p += 2; 03257 03258 if( *p + n > end ) 03259 { 03260 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); 03261 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03262 } 03263 03264 if( ( ret = mbedtls_dhm_read_public( &ssl->handshake->dhm_ctx, *p, n ) ) != 0 ) 03265 { 03266 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_read_public", ret ); 03267 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP ); 03268 } 03269 03270 *p += n; 03271 03272 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY ); 03273 03274 return( ret ); 03275 } 03276 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || 03277 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ 03278 03279 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ 03280 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) 03281 static int ssl_parse_encrypted_pms( mbedtls_ssl_context *ssl, 03282 const unsigned char *p, 03283 const unsigned char *end, 03284 size_t pms_offset ) 03285 { 03286 int ret; 03287 size_t len = mbedtls_pk_get_len( mbedtls_ssl_own_key( ssl ) ); 03288 unsigned char *pms = ssl->handshake->premaster + pms_offset; 03289 unsigned char ver[2]; 03290 unsigned char fake_pms[48], peer_pms[48]; 03291 unsigned char mask; 03292 size_t i, peer_pmslen; 03293 unsigned int diff; 03294 03295 if( ! mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_RSA ) ) 03296 { 03297 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no RSA private key" ) ); 03298 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); 03299 } 03300 03301 /* 03302 * Decrypt the premaster using own private RSA key 03303 */ 03304 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ 03305 defined(MBEDTLS_SSL_PROTO_TLS1_2) 03306 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) 03307 { 03308 if( *p++ != ( ( len >> 8 ) & 0xFF ) || 03309 *p++ != ( ( len ) & 0xFF ) ) 03310 { 03311 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); 03312 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03313 } 03314 } 03315 #endif 03316 03317 if( p + len != end ) 03318 { 03319 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); 03320 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03321 } 03322 03323 mbedtls_ssl_write_version( ssl->handshake->max_major_ver, 03324 ssl->handshake->max_minor_ver, 03325 ssl->conf->transport, ver ); 03326 03327 /* 03328 * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding 03329 * must not cause the connection to end immediately; instead, send a 03330 * bad_record_mac later in the handshake. 03331 * Also, avoid data-dependant branches here to protect against 03332 * timing-based variants. 03333 */ 03334 ret = ssl->conf->f_rng( ssl->conf->p_rng, fake_pms, sizeof( fake_pms ) ); 03335 if( ret != 0 ) 03336 return( ret ); 03337 03338 ret = mbedtls_pk_decrypt( mbedtls_ssl_own_key( ssl ), p, len, 03339 peer_pms, &peer_pmslen, 03340 sizeof( peer_pms ), 03341 ssl->conf->f_rng, ssl->conf->p_rng ); 03342 03343 diff = (unsigned int) ret; 03344 diff |= peer_pmslen ^ 48; 03345 diff |= peer_pms[0] ^ ver[0]; 03346 diff |= peer_pms[1] ^ ver[1]; 03347 03348 #if defined(MBEDTLS_SSL_DEBUG_ALL) 03349 if( diff != 0 ) 03350 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); 03351 #endif 03352 03353 if( sizeof( ssl->handshake->premaster ) < pms_offset || 03354 sizeof( ssl->handshake->premaster ) - pms_offset < 48 ) 03355 { 03356 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 03357 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 03358 } 03359 ssl->handshake->pmslen = 48; 03360 03361 /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */ 03362 /* MSVC has a warning about unary minus on unsigned, but this is 03363 * well-defined and precisely what we want to do here */ 03364 #if defined(_MSC_VER) 03365 #pragma warning( push ) 03366 #pragma warning( disable : 4146 ) 03367 #endif 03368 mask = - ( ( diff | - diff ) >> ( sizeof( unsigned int ) * 8 - 1 ) ); 03369 #if defined(_MSC_VER) 03370 #pragma warning( pop ) 03371 #endif 03372 03373 for( i = 0; i < ssl->handshake->pmslen; i++ ) 03374 pms[i] = ( mask & fake_pms[i] ) | ( (~mask) & peer_pms[i] ); 03375 03376 return( 0 ); 03377 } 03378 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED || 03379 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ 03380 03381 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) 03382 static int ssl_parse_client_psk_identity( mbedtls_ssl_context *ssl, unsigned char **p, 03383 const unsigned char *end ) 03384 { 03385 int ret = 0; 03386 size_t n; 03387 03388 if( ssl->conf->f_psk == NULL && 03389 ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL || 03390 ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) ) 03391 { 03392 MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) ); 03393 return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); 03394 } 03395 03396 /* 03397 * Receive client pre-shared key identity name 03398 */ 03399 if( end - *p < 2 ) 03400 { 03401 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); 03402 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03403 } 03404 03405 n = ( (*p)[0] << 8 ) | (*p)[1]; 03406 *p += 2; 03407 03408 if( n < 1 || n > 65535 || n > (size_t) ( end - *p ) ) 03409 { 03410 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); 03411 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03412 } 03413 03414 if( ssl->conf->f_psk != NULL ) 03415 { 03416 if( ssl->conf->f_psk( ssl->conf->p_psk, ssl, *p, n ) != 0 ) 03417 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY; 03418 } 03419 else 03420 { 03421 /* Identity is not a big secret since clients send it in the clear, 03422 * but treat it carefully anyway, just in case */ 03423 if( n != ssl->conf->psk_identity_len || 03424 mbedtls_ssl_safer_memcmp( ssl->conf->psk_identity, *p, n ) != 0 ) 03425 { 03426 ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY; 03427 } 03428 } 03429 03430 if( ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY ) 03431 { 03432 MBEDTLS_SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n ); 03433 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, 03434 MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY ); 03435 return( MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY ); 03436 } 03437 03438 *p += n; 03439 03440 return( 0 ); 03441 } 03442 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ 03443 03444 static int ssl_parse_client_key_exchange( mbedtls_ssl_context *ssl ) 03445 { 03446 int ret; 03447 const mbedtls_ssl_ciphersuite_t *ciphersuite_info; 03448 unsigned char *p, *end; 03449 03450 ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; 03451 03452 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) ); 03453 03454 if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 ) 03455 { 03456 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); 03457 return( ret ); 03458 } 03459 03460 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); 03461 end = ssl->in_msg + ssl->in_hslen; 03462 03463 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) 03464 { 03465 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); 03466 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03467 } 03468 03469 if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE ) 03470 { 03471 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); 03472 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03473 } 03474 03475 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) 03476 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ) 03477 { 03478 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 ) 03479 { 03480 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret ); 03481 return( ret ); 03482 } 03483 03484 if( p != end ) 03485 { 03486 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) ); 03487 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03488 } 03489 03490 if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx, 03491 ssl->handshake->premaster, 03492 MBEDTLS_PREMASTER_SIZE, 03493 &ssl->handshake->pmslen, 03494 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) 03495 { 03496 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret ); 03497 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS ); 03498 } 03499 03500 MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K ); 03501 } 03502 else 03503 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ 03504 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ 03505 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ 03506 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ 03507 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) 03508 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || 03509 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA || 03510 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA || 03511 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA ) 03512 { 03513 if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx, 03514 p, end - p) ) != 0 ) 03515 { 03516 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret ); 03517 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP ); 03518 } 03519 03520 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp ); 03521 03522 if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, 03523 &ssl->handshake->pmslen, 03524 ssl->handshake->premaster, 03525 MBEDTLS_MPI_MAX_SIZE, 03526 ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) 03527 { 03528 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret ); 03529 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS ); 03530 } 03531 03532 MBEDTLS_SSL_DEBUG_MPI( 3, "ECDH: z ", &ssl->handshake->ecdh_ctx.z ); 03533 } 03534 else 03535 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || 03536 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || 03537 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || 03538 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ 03539 #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) 03540 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ) 03541 { 03542 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) 03543 { 03544 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); 03545 return( ret ); 03546 } 03547 03548 if( p != end ) 03549 { 03550 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) ); 03551 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03552 } 03553 03554 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, 03555 ciphersuite_info->key_exchange ) ) != 0 ) 03556 { 03557 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); 03558 return( ret ); 03559 } 03560 } 03561 else 03562 #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ 03563 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) 03564 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) 03565 { 03566 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) 03567 { 03568 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); 03569 return( ret ); 03570 } 03571 03572 if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 2 ) ) != 0 ) 03573 { 03574 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_encrypted_pms" ), ret ); 03575 return( ret ); 03576 } 03577 03578 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, 03579 ciphersuite_info->key_exchange ) ) != 0 ) 03580 { 03581 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); 03582 return( ret ); 03583 } 03584 } 03585 else 03586 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ 03587 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) 03588 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ) 03589 { 03590 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) 03591 { 03592 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); 03593 return( ret ); 03594 } 03595 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 ) 03596 { 03597 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret ); 03598 return( ret ); 03599 } 03600 03601 if( p != end ) 03602 { 03603 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) ); 03604 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); 03605 } 03606 03607 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, 03608 ciphersuite_info->key_exchange ) ) != 0 ) 03609 { 03610 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); 03611 return( ret ); 03612 } 03613 } 03614 else 03615 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ 03616 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) 03617 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) 03618 { 03619 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) 03620 { 03621 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); 03622 return( ret ); 03623 } 03624 03625 if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx, 03626 p, end - p ) ) != 0 ) 03627 { 03628 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret ); 03629 return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP ); 03630 } 03631 03632 MBEDTLS_SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp ); 03633 03634 if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, 03635 ciphersuite_info->key_exchange ) ) != 0 ) 03636 { 03637 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); 03638 return( ret ); 03639 } 03640 } 03641 else 03642 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ 03643 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) 03644 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) 03645 { 03646 if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 0 ) ) != 0 ) 03647 { 03648 MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_parse_encrypted_pms_secret" ), ret ); 03649 return( ret ); 03650 } 03651 } 03652 else 03653 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ 03654 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) 03655 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) 03656 { 03657 ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx, 03658 p, end - p ); 03659 if( ret != 0 ) 03660 { 03661 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret ); 03662 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); 03663 } 03664 03665 ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx, 03666 ssl->handshake->premaster, 32, &ssl->handshake->pmslen, 03667 ssl->conf->f_rng, ssl->conf->p_rng ); 03668 if( ret != 0 ) 03669 { 03670 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret ); 03671 return( ret ); 03672 } 03673 } 03674 else 03675 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ 03676 { 03677 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 03678 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 03679 } 03680 03681 if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) 03682 { 03683 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); 03684 return( ret ); 03685 } 03686 03687 ssl->state++; 03688 03689 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) ); 03690 03691 return( 0 ); 03692 } 03693 03694 #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ 03695 !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ 03696 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ 03697 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ 03698 !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \ 03699 !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) 03700 static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl ) 03701 { 03702 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = 03703 ssl->transform_negotiate->ciphersuite_info; 03704 03705 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) ); 03706 03707 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || 03708 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || 03709 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || 03710 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || 03711 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) 03712 { 03713 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) ); 03714 ssl->state++; 03715 return( 0 ); 03716 } 03717 03718 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 03719 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 03720 } 03721 #else 03722 static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl ) 03723 { 03724 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; 03725 size_t i, sig_len; 03726 unsigned char hash[48]; 03727 unsigned char *hash_start = hash; 03728 size_t hashlen; 03729 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 03730 mbedtls_pk_type_t pk_alg; 03731 #endif 03732 mbedtls_md_type_t md_alg; 03733 const mbedtls_ssl_ciphersuite_t *ciphersuite_info = 03734 ssl->transform_negotiate->ciphersuite_info; 03735 03736 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) ); 03737 03738 if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || 03739 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || 03740 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || 03741 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || 03742 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE || 03743 ssl->session_negotiate->peer_cert == NULL ) 03744 { 03745 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) ); 03746 ssl->state++; 03747 return( 0 ); 03748 } 03749 03750 /* Read the message without adding it to the checksum */ 03751 do { 03752 03753 if( ( ret = mbedtls_ssl_read_record_layer( ssl ) ) != 0 ) 03754 { 03755 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_read_record_layer" ), ret ); 03756 return( ret ); 03757 } 03758 03759 ret = mbedtls_ssl_handle_message_type( ssl ); 03760 03761 } while( MBEDTLS_ERR_SSL_NON_FATAL == ret ); 03762 03763 if( 0 != ret ) 03764 { 03765 MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_handle_message_type" ), ret ); 03766 return( ret ); 03767 } 03768 03769 ssl->state++; 03770 03771 /* Process the message contents */ 03772 if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE || 03773 ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY ) 03774 { 03775 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); 03776 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); 03777 } 03778 03779 i = mbedtls_ssl_hs_hdr_len( ssl ); 03780 03781 /* 03782 * struct { 03783 * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only 03784 * opaque signature<0..2^16-1>; 03785 * } DigitallySigned; 03786 */ 03787 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ 03788 defined(MBEDTLS_SSL_PROTO_TLS1_1) 03789 if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) 03790 { 03791 md_alg = MBEDTLS_MD_NONE; 03792 hashlen = 36; 03793 03794 /* For ECDSA, use SHA-1, not MD-5 + SHA-1 */ 03795 if( mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, 03796 MBEDTLS_PK_ECDSA ) ) 03797 { 03798 hash_start += 16; 03799 hashlen -= 16; 03800 md_alg = MBEDTLS_MD_SHA1; 03801 } 03802 } 03803 else 03804 #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || 03805 MBEDTLS_SSL_PROTO_TLS1_1 */ 03806 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) 03807 if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) 03808 { 03809 if( i + 2 > ssl->in_hslen ) 03810 { 03811 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); 03812 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); 03813 } 03814 03815 /* 03816 * Hash 03817 */ 03818 md_alg = mbedtls_ssl_md_alg_from_hash( ssl->in_msg[i] ); 03819 03820 if( md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md( ssl, ssl->in_msg[i] ) ) 03821 { 03822 MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg" 03823 " for verify message" ) ); 03824 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); 03825 } 03826 03827 #if !defined(MBEDTLS_MD_SHA1) 03828 if( MBEDTLS_MD_SHA1 == md_alg ) 03829 hash_start += 16; 03830 #endif 03831 03832 /* Info from md_alg will be used instead */ 03833 hashlen = 0; 03834 03835 i++; 03836 03837 /* 03838 * Signature 03839 */ 03840 if( ( pk_alg = mbedtls_ssl_pk_alg_from_sig( ssl->in_msg[i] ) ) 03841 == MBEDTLS_PK_NONE ) 03842 { 03843 MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg" 03844 " for verify message" ) ); 03845 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); 03846 } 03847 03848 /* 03849 * Check the certificate's key type matches the signature alg 03850 */ 03851 if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) ) 03852 { 03853 MBEDTLS_SSL_DEBUG_MSG( 1, ( "sig_alg doesn't match cert key" ) ); 03854 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); 03855 } 03856 03857 i++; 03858 } 03859 else 03860 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ 03861 { 03862 MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); 03863 return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); 03864 } 03865 03866 if( i + 2 > ssl->in_hslen ) 03867 { 03868 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); 03869 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); 03870 } 03871 03872 sig_len = ( ssl->in_msg[i] << 8 ) | ssl->in_msg[i+1]; 03873 i += 2; 03874 03875 if( i + sig_len != ssl->in_hslen ) 03876 { 03877 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); 03878 return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); 03879 } 03880 03881 /* Calculate hash and verify signature */ 03882 ssl->handshake->calc_verify( ssl, hash ); 03883 03884 if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk, 03885 md_alg, hash_start, hashlen, 03886 ssl->in_msg + i, sig_len ) ) != 0 ) 03887 { 03888 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret ); 03889 return( ret ); 03890 } 03891 03892 mbedtls_ssl_update_handshake_status( ssl ); 03893 03894 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) ); 03895 03896 return( ret ); 03897 } 03898 #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED && 03899 !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED && 03900 !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED && 03901 !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED && 03902 !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED && 03903 !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ 03904 03905 #if defined(MBEDTLS_SSL_SESSION_TICKETS) 03906 static int ssl_write_new_session_ticket( mbedtls_ssl_context *ssl ) 03907 { 03908 int ret; 03909 size_t tlen; 03910 uint32_t lifetime; 03911 03912 MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write new session ticket" ) ); 03913 03914 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; 03915 ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET; 03916 03917 /* 03918 * struct { 03919 * uint32 ticket_lifetime_hint; 03920 * opaque ticket<0..2^16-1>; 03921 * } NewSessionTicket; 03922 * 03923 * 4 . 7 ticket_lifetime_hint (0 = unspecified) 03924 * 8 . 9 ticket_len (n) 03925 * 10 . 9+n ticket content 03926 */ 03927 03928 if( ( ret = ssl->conf->f_ticket_write( ssl->conf->p_ticket, 03929 ssl->session_negotiate, 03930 ssl->out_msg + 10, 03931 ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN, 03932 &tlen, &lifetime ) ) != 0 ) 03933 { 03934 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_write", ret ); 03935 tlen = 0; 03936 } 03937 03938 ssl->out_msg[4] = ( lifetime >> 24 ) & 0xFF; 03939 ssl->out_msg[5] = ( lifetime >> 16 ) & 0xFF; 03940 ssl->out_msg[6] = ( lifetime >> 8 ) & 0xFF; 03941 ssl->out_msg[7] = ( lifetime ) & 0xFF; 03942 03943 ssl->out_msg[8] = (unsigned char)( ( tlen >> 8 ) & 0xFF ); 03944 ssl->out_msg[9] = (unsigned char)( ( tlen ) & 0xFF ); 03945 03946 ssl->out_msglen = 10 + tlen; 03947 03948 /* 03949 * Morally equivalent to updating ssl->state, but NewSessionTicket and 03950 * ChangeCipherSpec share the same state. 03951 */ 03952 ssl->handshake->new_session_ticket = 0; 03953 03954 if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 ) 03955 { 03956 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); 03957 return( ret ); 03958 } 03959 03960 MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write new session ticket" ) ); 03961 03962 return( 0 ); 03963 } 03964 #endif /* MBEDTLS_SSL_SESSION_TICKETS */ 03965 03966 /* 03967 * SSL handshake -- server side -- single step 03968 */ 03969 int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl ) 03970 { 03971 int ret = 0; 03972 03973 if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL ) 03974 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 03975 03976 MBEDTLS_SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) ); 03977 03978 if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) 03979 return( ret ); 03980 03981 #if defined(MBEDTLS_SSL_PROTO_DTLS) 03982 if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && 03983 ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) 03984 { 03985 if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 ) 03986 return( ret ); 03987 } 03988 #endif 03989 03990 switch( ssl->state ) 03991 { 03992 case MBEDTLS_SSL_HELLO_REQUEST: 03993 ssl->state = MBEDTLS_SSL_CLIENT_HELLO; 03994 break; 03995 03996 /* 03997 * <== ClientHello 03998 */ 03999 case MBEDTLS_SSL_CLIENT_HELLO: 04000 ret = ssl_parse_client_hello( ssl ); 04001 break; 04002 04003 #if defined(MBEDTLS_SSL_PROTO_DTLS) 04004 case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT: 04005 return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ); 04006 #endif 04007 04008 /* 04009 * ==> ServerHello 04010 * Certificate 04011 * ( ServerKeyExchange ) 04012 * ( CertificateRequest ) 04013 * ServerHelloDone 04014 */ 04015 case MBEDTLS_SSL_SERVER_HELLO: 04016 ret = ssl_write_server_hello( ssl ); 04017 break; 04018 04019 case MBEDTLS_SSL_SERVER_CERTIFICATE: 04020 ret = mbedtls_ssl_write_certificate( ssl ); 04021 break; 04022 04023 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE: 04024 ret = ssl_write_server_key_exchange( ssl ); 04025 break; 04026 04027 case MBEDTLS_SSL_CERTIFICATE_REQUEST: 04028 ret = ssl_write_certificate_request( ssl ); 04029 break; 04030 04031 case MBEDTLS_SSL_SERVER_HELLO_DONE: 04032 ret = ssl_write_server_hello_done( ssl ); 04033 break; 04034 04035 /* 04036 * <== ( Certificate/Alert ) 04037 * ClientKeyExchange 04038 * ( CertificateVerify ) 04039 * ChangeCipherSpec 04040 * Finished 04041 */ 04042 case MBEDTLS_SSL_CLIENT_CERTIFICATE: 04043 ret = mbedtls_ssl_parse_certificate( ssl ); 04044 break; 04045 04046 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE: 04047 ret = ssl_parse_client_key_exchange( ssl ); 04048 break; 04049 04050 case MBEDTLS_SSL_CERTIFICATE_VERIFY: 04051 ret = ssl_parse_certificate_verify( ssl ); 04052 break; 04053 04054 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC: 04055 ret = mbedtls_ssl_parse_change_cipher_spec( ssl ); 04056 break; 04057 04058 case MBEDTLS_SSL_CLIENT_FINISHED: 04059 ret = mbedtls_ssl_parse_finished( ssl ); 04060 break; 04061 04062 /* 04063 * ==> ( NewSessionTicket ) 04064 * ChangeCipherSpec 04065 * Finished 04066 */ 04067 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC: 04068 #if defined(MBEDTLS_SSL_SESSION_TICKETS) 04069 if( ssl->handshake->new_session_ticket != 0 ) 04070 ret = ssl_write_new_session_ticket( ssl ); 04071 else 04072 #endif 04073 ret = mbedtls_ssl_write_change_cipher_spec( ssl ); 04074 break; 04075 04076 case MBEDTLS_SSL_SERVER_FINISHED: 04077 ret = mbedtls_ssl_write_finished( ssl ); 04078 break; 04079 04080 case MBEDTLS_SSL_FLUSH_BUFFERS: 04081 MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) ); 04082 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; 04083 break; 04084 04085 case MBEDTLS_SSL_HANDSHAKE_WRAPUP: 04086 mbedtls_ssl_handshake_wrapup( ssl ); 04087 break; 04088 04089 default: 04090 MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) ); 04091 return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); 04092 } 04093 04094 return( ret ); 04095 } 04096 #endif /* MBEDTLS_SSL_SRV_C */
Generated on Tue Jul 12 2022 12:22:22 by
