Rtos API example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ssl_tls.c Source File

ssl_tls.c

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