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_tls.c Source File

ssl_tls.c

00001 /*
00002  *  SSLv3/TLSv1 shared 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  *  The SSL 3.0 specification was drafted by Netscape in 1996,
00027  *  and became an IETF standard in 1999.
00028  *
00029  *  http://wp.netscape.com/eng/ssl3/
00030  *  http://www.ietf.org/rfc/rfc2246.txt
00031  *  http://www.ietf.org/rfc/rfc4346.txt
00032  */
00033 
00034 #if !defined(POLARSSL_CONFIG_FILE)
00035 #include "polarssl/config.h"
00036 #else
00037 #include POLARSSL_CONFIG_FILE
00038 #endif
00039 
00040 #if defined(POLARSSL_SSL_TLS_C)
00041 
00042 #include "polarssl/debug.h"
00043 #include "polarssl/ssl.h"
00044 
00045 #if defined(POLARSSL_X509_CRT_PARSE_C) && \
00046     defined(POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE)
00047 #include "polarssl/oid.h"
00048 #endif
00049 
00050 #if defined(POLARSSL_PLATFORM_C)
00051 #include "polarssl/platform.h"
00052 #else
00053 #define polarssl_malloc     malloc
00054 #define polarssl_free       free
00055 #endif
00056 
00057 #include <stdlib.h>
00058 
00059 #if defined(_MSC_VER) && !defined strcasecmp && !defined(EFIX64) && \
00060     !defined(EFI32)
00061 #define strcasecmp _stricmp
00062 #endif
00063 
00064 #if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
00065 /*
00066  * Convert max_fragment_length codes to length.
00067  * RFC 6066 says:
00068  *    enum{
00069  *        2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
00070  *    } MaxFragmentLength;
00071  * and we add 0 -> extension unused
00072  */
00073 static unsigned int mfl_code_to_length[SSL_MAX_FRAG_LEN_INVALID] =
00074 {
00075     SSL_MAX_CONTENT_LEN,    /* SSL_MAX_FRAG_LEN_NONE */
00076     512,                    /* SSL_MAX_FRAG_LEN_512  */
00077     1024,                   /* SSL_MAX_FRAG_LEN_1024 */
00078     2048,                   /* SSL_MAX_FRAG_LEN_2048 */
00079     4096,                   /* SSL_MAX_FRAG_LEN_4096 */
00080 };
00081 #endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
00082 
00083 static int ssl_session_copy( ssl_session *dst, const ssl_session *src )
00084 {
00085     ssl_session_free( dst );
00086     memcpy( dst, src, sizeof( ssl_session ) );
00087 
00088 #if defined(POLARSSL_X509_CRT_PARSE_C)
00089     if( src->peer_cert != NULL )
00090     {
00091         int ret;
00092 
00093         dst->peer_cert = (x509_crt *) polarssl_malloc( sizeof(x509_crt) );
00094         if( dst->peer_cert == NULL )
00095             return( POLARSSL_ERR_SSL_MALLOC_FAILED );
00096 
00097         x509_crt_init( dst->peer_cert );
00098 
00099         if( ( ret = x509_crt_parse( dst->peer_cert, src->peer_cert->raw.p,
00100                                     src->peer_cert->raw.len ) != 0 ) )
00101         {
00102             polarssl_free( dst->peer_cert );
00103             dst->peer_cert = NULL;
00104             return( ret );
00105         }
00106     }
00107 #endif /* POLARSSL_X509_CRT_PARSE_C */
00108 
00109 #if defined(POLARSSL_SSL_SESSION_TICKETS)
00110     if( src->ticket != NULL )
00111     {
00112         dst->ticket = (unsigned char *) polarssl_malloc( src->ticket_len );
00113         if( dst->ticket == NULL )
00114             return( POLARSSL_ERR_SSL_MALLOC_FAILED );
00115 
00116         memcpy( dst->ticket, src->ticket, src->ticket_len );
00117     }
00118 #endif /* POLARSSL_SSL_SESSION_TICKETS */
00119 
00120     return( 0 );
00121 }
00122 
00123 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
00124 int (*ssl_hw_record_init)(ssl_context *ssl,
00125                      const unsigned char *key_enc, const unsigned char *key_dec,
00126                      size_t keylen,
00127                      const unsigned char *iv_enc,  const unsigned char *iv_dec,
00128                      size_t ivlen,
00129                      const unsigned char *mac_enc, const unsigned char *mac_dec,
00130                      size_t maclen) = NULL;
00131 int (*ssl_hw_record_activate)(ssl_context *ssl, int direction) = NULL;
00132 int (*ssl_hw_record_reset)(ssl_context *ssl) = NULL;
00133 int (*ssl_hw_record_write)(ssl_context *ssl) = NULL;
00134 int (*ssl_hw_record_read)(ssl_context *ssl) = NULL;
00135 int (*ssl_hw_record_finish)(ssl_context *ssl) = NULL;
00136 #endif /* POLARSSL_SSL_HW_RECORD_ACCEL */
00137 
00138 /*
00139  * Key material generation
00140  */
00141 #if defined(POLARSSL_SSL_PROTO_SSL3)
00142 static int ssl3_prf( const unsigned char *secret, size_t slen,
00143                      const char *label,
00144                      const unsigned char *random, size_t rlen,
00145                      unsigned char *dstbuf, size_t dlen )
00146 {
00147     size_t i;
00148     md5_context md5;
00149     sha1_context sha1;
00150     unsigned char padding[16];
00151     unsigned char sha1sum[20];
00152     ((void)label);
00153 
00154     /*
00155      *  SSLv3:
00156      *    block =
00157      *      MD5( secret + SHA1( 'A'    + secret + random ) ) +
00158      *      MD5( secret + SHA1( 'BB'   + secret + random ) ) +
00159      *      MD5( secret + SHA1( 'CCC'  + secret + random ) ) +
00160      *      ...
00161      */
00162     for( i = 0; i < dlen / 16; i++ )
00163     {
00164         memset( padding, (unsigned char) ('A' + i), 1 + i );
00165 
00166         sha1_starts( &sha1 );
00167         sha1_update( &sha1, padding, 1 + i );
00168         sha1_update( &sha1, secret, slen );
00169         sha1_update( &sha1, random, rlen );
00170         sha1_finish( &sha1, sha1sum );
00171 
00172         md5_starts( &md5 );
00173         md5_update( &md5, secret, slen );
00174         md5_update( &md5, sha1sum, 20 );
00175         md5_finish( &md5, dstbuf + i * 16 );
00176     }
00177 
00178     memset( &md5,  0, sizeof( md5  ) );
00179     memset( &sha1, 0, sizeof( sha1 ) );
00180 
00181     memset( padding, 0, sizeof( padding ) );
00182     memset( sha1sum, 0, sizeof( sha1sum ) );
00183 
00184     return( 0 );
00185 }
00186 #endif /* POLARSSL_SSL_PROTO_SSL3 */
00187 
00188 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
00189 static int tls1_prf( const unsigned char *secret, size_t slen,
00190                      const char *label,
00191                      const unsigned char *random, size_t rlen,
00192                      unsigned char *dstbuf, size_t dlen )
00193 {
00194     size_t nb, hs;
00195     size_t i, j, k;
00196     const unsigned char *S1, *S2;
00197     unsigned char tmp[128];
00198     unsigned char h_i[20];
00199 
00200     if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
00201         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00202 
00203     hs = ( slen + 1 ) / 2;
00204     S1 = secret;
00205     S2 = secret + slen - hs;
00206 
00207     nb = strlen( label );
00208     memcpy( tmp + 20, label, nb );
00209     memcpy( tmp + 20 + nb, random, rlen );
00210     nb += rlen;
00211 
00212     /*
00213      * First compute P_md5(secret,label+random)[0..dlen]
00214      */
00215     md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
00216 
00217     for( i = 0; i < dlen; i += 16 )
00218     {
00219         md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
00220         md5_hmac( S1, hs, 4 + tmp, 16,  4 + tmp );
00221 
00222         k = ( i + 16 > dlen ) ? dlen % 16 : 16;
00223 
00224         for( j = 0; j < k; j++ )
00225             dstbuf[i + j]  = h_i[j];
00226     }
00227 
00228     /*
00229      * XOR out with P_sha1(secret,label+random)[0..dlen]
00230      */
00231     sha1_hmac( S2, hs, tmp + 20, nb, tmp );
00232 
00233     for( i = 0; i < dlen; i += 20 )
00234     {
00235         sha1_hmac( S2, hs, tmp, 20 + nb, h_i );
00236         sha1_hmac( S2, hs, tmp, 20,      tmp );
00237 
00238         k = ( i + 20 > dlen ) ? dlen % 20 : 20;
00239 
00240         for( j = 0; j < k; j++ )
00241             dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
00242     }
00243 
00244     memset( tmp, 0, sizeof( tmp ) );
00245     memset( h_i, 0, sizeof( h_i ) );
00246 
00247     return( 0 );
00248 }
00249 #endif /* POLARSSL_SSL_PROTO_TLS1) || POLARSSL_SSL_PROTO_TLS1_1 */
00250 
00251 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
00252 #if defined(POLARSSL_SHA256_C)
00253 static int tls_prf_sha256( const unsigned char *secret, size_t slen,
00254                            const char *label,
00255                            const unsigned char *random, size_t rlen,
00256                            unsigned char *dstbuf, size_t dlen )
00257 {
00258     size_t nb;
00259     size_t i, j, k;
00260     unsigned char tmp[128];
00261     unsigned char h_i[32];
00262 
00263     if( sizeof( tmp ) < 32 + strlen( label ) + rlen )
00264         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00265 
00266     nb = strlen( label );
00267     memcpy( tmp + 32, label, nb );
00268     memcpy( tmp + 32 + nb, random, rlen );
00269     nb += rlen;
00270 
00271     /*
00272      * Compute P_<hash>(secret, label + random)[0..dlen]
00273      */
00274     sha256_hmac( secret, slen, tmp + 32, nb, tmp, 0 );
00275 
00276     for( i = 0; i < dlen; i += 32 )
00277     {
00278         sha256_hmac( secret, slen, tmp, 32 + nb, h_i, 0 );
00279         sha256_hmac( secret, slen, tmp, 32,      tmp, 0 );
00280 
00281         k = ( i + 32 > dlen ) ? dlen % 32 : 32;
00282 
00283         for( j = 0; j < k; j++ )
00284             dstbuf[i + j]  = h_i[j];
00285     }
00286 
00287     memset( tmp, 0, sizeof( tmp ) );
00288     memset( h_i, 0, sizeof( h_i ) );
00289 
00290     return( 0 );
00291 }
00292 #endif /* POLARSSL_SHA256_C */
00293 
00294 #if defined(POLARSSL_SHA512_C)
00295 static int tls_prf_sha384( const unsigned char *secret, size_t slen,
00296                            const char *label,
00297                            const unsigned char *random, size_t rlen,
00298                            unsigned char *dstbuf, size_t dlen )
00299 {
00300     size_t nb;
00301     size_t i, j, k;
00302     unsigned char tmp[128];
00303     unsigned char h_i[48];
00304 
00305     if( sizeof( tmp ) < 48 + strlen( label ) + rlen )
00306         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00307 
00308     nb = strlen( label );
00309     memcpy( tmp + 48, label, nb );
00310     memcpy( tmp + 48 + nb, random, rlen );
00311     nb += rlen;
00312 
00313     /*
00314      * Compute P_<hash>(secret, label + random)[0..dlen]
00315      */
00316     sha512_hmac( secret, slen, tmp + 48, nb, tmp, 1 );
00317 
00318     for( i = 0; i < dlen; i += 48 )
00319     {
00320         sha512_hmac( secret, slen, tmp, 48 + nb, h_i, 1 );
00321         sha512_hmac( secret, slen, tmp, 48,      tmp, 1 );
00322 
00323         k = ( i + 48 > dlen ) ? dlen % 48 : 48;
00324 
00325         for( j = 0; j < k; j++ )
00326             dstbuf[i + j]  = h_i[j];
00327     }
00328 
00329     memset( tmp, 0, sizeof( tmp ) );
00330     memset( h_i, 0, sizeof( h_i ) );
00331 
00332     return( 0 );
00333 }
00334 #endif /* POLARSSL_SHA512_C */
00335 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
00336 
00337 static void ssl_update_checksum_start(ssl_context *, const unsigned char *, size_t);
00338 
00339 #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
00340     defined(POLARSSL_SSL_PROTO_TLS1_1)
00341 static void ssl_update_checksum_md5sha1(ssl_context *, const unsigned char *, size_t);
00342 #endif
00343 
00344 #if defined(POLARSSL_SSL_PROTO_SSL3)
00345 static void ssl_calc_verify_ssl(ssl_context *,unsigned char *);
00346 static void ssl_calc_finished_ssl(ssl_context *,unsigned char *,int);
00347 #endif
00348 
00349 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
00350 static void ssl_calc_verify_tls(ssl_context *,unsigned char *);
00351 static void ssl_calc_finished_tls(ssl_context *,unsigned char *,int);
00352 #endif
00353 
00354 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
00355 #if defined(POLARSSL_SHA256_C)
00356 static void ssl_update_checksum_sha256(ssl_context *, const unsigned char *, size_t);
00357 static void ssl_calc_verify_tls_sha256(ssl_context *,unsigned char *);
00358 static void ssl_calc_finished_tls_sha256(ssl_context *,unsigned char *,int);
00359 #endif
00360 
00361 #if defined(POLARSSL_SHA512_C)
00362 static void ssl_update_checksum_sha384(ssl_context *, const unsigned char *, size_t);
00363 static void ssl_calc_verify_tls_sha384(ssl_context *,unsigned char *);
00364 static void ssl_calc_finished_tls_sha384(ssl_context *,unsigned char *,int);
00365 #endif
00366 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
00367 
00368 int ssl_derive_keys( ssl_context *ssl )
00369 {
00370     int ret = 0;
00371     unsigned char tmp[64];
00372     unsigned char keyblk[256];
00373     unsigned char *key1;
00374     unsigned char *key2;
00375     unsigned char *mac_enc;
00376     unsigned char *mac_dec;
00377     size_t iv_copy_len;
00378     const cipher_info_t *cipher_info;
00379     const md_info_t *md_info;
00380 
00381     ssl_session *session = ssl->session_negotiate;
00382     ssl_transform *transform = ssl->transform_negotiate;
00383     ssl_handshake_params *handshake = ssl->handshake;
00384 
00385     SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
00386 
00387     cipher_info = cipher_info_from_type( transform->ciphersuite_info->cipher );
00388     if( cipher_info == NULL )
00389     {
00390         SSL_DEBUG_MSG( 1, ( "cipher info for %d not found",
00391                             transform->ciphersuite_info->cipher ) );
00392         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00393     }
00394 
00395     md_info = md_info_from_type( transform->ciphersuite_info->mac );
00396     if( md_info == NULL )
00397     {
00398         SSL_DEBUG_MSG( 1, ( "md info for %d not found",
00399                             transform->ciphersuite_info->mac ) );
00400         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00401     }
00402 
00403     /*
00404      * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
00405      */
00406 #if defined(POLARSSL_SSL_PROTO_SSL3)
00407     if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
00408     {
00409         handshake->tls_prf = ssl3_prf;
00410         handshake->calc_verify = ssl_calc_verify_ssl;
00411         handshake->calc_finished = ssl_calc_finished_ssl;
00412     }
00413     else
00414 #endif
00415 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
00416     if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
00417     {
00418         handshake->tls_prf = tls1_prf;
00419         handshake->calc_verify = ssl_calc_verify_tls;
00420         handshake->calc_finished = ssl_calc_finished_tls;
00421     }
00422     else
00423 #endif
00424 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
00425 #if defined(POLARSSL_SHA512_C)
00426     if( ssl->minor_ver == SSL_MINOR_VERSION_3 &&
00427         transform->ciphersuite_info->mac == POLARSSL_MD_SHA384 )
00428     {
00429         handshake->tls_prf = tls_prf_sha384;
00430         handshake->calc_verify = ssl_calc_verify_tls_sha384;
00431         handshake->calc_finished = ssl_calc_finished_tls_sha384;
00432     }
00433     else
00434 #endif
00435 #if defined(POLARSSL_SHA256_C)
00436     if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
00437     {
00438         handshake->tls_prf = tls_prf_sha256;
00439         handshake->calc_verify = ssl_calc_verify_tls_sha256;
00440         handshake->calc_finished = ssl_calc_finished_tls_sha256;
00441     }
00442     else
00443 #endif
00444 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
00445     {
00446         SSL_DEBUG_MSG( 1, ( "should never happen" ) );
00447         return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
00448     }
00449 
00450     /*
00451      * SSLv3:
00452      *   master =
00453      *     MD5( premaster + SHA1( 'A'   + premaster + randbytes ) ) +
00454      *     MD5( premaster + SHA1( 'BB'  + premaster + randbytes ) ) +
00455      *     MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
00456      *
00457      * TLSv1+:
00458      *   master = PRF( premaster, "master secret", randbytes )[0..47]
00459      */
00460     if( handshake->resume == 0 )
00461     {
00462         SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
00463                        handshake->pmslen );
00464 
00465         handshake->tls_prf( handshake->premaster, handshake->pmslen,
00466                             "master secret",
00467                             handshake->randbytes, 64, session->master, 48 );
00468 
00469         memset( handshake->premaster, 0, sizeof( handshake->premaster ) );
00470     }
00471     else
00472         SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
00473 
00474     /*
00475      * Swap the client and server random values.
00476      */
00477     memcpy( tmp, handshake->randbytes, 64 );
00478     memcpy( handshake->randbytes, tmp + 32, 32 );
00479     memcpy( handshake->randbytes + 32, tmp, 32 );
00480     memset( tmp, 0, sizeof( tmp ) );
00481 
00482     /*
00483      *  SSLv3:
00484      *    key block =
00485      *      MD5( master + SHA1( 'A'    + master + randbytes ) ) +
00486      *      MD5( master + SHA1( 'BB'   + master + randbytes ) ) +
00487      *      MD5( master + SHA1( 'CCC'  + master + randbytes ) ) +
00488      *      MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
00489      *      ...
00490      *
00491      *  TLSv1:
00492      *    key block = PRF( master, "key expansion", randbytes )
00493      */
00494     handshake->tls_prf( session->master, 48, "key expansion",
00495                         handshake->randbytes, 64, keyblk, 256 );
00496 
00497     SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
00498                    ssl_get_ciphersuite_name( session->ciphersuite ) ) );
00499     SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
00500     SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
00501     SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
00502 
00503     memset( handshake->randbytes, 0, sizeof( handshake->randbytes ) );
00504 
00505     /*
00506      * Determine the appropriate key, IV and MAC length.
00507      */
00508 
00509     if( cipher_info->mode == POLARSSL_MODE_GCM )
00510     {
00511         transform->keylen = cipher_info->key_length;
00512         transform->keylen /= 8;
00513         transform->minlen = 1;
00514         transform->ivlen = 12;
00515         transform->fixed_ivlen = 4;
00516         transform->maclen = 0;
00517     }
00518     else
00519     {
00520         if( md_info->type != POLARSSL_MD_NONE )
00521         {
00522             int ret;
00523 
00524             if( ( ret = md_init_ctx( &transform->md_ctx_enc, md_info ) ) != 0 )
00525             {
00526                 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
00527                 return( ret );
00528             }
00529 
00530             if( ( ret = md_init_ctx( &transform->md_ctx_dec, md_info ) ) != 0 )
00531             {
00532                 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
00533                 return( ret );
00534             }
00535 
00536             transform->maclen = md_get_size( md_info );
00537 
00538 #if defined(POLARSSL_SSL_TRUNCATED_HMAC)
00539             /*
00540              * If HMAC is to be truncated, we shall keep the leftmost bytes,
00541              * (rfc 6066 page 13 or rfc 2104 section 4),
00542              * so we only need to adjust the length here.
00543              */
00544             if( session->trunc_hmac == SSL_TRUNC_HMAC_ENABLED )
00545                 transform->maclen = SSL_TRUNCATED_HMAC_LEN;
00546 #endif /* POLARSSL_SSL_TRUNCATED_HMAC */
00547         }
00548 
00549         transform->keylen = cipher_info->key_length;
00550         transform->keylen /= 8;
00551         transform->ivlen = cipher_info->iv_size;
00552 
00553         transform->minlen = transform->keylen;
00554         if( transform->minlen < transform->maclen )
00555         {
00556             if( cipher_info->mode == POLARSSL_MODE_STREAM )
00557                 transform->minlen = transform->maclen;
00558             else
00559                 transform->minlen += transform->keylen;
00560         }
00561     }
00562 
00563     SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
00564                    transform->keylen, transform->minlen, transform->ivlen,
00565                    transform->maclen ) );
00566 
00567     /*
00568      * Finally setup the cipher contexts, IVs and MAC secrets.
00569      */
00570     if( ssl->endpoint == SSL_IS_CLIENT )
00571     {
00572         key1 = keyblk + transform->maclen * 2;
00573         key2 = keyblk + transform->maclen * 2 + transform->keylen;
00574 
00575         mac_enc = keyblk;
00576         mac_dec = keyblk + transform->maclen;
00577 
00578         /*
00579          * This is not used in TLS v1.1.
00580          */
00581         iv_copy_len = ( transform->fixed_ivlen ) ?
00582                             transform->fixed_ivlen : transform->ivlen;
00583         memcpy( transform->iv_enc, key2 + transform->keylen,  iv_copy_len );
00584         memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
00585                 iv_copy_len );
00586     }
00587     else
00588     {
00589         key1 = keyblk + transform->maclen * 2 + transform->keylen;
00590         key2 = keyblk + transform->maclen * 2;
00591 
00592         mac_enc = keyblk + transform->maclen;
00593         mac_dec = keyblk;
00594 
00595         /*
00596          * This is not used in TLS v1.1.
00597          */
00598         iv_copy_len = ( transform->fixed_ivlen ) ?
00599                             transform->fixed_ivlen : transform->ivlen;
00600         memcpy( transform->iv_dec, key1 + transform->keylen,  iv_copy_len );
00601         memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
00602                 iv_copy_len );
00603     }
00604 
00605 #if defined(POLARSSL_SSL_PROTO_SSL3)
00606     if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
00607     {
00608         if( transform->maclen > sizeof transform->mac_enc )
00609         {
00610             SSL_DEBUG_MSG( 1, ( "should never happen" ) );
00611             return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
00612         }
00613 
00614         memcpy( transform->mac_enc, mac_enc, transform->maclen );
00615         memcpy( transform->mac_dec, mac_dec, transform->maclen );
00616     }
00617     else
00618 #endif /* POLARSSL_SSL_PROTO_SSL3 */
00619 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
00620     defined(POLARSSL_SSL_PROTO_TLS1_2)
00621     if( ssl->minor_ver >= SSL_MINOR_VERSION_1 )
00622     {
00623         md_hmac_starts( &transform->md_ctx_enc, mac_enc, transform->maclen );
00624         md_hmac_starts( &transform->md_ctx_dec, mac_dec, transform->maclen );
00625     }
00626     else
00627 #endif
00628     {
00629         SSL_DEBUG_MSG( 1, ( "should never happen" ) );
00630         return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
00631     }
00632 
00633 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
00634     if( ssl_hw_record_init != NULL)
00635     {
00636         int ret = 0;
00637 
00638         SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) );
00639 
00640         if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->keylen,
00641                                         transform->iv_enc, transform->iv_dec,
00642                                         iv_copy_len,
00643                                         mac_enc, mac_dec,
00644                                         transform->maclen ) ) != 0 )
00645         {
00646             SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret );
00647             return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
00648         }
00649     }
00650 #endif /* POLARSSL_SSL_HW_RECORD_ACCEL */
00651 
00652     if( ( ret = cipher_init_ctx( &transform->cipher_ctx_enc,
00653                                  cipher_info ) ) != 0 )
00654     {
00655         SSL_DEBUG_RET( 1, "cipher_init_ctx", ret );
00656         return( ret );
00657     }
00658 
00659     if( ( ret = cipher_init_ctx( &transform->cipher_ctx_dec,
00660                                  cipher_info ) ) != 0 )
00661     {
00662         SSL_DEBUG_RET( 1, "cipher_init_ctx", ret );
00663         return( ret );
00664     }
00665 
00666     if( ( ret = cipher_setkey( &transform->cipher_ctx_enc, key1,
00667                                cipher_info->key_length,
00668                                POLARSSL_ENCRYPT ) ) != 0 )
00669     {
00670         SSL_DEBUG_RET( 1, "cipher_setkey", ret );
00671         return( ret );
00672     }
00673 
00674     if( ( ret = cipher_setkey( &transform->cipher_ctx_dec, key2,
00675                                cipher_info->key_length,
00676                                POLARSSL_DECRYPT ) ) != 0 )
00677     {
00678         SSL_DEBUG_RET( 1, "cipher_setkey", ret );
00679         return( ret );
00680     }
00681 
00682 #if defined(POLARSSL_CIPHER_MODE_CBC)
00683     if( cipher_info->mode == POLARSSL_MODE_CBC )
00684     {
00685         if( ( ret = cipher_set_padding_mode( &transform->cipher_ctx_enc,
00686                                              POLARSSL_PADDING_NONE ) ) != 0 )
00687         {
00688             SSL_DEBUG_RET( 1, "cipher_set_padding_mode", ret );
00689             return( ret );
00690         }
00691 
00692         if( ( ret = cipher_set_padding_mode( &transform->cipher_ctx_dec,
00693                                              POLARSSL_PADDING_NONE ) ) != 0 )
00694         {
00695             SSL_DEBUG_RET( 1, "cipher_set_padding_mode", ret );
00696             return( ret );
00697         }
00698     }
00699 #endif /* POLARSSL_CIPHER_MODE_CBC */
00700 
00701     memset( keyblk, 0, sizeof( keyblk ) );
00702 
00703 #if defined(POLARSSL_ZLIB_SUPPORT)
00704     // Initialize compression
00705     //
00706     if( session->compression == SSL_COMPRESS_DEFLATE )
00707     {
00708         if( ssl->compress_buf == NULL )
00709         {
00710             SSL_DEBUG_MSG( 3, ( "Allocating compression buffer" ) );
00711             ssl->compress_buf = polarssl_malloc( SSL_BUFFER_LEN );
00712             if( ssl->compress_buf == NULL )
00713             {
00714                 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
00715                                     SSL_BUFFER_LEN ) );
00716                 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
00717             }
00718         }
00719 
00720         SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
00721 
00722         memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
00723         memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
00724 
00725         if( deflateInit( &transform->ctx_deflate,
00726                          Z_DEFAULT_COMPRESSION )   != Z_OK ||
00727             inflateInit( &transform->ctx_inflate ) != Z_OK )
00728         {
00729             SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
00730             return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
00731         }
00732     }
00733 #endif /* POLARSSL_ZLIB_SUPPORT */
00734 
00735     SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
00736 
00737     return( 0 );
00738 }
00739 
00740 #if defined(POLARSSL_SSL_PROTO_SSL3)
00741 void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] )
00742 {
00743     md5_context md5;
00744     sha1_context sha1;
00745     unsigned char pad_1[48];
00746     unsigned char pad_2[48];
00747 
00748     SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
00749 
00750     memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context)  );
00751     memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
00752 
00753     memset( pad_1, 0x36, 48 );
00754     memset( pad_2, 0x5C, 48 );
00755 
00756     md5_update( &md5, ssl->session_negotiate->master, 48 );
00757     md5_update( &md5, pad_1, 48 );
00758     md5_finish( &md5, hash );
00759 
00760     md5_starts( &md5 );
00761     md5_update( &md5, ssl->session_negotiate->master, 48 );
00762     md5_update( &md5, pad_2, 48 );
00763     md5_update( &md5, hash,  16 );
00764     md5_finish( &md5, hash );
00765 
00766     sha1_update( &sha1, ssl->session_negotiate->master, 48 );
00767     sha1_update( &sha1, pad_1, 40 );
00768     sha1_finish( &sha1, hash + 16 );
00769 
00770     sha1_starts( &sha1 );
00771     sha1_update( &sha1, ssl->session_negotiate->master, 48 );
00772     sha1_update( &sha1, pad_2, 40 );
00773     sha1_update( &sha1, hash + 16, 20 );
00774     sha1_finish( &sha1, hash + 16 );
00775 
00776     SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
00777     SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
00778 
00779     return;
00780 }
00781 #endif /* POLARSSL_SSL_PROTO_SSL3 */
00782 
00783 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
00784 void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] )
00785 {
00786     md5_context md5;
00787     sha1_context sha1;
00788 
00789     SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
00790 
00791     memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context)  );
00792     memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
00793 
00794      md5_finish( &md5,  hash );
00795     sha1_finish( &sha1, hash + 16 );
00796 
00797     SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
00798     SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
00799 
00800     return;
00801 }
00802 #endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 */
00803 
00804 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
00805 #if defined(POLARSSL_SHA256_C)
00806 void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] )
00807 {
00808     sha256_context sha256;
00809 
00810     SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
00811 
00812     memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
00813     sha256_finish( &sha256, hash );
00814 
00815     SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
00816     SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
00817 
00818     return;
00819 }
00820 #endif /* POLARSSL_SHA256_C */
00821 
00822 #if defined(POLARSSL_SHA512_C)
00823 void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] )
00824 {
00825     sha512_context sha512;
00826 
00827     SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
00828 
00829     memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
00830     sha512_finish( &sha512, hash );
00831 
00832     SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
00833     SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
00834 
00835     return;
00836 }
00837 #endif /* POLARSSL_SHA512_C */
00838 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
00839 
00840 #if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
00841 int ssl_psk_derive_premaster( ssl_context *ssl, key_exchange_type_t key_ex )
00842 {
00843     unsigned char *p = ssl->handshake->premaster;
00844     unsigned char *end = p + sizeof( ssl->handshake->premaster );
00845 
00846     /*
00847      * PMS = struct {
00848      *     opaque other_secret<0..2^16-1>;
00849      *     opaque psk<0..2^16-1>;
00850      * };
00851      * with "other_secret" depending on the particular key exchange
00852      */
00853 #if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
00854     if( key_ex == POLARSSL_KEY_EXCHANGE_PSK )
00855     {
00856         if( end - p < 2 + (int) ssl->psk_len )
00857             return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00858 
00859         *(p++) = (unsigned char)( ssl->psk_len >> 8 );
00860         *(p++) = (unsigned char)( ssl->psk_len      );
00861         p += ssl->psk_len;
00862     }
00863     else
00864 #endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
00865 #if defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
00866     if( key_ex == POLARSSL_KEY_EXCHANGE_RSA_PSK )
00867     {
00868         /*
00869          * other_secret already set by the ClientKeyExchange message,
00870          * and is 48 bytes long
00871          */
00872         *p++ = 0;
00873         *p++ = 48;
00874         p += 48;
00875     }
00876     else
00877 #endif /* POLARSSL_KEY_EXCHANGE_RSA_PKS_ENABLED */
00878 #if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
00879     if( key_ex == POLARSSL_KEY_EXCHANGE_DHE_PSK )
00880     {
00881         int ret;
00882         size_t len = ssl->handshake->dhm_ctx.len;
00883 
00884         if( end - p < 2 + (int) len )
00885             return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00886 
00887         *(p++) = (unsigned char)( len >> 8 );
00888         *(p++) = (unsigned char)( len );
00889         if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
00890                                       p, &len, ssl->f_rng, ssl->p_rng ) ) != 0 )
00891         {
00892             SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
00893             return( ret );
00894         }
00895         p += len;
00896 
00897         SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K  );
00898     }
00899     else
00900 #endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
00901 #if defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
00902     if( key_ex == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
00903     {
00904         int ret;
00905         size_t zlen;
00906 
00907         if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen,
00908                                        p + 2, end - (p + 2),
00909                                        ssl->f_rng, ssl->p_rng ) ) != 0 )
00910         {
00911             SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
00912             return( ret );
00913         }
00914 
00915         *(p++) = (unsigned char)( zlen >> 8 );
00916         *(p++) = (unsigned char)( zlen      );
00917         p += zlen;
00918 
00919         SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
00920     }
00921     else
00922 #endif /* POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
00923     {
00924         SSL_DEBUG_MSG( 1, ( "should never happen" ) );
00925         return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
00926     }
00927 
00928     /* opaque psk<0..2^16-1>; */
00929     if( end - p < 2 + (int) ssl->psk_len )
00930             return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
00931 
00932     *(p++) = (unsigned char)( ssl->psk_len >> 8 );
00933     *(p++) = (unsigned char)( ssl->psk_len      );
00934     memcpy( p, ssl->psk, ssl->psk_len );
00935     p += ssl->psk_len;
00936 
00937     ssl->handshake->pmslen = p - ssl->handshake->premaster;
00938 
00939     return( 0 );
00940 }
00941 #endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
00942 
00943 #if defined(POLARSSL_SSL_PROTO_SSL3)
00944 /*
00945  * SSLv3.0 MAC functions
00946  */
00947 static void ssl_mac( md_context_t *md_ctx, unsigned char *secret,
00948                      unsigned char *buf, size_t len,
00949                      unsigned char *ctr, int type )
00950 {
00951     unsigned char header[11];
00952     unsigned char padding[48];
00953     int padlen = 0;
00954     int md_size = md_get_size( md_ctx->md_info );
00955     int md_type = md_get_type( md_ctx->md_info );
00956 
00957     if( md_type == POLARSSL_MD_MD5 )
00958         padlen = 48;
00959     else if( md_type == POLARSSL_MD_SHA1 )
00960         padlen = 40;
00961     else if( md_type == POLARSSL_MD_SHA256 )
00962         padlen = 32;
00963     else if( md_type == POLARSSL_MD_SHA384 )
00964         padlen = 16;
00965 
00966     memcpy( header, ctr, 8 );
00967     header[ 8] = (unsigned char)  type;
00968     header[ 9] = (unsigned char)( len >> 8 );
00969     header[10] = (unsigned char)( len      );
00970 
00971     memset( padding, 0x36, padlen );
00972     md_starts( md_ctx );
00973     md_update( md_ctx, secret,  md_size );
00974     md_update( md_ctx, padding, padlen  );
00975     md_update( md_ctx, header,  11      );
00976     md_update( md_ctx, buf,     len     );
00977     md_finish( md_ctx, buf +    len     );
00978 
00979     memset( padding, 0x5C, padlen );
00980     md_starts( md_ctx );
00981     md_update( md_ctx, secret,    md_size );
00982     md_update( md_ctx, padding,   padlen  );
00983     md_update( md_ctx, buf + len, md_size );
00984     md_finish( md_ctx, buf + len          );
00985 }
00986 #endif /* POLARSSL_SSL_PROTO_SSL3 */
00987 
00988 /*
00989  * Encryption/decryption functions
00990  */
00991 static int ssl_encrypt_buf( ssl_context *ssl )
00992 {
00993     size_t i;
00994 
00995     SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
00996 
00997     /*
00998      * Add MAC before encrypt, except for GCM
00999      */
01000 #if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER) ||     \
01001     ( defined(POLARSSL_CIPHER_MODE_CBC) &&                                  \
01002       ( defined(POLARSSL_AES_C) || defined(POLARSSL_CAMELLIA_C) ) )
01003     if( ssl->transform_out->cipher_ctx_enc.cipher_info->mode !=
01004                                                         POLARSSL_MODE_GCM )
01005     {
01006 #if defined(POLARSSL_SSL_PROTO_SSL3)
01007         if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
01008         {
01009             ssl_mac( &ssl->transform_out->md_ctx_enc,
01010                       ssl->transform_out->mac_enc,
01011                       ssl->out_msg, ssl->out_msglen,
01012                       ssl->out_ctr, ssl->out_msgtype );
01013         }
01014         else
01015 #endif
01016 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
01017         defined(POLARSSL_SSL_PROTO_TLS1_2)
01018         if( ssl->minor_ver >= SSL_MINOR_VERSION_1 )
01019         {
01020             md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 13 );
01021             md_hmac_update( &ssl->transform_out->md_ctx_enc,
01022                              ssl->out_msg, ssl->out_msglen );
01023             md_hmac_finish( &ssl->transform_out->md_ctx_enc,
01024                              ssl->out_msg + ssl->out_msglen );
01025             md_hmac_reset( &ssl->transform_out->md_ctx_enc );
01026         }
01027         else
01028 #endif
01029         {
01030             SSL_DEBUG_MSG( 1, ( "should never happen" ) );
01031             return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
01032         }
01033 
01034         SSL_DEBUG_BUF( 4, "computed mac",
01035                        ssl->out_msg + ssl->out_msglen,
01036                        ssl->transform_out->maclen );
01037 
01038         ssl->out_msglen += ssl->transform_out->maclen;
01039     }
01040 #endif /* GCM not the only option */
01041 
01042     /*
01043      * Encrypt
01044      */
01045 #if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER)
01046     if( ssl->transform_out->cipher_ctx_enc.cipher_info->mode ==
01047                                                         POLARSSL_MODE_STREAM )
01048     {
01049         int ret;
01050         size_t olen = 0;
01051 
01052         SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
01053                             "including %d bytes of padding",
01054                        ssl->out_msglen, 0 ) );
01055 
01056         SSL_DEBUG_BUF( 4, "before encrypt: output payload",
01057                        ssl->out_msg, ssl->out_msglen );
01058 
01059         if( ( ret = cipher_reset( &ssl->transform_out->cipher_ctx_enc ) ) != 0 )
01060         {
01061             SSL_DEBUG_RET( 1, "cipher_reset", ret );
01062             return( ret );
01063         }
01064 
01065         if( ( ret = cipher_set_iv( &ssl->transform_out->cipher_ctx_enc,
01066                                    ssl->transform_out->iv_enc,
01067                                    ssl->transform_out->ivlen ) ) != 0 )
01068         {
01069             SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
01070             return( ret );
01071         }
01072 
01073         if( ( ret = cipher_update( &ssl->transform_out->cipher_ctx_enc,
01074                                    ssl->out_msg, ssl->out_msglen, ssl->out_msg,
01075                                    &olen ) ) != 0 )
01076         {
01077             SSL_DEBUG_RET( 1, "cipher_update", ret );
01078             return( ret );
01079         }
01080 
01081         if( ssl->out_msglen != olen )
01082         {
01083             SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect %d %d",
01084                                 ssl->out_msglen, olen ) );
01085             return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
01086         }
01087 
01088         if( ( ret = cipher_finish( &ssl->transform_out->cipher_ctx_enc,
01089                                    ssl->out_msg + olen, &olen ) ) != 0 )
01090         {
01091             SSL_DEBUG_RET( 1, "cipher_finish", ret );
01092             return( ret );
01093         }
01094 
01095         if( 0 != olen )
01096         {
01097             SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect %d %d",
01098                                 0, olen ) );
01099             return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
01100         }
01101     }
01102     else
01103 #endif /* POLARSSL_ARC4_C || POLARSSL_CIPHER_NULL_CIPHER */
01104 #if defined(POLARSSL_GCM_C)
01105     if( ssl->transform_out->cipher_ctx_enc.cipher_info->mode ==
01106                                                         POLARSSL_MODE_GCM )
01107     {
01108         size_t enc_msglen, olen, totlen;
01109         unsigned char *enc_msg;
01110         unsigned char add_data[13];
01111         int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
01112 
01113         memcpy( add_data, ssl->out_ctr, 8 );
01114         add_data[8]  = ssl->out_msgtype;
01115         add_data[9]  = ssl->major_ver;
01116         add_data[10] = ssl->minor_ver;
01117         add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
01118         add_data[12] = ssl->out_msglen & 0xFF;
01119 
01120         SSL_DEBUG_BUF( 4, "additional data used for AEAD",
01121                        add_data, 13 );
01122 
01123         /*
01124          * Generate IV
01125          */
01126         ret = ssl->f_rng( ssl->p_rng,
01127                 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
01128                 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
01129         if( ret != 0 )
01130             return( ret );
01131 
01132         memcpy( ssl->out_iv,
01133                 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
01134                 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
01135 
01136         SSL_DEBUG_BUF( 4, "IV used", ssl->out_iv,
01137                 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
01138 
01139         /*
01140          * Fix pointer positions and message length with added IV
01141          */
01142         enc_msg = ssl->out_msg;
01143         enc_msglen = ssl->out_msglen;
01144         ssl->out_msglen += ssl->transform_out->ivlen -
01145                            ssl->transform_out->fixed_ivlen;
01146 
01147         SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
01148                             "including %d bytes of padding",
01149                        ssl->out_msglen, 0 ) );
01150 
01151         SSL_DEBUG_BUF( 4, "before encrypt: output payload",
01152                        ssl->out_msg, ssl->out_msglen );
01153 
01154         /*
01155          * Encrypt
01156          */
01157         if( ( ret = cipher_set_iv( &ssl->transform_out->cipher_ctx_enc,
01158                                     ssl->transform_out->iv_enc,
01159                                     ssl->transform_out->ivlen ) ) != 0 ||
01160             ( ret = cipher_reset( &ssl->transform_out->cipher_ctx_enc ) ) != 0 )
01161         {
01162             return( ret );
01163         }
01164 
01165         if( ( ret = cipher_update_ad( &ssl->transform_out->cipher_ctx_enc,
01166                                       add_data, 13 ) ) != 0 )
01167         {
01168             return( ret );
01169         }
01170 
01171         if( ( ret = cipher_update( &ssl->transform_out->cipher_ctx_enc,
01172                                    enc_msg, enc_msglen,
01173                                    enc_msg, &olen ) ) != 0 )
01174         {
01175             return( ret );
01176         }
01177         totlen = olen;
01178 
01179         if( ( ret = cipher_finish( &ssl->transform_out->cipher_ctx_enc,
01180                                    enc_msg + olen, &olen ) ) != 0 )
01181         {
01182             return( ret );
01183         }
01184         totlen += olen;
01185 
01186         if( totlen != enc_msglen )
01187         {
01188             SSL_DEBUG_MSG( 1, ( "should never happen" ) );
01189             return( -1 );
01190         }
01191 
01192         /*
01193          * Authenticate
01194          */
01195         ssl->out_msglen += 16;
01196 
01197         if( ( ret = cipher_write_tag( &ssl->transform_out->cipher_ctx_enc,
01198                                       enc_msg + enc_msglen, 16 ) ) != 0 )
01199         {
01200             return( ret );
01201         }
01202 
01203         SSL_DEBUG_BUF( 4, "after encrypt: tag", enc_msg + enc_msglen, 16 );
01204     }
01205     else
01206 #endif /* POLARSSL_GCM_C */
01207 #if defined(POLARSSL_CIPHER_MODE_CBC) &&                                    \
01208     ( defined(POLARSSL_AES_C) || defined(POLARSSL_CAMELLIA_C) )
01209     if( ssl->transform_out->cipher_ctx_enc.cipher_info->mode ==
01210                                                         POLARSSL_MODE_CBC )
01211     {
01212         int ret;
01213         unsigned char *enc_msg;
01214         size_t enc_msglen, padlen, olen = 0;
01215 
01216         padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
01217                  ssl->transform_out->ivlen;
01218         if( padlen == ssl->transform_out->ivlen )
01219             padlen = 0;
01220 
01221         for( i = 0; i <= padlen; i++ )
01222             ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
01223 
01224         ssl->out_msglen += padlen + 1;
01225 
01226         enc_msglen = ssl->out_msglen;
01227         enc_msg = ssl->out_msg;
01228 
01229 #if defined(POLARSSL_SSL_PROTO_TLS1_1) || defined(POLARSSL_SSL_PROTO_TLS1_2)
01230         /*
01231          * Prepend per-record IV for block cipher in TLS v1.1 and up as per
01232          * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
01233          */
01234         if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
01235         {
01236             /*
01237              * Generate IV
01238              */
01239             int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc,
01240                                   ssl->transform_out->ivlen );
01241             if( ret != 0 )
01242                 return( ret );
01243 
01244             memcpy( ssl->out_iv, ssl->transform_out->iv_enc,
01245                     ssl->transform_out->ivlen );
01246 
01247             /*
01248              * Fix pointer positions and message length with added IV
01249              */
01250             enc_msg = ssl->out_msg;
01251             enc_msglen = ssl->out_msglen;
01252             ssl->out_msglen += ssl->transform_out->ivlen;
01253         }
01254 #endif /* POLARSSL_SSL_PROTO_TLS1_1 || POLARSSL_SSL_PROTO_TLS1_2 */
01255 
01256         SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
01257                             "including %d bytes of IV and %d bytes of padding",
01258                             ssl->out_msglen, ssl->transform_out->ivlen,
01259                             padlen + 1 ) );
01260 
01261         SSL_DEBUG_BUF( 4, "before encrypt: output payload",
01262                        ssl->out_iv, ssl->out_msglen );
01263 
01264         if( ( ret = cipher_reset( &ssl->transform_out->cipher_ctx_enc ) ) != 0 )
01265         {
01266             SSL_DEBUG_RET( 1, "cipher_reset", ret );
01267             return( ret );
01268         }
01269 
01270         if( ( ret = cipher_set_iv( &ssl->transform_out->cipher_ctx_enc,
01271                                    ssl->transform_out->iv_enc,
01272                                    ssl->transform_out->ivlen ) ) != 0 )
01273         {
01274             SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
01275             return( ret );
01276         }
01277 
01278         if( ( ret = cipher_update( &ssl->transform_out->cipher_ctx_enc,
01279                                    enc_msg, enc_msglen, enc_msg,
01280                                    &olen ) ) != 0 )
01281         {
01282             SSL_DEBUG_RET( 1, "cipher_update", ret );
01283             return( ret );
01284         }
01285 
01286         enc_msglen -= olen;
01287 
01288         if( ( ret = cipher_finish( &ssl->transform_out->cipher_ctx_enc,
01289                                    enc_msg + olen, &olen ) ) != 0 )
01290         {
01291             SSL_DEBUG_RET( 1, "cipher_finish", ret );
01292             return( ret );
01293         }
01294 
01295         if( enc_msglen != olen )
01296         {
01297             SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect %d %d",
01298                                 enc_msglen, olen ) );
01299             return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
01300         }
01301 
01302 #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1)
01303         if( ssl->minor_ver < SSL_MINOR_VERSION_2 )
01304         {
01305             /*
01306              * Save IV in SSL3 and TLS1
01307              */
01308             memcpy( ssl->transform_out->iv_enc,
01309                     ssl->transform_out->cipher_ctx_enc.iv,
01310                     ssl->transform_out->ivlen );
01311         }
01312 #endif
01313     }
01314     else
01315 #endif /* POLARSSL_CIPHER_MODE_CBC &&
01316           ( POLARSSL_AES_C || POLARSSL_CAMELLIA_C ) */
01317     {
01318         SSL_DEBUG_MSG( 1, ( "should never happen" ) );
01319         return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
01320     }
01321 
01322     for( i = 8; i > 0; i-- )
01323         if( ++ssl->out_ctr[i - 1] != 0 )
01324             break;
01325 
01326     /* The loops goes to its end iff the counter is wrapping */
01327     if( i == 0 )
01328     {
01329         SSL_DEBUG_MSG( 1, ( "outgoing message counter would wrap" ) );
01330         return( POLARSSL_ERR_SSL_COUNTER_WRAPPING );
01331     }
01332 
01333     SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
01334 
01335     return( 0 );
01336 }
01337 
01338 #define POLARSSL_SSL_MAX_MAC_SIZE   48
01339 
01340 static int ssl_decrypt_buf( ssl_context *ssl )
01341 {
01342     size_t i;
01343 #if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER) ||     \
01344     ( defined(POLARSSL_CIPHER_MODE_CBC) &&                                  \
01345       ( defined(POLARSSL_AES_C) || defined(POLARSSL_CAMELLIA_C) ) )
01346     size_t padlen = 0, correct = 1;
01347 #endif
01348 
01349     SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
01350 
01351     if( ssl->in_msglen < ssl->transform_in->minlen )
01352     {
01353         SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
01354                        ssl->in_msglen, ssl->transform_in->minlen ) );
01355         return( POLARSSL_ERR_SSL_INVALID_MAC );
01356     }
01357 
01358 #if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER)
01359     if( ssl->transform_in->cipher_ctx_dec.cipher_info->mode ==
01360                                                        POLARSSL_MODE_STREAM )
01361     {
01362         int ret;
01363         size_t olen = 0;
01364 
01365         padlen = 0;
01366 
01367         if( ( ret = cipher_reset( &ssl->transform_in->cipher_ctx_dec ) ) != 0 )
01368         {
01369             SSL_DEBUG_RET( 1, "cipher_reset", ret );
01370             return( ret );
01371         }
01372 
01373         if( ( ret = cipher_set_iv( &ssl->transform_in->cipher_ctx_dec,
01374                                    ssl->transform_in->iv_dec,
01375                                    ssl->transform_in->ivlen ) ) != 0 )
01376         {
01377             SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
01378             return( ret );
01379         }
01380 
01381         if( ( ret = cipher_update( &ssl->transform_in->cipher_ctx_dec,
01382                                    ssl->in_msg, ssl->in_msglen, ssl->in_msg,
01383                                    &olen ) ) != 0 )
01384         {
01385             SSL_DEBUG_RET( 1, "cipher_update", ret );
01386             return( ret );
01387         }
01388 
01389         if( ssl->in_msglen != olen )
01390         {
01391             SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect" ) );
01392             return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
01393         }
01394 
01395         if( ( ret = cipher_finish( &ssl->transform_in->cipher_ctx_dec,
01396                                    ssl->in_msg + olen, &olen ) ) != 0 )
01397         {
01398             SSL_DEBUG_RET( 1, "cipher_finish", ret );
01399             return( ret );
01400         }
01401 
01402         if( 0 != olen )
01403         {
01404             SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect" ) );
01405             return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
01406         }
01407     }
01408     else
01409 #endif /* POLARSSL_ARC4_C || POLARSSL_CIPHER_NULL_CIPHER */
01410 #if defined(POLARSSL_GCM_C)
01411     if( ssl->transform_in->cipher_ctx_dec.cipher_info->mode ==
01412                                                        POLARSSL_MODE_GCM )
01413     {
01414         unsigned char *dec_msg;
01415         unsigned char *dec_msg_result;
01416         size_t dec_msglen, olen, totlen;
01417         unsigned char add_data[13];
01418         int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
01419 
01420         dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
01421                                         ssl->transform_in->fixed_ivlen );
01422         dec_msglen -= 16;
01423         dec_msg = ssl->in_msg;
01424         dec_msg_result = ssl->in_msg;
01425         ssl->in_msglen = dec_msglen;
01426 
01427         memcpy( add_data, ssl->in_ctr, 8 );
01428         add_data[8]  = ssl->in_msgtype;
01429         add_data[9]  = ssl->major_ver;
01430         add_data[10] = ssl->minor_ver;
01431         add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
01432         add_data[12] = ssl->in_msglen & 0xFF;
01433 
01434         SSL_DEBUG_BUF( 4, "additional data used for AEAD",
01435                        add_data, 13 );
01436 
01437         memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
01438                 ssl->in_iv,
01439                 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
01440 
01441         SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
01442                                      ssl->transform_in->ivlen );
01443         SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
01444 
01445         /*
01446          * Decrypt
01447          */
01448         if( ( ret = cipher_set_iv( &ssl->transform_in->cipher_ctx_dec,
01449                                     ssl->transform_in->iv_dec,
01450                                     ssl->transform_in->ivlen ) ) != 0 ||
01451             ( ret = cipher_reset( &ssl->transform_in->cipher_ctx_dec ) ) != 0 )
01452         {
01453             return( ret );
01454         }
01455 
01456         if( ( ret = cipher_update_ad( &ssl->transform_in->cipher_ctx_dec,
01457                                       add_data, 13 ) ) != 0 )
01458         {
01459             return( ret );
01460         }
01461 
01462         if( ( ret = cipher_update( &ssl->transform_in->cipher_ctx_dec,
01463                                    dec_msg, dec_msglen,
01464                                    dec_msg_result, &olen ) ) != 0 )
01465         {
01466             return( ret );
01467         }
01468         totlen = olen;
01469 
01470         if( ( ret = cipher_finish( &ssl->transform_in->cipher_ctx_dec,
01471                                    dec_msg_result + olen, &olen ) ) != 0 )
01472         {
01473             return( ret );
01474         }
01475         totlen += olen;
01476 
01477         if( totlen != dec_msglen )
01478         {
01479             SSL_DEBUG_MSG( 1, ( "should never happen" ) );
01480             return( -1 );
01481         }
01482 
01483         /*
01484          * Authenticate
01485          */
01486         if( ( ret = cipher_check_tag( &ssl->transform_in->cipher_ctx_dec,
01487                                       dec_msg + dec_msglen, 16 ) ) != 0 )
01488         {
01489             SSL_DEBUG_RET( 1, "cipher_check_tag", ret );
01490             return( POLARSSL_ERR_SSL_INVALID_MAC );
01491         }
01492 
01493     }
01494     else
01495 #endif /* POLARSSL_GCM_C */
01496 #if defined(POLARSSL_CIPHER_MODE_CBC) &&                                    \
01497     ( defined(POLARSSL_AES_C) || defined(POLARSSL_CAMELLIA_C) )
01498     if( ssl->transform_in->cipher_ctx_dec.cipher_info->mode ==
01499                                                        POLARSSL_MODE_CBC )
01500     {
01501         /*
01502          * Decrypt and check the padding
01503          */
01504         int ret;
01505         unsigned char *dec_msg;
01506         unsigned char *dec_msg_result;
01507         size_t dec_msglen;
01508         size_t minlen = 0;
01509         size_t olen = 0;
01510 
01511         /*
01512          * Check immediate ciphertext sanity
01513          */
01514         if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
01515         {
01516             SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
01517                            ssl->in_msglen, ssl->transform_in->ivlen ) );
01518             return( POLARSSL_ERR_SSL_INVALID_MAC );
01519         }
01520 
01521 #if defined(POLARSSL_SSL_PROTO_TLS1_1) || defined(POLARSSL_SSL_PROTO_TLS1_2)
01522         if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
01523             minlen += ssl->transform_in->ivlen;
01524 #endif
01525 
01526         if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
01527             ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
01528         {
01529             SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) "
01530                                 "+ 1 ) ( + expl IV )", ssl->in_msglen,
01531                                 ssl->transform_in->ivlen,
01532                                 ssl->transform_in->maclen ) );
01533             return( POLARSSL_ERR_SSL_INVALID_MAC );
01534         }
01535 
01536         dec_msglen = ssl->in_msglen;
01537         dec_msg = ssl->in_msg;
01538         dec_msg_result = ssl->in_msg;
01539 
01540 #if defined(POLARSSL_SSL_PROTO_TLS1_1) || defined(POLARSSL_SSL_PROTO_TLS1_2)
01541         /*
01542          * Initialize for prepended IV for block cipher in TLS v1.1 and up
01543          */
01544         if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
01545         {
01546             dec_msglen -= ssl->transform_in->ivlen;
01547             ssl->in_msglen -= ssl->transform_in->ivlen;
01548 
01549             for( i = 0; i < ssl->transform_in->ivlen; i++ )
01550                 ssl->transform_in->iv_dec[i] = ssl->in_iv[i];
01551         }
01552 #endif /* POLARSSL_SSL_PROTO_TLS1_1 || POLARSSL_SSL_PROTO_TLS1_2 */
01553 
01554         if( ( ret = cipher_reset( &ssl->transform_in->cipher_ctx_dec ) ) != 0 )
01555         {
01556             SSL_DEBUG_RET( 1, "cipher_reset", ret );
01557             return( ret );
01558         }
01559 
01560         if( ( ret = cipher_set_iv( &ssl->transform_in->cipher_ctx_dec,
01561                                    ssl->transform_in->iv_dec,
01562                                    ssl->transform_in->ivlen ) ) != 0 )
01563         {
01564             SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
01565             return( ret );
01566         }
01567 
01568         if( ( ret = cipher_update( &ssl->transform_in->cipher_ctx_dec,
01569                                    dec_msg, dec_msglen, dec_msg_result,
01570                                    &olen ) ) != 0 )
01571         {
01572             SSL_DEBUG_RET( 1, "cipher_update", ret );
01573             return( ret );
01574         }
01575 
01576         dec_msglen -= olen;
01577         if( ( ret = cipher_finish( &ssl->transform_in->cipher_ctx_dec,
01578                                    dec_msg_result + olen, &olen ) ) != 0 )
01579         {
01580             SSL_DEBUG_RET( 1, "cipher_finish", ret );
01581             return( ret );
01582         }
01583 
01584         if( dec_msglen != olen )
01585         {
01586             SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect" ) );
01587             return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
01588         }
01589 
01590 #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1)
01591         if( ssl->minor_ver < SSL_MINOR_VERSION_2 )
01592         {
01593             /*
01594              * Save IV in SSL3 and TLS1
01595              */
01596             memcpy( ssl->transform_in->iv_dec,
01597                     ssl->transform_in->cipher_ctx_dec.iv,
01598                     ssl->transform_in->ivlen );
01599         }
01600 #endif
01601 
01602         padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
01603 
01604         if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
01605         {
01606 #if defined(POLARSSL_SSL_DEBUG_ALL)
01607             SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
01608                         ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
01609 #endif
01610             padlen = 0;
01611             correct = 0;
01612         }
01613 
01614 #if defined(POLARSSL_SSL_PROTO_SSL3)
01615         if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
01616         {
01617             if( padlen > ssl->transform_in->ivlen )
01618             {
01619 #if defined(POLARSSL_SSL_DEBUG_ALL)
01620                 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
01621                                     "should be no more than %d",
01622                                padlen, ssl->transform_in->ivlen ) );
01623 #endif
01624                 correct = 0;
01625             }
01626         }
01627         else
01628 #endif /* POLARSSL_SSL_PROTO_SSL3 */
01629 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
01630     defined(POLARSSL_SSL_PROTO_TLS1_2)
01631         if( ssl->minor_ver > SSL_MINOR_VERSION_0 )
01632         {
01633             /*
01634              * TLSv1+: always check the padding up to the first failure
01635              * and fake check up to 256 bytes of padding
01636              */
01637             size_t pad_count = 0, real_count = 1;
01638             size_t padding_idx = ssl->in_msglen - padlen - 1;
01639 
01640             /*
01641              * Padding is guaranteed to be incorrect if:
01642              *   1. padlen >= ssl->in_msglen
01643              *
01644              *   2. padding_idx >= SSL_MAX_CONTENT_LEN +
01645              *                     ssl->transform_in->maclen
01646              *
01647              * In both cases we reset padding_idx to a safe value (0) to
01648              * prevent out-of-buffer reads.
01649              */
01650             correct &= ( ssl->in_msglen >= padlen + 1 );
01651             correct &= ( padding_idx < SSL_MAX_CONTENT_LEN +
01652                                        ssl->transform_in->maclen );
01653 
01654             padding_idx *= correct;
01655 
01656             for( i = 1; i <= 256; i++ )
01657             {
01658                 real_count &= ( i <= padlen );
01659                 pad_count += real_count *
01660                              ( ssl->in_msg[padding_idx + i] == padlen - 1 );
01661             }
01662 
01663             correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
01664 
01665 #if defined(POLARSSL_SSL_DEBUG_ALL)
01666             if( padlen > 0 && correct == 0)
01667                 SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
01668 #endif
01669             padlen &= correct * 0x1FF;
01670         }
01671         else
01672 #endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
01673           POLARSSL_SSL_PROTO_TLS1_2 */
01674         {
01675             SSL_DEBUG_MSG( 1, ( "should never happen" ) );
01676             return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
01677         }
01678     }
01679     else
01680 #endif /* POLARSSL_CIPHER_MODE_CBC &&
01681           ( POLARSSL_AES_C || POLARSSL_CAMELLIA_C ) */
01682     {
01683         SSL_DEBUG_MSG( 1, ( "should never happen" ) );
01684         return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
01685     }
01686 
01687     SSL_DEBUG_BUF( 4, "raw buffer after decryption",
01688                    ssl->in_msg, ssl->in_msglen );
01689 
01690     /*
01691      * Always compute the MAC (RFC4346, CBCTIME), except for GCM of course
01692      */
01693 #if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER) ||     \
01694     ( defined(POLARSSL_CIPHER_MODE_CBC) &&                                  \
01695       ( defined(POLARSSL_AES_C) || defined(POLARSSL_CAMELLIA_C) ) )
01696     if( ssl->transform_in->cipher_ctx_dec.cipher_info->mode !=
01697                                                         POLARSSL_MODE_GCM )
01698     {
01699         unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
01700 
01701         ssl->in_msglen -= ( ssl->transform_in->maclen + padlen );
01702 
01703         ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
01704         ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen      );
01705 
01706         memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
01707 
01708 #if defined(POLARSSL_SSL_PROTO_SSL3)
01709         if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
01710         {
01711             ssl_mac( &ssl->transform_in->md_ctx_dec,
01712                       ssl->transform_in->mac_dec,
01713                       ssl->in_msg, ssl->in_msglen,
01714                       ssl->in_ctr, ssl->in_msgtype );
01715         }
01716         else
01717 #endif /* POLARSSL_SSL_PROTO_SSL3 */
01718 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
01719         defined(POLARSSL_SSL_PROTO_TLS1_2)
01720         if( ssl->minor_ver > SSL_MINOR_VERSION_0 )
01721         {
01722             /*
01723              * Process MAC and always update for padlen afterwards to make
01724              * total time independent of padlen
01725              *
01726              * extra_run compensates MAC check for padlen
01727              *
01728              * Known timing attacks:
01729              *  - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
01730              *
01731              * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
01732              * correctly. (We round down instead of up, so -56 is the correct
01733              * value for our calculations instead of -55)
01734              */
01735             size_t j, extra_run = 0;
01736             extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
01737                         ( 13 + ssl->in_msglen          + 8 ) / 64;
01738 
01739             extra_run &= correct * 0xFF;
01740 
01741             md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 13 );
01742             md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,
01743                              ssl->in_msglen );
01744             md_hmac_finish( &ssl->transform_in->md_ctx_dec,
01745                              ssl->in_msg + ssl->in_msglen );
01746             for( j = 0; j < extra_run; j++ )
01747                 md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );
01748 
01749             md_hmac_reset( &ssl->transform_in->md_ctx_dec );
01750         }
01751         else
01752 #endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
01753               POLARSSL_SSL_PROTO_TLS1_2 */
01754         {
01755             SSL_DEBUG_MSG( 1, ( "should never happen" ) );
01756             return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
01757         }
01758 
01759         SSL_DEBUG_BUF( 4, "message  mac", tmp, ssl->transform_in->maclen );
01760         SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
01761                        ssl->transform_in->maclen );
01762 
01763         if( safer_memcmp( tmp, ssl->in_msg + ssl->in_msglen,
01764                          ssl->transform_in->maclen ) != 0 )
01765         {
01766 #if defined(POLARSSL_SSL_DEBUG_ALL)
01767             SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
01768 #endif
01769             correct = 0;
01770         }
01771 
01772         /*
01773          * Finally check the correct flag
01774          */
01775         if( correct == 0 )
01776             return( POLARSSL_ERR_SSL_INVALID_MAC );
01777     }
01778 #endif /* GCM not the only option */
01779 
01780     if( ssl->in_msglen == 0 )
01781     {
01782         ssl->nb_zero++;
01783 
01784         /*
01785          * Three or more empty messages may be a DoS attack
01786          * (excessive CPU consumption).
01787          */
01788         if( ssl->nb_zero > 3 )
01789         {
01790             SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
01791                                 "messages, possible DoS attack" ) );
01792             return( POLARSSL_ERR_SSL_INVALID_MAC );
01793         }
01794     }
01795     else
01796         ssl->nb_zero = 0;
01797 
01798     for( i = 8; i > 0; i-- )
01799         if( ++ssl->in_ctr[i - 1] != 0 )
01800             break;
01801 
01802     /* The loops goes to its end iff the counter is wrapping */
01803     if( i == 0 )
01804     {
01805         SSL_DEBUG_MSG( 1, ( "incoming message counter would wrap" ) );
01806         return( POLARSSL_ERR_SSL_COUNTER_WRAPPING );
01807     }
01808 
01809     SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
01810 
01811     return( 0 );
01812 }
01813 
01814 #if defined(POLARSSL_ZLIB_SUPPORT)
01815 /*
01816  * Compression/decompression functions
01817  */
01818 static int ssl_compress_buf( ssl_context *ssl )
01819 {
01820     int ret;
01821     unsigned char *msg_post = ssl->out_msg;
01822     size_t len_pre = ssl->out_msglen;
01823     unsigned char *msg_pre = ssl->compress_buf;
01824 
01825     SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
01826 
01827     if( len_pre == 0 )
01828         return( 0 );
01829 
01830     memcpy( msg_pre, ssl->out_msg, len_pre );
01831 
01832     SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
01833                    ssl->out_msglen ) );
01834 
01835     SSL_DEBUG_BUF( 4, "before compression: output payload",
01836                    ssl->out_msg, ssl->out_msglen );
01837 
01838     ssl->transform_out->ctx_deflate.next_in = msg_pre;
01839     ssl->transform_out->ctx_deflate.avail_in = len_pre;
01840     ssl->transform_out->ctx_deflate.next_out = msg_post;
01841     ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN;
01842 
01843     ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
01844     if( ret != Z_OK )
01845     {
01846         SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
01847         return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
01848     }
01849 
01850     ssl->out_msglen = SSL_BUFFER_LEN -
01851                       ssl->transform_out->ctx_deflate.avail_out;
01852 
01853     SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
01854                    ssl->out_msglen ) );
01855 
01856     SSL_DEBUG_BUF( 4, "after compression: output payload",
01857                    ssl->out_msg, ssl->out_msglen );
01858 
01859     SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
01860 
01861     return( 0 );
01862 }
01863 
01864 static int ssl_decompress_buf( ssl_context *ssl )
01865 {
01866     int ret;
01867     unsigned char *msg_post = ssl->in_msg;
01868     size_t len_pre = ssl->in_msglen;
01869     unsigned char *msg_pre = ssl->compress_buf;
01870 
01871     SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
01872 
01873     if( len_pre == 0 )
01874         return( 0 );
01875 
01876     memcpy( msg_pre, ssl->in_msg, len_pre );
01877 
01878     SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
01879                    ssl->in_msglen ) );
01880 
01881     SSL_DEBUG_BUF( 4, "before decompression: input payload",
01882                    ssl->in_msg, ssl->in_msglen );
01883 
01884     ssl->transform_in->ctx_inflate.next_in = msg_pre;
01885     ssl->transform_in->ctx_inflate.avail_in = len_pre;
01886     ssl->transform_in->ctx_inflate.next_out = msg_post;
01887     ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN;
01888 
01889     ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
01890     if( ret != Z_OK )
01891     {
01892         SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
01893         return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
01894     }
01895 
01896     ssl->in_msglen = SSL_MAX_CONTENT_LEN -
01897                      ssl->transform_in->ctx_inflate.avail_out;
01898 
01899     SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
01900                    ssl->in_msglen ) );
01901 
01902     SSL_DEBUG_BUF( 4, "after decompression: input payload",
01903                    ssl->in_msg, ssl->in_msglen );
01904 
01905     SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
01906 
01907     return( 0 );
01908 }
01909 #endif /* POLARSSL_ZLIB_SUPPORT */
01910 
01911 /*
01912  * Fill the input message buffer
01913  */
01914 int ssl_fetch_input ( ssl_context *ssl, size_t nb_want )
01915 {
01916     int ret;
01917     size_t len;
01918 
01919     SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
01920 
01921     if( nb_want > SSL_BUFFER_LEN - 8 )
01922     {
01923         SSL_DEBUG_MSG( 1, ( "requesting more data than fits" ) );
01924         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
01925     }
01926 
01927     while( ssl->in_left < nb_want )
01928     {
01929         len = nb_want - ssl->in_left;
01930         ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
01931 
01932         SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
01933                        ssl->in_left, nb_want ) );
01934         SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
01935 
01936         if( ret == 0 )
01937             return( POLARSSL_ERR_SSL_CONN_EOF );
01938 
01939         if( ret < 0 )
01940             return( ret );
01941 
01942         ssl->in_left += ret;
01943     }
01944 
01945     SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
01946 
01947     return( 0 );
01948 }
01949 
01950 /*
01951  * Flush any data not yet written
01952  */
01953 int ssl_flush_output( ssl_context *ssl )
01954 {
01955     int ret;
01956     unsigned char *buf;
01957 
01958     SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
01959 
01960     while( ssl->out_left > 0 )
01961     {
01962         SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
01963                        5 + ssl->out_msglen, ssl->out_left ) );
01964 
01965         buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
01966         ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
01967 
01968         SSL_DEBUG_RET( 2, "ssl->f_send", ret );
01969 
01970         if( ret <= 0 )
01971             return( ret );
01972 
01973         ssl->out_left -= ret;
01974     }
01975 
01976     SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
01977 
01978     return( 0 );
01979 }
01980 
01981 /*
01982  * Record layer functions
01983  */
01984 int ssl_write_record( ssl_context *ssl )
01985 {
01986     int ret, done = 0;
01987     size_t len = ssl->out_msglen;
01988 
01989     SSL_DEBUG_MSG( 2, ( "=> write record" ) );
01990 
01991     if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
01992     {
01993         ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
01994         ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >>  8 );
01995         ssl->out_msg[3] = (unsigned char)( ( len - 4 )       );
01996 
01997         if( ssl->out_msg[0] != SSL_HS_HELLO_REQUEST )
01998             ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
01999     }
02000 
02001 #if defined(POLARSSL_ZLIB_SUPPORT)
02002     if( ssl->transform_out != NULL &&
02003         ssl->session_out->compression == SSL_COMPRESS_DEFLATE )
02004     {
02005         if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
02006         {
02007             SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
02008             return( ret );
02009         }
02010 
02011         len = ssl->out_msglen;
02012     }
02013 #endif /*POLARSSL_ZLIB_SUPPORT */
02014 
02015 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
02016     if( ssl_hw_record_write != NULL)
02017     {
02018         SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) );
02019 
02020         ret = ssl_hw_record_write( ssl );
02021         if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
02022         {
02023             SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret );
02024             return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
02025         }
02026 
02027         if( ret == 0 )
02028             done = 1;
02029     }
02030 #endif /* POLARSSL_SSL_HW_RECORD_ACCEL */
02031     if( !done )
02032     {
02033         ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
02034         ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
02035         ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
02036         ssl->out_hdr[3] = (unsigned char)( len >> 8 );
02037         ssl->out_hdr[4] = (unsigned char)( len      );
02038 
02039         if( ssl->transform_out != NULL )
02040         {
02041             if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
02042             {
02043                 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
02044                 return( ret );
02045             }
02046 
02047             len = ssl->out_msglen;
02048             ssl->out_hdr[3] = (unsigned char)( len >> 8 );
02049             ssl->out_hdr[4] = (unsigned char)( len      );
02050         }
02051 
02052         ssl->out_left = 5 + ssl->out_msglen;
02053 
02054         SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
02055                             "version = [%d:%d], msglen = %d",
02056                        ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
02057                      ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
02058 
02059         SSL_DEBUG_BUF( 4, "output record sent to network",
02060                        ssl->out_hdr, 5 + ssl->out_msglen );
02061     }
02062 
02063     if( ( ret = ssl_flush_output( ssl ) ) != 0 )
02064     {
02065         SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
02066         return( ret );
02067     }
02068 
02069     SSL_DEBUG_MSG( 2, ( "<= write record" ) );
02070 
02071     return( 0 );
02072 }
02073 
02074 int ssl_read_record ( ssl_context *ssl )
02075 {
02076     int ret, done = 0;
02077 
02078     SSL_DEBUG_MSG( 2, ( "=> read record" ) );
02079 
02080     SSL_DEBUG_BUF( 4, "input record from network",
02081                    ssl->in_hdr, 5 + ssl->in_msglen );
02082 
02083     if( ssl->in_hslen != 0 &&
02084         ssl->in_hslen < ssl->in_msglen )
02085     {
02086         /*
02087          * Get next Handshake message in the current record
02088          */
02089         ssl->in_msglen -= ssl->in_hslen;
02090 
02091         memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
02092                  ssl->in_msglen );
02093 
02094         ssl->in_hslen  = 4;
02095         ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
02096 
02097         SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
02098                             " %d, type = %d, hslen = %d",
02099                        ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
02100 
02101         if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
02102         {
02103             SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
02104             return( POLARSSL_ERR_SSL_INVALID_RECORD );
02105         }
02106 
02107         if( ssl->in_msglen < ssl->in_hslen )
02108         {
02109             SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
02110             return( POLARSSL_ERR_SSL_INVALID_RECORD );
02111         }
02112 
02113         if( ssl->state != SSL_HANDSHAKE_OVER )
02114             ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
02115 
02116         return( 0 );
02117     }
02118 
02119     ssl->in_hslen = 0;
02120 
02121     /*
02122      * Read the record header and validate it
02123      */
02124     if( ( ret = ssl_fetch_input ( ssl, 5 ) ) != 0 )
02125     {
02126         SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
02127         return( ret );
02128     }
02129 
02130     ssl->in_msgtype =  ssl->in_hdr[0];
02131     ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
02132 
02133     SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
02134                         "version = [%d:%d], msglen = %d",
02135                      ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
02136                    ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
02137 
02138     if( ssl->in_hdr[1] != ssl->major_ver )
02139     {
02140         SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
02141         return( POLARSSL_ERR_SSL_INVALID_RECORD );
02142     }
02143 
02144     if( ssl->in_hdr[2] > ssl->max_minor_ver )
02145     {
02146         SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
02147         return( POLARSSL_ERR_SSL_INVALID_RECORD );
02148     }
02149 
02150     /* Sanity check (outer boundaries) */
02151     if( ssl->in_msglen < 1 || ssl->in_msglen > SSL_BUFFER_LEN - 13 )
02152     {
02153         SSL_DEBUG_MSG( 1, ( "bad message length" ) );
02154         return( POLARSSL_ERR_SSL_INVALID_RECORD );
02155     }
02156 
02157     /*
02158      * Make sure the message length is acceptable for the current transform
02159      * and protocol version.
02160      */
02161     if( ssl->transform_in == NULL )
02162     {
02163         if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
02164         {
02165             SSL_DEBUG_MSG( 1, ( "bad message length" ) );
02166             return( POLARSSL_ERR_SSL_INVALID_RECORD );
02167         }
02168     }
02169     else
02170     {
02171         if( ssl->in_msglen < ssl->transform_in->minlen )
02172         {
02173             SSL_DEBUG_MSG( 1, ( "bad message length" ) );
02174             return( POLARSSL_ERR_SSL_INVALID_RECORD );
02175         }
02176 
02177 #if defined(POLARSSL_SSL_PROTO_SSL3)
02178         if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
02179             ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN )
02180         {
02181             SSL_DEBUG_MSG( 1, ( "bad message length" ) );
02182             return( POLARSSL_ERR_SSL_INVALID_RECORD );
02183         }
02184 #endif
02185 
02186 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
02187     defined(POLARSSL_SSL_PROTO_TLS1_2)
02188         /*
02189          * TLS encrypted messages can have up to 256 bytes of padding
02190          */
02191         if( ssl->minor_ver >= SSL_MINOR_VERSION_1 &&
02192             ssl->in_msglen > ssl->transform_in->minlen +
02193                              SSL_MAX_CONTENT_LEN + 256 )
02194         {
02195             SSL_DEBUG_MSG( 1, ( "bad message length" ) );
02196             return( POLARSSL_ERR_SSL_INVALID_RECORD );
02197         }
02198 #endif
02199     }
02200 
02201     /*
02202      * Read and optionally decrypt the message contents
02203      */
02204     if( ( ret = ssl_fetch_input ( ssl, 5 + ssl->in_msglen ) ) != 0 )
02205     {
02206         SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
02207         return( ret );
02208     }
02209 
02210     SSL_DEBUG_BUF( 4, "input record from network",
02211                    ssl->in_hdr, 5 + ssl->in_msglen );
02212 
02213 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
02214     if( ssl_hw_record_read != NULL)
02215     {
02216         SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) );
02217 
02218         ret = ssl_hw_record_read( ssl );
02219         if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
02220         {
02221             SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret );
02222             return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
02223         }
02224 
02225         if( ret == 0 )
02226             done = 1;
02227     }
02228 #endif /* POLARSSL_SSL_HW_RECORD_ACCEL */
02229     if( !done && ssl->transform_in != NULL )
02230     {
02231         if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
02232         {
02233 #if defined(POLARSSL_SSL_ALERT_MESSAGES)
02234             if( ret == POLARSSL_ERR_SSL_INVALID_MAC )
02235             {
02236                 ssl_send_alert_message( ssl,
02237                                         SSL_ALERT_LEVEL_FATAL,
02238                                         SSL_ALERT_MSG_BAD_RECORD_MAC );
02239             }
02240 #endif
02241             SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
02242             return( ret );
02243         }
02244 
02245         SSL_DEBUG_BUF( 4, "input payload after decrypt",
02246                        ssl->in_msg, ssl->in_msglen );
02247 
02248         if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
02249         {
02250             SSL_DEBUG_MSG( 1, ( "bad message length" ) );
02251             return( POLARSSL_ERR_SSL_INVALID_RECORD );
02252         }
02253     }
02254 
02255 #if defined(POLARSSL_ZLIB_SUPPORT)
02256     if( ssl->transform_in != NULL &&
02257         ssl->session_in->compression == SSL_COMPRESS_DEFLATE )
02258     {
02259         if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
02260         {
02261             SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
02262             return( ret );
02263         }
02264 
02265         ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
02266         ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen      );
02267     }
02268 #endif /* POLARSSL_ZLIB_SUPPORT */
02269 
02270     if( ssl->in_msgtype != SSL_MSG_HANDSHAKE &&
02271         ssl->in_msgtype != SSL_MSG_ALERT &&
02272         ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC &&
02273         ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
02274     {
02275         SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
02276 
02277         if( ( ret = ssl_send_alert_message( ssl,
02278                         SSL_ALERT_LEVEL_FATAL,
02279                         SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
02280         {
02281             return( ret );
02282         }
02283 
02284         return( POLARSSL_ERR_SSL_INVALID_RECORD );
02285     }
02286 
02287     if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
02288     {
02289         ssl->in_hslen  = 4;
02290         ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
02291 
02292         SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
02293                             " %d, type = %d, hslen = %d",
02294                        ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
02295 
02296         /*
02297          * Additional checks to validate the handshake header
02298          */
02299         if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
02300         {
02301             SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
02302             return( POLARSSL_ERR_SSL_INVALID_RECORD );
02303         }
02304 
02305         if( ssl->in_msglen < ssl->in_hslen )
02306         {
02307             SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
02308             return( POLARSSL_ERR_SSL_INVALID_RECORD );
02309         }
02310 
02311         if( ssl->state != SSL_HANDSHAKE_OVER )
02312             ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
02313     }
02314 
02315     if( ssl->in_msgtype == SSL_MSG_ALERT )
02316     {
02317         SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
02318                        ssl->in_msg[0], ssl->in_msg[1] ) );
02319 
02320         /*
02321          * Ignore non-fatal alerts, except close_notify
02322          */
02323         if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL )
02324         {
02325             SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
02326                            ssl->in_msg[1] ) );
02327             /**
02328              * Subtract from error code as ssl->in_msg[1] is 7-bit positive
02329              * error identifier.
02330              */
02331             return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE );
02332         }
02333 
02334         if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
02335             ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY )
02336         {
02337             SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
02338             return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
02339         }
02340     }
02341 
02342     ssl->in_left = 0;
02343 
02344     SSL_DEBUG_MSG( 2, ( "<= read record" ) );
02345 
02346     return( 0 );
02347 }
02348 
02349 int ssl_send_fatal_handshake_failure( ssl_context *ssl )
02350 {
02351     int ret;
02352 
02353     if( ( ret = ssl_send_alert_message( ssl,
02354                     SSL_ALERT_LEVEL_FATAL,
02355                     SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
02356     {
02357         return( ret );
02358     }
02359 
02360     return( 0 );
02361 }
02362 
02363 int ssl_send_alert_message( ssl_context *ssl,
02364                             unsigned char level,
02365                             unsigned char message )
02366 {
02367     int ret;
02368 
02369     SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
02370 
02371     ssl->out_msgtype = SSL_MSG_ALERT;
02372     ssl->out_msglen = 2;
02373     ssl->out_msg[0] = level;
02374     ssl->out_msg[1] = message;
02375 
02376     if( ( ret = ssl_write_record( ssl ) ) != 0 )
02377     {
02378         SSL_DEBUG_RET( 1, "ssl_write_record", ret );
02379         return( ret );
02380     }
02381 
02382     SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
02383 
02384     return( 0 );
02385 }
02386 
02387 /*
02388  * Handshake functions
02389  */
02390 #if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)         && \
02391     !defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)     && \
02392     !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)     && \
02393     !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)   && \
02394     !defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \
02395     !defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED)    && \
02396     !defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
02397 int ssl_write_certificate( ssl_context *ssl )
02398 {
02399     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
02400     const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
02401 
02402     SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
02403 
02404     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
02405         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
02406         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
02407     {
02408         SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
02409         ssl->state++;
02410         return( 0 );
02411     }
02412 
02413     SSL_DEBUG_MSG( 1, ( "should not happen" ) );
02414     return( ret );
02415 }
02416 
02417 int ssl_parse_certificate( ssl_context *ssl )
02418 {
02419     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
02420     const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
02421 
02422     SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
02423 
02424     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
02425         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
02426         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
02427     {
02428         SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
02429         ssl->state++;
02430         return( 0 );
02431     }
02432 
02433     SSL_DEBUG_MSG( 1, ( "should not happen" ) );
02434     return( ret );
02435 }
02436 #else
02437 int ssl_write_certificate( ssl_context *ssl )
02438 {
02439     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
02440     size_t i, n;
02441     const x509_crt *crt;
02442     const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
02443 
02444     SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
02445 
02446     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
02447         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
02448         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
02449     {
02450         SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
02451         ssl->state++;
02452         return( 0 );
02453     }
02454 
02455     if( ssl->endpoint == SSL_IS_CLIENT )
02456     {
02457         if( ssl->client_auth == 0 )
02458         {
02459             SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
02460             ssl->state++;
02461             return( 0 );
02462         }
02463 
02464 #if defined(POLARSSL_SSL_PROTO_SSL3)
02465         /*
02466          * If using SSLv3 and got no cert, send an Alert message
02467          * (otherwise an empty Certificate message will be sent).
02468          */
02469         if( ssl_own_cert( ssl )  == NULL &&
02470             ssl->minor_ver == SSL_MINOR_VERSION_0 )
02471         {
02472             ssl->out_msglen  = 2;
02473             ssl->out_msgtype = SSL_MSG_ALERT;
02474             ssl->out_msg[0]  = SSL_ALERT_LEVEL_WARNING;
02475             ssl->out_msg[1]  = SSL_ALERT_MSG_NO_CERT;
02476 
02477             SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
02478             goto write_msg;
02479         }
02480 #endif /* POLARSSL_SSL_PROTO_SSL3 */
02481     }
02482     else /* SSL_IS_SERVER */
02483     {
02484         if( ssl_own_cert( ssl ) == NULL )
02485         {
02486             SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
02487             return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
02488         }
02489     }
02490 
02491     SSL_DEBUG_CRT( 3, "own certificate", ssl_own_cert( ssl ) );
02492 
02493     /*
02494      *     0  .  0    handshake type
02495      *     1  .  3    handshake length
02496      *     4  .  6    length of all certs
02497      *     7  .  9    length of cert. 1
02498      *    10  . n-1   peer certificate
02499      *     n  . n+2   length of cert. 2
02500      *    n+3 . ...   upper level cert, etc.
02501      */
02502     i = 7;
02503     crt = ssl_own_cert( ssl );
02504 
02505     while( crt != NULL )
02506     {
02507         n = crt->raw.len;
02508         if( n > SSL_MAX_CONTENT_LEN - 3 - i )
02509         {
02510             SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
02511                            i + 3 + n, SSL_MAX_CONTENT_LEN ) );
02512             return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
02513         }
02514 
02515         ssl->out_msg[i    ] = (unsigned char)( n >> 16 );
02516         ssl->out_msg[i + 1] = (unsigned char)( n >>  8 );
02517         ssl->out_msg[i + 2] = (unsigned char)( n       );
02518 
02519         i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
02520         i += n; crt = crt->next;
02521     }
02522 
02523     ssl->out_msg[4]  = (unsigned char)( ( i - 7 ) >> 16 );
02524     ssl->out_msg[5]  = (unsigned char)( ( i - 7 ) >>  8 );
02525     ssl->out_msg[6]  = (unsigned char)( ( i - 7 )       );
02526 
02527     ssl->out_msglen  = i;
02528     ssl->out_msgtype = SSL_MSG_HANDSHAKE;
02529     ssl->out_msg[0]  = SSL_HS_CERTIFICATE;
02530 
02531 #if defined(POLARSSL_SSL_PROTO_SSL3)
02532 write_msg:
02533 #endif
02534 
02535     ssl->state++;
02536 
02537     if( ( ret = ssl_write_record( ssl ) ) != 0 )
02538     {
02539         SSL_DEBUG_RET( 1, "ssl_write_record", ret );
02540         return( ret );
02541     }
02542 
02543     SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
02544 
02545     return( ret );
02546 }
02547 
02548 int ssl_parse_certificate( ssl_context *ssl )
02549 {
02550     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
02551     size_t i, n;
02552     const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
02553 
02554     SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
02555 
02556     if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
02557         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
02558         ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
02559     {
02560         SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
02561         ssl->state++;
02562         return( 0 );
02563     }
02564 
02565     if( ssl->endpoint == SSL_IS_SERVER &&
02566         ( ssl->authmode == SSL_VERIFY_NONE ||
02567           ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ) )
02568     {
02569         ssl->session_negotiate->verify_result = BADCERT_SKIP_VERIFY;
02570         SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
02571         ssl->state++;
02572         return( 0 );
02573     }
02574 
02575     if( ( ret = ssl_read_record ( ssl ) ) != 0 )
02576     {
02577         SSL_DEBUG_RET( 1, "ssl_read_record", ret );
02578         return( ret );
02579     }
02580 
02581     ssl->state++;
02582 
02583 #if defined(POLARSSL_SSL_PROTO_SSL3)
02584     /*
02585      * Check if the client sent an empty certificate
02586      */
02587     if( ssl->endpoint  == SSL_IS_SERVER &&
02588         ssl->minor_ver == SSL_MINOR_VERSION_0 )
02589     {
02590         if( ssl->in_msglen  == 2                        &&
02591             ssl->in_msgtype == SSL_MSG_ALERT            &&
02592             ssl->in_msg[0]  == SSL_ALERT_LEVEL_WARNING  &&
02593             ssl->in_msg[1]  == SSL_ALERT_MSG_NO_CERT )
02594         {
02595             SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
02596 
02597             ssl->session_negotiate->verify_result = BADCERT_MISSING;
02598             if( ssl->authmode == SSL_VERIFY_OPTIONAL )
02599                 return( 0 );
02600             else
02601                 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
02602         }
02603     }
02604 #endif /* POLARSSL_SSL_PROTO_SSL3 */
02605 
02606 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
02607     defined(POLARSSL_SSL_PROTO_TLS1_2)
02608     if( ssl->endpoint  == SSL_IS_SERVER &&
02609         ssl->minor_ver != SSL_MINOR_VERSION_0 )
02610     {
02611         if( ssl->in_hslen   == 7                    &&
02612             ssl->in_msgtype == SSL_MSG_HANDSHAKE    &&
02613             ssl->in_msg[0]  == SSL_HS_CERTIFICATE   &&
02614             memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
02615         {
02616             SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
02617 
02618             ssl->session_negotiate->verify_result = BADCERT_MISSING;
02619             if( ssl->authmode == SSL_VERIFY_REQUIRED )
02620                 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
02621             else
02622                 return( 0 );
02623         }
02624     }
02625 #endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
02626           POLARSSL_SSL_PROTO_TLS1_2 */
02627 
02628     if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
02629     {
02630         SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
02631         return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
02632     }
02633 
02634     if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
02635     {
02636         SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
02637         return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
02638     }
02639 
02640     /*
02641      * Same message structure as in ssl_write_certificate()
02642      */
02643     n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
02644 
02645     if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
02646     {
02647         SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
02648         return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
02649     }
02650 
02651     /* In case we tried to reuse a session but it failed */
02652     if( ssl->session_negotiate->peer_cert != NULL )
02653     {
02654         x509_crt_free( ssl->session_negotiate->peer_cert );
02655         polarssl_free( ssl->session_negotiate->peer_cert );
02656     }
02657 
02658     if( ( ssl->session_negotiate->peer_cert = (x509_crt *) polarssl_malloc(
02659                     sizeof( x509_crt ) ) ) == NULL )
02660     {
02661         SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
02662                        sizeof( x509_crt ) ) );
02663         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
02664     }
02665 
02666     x509_crt_init( ssl->session_negotiate->peer_cert );
02667 
02668     i = 7;
02669 
02670     while( i < ssl->in_hslen )
02671     {
02672         if( ssl->in_msg[i] != 0 )
02673         {
02674             SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
02675             return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
02676         }
02677 
02678         n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
02679             | (unsigned int) ssl->in_msg[i + 2];
02680         i += 3;
02681 
02682         if( n < 128 || i + n > ssl->in_hslen )
02683         {
02684             SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
02685             return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
02686         }
02687 
02688         ret = x509_crt_parse_der( ssl->session_negotiate->peer_cert,
02689                                   ssl->in_msg + i, n );
02690         if( ret != 0 )
02691         {
02692             SSL_DEBUG_RET( 1, " x509_crt_parse_der", ret );
02693             return( ret );
02694         }
02695 
02696         i += n;
02697     }
02698 
02699     SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
02700 
02701     /*
02702      * On client, make sure the server cert doesn't change during renego to
02703      * avoid "triple handshake" attack: https://secure-resumption.com/
02704      */
02705     if( ssl->endpoint == SSL_IS_CLIENT &&
02706         ssl->renegotiation == SSL_RENEGOTIATION )
02707     {
02708         if( ssl->session->peer_cert == NULL )
02709         {
02710             SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) );
02711             return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
02712         }
02713 
02714         if( ssl->session->peer_cert->raw.len !=
02715             ssl->session_negotiate->peer_cert->raw.len ||
02716             memcmp( ssl->session->peer_cert->raw.p,
02717                     ssl->session_negotiate->peer_cert->raw.p,
02718                     ssl->session->peer_cert->raw.len ) != 0 )
02719         {
02720             SSL_DEBUG_MSG( 1, ( "server cert changed during renegotiation" ) );
02721             return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
02722         }
02723     }
02724 
02725     if( ssl->authmode != SSL_VERIFY_NONE )
02726     {
02727         if( ssl->ca_chain == NULL )
02728         {
02729             SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
02730             return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
02731         }
02732 
02733         /*
02734          * Main check: verify certificate
02735          */
02736         ret = x509_crt_verify( ssl->session_negotiate->peer_cert,
02737                                ssl->ca_chain, ssl->ca_crl, ssl->peer_cn,
02738                               &ssl->session_negotiate->verify_result,
02739                                ssl->f_vrfy, ssl->p_vrfy );
02740 
02741         if( ret != 0 )
02742         {
02743             SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
02744         }
02745 
02746         /*
02747          * Secondary checks: always done, but change 'ret' only if it was 0
02748          */
02749 
02750 #if defined(POLARSSL_SSL_SET_CURVES)
02751         {
02752             pk_context *pk = &ssl->session_negotiate->peer_cert->pk;
02753 
02754             /* If certificate uses an EC key, make sure the curve is OK */
02755             if( pk_can_do( pk, POLARSSL_PK_ECKEY ) &&
02756                 ! ssl_curve_is_acceptable( ssl, pk_ec( *pk )->grp.id ) )
02757             {
02758                 SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) );
02759                 if( ret == 0 )
02760                     ret = POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE;
02761             }
02762         }
02763 #endif /* POLARSSL_SSL_SET_CURVES */
02764 
02765         if( ssl_check_cert_usage( ssl->session_negotiate->peer_cert,
02766                                   ciphersuite_info,
02767                                   ! ssl->endpoint ) != 0 )
02768         {
02769             SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) );
02770             if( ret == 0 )
02771                 ret = POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE;
02772         }
02773 
02774         if( ssl->authmode != SSL_VERIFY_REQUIRED )
02775             ret = 0;
02776     }
02777 
02778     SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
02779 
02780     return( ret );
02781 }
02782 #endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED
02783           !POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED
02784           !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED
02785           !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED
02786           !POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
02787           !POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED
02788           !POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
02789 
02790 int ssl_write_change_cipher_spec( ssl_context *ssl )
02791 {
02792     int ret;
02793 
02794     SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
02795 
02796     ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
02797     ssl->out_msglen  = 1;
02798     ssl->out_msg[0]  = 1;
02799 
02800     ssl->state++;
02801 
02802     if( ( ret = ssl_write_record( ssl ) ) != 0 )
02803     {
02804         SSL_DEBUG_RET( 1, "ssl_write_record", ret );
02805         return( ret );
02806     }
02807 
02808     SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
02809 
02810     return( 0 );
02811 }
02812 
02813 int ssl_parse_change_cipher_spec( ssl_context *ssl )
02814 {
02815     int ret;
02816 
02817     SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
02818 
02819     if( ( ret = ssl_read_record ( ssl ) ) != 0 )
02820     {
02821         SSL_DEBUG_RET( 1, "ssl_read_record", ret );
02822         return( ret );
02823     }
02824 
02825     if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
02826     {
02827         SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
02828         return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
02829     }
02830 
02831     if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
02832     {
02833         SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
02834         return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
02835     }
02836 
02837     ssl->state++;
02838 
02839     SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
02840 
02841     return( 0 );
02842 }
02843 
02844 void ssl_optimize_checksum( ssl_context *ssl,
02845                             const ssl_ciphersuite_t *ciphersuite_info )
02846 {
02847     ((void) ciphersuite_info);
02848 
02849 #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
02850     defined(POLARSSL_SSL_PROTO_TLS1_1)
02851     if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
02852         ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
02853     else
02854 #endif
02855 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
02856 #if defined(POLARSSL_SHA512_C)
02857     if( ciphersuite_info->mac == POLARSSL_MD_SHA384 )
02858         ssl->handshake->update_checksum = ssl_update_checksum_sha384;
02859     else
02860 #endif
02861 #if defined(POLARSSL_SHA256_C)
02862     if( ciphersuite_info->mac != POLARSSL_MD_SHA384 )
02863         ssl->handshake->update_checksum = ssl_update_checksum_sha256;
02864     else
02865 #endif
02866 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
02867         /* Should never happen */
02868         return;
02869 }
02870 
02871 static void ssl_update_checksum_start( ssl_context *ssl,
02872                                        const unsigned char *buf, size_t len )
02873 {
02874 #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
02875     defined(POLARSSL_SSL_PROTO_TLS1_1)
02876      md5_update( &ssl->handshake->fin_md5 , buf, len );
02877     sha1_update( &ssl->handshake->fin_sha1, buf, len );
02878 #endif
02879 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
02880 #if defined(POLARSSL_SHA256_C)
02881     sha256_update( &ssl->handshake->fin_sha256, buf, len );
02882 #endif
02883 #if defined(POLARSSL_SHA512_C)
02884     sha512_update( &ssl->handshake->fin_sha512, buf, len );
02885 #endif
02886 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
02887 }
02888 
02889 #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
02890     defined(POLARSSL_SSL_PROTO_TLS1_1)
02891 static void ssl_update_checksum_md5sha1( ssl_context *ssl,
02892                                          const unsigned char *buf, size_t len )
02893 {
02894      md5_update( &ssl->handshake->fin_md5 , buf, len );
02895     sha1_update( &ssl->handshake->fin_sha1, buf, len );
02896 }
02897 #endif
02898 
02899 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
02900 #if defined(POLARSSL_SHA256_C)
02901 static void ssl_update_checksum_sha256( ssl_context *ssl,
02902                                         const unsigned char *buf, size_t len )
02903 {
02904     sha256_update( &ssl->handshake->fin_sha256, buf, len );
02905 }
02906 #endif
02907 
02908 #if defined(POLARSSL_SHA512_C)
02909 static void ssl_update_checksum_sha384( ssl_context *ssl,
02910                                         const unsigned char *buf, size_t len )
02911 {
02912     sha512_update( &ssl->handshake->fin_sha512, buf, len );
02913 }
02914 #endif
02915 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
02916 
02917 #if defined(POLARSSL_SSL_PROTO_SSL3)
02918 static void ssl_calc_finished_ssl(
02919                 ssl_context *ssl, unsigned char *buf, int from )
02920 {
02921     const char *sender;
02922     md5_context  md5;
02923     sha1_context sha1;
02924 
02925     unsigned char padbuf[48];
02926     unsigned char md5sum[16];
02927     unsigned char sha1sum[20];
02928 
02929     ssl_session *session = ssl->session_negotiate;
02930     if( !session )
02931         session = ssl->session;
02932 
02933     SSL_DEBUG_MSG( 2, ( "=> calc  finished ssl" ) );
02934 
02935     memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context)  );
02936     memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
02937 
02938     /*
02939      * SSLv3:
02940      *   hash =
02941      *      MD5( master + pad2 +
02942      *          MD5( handshake + sender + master + pad1 ) )
02943      *   + SHA1( master + pad2 +
02944      *         SHA1( handshake + sender + master + pad1 ) )
02945      */
02946 
02947 #if !defined(POLARSSL_MD5_ALT)
02948     SSL_DEBUG_BUF( 4, "finished  md5 state", (unsigned char *)
02949                     md5.state , sizeof(  md5.state  ) );
02950 #endif
02951 
02952 #if !defined(POLARSSL_SHA1_ALT)
02953     SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
02954                    sha1.state , sizeof( sha1.state  ) );
02955 #endif
02956 
02957     sender = ( from == SSL_IS_CLIENT ) ? "CLNT"
02958                                        : "SRVR";
02959 
02960     memset( padbuf, 0x36, 48 );
02961 
02962     md5_update( &md5, (const unsigned char *) sender, 4 );
02963     md5_update( &md5, session->master, 48 );
02964     md5_update( &md5, padbuf, 48 );
02965     md5_finish( &md5, md5sum );
02966 
02967     sha1_update( &sha1, (const unsigned char *) sender, 4 );
02968     sha1_update( &sha1, session->master, 48 );
02969     sha1_update( &sha1, padbuf, 40 );
02970     sha1_finish( &sha1, sha1sum );
02971 
02972     memset( padbuf, 0x5C, 48 );
02973 
02974     md5_starts( &md5 );
02975     md5_update( &md5, session->master, 48 );
02976     md5_update( &md5, padbuf, 48 );
02977     md5_update( &md5, md5sum, 16 );
02978     md5_finish( &md5, buf );
02979 
02980     sha1_starts( &sha1 );
02981     sha1_update( &sha1, session->master, 48 );
02982     sha1_update( &sha1, padbuf , 40 );
02983     sha1_update( &sha1, sha1sum, 20 );
02984     sha1_finish( &sha1, buf + 16 );
02985 
02986     SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
02987 
02988     memset(  &md5, 0, sizeof(  md5_context ) );
02989     memset( &sha1, 0, sizeof( sha1_context ) );
02990 
02991     memset(  padbuf, 0, sizeof(  padbuf ) );
02992     memset(  md5sum, 0, sizeof(  md5sum ) );
02993     memset( sha1sum, 0, sizeof( sha1sum ) );
02994 
02995     SSL_DEBUG_MSG( 2, ( "<= calc  finished" ) );
02996 }
02997 #endif /* POLARSSL_SSL_PROTO_SSL3 */
02998 
02999 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
03000 static void ssl_calc_finished_tls(
03001                 ssl_context *ssl, unsigned char *buf, int from )
03002 {
03003     int len = 12;
03004     const char *sender;
03005     md5_context  md5;
03006     sha1_context sha1;
03007     unsigned char padbuf[36];
03008 
03009     ssl_session *session = ssl->session_negotiate;
03010     if( !session )
03011         session = ssl->session;
03012 
03013     SSL_DEBUG_MSG( 2, ( "=> calc  finished tls" ) );
03014 
03015     memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context)  );
03016     memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
03017 
03018     /*
03019      * TLSv1:
03020      *   hash = PRF( master, finished_label,
03021      *               MD5( handshake ) + SHA1( handshake ) )[0..11]
03022      */
03023 
03024 #if !defined(POLARSSL_MD5_ALT)
03025     SSL_DEBUG_BUF( 4, "finished  md5 state", (unsigned char *)
03026                     md5.state , sizeof(  md5.state  ) );
03027 #endif
03028 
03029 #if !defined(POLARSSL_SHA1_ALT)
03030     SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
03031                    sha1.state , sizeof( sha1.state  ) );
03032 #endif
03033 
03034     sender = ( from == SSL_IS_CLIENT )
03035              ? "client finished"
03036              : "server finished";
03037 
03038     md5_finish(  &md5, padbuf );
03039     sha1_finish( &sha1, padbuf + 16 );
03040 
03041     ssl->handshake->tls_prf( session->master, 48, sender,
03042                              padbuf, 36, buf, len );
03043 
03044     SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
03045 
03046     memset(  &md5, 0, sizeof(  md5_context ) );
03047     memset( &sha1, 0, sizeof( sha1_context ) );
03048 
03049     memset(  padbuf, 0, sizeof(  padbuf ) );
03050 
03051     SSL_DEBUG_MSG( 2, ( "<= calc  finished" ) );
03052 }
03053 #endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 */
03054 
03055 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
03056 #if defined(POLARSSL_SHA256_C)
03057 static void ssl_calc_finished_tls_sha256(
03058                 ssl_context *ssl, unsigned char *buf, int from )
03059 {
03060     int len = 12;
03061     const char *sender;
03062     sha256_context sha256;
03063     unsigned char padbuf[32];
03064 
03065     ssl_session *session = ssl->session_negotiate;
03066     if( !session )
03067         session = ssl->session;
03068 
03069     SSL_DEBUG_MSG( 2, ( "=> calc  finished tls sha256" ) );
03070 
03071     memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
03072 
03073     /*
03074      * TLSv1.2:
03075      *   hash = PRF( master, finished_label,
03076      *               Hash( handshake ) )[0.11]
03077      */
03078 
03079 #if !defined(POLARSSL_SHA256_ALT)
03080     SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
03081                    sha256.state , sizeof( sha256.state  ) );
03082 #endif
03083 
03084     sender = ( from == SSL_IS_CLIENT )
03085              ? "client finished"
03086              : "server finished";
03087 
03088     sha256_finish( &sha256, padbuf );
03089 
03090     ssl->handshake->tls_prf( session->master, 48, sender,
03091                              padbuf, 32, buf, len );
03092 
03093     SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
03094 
03095     memset( &sha256, 0, sizeof( sha256_context ) );
03096 
03097     memset(  padbuf, 0, sizeof(  padbuf ) );
03098 
03099     SSL_DEBUG_MSG( 2, ( "<= calc  finished" ) );
03100 }
03101 #endif /* POLARSSL_SHA256_C */
03102 
03103 #if defined(POLARSSL_SHA512_C)
03104 static void ssl_calc_finished_tls_sha384(
03105                 ssl_context *ssl, unsigned char *buf, int from )
03106 {
03107     int len = 12;
03108     const char *sender;
03109     sha512_context sha512;
03110     unsigned char padbuf[48];
03111 
03112     ssl_session *session = ssl->session_negotiate;
03113     if( !session )
03114         session = ssl->session;
03115 
03116     SSL_DEBUG_MSG( 2, ( "=> calc  finished tls sha384" ) );
03117 
03118     memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
03119 
03120     /*
03121      * TLSv1.2:
03122      *   hash = PRF( master, finished_label,
03123      *               Hash( handshake ) )[0.11]
03124      */
03125 
03126 #if !defined(POLARSSL_SHA512_ALT)
03127     SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
03128                    sha512.state , sizeof( sha512.state  ) );
03129 #endif
03130 
03131     sender = ( from == SSL_IS_CLIENT )
03132              ? "client finished"
03133              : "server finished";
03134 
03135     sha512_finish( &sha512, padbuf );
03136 
03137     ssl->handshake->tls_prf( session->master, 48, sender,
03138                              padbuf, 48, buf, len );
03139 
03140     SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
03141 
03142     memset( &sha512, 0, sizeof( sha512_context ) );
03143 
03144     memset(  padbuf, 0, sizeof(  padbuf ) );
03145 
03146     SSL_DEBUG_MSG( 2, ( "<= calc  finished" ) );
03147 }
03148 #endif /* POLARSSL_SHA512_C */
03149 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
03150 
03151 void ssl_handshake_wrapup( ssl_context *ssl )
03152 {
03153     int resume = ssl->handshake->resume;
03154 
03155     SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
03156 
03157     /*
03158      * Free our handshake params
03159      */
03160     ssl_handshake_free( ssl->handshake );
03161     polarssl_free( ssl->handshake );
03162     ssl->handshake = NULL;
03163 
03164     if( ssl->renegotiation == SSL_RENEGOTIATION )
03165         ssl->renegotiation =  SSL_RENEGOTIATION_DONE;
03166 
03167     /*
03168      * Switch in our now active transform context
03169      */
03170     if( ssl->transform )
03171     {
03172         ssl_transform_free( ssl->transform );
03173         polarssl_free( ssl->transform );
03174     }
03175     ssl->transform = ssl->transform_negotiate;
03176     ssl->transform_negotiate = NULL;
03177 
03178     if( ssl->session )
03179     {
03180         ssl_session_free( ssl->session );
03181         polarssl_free( ssl->session );
03182     }
03183     ssl->session = ssl->session_negotiate;
03184     ssl->session_negotiate = NULL;
03185 
03186     /*
03187      * Add cache entry
03188      */
03189     if( ssl->f_set_cache != NULL &&
03190         ssl->session->length != 0 &&
03191         resume == 0 )
03192     {
03193         if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 )
03194             SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
03195     }
03196 
03197     ssl->state++;
03198 
03199     SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
03200 }
03201 
03202 int ssl_write_finished( ssl_context *ssl )
03203 {
03204     int ret, hash_len;
03205 
03206     SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
03207 
03208     /*
03209      * Set the out_msg pointer to the correct location based on IV length
03210      */
03211     if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
03212     {
03213         ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -
03214                        ssl->transform_negotiate->fixed_ivlen;
03215     }
03216     else
03217         ssl->out_msg = ssl->out_iv;
03218 
03219     ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint );
03220 
03221     // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
03222     hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
03223 
03224     ssl->verify_data_len = hash_len;
03225     memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
03226 
03227     ssl->out_msglen  = 4 + hash_len;
03228     ssl->out_msgtype = SSL_MSG_HANDSHAKE;
03229     ssl->out_msg[0]  = SSL_HS_FINISHED;
03230 
03231     /*
03232      * In case of session resuming, invert the client and server
03233      * ChangeCipherSpec messages order.
03234      */
03235     if( ssl->handshake->resume != 0 )
03236     {
03237         if( ssl->endpoint == SSL_IS_CLIENT )
03238             ssl->state = SSL_HANDSHAKE_WRAPUP;
03239         else
03240             ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
03241     }
03242     else
03243         ssl->state++;
03244 
03245     /*
03246      * Switch to our negotiated transform and session parameters for outbound
03247      * data.
03248      */
03249     SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
03250     ssl->transform_out = ssl->transform_negotiate;
03251     ssl->session_out = ssl->session_negotiate;
03252     memset( ssl->out_ctr, 0, 8 );
03253 
03254 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
03255     if( ssl_hw_record_activate != NULL)
03256     {
03257         if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
03258         {
03259             SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
03260             return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
03261         }
03262     }
03263 #endif
03264 
03265     if( ( ret = ssl_write_record( ssl ) ) != 0 )
03266     {
03267         SSL_DEBUG_RET( 1, "ssl_write_record", ret );
03268         return( ret );
03269     }
03270 
03271     SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
03272 
03273     return( 0 );
03274 }
03275 
03276 int ssl_parse_finished( ssl_context *ssl )
03277 {
03278     int ret;
03279     unsigned int hash_len;
03280     unsigned char buf[36];
03281 
03282     SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
03283 
03284     ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 );
03285 
03286     /*
03287      * Switch to our negotiated transform and session parameters for inbound
03288      * data.
03289      */
03290     SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
03291     ssl->transform_in = ssl->transform_negotiate;
03292     ssl->session_in = ssl->session_negotiate;
03293     memset( ssl->in_ctr, 0, 8 );
03294 
03295     /*
03296      * Set the in_msg pointer to the correct location based on IV length
03297      */
03298     if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
03299     {
03300         ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -
03301                       ssl->transform_negotiate->fixed_ivlen;
03302     }
03303     else
03304         ssl->in_msg = ssl->in_iv;
03305 
03306 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
03307     if( ssl_hw_record_activate != NULL)
03308     {
03309         if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_INBOUND ) ) != 0 )
03310         {
03311             SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
03312             return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
03313         }
03314     }
03315 #endif
03316 
03317     if( ( ret = ssl_read_record ( ssl ) ) != 0 )
03318     {
03319         SSL_DEBUG_RET( 1, "ssl_read_record", ret );
03320         return( ret );
03321     }
03322 
03323     if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
03324     {
03325         SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
03326         return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
03327     }
03328 
03329     // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
03330     hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
03331 
03332     if( ssl->in_msg[0] != SSL_HS_FINISHED ||
03333         ssl->in_hslen  != 4 + hash_len )
03334     {
03335         SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
03336         return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
03337     }
03338 
03339     if( safer_memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
03340     {
03341         SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
03342         return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
03343     }
03344 
03345     ssl->verify_data_len = hash_len;
03346     memcpy( ssl->peer_verify_data, buf, hash_len );
03347 
03348     if( ssl->handshake->resume != 0 )
03349     {
03350         if( ssl->endpoint == SSL_IS_CLIENT )
03351             ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
03352 
03353         if( ssl->endpoint == SSL_IS_SERVER )
03354             ssl->state = SSL_HANDSHAKE_WRAPUP;
03355     }
03356     else
03357         ssl->state++;
03358 
03359     SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
03360 
03361     return( 0 );
03362 }
03363 
03364 static int ssl_handshake_init( ssl_context *ssl )
03365 {
03366     if( ssl->transform_negotiate )
03367         ssl_transform_free( ssl->transform_negotiate );
03368     else
03369     {
03370         ssl->transform_negotiate =
03371             (ssl_transform *) polarssl_malloc( sizeof(ssl_transform) );
03372 
03373         if( ssl->transform_negotiate != NULL )
03374             memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
03375     }
03376 
03377     if( ssl->session_negotiate )
03378         ssl_session_free( ssl->session_negotiate );
03379     else
03380     {
03381         ssl->session_negotiate =
03382             (ssl_session *) polarssl_malloc( sizeof(ssl_session) );
03383 
03384         if( ssl->session_negotiate != NULL )
03385             memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
03386     }
03387 
03388     if( ssl->handshake )
03389         ssl_handshake_free( ssl->handshake );
03390     else
03391     {
03392         ssl->handshake = (ssl_handshake_params *)
03393             polarssl_malloc( sizeof(ssl_handshake_params) );
03394 
03395         if( ssl->handshake != NULL )
03396             memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
03397     }
03398 
03399     if( ssl->handshake == NULL ||
03400         ssl->transform_negotiate == NULL ||
03401         ssl->session_negotiate == NULL )
03402     {
03403         SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) );
03404         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03405     }
03406 
03407 #if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
03408     defined(POLARSSL_SSL_PROTO_TLS1_1)
03409      md5_starts( &ssl->handshake->fin_md5 );
03410     sha1_starts( &ssl->handshake->fin_sha1 );
03411 #endif
03412 #if defined(POLARSSL_SSL_PROTO_TLS1_2)
03413 #if defined(POLARSSL_SHA256_C)
03414     sha256_starts( &ssl->handshake->fin_sha256, 0 );
03415 #endif
03416 #if defined(POLARSSL_SHA512_C)
03417     sha512_starts( &ssl->handshake->fin_sha512, 1 );
03418 #endif
03419 #endif /* POLARSSL_SSL_PROTO_TLS1_2 */
03420 
03421     ssl->handshake->update_checksum = ssl_update_checksum_start;
03422     ssl->handshake->sig_alg = SSL_HASH_SHA1;
03423 
03424 #if defined(POLARSSL_ECDH_C)
03425     ecdh_init( &ssl->handshake->ecdh_ctx );
03426 #endif
03427 
03428 #if defined(POLARSSL_X509_CRT_PARSE_C)
03429     ssl->handshake->key_cert = ssl->key_cert;
03430 #endif
03431 
03432     return( 0 );
03433 }
03434 
03435 /*
03436  * Initialize an SSL context
03437  */
03438 int ssl_init( ssl_context *ssl )
03439 {
03440     int ret;
03441     int len = SSL_BUFFER_LEN;
03442     
03443     void *sptr1 = ssl->f_dbg;
03444     void *sptr2 = ssl->f_rng;
03445 
03446 //    SSL_DEBUG_MSG( 1, ( "ssl_init" ) );
03447     memset( ssl, 0, sizeof( ssl_context ) );
03448     
03449     ssl->f_dbg = sptr1;
03450     ssl->f_rng = sptr2;
03451 
03452     /*
03453      * Sane defaults
03454      */
03455     ssl->min_major_ver = SSL_MIN_MAJOR_VERSION;
03456     ssl->min_minor_ver = SSL_MIN_MINOR_VERSION;
03457     ssl->max_major_ver = SSL_MAX_MAJOR_VERSION;
03458     ssl->max_minor_ver = SSL_MAX_MINOR_VERSION;
03459 
03460     ssl_set_ciphersuites( ssl, ssl_list_ciphersuites() );
03461 
03462 #if defined(POLARSSL_DHM_C)
03463     if( ( ret = mpi_read_string( &ssl->dhm_P, 16,
03464                                  POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 ||
03465         ( ret = mpi_read_string( &ssl->dhm_G, 16,
03466                                  POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 )
03467     {
03468         SSL_DEBUG_RET( 1, "mpi_read_string", ret );
03469         return( ret );
03470     }
03471 #endif
03472 
03473     /*
03474      * Prepare base structures
03475      */
03476     ssl->in_ctr = (unsigned char *) polarssl_malloc( len );
03477     ssl->in_hdr = ssl->in_ctr +  8;
03478     ssl->in_iv  = ssl->in_ctr + 13;
03479     ssl->in_msg = ssl->in_ctr + 13;
03480 
03481     if( ssl->in_ctr == NULL )
03482     {
03483         SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
03484         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03485     }
03486 
03487     ssl->out_ctr = (unsigned char *) polarssl_malloc( len );
03488     ssl->out_hdr = ssl->out_ctr +  8;
03489     ssl->out_iv  = ssl->out_ctr + 13;
03490     ssl->out_msg = ssl->out_ctr + 13;
03491 
03492     if( ssl->out_ctr == NULL )
03493     {
03494         SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
03495         polarssl_free( ssl->in_ctr );
03496         ssl->in_ctr = NULL;
03497         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03498     }
03499 
03500     memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
03501     memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
03502 
03503 #if defined(POLARSSL_SSL_SESSION_TICKETS)
03504     ssl->ticket_lifetime = SSL_DEFAULT_TICKET_LIFETIME;
03505 #endif
03506 
03507 #if defined(POLARSSL_SSL_SET_CURVES)
03508     ssl->curve_list = ecp_grp_id_list( );
03509 #endif
03510 
03511     if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
03512         return( ret );
03513 
03514     return( 0 );
03515 }
03516 
03517 /*
03518  * Reset an initialized and used SSL context for re-use while retaining
03519  * all application-set variables, function pointers and data.
03520  */
03521 int ssl_session_reset( ssl_context *ssl )
03522 {
03523     int ret;
03524 
03525     ssl->state = SSL_HELLO_REQUEST;
03526     ssl->renegotiation = SSL_INITIAL_HANDSHAKE;
03527     ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION;
03528 
03529     ssl->verify_data_len = 0;
03530     memset( ssl->own_verify_data, 0, 36 );
03531     memset( ssl->peer_verify_data, 0, 36 );
03532 
03533     ssl->in_offt = NULL;
03534 
03535     ssl->in_msg = ssl->in_ctr + 13;
03536     ssl->in_msgtype = 0;
03537     ssl->in_msglen = 0;
03538     ssl->in_left = 0;
03539 
03540     ssl->in_hslen = 0;
03541     ssl->nb_zero = 0;
03542     ssl->record_read = 0;
03543 
03544     ssl->out_msg = ssl->out_ctr + 13;
03545     ssl->out_msgtype = 0;
03546     ssl->out_msglen = 0;
03547     ssl->out_left = 0;
03548 
03549     ssl->transform_in = NULL;
03550     ssl->transform_out = NULL;
03551 
03552     memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
03553     memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
03554 
03555 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
03556     if( ssl_hw_record_reset != NULL)
03557     {
03558         SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) );
03559         if( ( ret = ssl_hw_record_reset( ssl ) ) != 0 )
03560         {
03561             SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret );
03562             return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
03563         }
03564     }
03565 #endif
03566 
03567     if( ssl->transform )
03568     {
03569         ssl_transform_free( ssl->transform );
03570         polarssl_free( ssl->transform );
03571         ssl->transform = NULL;
03572     }
03573 
03574     if( ssl->session )
03575     {
03576         ssl_session_free( ssl->session );
03577         polarssl_free( ssl->session );
03578         ssl->session = NULL;
03579     }
03580 
03581 #if defined(POLARSSL_SSL_ALPN)
03582     ssl->alpn_chosen = NULL;
03583 #endif
03584 
03585     if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
03586         return( ret );
03587 
03588     return( 0 );
03589 }
03590 
03591 #if defined(POLARSSL_SSL_SESSION_TICKETS)
03592 /*
03593  * Allocate and initialize ticket keys
03594  */
03595 static int ssl_ticket_keys_init( ssl_context *ssl )
03596 {
03597     int ret;
03598     ssl_ticket_keys *tkeys;
03599     unsigned char buf[16];
03600 
03601     if( ssl->ticket_keys != NULL )
03602         return( 0 );
03603 
03604     tkeys = (ssl_ticket_keys *) polarssl_malloc( sizeof(ssl_ticket_keys) );
03605     if( tkeys == NULL )
03606         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03607 
03608     if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->key_name, 16 ) ) != 0 )
03609     {
03610         polarssl_free( tkeys );
03611         return( ret );
03612     }
03613 
03614     if( ( ret = ssl->f_rng( ssl->p_rng, buf, 16 ) ) != 0 ||
03615         ( ret = aes_setkey_enc( &tkeys->enc, buf, 128 ) ) != 0 ||
03616         ( ret = aes_setkey_dec( &tkeys->dec, buf, 128 ) ) != 0 )
03617     {
03618         polarssl_free( tkeys );
03619         return( ret );
03620     }
03621 
03622     if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->mac_key, 16 ) ) != 0 )
03623     {
03624         polarssl_free( tkeys );
03625         return( ret );
03626     }
03627 
03628     ssl->ticket_keys = tkeys;
03629 
03630     return( 0 );
03631 }
03632 #endif /* POLARSSL_SSL_SESSION_TICKETS */
03633 
03634 /*
03635  * SSL set accessors
03636  */
03637 void ssl_set_endpoint( ssl_context *ssl, int endpoint )
03638 {
03639     ssl->endpoint   = endpoint;
03640 
03641 #if defined(POLARSSL_SSL_SESSION_TICKETS)
03642     if( endpoint == SSL_IS_CLIENT )
03643         ssl->session_tickets = SSL_SESSION_TICKETS_ENABLED;
03644 #endif
03645 }
03646 
03647 void ssl_set_authmode( ssl_context *ssl, int authmode )
03648 {
03649     ssl->authmode   = authmode;
03650 }
03651 
03652 #if defined(POLARSSL_X509_CRT_PARSE_C)
03653 void ssl_set_verify( ssl_context *ssl,
03654                      int (*f_vrfy)(void *, x509_crt *, int, int *),
03655                      void *p_vrfy )
03656 {
03657     ssl->f_vrfy      = f_vrfy;
03658     ssl->p_vrfy      = p_vrfy;
03659 }
03660 #endif /* POLARSSL_X509_CRT_PARSE_C */
03661 
03662 void ssl_set_rng( ssl_context *ssl,
03663                   int (*f_rng)(void *, unsigned char *, size_t),
03664                   void *p_rng )
03665 {
03666     ssl->f_rng      = f_rng;
03667     ssl->p_rng      = p_rng;
03668 }
03669 
03670 void ssl_set_dbg( ssl_context *ssl,
03671                   void (*f_dbg)(void *, int, const char *),
03672                   void  *p_dbg )
03673 {
03674     ssl->f_dbg      = f_dbg;
03675     ssl->p_dbg      = p_dbg;
03676 }
03677 
03678 void ssl_set_bio( ssl_context *ssl,
03679             int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
03680             int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
03681 {
03682     ssl->f_recv     = f_recv;
03683     ssl->f_send     = f_send;
03684     ssl->p_recv     = p_recv;
03685     ssl->p_send     = p_send;
03686 }
03687 
03688 void ssl_set_session_cache( ssl_context *ssl,
03689         int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
03690         int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache )
03691 {
03692     ssl->f_get_cache = f_get_cache;
03693     ssl->p_get_cache = p_get_cache;
03694     ssl->f_set_cache = f_set_cache;
03695     ssl->p_set_cache = p_set_cache;
03696 }
03697 
03698 int ssl_set_session( ssl_context *ssl, const ssl_session *session )
03699 {
03700     int ret;
03701 
03702     if( ssl == NULL ||
03703         session == NULL ||
03704         ssl->session_negotiate == NULL ||
03705         ssl->endpoint != SSL_IS_CLIENT )
03706     {
03707         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
03708     }
03709 
03710     if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 )
03711         return( ret );
03712 
03713     ssl->handshake->resume = 1;
03714 
03715     return( 0 );
03716 }
03717 
03718 void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites )
03719 {
03720     ssl->ciphersuite_list[SSL_MINOR_VERSION_0] = ciphersuites;
03721     ssl->ciphersuite_list[SSL_MINOR_VERSION_1] = ciphersuites;
03722     ssl->ciphersuite_list[SSL_MINOR_VERSION_2] = ciphersuites;
03723     ssl->ciphersuite_list[SSL_MINOR_VERSION_3] = ciphersuites;
03724 }
03725 
03726 void ssl_set_ciphersuites_for_version( ssl_context *ssl,
03727                                        const int *ciphersuites,
03728                                        int major, int minor )
03729 {
03730     if( major != SSL_MAJOR_VERSION_3 )
03731         return;
03732 
03733     if( minor < SSL_MINOR_VERSION_0 || minor > SSL_MINOR_VERSION_3 )
03734         return;
03735 
03736     ssl->ciphersuite_list[minor] = ciphersuites;
03737 }
03738 
03739 #if defined(POLARSSL_X509_CRT_PARSE_C)
03740 /* Add a new (empty) key_cert entry an return a pointer to it */
03741 static ssl_key_cert *ssl_add_key_cert( ssl_context *ssl )
03742 {
03743     ssl_key_cert *key_cert, *last;
03744 
03745     key_cert = (ssl_key_cert *) polarssl_malloc( sizeof(ssl_key_cert) );
03746     if( key_cert == NULL )
03747         return( NULL );
03748 
03749     memset( key_cert, 0, sizeof( ssl_key_cert ) );
03750 
03751     /* Append the new key_cert to the (possibly empty) current list */
03752     if( ssl->key_cert == NULL )
03753     {
03754         ssl->key_cert = key_cert;
03755         if( ssl->handshake != NULL )
03756             ssl->handshake->key_cert = key_cert;
03757     }
03758     else
03759     {
03760         last = ssl->key_cert;
03761         while( last->next != NULL )
03762             last = last->next;
03763         last->next = key_cert;
03764     }
03765 
03766     return key_cert;
03767 }
03768 
03769 void ssl_set_ca_chain( ssl_context *ssl, x509_crt *ca_chain,
03770                        x509_crl *ca_crl, const char *peer_cn )
03771 {
03772     ssl->ca_chain   = ca_chain;
03773     ssl->ca_crl     = ca_crl;
03774     ssl->peer_cn    = peer_cn;
03775 }
03776 
03777 int ssl_set_own_cert( ssl_context *ssl, x509_crt *own_cert,
03778                        pk_context *pk_key )
03779 {
03780     ssl_key_cert *key_cert = ssl_add_key_cert( ssl );
03781 
03782     if( key_cert == NULL )
03783         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03784 
03785     key_cert->cert = own_cert;
03786     key_cert->key  = pk_key;
03787 
03788     return( 0 );
03789 }
03790 
03791 #if defined(POLARSSL_RSA_C)
03792 int ssl_set_own_cert_rsa( ssl_context *ssl, x509_crt *own_cert,
03793                            rsa_context *rsa_key )
03794 {
03795     int ret;
03796     ssl_key_cert *key_cert = ssl_add_key_cert( ssl );
03797 
03798     if( key_cert == NULL )
03799         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03800 
03801     key_cert->key = (pk_context *) polarssl_malloc( sizeof(pk_context) );
03802     if( key_cert->key == NULL )
03803         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03804 
03805     pk_init( key_cert->key );
03806 
03807     ret = pk_init_ctx( key_cert->key, pk_info_from_type( POLARSSL_PK_RSA ) );
03808     if( ret != 0 )
03809         return( ret );
03810 
03811     if( ( ret = rsa_copy( pk_rsa( *key_cert->key ), rsa_key ) ) != 0 )
03812         return( ret );
03813 
03814     key_cert->cert = own_cert;
03815     key_cert->key_own_alloc = 1;
03816 
03817     return( 0 );
03818 }
03819 #endif /* POLARSSL_RSA_C */
03820 
03821 int ssl_set_own_cert_alt( ssl_context *ssl, x509_crt *own_cert,
03822                           void *rsa_key,
03823                           rsa_decrypt_func rsa_decrypt,
03824                           rsa_sign_func rsa_sign,
03825                           rsa_key_len_func rsa_key_len )
03826 {
03827     int ret;
03828     ssl_key_cert *key_cert = ssl_add_key_cert( ssl );
03829 
03830     if( key_cert == NULL )
03831         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03832 
03833     key_cert->key = (pk_context *) polarssl_malloc( sizeof(pk_context) );
03834     if( key_cert->key == NULL )
03835         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03836 
03837     pk_init( key_cert->key );
03838 
03839     if( ( ret = pk_init_ctx_rsa_alt( key_cert->key, rsa_key,
03840                                  rsa_decrypt, rsa_sign, rsa_key_len ) ) != 0 )
03841         return( ret );
03842 
03843     key_cert->cert = own_cert;
03844     key_cert->key_own_alloc = 1;
03845 
03846     return( 0 );
03847 }
03848 #endif /* POLARSSL_X509_CRT_PARSE_C */
03849 
03850 #if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
03851 int ssl_set_psk( ssl_context *ssl, const unsigned char *psk, size_t psk_len,
03852                  const unsigned char *psk_identity, size_t psk_identity_len )
03853 {
03854     if( psk == NULL || psk_identity == NULL )
03855         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
03856 
03857     /*
03858      * The length will be check later anyway, but in case it is obviously
03859      * too large, better abort now. The PMS is as follows:
03860      * other_len (2 bytes) + other + psk_len (2 bytes) + psk
03861      */
03862     if( psk_len + 4 > POLARSSL_PREMASTER_SIZE )
03863         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
03864 
03865     if( ssl->psk != NULL )
03866     {
03867         polarssl_free( ssl->psk );
03868         polarssl_free( ssl->psk_identity );
03869     }
03870 
03871     ssl->psk_len = psk_len;
03872     ssl->psk_identity_len = psk_identity_len;
03873 
03874     ssl->psk = (unsigned char *) polarssl_malloc( ssl->psk_len );
03875     ssl->psk_identity = (unsigned char *)
03876                                 polarssl_malloc( ssl->psk_identity_len );
03877 
03878     if( ssl->psk == NULL || ssl->psk_identity == NULL )
03879         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03880 
03881     memcpy( ssl->psk, psk, ssl->psk_len );
03882     memcpy( ssl->psk_identity, psk_identity, ssl->psk_identity_len );
03883 
03884     return( 0 );
03885 }
03886 
03887 void ssl_set_psk_cb( ssl_context *ssl,
03888                      int (*f_psk)(void *, ssl_context *, const unsigned char *,
03889                      size_t),
03890                      void *p_psk )
03891 {
03892     ssl->f_psk = f_psk;
03893     ssl->p_psk = p_psk;
03894 }
03895 #endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
03896 
03897 #if defined(POLARSSL_DHM_C)
03898 int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
03899 {
03900     int ret;
03901 
03902     if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 )
03903     {
03904         SSL_DEBUG_RET( 1, "mpi_read_string", ret );
03905         return( ret );
03906     }
03907 
03908     if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 )
03909     {
03910         SSL_DEBUG_RET( 1, "mpi_read_string", ret );
03911         return( ret );
03912     }
03913 
03914     return( 0 );
03915 }
03916 
03917 int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx )
03918 {
03919     int ret;
03920 
03921     if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P ) ) != 0 )
03922     {
03923         SSL_DEBUG_RET( 1, "mpi_copy", ret );
03924         return( ret );
03925     }
03926 
03927     if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G ) ) != 0 )
03928     {
03929         SSL_DEBUG_RET( 1, "mpi_copy", ret );
03930         return( ret );
03931     }
03932 
03933     return( 0 );
03934 }
03935 #endif /* POLARSSL_DHM_C */
03936 
03937 #if defined(POLARSSL_SSL_SET_CURVES)
03938 /*
03939  * Set the allowed elliptic curves
03940  */
03941 void ssl_set_curves( ssl_context *ssl, const ecp_group_id *curve_list )
03942 {
03943   ssl->curve_list = curve_list;
03944 }
03945 #endif
03946 
03947 #if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
03948 int ssl_set_hostname( ssl_context *ssl, const char *hostname )
03949 {
03950     if( hostname == NULL )
03951         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
03952 
03953     ssl->hostname_len = strlen( hostname );
03954 
03955     if( ssl->hostname_len + 1 == 0 )
03956         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
03957 
03958     ssl->hostname = (unsigned char *) polarssl_malloc( ssl->hostname_len + 1 );
03959 
03960     if( ssl->hostname == NULL )
03961         return( POLARSSL_ERR_SSL_MALLOC_FAILED );
03962 
03963     memcpy( ssl->hostname, (const unsigned char *) hostname,
03964             ssl->hostname_len );
03965 
03966     ssl->hostname[ssl->hostname_len] = '\0';
03967 
03968     return( 0 );
03969 }
03970 
03971 void ssl_set_sni( ssl_context *ssl,
03972                   int (*f_sni)(void *, ssl_context *,
03973                                 const unsigned char *, size_t),
03974                   void *p_sni )
03975 {
03976     ssl->f_sni = f_sni;
03977     ssl->p_sni = p_sni;
03978 }
03979 #endif /* POLARSSL_SSL_SERVER_NAME_INDICATION */
03980 
03981 #if defined(POLARSSL_SSL_ALPN)
03982 int ssl_set_alpn_protocols( ssl_context *ssl, const char **protos )
03983 {
03984     size_t cur_len, tot_len;
03985     const char **p;
03986 
03987     /*
03988      * "Empty strings MUST NOT be included and byte strings MUST NOT be
03989      * truncated". Check lengths now rather than later.
03990      */
03991     tot_len = 0;
03992     for( p = protos; *p != NULL; p++ )
03993     {
03994         cur_len = strlen( *p );
03995         tot_len += cur_len;
03996 
03997         if( cur_len == 0 || cur_len > 255 || tot_len > 65535 )
03998             return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
03999     }
04000 
04001     ssl->alpn_list = protos;
04002 
04003     return( 0 );
04004 }
04005 
04006 const char *ssl_get_alpn_protocol( const ssl_context *ssl )
04007 {
04008     return ssl->alpn_chosen;
04009 }
04010 #endif /* POLARSSL_SSL_ALPN */
04011 
04012 void ssl_set_max_version( ssl_context *ssl, int major, int minor )
04013 {
04014     if( major >= SSL_MIN_MAJOR_VERSION && major <= SSL_MAX_MAJOR_VERSION &&
04015         minor >= SSL_MIN_MINOR_VERSION && minor <= SSL_MAX_MINOR_VERSION )
04016     {
04017         ssl->max_major_ver = major;
04018         ssl->max_minor_ver = minor;
04019     }
04020 }
04021 
04022 void ssl_set_min_version( ssl_context *ssl, int major, int minor )
04023 {
04024     if( major >= SSL_MIN_MAJOR_VERSION && major <= SSL_MAX_MAJOR_VERSION &&
04025         minor >= SSL_MIN_MINOR_VERSION && minor <= SSL_MAX_MINOR_VERSION )
04026     {
04027         ssl->min_major_ver = major;
04028         ssl->min_minor_ver = minor;
04029     }
04030 }
04031 
04032 #if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
04033 int ssl_set_max_frag_len( ssl_context *ssl, unsigned char mfl_code )
04034 {
04035     if( mfl_code >= SSL_MAX_FRAG_LEN_INVALID ||
04036         mfl_code_to_length[mfl_code] > SSL_MAX_CONTENT_LEN )
04037     {
04038         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
04039     }
04040 
04041     ssl->mfl_code = mfl_code;
04042 
04043     return( 0 );
04044 }
04045 #endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
04046 
04047 #if defined(POLARSSL_SSL_TRUNCATED_HMAC)
04048 int ssl_set_truncated_hmac( ssl_context *ssl, int truncate )
04049 {
04050     if( ssl->endpoint != SSL_IS_CLIENT )
04051         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
04052 
04053     ssl->trunc_hmac = truncate;
04054 
04055     return( 0 );
04056 }
04057 #endif /* POLARSSL_SSL_TRUNCATED_HMAC */
04058 
04059 void ssl_set_renegotiation( ssl_context *ssl, int renegotiation )
04060 {
04061     ssl->disable_renegotiation = renegotiation;
04062 }
04063 
04064 void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy )
04065 {
04066     ssl->allow_legacy_renegotiation = allow_legacy;
04067 }
04068 
04069 #if defined(POLARSSL_SSL_SESSION_TICKETS)
04070 int ssl_set_session_tickets( ssl_context *ssl, int use_tickets )
04071 {
04072     ssl->session_tickets = use_tickets;
04073 
04074     if( ssl->endpoint == SSL_IS_CLIENT )
04075         return( 0 );
04076 
04077     if( ssl->f_rng == NULL )
04078         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
04079 
04080     return( ssl_ticket_keys_init( ssl ) );
04081 }
04082 
04083 void ssl_set_session_ticket_lifetime( ssl_context *ssl, int lifetime )
04084 {
04085     ssl->ticket_lifetime = lifetime;
04086 }
04087 #endif /* POLARSSL_SSL_SESSION_TICKETS */
04088 
04089 /*
04090  * SSL get accessors
04091  */
04092 size_t ssl_get_bytes_avail( const ssl_context *ssl )
04093 {
04094     return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
04095 }
04096 
04097 int ssl_get_verify_result( const ssl_context *ssl )
04098 {
04099     return( ssl->session->verify_result );
04100 }
04101 
04102 const char *ssl_get_ciphersuite( const ssl_context *ssl )
04103 {
04104     if( ssl == NULL || ssl->session == NULL )
04105         return NULL;
04106 
04107     return ssl_get_ciphersuite_name( ssl->session->ciphersuite );
04108 }
04109 
04110 const char *ssl_get_version( const ssl_context *ssl )
04111 {
04112     switch( ssl->minor_ver )
04113     {
04114         case SSL_MINOR_VERSION_0:
04115             return( "SSLv3.0" );
04116 
04117         case SSL_MINOR_VERSION_1:
04118             return( "TLSv1.0" );
04119 
04120         case SSL_MINOR_VERSION_2:
04121             return( "TLSv1.1" );
04122 
04123         case SSL_MINOR_VERSION_3:
04124             return( "TLSv1.2" );
04125 
04126         default:
04127             break;
04128     }
04129     return( "unknown" );
04130 }
04131 
04132 #if defined(POLARSSL_X509_CRT_PARSE_C)
04133 const x509_crt *ssl_get_peer_cert( const ssl_context *ssl )
04134 {
04135     if( ssl == NULL || ssl->session == NULL )
04136         return NULL;
04137 
04138     return ssl->session->peer_cert;
04139 }
04140 #endif /* POLARSSL_X509_CRT_PARSE_C */
04141 
04142 int ssl_get_session( const ssl_context *ssl, ssl_session *dst )
04143 {
04144     if( ssl == NULL ||
04145         dst == NULL ||
04146         ssl->session == NULL ||
04147         ssl->endpoint != SSL_IS_CLIENT )
04148     {
04149         return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
04150     }
04151 
04152     return( ssl_session_copy( dst, ssl->session ) );
04153 }
04154 
04155 /*
04156  * Perform a single step of the SSL handshake
04157  */
04158 int ssl_handshake_step( ssl_context *ssl )
04159 {
04160     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
04161 
04162 #if defined(POLARSSL_SSL_CLI_C)
04163     if( ssl->endpoint == SSL_IS_CLIENT )
04164         ret = ssl_handshake_client_step( ssl );
04165 #endif
04166 
04167 #if defined(POLARSSL_SSL_SRV_C)
04168     if( ssl->endpoint == SSL_IS_SERVER )
04169         ret = ssl_handshake_server_step( ssl );
04170 #endif
04171 
04172     return( ret );
04173 }
04174 
04175 /*
04176  * Perform the SSL handshake
04177  */
04178 int ssl_handshake( ssl_context *ssl )
04179 {
04180     int ret = 0;
04181 
04182     SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
04183 
04184     while( ssl->state != SSL_HANDSHAKE_OVER )
04185     {
04186         ret = ssl_handshake_step( ssl );
04187 
04188         if( ret != 0 )
04189             break;
04190     }
04191 
04192     SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
04193 
04194     return( ret );
04195 }
04196 
04197 #if defined(POLARSSL_SSL_SRV_C)
04198 /*
04199  * Write HelloRequest to request renegotiation on server
04200  */
04201 static int ssl_write_hello_request( ssl_context *ssl )
04202 {
04203     int ret;
04204 
04205     SSL_DEBUG_MSG( 2, ( "=> write hello request" ) );
04206 
04207     ssl->out_msglen  = 4;
04208     ssl->out_msgtype = SSL_MSG_HANDSHAKE;
04209     ssl->out_msg[0]  = SSL_HS_HELLO_REQUEST;
04210 
04211     if( ( ret = ssl_write_record( ssl ) ) != 0 )
04212     {
04213         SSL_DEBUG_RET( 1, "ssl_write_record", ret );
04214         return( ret );
04215     }
04216 
04217     ssl->renegotiation = SSL_RENEGOTIATION_PENDING;
04218 
04219     SSL_DEBUG_MSG( 2, ( "<= write hello request" ) );
04220 
04221     return( 0 );
04222 }
04223 #endif /* POLARSSL_SSL_SRV_C */
04224 
04225 /*
04226  * Actually renegotiate current connection, triggered by either:
04227  * - calling ssl_renegotiate() on client,
04228  * - receiving a HelloRequest on client during ssl_read(),
04229  * - receiving any handshake message on server during ssl_read() after the
04230  *   initial handshake is completed
04231  * If the handshake doesn't complete due to waiting for I/O, it will continue
04232  * during the next calls to ssl_renegotiate() or ssl_read() respectively.
04233  */
04234 static int ssl_start_renegotiation( ssl_context *ssl )
04235 {
04236     int ret;
04237 
04238     SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
04239 
04240     if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
04241         return( ret );
04242 
04243     ssl->state = SSL_HELLO_REQUEST;
04244     ssl->renegotiation = SSL_RENEGOTIATION;
04245 
04246     if( ( ret = ssl_handshake( ssl ) ) != 0 )
04247     {
04248         SSL_DEBUG_RET( 1, "ssl_handshake", ret );
04249         return( ret );
04250     }
04251 
04252     SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
04253 
04254     return( 0 );
04255 }
04256 
04257 /*
04258  * Renegotiate current connection on client,
04259  * or request renegotiation on server
04260  */
04261 int ssl_renegotiate( ssl_context *ssl )
04262 {
04263     int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
04264 
04265 #if defined(POLARSSL_SSL_SRV_C)
04266     /* On server, just send the request */
04267     if( ssl->endpoint == SSL_IS_SERVER )
04268     {
04269         if( ssl->state != SSL_HANDSHAKE_OVER )
04270             return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
04271 
04272         return( ssl_write_hello_request( ssl ) );
04273     }
04274 #endif /* POLARSSL_SSL_SRV_C */
04275 
04276 #if defined(POLARSSL_SSL_CLI_C)
04277     /*
04278      * On client, either start the renegotiation process or,
04279      * if already in progress, continue the handshake
04280      */
04281     if( ssl->renegotiation != SSL_RENEGOTIATION )
04282     {
04283         if( ssl->state != SSL_HANDSHAKE_OVER )
04284             return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
04285 
04286         if( ( ret = ssl_start_renegotiation( ssl ) ) != 0 )
04287         {
04288             SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret );
04289             return( ret );
04290         }
04291     }
04292     else
04293     {
04294         if( ( ret = ssl_handshake( ssl ) ) != 0 )
04295         {
04296             SSL_DEBUG_RET( 1, "ssl_handshake", ret );
04297             return( ret );
04298         }
04299     }
04300 #endif /* POLARSSL_SSL_CLI_C */
04301 
04302     return( ret );
04303 }
04304 
04305 /*
04306  * Receive application data decrypted from the SSL layer
04307  */
04308 int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
04309 {
04310     int ret;
04311     size_t n;
04312 
04313     SSL_DEBUG_MSG( 2, ( "=> read" ) );
04314 
04315     if( ssl->state != SSL_HANDSHAKE_OVER )
04316     {
04317         if( ( ret = ssl_handshake( ssl ) ) != 0 )
04318         {
04319             SSL_DEBUG_RET( 1, "ssl_handshake", ret );
04320             return( ret );
04321         }
04322     }
04323 
04324     if( ssl->in_offt == NULL )
04325     {
04326         if( ( ret = ssl_read_record ( ssl ) ) != 0 )
04327         {
04328             if( ret == POLARSSL_ERR_SSL_CONN_EOF )
04329                 return( 0 );
04330 
04331             SSL_DEBUG_RET( 1, "ssl_read_record", ret );
04332             return( ret );
04333         }
04334 
04335         if( ssl->in_msglen  == 0 &&
04336             ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
04337         {
04338             /*
04339              * OpenSSL sends empty messages to randomize the IV
04340              */
04341             if( ( ret = ssl_read_record ( ssl ) ) != 0 )
04342             {
04343                 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
04344                     return( 0 );
04345 
04346                 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
04347                 return( ret );
04348             }
04349         }
04350 
04351         if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
04352         {
04353             SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
04354 
04355             if( ssl->endpoint == SSL_IS_CLIENT &&
04356                 ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST ||
04357                   ssl->in_hslen != 4 ) )
04358             {
04359                 SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
04360                 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
04361             }
04362 
04363             if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
04364                 ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
04365                   ssl->allow_legacy_renegotiation ==
04366                                                 SSL_LEGACY_NO_RENEGOTIATION ) )
04367             {
04368                 SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
04369 
04370 #if defined(POLARSSL_SSL_PROTO_SSL3)
04371                 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
04372                 {
04373                     /*
04374                      * SSLv3 does not have a "no_renegotiation" alert
04375                      */
04376                     if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
04377                         return( ret );
04378                 }
04379                 else
04380 #endif /* POLARSSL_SSL_PROTO_SSL3 */
04381 #if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
04382     defined(POLARSSL_SSL_PROTO_TLS1_2)
04383                 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 )
04384                 {
04385                     if( ( ret = ssl_send_alert_message( ssl,
04386                                     SSL_ALERT_LEVEL_WARNING,
04387                                     SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
04388                     {
04389                         return( ret );
04390                     }
04391                 }
04392                 else
04393 #endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 ||
04394           POLARSSL_SSL_PROTO_TLS1_2 */
04395                 {
04396                     SSL_DEBUG_MSG( 1, ( "should never happen" ) );
04397                     return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
04398                 }
04399             }
04400             else
04401             {
04402                 if( ( ret = ssl_start_renegotiation( ssl ) ) != 0 )
04403                 {
04404                     SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret );
04405                     return( ret );
04406                 }
04407 
04408                 return( POLARSSL_ERR_NET_WANT_READ );
04409             }
04410         }
04411         else if( ssl->renegotiation == SSL_RENEGOTIATION_PENDING )
04412         {
04413             SSL_DEBUG_MSG( 1, ( "renegotiation requested, "
04414                                 "but not honored by client" ) );
04415             return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
04416         }
04417         else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
04418         {
04419             SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
04420             return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
04421         }
04422 
04423         ssl->in_offt = ssl->in_msg;
04424     }
04425 
04426     n = ( len < ssl->in_msglen )
04427         ? len : ssl->in_msglen;
04428 
04429     memcpy( buf, ssl->in_offt, n );
04430     ssl->in_msglen -= n;
04431 
04432     if( ssl->in_msglen == 0 )
04433         /* all bytes consumed  */
04434         ssl->in_offt = NULL;
04435     else
04436         /* more data available */
04437         ssl->in_offt += n;
04438 
04439     SSL_DEBUG_MSG( 2, ( "<= read" ) );
04440 
04441     return( (int) n );
04442 }
04443 
04444 /*
04445  * Send application data to be encrypted by the SSL layer
04446  */
04447 int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len )
04448 {
04449     int ret;
04450     size_t n;
04451     unsigned int max_len = SSL_MAX_CONTENT_LEN;
04452 
04453     SSL_DEBUG_MSG( 2, ( "=> write" ) );
04454 
04455     if( ssl->state != SSL_HANDSHAKE_OVER )
04456     {
04457         if( ( ret = ssl_handshake( ssl ) ) != 0 )
04458         {
04459             SSL_DEBUG_RET( 1, "ssl_handshake", ret );
04460             return( ret );
04461         }
04462     }
04463 
04464 #if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
04465     /*
04466      * Assume mfl_code is correct since it was checked when set
04467      */
04468     max_len = mfl_code_to_length[ssl->mfl_code];
04469 
04470     /*
04471      * Check if a smaller max length was negotiated
04472      */
04473     if( ssl->session_out != NULL &&
04474         mfl_code_to_length[ssl->session_out->mfl_code] < max_len )
04475     {
04476         max_len = mfl_code_to_length[ssl->session_out->mfl_code];
04477     }
04478 #endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
04479 
04480     n = ( len < max_len) ? len : max_len;
04481 
04482     if( ssl->out_left != 0 )
04483     {
04484         if( ( ret = ssl_flush_output( ssl ) ) != 0 )
04485         {
04486             SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
04487             return( ret );
04488         }
04489     }
04490     else
04491     {
04492         ssl->out_msglen  = n;
04493         ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
04494         memcpy( ssl->out_msg, buf, n );
04495 
04496         if( ( ret = ssl_write_record( ssl ) ) != 0 )
04497         {
04498             SSL_DEBUG_RET( 1, "ssl_write_record", ret );
04499             return( ret );
04500         }
04501     }
04502 
04503     SSL_DEBUG_MSG( 2, ( "<= write" ) );
04504 
04505     return( (int) n );
04506 }
04507 
04508 /*
04509  * Notify the peer that the connection is being closed
04510  */
04511 int ssl_close_notify( ssl_context *ssl )
04512 {
04513     int ret;
04514 
04515     SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
04516 
04517     if( ( ret = ssl_flush_output( ssl ) ) != 0 )
04518     {
04519         SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
04520         return( ret );
04521     }
04522 
04523     if( ssl->state == SSL_HANDSHAKE_OVER )
04524     {
04525         if( ( ret = ssl_send_alert_message( ssl,
04526                         SSL_ALERT_LEVEL_WARNING,
04527                         SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
04528         {
04529             return( ret );
04530         }
04531     }
04532 
04533     SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
04534 
04535     return( ret );
04536 }
04537 
04538 void ssl_transform_free( ssl_transform *transform )
04539 {
04540 #if defined(POLARSSL_ZLIB_SUPPORT)
04541     deflateEnd( &transform->ctx_deflate );
04542     inflateEnd( &transform->ctx_inflate );
04543 #endif
04544 
04545     cipher_free_ctx( &transform->cipher_ctx_enc );
04546     cipher_free_ctx( &transform->cipher_ctx_dec );
04547 
04548     md_free_ctx( &transform->md_ctx_enc );
04549     md_free_ctx( &transform->md_ctx_dec );
04550 
04551     memset( transform, 0, sizeof( ssl_transform ) );
04552 }
04553 
04554 #if defined(POLARSSL_X509_CRT_PARSE_C)
04555 static void ssl_key_cert_free( ssl_key_cert *key_cert )
04556 {
04557     ssl_key_cert *cur = key_cert, *next;
04558 
04559     while( cur != NULL )
04560     {
04561         next = cur->next;
04562 
04563         if( cur->key_own_alloc )
04564         {
04565             pk_free( cur->key );
04566             polarssl_free( cur->key );
04567         }
04568         polarssl_free( cur );
04569 
04570         cur = next;
04571     }
04572 }
04573 #endif /* POLARSSL_X509_CRT_PARSE_C */
04574 
04575 void ssl_handshake_free( ssl_handshake_params *handshake )
04576 {
04577 #if defined(POLARSSL_DHM_C)
04578     dhm_free( &handshake->dhm_ctx );
04579 #endif
04580 #if defined(POLARSSL_ECDH_C)
04581     ecdh_free( &handshake->ecdh_ctx );
04582 #endif
04583 
04584 #if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
04585     /* explicit void pointer cast for buggy MS compiler */
04586     polarssl_free( (void *) handshake->curves );
04587 #endif
04588 
04589 #if defined(POLARSSL_X509_CRT_PARSE_C) && \
04590     defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
04591     /*
04592      * Free only the linked list wrapper, not the keys themselves
04593      * since the belong to the SNI callback
04594      */
04595     if( handshake->sni_key_cert != NULL )
04596     {
04597         ssl_key_cert *cur = handshake->sni_key_cert, *next;
04598 
04599         while( cur != NULL )
04600         {
04601             next = cur->next;
04602             polarssl_free( cur );
04603             cur = next;
04604         }
04605     }
04606 #endif /* POLARSSL_X509_CRT_PARSE_C && POLARSSL_SSL_SERVER_NAME_INDICATION */
04607 
04608     memset( handshake, 0, sizeof( ssl_handshake_params ) );
04609 }
04610 
04611 void ssl_session_free( ssl_session *session )
04612 {
04613 #if defined(POLARSSL_X509_CRT_PARSE_C)
04614     if( session->peer_cert != NULL )
04615     {
04616         x509_crt_free( session->peer_cert );
04617         polarssl_free( session->peer_cert );
04618     }
04619 #endif
04620 
04621 #if defined(POLARSSL_SSL_SESSION_TICKETS)
04622     polarssl_free( session->ticket );
04623 #endif
04624 
04625     memset( session, 0, sizeof( ssl_session ) );
04626 }
04627 
04628 /*
04629  * Free an SSL context
04630  */
04631 void ssl_free( ssl_context *ssl )
04632 {
04633     SSL_DEBUG_MSG( 2, ( "=> free" ) );
04634 
04635     if( ssl->out_ctr != NULL )
04636     {
04637         memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
04638         polarssl_free( ssl->out_ctr );
04639     }
04640 
04641     if( ssl->in_ctr != NULL )
04642     {
04643         memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
04644         polarssl_free( ssl->in_ctr );
04645     }
04646 
04647 #if defined(POLARSSL_ZLIB_SUPPORT)
04648     if( ssl->compress_buf != NULL )
04649     {
04650         memset( ssl->compress_buf, 0, SSL_BUFFER_LEN );
04651         polarssl_free( ssl->compress_buf );
04652     }
04653 #endif
04654 
04655 #if defined(POLARSSL_DHM_C)
04656     mpi_free( &ssl->dhm_P );
04657     mpi_free( &ssl->dhm_G );
04658 #endif
04659 
04660     if( ssl->transform )
04661     {
04662         ssl_transform_free( ssl->transform );
04663         polarssl_free( ssl->transform );
04664     }
04665 
04666     if( ssl->handshake )
04667     {
04668         ssl_handshake_free( ssl->handshake );
04669         ssl_transform_free( ssl->transform_negotiate );
04670         ssl_session_free( ssl->session_negotiate );
04671 
04672         polarssl_free( ssl->handshake );
04673         polarssl_free( ssl->transform_negotiate );
04674         polarssl_free( ssl->session_negotiate );
04675     }
04676 
04677     if( ssl->session )
04678     {
04679         ssl_session_free( ssl->session );
04680         polarssl_free( ssl->session );
04681     }
04682 
04683 #if defined(POLARSSL_SSL_SESSION_TICKETS)
04684     polarssl_free( ssl->ticket_keys );
04685 #endif
04686 
04687 #if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
04688     if ( ssl->hostname != NULL )
04689     {
04690         memset( ssl->hostname, 0, ssl->hostname_len );
04691         polarssl_free( ssl->hostname );
04692         ssl->hostname_len = 0;
04693     }
04694 #endif
04695 
04696 #if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
04697     if( ssl->psk != NULL )
04698     {
04699         memset( ssl->psk, 0, ssl->psk_len );
04700         memset( ssl->psk_identity, 0, ssl->psk_identity_len );
04701         polarssl_free( ssl->psk );
04702         polarssl_free( ssl->psk_identity );
04703         ssl->psk_len = 0;
04704         ssl->psk_identity_len = 0;
04705     }
04706 #endif
04707 
04708 #if defined(POLARSSL_X509_CRT_PARSE_C)
04709     ssl_key_cert_free( ssl->key_cert );
04710 #endif
04711 
04712 #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
04713     if( ssl_hw_record_finish != NULL )
04714     {
04715         SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) );
04716         ssl_hw_record_finish( ssl );
04717     }
04718 #endif
04719 
04720     SSL_DEBUG_MSG( 2, ( "<= free" ) );
04721 
04722     /* Actually clear after last debug message */
04723     memset( ssl, 0, sizeof( ssl_context ) );
04724 }
04725 
04726 #if defined(POLARSSL_PK_C)
04727 /*
04728  * Convert between POLARSSL_PK_XXX and SSL_SIG_XXX
04729  */
04730 unsigned char ssl_sig_from_pk( pk_context *pk )
04731 {
04732 #if defined(POLARSSL_RSA_C)
04733     if( pk_can_do( pk, POLARSSL_PK_RSA ) )
04734         return( SSL_SIG_RSA );
04735 #endif
04736 #if defined(POLARSSL_ECDSA_C)
04737     if( pk_can_do( pk, POLARSSL_PK_ECDSA ) )
04738         return( SSL_SIG_ECDSA );
04739 #endif
04740     return( SSL_SIG_ANON );
04741 }
04742 
04743 pk_type_t ssl_pk_alg_from_sig( unsigned char sig )
04744 {
04745     switch( sig )
04746     {
04747 #if defined(POLARSSL_RSA_C)
04748         case SSL_SIG_RSA:
04749             return( POLARSSL_PK_RSA );
04750 #endif
04751 #if defined(POLARSSL_ECDSA_C)
04752         case SSL_SIG_ECDSA:
04753             return( POLARSSL_PK_ECDSA );
04754 #endif
04755         default:
04756             return( POLARSSL_PK_NONE );
04757     }
04758 }
04759 #endif /* POLARSSL_PK_C */
04760 
04761 /*
04762  * Convert between SSL_HASH_XXX and POLARSSL_MD_XXX
04763  */
04764 md_type_t ssl_md_alg_from_hash( unsigned char hash )
04765 {
04766     switch( hash )
04767     {
04768 #if defined(POLARSSL_MD5_C)
04769         case SSL_HASH_MD5:
04770             return( POLARSSL_MD_MD5 );
04771 #endif
04772 #if defined(POLARSSL_SHA1_C)
04773         case SSL_HASH_SHA1:
04774             return( POLARSSL_MD_SHA1 );
04775 #endif
04776 #if defined(POLARSSL_SHA256_C)
04777         case SSL_HASH_SHA224:
04778             return( POLARSSL_MD_SHA224 );
04779         case SSL_HASH_SHA256:
04780             return( POLARSSL_MD_SHA256 );
04781 #endif
04782 #if defined(POLARSSL_SHA512_C)
04783         case SSL_HASH_SHA384:
04784             return( POLARSSL_MD_SHA384 );
04785         case SSL_HASH_SHA512:
04786             return( POLARSSL_MD_SHA512 );
04787 #endif
04788         default:
04789             return( POLARSSL_MD_NONE );
04790     }
04791 }
04792 
04793 #if defined(POLARSSL_SSL_SET_CURVES)
04794 /*
04795  * Check is a curve proposed by the peer is in our list.
04796  * Return 1 if we're willing to use it, 0 otherwise.
04797  */
04798 int ssl_curve_is_acceptable( const ssl_context *ssl, ecp_group_id grp_id )
04799 {
04800     const ecp_group_id *gid;
04801 
04802     for( gid = ssl->curve_list; *gid != POLARSSL_ECP_DP_NONE; gid++ )
04803         if( *gid == grp_id )
04804             return( 1 );
04805 
04806     return( 0 );
04807 }
04808 #endif /* POLARSSL_SSL_SET_CURVES */
04809 
04810 #if defined(POLARSSL_X509_CRT_PARSE_C)
04811 int ssl_check_cert_usage( const x509_crt *cert,
04812                           const ssl_ciphersuite_t *ciphersuite,
04813                           int cert_endpoint )
04814 {
04815 #if defined(POLARSSL_X509_CHECK_KEY_USAGE)
04816     int usage = 0;
04817 #endif
04818 #if defined(POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE)
04819     const char *ext_oid;
04820     size_t ext_len;
04821 #endif
04822 
04823 #if !defined(POLARSSL_X509_CHECK_KEY_USAGE) &&          \
04824     !defined(POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE)
04825     ((void) cert);
04826     ((void) cert_endpoint);
04827 #endif
04828 
04829 #if defined(POLARSSL_X509_CHECK_KEY_USAGE)
04830     if( cert_endpoint == SSL_IS_SERVER )
04831     {
04832         /* Server part of the key exchange */
04833         switch( ciphersuite->key_exchange )
04834         {
04835             case POLARSSL_KEY_EXCHANGE_RSA:
04836             case POLARSSL_KEY_EXCHANGE_RSA_PSK:
04837                 usage = KU_KEY_ENCIPHERMENT;
04838                 break;
04839 
04840             case POLARSSL_KEY_EXCHANGE_DHE_RSA:
04841             case POLARSSL_KEY_EXCHANGE_ECDHE_RSA:
04842             case POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA:
04843                 usage = KU_DIGITAL_SIGNATURE;
04844                 break;
04845 
04846             case POLARSSL_KEY_EXCHANGE_ECDH_RSA:
04847             case POLARSSL_KEY_EXCHANGE_ECDH_ECDSA:
04848                 usage = KU_KEY_AGREEMENT;
04849                 break;
04850 
04851             /* Don't use default: we want warnings when adding new values */
04852             case POLARSSL_KEY_EXCHANGE_NONE:
04853             case POLARSSL_KEY_EXCHANGE_PSK:
04854             case POLARSSL_KEY_EXCHANGE_DHE_PSK:
04855             case POLARSSL_KEY_EXCHANGE_ECDHE_PSK:
04856                 usage = 0;
04857         }
04858     }
04859     else
04860     {
04861         /* Client auth: we only implement rsa_sign and ecdsa_sign for now */
04862         usage = KU_DIGITAL_SIGNATURE;
04863     }
04864 
04865     if( x509_crt_check_key_usage( cert, usage ) != 0 )
04866         return( -1 );
04867 #else
04868     ((void) ciphersuite);
04869 #endif /* POLARSSL_X509_CHECK_KEY_USAGE */
04870 
04871 #if defined(POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE)
04872     if( cert_endpoint == SSL_IS_SERVER )
04873     {
04874         ext_oid = OID_SERVER_AUTH;
04875         ext_len = OID_SIZE( OID_SERVER_AUTH );
04876     }
04877     else
04878     {
04879         ext_oid = OID_CLIENT_AUTH;
04880         ext_len = OID_SIZE( OID_CLIENT_AUTH );
04881     }
04882 
04883     if( x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 )
04884         return( -1 );
04885 #endif /* POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE */
04886 
04887     return( 0 );
04888 }
04889 #endif /* POLARSSL_X509_CRT_PARSE_C */
04890 
04891 #endif /* POLARSSL_SSL_TLS_C */
04892 
04893