Example program to test AES-GCM functionality. Used for a workshop

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ssl_srv.c Source File

ssl_srv.c

00001 /*
00002  *  SSLv3/TLSv1 server-side functions
00003  *
00004  *  Copyright (C) 2006-2014, Brainspark B.V.
00005  *
00006  *  This file is part of PolarSSL (http://www.polarssl.org)
00007  *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
00008  *
00009  *  All rights reserved.
00010  *
00011  *  This program is free software; you can redistribute it and/or modify
00012  *  it under the terms of the GNU General Public License as published by
00013  *  the Free Software Foundation; either version 2 of the License, or
00014  *  (at your option) any later version.
00015  *
00016  *  This program is distributed in the hope that it will be useful,
00017  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  *  GNU General Public License for more details.
00020  *
00021  *  You should have received a copy of the GNU General Public License along
00022  *  with this program; if not, write to the Free Software Foundation, Inc.,
00023  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
00024  */
00025 
00026 #if !defined(POLARSSL_CONFIG_FILE)
00027 #include "polarssl/config.h"
00028 #else
00029 #include POLARSSL_CONFIG_FILE
00030 #endif
00031 
00032 #if defined(POLARSSL_SSL_SRV_C)
00033 
00034 #include "polarssl/debug.h"
00035 #include "polarssl/ssl.h"
00036 #if defined(POLARSSL_ECP_C)
00037 #include "polarssl/ecp.h"
00038 #endif
00039 
00040 #if defined(POLARSSL_PLATFORM_C)
00041 #include "polarssl/platform.h"
00042 #else
00043 #define polarssl_malloc     malloc
00044 #define polarssl_free       free
00045 #endif
00046 
00047 #include <stdlib.h>
00048 #include <stdio.h>
00049 
00050 #if defined(POLARSSL_HAVE_TIME)
00051 #include <time.h>
00052 #endif
00053 
00054 #if defined(POLARSSL_SSL_SESSION_TICKETS)
00055 /*
00056  * Serialize a session in the following format:
00057  *  0   .   n-1     session structure, n = sizeof(ssl_session)
00058  *  n   .   n+2     peer_cert length = m (0 if no certificate)
00059  *  n+3 .   n+2+m   peer cert ASN.1
00060  *
00061  *  Assumes ticket is NULL (always true on server side).
00062  */
00063 static int ssl_save_session( const ssl_session *session,
00064                              unsigned char *buf, size_t buf_len,
00065                              size_t *olen )
00066 {
00067     unsigned char *p = buf;
00068     size_t left = buf_len;
00069 #if defined(POLARSSL_X509_CRT_PARSE_C)
00070     size_t cert_len;
00071 #endif /* POLARSSL_X509_CRT_PARSE_C */
00072 
00073     if( left < sizeof( ssl_session ) )
00074         return( -1 );
00075 
00076     memcpy( p, session, sizeof( ssl_session ) );
00077     p += sizeof( ssl_session );
00078     left -= sizeof( ssl_session );
00079 
00080 #if defined(POLARSSL_X509_CRT_PARSE_C)
00081     if( session->peer_cert == NULL )
00082         cert_len = 0;
00083     else
00084         cert_len = session->peer_cert->raw.len;
00085 
00086     if( left < 3 + cert_len )
00087         return( -1 );
00088 
00089     *p++ = (unsigned char)( cert_len >> 16 & 0xFF );
00090     *p++ = (unsigned char)( cert_len >>  8 & 0xFF );
00091     *p++ = (unsigned char)( cert_len       & 0xFF );
00092 
00093     if( session->peer_cert != NULL )
00094         memcpy( p, session->peer_cert->raw.p, cert_len );
00095 
00096     p += cert_len;
00097 #endif /* POLARSSL_X509_CRT_PARSE_C */
00098 
00099     *olen = p - buf;
00100 
00101     return( 0 );
00102 }
00103 
00104 /*
00105  * Unserialise session, see ssl_save_session()
00106  */
00107 static int ssl_load_session( ssl_session *session,
00108                              const unsigned char *buf, size_t len )
00109 {
00110     const unsigned char *p = buf;
00111     const unsigned char * const end = buf + len;
00112 #if defined(POLARSSL_X509_CRT_PARSE_C)
00113     size_t cert_len;
00114 #endif /* POLARSSL_X509_CRT_PARSE_C */
00115 
00116     if( p + sizeof( ssl_session ) > end )
00117         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00118 
00119     memcpy( session, p, sizeof( ssl_session ) );
00120     p += sizeof( ssl_session );
00121 
00122 #if defined(POLARSSL_X509_CRT_PARSE_C)
00123     if( p + 3 > end )
00124         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00125 
00126     cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
00127     p += 3;
00128 
00129     if( cert_len == 0 )
00130     {
00131         session->peer_cert = NULL;
00132     }
00133     else
00134     {
00135         int ret;
00136 
00137         if( p + cert_len > end )
00138             return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00139 
00140         session->peer_cert = polarssl_malloc( sizeof( x509_crt ) );
00141 
00142         if( session->peer_cert == NULL )
00143             return( POLARSSL_ERR_SSL_MALLOC_FAILED );
00144 
00145         x509_crt_init( session->peer_cert );
00146 
00147         if( ( ret = x509_crt_parse( session->peer_cert, p, cert_len ) ) != 0 )
00148         {
00149             x509_crt_free( session->peer_cert );
00150             polarssl_free( session->peer_cert );
00151             session->peer_cert = NULL;
00152             return( ret );
00153         }
00154 
00155         p += cert_len;
00156     }
00157 #endif /* POLARSSL_X509_CRT_PARSE_C */
00158 
00159     if( p != end )
00160         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00161 
00162     return( 0 );
00163 }
00164 
00165 /*
00166  * Create session ticket, secured as recommended in RFC 5077 section 4:
00167  *
00168  *    struct {
00169  *        opaque key_name[16];
00170  *        opaque iv[16];
00171  *        opaque encrypted_state<0..2^16-1>;
00172  *        opaque mac[32];
00173  *    } ticket;
00174  *
00175  * (the internal state structure differs, however).
00176  */
00177 static int ssl_write_ticket( ssl_context *ssl, size_t *tlen )
00178 {
00179     int ret;
00180     unsigned char * const start = ssl->out_msg + 10;
00181     unsigned char *p = start;
00182     unsigned char *state;
00183     unsigned char iv[16];
00184     size_t clear_len, enc_len, pad_len, i;
00185 
00186     *tlen = 0;
00187 
00188     if( ssl->ticket_keys == NULL )
00189         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00190 
00191     /* Write key name */
00192     memcpy( p, ssl->ticket_keys->key_name, 16 );
00193     p += 16;
00194 
00195     /* Generate and write IV (with a copy for aes_crypt) */
00196     if( ( ret = ssl->f_rng( ssl->p_rng, p, 16 ) ) != 0 )
00197         return( ret );
00198     memcpy( iv, p, 16 );
00199     p += 16;
00200 
00201     /*
00202      * Dump session state
00203      *
00204      * After the session state itself, we still need room for 16 bytes of
00205      * padding and 32 bytes of MAC, so there's only so much room left
00206      */
00207     state = p + 2;
00208     if( ssl_save_session( ssl->session_negotiate, state,
00209                           SSL_MAX_CONTENT_LEN - (state - ssl->out_ctr) - 48,
00210                           &clear_len ) != 0 )
00211     {
00212         return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
00213     }
00214     SSL_DEBUG_BUF( 3, "session ticket cleartext", state, clear_len );
00215 
00216     /* Apply PKCS padding */
00217     pad_len = 16 - clear_len % 16;
00218     enc_len = clear_len + pad_len;
00219     for( i = clear_len; i < enc_len; i++ )
00220         state[i] = (unsigned char) pad_len;
00221 
00222     /* Encrypt */
00223     if( ( ret = aes_crypt_cbc( &ssl->ticket_keys->enc, AES_ENCRYPT,
00224                                enc_len, iv, state, state ) ) != 0 )
00225     {
00226         return( ret );
00227     }
00228 
00229     /* Write length */
00230     *p++ = (unsigned char)( ( enc_len >> 8 ) & 0xFF );
00231     *p++ = (unsigned char)( ( enc_len      ) & 0xFF );
00232     p = state + enc_len;
00233 
00234     /* Compute and write MAC( key_name + iv + enc_state_len + enc_state ) */
00235     sha256_hmac( ssl->ticket_keys->mac_key, 16, start, p - start, p, 0 );
00236     p += 32;
00237 
00238     *tlen = p - start;
00239 
00240     SSL_DEBUG_BUF( 3, "session ticket structure", start, *tlen );
00241 
00242     return( 0 );
00243 }
00244 
00245 /*
00246  * Load session ticket (see ssl_write_ticket for structure)
00247  */
00248 static int ssl_parse_ticket( ssl_context *ssl,
00249                              unsigned char *buf,
00250                              size_t len )
00251 {
00252     int ret;
00253     ssl_session session;
00254     unsigned char *key_name = buf;
00255     unsigned char *iv = buf + 16;
00256     unsigned char *enc_len_p = iv + 16;
00257     unsigned char *ticket = enc_len_p + 2;
00258     unsigned char *mac;
00259     unsigned char computed_mac[32];
00260     size_t enc_len, clear_len, i;
00261     unsigned char pad_len, diff;
00262 
00263     SSL_DEBUG_BUF( 3, "session ticket structure", buf, len );
00264 
00265     if( len < 34 || ssl->ticket_keys == NULL )
00266         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00267 
00268     enc_len = ( enc_len_p[0] << 8 ) | enc_len_p[1];
00269     mac = ticket + enc_len;
00270 
00271     if( len != enc_len + 66 )
00272         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00273 
00274     /* Check name, in constant time though it's not a big secret */
00275     diff = 0;
00276     for( i = 0; i < 16; i++ )
00277         diff |= key_name[i] ^ ssl->ticket_keys->key_name[i];
00278     /* don't return yet, check the MAC anyway */
00279 
00280     /* Check mac, with constant-time buffer comparison */
00281     sha256_hmac( ssl->ticket_keys->mac_key, 16, buf, len - 32,
00282                  computed_mac, 0 );
00283 
00284     for( i = 0; i < 32; i++ )
00285         diff |= mac[i] ^ computed_mac[i];
00286 
00287     /* Now return if ticket is not authentic, since we want to avoid
00288      * decrypting arbitrary attacker-chosen data */
00289     if( diff != 0 )
00290         return( POLARSSL_ERR_SSL_INVALID_MAC );
00291 
00292     /* Decrypt */
00293     if( ( ret = aes_crypt_cbc( &ssl->ticket_keys->dec, AES_DECRYPT,
00294                                enc_len, iv, ticket, ticket ) ) != 0 )
00295     {
00296         return( ret );
00297     }
00298 
00299     /* Check PKCS padding */
00300     pad_len = ticket[enc_len - 1];
00301 
00302     ret = 0;
00303     for( i = 2; i < pad_len; i++ )
00304         if( ticket[enc_len - i] != pad_len )
00305             ret = POLARSSL_ERR_SSL_BAD_INPUT_DATA;
00306     if( ret != 0 )
00307         return( ret );
00308 
00309     clear_len = enc_len - pad_len;
00310 
00311     SSL_DEBUG_BUF( 3, "session ticket cleartext", ticket, clear_len );
00312 
00313     /* Actually load session */
00314     if( ( ret = ssl_load_session( &session, ticket, clear_len ) ) != 0 )
00315     {
00316         SSL_DEBUG_MSG( 1, ( "failed to parse ticket content" ) );
00317         ssl_session_free( &session );
00318         return( ret );
00319     }
00320 
00321 #if defined(POLARSSL_HAVE_TIME)
00322     /* Check if still valid */
00323     if( (int) ( time( NULL) - session.start ) > ssl->ticket_lifetime )
00324     {
00325         SSL_DEBUG_MSG( 1, ( "session ticket expired" ) );
00326         ssl_session_free( &session );
00327         return( POLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED );
00328     }
00329 #endif
00330 
00331     /*
00332      * Keep the session ID sent by the client, since we MUST send it back to
00333      * inform him we're accepting the ticket  (RFC 5077 section 3.4)
00334      */
00335     session.length = ssl->session_negotiate->length;
00336     memcpy( &session.id, ssl->session_negotiate->id, session.length );
00337 
00338     ssl_session_free( ssl->session_negotiate );
00339     memcpy( ssl->session_negotiate, &session, sizeof( ssl_session ) );
00340     memset( &session, 0, sizeof( ssl_session ) );
00341 
00342     return( 0 );
00343 }
00344 #endif /* POLARSSL_SSL_SESSION_TICKETS */
00345 
00346 #if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
00347 /*
00348  * Wrapper around f_sni, allowing use of ssl_set_own_cert() but
00349  * making it act on ssl->hanshake->sni_key_cert instead.
00350  */
00351 static int ssl_sni_wrapper( ssl_context *ssl,
00352                             const unsigned char* name, size_t len )
00353 {
00354     int ret;
00355     ssl_key_cert *key_cert_ori = ssl->key_cert;
00356 
00357     ssl->key_cert = NULL;
00358     ret = ssl->f_sni( ssl->p_sni, ssl, name, len );
00359     ssl->handshake->sni_key_cert = ssl->key_cert;
00360 
00361     ssl->key_cert = key_cert_ori;
00362 
00363     return( ret );
00364 }
00365 
00366 static int ssl_parse_servername_ext( ssl_context *ssl,
00367                                      const unsigned char *buf,
00368                                      size_t len )
00369 {
00370     int ret;
00371     size_t servername_list_size, hostname_len;
00372     const unsigned char *p;
00373 
00374     SSL_DEBUG_MSG( 3, ( "parse ServerName extension" ) );
00375 
00376     servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
00377     if( servername_list_size + 2 != len )
00378     {
00379         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
00380         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00381     }
00382 
00383     p = buf + 2;
00384     while( servername_list_size > 0 )
00385     {
00386         hostname_len = ( ( p[1] << 8 ) | p[2] );
00387         if( hostname_len + 3 > servername_list_size )
00388         {
00389             SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
00390             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00391         }
00392 
00393         if( p[0] == TLS_EXT_SERVERNAME_HOSTNAME )
00394         {
00395             ret = ssl_sni_wrapper( ssl, p + 3, hostname_len );
00396             if( ret != 0 )
00397             {
00398                 SSL_DEBUG_RET( 1, "ssl_sni_wrapper", ret );
00399                 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
00400                         SSL_ALERT_MSG_UNRECOGNIZED_NAME );
00401                 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00402             }
00403             return( 0 );
00404         }
00405 
00406         servername_list_size -= hostname_len + 3;
00407         p += hostname_len + 3;
00408     }
00409 
00410     if( servername_list_size != 0 )
00411     {
00412         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
00413         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00414     }
00415 
00416     return( 0 );
00417 }
00418 #endif /* POLARSSL_SSL_SERVER_NAME_INDICATION */
00419 
00420 static int ssl_parse_renegotiation_info( ssl_context *ssl,
00421                                          const unsigned char *buf,
00422                                          size_t len )
00423 {
00424     int ret;
00425 
00426     if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
00427     {
00428         if( len != 1 || buf[0] != 0x0 )
00429         {
00430             SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
00431 
00432             if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
00433                 return( ret );
00434 
00435             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00436         }
00437 
00438         ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
00439     }
00440     else
00441     {
00442         /* Check verify-data in constant-time. The length OTOH is no secret */
00443         if( len    != 1 + ssl->verify_data_len ||
00444             buf[0] !=     ssl->verify_data_len ||
00445             safer_memcmp( buf + 1, ssl->peer_verify_data,
00446                           ssl->verify_data_len ) != 0 )
00447         {
00448             SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
00449 
00450             if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
00451                 return( ret );
00452 
00453             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00454         }
00455     }
00456 
00457     return( 0 );
00458 }
00459 
00460 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
00461 static int ssl_parse_signature_algorithms_ext( ssl_context *ssl,
00462                                                const unsigned char *buf,
00463                                                size_t len )
00464 {
00465     size_t sig_alg_list_size;
00466     const unsigned char *p;
00467 
00468     sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
00469     if( sig_alg_list_size + 2 != len ||
00470         sig_alg_list_size %2 != 0 )
00471     {
00472         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
00473         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00474     }
00475 
00476     p = buf + 2;
00477     while( sig_alg_list_size > 0 )
00478     {
00479         /*
00480          * For now, just ignore signature algorithm and rely on offered
00481          * ciphersuites only. To be fixed later.
00482          */
00483 #if defined(POLARSSL_SHA512_C)
00484         if( p[0] == SSL_HASH_SHA512 )
00485         {
00486             ssl->handshake->sig_alg = SSL_HASH_SHA512;
00487             break;
00488         }
00489         if( p[0] == SSL_HASH_SHA384 )
00490         {
00491             ssl->handshake->sig_alg = SSL_HASH_SHA384;
00492             break;
00493         }
00494 #endif /* POLARSSL_SHA512_C */
00495 #if defined(POLARSSL_SHA256_C)
00496         if( p[0] == SSL_HASH_SHA256 )
00497         {
00498             ssl->handshake->sig_alg = SSL_HASH_SHA256;
00499             break;
00500         }
00501         if( p[0] == SSL_HASH_SHA224 )
00502         {
00503             ssl->handshake->sig_alg = SSL_HASH_SHA224;
00504             break;
00505         }
00506 #endif /* POLARSSL_SHA256_C */
00507         if( p[0] == SSL_HASH_SHA1 )
00508         {
00509             ssl->handshake->sig_alg = SSL_HASH_SHA1;
00510             break;
00511         }
00512         if( p[0] == SSL_HASH_MD5 )
00513         {
00514             ssl->handshake->sig_alg = SSL_HASH_MD5;
00515             break;
00516         }
00517 
00518         sig_alg_list_size -= 2;
00519         p += 2;
00520     }
00521 
00522     SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d",
00523                    ssl->handshake->sig_alg ) );
00524 
00525     return( 0 );
00526 }
00527 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
00528 
00529 #if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
00530 static int ssl_parse_supported_elliptic_curves( ssl_context *ssl,
00531                                                 const unsigned char *buf,
00532                                                 size_t len )
00533 {
00534     size_t list_size, our_size;
00535     const unsigned char *p;
00536     const ecp_curve_info *curve_info, **curves;
00537 
00538     list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
00539     if( list_size + 2 != len ||
00540         list_size % 2 != 0 )
00541     {
00542         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
00543         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00544     }
00545 
00546     /* Don't allow our peer to make us allocate too much memory,
00547      * and leave room for a final 0 */
00548     our_size = list_size / 2 + 1;
00549     if( our_size > POLARSSL_ECP_DP_MAX )
00550         our_size = POLARSSL_ECP_DP_MAX;
00551 
00552     if( ( curves = polarssl_malloc( our_size * sizeof( *curves ) ) ) == NULL )
00553         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
00554 
00555     /* explicit void pointer cast for buggy MS compiler */
00556     memset( (void *) curves, 0, our_size * sizeof( *curves ) );
00557     ssl->handshake->curves = curves;
00558 
00559     p = buf + 2;
00560     while( list_size > 0 && our_size > 1 )
00561     {
00562         curve_info = ecp_curve_info_from_tls_id( ( p[0] << 8 ) | p[1] );
00563 
00564         if( curve_info != NULL )
00565         {
00566             *curves++ = curve_info;
00567             our_size--;
00568         }
00569 
00570         list_size -= 2;
00571         p += 2;
00572     }
00573 
00574     return( 0 );
00575 }
00576 
00577 static int ssl_parse_supported_point_formats( ssl_context *ssl,
00578                                               const unsigned char *buf,
00579                                               size_t len )
00580 {
00581     size_t list_size;
00582     const unsigned char *p;
00583 
00584     list_size = buf[0];
00585     if( list_size + 1 != len )
00586     {
00587         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
00588         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00589     }
00590 
00591     p = buf + 2;
00592     while( list_size > 0 )
00593     {
00594         if( p[0] == POLARSSL_ECP_PF_UNCOMPRESSED ||
00595             p[0] == POLARSSL_ECP_PF_COMPRESSED )
00596         {
00597             ssl->handshake->ecdh_ctx.point_format = p[0];
00598             SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
00599             return( 0 );
00600         }
00601 
00602         list_size--;
00603         p++;
00604     }
00605 
00606     return( 0 );
00607 }
00608 #endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
00609 
00610 #if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
00611 static int ssl_parse_max_fragment_length_ext( ssl_context *ssl,
00612                                               const unsigned char *buf,
00613                                               size_t len )
00614 {
00615     if( len != 1 || buf[0] >= SSL_MAX_FRAG_LEN_INVALID )
00616     {
00617         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
00618         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00619     }
00620 
00621     ssl->session_negotiate->mfl_code = buf[0];
00622 
00623     return( 0 );
00624 }
00625 #endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
00626 
00627 #if defined(POLARSSL_SSL_TRUNCATED_HMAC)
00628 static int ssl_parse_truncated_hmac_ext( ssl_context *ssl,
00629                                          const unsigned char *buf,
00630                                          size_t len )
00631 {
00632     if( len != 0 )
00633     {
00634         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
00635         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00636     }
00637 
00638     ((void) buf);
00639 
00640     ssl->session_negotiate->trunc_hmac = SSL_TRUNC_HMAC_ENABLED;
00641 
00642     return( 0 );
00643 }
00644 #endif /* POLARSSL_SSL_TRUNCATED_HMAC */
00645 
00646 #if defined(POLARSSL_SSL_SESSION_TICKETS)
00647 static int ssl_parse_session_ticket_ext( ssl_context *ssl,
00648                                          unsigned char *buf,
00649                                          size_t len )
00650 {
00651     int ret;
00652 
00653     if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED )
00654         return( 0 );
00655 
00656     /* Remember the client asked us to send a new ticket */
00657     ssl->handshake->new_session_ticket = 1;
00658 
00659     SSL_DEBUG_MSG( 3, ( "ticket length: %d", len ) );
00660 
00661     if( len == 0 )
00662         return( 0 );
00663 
00664     if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE )
00665     {
00666         SSL_DEBUG_MSG( 3, ( "ticket rejected: renegotiating" ) );
00667         return( 0 );
00668     }
00669 
00670     /*
00671      * Failures are ok: just ignore the ticket and proceed.
00672      */
00673     if( ( ret = ssl_parse_ticket( ssl, buf, len ) ) != 0 )
00674     {
00675         SSL_DEBUG_RET( 1, "ssl_parse_ticket", ret );
00676         return( 0 );
00677     }
00678 
00679     SSL_DEBUG_MSG( 3, ( "session successfully restored from ticket" ) );
00680 
00681     ssl->handshake->resume = 1;
00682 
00683     /* Don't send a new ticket after all, this one is OK */
00684     ssl->handshake->new_session_ticket = 0;
00685 
00686     return( 0 );
00687 }
00688 #endif /* POLARSSL_SSL_SESSION_TICKETS */
00689 
00690 #if defined(POLARSSL_SSL_ALPN)
00691 static int ssl_parse_alpn_ext( ssl_context *ssl,
00692                                unsigned char *buf, size_t len )
00693 {
00694     size_t list_len, cur_len;
00695     const unsigned char *theirs, *start, *end;
00696     const char **ours;
00697 
00698     /* If ALPN not configured, just ignore the extension */
00699     if( ssl->alpn_list == NULL )
00700         return( 0 );
00701 
00702     /*
00703      * opaque ProtocolName<1..2^8-1>;
00704      *
00705      * struct {
00706      *     ProtocolName protocol_name_list<2..2^16-1>
00707      * } ProtocolNameList;
00708      */
00709 
00710     /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
00711     if( len < 4 )
00712         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00713 
00714     list_len = ( buf[0] << 8 ) | buf[1];
00715     if( list_len != len - 2 )
00716         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00717 
00718     /*
00719      * Use our order of preference
00720      */
00721     start = buf + 2;
00722     end = buf + len;
00723     for( ours = ssl->alpn_list; *ours != NULL; ours++ )
00724     {
00725         for( theirs = start; theirs != end; theirs += cur_len )
00726         {
00727             /* If the list is well formed, we should get equality first */
00728             if( theirs > end )
00729                 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00730 
00731             cur_len = *theirs++;
00732 
00733             /* Empty strings MUST NOT be included */
00734             if( cur_len == 0 )
00735                 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00736 
00737             if( cur_len == strlen( *ours ) &&
00738                 memcmp( theirs, *ours, cur_len ) == 0 )
00739             {
00740                 ssl->alpn_chosen = *ours;
00741                 return( 0 );
00742             }
00743         }
00744     }
00745 
00746     /* If we get there, no match was found */
00747     ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
00748                             SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL );
00749     return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00750 }
00751 #endif /* POLARSSL_SSL_ALPN */
00752 
00753 /*
00754  * Auxiliary functions for ServerHello parsing and related actions
00755  */
00756 
00757 #if defined(POLARSSL_X509_CRT_PARSE_C)
00758 /*
00759  * Return 1 if the given EC key uses the given curve, 0 otherwise
00760  */
00761 #if defined(POLARSSL_ECDSA_C)
00762 static int ssl_key_matches_curves( pk_context *pk,
00763                                    const ecp_curve_info **curves )
00764 {
00765     const ecp_curve_info **crv = curves;
00766     ecp_group_id grp_id = pk_ec( *pk )->grp.id;
00767 
00768     while( *crv != NULL )
00769     {
00770         if( (*crv)->grp_id == grp_id )
00771             return( 1 );
00772         crv++;
00773     }
00774 
00775     return( 0 );
00776 }
00777 #endif /* POLARSSL_ECDSA_C */
00778 
00779 /*
00780  * Try picking a certificate for this ciphersuite,
00781  * return 0 on success and -1 on failure.
00782  */
00783 static int ssl_pick_cert( ssl_context *ssl,
00784                           const ssl_ciphersuite_t * ciphersuite_info )
00785 {
00786     ssl_key_cert *cur, *list;
00787     pk_type_t pk_alg = ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
00788 
00789 #if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
00790     if( ssl->handshake->sni_key_cert != NULL )
00791         list = ssl->handshake->sni_key_cert;
00792     else
00793 #endif
00794         list = ssl->handshake->key_cert;
00795 
00796     if( pk_alg == POLARSSL_PK_NONE )
00797         return( 0 );
00798 
00799     for( cur = list; cur != NULL; cur = cur->next )
00800     {
00801         if( ! pk_can_do( cur->key, pk_alg ) )
00802             continue;
00803 
00804         /*
00805          * This avoids sending the client a cert it'll reject based on
00806          * keyUsage or other extensions.
00807          *
00808          * It also allows the user to provision different certificates for
00809          * different uses based on keyUsage, eg if they want to avoid signing
00810          * and decrypting with the same RSA key.
00811          */
00812         if( ssl_check_cert_usage( cur->cert, ciphersuite_info,
00813                                   SSL_IS_SERVER ) != 0 )
00814         {
00815             continue;
00816         }
00817 
00818 #if defined(POLARSSL_ECDSA_C)
00819         if( pk_alg == POLARSSL_PK_ECDSA )
00820         {
00821             if( ssl_key_matches_curves( cur->key, ssl->handshake->curves ) )
00822                 break;
00823         }
00824         else
00825 #endif
00826             break;
00827     }
00828 
00829     if( cur == NULL )
00830         return( -1 );
00831 
00832     ssl->handshake->key_cert = cur;
00833     return( 0 );
00834 }
00835 #endif /* POLARSSL_X509_CRT_PARSE_C */
00836 
00837 /*
00838  * Check if a given ciphersuite is suitable for use with our config/keys/etc
00839  * Sets ciphersuite_info only if the suite matches.
00840  */
00841 static int ssl_ciphersuite_match( ssl_context *ssl, int suite_id,
00842                                   const ssl_ciphersuite_t **ciphersuite_info )
00843 {
00844     const ssl_ciphersuite_t *suite_info;
00845 
00846     suite_info = ssl_ciphersuite_from_id( suite_id );
00847     if( suite_info == NULL )
00848     {
00849         SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", suite_id ) );
00850         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00851     }
00852 
00853     if( suite_info->min_minor_ver > ssl->minor_ver ||
00854         suite_info->max_minor_ver < ssl->minor_ver )
00855         return( 0 );
00856 
00857 #if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
00858     if( ssl_ciphersuite_uses_ec( suite_info ) &&
00859         ( ssl->handshake->curves == NULL ||
00860           ssl->handshake->curves[0] == NULL ) )
00861         return( 0 );
00862 #endif
00863 
00864 #if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
00865     /* If the ciphersuite requires a pre-shared key and we don't
00866      * have one, skip it now rather than failing later */
00867     if( ssl_ciphersuite_uses_psk( suite_info ) &&
00868         ssl->f_psk == NULL &&
00869         ( ssl->psk == NULL || ssl->psk_identity == NULL ||
00870           ssl->psk_identity_len == 0 || ssl->psk_len == 0 ) )
00871         return( 0 );
00872 #endif
00873 
00874 #if defined(POLARSSL_X509_CRT_PARSE_C)
00875     /*
00876      * Final check: if ciphersuite requires us to have a
00877      * certificate/key of a particular type:
00878      * - select the appropriate certificate if we have one, or
00879      * - try the next ciphersuite if we don't
00880      * This must be done last since we modify the key_cert list.
00881      */
00882     if( ssl_pick_cert( ssl, suite_info ) != 0 )
00883         return( 0 );
00884 #endif
00885 
00886     *ciphersuite_info = suite_info;
00887     return( 0 );
00888 }
00889 
00890 #if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
00891 static int ssl_parse_client_hello_v2( ssl_context *ssl )
00892 {
00893     int ret;
00894     unsigned int i, j;
00895     size_t n;
00896     unsigned int ciph_len, sess_len, chal_len;
00897     unsigned char *buf, *p;
00898     const int *ciphersuites;
00899     const ssl_ciphersuite_t *ciphersuite_info;
00900 
00901     SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) );
00902 
00903     if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE )
00904     {
00905         SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) );
00906 
00907         if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
00908             return( ret );
00909 
00910         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00911     }
00912 
00913     buf = ssl->in_hdr;
00914 
00915     SSL_DEBUG_BUF( 4, "record header", buf, 5 );
00916 
00917     SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d",
00918                    buf[2] ) );
00919     SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d",
00920                    ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) );
00921     SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]",
00922                    buf[3], buf[4] ) );
00923 
00924     /*
00925      * SSLv2 Client Hello
00926      *
00927      * Record layer:
00928      *     0  .   1   message length
00929      *
00930      * SSL layer:
00931      *     2  .   2   message type
00932      *     3  .   4   protocol version
00933      */
00934     if( buf[2] != SSL_HS_CLIENT_HELLO ||
00935         buf[3] != SSL_MAJOR_VERSION_3 )
00936     {
00937         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
00938         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00939     }
00940 
00941     n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF;
00942 
00943     if( n < 17 || n > 512 )
00944     {
00945         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
00946         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
00947     }
00948 
00949     ssl->major_ver = SSL_MAJOR_VERSION_3;
00950     ssl->minor_ver = ( buf[4] <= ssl->max_minor_ver )
00951                      ? buf[4]  : ssl->max_minor_ver;
00952 
00953     if( ssl->minor_ver < ssl->min_minor_ver )
00954     {
00955         SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
00956                             " [%d:%d] < [%d:%d]",
00957                             ssl->major_ver, ssl->minor_ver,
00958                             ssl->min_major_ver, ssl->min_minor_ver ) );
00959 
00960         ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
00961                                      SSL_ALERT_MSG_PROTOCOL_VERSION );
00962         return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
00963     }
00964 
00965     ssl->handshake->max_major_ver = buf[3];
00966     ssl->handshake->max_minor_ver = buf[4];
00967 
00968     if( ( ret = ssl_fetch_input ( ssl, 2 + n ) ) != 0 )
00969     {
00970         SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
00971         return( ret );
00972     }
00973 
00974     ssl->handshake->update_checksum( ssl, buf + 2, n );
00975 
00976     buf = ssl->in_msg;
00977     n = ssl->in_left - 5;
00978 
00979     /*
00980      *    0  .   1   ciphersuitelist length
00981      *    2  .   3   session id length
00982      *    4  .   5   challenge length
00983      *    6  .  ..   ciphersuitelist
00984      *   ..  .  ..   session id
00985      *   ..  .  ..   challenge
00986      */
00987     SSL_DEBUG_BUF( 4, "record contents", buf, n );
00988 
00989     ciph_len = ( buf[0] << 8 ) | buf[1];
00990     sess_len = ( buf[2] << 8 ) | buf[3];
00991     chal_len = ( buf[4] << 8 ) | buf[5];
00992 
00993     SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d",
00994                    ciph_len, sess_len, chal_len ) );
00995 
00996     /*
00997      * Make sure each parameter length is valid
00998      */
00999     if( ciph_len < 3 || ( ciph_len % 3 ) != 0 )
01000     {
01001         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01002         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01003     }
01004 
01005     if( sess_len > 32 )
01006     {
01007         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01008         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01009     }
01010 
01011     if( chal_len < 8 || chal_len > 32 )
01012     {
01013         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01014         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01015     }
01016 
01017     if( n != 6 + ciph_len + sess_len + chal_len )
01018     {
01019         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01020         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01021     }
01022 
01023     SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
01024                    buf + 6, ciph_len );
01025     SSL_DEBUG_BUF( 3, "client hello, session id",
01026                    buf + 6 + ciph_len, sess_len );
01027     SSL_DEBUG_BUF( 3, "client hello, challenge",
01028                    buf + 6 + ciph_len + sess_len, chal_len );
01029 
01030     p = buf + 6 + ciph_len;
01031     ssl->session_negotiate->length = sess_len;
01032     memset( ssl->session_negotiate->id, 0,
01033             sizeof( ssl->session_negotiate->id ) );
01034     memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->length );
01035 
01036     p += sess_len;
01037     memset( ssl->handshake->randbytes, 0, 64 );
01038     memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len );
01039 
01040     /*
01041      * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
01042      */
01043     for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )
01044     {
01045         if( p[0] == 0 && p[1] == 0 && p[2] == SSL_EMPTY_RENEGOTIATION_INFO )
01046         {
01047             SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
01048             if( ssl->renegotiation == SSL_RENEGOTIATION )
01049             {
01050                 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
01051 
01052                 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
01053                     return( ret );
01054 
01055                 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01056             }
01057             ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
01058             break;
01059         }
01060     }
01061 
01062     ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
01063     ciphersuite_info = NULL;
01064 #if defined(POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE)
01065     for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
01066     {
01067         for( i = 0; ciphersuites[i] != 0; i++ )
01068 #else
01069     for( i = 0; ciphersuites[i] != 0; i++ )
01070     {
01071         for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
01072 #endif
01073         {
01074             if( p[0] != 0 ||
01075                 p[1] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) ||
01076                 p[2] != ( ( ciphersuites[i]      ) & 0xFF ) )
01077                 continue;
01078 
01079             if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i],
01080                                                &ciphersuite_info ) ) != 0 )
01081                 return( ret );
01082 
01083             if( ciphersuite_info != NULL )
01084                 goto have_ciphersuite_v2;
01085         }
01086     }
01087 
01088     SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
01089 
01090     return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
01091 
01092 have_ciphersuite_v2:
01093     ssl->session_negotiate->ciphersuite = ciphersuites[i];
01094     ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
01095     ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
01096 
01097     /*
01098      * SSLv2 Client Hello relevant renegotiation security checks
01099      */
01100     if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
01101         ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
01102     {
01103         SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
01104 
01105         if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
01106             return( ret );
01107 
01108         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01109     }
01110 
01111     ssl->in_left = 0;
01112     ssl->state++;
01113 
01114     SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) );
01115 
01116     return( 0 );
01117 }
01118 #endif /* POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
01119 
01120 static int ssl_parse_client_hello( ssl_context *ssl )
01121 {
01122     int ret;
01123     unsigned int i, j;
01124     size_t n;
01125     unsigned int ciph_len, sess_len;
01126     unsigned int comp_len;
01127     unsigned int ext_len = 0;
01128     unsigned char *buf, *p, *ext;
01129     int renegotiation_info_seen = 0;
01130     int handshake_failure = 0;
01131     const int *ciphersuites;
01132     const ssl_ciphersuite_t *ciphersuite_info;
01133 
01134     SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
01135 
01136     if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
01137         ( ret = ssl_fetch_input ( ssl, 5 ) ) != 0 )
01138     {
01139         SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
01140         return( ret );
01141     }
01142 
01143     buf = ssl->in_hdr;
01144 
01145 #if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
01146     if( ( buf[0] & 0x80 ) != 0 )
01147         return ssl_parse_client_hello_v2( ssl );
01148 #endif
01149 
01150     SSL_DEBUG_BUF( 4, "record header", buf, 5 );
01151 
01152     SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d",
01153                    buf[0] ) );
01154     SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d",
01155                    ( buf[3] << 8 ) | buf[4] ) );
01156     SSL_DEBUG_MSG( 3, ( "client hello v3, protocol ver: [%d:%d]",
01157                    buf[1], buf[2] ) );
01158 
01159     /*
01160      * SSLv3/TLS Client Hello
01161      *
01162      * Record layer:
01163      *     0  .   0   message type
01164      *     1  .   2   protocol version
01165      *     3  .   4   message length
01166      */
01167 
01168     /* According to RFC 5246 Appendix E.1, the version here is typically
01169      * "{03,00}, the lowest version number supported by the client, [or] the
01170      * value of ClientHello.client_version", so the only meaningful check here
01171      * is the major version shouldn't be less than 3 */
01172     if( buf[0] != SSL_MSG_HANDSHAKE ||
01173         buf[1] < SSL_MAJOR_VERSION_3 )
01174     {
01175         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01176         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01177     }
01178 
01179     n = ( buf[3] << 8 ) | buf[4];
01180 
01181     if( n < 45 || n > SSL_MAX_CONTENT_LEN )
01182     {
01183         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01184         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01185     }
01186 
01187     if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
01188         ( ret = ssl_fetch_input ( ssl, 5 + n ) ) != 0 )
01189     {
01190         SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
01191         return( ret );
01192     }
01193 
01194     buf = ssl->in_msg;
01195     if( !ssl->renegotiation )
01196         n = ssl->in_left - 5;
01197     else
01198         n = ssl->in_msglen;
01199 
01200     ssl->handshake->update_checksum( ssl, buf, n );
01201 
01202     /*
01203      * SSL layer:
01204      *     0  .   0   handshake type
01205      *     1  .   3   handshake length
01206      *     4  .   5   protocol version
01207      *     6  .   9   UNIX time()
01208      *    10  .  37   random bytes
01209      *    38  .  38   session id length
01210      *    39  . 38+x  session id
01211      *   39+x . 40+x  ciphersuitelist length
01212      *   41+x .  ..   ciphersuitelist
01213      *    ..  .  ..   compression alg.
01214      *    ..  .  ..   extensions
01215      */
01216     SSL_DEBUG_BUF( 4, "record contents", buf, n );
01217 
01218     SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d",
01219                    buf[0] ) );
01220     SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d",
01221                    ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) );
01222     SSL_DEBUG_MSG( 3, ( "client hello v3, max. version: [%d:%d]",
01223                    buf[4], buf[5] ) );
01224 
01225     /*
01226      * Check the handshake type and protocol version
01227      */
01228     if( buf[0] != SSL_HS_CLIENT_HELLO )
01229     {
01230         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01231         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01232     }
01233 
01234     ssl->major_ver = buf[4];
01235     ssl->minor_ver = buf[5];
01236 
01237     ssl->handshake->max_major_ver = ssl->major_ver;
01238     ssl->handshake->max_minor_ver = ssl->minor_ver;
01239 
01240     if( ssl->major_ver < ssl->min_major_ver ||
01241         ssl->minor_ver < ssl->min_minor_ver )
01242     {
01243         SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
01244                             " [%d:%d] < [%d:%d]",
01245                             ssl->major_ver, ssl->minor_ver,
01246                             ssl->min_major_ver, ssl->min_minor_ver ) );
01247 
01248         ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
01249                                      SSL_ALERT_MSG_PROTOCOL_VERSION );
01250 
01251         return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
01252     }
01253 
01254     if( ssl->major_ver > ssl->max_major_ver )
01255     {
01256         ssl->major_ver = ssl->max_major_ver;
01257         ssl->minor_ver = ssl->max_minor_ver;
01258     }
01259     else if( ssl->minor_ver > ssl->max_minor_ver )
01260         ssl->minor_ver = ssl->max_minor_ver;
01261 
01262     memcpy( ssl->handshake->randbytes, buf + 6, 32 );
01263 
01264     /*
01265      * Check the handshake message length
01266      */
01267     if( buf[1] != 0 || n != (unsigned int) 4 + ( ( buf[2] << 8 ) | buf[3] ) )
01268     {
01269         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01270         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01271     }
01272 
01273     /*
01274      * Check the session length
01275      */
01276     sess_len = buf[38];
01277 
01278     if( sess_len > 32 )
01279     {
01280         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01281         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01282     }
01283 
01284     ssl->session_negotiate->length = sess_len;
01285     memset( ssl->session_negotiate->id, 0,
01286             sizeof( ssl->session_negotiate->id ) );
01287     memcpy( ssl->session_negotiate->id, buf + 39,
01288             ssl->session_negotiate->length );
01289 
01290     /*
01291      * Check the ciphersuitelist length
01292      */
01293     ciph_len = ( buf[39 + sess_len] << 8 )
01294              | ( buf[40 + sess_len]      );
01295 
01296     if( ciph_len < 2 || ( ciph_len % 2 ) != 0 )
01297     {
01298         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01299         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01300     }
01301 
01302     /*
01303      * Check the compression algorithms length
01304      */
01305     comp_len = buf[41 + sess_len + ciph_len];
01306 
01307     if( comp_len < 1 || comp_len > 16 )
01308     {
01309         SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01310         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01311     }
01312 
01313     /*
01314      * Check the extension length
01315      */
01316     if( n > 42 + sess_len + ciph_len + comp_len )
01317     {
01318         ext_len = ( buf[42 + sess_len + ciph_len + comp_len] << 8 )
01319                 | ( buf[43 + sess_len + ciph_len + comp_len]      );
01320 
01321         if( ( ext_len > 0 && ext_len < 4 ) ||
01322             n != 44 + sess_len + ciph_len + comp_len + ext_len )
01323         {
01324             SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01325             SSL_DEBUG_BUF( 3, "Ext", buf + 44 + sess_len + ciph_len + comp_len, ext_len);
01326             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01327         }
01328     }
01329 
01330     ssl->session_negotiate->compression = SSL_COMPRESS_NULL;
01331 #if defined(POLARSSL_ZLIB_SUPPORT)
01332     for( i = 0; i < comp_len; ++i )
01333     {
01334         if( buf[42 + sess_len + ciph_len + i] == SSL_COMPRESS_DEFLATE )
01335         {
01336             ssl->session_negotiate->compression = SSL_COMPRESS_DEFLATE;
01337             break;
01338         }
01339     }
01340 #endif
01341 
01342     SSL_DEBUG_BUF( 3, "client hello, random bytes",
01343                    buf +  6,  32 );
01344     SSL_DEBUG_BUF( 3, "client hello, session id",
01345                    buf + 38,  sess_len );
01346     SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
01347                    buf + 41 + sess_len,  ciph_len );
01348     SSL_DEBUG_BUF( 3, "client hello, compression",
01349                    buf + 42 + sess_len + ciph_len, comp_len );
01350 
01351     /*
01352      * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
01353      */
01354     for( i = 0, p = buf + 41 + sess_len; i < ciph_len; i += 2, p += 2 )
01355     {
01356         if( p[0] == 0 && p[1] == SSL_EMPTY_RENEGOTIATION_INFO )
01357         {
01358             SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
01359             if( ssl->renegotiation == SSL_RENEGOTIATION )
01360             {
01361                 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
01362 
01363                 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
01364                     return( ret );
01365 
01366                 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01367             }
01368             ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
01369             break;
01370         }
01371     }
01372 
01373     ext = buf + 44 + sess_len + ciph_len + comp_len;
01374 
01375     while( ext_len )
01376     {
01377         unsigned int ext_id   = ( ( ext[0] <<  8 )
01378                                 | ( ext[1]       ) );
01379         unsigned int ext_size = ( ( ext[2] <<  8 )
01380                                 | ( ext[3]       ) );
01381 
01382         if( ext_size + 4 > ext_len )
01383         {
01384             SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01385             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01386         }
01387         switch( ext_id )
01388         {
01389 #if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
01390         case TLS_EXT_SERVERNAME:
01391             SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
01392             if( ssl->f_sni == NULL )
01393                 break;
01394 
01395             ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size );
01396             if( ret != 0 )
01397                 return( ret );
01398             break;
01399 #endif /* POLARSSL_SSL_SERVER_NAME_INDICATION */
01400 
01401         case TLS_EXT_RENEGOTIATION_INFO:
01402             SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
01403             renegotiation_info_seen = 1;
01404 
01405             ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size );
01406             if( ret != 0 )
01407                 return( ret );
01408             break;
01409 
01410 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
01411         case TLS_EXT_SIG_ALG:
01412             SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
01413             if( ssl->renegotiation == SSL_RENEGOTIATION )
01414                 break;
01415 
01416             ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size );
01417             if( ret != 0 )
01418                 return( ret );
01419             break;
01420 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
01421 
01422 #if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
01423         case TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
01424             SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
01425 
01426             ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size );
01427             if( ret != 0 )
01428                 return( ret );
01429             break;
01430 
01431         case TLS_EXT_SUPPORTED_POINT_FORMATS:
01432             SSL_DEBUG_MSG( 3, ( "found supported point formats extension" ) );
01433             ssl->handshake->cli_exts |= TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
01434 
01435             ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size );
01436             if( ret != 0 )
01437                 return( ret );
01438             break;
01439 #endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
01440 
01441 #if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
01442         case TLS_EXT_MAX_FRAGMENT_LENGTH:
01443             SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) );
01444 
01445             ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size );
01446             if( ret != 0 )
01447                 return( ret );
01448             break;
01449 #endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
01450 
01451 #if defined(POLARSSL_SSL_TRUNCATED_HMAC)
01452         case TLS_EXT_TRUNCATED_HMAC:
01453             SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) );
01454 
01455             ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size );
01456             if( ret != 0 )
01457                 return( ret );
01458             break;
01459 #endif /* POLARSSL_SSL_TRUNCATED_HMAC */
01460 
01461 #if defined(POLARSSL_SSL_SESSION_TICKETS)
01462         case TLS_EXT_SESSION_TICKET:
01463             SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) );
01464 
01465             ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size );
01466             if( ret != 0 )
01467                 return( ret );
01468             break;
01469 #endif /* POLARSSL_SSL_SESSION_TICKETS */
01470 
01471 #if defined(POLARSSL_SSL_ALPN)
01472         case TLS_EXT_ALPN:
01473             SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
01474 
01475             ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size );
01476             if( ret != 0 )
01477                 return( ret );
01478             break;
01479 #endif /* POLARSSL_SSL_SESSION_TICKETS */
01480 
01481         default:
01482             SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
01483                            ext_id ) );
01484         }
01485 
01486         ext_len -= 4 + ext_size;
01487         ext += 4 + ext_size;
01488 
01489         if( ext_len > 0 && ext_len < 4 )
01490         {
01491             SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
01492             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01493         }
01494     }
01495 
01496     /*
01497      * Renegotiation security checks
01498      */
01499     if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
01500         ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
01501     {
01502         SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
01503         handshake_failure = 1;
01504     }
01505     else if( ssl->renegotiation == SSL_RENEGOTIATION &&
01506              ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
01507              renegotiation_info_seen == 0 )
01508     {
01509         SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
01510         handshake_failure = 1;
01511     }
01512     else if( ssl->renegotiation == SSL_RENEGOTIATION &&
01513              ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
01514              ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
01515     {
01516         SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
01517         handshake_failure = 1;
01518     }
01519     else if( ssl->renegotiation == SSL_RENEGOTIATION &&
01520              ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
01521              renegotiation_info_seen == 1 )
01522     {
01523         SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
01524         handshake_failure = 1;
01525     }
01526 
01527     if( handshake_failure == 1 )
01528     {
01529         if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
01530             return( ret );
01531 
01532         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
01533     }
01534 
01535     /*
01536      * Search for a matching ciphersuite
01537      * (At the end because we need information from the EC-based extensions
01538      * and certificate from the SNI callback triggered by the SNI extension.)
01539      */
01540     ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
01541     ciphersuite_info = NULL;
01542 #if defined(POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE)
01543     for( j = 0, p = buf + 41 + sess_len; j < ciph_len; j += 2, p += 2 )
01544     {
01545         for( i = 0; ciphersuites[i] != 0; i++ )
01546 #else
01547     for( i = 0; ciphersuites[i] != 0; i++ )
01548     {
01549         for( j = 0, p = buf + 41 + sess_len; j < ciph_len; j += 2, p += 2 )
01550 #endif
01551         {
01552             if( p[0] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) ||
01553                 p[1] != ( ( ciphersuites[i]      ) & 0xFF ) )
01554                 continue;
01555 
01556             if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i],
01557                                                &ciphersuite_info ) ) != 0 )
01558                 return( ret );
01559 
01560             if( ciphersuite_info != NULL )
01561                 goto have_ciphersuite;
01562         }
01563     }
01564 
01565     SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
01566 
01567     if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
01568         return( ret );
01569 
01570     return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
01571 
01572 have_ciphersuite:
01573     ssl->session_negotiate->ciphersuite = ciphersuites[i];
01574     ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
01575     ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
01576 
01577     ssl->in_left = 0;
01578     ssl->state++;
01579 
01580     SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
01581 
01582     return( 0 );
01583 }
01584 
01585 #if defined(POLARSSL_SSL_TRUNCATED_HMAC)
01586 static void ssl_write_truncated_hmac_ext( ssl_context *ssl,
01587                                           unsigned char *buf,
01588                                           size_t *olen )
01589 {
01590     unsigned char *p = buf;
01591 
01592     if( ssl->session_negotiate->trunc_hmac == SSL_TRUNC_HMAC_DISABLED )
01593     {
01594         *olen = 0;
01595         return;
01596     }
01597 
01598     SSL_DEBUG_MSG( 3, ( "server hello, adding truncated hmac extension" ) );
01599 
01600     *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
01601     *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC      ) & 0xFF );
01602 
01603     *p++ = 0x00;
01604     *p++ = 0x00;
01605 
01606     *olen = 4;
01607 }
01608 #endif /* POLARSSL_SSL_TRUNCATED_HMAC */
01609 
01610 #if defined(POLARSSL_SSL_SESSION_TICKETS)
01611 static void ssl_write_session_ticket_ext( ssl_context *ssl,
01612                                           unsigned char *buf,
01613                                           size_t *olen )
01614 {
01615     unsigned char *p = buf;
01616 
01617     if( ssl->handshake->new_session_ticket == 0 )
01618     {
01619         *olen = 0;
01620         return;
01621     }
01622 
01623     SSL_DEBUG_MSG( 3, ( "server hello, adding session ticket extension" ) );
01624 
01625     *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
01626     *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET      ) & 0xFF );
01627 
01628     *p++ = 0x00;
01629     *p++ = 0x00;
01630 
01631     *olen = 4;
01632 }
01633 #endif /* POLARSSL_SSL_SESSION_TICKETS */
01634 
01635 static void ssl_write_renegotiation_ext( ssl_context *ssl,
01636                                          unsigned char *buf,
01637                                          size_t *olen )
01638 {
01639     unsigned char *p = buf;
01640 
01641     if( ssl->secure_renegotiation != SSL_SECURE_RENEGOTIATION )
01642     {
01643         *olen = 0;
01644         return;
01645     }
01646 
01647     SSL_DEBUG_MSG( 3, ( "server hello, secure renegotiation extension" ) );
01648 
01649     *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
01650     *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO      ) & 0xFF );
01651 
01652     *p++ = 0x00;
01653     *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF;
01654     *p++ = ssl->verify_data_len * 2 & 0xFF;
01655 
01656     memcpy( p, ssl->peer_verify_data, ssl->verify_data_len );
01657     p += ssl->verify_data_len;
01658     memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
01659     p += ssl->verify_data_len;
01660 
01661     *olen = 5 + ssl->verify_data_len * 2;
01662 }
01663 
01664 #if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
01665 static void ssl_write_max_fragment_length_ext( ssl_context *ssl,
01666                                                unsigned char *buf,
01667                                                size_t *olen )
01668 {
01669     unsigned char *p = buf;
01670 
01671     if( ssl->session_negotiate->mfl_code == SSL_MAX_FRAG_LEN_NONE )
01672     {
01673         *olen = 0;
01674         return;
01675     }
01676 
01677     SSL_DEBUG_MSG( 3, ( "server hello, max_fragment_length extension" ) );
01678 
01679     *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
01680     *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH      ) & 0xFF );
01681 
01682     *p++ = 0x00;
01683     *p++ = 1;
01684 
01685     *p++ = ssl->session_negotiate->mfl_code;
01686 
01687     *olen = 5;
01688 }
01689 #endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
01690 
01691 #if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
01692 static void ssl_write_supported_point_formats_ext( ssl_context *ssl,
01693                                                    unsigned char *buf,
01694                                                    size_t *olen )
01695 {
01696     unsigned char *p = buf;
01697     ((void) ssl);
01698 
01699     if( ( ssl->handshake->cli_exts &
01700           TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT ) == 0 )
01701     {
01702         *olen = 0;
01703         return;
01704     }
01705 
01706     SSL_DEBUG_MSG( 3, ( "server hello, supported_point_formats extension" ) );
01707 
01708     *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
01709     *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS      ) & 0xFF );
01710 
01711     *p++ = 0x00;
01712     *p++ = 2;
01713 
01714     *p++ = 1;
01715     *p++ = POLARSSL_ECP_PF_UNCOMPRESSED;
01716 
01717     *olen = 6;
01718 }
01719 #endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
01720 
01721 #if defined(POLARSSL_SSL_ALPN )
01722 static void ssl_write_alpn_ext( ssl_context *ssl,
01723                                 unsigned char *buf, size_t *olen )
01724 {
01725     if( ssl->alpn_chosen == NULL )
01726     {
01727         *olen = 0;
01728         return;
01729     }
01730 
01731     SSL_DEBUG_MSG( 3, ( "server hello, adding alpn extension" ) );
01732 
01733     /*
01734      * 0 . 1    ext identifier
01735      * 2 . 3    ext length
01736      * 4 . 5    protocol list length
01737      * 6 . 6    protocol name length
01738      * 7 . 7+n  protocol name
01739      */
01740     buf[0] = (unsigned char)( ( TLS_EXT_ALPN >> 8 ) & 0xFF );
01741     buf[1] = (unsigned char)( ( TLS_EXT_ALPN      ) & 0xFF );
01742 
01743     *olen = 7 + strlen( ssl->alpn_chosen );
01744 
01745     buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
01746     buf[3] = (unsigned char)( ( ( *olen - 4 )      ) & 0xFF );
01747 
01748     buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
01749     buf[5] = (unsigned char)( ( ( *olen - 6 )      ) & 0xFF );
01750 
01751     buf[6] = (unsigned char)( ( ( *olen - 7 )      ) & 0xFF );
01752 
01753     memcpy( buf + 7, ssl->alpn_chosen, *olen - 7 );
01754 }
01755 #endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
01756 
01757 static int ssl_write_server_hello( ssl_context *ssl )
01758 {
01759 #if defined(POLARSSL_HAVE_TIME)
01760     time_t t;
01761 #endif
01762     int ret;
01763     size_t olen, ext_len = 0, n;
01764     unsigned char *buf, *p;
01765 
01766     SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
01767 
01768     if( ssl->f_rng == NULL )
01769     {
01770         SSL_DEBUG_MSG( 1, ( "no RNG provided") );
01771         return( POLARSSL_ERR_SSL_NO_RNG );
01772     }
01773 
01774     /*
01775      *     0  .   0   handshake type
01776      *     1  .   3   handshake length
01777      *     4  .   5   protocol version
01778      *     6  .   9   UNIX time()
01779      *    10  .  37   random bytes
01780      */
01781     buf = ssl->out_msg;
01782     p = buf + 4;
01783 
01784     *p++ = (unsigned char) ssl->major_ver;
01785     *p++ = (unsigned char) ssl->minor_ver;
01786 
01787     SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
01788                    buf[4], buf[5] ) );
01789 
01790 #if defined(POLARSSL_HAVE_TIME)
01791     t = time( NULL );
01792     *p++ = (unsigned char)( t >> 24 );
01793     *p++ = (unsigned char)( t >> 16 );
01794     *p++ = (unsigned char)( t >>  8 );
01795     *p++ = (unsigned char)( t       );
01796 
01797     SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
01798 #else
01799     if( ( ret = ssl->f_rng( ssl->p_rng, p, 4 ) ) != 0 )
01800         return( ret );
01801 
01802     p += 4;
01803 #endif /* POLARSSL_HAVE_TIME */
01804 
01805     if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
01806         return( ret );
01807 
01808     p += 28;
01809 
01810     memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
01811 
01812     SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
01813 
01814     /*
01815      * Resume is 0  by default, see ssl_handshake_init().
01816      * It may be already set to 1 by ssl_parse_session_ticket_ext().
01817      * If not, try looking up session ID in our cache.
01818      */
01819     if( ssl->handshake->resume == 0 &&
01820         ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
01821         ssl->session_negotiate->length != 0 &&
01822         ssl->f_get_cache != NULL &&
01823         ssl->f_get_cache( ssl->p_get_cache, ssl->session_negotiate ) == 0 )
01824     {
01825         SSL_DEBUG_MSG( 3, ( "session successfully restored from cache" ) );
01826         ssl->handshake->resume = 1;
01827     }
01828 
01829     if( ssl->handshake->resume == 0 )
01830     {
01831         /*
01832          * New session, create a new session id,
01833          * unless we're about to issue a session ticket
01834          */
01835         ssl->state++;
01836 
01837 #if defined(POLARSSL_HAVE_TIME)
01838         ssl->session_negotiate->start = time( NULL );
01839 #endif
01840 
01841 #if defined(POLARSSL_SSL_SESSION_TICKETS)
01842         if( ssl->handshake->new_session_ticket != 0 )
01843         {
01844             ssl->session_negotiate->length = n = 0;
01845             memset( ssl->session_negotiate->id, 0, 32 );
01846         }
01847         else
01848 #endif /* POLARSSL_SSL_SESSION_TICKETS */
01849         {
01850             ssl->session_negotiate->length = n = 32;
01851             if( ( ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id,
01852                                     n ) ) != 0 )
01853                 return( ret );
01854         }
01855     }
01856     else
01857     {
01858         /*
01859          * Resuming a session
01860          */
01861         n = ssl->session_negotiate->length;
01862         ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
01863 
01864         if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
01865         {
01866             SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
01867             return( ret );
01868         }
01869     }
01870 
01871     /*
01872      *    38  .  38     session id length
01873      *    39  . 38+n    session id
01874      *   39+n . 40+n    chosen ciphersuite
01875      *   41+n . 41+n    chosen compression alg.
01876      *   42+n . 43+n    extensions length
01877      *   44+n . 43+n+m  extensions
01878      */
01879     *p++ = (unsigned char) ssl->session_negotiate->length;
01880     memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->length );
01881     p += ssl->session_negotiate->length;
01882 
01883     SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
01884     SSL_DEBUG_BUF( 3,   "server hello, session id", buf + 39, n );
01885     SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
01886                    ssl->handshake->resume ? "a" : "no" ) );
01887 
01888     *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 );
01889     *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite      );
01890     *p++ = (unsigned char)( ssl->session_negotiate->compression      );
01891 
01892     SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s",
01893            ssl_get_ciphersuite_name( ssl->session_negotiate->ciphersuite ) ) );
01894     SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: 0x%02X",
01895                    ssl->session_negotiate->compression ) );
01896 
01897     /*
01898      *  First write extensions, then the total length
01899      */
01900     ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
01901     ext_len += olen;
01902 
01903 #if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
01904     ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
01905     ext_len += olen;
01906 #endif
01907 
01908 #if defined(POLARSSL_SSL_TRUNCATED_HMAC)
01909     ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
01910     ext_len += olen;
01911 #endif
01912 
01913 #if defined(POLARSSL_SSL_SESSION_TICKETS)
01914     ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
01915     ext_len += olen;
01916 #endif
01917 
01918 #if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
01919     ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
01920     ext_len += olen;
01921 #endif
01922 
01923 #if defined(POLARSSL_SSL_ALPN)
01924     ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
01925     ext_len += olen;
01926 #endif
01927 
01928     SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d", ext_len ) );
01929 
01930     if( ext_len > 0 )
01931     {
01932         *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
01933         *p++ = (unsigned char)( ( ext_len      ) & 0xFF );
01934         p += ext_len;
01935     }
01936 
01937     ssl->out_msglen  = p - buf;
01938     ssl->out_msgtype = SSL_MSG_HANDSHAKE;
01939     ssl->out_msg[0]  = SSL_HS_SERVER_HELLO;
01940 
01941     ret = ssl_write_record( ssl );
01942 
01943     SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
01944 
01945     return( ret );
01946 }
01947 
01948 #if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)       && \
01949     !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)   && \
01950     !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
01951     !defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
01952 static int ssl_write_certificate_request( ssl_context *ssl )
01953 {
01954     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
01955     const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
01956 
01957     SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
01958 
01959     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
01960         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
01961         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
01962         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
01963     {
01964         SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
01965         ssl->state++;
01966         return( 0 );
01967     }
01968 
01969     SSL_DEBUG_MSG( 1, ( "should not happen" ) );
01970     return( ret );
01971 }
01972 #else
01973 static int ssl_write_certificate_request( ssl_context *ssl )
01974 {
01975     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
01976     const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
01977     size_t dn_size, total_dn_size; /* excluding length bytes */
01978     size_t ct_len, sa_len; /* including length bytes */
01979     unsigned char *buf, *p;
01980     const x509_crt *crt;
01981 
01982     SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
01983 
01984     ssl->state++;
01985 
01986     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
01987         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
01988         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
01989         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK ||
01990         ssl->authmode == SSL_VERIFY_NONE )
01991     {
01992         SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
01993         return( 0 );
01994     }
01995 
01996     /*
01997      *     0  .   0   handshake type
01998      *     1  .   3   handshake length
01999      *     4  .   4   cert type count
02000      *     5  .. m-1  cert types
02001      *     m  .. m+1  sig alg length (TLS 1.2 only)
02002      *    m+1 .. n-1  SignatureAndHashAlgorithms (TLS 1.2 only)
02003      *     n  .. n+1  length of all DNs
02004      *    n+2 .. n+3  length of DN 1
02005      *    n+4 .. ...  Distinguished Name #1
02006      *    ... .. ...  length of DN 2, etc.
02007      */
02008     buf = ssl->out_msg;
02009     p = buf + 4;
02010 
02011     /*
02012      * Supported certificate types
02013      *
02014      *     ClientCertificateType certificate_types<1..2^8-1>;
02015      *     enum { (255) } ClientCertificateType;
02016      */
02017     ct_len = 0;
02018 
02019 #if defined(POLARSSL_RSA_C)
02020     p[1 + ct_len++] = SSL_CERT_TYPE_RSA_SIGN;
02021 #endif
02022 #if defined(POLARSSL_ECDSA_C)
02023     p[1 + ct_len++] = SSL_CERT_TYPE_ECDSA_SIGN;
02024 #endif
02025 
02026     p[0] = (unsigned char) ct_len++;
02027     p += ct_len;
02028 
02029     sa_len = 0;
02030 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
02031     /*
02032      * Add signature_algorithms for verify (TLS 1.2)
02033      *
02034      *     SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
02035      *
02036      *     struct {
02037      *           HashAlgorithm hash;
02038      *           SignatureAlgorithm signature;
02039      *     } SignatureAndHashAlgorithm;
02040      *
02041      *     enum { (255) } HashAlgorithm;
02042      *     enum { (255) } SignatureAlgorithm;
02043      */
02044     if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
02045     {
02046         /*
02047          * Only use current running hash algorithm that is already required
02048          * for requested ciphersuite.
02049          */
02050         ssl->handshake->verify_sig_alg = SSL_HASH_SHA256;
02051 
02052         if( ssl->transform_negotiate->ciphersuite_info->mac ==
02053             POLARSSL_MD_SHA384 )
02054         {
02055             ssl->handshake->verify_sig_alg = SSL_HASH_SHA384;
02056         }
02057 
02058         /*
02059          * Supported signature algorithms
02060          */
02061 #if defined(POLARSSL_RSA_C)
02062         p[2 + sa_len++] = ssl->handshake->verify_sig_alg;
02063         p[2 + sa_len++] = SSL_SIG_RSA;
02064 #endif
02065 #if defined(POLARSSL_ECDSA_C)
02066         p[2 + sa_len++] = ssl->handshake->verify_sig_alg;
02067         p[2 + sa_len++] = SSL_SIG_ECDSA;
02068 #endif
02069 
02070         p[0] = (unsigned char)( sa_len >> 8 );
02071         p[1] = (unsigned char)( sa_len      );
02072         sa_len += 2;
02073         p += sa_len;
02074     }
02075 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
02076 
02077     /*
02078      * DistinguishedName certificate_authorities<0..2^16-1>;
02079      * opaque DistinguishedName<1..2^16-1>;
02080      */
02081     p += 2;
02082     crt = ssl->ca_chain;
02083 
02084     total_dn_size = 0;
02085     while( crt != NULL && crt->version != 0 )
02086     {
02087         if( p - buf > 4096 )
02088             break;
02089 
02090         dn_size = crt->subject_raw.len;
02091         *p++ = (unsigned char)( dn_size >> 8 );
02092         *p++ = (unsigned char)( dn_size      );
02093         memcpy( p, crt->subject_raw.p, dn_size );
02094         p += dn_size;
02095 
02096         SSL_DEBUG_BUF( 3, "requested DN", p, dn_size );
02097 
02098         total_dn_size += 2 + dn_size;
02099         crt = crt->next;
02100     }
02101 
02102     ssl->out_msglen  = p - buf;
02103     ssl->out_msgtype = SSL_MSG_HANDSHAKE;
02104     ssl->out_msg[0]  = SSL_HS_CERTIFICATE_REQUEST;
02105     ssl->out_msg[4 + ct_len + sa_len] = (unsigned char)( total_dn_size  >> 8 );
02106     ssl->out_msg[5 + ct_len + sa_len] = (unsigned char)( total_dn_size       );
02107 
02108     ret = ssl_write_record( ssl );
02109 
02110     SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
02111 
02112     return( ret );
02113 }
02114 #endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
02115           !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
02116           !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
02117           !POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
02118 
02119 #if defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
02120     defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
02121 static int ssl_get_ecdh_params_from_cert( ssl_context *ssl )
02122 {
02123     int ret;
02124 
02125     if( ! pk_can_do( ssl_own_key( ssl ), POLARSSL_PK_ECKEY ) )
02126     {
02127         SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
02128         return( POLARSSL_ERR_SSL_PK_TYPE_MISMATCH );
02129     }
02130 
02131     if( ( ret = ecdh_get_params( &ssl->handshake->ecdh_ctx,
02132                                  pk_ec( *ssl_own_key( ssl ) ),
02133                                  POLARSSL_ECDH_OURS ) ) != 0 )
02134     {
02135         SSL_DEBUG_RET( 1, ( "ecdh_get_params" ), ret );
02136         return( ret );
02137     }
02138 
02139     return( 0 );
02140 }
02141 #endif /* POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
02142           POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
02143 
02144 static int ssl_write_server_key_exchange( ssl_context *ssl )
02145 {
02146     int ret;
02147     size_t n = 0;
02148     const ssl_ciphersuite_t *ciphersuite_info =
02149                             ssl->transform_negotiate->ciphersuite_info;
02150 
02151 #if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \
02152     defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED) ||                       \
02153     defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \
02154     defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED) ||                     \
02155     defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
02156     unsigned char *p = ssl->out_msg + 4;
02157     unsigned char *dig_signed = p;
02158     size_t dig_signed_len = 0, len;
02159     ((void) dig_signed);
02160     ((void) dig_signed_len);
02161 #endif
02162 
02163     SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
02164 
02165 #if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) ||                           \
02166     defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) ||                           \
02167     defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
02168     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA ||
02169         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
02170         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK )
02171     {
02172         SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
02173         ssl->state++;
02174         return( 0 );
02175     }
02176 #endif
02177 
02178 #if defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
02179     defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
02180     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_RSA ||
02181         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_ECDSA )
02182     {
02183         ssl_get_ecdh_params_from_cert( ssl );
02184 
02185         SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
02186         ssl->state++;
02187         return( 0 );
02188     }
02189 #endif
02190 
02191 #if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED) ||                       \
02192     defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
02193     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
02194         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
02195     {
02196         /* TODO: Support identity hints */
02197         *(p++) = 0x00;
02198         *(p++) = 0x00;
02199 
02200         n += 2;
02201     }
02202 #endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED ||
02203           POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
02204 
02205 #if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \
02206     defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
02207     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
02208         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
02209     {
02210         /*
02211          * Ephemeral DH parameters:
02212          *
02213          * struct {
02214          *     opaque dh_p<1..2^16-1>;
02215          *     opaque dh_g<1..2^16-1>;
02216          *     opaque dh_Ys<1..2^16-1>;
02217          * } ServerDHParams;
02218          */
02219         if( ( ret = mpi_copy( &ssl->handshake->dhm_ctx.P, &ssl->dhm_P ) ) != 0 ||
02220             ( ret = mpi_copy( &ssl->handshake->dhm_ctx.G, &ssl->dhm_G ) ) != 0 )
02221         {
02222             SSL_DEBUG_RET( 1, "mpi_copy", ret );
02223             return( ret );
02224         }
02225 
02226         if( ( ret = dhm_make_params( &ssl->handshake->dhm_ctx,
02227                         (int) mpi_size( &ssl->handshake->dhm_ctx.P ),
02228                         p, &len, ssl->f_rng, ssl->p_rng ) ) != 0 )
02229         {
02230             SSL_DEBUG_RET( 1, "dhm_make_params", ret );
02231             return( ret );
02232         }
02233 
02234         dig_signed = p;
02235         dig_signed_len = len;
02236 
02237         p += len;
02238         n += len;
02239 
02240         SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X  );
02241         SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P  );
02242         SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G  );
02243         SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
02244     }
02245 #endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
02246           POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
02247 
02248 #if defined(POLARSSL_KEY_EXCHANGE__SOME__ECDHE_ENABLED)
02249     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA ||
02250         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA ||
02251         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
02252     {
02253         /*
02254          * Ephemeral ECDH parameters:
02255          *
02256          * struct {
02257          *     ECParameters curve_params;
02258          *     ECPoint      public;
02259          * } ServerECDHParams;
02260          */
02261         const ecp_curve_info **curve = NULL;
02262 #if defined(POLARSSL_SSL_SET_CURVES)
02263         const ecp_group_id *gid;
02264 
02265         /* Match our preference list against the offered curves */
02266         for( gid = ssl->curve_list; *gid != POLARSSL_ECP_DP_NONE; gid++ )
02267             for( curve = ssl->handshake->curves; *curve != NULL; curve++ )
02268                 if( (*curve)->grp_id == *gid )
02269                     goto curve_matching_done;
02270 
02271 curve_matching_done:
02272 #else
02273         curve = ssl->handshake->curves;
02274 #endif
02275 
02276         if( *curve == NULL )
02277         {
02278             SSL_DEBUG_MSG( 1, ( "no matching curve for ECDHE" ) );
02279             return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
02280         }
02281 
02282         SSL_DEBUG_MSG( 2, ( "ECDHE curve: %s", (*curve)->name ) );
02283 
02284         if( ( ret = ecp_use_known_dp( &ssl->handshake->ecdh_ctx.grp,
02285                                        (*curve)->grp_id ) ) != 0 )
02286         {
02287             SSL_DEBUG_RET( 1, "ecp_use_known_dp", ret );
02288             return( ret );
02289         }
02290 
02291         if( ( ret = ecdh_make_params( &ssl->handshake->ecdh_ctx, &len,
02292                                       p, SSL_MAX_CONTENT_LEN - n,
02293                                       ssl->f_rng, ssl->p_rng ) ) != 0 )
02294         {
02295             SSL_DEBUG_RET( 1, "ecdh_make_params", ret );
02296             return( ret );
02297         }
02298 
02299         dig_signed = p;
02300         dig_signed_len = len;
02301 
02302         p += len;
02303         n += len;
02304 
02305         SSL_DEBUG_ECP( 3, "ECDH: Q ", &ssl->handshake->ecdh_ctx.Q );
02306     }
02307 #endif /* POLARSSL_KEY_EXCHANGE__SOME__ECDHE_ENABLED */
02308 
02309 #if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \
02310     defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \
02311     defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
02312     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
02313         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA ||
02314         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA )
02315     {
02316         size_t signature_len = 0;
02317         unsigned int hashlen = 0;
02318         unsigned char hash[64];
02319         md_type_t md_alg = POLARSSL_MD_NONE;
02320 
02321         /*
02322          * Choose hash algorithm. NONE means MD5 + SHA1 here.
02323          */
02324 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
02325         if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
02326         {
02327             md_alg = ssl_md_alg_from_hash( ssl->handshake->sig_alg );
02328 
02329             if( md_alg == POLARSSL_MD_NONE )
02330             {
02331                 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
02332                 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
02333             }
02334         }
02335         else
02336 #endif
02337 #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
02338     defined(POLARSSL_SSL_PROTO_TLS1_1)
02339         if ( ciphersuite_info->key_exchange ==
02340                   POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA )
02341         {
02342             md_alg = POLARSSL_MD_SHA1;
02343         }
02344         else
02345 #endif
02346         {
02347             md_alg = POLARSSL_MD_NONE;
02348         }
02349 
02350         /*
02351          * Compute the hash to be signed
02352          */
02353 #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
02354     defined(POLARSSL_SSL_PROTO_TLS1_1)
02355         if( md_alg == POLARSSL_MD_NONE )
02356         {
02357             md5_context md5;
02358             sha1_context sha1;
02359 
02360             /*
02361              * digitally-signed struct {
02362              *     opaque md5_hash[16];
02363              *     opaque sha_hash[20];
02364              * };
02365              *
02366              * md5_hash
02367              *     MD5(ClientHello.random + ServerHello.random
02368              *                            + ServerParams);
02369              * sha_hash
02370              *     SHA(ClientHello.random + ServerHello.random
02371              *                            + ServerParams);
02372              */
02373             md5_starts( &md5 );
02374             md5_update( &md5, ssl->handshake->randbytes,  64 );
02375             md5_update( &md5, dig_signed, dig_signed_len );
02376             md5_finish( &md5, hash );
02377 
02378             sha1_starts( &sha1 );
02379             sha1_update( &sha1, ssl->handshake->randbytes,  64 );
02380             sha1_update( &sha1, dig_signed, dig_signed_len );
02381             sha1_finish( &sha1, hash + 16 );
02382 
02383             hashlen = 36;
02384         }
02385         else
02386 #endif /* POLARSSL_SSL_PROTO_SSL3 || POLARSSL_SSL_PROTO_TLS1 || \
02387           POLARSSL_SSL_PROTO_TLS1_1 */
02388 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
02389     defined(POLARSSL_SSL_PROTO_TLS1_2)
02390         if( md_alg != POLARSSL_MD_NONE )
02391         {
02392             md_context_t ctx;
02393 
02394             /* Info from md_alg will be used instead */
02395             hashlen = 0;
02396 
02397             /*
02398              * digitally-signed struct {
02399              *     opaque client_random[32];
02400              *     opaque server_random[32];
02401              *     ServerDHParams params;
02402              * };
02403              */
02404             if( ( ret = md_init_ctx( &ctx, md_info_from_type(md_alg) ) ) != 0 )
02405             {
02406                 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
02407                 return( ret );
02408             }
02409 
02410             md_starts( &ctx );
02411             md_update( &ctx, ssl->handshake->randbytes, 64 );
02412             md_update( &ctx, dig_signed, dig_signed_len );
02413             md_finish( &ctx, hash );
02414 
02415             if( ( ret = md_free_ctx( &ctx ) ) != 0 )
02416             {
02417                 SSL_DEBUG_RET( 1, "md_free_ctx", ret );
02418                 return( ret );
02419             }
02420 
02421         }
02422         else
02423 #endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
02424           POLARSSL_SSL_PROTO_TLS1_2 */
02425         {
02426             SSL_DEBUG_MSG( 1, ( "should never happen" ) );
02427             return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
02428         }
02429 
02430         SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen != 0 ? hashlen :
02431                 (unsigned int) ( md_info_from_type( md_alg ) )->size );
02432 
02433         /*
02434          * Make the signature
02435          */
02436         if( ssl_own_key( ssl ) == NULL )
02437         {
02438             SSL_DEBUG_MSG( 1, ( "got no private key" ) );
02439             return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
02440         }
02441 
02442 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
02443         if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
02444         {
02445             *(p++) = ssl->handshake->sig_alg;
02446             *(p++) = ssl_sig_from_pk( ssl_own_key( ssl ) );
02447 
02448             n += 2;
02449         }
02450 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
02451 
02452         if( ( ret = pk_sign( ssl_own_key( ssl ), md_alg, hash, hashlen,
02453                         p + 2 , &signature_len,
02454                         ssl->f_rng, ssl->p_rng ) ) != 0 )
02455         {
02456             SSL_DEBUG_RET( 1, "pk_sign", ret );
02457             return( ret );
02458         }
02459 
02460         *(p++) = (unsigned char)( signature_len >> 8 );
02461         *(p++) = (unsigned char)( signature_len      );
02462         n += 2;
02463 
02464         SSL_DEBUG_BUF( 3, "my signature", p, signature_len );
02465 
02466         p += signature_len;
02467         n += signature_len;
02468     }
02469 #endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) ||
02470           POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
02471           POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
02472 
02473     ssl->out_msglen  = 4 + n;
02474     ssl->out_msgtype = SSL_MSG_HANDSHAKE;
02475     ssl->out_msg[0]  = SSL_HS_SERVER_KEY_EXCHANGE;
02476 
02477     ssl->state++;
02478 
02479     if( ( ret = ssl_write_record( ssl ) ) != 0 )
02480     {
02481         SSL_DEBUG_RET( 1, "ssl_write_record", ret );
02482         return( ret );
02483     }
02484 
02485     SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) );
02486 
02487     return( 0 );
02488 }
02489 
02490 static int ssl_write_server_hello_done( ssl_context *ssl )
02491 {
02492     int ret;
02493 
02494     SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) );
02495 
02496     ssl->out_msglen  = 4;
02497     ssl->out_msgtype = SSL_MSG_HANDSHAKE;
02498     ssl->out_msg[0]  = SSL_HS_SERVER_HELLO_DONE;
02499 
02500     ssl->state++;
02501 
02502     if( ( ret = ssl_write_record( ssl ) ) != 0 )
02503     {
02504         SSL_DEBUG_RET( 1, "ssl_write_record", ret );
02505         return( ret );
02506     }
02507 
02508     SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) );
02509 
02510     return( 0 );
02511 }
02512 
02513 #if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \
02514     defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
02515 static int ssl_parse_client_dh_public( ssl_context *ssl, unsigned char **p,
02516                                        const unsigned char *end )
02517 {
02518     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
02519     size_t n;
02520 
02521     /*
02522      * Receive G^Y mod P, premaster = (G^Y)^X mod P
02523      */
02524     if( *p + 2 > end )
02525     {
02526         SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
02527         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02528     }
02529 
02530     n = ( (*p)[0] << 8 ) | (*p)[1];
02531     *p += 2;
02532 
02533     if( *p + n > end )
02534     {
02535         SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
02536         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02537     }
02538 
02539     if( ( ret = dhm_read_public( &ssl->handshake->dhm_ctx, *p, n ) ) != 0 )
02540     {
02541         SSL_DEBUG_RET( 1, "dhm_read_public", ret );
02542         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
02543     }
02544 
02545     *p += n;
02546 
02547     SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
02548 
02549     return( ret );
02550 }
02551 #endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
02552           POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
02553 
02554 #if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) ||                           \
02555     defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
02556 static int ssl_parse_encrypted_pms( ssl_context *ssl,
02557                                     const unsigned char *p,
02558                                     const unsigned char *end,
02559                                     size_t pms_offset )
02560 {
02561     int ret;
02562     size_t len = pk_get_len( ssl_own_key( ssl ) );
02563     unsigned char *pms = ssl->handshake->premaster + pms_offset;
02564 
02565     if( ! pk_can_do( ssl_own_key( ssl ), POLARSSL_PK_RSA ) )
02566     {
02567         SSL_DEBUG_MSG( 1, ( "got no RSA private key" ) );
02568         return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
02569     }
02570 
02571     /*
02572      * Decrypt the premaster using own private RSA key
02573      */
02574 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
02575     defined(POLARSSL_SSL_PROTO_TLS1_2)
02576     if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
02577     {
02578         if( *p++ != ( ( len >> 8 ) & 0xFF ) ||
02579             *p++ != ( ( len      ) & 0xFF ) )
02580         {
02581             SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
02582             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02583         }
02584     }
02585 #endif
02586 
02587     if( p + len != end )
02588     {
02589         SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
02590         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02591     }
02592 
02593     ret = pk_decrypt( ssl_own_key( ssl ), p, len,
02594                       pms, &ssl->handshake->pmslen,
02595                       sizeof( ssl->handshake->premaster ) - pms_offset,
02596                       ssl->f_rng, ssl->p_rng );
02597 
02598     if( ret != 0 || ssl->handshake->pmslen != 48 ||
02599         pms[0] != ssl->handshake->max_major_ver ||
02600         pms[1] != ssl->handshake->max_minor_ver )
02601     {
02602         SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
02603 
02604         /*
02605          * Protection against Bleichenbacher's attack:
02606          * invalid PKCS#1 v1.5 padding must not cause
02607          * the connection to end immediately; instead,
02608          * send a bad_record_mac later in the handshake.
02609          */
02610         ssl->handshake->pmslen = 48;
02611 
02612         ret = ssl->f_rng( ssl->p_rng, pms, ssl->handshake->pmslen );
02613         if( ret != 0 )
02614             return( ret );
02615     }
02616 
02617     return( ret );
02618 }
02619 #endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED ||
02620           POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED */
02621 
02622 #if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
02623 static int ssl_parse_client_psk_identity( ssl_context *ssl, unsigned char **p,
02624                                           const unsigned char *end )
02625 {
02626     int ret = 0;
02627     size_t n;
02628 
02629     if( ssl->f_psk == NULL &&
02630         ( ssl->psk == NULL || ssl->psk_identity == NULL ||
02631           ssl->psk_identity_len == 0 || ssl->psk_len == 0 ) )
02632     {
02633         SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) );
02634         return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
02635     }
02636 
02637     /*
02638      * Receive client pre-shared key identity name
02639      */
02640     if( *p + 2 > end )
02641     {
02642         SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
02643         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02644     }
02645 
02646     n = ( (*p)[0] << 8 ) | (*p)[1];
02647     *p += 2;
02648 
02649     if( n < 1 || n > 65535 || *p + n > end )
02650     {
02651         SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
02652         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02653     }
02654 
02655     if( ssl->f_psk != NULL )
02656     {
02657         if( ( ret != ssl->f_psk( ssl->p_psk, ssl, *p, n ) ) != 0 )
02658             ret = POLARSSL_ERR_SSL_UNKNOWN_IDENTITY;
02659     }
02660 
02661     if( ret == 0 )
02662     {
02663         /* Identity is not a big secret since clients send it in the clear,
02664          * but treat it carefully anyway, just in case */
02665         if( n != ssl->psk_identity_len ||
02666             safer_memcmp( ssl->psk_identity, *p, n ) != 0 )
02667         {
02668             ret = POLARSSL_ERR_SSL_UNKNOWN_IDENTITY;
02669         }
02670     }
02671 
02672     if( ret == POLARSSL_ERR_SSL_UNKNOWN_IDENTITY )
02673     {
02674         SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n );
02675         if( ( ret = ssl_send_alert_message( ssl,
02676                               SSL_ALERT_LEVEL_FATAL,
02677                               SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY ) ) != 0 )
02678         {
02679             return( ret );
02680         }
02681 
02682         return( POLARSSL_ERR_SSL_UNKNOWN_IDENTITY );
02683     }
02684 
02685     *p += n;
02686     ret = 0;
02687 
02688     return( ret );
02689 }
02690 #endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
02691 
02692 static int ssl_parse_client_key_exchange( ssl_context *ssl )
02693 {
02694     int ret;
02695     const ssl_ciphersuite_t *ciphersuite_info;
02696 
02697     ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
02698 
02699     SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) );
02700 
02701     if( ( ret = ssl_read_record ( ssl ) ) != 0 )
02702     {
02703         SSL_DEBUG_RET( 1, "ssl_read_record", ret );
02704         return( ret );
02705     }
02706 
02707     if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
02708     {
02709         SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
02710         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02711     }
02712 
02713     if( ssl->in_msg[0] != SSL_HS_CLIENT_KEY_EXCHANGE )
02714     {
02715         SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
02716         return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02717     }
02718 
02719 #if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
02720     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
02721     {
02722         unsigned char *p = ssl->in_msg + 4;
02723         unsigned char *end = ssl->in_msg + ssl->in_hslen;
02724 
02725         if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
02726         {
02727             SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
02728             return( ret );
02729         }
02730 
02731         if( p != end )
02732         {
02733             SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
02734             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02735         }
02736 
02737         ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
02738 
02739         if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
02740                                       ssl->handshake->premaster,
02741                                      &ssl->handshake->pmslen,
02742                                       ssl->f_rng, ssl->p_rng ) ) != 0 )
02743         {
02744             SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
02745             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
02746         }
02747 
02748         SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K  );
02749     }
02750     else
02751 #endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
02752 #if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \
02753     defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) ||                   \
02754     defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||                      \
02755     defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
02756     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA ||
02757         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA ||
02758         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_RSA ||
02759         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_ECDSA )
02760     {
02761         if( ( ret = ecdh_read_public( &ssl->handshake->ecdh_ctx,
02762                         ssl->in_msg + 4, ssl->in_hslen - 4 ) ) != 0 )
02763         {
02764             SSL_DEBUG_RET( 1, "ecdh_read_public", ret );
02765             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
02766         }
02767 
02768         SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp );
02769 
02770         if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
02771                                       &ssl->handshake->pmslen,
02772                                        ssl->handshake->premaster,
02773                                        POLARSSL_MPI_MAX_SIZE,
02774                                        ssl->f_rng, ssl->p_rng ) ) != 0 )
02775         {
02776             SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
02777             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
02778         }
02779 
02780         SSL_DEBUG_MPI( 3, "ECDH: z  ", &ssl->handshake->ecdh_ctx.z );
02781     }
02782     else
02783 #endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
02784           POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
02785           POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
02786           POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
02787 #if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
02788     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
02789     {
02790         unsigned char *p = ssl->in_msg + 4;
02791         unsigned char *end = ssl->in_msg + ssl->in_hslen;
02792 
02793         if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
02794         {
02795             SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
02796             return( ret );
02797         }
02798 
02799         if( p != end )
02800         {
02801             SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
02802             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02803         }
02804 
02805         if( ( ret = ssl_psk_derive_premaster( ssl,
02806                         ciphersuite_info->key_exchange ) ) != 0 )
02807         {
02808             SSL_DEBUG_RET( 1, "ssl_psk_derive_premaster", ret );
02809             return( ret );
02810         }
02811     }
02812     else
02813 #endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
02814 #if defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
02815     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK )
02816     {
02817         unsigned char *p = ssl->in_msg + 4;
02818         unsigned char *end = ssl->in_msg + ssl->in_hslen;
02819 
02820         if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
02821         {
02822             SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
02823             return( ret );
02824         }
02825 
02826         if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 2 ) ) != 0 )
02827         {
02828             SSL_DEBUG_RET( 1, ( "ssl_parse_encrypted_pms" ), ret );
02829             return( ret );
02830         }
02831 
02832         if( ( ret = ssl_psk_derive_premaster( ssl,
02833                         ciphersuite_info->key_exchange ) ) != 0 )
02834         {
02835             SSL_DEBUG_RET( 1, "ssl_psk_derive_premaster", ret );
02836             return( ret );
02837         }
02838     }
02839     else
02840 #endif /* POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED */
02841 #if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
02842     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
02843     {
02844         unsigned char *p = ssl->in_msg + 4;
02845         unsigned char *end = ssl->in_msg + ssl->in_hslen;
02846 
02847         if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
02848         {
02849             SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
02850             return( ret );
02851         }
02852         if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
02853         {
02854             SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
02855             return( ret );
02856         }
02857 
02858         if( p != end )
02859         {
02860             SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) );
02861             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
02862         }
02863 
02864         if( ( ret = ssl_psk_derive_premaster( ssl,
02865                         ciphersuite_info->key_exchange ) ) != 0 )
02866         {
02867             SSL_DEBUG_RET( 1, "ssl_psk_derive_premaster", ret );
02868             return( ret );
02869         }
02870     }
02871     else
02872 #endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
02873 #if defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
02874     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
02875     {
02876         unsigned char *p = ssl->in_msg + 4;
02877         unsigned char *end = ssl->in_msg + ssl->in_hslen;
02878 
02879         if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
02880         {
02881             SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
02882             return( ret );
02883         }
02884 
02885         if( ( ret = ecdh_read_public( &ssl->handshake->ecdh_ctx,
02886                                        p, end - p ) ) != 0 )
02887         {
02888             SSL_DEBUG_RET( 1, "ecdh_read_public", ret );
02889             return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
02890         }
02891 
02892         SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp );
02893 
02894         if( ( ret = ssl_psk_derive_premaster( ssl,
02895                         ciphersuite_info->key_exchange ) ) != 0 )
02896         {
02897             SSL_DEBUG_RET( 1, "ssl_psk_derive_premaster", ret );
02898             return( ret );
02899         }
02900     }
02901     else
02902 #endif /* POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
02903 #if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
02904     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
02905     {
02906         if( ( ret = ssl_parse_encrypted_pms( ssl,
02907                                              ssl->in_msg + 4,
02908                                              ssl->in_msg + ssl->in_hslen,
02909                                              0 ) ) != 0 )
02910         {
02911             SSL_DEBUG_RET( 1, ( "ssl_parse_parse_encrypted_pms_secret" ), ret );
02912             return( ret );
02913         }
02914     }
02915     else
02916 #endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
02917     {
02918         SSL_DEBUG_MSG( 1, ( "should never happen" ) );
02919         return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
02920     }
02921 
02922     if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
02923     {
02924         SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
02925         return( ret );
02926     }
02927 
02928     ssl->state++;
02929 
02930     SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) );
02931 
02932     return( 0 );
02933 }
02934 
02935 #if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)       && \
02936     !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)   && \
02937     !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
02938     !defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
02939 static int ssl_parse_certificate_verify( ssl_context *ssl )
02940 {
02941     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
02942     const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
02943 
02944     SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
02945 
02946     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
02947         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
02948         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK ||
02949         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
02950     {
02951         SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
02952         ssl->state++;
02953         return( 0 );
02954     }
02955 
02956     SSL_DEBUG_MSG( 1, ( "should not happen" ) );
02957     return( ret );
02958 }
02959 #else
02960 static int ssl_parse_certificate_verify( ssl_context *ssl )
02961 {
02962     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
02963     size_t sa_len, sig_len;
02964     unsigned char hash[48];
02965     unsigned char *hash_start = hash;
02966     size_t hashlen;
02967 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
02968     pk_type_t pk_alg;
02969 #endif
02970     md_type_t md_alg;
02971     const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
02972 
02973     SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
02974 
02975     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
02976         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
02977         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK ||
02978         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
02979     {
02980         SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
02981         ssl->state++;
02982         return( 0 );
02983     }
02984 
02985     if( ssl->session_negotiate->peer_cert == NULL )
02986     {
02987         SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
02988         ssl->state++;
02989         return( 0 );
02990     }
02991 
02992     ssl->handshake->calc_verify( ssl, hash );
02993 
02994     if( ( ret = ssl_read_record ( ssl ) ) != 0 )
02995     {
02996         SSL_DEBUG_RET( 1, "ssl_read_record", ret );
02997         return( ret );
02998     }
02999 
03000     ssl->state++;
03001 
03002     if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
03003     {
03004         SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
03005         return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
03006     }
03007 
03008     if( ssl->in_msg[0] != SSL_HS_CERTIFICATE_VERIFY )
03009     {
03010         SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
03011         return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
03012     }
03013 
03014     /*
03015      *     0  .   0   handshake type
03016      *     1  .   3   handshake length
03017      *     4  .   5   sig alg (TLS 1.2 only)
03018      *    4+n .  5+n  signature length (n = sa_len)
03019      *    6+n . 6+n+m signature (m = sig_len)
03020      */
03021 
03022 #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
03023     defined(POLARSSL_SSL_PROTO_TLS1_1)
03024     if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
03025     {
03026         sa_len = 0;
03027 
03028         md_alg = POLARSSL_MD_NONE;
03029         hashlen = 36;
03030 
03031         /* For ECDSA, use SHA-1, not MD-5 + SHA-1 */
03032         if( pk_can_do( &ssl->session_negotiate->peer_cert->pk,
03033                         POLARSSL_PK_ECDSA ) )
03034         {
03035             hash_start += 16;
03036             hashlen -= 16;
03037             md_alg = POLARSSL_MD_SHA1;
03038         }
03039     }
03040     else
03041 #endif /* POLARSSL_SSL_PROTO_SSL3 || POLARSSL_SSL_PROTO_TLS1 ||
03042           POLARSSL_SSL_PROTO_TLS1_1 */
03043 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
03044     if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
03045     {
03046         sa_len = 2;
03047 
03048         /*
03049          * Hash
03050          */
03051         if( ssl->in_msg[4] != ssl->handshake->verify_sig_alg )
03052         {
03053             SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg"
03054                                 " for verify message" ) );
03055             return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
03056         }
03057 
03058         md_alg = ssl_md_alg_from_hash( ssl->handshake->verify_sig_alg );
03059 
03060         /* Info from md_alg will be used instead */
03061         hashlen = 0;
03062 
03063         /*
03064          * Signature
03065          */
03066         if( ( pk_alg = ssl_pk_alg_from_sig( ssl->in_msg[5] ) )
03067                         == POLARSSL_PK_NONE )
03068         {
03069             SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg"
03070                                 " for verify message" ) );
03071             return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
03072         }
03073 
03074         /*
03075          * Check the certificate's key type matches the signature alg
03076          */
03077         if( ! pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) )
03078         {
03079             SSL_DEBUG_MSG( 1, ( "sig_alg doesn't match cert key" ) );
03080             return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
03081         }
03082     }
03083     else
03084 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
03085     {
03086         SSL_DEBUG_MSG( 1, ( "should never happen" ) );
03087         return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
03088     }
03089 
03090     sig_len = ( ssl->in_msg[4 + sa_len] << 8 ) | ssl->in_msg[5 + sa_len];
03091 
03092     if( sa_len + sig_len + 6 != ssl->in_hslen )
03093     {
03094         SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
03095         return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
03096     }
03097 
03098     if( ( ret = pk_verify( &ssl->session_negotiate->peer_cert->pk,
03099                            md_alg, hash_start, hashlen,
03100                            ssl->in_msg + 6 + sa_len, sig_len ) ) != 0 )
03101     {
03102         SSL_DEBUG_RET( 1, "pk_verify", ret );
03103         return( ret );
03104     }
03105 
03106     SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
03107 
03108     return( ret );
03109 }
03110 #endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
03111           !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
03112           !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
03113 
03114 #if defined(POLARSSL_SSL_SESSION_TICKETS)
03115 static int ssl_write_new_session_ticket( ssl_context *ssl )
03116 {
03117     int ret;
03118     size_t tlen;
03119     uint32_t lifetime = (uint32_t) ssl->ticket_lifetime;
03120 
03121     SSL_DEBUG_MSG( 2, ( "=> write new session ticket" ) );
03122 
03123     ssl->out_msgtype = SSL_MSG_HANDSHAKE;
03124     ssl->out_msg[0]  = SSL_HS_NEW_SESSION_TICKET;
03125 
03126     /*
03127      * struct {
03128      *     uint32 ticket_lifetime_hint;
03129      *     opaque ticket<0..2^16-1>;
03130      * } NewSessionTicket;
03131      *
03132      * 4  .  7   ticket_lifetime_hint (0 = unspecified)
03133      * 8  .  9   ticket_len (n)
03134      * 10 .  9+n ticket content
03135      */
03136 
03137     ssl->out_msg[4] = ( lifetime >> 24 ) & 0xFF;
03138     ssl->out_msg[5] = ( lifetime >> 16 ) & 0xFF;
03139     ssl->out_msg[6] = ( lifetime >>  8 ) & 0xFF;
03140     ssl->out_msg[7] = ( lifetime       ) & 0xFF;
03141 
03142     if( ( ret = ssl_write_ticket( ssl, &tlen ) ) != 0 )
03143     {
03144         SSL_DEBUG_RET( 1, "ssl_write_ticket", ret );
03145         tlen = 0;
03146     }
03147 
03148     ssl->out_msg[8] = (unsigned char)( ( tlen >> 8 ) & 0xFF );
03149     ssl->out_msg[9] = (unsigned char)( ( tlen      ) & 0xFF );
03150 
03151     ssl->out_msglen = 10 + tlen;
03152 
03153     /*
03154      * Morally equivalent to updating ssl->state, but NewSessionTicket and
03155      * ChangeCipherSpec share the same state.
03156      */
03157     ssl->handshake->new_session_ticket = 0;
03158 
03159     if( ( ret = ssl_write_record( ssl ) ) != 0 )
03160     {
03161         SSL_DEBUG_RET( 1, "ssl_write_record", ret );
03162         return( ret );
03163     }
03164 
03165     SSL_DEBUG_MSG( 2, ( "<= write new session ticket" ) );
03166 
03167     return( 0 );
03168 }
03169 #endif /* POLARSSL_SSL_SESSION_TICKETS */
03170 
03171 /*
03172  * SSL handshake -- server side -- single step
03173  */
03174 int ssl_handshake_server_step( ssl_context *ssl )
03175 {
03176     int ret = 0;
03177 
03178     if( ssl->state == SSL_HANDSHAKE_OVER )
03179         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
03180 
03181     SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) );
03182 
03183     if( ( ret = ssl_flush_output( ssl ) ) != 0 )
03184         return( ret );
03185 
03186     switch( ssl->state )
03187     {
03188         case SSL_HELLO_REQUEST:
03189             ssl->state = SSL_CLIENT_HELLO;
03190             break;
03191 
03192         /*
03193          *  <==   ClientHello
03194          */
03195         case SSL_CLIENT_HELLO:
03196             ret = ssl_parse_client_hello( ssl );
03197             break;
03198 
03199         /*
03200          *  ==>   ServerHello
03201          *        Certificate
03202          *      ( ServerKeyExchange  )
03203          *      ( CertificateRequest )
03204          *        ServerHelloDone
03205          */
03206         case SSL_SERVER_HELLO:
03207             ret = ssl_write_server_hello( ssl );
03208             break;
03209 
03210         case SSL_SERVER_CERTIFICATE:
03211             ret = ssl_write_certificate( ssl );
03212             break;
03213 
03214         case SSL_SERVER_KEY_EXCHANGE:
03215             ret = ssl_write_server_key_exchange( ssl );
03216             break;
03217 
03218         case SSL_CERTIFICATE_REQUEST:
03219             ret = ssl_write_certificate_request( ssl );
03220             break;
03221 
03222         case SSL_SERVER_HELLO_DONE:
03223             ret = ssl_write_server_hello_done( ssl );
03224             break;
03225 
03226         /*
03227          *  <== ( Certificate/Alert  )
03228          *        ClientKeyExchange
03229          *      ( CertificateVerify  )
03230          *        ChangeCipherSpec
03231          *        Finished
03232          */
03233         case SSL_CLIENT_CERTIFICATE:
03234             ret = ssl_parse_certificate( ssl );
03235             break;
03236 
03237         case SSL_CLIENT_KEY_EXCHANGE:
03238             ret = ssl_parse_client_key_exchange( ssl );
03239             break;
03240 
03241         case SSL_CERTIFICATE_VERIFY:
03242             ret = ssl_parse_certificate_verify( ssl );
03243             break;
03244 
03245         case SSL_CLIENT_CHANGE_CIPHER_SPEC:
03246             ret = ssl_parse_change_cipher_spec( ssl );
03247             break;
03248 
03249         case SSL_CLIENT_FINISHED:
03250             ret = ssl_parse_finished( ssl );
03251             break;
03252 
03253         /*
03254          *  ==> ( NewSessionTicket )
03255          *        ChangeCipherSpec
03256          *        Finished
03257          */
03258         case SSL_SERVER_CHANGE_CIPHER_SPEC:
03259 #if defined(POLARSSL_SSL_SESSION_TICKETS)
03260             if( ssl->handshake->new_session_ticket != 0 )
03261                 ret = ssl_write_new_session_ticket( ssl );
03262             else
03263 #endif
03264                 ret = ssl_write_change_cipher_spec( ssl );
03265             break;
03266 
03267         case SSL_SERVER_FINISHED:
03268             ret = ssl_write_finished( ssl );
03269             break;
03270 
03271         case SSL_FLUSH_BUFFERS:
03272             SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
03273             ssl->state = SSL_HANDSHAKE_WRAPUP;
03274             break;
03275 
03276         case SSL_HANDSHAKE_WRAPUP:
03277             ssl_handshake_wrapup( ssl );
03278             break;
03279 
03280         default:
03281             SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
03282             return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
03283     }
03284 
03285     return( ret );
03286 }
03287 #endif /* POLARSSL_SSL_SRV_C */
03288 
03289