blob: 1281bc827ed76b410d4c6778d20adf1c996f877f [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 shared functions
3 *
Paul Bakker68884e32013-01-07 18:20:04 +01004 * Copyright (C) 2006-2013, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25/*
26 * The SSL 3.0 specification was drafted by Netscape in 1996,
27 * and became an IETF standard in 1999.
28 *
29 * http://wp.netscape.com/eng/ssl3/
30 * http://www.ietf.org/rfc/rfc2246.txt
31 * http://www.ietf.org/rfc/rfc4346.txt
32 */
33
Paul Bakker40e46942009-01-03 21:51:57 +000034#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakker40e46942009-01-03 21:51:57 +000036#if defined(POLARSSL_SSL_TLS_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Paul Bakker40e46942009-01-03 21:51:57 +000038#include "polarssl/aes.h"
39#include "polarssl/arc4.h"
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000040#include "polarssl/camellia.h"
Paul Bakker40e46942009-01-03 21:51:57 +000041#include "polarssl/des.h"
42#include "polarssl/debug.h"
43#include "polarssl/ssl.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000044
Paul Bakkerca4ab492012-04-18 14:23:57 +000045#if defined(POLARSSL_GCM_C)
46#include "polarssl/gcm.h"
47#endif
48
Paul Bakker6e339b52013-07-03 13:37:05 +020049#if defined(POLARSSL_MEMORY_C)
50#include "polarssl/memory.h"
51#else
52#define polarssl_malloc malloc
53#define polarssl_free free
54#endif
55
Paul Bakker5121ce52009-01-03 21:22:43 +000056#include <stdlib.h>
Paul Bakker5121ce52009-01-03 21:22:43 +000057
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000058#if defined _MSC_VER && !defined strcasecmp
59#define strcasecmp _stricmp
60#endif
61
Paul Bakker05decb22013-08-15 13:33:48 +020062#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020063/*
64 * Convert max_fragment_length codes to length.
65 * RFC 6066 says:
66 * enum{
67 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
68 * } MaxFragmentLength;
69 * and we add 0 -> extension unused
70 */
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +020071static unsigned int mfl_code_to_length[SSL_MAX_FRAG_LEN_INVALID] =
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020072{
73 SSL_MAX_CONTENT_LEN, /* SSL_MAX_FRAG_LEN_NONE */
74 512, /* SSL_MAX_FRAG_LEN_512 */
75 1024, /* SSL_MAX_FRAG_LEN_1024 */
76 2048, /* SSL_MAX_FRAG_LEN_2048 */
77 4096, /* SSL_MAX_FRAG_LEN_4096 */
78};
Paul Bakker05decb22013-08-15 13:33:48 +020079#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020080
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020081static int ssl_session_copy( ssl_session *dst, const ssl_session *src )
82{
83 int ret;
84
85 ssl_session_free( dst );
86 memcpy( dst, src, sizeof( ssl_session ) );
87
88#if defined(POLARSSL_X509_PARSE_C)
89 if( src->peer_cert != NULL )
90 {
91 if( ( dst->peer_cert = polarssl_malloc( sizeof(x509_cert) ) ) == NULL )
92 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
93
94 memset( dst->peer_cert, 0, sizeof(x509_cert) );
95
96 if( ( ret = x509parse_crt( dst->peer_cert, src->peer_cert->raw.p,
97 src->peer_cert->raw.len ) != 0 ) )
98 {
99 polarssl_free( dst->peer_cert );
100 dst->peer_cert = NULL;
101 return( ret );
102 }
103 }
104#endif /* POLARSSL_X509_PARSE_C */
105
Paul Bakkera503a632013-08-14 13:48:06 +0200106#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200107 if( src->ticket != NULL )
108 {
109 if( ( dst->ticket = polarssl_malloc( src->ticket_len ) ) == NULL )
110 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
111
112 memcpy( dst->ticket, src->ticket, src->ticket_len );
113 }
Paul Bakkera503a632013-08-14 13:48:06 +0200114#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200115
116 return( 0 );
117}
118
Paul Bakker05ef8352012-05-08 09:17:57 +0000119#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
120int (*ssl_hw_record_init)(ssl_context *ssl,
121 const unsigned char *key_enc, const unsigned char *key_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100122 size_t keylen,
Paul Bakker05ef8352012-05-08 09:17:57 +0000123 const unsigned char *iv_enc, const unsigned char *iv_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100124 size_t ivlen,
125 const unsigned char *mac_enc, const unsigned char *mac_dec,
126 size_t maclen) = NULL;
127int (*ssl_hw_record_activate)(ssl_context *ssl, int direction) = NULL;
Paul Bakker05ef8352012-05-08 09:17:57 +0000128int (*ssl_hw_record_reset)(ssl_context *ssl) = NULL;
129int (*ssl_hw_record_write)(ssl_context *ssl) = NULL;
130int (*ssl_hw_record_read)(ssl_context *ssl) = NULL;
131int (*ssl_hw_record_finish)(ssl_context *ssl) = NULL;
132#endif
133
Paul Bakkered27a042013-04-18 22:46:23 +0200134#if defined(POLARSSL_RSA_C)
Paul Bakkereb2c6582012-09-27 19:15:01 +0000135static int ssl_rsa_decrypt( void *ctx, int mode, size_t *olen,
136 const unsigned char *input, unsigned char *output,
137 size_t output_max_len )
138{
139 return rsa_pkcs1_decrypt( (rsa_context *) ctx, mode, olen, input, output,
140 output_max_len );
141}
142
143static int ssl_rsa_sign( void *ctx,
144 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
145 int mode, int hash_id, unsigned int hashlen,
146 const unsigned char *hash, unsigned char *sig )
147{
148 return rsa_pkcs1_sign( (rsa_context *) ctx, f_rng, p_rng, mode, hash_id,
149 hashlen, hash, sig );
150}
151
152static size_t ssl_rsa_key_len( void *ctx )
153{
154 return ( (rsa_context *) ctx )->len;
155}
Paul Bakkered27a042013-04-18 22:46:23 +0200156#endif /* POLARSSL_RSA_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +0000157
Paul Bakker5121ce52009-01-03 21:22:43 +0000158/*
159 * Key material generation
160 */
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200161static int ssl3_prf( const unsigned char *secret, size_t slen,
162 const char *label,
163 const unsigned char *random, size_t rlen,
Paul Bakker5f70b252012-09-13 14:23:06 +0000164 unsigned char *dstbuf, size_t dlen )
165{
166 size_t i;
167 md5_context md5;
168 sha1_context sha1;
169 unsigned char padding[16];
170 unsigned char sha1sum[20];
171 ((void)label);
172
173 /*
174 * SSLv3:
175 * block =
176 * MD5( secret + SHA1( 'A' + secret + random ) ) +
177 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
178 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
179 * ...
180 */
181 for( i = 0; i < dlen / 16; i++ )
182 {
183 memset( padding, 'A' + i, 1 + i );
184
185 sha1_starts( &sha1 );
186 sha1_update( &sha1, padding, 1 + i );
187 sha1_update( &sha1, secret, slen );
188 sha1_update( &sha1, random, rlen );
189 sha1_finish( &sha1, sha1sum );
190
191 md5_starts( &md5 );
192 md5_update( &md5, secret, slen );
193 md5_update( &md5, sha1sum, 20 );
194 md5_finish( &md5, dstbuf + i * 16 );
195 }
196
197 memset( &md5, 0, sizeof( md5 ) );
198 memset( &sha1, 0, sizeof( sha1 ) );
199
200 memset( padding, 0, sizeof( padding ) );
201 memset( sha1sum, 0, sizeof( sha1sum ) );
202
203 return( 0 );
204}
205
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200206static int tls1_prf( const unsigned char *secret, size_t slen,
207 const char *label,
208 const unsigned char *random, size_t rlen,
Paul Bakker23986e52011-04-24 08:57:21 +0000209 unsigned char *dstbuf, size_t dlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000210{
Paul Bakker23986e52011-04-24 08:57:21 +0000211 size_t nb, hs;
212 size_t i, j, k;
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200213 const unsigned char *S1, *S2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000214 unsigned char tmp[128];
215 unsigned char h_i[20];
216
217 if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
Paul Bakker40e46942009-01-03 21:51:57 +0000218 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000219
220 hs = ( slen + 1 ) / 2;
221 S1 = secret;
222 S2 = secret + slen - hs;
223
224 nb = strlen( label );
225 memcpy( tmp + 20, label, nb );
226 memcpy( tmp + 20 + nb, random, rlen );
227 nb += rlen;
228
229 /*
230 * First compute P_md5(secret,label+random)[0..dlen]
231 */
232 md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
233
234 for( i = 0; i < dlen; i += 16 )
235 {
236 md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
237 md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp );
238
239 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
240
241 for( j = 0; j < k; j++ )
242 dstbuf[i + j] = h_i[j];
243 }
244
245 /*
246 * XOR out with P_sha1(secret,label+random)[0..dlen]
247 */
248 sha1_hmac( S2, hs, tmp + 20, nb, tmp );
249
250 for( i = 0; i < dlen; i += 20 )
251 {
252 sha1_hmac( S2, hs, tmp, 20 + nb, h_i );
253 sha1_hmac( S2, hs, tmp, 20, tmp );
254
255 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
256
257 for( j = 0; j < k; j++ )
258 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
259 }
260
261 memset( tmp, 0, sizeof( tmp ) );
262 memset( h_i, 0, sizeof( h_i ) );
263
264 return( 0 );
265}
266
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200267static int tls_prf_sha256( const unsigned char *secret, size_t slen,
268 const char *label,
269 const unsigned char *random, size_t rlen,
Paul Bakker1ef83d62012-04-11 12:09:53 +0000270 unsigned char *dstbuf, size_t dlen )
271{
272 size_t nb;
273 size_t i, j, k;
274 unsigned char tmp[128];
275 unsigned char h_i[32];
276
277 if( sizeof( tmp ) < 32 + strlen( label ) + rlen )
278 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
279
280 nb = strlen( label );
281 memcpy( tmp + 32, label, nb );
282 memcpy( tmp + 32 + nb, random, rlen );
283 nb += rlen;
284
285 /*
286 * Compute P_<hash>(secret, label + random)[0..dlen]
287 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200288 sha256_hmac( secret, slen, tmp + 32, nb, tmp, 0 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000289
290 for( i = 0; i < dlen; i += 32 )
291 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200292 sha256_hmac( secret, slen, tmp, 32 + nb, h_i, 0 );
293 sha256_hmac( secret, slen, tmp, 32, tmp, 0 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000294
295 k = ( i + 32 > dlen ) ? dlen % 32 : 32;
296
297 for( j = 0; j < k; j++ )
298 dstbuf[i + j] = h_i[j];
299 }
300
301 memset( tmp, 0, sizeof( tmp ) );
302 memset( h_i, 0, sizeof( h_i ) );
303
304 return( 0 );
305}
306
Paul Bakker9e36f042013-06-30 14:34:05 +0200307#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200308static int tls_prf_sha384( const unsigned char *secret, size_t slen,
309 const char *label,
310 const unsigned char *random, size_t rlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000311 unsigned char *dstbuf, size_t dlen )
312{
313 size_t nb;
314 size_t i, j, k;
315 unsigned char tmp[128];
316 unsigned char h_i[48];
317
318 if( sizeof( tmp ) < 48 + strlen( label ) + rlen )
319 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
320
321 nb = strlen( label );
322 memcpy( tmp + 48, label, nb );
323 memcpy( tmp + 48 + nb, random, rlen );
324 nb += rlen;
325
326 /*
327 * Compute P_<hash>(secret, label + random)[0..dlen]
328 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200329 sha512_hmac( secret, slen, tmp + 48, nb, tmp, 1 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000330
331 for( i = 0; i < dlen; i += 48 )
332 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200333 sha512_hmac( secret, slen, tmp, 48 + nb, h_i, 1 );
334 sha512_hmac( secret, slen, tmp, 48, tmp, 1 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000335
336 k = ( i + 48 > dlen ) ? dlen % 48 : 48;
337
338 for( j = 0; j < k; j++ )
339 dstbuf[i + j] = h_i[j];
340 }
341
342 memset( tmp, 0, sizeof( tmp ) );
343 memset( h_i, 0, sizeof( h_i ) );
344
345 return( 0 );
346}
Paul Bakker769075d2012-11-24 11:26:46 +0100347#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +0000348
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200349static void ssl_update_checksum_start(ssl_context *, const unsigned char *, size_t);
350static void ssl_update_checksum_md5sha1(ssl_context *, const unsigned char *, size_t);
351static void ssl_update_checksum_sha256(ssl_context *, const unsigned char *, size_t);
Paul Bakker380da532012-04-18 16:10:25 +0000352
353static void ssl_calc_verify_ssl(ssl_context *,unsigned char *);
354static void ssl_calc_verify_tls(ssl_context *,unsigned char *);
355static void ssl_calc_verify_tls_sha256(ssl_context *,unsigned char *);
Paul Bakker380da532012-04-18 16:10:25 +0000356
Paul Bakkerca4ab492012-04-18 14:23:57 +0000357static void ssl_calc_finished_ssl(ssl_context *,unsigned char *,int);
358static void ssl_calc_finished_tls(ssl_context *,unsigned char *,int);
359static void ssl_calc_finished_tls_sha256(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100360
Paul Bakker9e36f042013-06-30 14:34:05 +0200361#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200362static void ssl_update_checksum_sha384(ssl_context *, const unsigned char *, size_t);
Paul Bakker769075d2012-11-24 11:26:46 +0100363static void ssl_calc_verify_tls_sha384(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000364static void ssl_calc_finished_tls_sha384(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100365#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000366
Paul Bakker5121ce52009-01-03 21:22:43 +0000367int ssl_derive_keys( ssl_context *ssl )
368{
Paul Bakker5121ce52009-01-03 21:22:43 +0000369 unsigned char tmp[64];
Paul Bakker5121ce52009-01-03 21:22:43 +0000370 unsigned char keyblk[256];
371 unsigned char *key1;
372 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100373 unsigned char *mac_enc;
374 unsigned char *mac_dec;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000375 unsigned int iv_copy_len;
Paul Bakker68884e32013-01-07 18:20:04 +0100376 const cipher_info_t *cipher_info;
377 const md_info_t *md_info;
Paul Bakker61d113b2013-07-04 11:51:43 +0200378 int ret;
Paul Bakker68884e32013-01-07 18:20:04 +0100379
Paul Bakker48916f92012-09-16 19:57:18 +0000380 ssl_session *session = ssl->session_negotiate;
381 ssl_transform *transform = ssl->transform_negotiate;
382 ssl_handshake_params *handshake = ssl->handshake;
Paul Bakker5121ce52009-01-03 21:22:43 +0000383
384 SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
385
Paul Bakker68884e32013-01-07 18:20:04 +0100386 cipher_info = cipher_info_from_type( transform->ciphersuite_info->cipher );
387 if( cipher_info == NULL )
388 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200389 SSL_DEBUG_MSG( 1, ( "cipher info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100390 transform->ciphersuite_info->cipher ) );
391 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
392 }
393
394 md_info = md_info_from_type( transform->ciphersuite_info->mac );
395 if( md_info == NULL )
396 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200397 SSL_DEBUG_MSG( 1, ( "md info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100398 transform->ciphersuite_info->mac ) );
399 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
400 }
401
Paul Bakker5121ce52009-01-03 21:22:43 +0000402 /*
Paul Bakkerca4ab492012-04-18 14:23:57 +0000403 * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
Paul Bakker1ef83d62012-04-11 12:09:53 +0000404 */
405 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000406 {
Paul Bakker48916f92012-09-16 19:57:18 +0000407 handshake->tls_prf = ssl3_prf;
408 handshake->calc_verify = ssl_calc_verify_ssl;
409 handshake->calc_finished = ssl_calc_finished_ssl;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000410 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000411 else if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000412 {
Paul Bakker48916f92012-09-16 19:57:18 +0000413 handshake->tls_prf = tls1_prf;
414 handshake->calc_verify = ssl_calc_verify_tls;
415 handshake->calc_finished = ssl_calc_finished_tls;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000416 }
Paul Bakker9e36f042013-06-30 14:34:05 +0200417#if defined(POLARSSL_SHA512_C)
Paul Bakkerb7149bc2013-03-20 15:30:09 +0100418 else if( transform->ciphersuite_info->mac ==
419 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000420 {
Paul Bakker48916f92012-09-16 19:57:18 +0000421 handshake->tls_prf = tls_prf_sha384;
422 handshake->calc_verify = ssl_calc_verify_tls_sha384;
423 handshake->calc_finished = ssl_calc_finished_tls_sha384;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000424 }
Paul Bakker769075d2012-11-24 11:26:46 +0100425#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000426 else
Paul Bakkerca4ab492012-04-18 14:23:57 +0000427 {
Paul Bakker48916f92012-09-16 19:57:18 +0000428 handshake->tls_prf = tls_prf_sha256;
429 handshake->calc_verify = ssl_calc_verify_tls_sha256;
430 handshake->calc_finished = ssl_calc_finished_tls_sha256;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000431 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000432
433 /*
Paul Bakker5121ce52009-01-03 21:22:43 +0000434 * SSLv3:
435 * master =
436 * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
437 * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
438 * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
Paul Bakkerf7abd422013-04-16 13:15:56 +0200439 *
Paul Bakker5121ce52009-01-03 21:22:43 +0000440 * TLSv1:
441 * master = PRF( premaster, "master secret", randbytes )[0..47]
442 */
Paul Bakker0a597072012-09-25 21:55:46 +0000443 if( handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000444 {
Paul Bakker48916f92012-09-16 19:57:18 +0000445 SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
446 handshake->pmslen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000447
Paul Bakker48916f92012-09-16 19:57:18 +0000448 handshake->tls_prf( handshake->premaster, handshake->pmslen,
449 "master secret",
450 handshake->randbytes, 64, session->master, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000451
Paul Bakker48916f92012-09-16 19:57:18 +0000452 memset( handshake->premaster, 0, sizeof( handshake->premaster ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000453 }
454 else
455 SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
456
457 /*
458 * Swap the client and server random values.
459 */
Paul Bakker48916f92012-09-16 19:57:18 +0000460 memcpy( tmp, handshake->randbytes, 64 );
461 memcpy( handshake->randbytes, tmp + 32, 32 );
462 memcpy( handshake->randbytes + 32, tmp, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000463 memset( tmp, 0, sizeof( tmp ) );
464
465 /*
466 * SSLv3:
467 * key block =
468 * MD5( master + SHA1( 'A' + master + randbytes ) ) +
469 * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
470 * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
471 * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
472 * ...
473 *
474 * TLSv1:
475 * key block = PRF( master, "key expansion", randbytes )
476 */
Paul Bakker48916f92012-09-16 19:57:18 +0000477 handshake->tls_prf( session->master, 48, "key expansion",
478 handshake->randbytes, 64, keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000479
Paul Bakker48916f92012-09-16 19:57:18 +0000480 SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
481 ssl_get_ciphersuite_name( session->ciphersuite ) ) );
482 SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
483 SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000484 SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
485
Paul Bakker48916f92012-09-16 19:57:18 +0000486 memset( handshake->randbytes, 0, sizeof( handshake->randbytes ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000487
488 /*
489 * Determine the appropriate key, IV and MAC length.
490 */
Paul Bakker68884e32013-01-07 18:20:04 +0100491
492 if( cipher_info->mode == POLARSSL_MODE_GCM )
Paul Bakker5121ce52009-01-03 21:22:43 +0000493 {
Paul Bakker68884e32013-01-07 18:20:04 +0100494 transform->keylen = cipher_info->key_length;
495 transform->keylen /= 8;
496 transform->minlen = 1;
497 transform->ivlen = 12;
498 transform->fixed_ivlen = 4;
499 transform->maclen = 0;
500 }
501 else
502 {
503 if( md_info->type != POLARSSL_MD_NONE )
504 {
Paul Bakker61d113b2013-07-04 11:51:43 +0200505 if( ( ret = md_init_ctx( &transform->md_ctx_enc, md_info ) ) != 0 )
506 {
507 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
508 return( ret );
509 }
510
511 if( ( ret = md_init_ctx( &transform->md_ctx_dec, md_info ) ) != 0 )
512 {
513 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
514 return( ret );
515 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000516
Paul Bakker68884e32013-01-07 18:20:04 +0100517 transform->maclen = md_get_size( md_info );
Manuel Pégourié-Gonnard277f7f22013-07-19 12:19:21 +0200518
519 /*
520 * If HMAC is to be truncated, we shall keep the leftmost bytes,
521 * (rfc 6066 page 13 or rfc 2104 section 4),
522 * so we only need to adjust the length here.
523 */
524 if( session->trunc_hmac == SSL_TRUNC_HMAC_ENABLED )
525 transform->maclen = SSL_TRUNCATED_HMAC_LEN;
Paul Bakker68884e32013-01-07 18:20:04 +0100526 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000527
Paul Bakker68884e32013-01-07 18:20:04 +0100528 transform->keylen = cipher_info->key_length;
529 transform->keylen /= 8;
530 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +0000531
Paul Bakker68884e32013-01-07 18:20:04 +0100532 transform->minlen = transform->keylen;
533 if( transform->minlen < transform->maclen )
534 {
535 if( cipher_info->mode == POLARSSL_MODE_STREAM )
536 transform->minlen = transform->maclen;
537 else
538 transform->minlen += transform->keylen;
539 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000540 }
541
542 SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000543 transform->keylen, transform->minlen, transform->ivlen,
544 transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000545
546 /*
547 * Finally setup the cipher contexts, IVs and MAC secrets.
548 */
549 if( ssl->endpoint == SSL_IS_CLIENT )
550 {
Paul Bakker48916f92012-09-16 19:57:18 +0000551 key1 = keyblk + transform->maclen * 2;
552 key2 = keyblk + transform->maclen * 2 + transform->keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000553
Paul Bakker68884e32013-01-07 18:20:04 +0100554 mac_enc = keyblk;
555 mac_dec = keyblk + transform->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000556
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000557 /*
558 * This is not used in TLS v1.1.
559 */
Paul Bakker48916f92012-09-16 19:57:18 +0000560 iv_copy_len = ( transform->fixed_ivlen ) ?
561 transform->fixed_ivlen : transform->ivlen;
562 memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len );
563 memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000564 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000565 }
566 else
567 {
Paul Bakker48916f92012-09-16 19:57:18 +0000568 key1 = keyblk + transform->maclen * 2 + transform->keylen;
569 key2 = keyblk + transform->maclen * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000570
Paul Bakker68884e32013-01-07 18:20:04 +0100571 mac_enc = keyblk + transform->maclen;
572 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +0000573
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000574 /*
575 * This is not used in TLS v1.1.
576 */
Paul Bakker48916f92012-09-16 19:57:18 +0000577 iv_copy_len = ( transform->fixed_ivlen ) ?
578 transform->fixed_ivlen : transform->ivlen;
579 memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len );
580 memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000581 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000582 }
583
Paul Bakker68884e32013-01-07 18:20:04 +0100584 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
585 {
586 memcpy( transform->mac_enc, mac_enc, transform->maclen );
587 memcpy( transform->mac_dec, mac_dec, transform->maclen );
588 }
589 else
590 {
591 md_hmac_starts( &transform->md_ctx_enc, mac_enc, transform->maclen );
592 md_hmac_starts( &transform->md_ctx_dec, mac_dec, transform->maclen );
593 }
594
Paul Bakker05ef8352012-05-08 09:17:57 +0000595#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
596 if( ssl_hw_record_init != NULL)
597 {
598 int ret = 0;
599
600 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) );
601
Paul Bakker07eb38b2012-12-19 14:42:06 +0100602 if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->keylen,
603 transform->iv_enc, transform->iv_dec,
604 iv_copy_len,
Paul Bakker68884e32013-01-07 18:20:04 +0100605 mac_enc, mac_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100606 transform->maclen ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +0000607 {
608 SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret );
609 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
610 }
611 }
612#endif
613
Paul Bakker68884e32013-01-07 18:20:04 +0100614 switch( cipher_info->type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000615 {
Paul Bakker40e46942009-01-03 21:51:57 +0000616#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100617 case POLARSSL_CIPHER_ARC4_128:
Paul Bakker48916f92012-09-16 19:57:18 +0000618 arc4_setup( (arc4_context *) transform->ctx_enc, key1,
619 transform->keylen );
620 arc4_setup( (arc4_context *) transform->ctx_dec, key2,
621 transform->keylen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000622 break;
623#endif
624
Paul Bakker40e46942009-01-03 21:51:57 +0000625#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100626 case POLARSSL_CIPHER_DES_EDE3_CBC:
627 des3_set3key_enc( (des3_context *) transform->ctx_enc, key1 );
628 des3_set3key_dec( (des3_context *) transform->ctx_dec, key2 );
629 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000630#endif
631
Paul Bakker40e46942009-01-03 21:51:57 +0000632#if defined(POLARSSL_AES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100633 case POLARSSL_CIPHER_AES_128_CBC:
634 case POLARSSL_CIPHER_AES_256_CBC:
635 aes_setkey_enc( (aes_context*) transform->ctx_enc, key1,
636 cipher_info->key_length );
637 aes_setkey_dec( (aes_context*) transform->ctx_dec, key2,
638 cipher_info->key_length );
Paul Bakker5121ce52009-01-03 21:22:43 +0000639 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000640#endif
641
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000642#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100643 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
644 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
645 camellia_setkey_enc( (camellia_context*) transform->ctx_enc, key1,
646 cipher_info->key_length );
647 camellia_setkey_dec( (camellia_context*) transform->ctx_dec, key2,
648 cipher_info->key_length );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000649 break;
650#endif
651
Paul Bakkerfab5c822012-02-06 16:45:10 +0000652#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100653 case POLARSSL_CIPHER_DES_CBC:
Paul Bakker48916f92012-09-16 19:57:18 +0000654 des_setkey_enc( (des_context *) transform->ctx_enc, key1 );
655 des_setkey_dec( (des_context *) transform->ctx_dec, key2 );
Paul Bakkerfab5c822012-02-06 16:45:10 +0000656 break;
657#endif
Paul Bakker68884e32013-01-07 18:20:04 +0100658
659#if defined(POLARSSL_GCM_C)
660 case POLARSSL_CIPHER_AES_128_GCM:
661 case POLARSSL_CIPHER_AES_256_GCM:
662 gcm_init( (gcm_context *) transform->ctx_enc, key1,
663 cipher_info->key_length );
664 gcm_init( (gcm_context *) transform->ctx_dec, key2,
665 cipher_info->key_length );
666 break;
667#endif
668
669 case POLARSSL_CIPHER_NULL:
670 break;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000671
Paul Bakker5121ce52009-01-03 21:22:43 +0000672 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000673 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000674 }
675
676 memset( keyblk, 0, sizeof( keyblk ) );
677
Paul Bakker2770fbd2012-07-03 13:30:23 +0000678#if defined(POLARSSL_ZLIB_SUPPORT)
679 // Initialize compression
680 //
Paul Bakker48916f92012-09-16 19:57:18 +0000681 if( session->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000682 {
683 SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
684
Paul Bakker48916f92012-09-16 19:57:18 +0000685 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
686 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000687
Paul Bakker48916f92012-09-16 19:57:18 +0000688 if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK ||
689 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000690 {
691 SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
692 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
693 }
694 }
695#endif /* POLARSSL_ZLIB_SUPPORT */
696
Paul Bakker5121ce52009-01-03 21:22:43 +0000697 SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
698
699 return( 0 );
700}
701
Paul Bakker380da532012-04-18 16:10:25 +0000702void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000703{
704 md5_context md5;
705 sha1_context sha1;
706 unsigned char pad_1[48];
707 unsigned char pad_2[48];
708
Paul Bakker380da532012-04-18 16:10:25 +0000709 SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000710
Paul Bakker48916f92012-09-16 19:57:18 +0000711 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
712 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000713
Paul Bakker380da532012-04-18 16:10:25 +0000714 memset( pad_1, 0x36, 48 );
715 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000716
Paul Bakker48916f92012-09-16 19:57:18 +0000717 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000718 md5_update( &md5, pad_1, 48 );
719 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000720
Paul Bakker380da532012-04-18 16:10:25 +0000721 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +0000722 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000723 md5_update( &md5, pad_2, 48 );
724 md5_update( &md5, hash, 16 );
725 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000726
Paul Bakker48916f92012-09-16 19:57:18 +0000727 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000728 sha1_update( &sha1, pad_1, 40 );
729 sha1_finish( &sha1, hash + 16 );
730
731 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +0000732 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000733 sha1_update( &sha1, pad_2, 40 );
734 sha1_update( &sha1, hash + 16, 20 );
735 sha1_finish( &sha1, hash + 16 );
736
737 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
738 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
739
740 return;
741}
742
743void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] )
744{
745 md5_context md5;
746 sha1_context sha1;
747
748 SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
749
Paul Bakker48916f92012-09-16 19:57:18 +0000750 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
751 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000752
Paul Bakker48916f92012-09-16 19:57:18 +0000753 md5_finish( &md5, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000754 sha1_finish( &sha1, hash + 16 );
755
756 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
757 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
758
759 return;
760}
761
762void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] )
763{
Paul Bakker9e36f042013-06-30 14:34:05 +0200764 sha256_context sha256;
Paul Bakker380da532012-04-18 16:10:25 +0000765
766 SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
767
Paul Bakker9e36f042013-06-30 14:34:05 +0200768 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
769 sha256_finish( &sha256, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000770
771 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
772 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
773
774 return;
775}
776
Paul Bakker9e36f042013-06-30 14:34:05 +0200777#if defined(POLARSSL_SHA512_C)
Paul Bakker380da532012-04-18 16:10:25 +0000778void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] )
779{
Paul Bakker9e36f042013-06-30 14:34:05 +0200780 sha512_context sha512;
Paul Bakker380da532012-04-18 16:10:25 +0000781
782 SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
783
Paul Bakker9e36f042013-06-30 14:34:05 +0200784 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
785 sha512_finish( &sha512, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000786
Paul Bakkerca4ab492012-04-18 14:23:57 +0000787 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000788 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
789
790 return;
791}
Paul Bakker769075d2012-11-24 11:26:46 +0100792#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000793
794/*
795 * SSLv3.0 MAC functions
796 */
Paul Bakker68884e32013-01-07 18:20:04 +0100797static void ssl_mac( md_context_t *md_ctx, unsigned char *secret,
798 unsigned char *buf, size_t len,
799 unsigned char *ctr, int type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000800{
801 unsigned char header[11];
802 unsigned char padding[48];
Paul Bakker68884e32013-01-07 18:20:04 +0100803 int padlen = 0;
804 int md_size = md_get_size( md_ctx->md_info );
805 int md_type = md_get_type( md_ctx->md_info );
806
807 if( md_type == POLARSSL_MD_MD5 )
808 padlen = 48;
809 else if( md_type == POLARSSL_MD_SHA1 )
810 padlen = 40;
811 else if( md_type == POLARSSL_MD_SHA256 )
812 padlen = 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000813
814 memcpy( header, ctr, 8 );
815 header[ 8] = (unsigned char) type;
816 header[ 9] = (unsigned char)( len >> 8 );
817 header[10] = (unsigned char)( len );
818
Paul Bakker68884e32013-01-07 18:20:04 +0100819 memset( padding, 0x36, padlen );
820 md_starts( md_ctx );
821 md_update( md_ctx, secret, md_size );
822 md_update( md_ctx, padding, padlen );
823 md_update( md_ctx, header, 11 );
824 md_update( md_ctx, buf, len );
825 md_finish( md_ctx, buf + len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000826
Paul Bakker68884e32013-01-07 18:20:04 +0100827 memset( padding, 0x5C, padlen );
828 md_starts( md_ctx );
829 md_update( md_ctx, secret, md_size );
830 md_update( md_ctx, padding, padlen );
831 md_update( md_ctx, buf + len, md_size );
832 md_finish( md_ctx, buf + len );
Paul Bakker5f70b252012-09-13 14:23:06 +0000833}
834
Paul Bakker5121ce52009-01-03 21:22:43 +0000835/*
836 * Encryption/decryption functions
Paul Bakkerf7abd422013-04-16 13:15:56 +0200837 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000838static int ssl_encrypt_buf( ssl_context *ssl )
839{
Paul Bakker23986e52011-04-24 08:57:21 +0000840 size_t i, padlen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000841
842 SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
843
844 /*
845 * Add MAC then encrypt
846 */
847 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
848 {
Paul Bakker68884e32013-01-07 18:20:04 +0100849 ssl_mac( &ssl->transform_out->md_ctx_enc,
850 ssl->transform_out->mac_enc,
851 ssl->out_msg, ssl->out_msglen,
852 ssl->out_ctr, ssl->out_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +0000853 }
854 else
855 {
Paul Bakker68884e32013-01-07 18:20:04 +0100856 md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 13 );
857 md_hmac_update( &ssl->transform_out->md_ctx_enc,
858 ssl->out_msg, ssl->out_msglen );
859 md_hmac_finish( &ssl->transform_out->md_ctx_enc,
860 ssl->out_msg + ssl->out_msglen );
861 md_hmac_reset( &ssl->transform_out->md_ctx_enc );
Paul Bakker5121ce52009-01-03 21:22:43 +0000862 }
863
864 SSL_DEBUG_BUF( 4, "computed mac",
Paul Bakker48916f92012-09-16 19:57:18 +0000865 ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000866
Paul Bakker48916f92012-09-16 19:57:18 +0000867 ssl->out_msglen += ssl->transform_out->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000868
Paul Bakker68884e32013-01-07 18:20:04 +0100869#if defined(POLARSSL_CIPHER_NULL_CIPHER)
870 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
871 {
872 padlen = 0;
873 }
874 else
875#endif /* POLARSSL_CIPHER_NULL_CIPHER */
876#if defined(POLARSSL_ARC4_C)
877 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000878 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000879 padlen = 0;
880
881 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
882 "including %d bytes of padding",
883 ssl->out_msglen, 0 ) );
884
885 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
886 ssl->out_msg, ssl->out_msglen );
887
Paul Bakker68884e32013-01-07 18:20:04 +0100888 arc4_crypt( (arc4_context *) ssl->transform_out->ctx_enc,
889 ssl->out_msglen, ssl->out_msg,
890 ssl->out_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +0000891 }
Paul Bakker68884e32013-01-07 18:20:04 +0100892 else
893#endif /* POLARSSL_ARC4_C */
894#if defined(POLARSSL_GCM_C)
895 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
896 ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000897 {
898 size_t enc_msglen;
899 unsigned char *enc_msg;
900 unsigned char add_data[13];
901 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
902
903 padlen = 0;
904 enc_msglen = ssl->out_msglen;
905
906 memcpy( add_data, ssl->out_ctr, 8 );
907 add_data[8] = ssl->out_msgtype;
908 add_data[9] = ssl->major_ver;
909 add_data[10] = ssl->minor_ver;
910 add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
911 add_data[12] = ssl->out_msglen & 0xFF;
912
913 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
914 add_data, 13 );
915
Paul Bakker68884e32013-01-07 18:20:04 +0100916 /*
917 * Generate IV
918 */
919 ret = ssl->f_rng( ssl->p_rng,
Paul Bakker48916f92012-09-16 19:57:18 +0000920 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
Paul Bakker68884e32013-01-07 18:20:04 +0100921 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
922 if( ret != 0 )
923 return( ret );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000924
Paul Bakker68884e32013-01-07 18:20:04 +0100925 memcpy( ssl->out_iv,
926 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
927 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000928
Paul Bakker68884e32013-01-07 18:20:04 +0100929 /*
930 * Fix pointer positions and message length with added IV
931 */
932 enc_msg = ssl->out_msg;
933 enc_msglen = ssl->out_msglen;
934 ssl->out_msglen += ssl->transform_out->ivlen -
935 ssl->transform_out->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000936
Paul Bakker68884e32013-01-07 18:20:04 +0100937 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
938 "including %d bytes of padding",
939 ssl->out_msglen, 0 ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000940
Paul Bakker68884e32013-01-07 18:20:04 +0100941 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
942 ssl->out_msg, ssl->out_msglen );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000943
Paul Bakker68884e32013-01-07 18:20:04 +0100944 /*
945 * Adjust for tag
946 */
947 ssl->out_msglen += 16;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000948
Paul Bakker68884e32013-01-07 18:20:04 +0100949 gcm_crypt_and_tag( (gcm_context *) ssl->transform_out->ctx_enc,
950 GCM_ENCRYPT, enc_msglen,
951 ssl->transform_out->iv_enc, ssl->transform_out->ivlen,
952 add_data, 13,
953 enc_msg, enc_msg,
954 16, enc_msg + enc_msglen );
955
956 SSL_DEBUG_BUF( 4, "after encrypt: tag",
957 enc_msg + enc_msglen, 16 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000958 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000959 else
Paul Bakker68884e32013-01-07 18:20:04 +0100960#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +0000961 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000962 unsigned char *enc_msg;
Paul Bakker23986e52011-04-24 08:57:21 +0000963 size_t enc_msglen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000964
Paul Bakker48916f92012-09-16 19:57:18 +0000965 padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
966 ssl->transform_out->ivlen;
967 if( padlen == ssl->transform_out->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000968 padlen = 0;
969
970 for( i = 0; i <= padlen; i++ )
971 ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
972
973 ssl->out_msglen += padlen + 1;
974
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000975 enc_msglen = ssl->out_msglen;
976 enc_msg = ssl->out_msg;
977
978 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +0000979 * Prepend per-record IV for block cipher in TLS v1.1 and up as per
980 * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000981 */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000982 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000983 {
984 /*
985 * Generate IV
986 */
Paul Bakker48916f92012-09-16 19:57:18 +0000987 int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc,
988 ssl->transform_out->ivlen );
Paul Bakkera3d195c2011-11-27 21:07:34 +0000989 if( ret != 0 )
990 return( ret );
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000991
Paul Bakker92be97b2013-01-02 17:30:03 +0100992 memcpy( ssl->out_iv, ssl->transform_out->iv_enc,
Paul Bakker48916f92012-09-16 19:57:18 +0000993 ssl->transform_out->ivlen );
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000994
995 /*
996 * Fix pointer positions and message length with added IV
997 */
Paul Bakker92be97b2013-01-02 17:30:03 +0100998 enc_msg = ssl->out_msg;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000999 enc_msglen = ssl->out_msglen;
Paul Bakker48916f92012-09-16 19:57:18 +00001000 ssl->out_msglen += ssl->transform_out->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001001 }
1002
Paul Bakker5121ce52009-01-03 21:22:43 +00001003 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001004 "including %d bytes of IV and %d bytes of padding",
Paul Bakker48916f92012-09-16 19:57:18 +00001005 ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001006
1007 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
Paul Bakker92be97b2013-01-02 17:30:03 +01001008 ssl->out_iv, ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001009
Paul Bakker68884e32013-01-07 18:20:04 +01001010 switch( ssl->transform_out->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +00001011 {
Paul Bakker68884e32013-01-07 18:20:04 +01001012 case POLARSSL_CIPHER_DES_CBC:
1013 des_crypt_cbc( (des_context *) ssl->transform_out->ctx_enc,
1014 DES_ENCRYPT, enc_msglen,
1015 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1016 break;
1017
1018 case POLARSSL_CIPHER_DES_EDE3_CBC:
1019 des3_crypt_cbc( (des3_context *) ssl->transform_out->ctx_enc,
1020 DES_ENCRYPT, enc_msglen,
1021 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1022 break;
1023
1024 case POLARSSL_CIPHER_AES_128_CBC:
1025 case POLARSSL_CIPHER_AES_256_CBC:
1026 aes_crypt_cbc( (aes_context *) ssl->transform_out->ctx_enc,
1027 AES_ENCRYPT, enc_msglen,
1028 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1029 break;
1030
1031 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
1032 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
1033 camellia_crypt_cbc( (camellia_context *) ssl->transform_out->ctx_enc,
1034 CAMELLIA_ENCRYPT, enc_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001035 ssl->transform_out->iv_enc, enc_msg, enc_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001036 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001037
1038 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001039 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001040 }
1041 }
1042
Paul Bakkerca4ab492012-04-18 14:23:57 +00001043 for( i = 8; i > 0; i-- )
1044 if( ++ssl->out_ctr[i - 1] != 0 )
1045 break;
1046
Paul Bakker5121ce52009-01-03 21:22:43 +00001047 SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
1048
1049 return( 0 );
1050}
1051
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001052#define POLARSSL_SSL_MAX_MAC_SIZE 48
Paul Bakkerfab5c822012-02-06 16:45:10 +00001053
Paul Bakker5121ce52009-01-03 21:22:43 +00001054static int ssl_decrypt_buf( ssl_context *ssl )
1055{
Paul Bakker45829992013-01-03 14:52:21 +01001056 size_t i, padlen = 0, correct = 1;
Paul Bakkerfab5c822012-02-06 16:45:10 +00001057 unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
Paul Bakker5121ce52009-01-03 21:22:43 +00001058
1059 SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
1060
Paul Bakker48916f92012-09-16 19:57:18 +00001061 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001062 {
1063 SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
Paul Bakker48916f92012-09-16 19:57:18 +00001064 ssl->in_msglen, ssl->transform_in->minlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001065 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001066 }
1067
Paul Bakker68884e32013-01-07 18:20:04 +01001068#if defined(POLARSSL_CIPHER_NULL_CIPHER)
1069 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001070 {
Paul Bakker68884e32013-01-07 18:20:04 +01001071 padlen = 0;
1072 }
1073 else
1074#endif /* POLARSSL_CIPHER_NULL_CIPHER */
Paul Bakker40e46942009-01-03 21:51:57 +00001075#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001076 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
1077 {
1078 padlen = 0;
1079
1080 arc4_crypt( (arc4_context *) ssl->transform_in->ctx_dec,
Paul Bakkerbaad6502010-03-21 15:42:15 +00001081 ssl->in_msglen, ssl->in_msg,
1082 ssl->in_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001083 }
Paul Bakker68884e32013-01-07 18:20:04 +01001084 else
1085#endif /* POLARSSL_ARC4_C */
1086#if defined(POLARSSL_GCM_C)
1087 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
1088 ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001089 {
1090 unsigned char *dec_msg;
1091 unsigned char *dec_msg_result;
1092 size_t dec_msglen;
1093 unsigned char add_data[13];
1094 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1095
Paul Bakker68884e32013-01-07 18:20:04 +01001096 padlen = 0;
1097
1098 dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
1099 ssl->transform_in->fixed_ivlen );
1100 dec_msglen -= 16;
1101 dec_msg = ssl->in_msg;
1102 dec_msg_result = ssl->in_msg;
1103 ssl->in_msglen = dec_msglen;
1104
1105 memcpy( add_data, ssl->in_ctr, 8 );
1106 add_data[8] = ssl->in_msgtype;
1107 add_data[9] = ssl->major_ver;
1108 add_data[10] = ssl->minor_ver;
1109 add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
1110 add_data[12] = ssl->in_msglen & 0xFF;
1111
1112 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1113 add_data, 13 );
1114
1115 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
1116 ssl->in_iv,
1117 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
1118
1119 SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
1120 ssl->transform_in->ivlen );
1121 SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
1122
1123 ret = gcm_auth_decrypt( (gcm_context *) ssl->transform_in->ctx_dec,
1124 dec_msglen,
1125 ssl->transform_in->iv_dec,
1126 ssl->transform_in->ivlen,
1127 add_data, 13,
1128 dec_msg + dec_msglen, 16,
1129 dec_msg, dec_msg_result );
1130
1131 if( ret != 0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001132 {
Paul Bakker68884e32013-01-07 18:20:04 +01001133 SSL_DEBUG_MSG( 1, ( "AEAD decrypt failed on validation (ret = -0x%02x)",
1134 -ret ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001135
Paul Bakker68884e32013-01-07 18:20:04 +01001136 return( POLARSSL_ERR_SSL_INVALID_MAC );
1137 }
Paul Bakkerca4ab492012-04-18 14:23:57 +00001138 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001139 else
Paul Bakker68884e32013-01-07 18:20:04 +01001140#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001141 {
Paul Bakker45829992013-01-03 14:52:21 +01001142 /*
1143 * Decrypt and check the padding
1144 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001145 unsigned char *dec_msg;
1146 unsigned char *dec_msg_result;
Paul Bakker23986e52011-04-24 08:57:21 +00001147 size_t dec_msglen;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001148 size_t minlen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001149
Paul Bakker5121ce52009-01-03 21:22:43 +00001150 /*
Paul Bakker45829992013-01-03 14:52:21 +01001151 * Check immediate ciphertext sanity
Paul Bakker5121ce52009-01-03 21:22:43 +00001152 */
Paul Bakker48916f92012-09-16 19:57:18 +00001153 if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001154 {
1155 SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
Paul Bakker48916f92012-09-16 19:57:18 +00001156 ssl->in_msglen, ssl->transform_in->ivlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001157 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001158 }
1159
Paul Bakker45829992013-01-03 14:52:21 +01001160 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
1161 minlen += ssl->transform_in->ivlen;
1162
1163 if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
1164 ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
1165 {
1166 SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
1167 ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) );
1168 return( POLARSSL_ERR_SSL_INVALID_MAC );
1169 }
1170
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001171 dec_msglen = ssl->in_msglen;
1172 dec_msg = ssl->in_msg;
1173 dec_msg_result = ssl->in_msg;
1174
1175 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001176 * Initialize for prepended IV for block cipher in TLS v1.1 and up
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001177 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001178 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001179 {
Paul Bakker48916f92012-09-16 19:57:18 +00001180 dec_msglen -= ssl->transform_in->ivlen;
1181 ssl->in_msglen -= ssl->transform_in->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001182
Paul Bakker48916f92012-09-16 19:57:18 +00001183 for( i = 0; i < ssl->transform_in->ivlen; i++ )
Paul Bakker92be97b2013-01-02 17:30:03 +01001184 ssl->transform_in->iv_dec[i] = ssl->in_iv[i];
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001185 }
1186
Paul Bakker68884e32013-01-07 18:20:04 +01001187 switch( ssl->transform_in->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +00001188 {
Paul Bakker68884e32013-01-07 18:20:04 +01001189 case POLARSSL_CIPHER_DES_CBC:
1190 des_crypt_cbc( (des_context *) ssl->transform_in->ctx_dec,
1191 DES_DECRYPT, dec_msglen,
1192 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
Paul Bakker5121ce52009-01-03 21:22:43 +00001193 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001194
Paul Bakker68884e32013-01-07 18:20:04 +01001195 case POLARSSL_CIPHER_DES_EDE3_CBC:
1196 des3_crypt_cbc( (des3_context *) ssl->transform_in->ctx_dec,
1197 DES_DECRYPT, dec_msglen,
1198 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1199 break;
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001200
Paul Bakker68884e32013-01-07 18:20:04 +01001201 case POLARSSL_CIPHER_AES_128_CBC:
1202 case POLARSSL_CIPHER_AES_256_CBC:
1203 aes_crypt_cbc( (aes_context *) ssl->transform_in->ctx_dec,
1204 AES_DECRYPT, dec_msglen,
1205 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1206 break;
1207
1208 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
1209 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
1210 camellia_crypt_cbc( (camellia_context *) ssl->transform_in->ctx_dec,
1211 CAMELLIA_DECRYPT, dec_msglen,
1212 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1213 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001214
1215 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001216 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001217 }
1218
1219 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
Paul Bakker45829992013-01-03 14:52:21 +01001220
1221 if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
1222 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001223#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001224 SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
1225 ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001226#endif
Paul Bakker45829992013-01-03 14:52:21 +01001227 padlen = 0;
Paul Bakker45829992013-01-03 14:52:21 +01001228 correct = 0;
1229 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001230
1231 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1232 {
Paul Bakker48916f92012-09-16 19:57:18 +00001233 if( padlen > ssl->transform_in->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001234 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001235#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001236 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
1237 "should be no more than %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001238 padlen, ssl->transform_in->ivlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001239#endif
Paul Bakker45829992013-01-03 14:52:21 +01001240 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001241 }
1242 }
1243 else
1244 {
1245 /*
Paul Bakker45829992013-01-03 14:52:21 +01001246 * TLSv1+: always check the padding up to the first failure
1247 * and fake check up to 256 bytes of padding
Paul Bakker5121ce52009-01-03 21:22:43 +00001248 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001249 size_t pad_count = 0, fake_pad_count = 0;
1250 size_t padding_idx = ssl->in_msglen - padlen - 1;
1251
Paul Bakker5121ce52009-01-03 21:22:43 +00001252 for( i = 1; i <= padlen; i++ )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001253 pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1254
1255 for( ; i <= 256; i++ )
1256 fake_pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1257
1258 correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
1259 correct &= ( pad_count + fake_pad_count < 512 ); /* Always 1 */
1260
Paul Bakkerd66f0702013-01-31 16:57:45 +01001261#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001262 if( padlen > 0 && correct == 0)
1263 SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001264#endif
Paul Bakkere47b34b2013-02-27 14:48:00 +01001265 padlen &= correct * 0x1FF;
Paul Bakker5121ce52009-01-03 21:22:43 +00001266 }
1267 }
1268
1269 SSL_DEBUG_BUF( 4, "raw buffer after decryption",
1270 ssl->in_msg, ssl->in_msglen );
1271
1272 /*
1273 * Always compute the MAC (RFC4346, CBCTIME).
1274 */
Paul Bakker48916f92012-09-16 19:57:18 +00001275 ssl->in_msglen -= ( ssl->transform_in->maclen + padlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001276
1277 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1278 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1279
Paul Bakker45829992013-01-03 14:52:21 +01001280 memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001281
1282 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1283 {
Paul Bakker68884e32013-01-07 18:20:04 +01001284 ssl_mac( &ssl->transform_in->md_ctx_dec,
1285 ssl->transform_in->mac_dec,
1286 ssl->in_msg, ssl->in_msglen,
1287 ssl->in_ctr, ssl->in_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +00001288 }
1289 else
1290 {
Paul Bakker45829992013-01-03 14:52:21 +01001291 /*
1292 * Process MAC and always update for padlen afterwards to make
1293 * total time independent of padlen
Paul Bakkere47b34b2013-02-27 14:48:00 +01001294 *
1295 * extra_run compensates MAC check for padlen
1296 *
1297 * Known timing attacks:
1298 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
1299 *
1300 * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
1301 * correctly. (We round down instead of up, so -56 is the correct
1302 * value for our calculations instead of -55)
Paul Bakker45829992013-01-03 14:52:21 +01001303 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001304 int j, extra_run = 0;
1305 extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
1306 ( 13 + ssl->in_msglen + 8 ) / 64;
1307
1308 extra_run &= correct * 0xFF;
1309
Paul Bakker68884e32013-01-07 18:20:04 +01001310 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 13 );
1311 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,
1312 ssl->in_msglen );
1313 md_hmac_finish( &ssl->transform_in->md_ctx_dec,
1314 ssl->in_msg + ssl->in_msglen );
1315 for( j = 0; j < extra_run; j++ )
1316 md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001317
Paul Bakker68884e32013-01-07 18:20:04 +01001318 md_hmac_reset( &ssl->transform_in->md_ctx_dec );
Paul Bakker5121ce52009-01-03 21:22:43 +00001319 }
1320
Paul Bakker48916f92012-09-16 19:57:18 +00001321 SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001322 SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001323 ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001324
1325 if( memcmp( tmp, ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001326 ssl->transform_in->maclen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001327 {
Paul Bakkere47b34b2013-02-27 14:48:00 +01001328#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001329 SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001330#endif
Paul Bakker45829992013-01-03 14:52:21 +01001331 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001332 }
1333
1334 /*
Paul Bakker45829992013-01-03 14:52:21 +01001335 * Finally check the correct flag
Paul Bakker5121ce52009-01-03 21:22:43 +00001336 */
Paul Bakker45829992013-01-03 14:52:21 +01001337 if( correct == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +00001338 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001339
1340 if( ssl->in_msglen == 0 )
1341 {
1342 ssl->nb_zero++;
1343
1344 /*
1345 * Three or more empty messages may be a DoS attack
1346 * (excessive CPU consumption).
1347 */
1348 if( ssl->nb_zero > 3 )
1349 {
1350 SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
1351 "messages, possible DoS attack" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001352 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001353 }
1354 }
1355 else
1356 ssl->nb_zero = 0;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001357
Paul Bakker23986e52011-04-24 08:57:21 +00001358 for( i = 8; i > 0; i-- )
1359 if( ++ssl->in_ctr[i - 1] != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001360 break;
1361
1362 SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
1363
1364 return( 0 );
1365}
1366
Paul Bakker2770fbd2012-07-03 13:30:23 +00001367#if defined(POLARSSL_ZLIB_SUPPORT)
1368/*
1369 * Compression/decompression functions
1370 */
1371static int ssl_compress_buf( ssl_context *ssl )
1372{
1373 int ret;
1374 unsigned char *msg_post = ssl->out_msg;
1375 size_t len_pre = ssl->out_msglen;
1376 unsigned char *msg_pre;
1377
1378 SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
1379
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001380 if( len_pre == 0 )
1381 return( 0 );
1382
Paul Bakker6e339b52013-07-03 13:37:05 +02001383 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001384 if( msg_pre == NULL )
1385 {
1386 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1387 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1388 }
1389
1390 memcpy( msg_pre, ssl->out_msg, len_pre );
1391
1392 SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
1393 ssl->out_msglen ) );
1394
1395 SSL_DEBUG_BUF( 4, "before compression: output payload",
1396 ssl->out_msg, ssl->out_msglen );
1397
Paul Bakker48916f92012-09-16 19:57:18 +00001398 ssl->transform_out->ctx_deflate.next_in = msg_pre;
1399 ssl->transform_out->ctx_deflate.avail_in = len_pre;
1400 ssl->transform_out->ctx_deflate.next_out = msg_post;
1401 ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001402
Paul Bakker48916f92012-09-16 19:57:18 +00001403 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001404 if( ret != Z_OK )
1405 {
1406 SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
1407 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1408 }
1409
Paul Bakker48916f92012-09-16 19:57:18 +00001410 ssl->out_msglen = SSL_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001411
Paul Bakker6e339b52013-07-03 13:37:05 +02001412 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001413
1414 SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
1415 ssl->out_msglen ) );
1416
1417 SSL_DEBUG_BUF( 4, "after compression: output payload",
1418 ssl->out_msg, ssl->out_msglen );
1419
1420 SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
1421
1422 return( 0 );
1423}
1424
1425static int ssl_decompress_buf( ssl_context *ssl )
1426{
1427 int ret;
1428 unsigned char *msg_post = ssl->in_msg;
1429 size_t len_pre = ssl->in_msglen;
1430 unsigned char *msg_pre;
1431
1432 SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
1433
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001434 if( len_pre == 0 )
1435 return( 0 );
1436
Paul Bakker6e339b52013-07-03 13:37:05 +02001437 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001438 if( msg_pre == NULL )
1439 {
1440 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1441 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1442 }
1443
1444 memcpy( msg_pre, ssl->in_msg, len_pre );
1445
1446 SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
1447 ssl->in_msglen ) );
1448
1449 SSL_DEBUG_BUF( 4, "before decompression: input payload",
1450 ssl->in_msg, ssl->in_msglen );
1451
Paul Bakker48916f92012-09-16 19:57:18 +00001452 ssl->transform_in->ctx_inflate.next_in = msg_pre;
1453 ssl->transform_in->ctx_inflate.avail_in = len_pre;
1454 ssl->transform_in->ctx_inflate.next_out = msg_post;
1455 ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001456
Paul Bakker48916f92012-09-16 19:57:18 +00001457 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001458 if( ret != Z_OK )
1459 {
1460 SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
1461 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1462 }
1463
Paul Bakker48916f92012-09-16 19:57:18 +00001464 ssl->in_msglen = SSL_MAX_CONTENT_LEN - ssl->transform_in->ctx_inflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001465
Paul Bakker6e339b52013-07-03 13:37:05 +02001466 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001467
1468 SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
1469 ssl->in_msglen ) );
1470
1471 SSL_DEBUG_BUF( 4, "after decompression: input payload",
1472 ssl->in_msg, ssl->in_msglen );
1473
1474 SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
1475
1476 return( 0 );
1477}
1478#endif /* POLARSSL_ZLIB_SUPPORT */
1479
Paul Bakker5121ce52009-01-03 21:22:43 +00001480/*
1481 * Fill the input message buffer
1482 */
Paul Bakker23986e52011-04-24 08:57:21 +00001483int ssl_fetch_input( ssl_context *ssl, size_t nb_want )
Paul Bakker5121ce52009-01-03 21:22:43 +00001484{
Paul Bakker23986e52011-04-24 08:57:21 +00001485 int ret;
1486 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001487
1488 SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
1489
1490 while( ssl->in_left < nb_want )
1491 {
1492 len = nb_want - ssl->in_left;
1493 ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
1494
1495 SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
1496 ssl->in_left, nb_want ) );
1497 SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
1498
Paul Bakker831a7552011-05-18 13:32:51 +00001499 if( ret == 0 )
1500 return( POLARSSL_ERR_SSL_CONN_EOF );
1501
Paul Bakker5121ce52009-01-03 21:22:43 +00001502 if( ret < 0 )
1503 return( ret );
1504
1505 ssl->in_left += ret;
1506 }
1507
1508 SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
1509
1510 return( 0 );
1511}
1512
1513/*
1514 * Flush any data not yet written
1515 */
1516int ssl_flush_output( ssl_context *ssl )
1517{
1518 int ret;
1519 unsigned char *buf;
1520
1521 SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
1522
1523 while( ssl->out_left > 0 )
1524 {
1525 SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
1526 5 + ssl->out_msglen, ssl->out_left ) );
1527
Paul Bakker5bd42292012-12-19 14:40:42 +01001528 buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
Paul Bakker5121ce52009-01-03 21:22:43 +00001529 ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
Paul Bakker186751d2012-05-08 13:16:14 +00001530
Paul Bakker5121ce52009-01-03 21:22:43 +00001531 SSL_DEBUG_RET( 2, "ssl->f_send", ret );
1532
1533 if( ret <= 0 )
1534 return( ret );
1535
1536 ssl->out_left -= ret;
1537 }
1538
1539 SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
1540
1541 return( 0 );
1542}
1543
1544/*
1545 * Record layer functions
1546 */
1547int ssl_write_record( ssl_context *ssl )
1548{
Paul Bakker05ef8352012-05-08 09:17:57 +00001549 int ret, done = 0;
Paul Bakker23986e52011-04-24 08:57:21 +00001550 size_t len = ssl->out_msglen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001551
1552 SSL_DEBUG_MSG( 2, ( "=> write record" ) );
1553
Paul Bakker5121ce52009-01-03 21:22:43 +00001554 if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
1555 {
1556 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
1557 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
1558 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
1559
Paul Bakker48916f92012-09-16 19:57:18 +00001560 ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001561 }
1562
Paul Bakker2770fbd2012-07-03 13:30:23 +00001563#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001564 if( ssl->transform_out != NULL &&
1565 ssl->session_out->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001566 {
1567 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
1568 {
1569 SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
1570 return( ret );
1571 }
1572
1573 len = ssl->out_msglen;
1574 }
1575#endif /*POLARSSL_ZLIB_SUPPORT */
1576
Paul Bakker05ef8352012-05-08 09:17:57 +00001577#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1578 if( ssl_hw_record_write != NULL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001579 {
Paul Bakker05ef8352012-05-08 09:17:57 +00001580 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001581
Paul Bakker05ef8352012-05-08 09:17:57 +00001582 ret = ssl_hw_record_write( ssl );
1583 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1584 {
1585 SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret );
1586 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1587 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001588
1589 if( ret == 0 )
1590 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001591 }
1592#endif
1593 if( !done )
1594 {
1595 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
1596 ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
1597 ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00001598 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1599 ssl->out_hdr[4] = (unsigned char)( len );
Paul Bakker05ef8352012-05-08 09:17:57 +00001600
Paul Bakker48916f92012-09-16 19:57:18 +00001601 if( ssl->transform_out != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001602 {
1603 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
1604 {
1605 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
1606 return( ret );
1607 }
1608
1609 len = ssl->out_msglen;
1610 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1611 ssl->out_hdr[4] = (unsigned char)( len );
1612 }
1613
1614 ssl->out_left = 5 + ssl->out_msglen;
1615
1616 SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
1617 "version = [%d:%d], msglen = %d",
1618 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
1619 ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
1620
1621 SSL_DEBUG_BUF( 4, "output record sent to network",
Paul Bakker5bd42292012-12-19 14:40:42 +01001622 ssl->out_hdr, 5 + ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001623 }
1624
Paul Bakker5121ce52009-01-03 21:22:43 +00001625 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1626 {
1627 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
1628 return( ret );
1629 }
1630
1631 SSL_DEBUG_MSG( 2, ( "<= write record" ) );
1632
1633 return( 0 );
1634}
1635
1636int ssl_read_record( ssl_context *ssl )
1637{
Paul Bakker05ef8352012-05-08 09:17:57 +00001638 int ret, done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001639
1640 SSL_DEBUG_MSG( 2, ( "=> read record" ) );
1641
Paul Bakker68884e32013-01-07 18:20:04 +01001642 SSL_DEBUG_BUF( 4, "input record from network",
1643 ssl->in_hdr, 5 + ssl->in_msglen );
1644
Paul Bakker5121ce52009-01-03 21:22:43 +00001645 if( ssl->in_hslen != 0 &&
1646 ssl->in_hslen < ssl->in_msglen )
1647 {
1648 /*
1649 * Get next Handshake message in the current record
1650 */
1651 ssl->in_msglen -= ssl->in_hslen;
1652
Paul Bakker8934a982011-08-05 11:11:53 +00001653 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
Paul Bakker48916f92012-09-16 19:57:18 +00001654 ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001655
1656 ssl->in_hslen = 4;
1657 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1658
1659 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1660 " %d, type = %d, hslen = %d",
1661 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1662
1663 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1664 {
1665 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001666 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001667 }
1668
1669 if( ssl->in_msglen < ssl->in_hslen )
1670 {
1671 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001672 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001673 }
1674
Paul Bakker48916f92012-09-16 19:57:18 +00001675 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001676
1677 return( 0 );
1678 }
1679
1680 ssl->in_hslen = 0;
1681
1682 /*
1683 * Read the record header and validate it
1684 */
1685 if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
1686 {
1687 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1688 return( ret );
1689 }
1690
1691 ssl->in_msgtype = ssl->in_hdr[0];
1692 ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
1693
1694 SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
1695 "version = [%d:%d], msglen = %d",
1696 ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
1697 ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
1698
1699 if( ssl->in_hdr[1] != ssl->major_ver )
1700 {
1701 SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001702 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001703 }
1704
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001705 if( ssl->in_hdr[2] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00001706 {
1707 SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001708 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001709 }
1710
1711 /*
1712 * Make sure the message length is acceptable
1713 */
Paul Bakker48916f92012-09-16 19:57:18 +00001714 if( ssl->transform_in == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001715 {
1716 if( ssl->in_msglen < 1 ||
1717 ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1718 {
1719 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001720 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001721 }
1722 }
1723 else
1724 {
Paul Bakker48916f92012-09-16 19:57:18 +00001725 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001726 {
1727 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001728 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001729 }
1730
1731 if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001732 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN )
Paul Bakker5121ce52009-01-03 21:22:43 +00001733 {
1734 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001735 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001736 }
1737
1738 /*
1739 * TLS encrypted messages can have up to 256 bytes of padding
1740 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001741 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001742 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN + 256 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001743 {
1744 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001745 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001746 }
1747 }
1748
1749 /*
1750 * Read and optionally decrypt the message contents
1751 */
1752 if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 )
1753 {
1754 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1755 return( ret );
1756 }
1757
1758 SSL_DEBUG_BUF( 4, "input record from network",
1759 ssl->in_hdr, 5 + ssl->in_msglen );
1760
Paul Bakker05ef8352012-05-08 09:17:57 +00001761#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1762 if( ssl_hw_record_read != NULL)
1763 {
1764 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) );
1765
1766 ret = ssl_hw_record_read( ssl );
1767 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1768 {
1769 SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret );
1770 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1771 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001772
1773 if( ret == 0 )
1774 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001775 }
1776#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001777 if( !done && ssl->transform_in != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001778 {
1779 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
1780 {
Paul Bakker40865c82013-01-31 17:13:13 +01001781#if defined(POLARSSL_SSL_ALERT_MESSAGES)
1782 if( ret == POLARSSL_ERR_SSL_INVALID_MAC )
1783 {
1784 ssl_send_alert_message( ssl,
1785 SSL_ALERT_LEVEL_FATAL,
1786 SSL_ALERT_MSG_BAD_RECORD_MAC );
1787 }
1788#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001789 SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
1790 return( ret );
1791 }
1792
1793 SSL_DEBUG_BUF( 4, "input payload after decrypt",
1794 ssl->in_msg, ssl->in_msglen );
1795
1796 if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1797 {
1798 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001799 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001800 }
1801 }
1802
Paul Bakker2770fbd2012-07-03 13:30:23 +00001803#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001804 if( ssl->transform_in != NULL &&
1805 ssl->session_in->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001806 {
1807 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
1808 {
1809 SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
1810 return( ret );
1811 }
1812
1813 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1814 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1815 }
1816#endif /* POLARSSL_ZLIB_SUPPORT */
1817
Paul Bakker0a925182012-04-16 06:46:41 +00001818 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE &&
1819 ssl->in_msgtype != SSL_MSG_ALERT &&
1820 ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC &&
1821 ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
1822 {
1823 SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
1824
Paul Bakker48916f92012-09-16 19:57:18 +00001825 if( ( ret = ssl_send_alert_message( ssl,
1826 SSL_ALERT_LEVEL_FATAL,
1827 SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
Paul Bakker0a925182012-04-16 06:46:41 +00001828 {
1829 return( ret );
1830 }
1831
1832 return( POLARSSL_ERR_SSL_INVALID_RECORD );
1833 }
1834
Paul Bakker5121ce52009-01-03 21:22:43 +00001835 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
1836 {
1837 ssl->in_hslen = 4;
1838 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1839
1840 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1841 " %d, type = %d, hslen = %d",
1842 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1843
1844 /*
1845 * Additional checks to validate the handshake header
1846 */
1847 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1848 {
1849 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001850 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001851 }
1852
1853 if( ssl->in_msglen < ssl->in_hslen )
1854 {
1855 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001856 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001857 }
1858
Paul Bakker48916f92012-09-16 19:57:18 +00001859 if( ssl->state != SSL_HANDSHAKE_OVER )
1860 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001861 }
1862
1863 if( ssl->in_msgtype == SSL_MSG_ALERT )
1864 {
1865 SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
1866 ssl->in_msg[0], ssl->in_msg[1] ) );
1867
1868 /*
1869 * Ignore non-fatal alerts, except close_notify
1870 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001871 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001872 {
Paul Bakker2770fbd2012-07-03 13:30:23 +00001873 SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
1874 ssl->in_msg[1] ) );
Paul Bakker9d781402011-05-09 16:17:09 +00001875 /**
1876 * Subtract from error code as ssl->in_msg[1] is 7-bit positive
1877 * error identifier.
1878 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00001879 return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001880 }
1881
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001882 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
1883 ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00001884 {
1885 SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001886 return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001887 }
1888 }
1889
1890 ssl->in_left = 0;
1891
1892 SSL_DEBUG_MSG( 2, ( "<= read record" ) );
1893
1894 return( 0 );
1895}
1896
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001897int ssl_send_fatal_handshake_failure( ssl_context *ssl )
1898{
1899 int ret;
1900
1901 if( ( ret = ssl_send_alert_message( ssl,
1902 SSL_ALERT_LEVEL_FATAL,
1903 SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
1904 {
1905 return( ret );
1906 }
1907
1908 return( 0 );
1909}
1910
Paul Bakker0a925182012-04-16 06:46:41 +00001911int ssl_send_alert_message( ssl_context *ssl,
1912 unsigned char level,
1913 unsigned char message )
1914{
1915 int ret;
1916
1917 SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
1918
1919 ssl->out_msgtype = SSL_MSG_ALERT;
1920 ssl->out_msglen = 2;
1921 ssl->out_msg[0] = level;
1922 ssl->out_msg[1] = message;
1923
1924 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1925 {
1926 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1927 return( ret );
1928 }
1929
1930 SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
1931
1932 return( 0 );
1933}
1934
Paul Bakker5121ce52009-01-03 21:22:43 +00001935/*
1936 * Handshake functions
1937 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001938#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1939 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1940 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001941int ssl_write_certificate( ssl_context *ssl )
1942{
Paul Bakkered27a042013-04-18 22:46:23 +02001943 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001944 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001945
1946 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1947
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001948 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1949 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001950 {
1951 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1952 ssl->state++;
1953 return( 0 );
1954 }
1955
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001956 return( ret );
1957}
1958
1959int ssl_parse_certificate( ssl_context *ssl )
1960{
1961 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1962 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1963
1964 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
1965
1966 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1967 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1968 {
1969 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
1970 ssl->state++;
1971 return( 0 );
1972 }
1973
1974 return( ret );
1975}
1976#else
1977int ssl_write_certificate( ssl_context *ssl )
1978{
1979 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1980 size_t i, n;
1981 const x509_cert *crt;
1982 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1983
1984 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1985
1986 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1987 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1988 {
1989 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1990 ssl->state++;
1991 return( 0 );
1992 }
1993
Paul Bakker5121ce52009-01-03 21:22:43 +00001994 if( ssl->endpoint == SSL_IS_CLIENT )
1995 {
1996 if( ssl->client_auth == 0 )
1997 {
1998 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1999 ssl->state++;
2000 return( 0 );
2001 }
2002
2003 /*
2004 * If using SSLv3 and got no cert, send an Alert message
2005 * (otherwise an empty Certificate message will be sent).
2006 */
2007 if( ssl->own_cert == NULL &&
2008 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2009 {
2010 ssl->out_msglen = 2;
2011 ssl->out_msgtype = SSL_MSG_ALERT;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002012 ssl->out_msg[0] = SSL_ALERT_LEVEL_WARNING;
2013 ssl->out_msg[1] = SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00002014
2015 SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
2016 goto write_msg;
2017 }
2018 }
2019 else /* SSL_IS_SERVER */
2020 {
2021 if( ssl->own_cert == NULL )
2022 {
2023 SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002024 return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002025 }
2026 }
2027
2028 SSL_DEBUG_CRT( 3, "own certificate", ssl->own_cert );
2029
2030 /*
2031 * 0 . 0 handshake type
2032 * 1 . 3 handshake length
2033 * 4 . 6 length of all certs
2034 * 7 . 9 length of cert. 1
2035 * 10 . n-1 peer certificate
2036 * n . n+2 length of cert. 2
2037 * n+3 . ... upper level cert, etc.
2038 */
2039 i = 7;
2040 crt = ssl->own_cert;
2041
Paul Bakker29087132010-03-21 21:03:34 +00002042 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002043 {
2044 n = crt->raw.len;
2045 if( i + 3 + n > SSL_MAX_CONTENT_LEN )
2046 {
2047 SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
2048 i + 3 + n, SSL_MAX_CONTENT_LEN ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002049 return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002050 }
2051
2052 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
2053 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
2054 ssl->out_msg[i + 2] = (unsigned char)( n );
2055
2056 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
2057 i += n; crt = crt->next;
2058 }
2059
2060 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
2061 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
2062 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
2063
2064 ssl->out_msglen = i;
2065 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2066 ssl->out_msg[0] = SSL_HS_CERTIFICATE;
2067
2068write_msg:
2069
2070 ssl->state++;
2071
2072 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2073 {
2074 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2075 return( ret );
2076 }
2077
2078 SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
2079
Paul Bakkered27a042013-04-18 22:46:23 +02002080 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002081}
2082
2083int ssl_parse_certificate( ssl_context *ssl )
2084{
Paul Bakkered27a042013-04-18 22:46:23 +02002085 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker23986e52011-04-24 08:57:21 +00002086 size_t i, n;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002087 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002088
2089 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2090
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002091 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2092 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002093 {
2094 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2095 ssl->state++;
2096 return( 0 );
2097 }
2098
Paul Bakker5121ce52009-01-03 21:22:43 +00002099 if( ssl->endpoint == SSL_IS_SERVER &&
2100 ssl->authmode == SSL_VERIFY_NONE )
2101 {
Paul Bakkercdf07e92011-01-30 17:05:13 +00002102 ssl->verify_result = BADCERT_SKIP_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00002103 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2104 ssl->state++;
2105 return( 0 );
2106 }
2107
2108 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2109 {
2110 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2111 return( ret );
2112 }
2113
2114 ssl->state++;
2115
2116 /*
2117 * Check if the client sent an empty certificate
2118 */
2119 if( ssl->endpoint == SSL_IS_SERVER &&
2120 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2121 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002122 if( ssl->in_msglen == 2 &&
2123 ssl->in_msgtype == SSL_MSG_ALERT &&
2124 ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2125 ssl->in_msg[1] == SSL_ALERT_MSG_NO_CERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002126 {
2127 SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2128
Paul Bakkercdf07e92011-01-30 17:05:13 +00002129 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002130 if( ssl->authmode == SSL_VERIFY_OPTIONAL )
2131 return( 0 );
2132 else
Paul Bakker40e46942009-01-03 21:51:57 +00002133 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002134 }
2135 }
2136
2137 if( ssl->endpoint == SSL_IS_SERVER &&
2138 ssl->minor_ver != SSL_MINOR_VERSION_0 )
2139 {
2140 if( ssl->in_hslen == 7 &&
2141 ssl->in_msgtype == SSL_MSG_HANDSHAKE &&
2142 ssl->in_msg[0] == SSL_HS_CERTIFICATE &&
2143 memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
2144 {
2145 SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2146
Paul Bakkercdf07e92011-01-30 17:05:13 +00002147 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002148 if( ssl->authmode == SSL_VERIFY_REQUIRED )
Paul Bakker40e46942009-01-03 21:51:57 +00002149 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002150 else
2151 return( 0 );
2152 }
2153 }
2154
2155 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2156 {
2157 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002158 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002159 }
2160
2161 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
2162 {
2163 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002164 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002165 }
2166
2167 /*
2168 * Same message structure as in ssl_write_certificate()
2169 */
2170 n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
2171
2172 if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
2173 {
2174 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002175 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002176 }
2177
Paul Bakker6e339b52013-07-03 13:37:05 +02002178 if( ( ssl->session_negotiate->peer_cert = (x509_cert *) polarssl_malloc(
Paul Bakker5121ce52009-01-03 21:22:43 +00002179 sizeof( x509_cert ) ) ) == NULL )
2180 {
2181 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
2182 sizeof( x509_cert ) ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002183 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002184 }
2185
Paul Bakker48916f92012-09-16 19:57:18 +00002186 memset( ssl->session_negotiate->peer_cert, 0, sizeof( x509_cert ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002187
2188 i = 7;
2189
2190 while( i < ssl->in_hslen )
2191 {
2192 if( ssl->in_msg[i] != 0 )
2193 {
2194 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002195 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002196 }
2197
2198 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2199 | (unsigned int) ssl->in_msg[i + 2];
2200 i += 3;
2201
2202 if( n < 128 || i + n > ssl->in_hslen )
2203 {
2204 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002205 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002206 }
2207
Paul Bakker89ecb2d2013-06-24 19:06:15 +02002208 ret = x509parse_crt_der( ssl->session_negotiate->peer_cert,
2209 ssl->in_msg + i, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002210 if( ret != 0 )
2211 {
2212 SSL_DEBUG_RET( 1, " x509parse_crt", ret );
2213 return( ret );
2214 }
2215
2216 i += n;
2217 }
2218
Paul Bakker48916f92012-09-16 19:57:18 +00002219 SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00002220
2221 if( ssl->authmode != SSL_VERIFY_NONE )
2222 {
2223 if( ssl->ca_chain == NULL )
2224 {
2225 SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002226 return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002227 }
2228
Paul Bakker48916f92012-09-16 19:57:18 +00002229 ret = x509parse_verify( ssl->session_negotiate->peer_cert,
2230 ssl->ca_chain, ssl->ca_crl,
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002231 ssl->peer_cn, &ssl->verify_result,
2232 ssl->f_vrfy, ssl->p_vrfy );
Paul Bakker5121ce52009-01-03 21:22:43 +00002233
2234 if( ret != 0 )
2235 SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2236
2237 if( ssl->authmode != SSL_VERIFY_REQUIRED )
2238 ret = 0;
2239 }
2240
2241 SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
2242
2243 return( ret );
2244}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002245#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2246 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2247 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002248
2249int ssl_write_change_cipher_spec( ssl_context *ssl )
2250{
2251 int ret;
2252
2253 SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
2254
2255 ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
2256 ssl->out_msglen = 1;
2257 ssl->out_msg[0] = 1;
2258
Paul Bakker5121ce52009-01-03 21:22:43 +00002259 ssl->state++;
2260
2261 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2262 {
2263 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2264 return( ret );
2265 }
2266
2267 SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
2268
2269 return( 0 );
2270}
2271
2272int ssl_parse_change_cipher_spec( ssl_context *ssl )
2273{
2274 int ret;
2275
2276 SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
2277
Paul Bakker5121ce52009-01-03 21:22:43 +00002278 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2279 {
2280 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2281 return( ret );
2282 }
2283
2284 if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
2285 {
2286 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002287 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002288 }
2289
2290 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
2291 {
2292 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002293 return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
Paul Bakker5121ce52009-01-03 21:22:43 +00002294 }
2295
2296 ssl->state++;
2297
2298 SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
2299
2300 return( 0 );
2301}
2302
Paul Bakker41c83d32013-03-20 14:39:14 +01002303void ssl_optimize_checksum( ssl_context *ssl,
2304 const ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00002305{
Paul Bakker9e36f042013-06-30 14:34:05 +02002306#if !defined(POLARSSL_SHA512_C)
Paul Bakker769075d2012-11-24 11:26:46 +01002307 ((void) ciphersuite);
2308#endif
2309
Paul Bakker380da532012-04-18 16:10:25 +00002310 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00002311 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker9e36f042013-06-30 14:34:05 +02002312#if defined(POLARSSL_SHA512_C)
Paul Bakkerb7149bc2013-03-20 15:30:09 +01002313 else if( ciphersuite_info->mac == POLARSSL_MD_SHA384 )
Paul Bakker380da532012-04-18 16:10:25 +00002314 {
Paul Bakker48916f92012-09-16 19:57:18 +00002315 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
Paul Bakker380da532012-04-18 16:10:25 +00002316 }
Paul Bakker769075d2012-11-24 11:26:46 +01002317#endif
Paul Bakker380da532012-04-18 16:10:25 +00002318 else
Paul Bakker48916f92012-09-16 19:57:18 +00002319 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakker380da532012-04-18 16:10:25 +00002320}
Paul Bakkerf7abd422013-04-16 13:15:56 +02002321
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002322static void ssl_update_checksum_start( ssl_context *ssl,
2323 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002324{
Paul Bakker48916f92012-09-16 19:57:18 +00002325 md5_update( &ssl->handshake->fin_md5 , buf, len );
2326 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker9e36f042013-06-30 14:34:05 +02002327 sha256_update( &ssl->handshake->fin_sha256, buf, len );
2328#if defined(POLARSSL_SHA512_C)
2329 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002330#endif
Paul Bakker380da532012-04-18 16:10:25 +00002331}
2332
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002333static void ssl_update_checksum_md5sha1( ssl_context *ssl,
2334 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002335{
Paul Bakker48916f92012-09-16 19:57:18 +00002336 md5_update( &ssl->handshake->fin_md5 , buf, len );
2337 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002338}
2339
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002340static void ssl_update_checksum_sha256( ssl_context *ssl,
2341 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002342{
Paul Bakker9e36f042013-06-30 14:34:05 +02002343 sha256_update( &ssl->handshake->fin_sha256, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002344}
2345
Paul Bakker9e36f042013-06-30 14:34:05 +02002346#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002347static void ssl_update_checksum_sha384( ssl_context *ssl,
2348 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002349{
Paul Bakker9e36f042013-06-30 14:34:05 +02002350 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002351}
Paul Bakker769075d2012-11-24 11:26:46 +01002352#endif
Paul Bakker380da532012-04-18 16:10:25 +00002353
Paul Bakker1ef83d62012-04-11 12:09:53 +00002354static void ssl_calc_finished_ssl(
2355 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002356{
Paul Bakker3c2122f2013-06-24 19:03:14 +02002357 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002358 md5_context md5;
2359 sha1_context sha1;
2360
Paul Bakker5121ce52009-01-03 21:22:43 +00002361 unsigned char padbuf[48];
2362 unsigned char md5sum[16];
2363 unsigned char sha1sum[20];
2364
Paul Bakker48916f92012-09-16 19:57:18 +00002365 ssl_session *session = ssl->session_negotiate;
2366 if( !session )
2367 session = ssl->session;
2368
Paul Bakker1ef83d62012-04-11 12:09:53 +00002369 SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
2370
Paul Bakker48916f92012-09-16 19:57:18 +00002371 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2372 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002373
2374 /*
2375 * SSLv3:
2376 * hash =
2377 * MD5( master + pad2 +
2378 * MD5( handshake + sender + master + pad1 ) )
2379 * + SHA1( master + pad2 +
2380 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002381 */
2382
Paul Bakker90995b52013-06-24 19:20:35 +02002383#if !defined(POLARSSL_MD5_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002384 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002385 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002386#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002387
Paul Bakker90995b52013-06-24 19:20:35 +02002388#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002389 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002390 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002391#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002392
Paul Bakker3c2122f2013-06-24 19:03:14 +02002393 sender = ( from == SSL_IS_CLIENT ) ? "CLNT"
2394 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00002395
Paul Bakker1ef83d62012-04-11 12:09:53 +00002396 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002397
Paul Bakker3c2122f2013-06-24 19:03:14 +02002398 md5_update( &md5, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002399 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002400 md5_update( &md5, padbuf, 48 );
2401 md5_finish( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002402
Paul Bakker3c2122f2013-06-24 19:03:14 +02002403 sha1_update( &sha1, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002404 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002405 sha1_update( &sha1, padbuf, 40 );
2406 sha1_finish( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002407
Paul Bakker1ef83d62012-04-11 12:09:53 +00002408 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002409
Paul Bakker1ef83d62012-04-11 12:09:53 +00002410 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +00002411 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002412 md5_update( &md5, padbuf, 48 );
2413 md5_update( &md5, md5sum, 16 );
2414 md5_finish( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00002415
Paul Bakker1ef83d62012-04-11 12:09:53 +00002416 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +00002417 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002418 sha1_update( &sha1, padbuf , 40 );
2419 sha1_update( &sha1, sha1sum, 20 );
2420 sha1_finish( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002421
Paul Bakker1ef83d62012-04-11 12:09:53 +00002422 SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002423
Paul Bakker1ef83d62012-04-11 12:09:53 +00002424 memset( &md5, 0, sizeof( md5_context ) );
2425 memset( &sha1, 0, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002426
2427 memset( padbuf, 0, sizeof( padbuf ) );
2428 memset( md5sum, 0, sizeof( md5sum ) );
2429 memset( sha1sum, 0, sizeof( sha1sum ) );
2430
2431 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2432}
2433
Paul Bakker1ef83d62012-04-11 12:09:53 +00002434static void ssl_calc_finished_tls(
2435 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002436{
Paul Bakker1ef83d62012-04-11 12:09:53 +00002437 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002438 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002439 md5_context md5;
Paul Bakker5121ce52009-01-03 21:22:43 +00002440 sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002441 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00002442
Paul Bakker48916f92012-09-16 19:57:18 +00002443 ssl_session *session = ssl->session_negotiate;
2444 if( !session )
2445 session = ssl->session;
2446
Paul Bakker1ef83d62012-04-11 12:09:53 +00002447 SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002448
Paul Bakker48916f92012-09-16 19:57:18 +00002449 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2450 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002451
Paul Bakker1ef83d62012-04-11 12:09:53 +00002452 /*
2453 * TLSv1:
2454 * hash = PRF( master, finished_label,
2455 * MD5( handshake ) + SHA1( handshake ) )[0..11]
2456 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002457
Paul Bakker90995b52013-06-24 19:20:35 +02002458#if !defined(POLARSSL_MD5_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002459 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
2460 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002461#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002462
Paul Bakker90995b52013-06-24 19:20:35 +02002463#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002464 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
2465 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002466#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002467
2468 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002469 ? "client finished"
2470 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002471
2472 md5_finish( &md5, padbuf );
2473 sha1_finish( &sha1, padbuf + 16 );
2474
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002475 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002476 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002477
2478 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2479
2480 memset( &md5, 0, sizeof( md5_context ) );
2481 memset( &sha1, 0, sizeof( sha1_context ) );
2482
2483 memset( padbuf, 0, sizeof( padbuf ) );
2484
2485 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2486}
2487
Paul Bakkerca4ab492012-04-18 14:23:57 +00002488static void ssl_calc_finished_tls_sha256(
Paul Bakker1ef83d62012-04-11 12:09:53 +00002489 ssl_context *ssl, unsigned char *buf, int from )
2490{
2491 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002492 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002493 sha256_context sha256;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002494 unsigned char padbuf[32];
2495
Paul Bakker48916f92012-09-16 19:57:18 +00002496 ssl_session *session = ssl->session_negotiate;
2497 if( !session )
2498 session = ssl->session;
2499
Paul Bakker380da532012-04-18 16:10:25 +00002500 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002501
Paul Bakker9e36f042013-06-30 14:34:05 +02002502 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002503
2504 /*
2505 * TLSv1.2:
2506 * hash = PRF( master, finished_label,
2507 * Hash( handshake ) )[0.11]
2508 */
2509
Paul Bakker9e36f042013-06-30 14:34:05 +02002510#if !defined(POLARSSL_SHA256_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002511 SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
Paul Bakker9e36f042013-06-30 14:34:05 +02002512 sha256.state, sizeof( sha256.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002513#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002514
2515 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002516 ? "client finished"
2517 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002518
Paul Bakker9e36f042013-06-30 14:34:05 +02002519 sha256_finish( &sha256, padbuf );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002520
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002521 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002522 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002523
2524 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2525
Paul Bakker9e36f042013-06-30 14:34:05 +02002526 memset( &sha256, 0, sizeof( sha256_context ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002527
2528 memset( padbuf, 0, sizeof( padbuf ) );
2529
2530 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2531}
2532
Paul Bakker9e36f042013-06-30 14:34:05 +02002533#if defined(POLARSSL_SHA512_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002534static void ssl_calc_finished_tls_sha384(
2535 ssl_context *ssl, unsigned char *buf, int from )
2536{
2537 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002538 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002539 sha512_context sha512;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002540 unsigned char padbuf[48];
2541
Paul Bakker48916f92012-09-16 19:57:18 +00002542 ssl_session *session = ssl->session_negotiate;
2543 if( !session )
2544 session = ssl->session;
2545
Paul Bakker380da532012-04-18 16:10:25 +00002546 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002547
Paul Bakker9e36f042013-06-30 14:34:05 +02002548 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002549
2550 /*
2551 * TLSv1.2:
2552 * hash = PRF( master, finished_label,
2553 * Hash( handshake ) )[0.11]
2554 */
2555
Paul Bakker9e36f042013-06-30 14:34:05 +02002556#if !defined(POLARSSL_SHA512_ALT)
2557 SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
2558 sha512.state, sizeof( sha512.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002559#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002560
2561 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002562 ? "client finished"
2563 : "server finished";
Paul Bakkerca4ab492012-04-18 14:23:57 +00002564
Paul Bakker9e36f042013-06-30 14:34:05 +02002565 sha512_finish( &sha512, padbuf );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002566
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002567 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002568 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002569
2570 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2571
Paul Bakker9e36f042013-06-30 14:34:05 +02002572 memset( &sha512, 0, sizeof( sha512_context ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002573
2574 memset( padbuf, 0, sizeof( padbuf ) );
2575
2576 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2577}
Paul Bakker769075d2012-11-24 11:26:46 +01002578#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002579
Paul Bakker48916f92012-09-16 19:57:18 +00002580void ssl_handshake_wrapup( ssl_context *ssl )
2581{
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002582 int resume = ssl->handshake->resume;
2583
Paul Bakker48916f92012-09-16 19:57:18 +00002584 SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
2585
2586 /*
2587 * Free our handshake params
2588 */
2589 ssl_handshake_free( ssl->handshake );
Paul Bakker6e339b52013-07-03 13:37:05 +02002590 polarssl_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00002591 ssl->handshake = NULL;
2592
2593 /*
2594 * Switch in our now active transform context
2595 */
2596 if( ssl->transform )
2597 {
2598 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002599 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002600 }
2601 ssl->transform = ssl->transform_negotiate;
2602 ssl->transform_negotiate = NULL;
2603
Paul Bakker0a597072012-09-25 21:55:46 +00002604 if( ssl->session )
2605 {
2606 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002607 polarssl_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00002608 }
2609 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00002610 ssl->session_negotiate = NULL;
2611
Paul Bakker0a597072012-09-25 21:55:46 +00002612 /*
2613 * Add cache entry
2614 */
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002615 if( ssl->f_set_cache != NULL &&
2616 ssl->session->length != 0 &&
2617 resume == 0 )
2618 {
Paul Bakker0a597072012-09-25 21:55:46 +00002619 if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 )
2620 SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002621 }
Paul Bakker0a597072012-09-25 21:55:46 +00002622
Paul Bakker48916f92012-09-16 19:57:18 +00002623 ssl->state++;
2624
2625 SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
2626}
2627
Paul Bakker1ef83d62012-04-11 12:09:53 +00002628int ssl_write_finished( ssl_context *ssl )
2629{
2630 int ret, hash_len;
2631
2632 SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
2633
Paul Bakker92be97b2013-01-02 17:30:03 +01002634 /*
2635 * Set the out_msg pointer to the correct location based on IV length
2636 */
2637 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2638 {
2639 ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -
2640 ssl->transform_negotiate->fixed_ivlen;
2641 }
2642 else
2643 ssl->out_msg = ssl->out_iv;
2644
Paul Bakker48916f92012-09-16 19:57:18 +00002645 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002646
2647 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002648 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2649
Paul Bakker48916f92012-09-16 19:57:18 +00002650 ssl->verify_data_len = hash_len;
2651 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
2652
Paul Bakker5121ce52009-01-03 21:22:43 +00002653 ssl->out_msglen = 4 + hash_len;
2654 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2655 ssl->out_msg[0] = SSL_HS_FINISHED;
2656
2657 /*
2658 * In case of session resuming, invert the client and server
2659 * ChangeCipherSpec messages order.
2660 */
Paul Bakker0a597072012-09-25 21:55:46 +00002661 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002662 {
2663 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker48916f92012-09-16 19:57:18 +00002664 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002665 else
2666 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2667 }
2668 else
2669 ssl->state++;
2670
Paul Bakker48916f92012-09-16 19:57:18 +00002671 /*
2672 * Switch to our negotiated transform and session parameters for outbound data.
2673 */
2674 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
2675 ssl->transform_out = ssl->transform_negotiate;
2676 ssl->session_out = ssl->session_negotiate;
2677 memset( ssl->out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002678
Paul Bakker07eb38b2012-12-19 14:42:06 +01002679#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2680 if( ssl_hw_record_activate != NULL)
2681 {
2682 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
2683 {
2684 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2685 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2686 }
2687 }
2688#endif
2689
Paul Bakker5121ce52009-01-03 21:22:43 +00002690 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2691 {
2692 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2693 return( ret );
2694 }
2695
2696 SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
2697
2698 return( 0 );
2699}
2700
2701int ssl_parse_finished( ssl_context *ssl )
2702{
Paul Bakker23986e52011-04-24 08:57:21 +00002703 int ret;
2704 unsigned int hash_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002705 unsigned char buf[36];
2706
2707 SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
2708
Paul Bakker48916f92012-09-16 19:57:18 +00002709 ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002710
Paul Bakker48916f92012-09-16 19:57:18 +00002711 /*
2712 * Switch to our negotiated transform and session parameters for inbound data.
2713 */
2714 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
2715 ssl->transform_in = ssl->transform_negotiate;
2716 ssl->session_in = ssl->session_negotiate;
2717 memset( ssl->in_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002718
Paul Bakker92be97b2013-01-02 17:30:03 +01002719 /*
2720 * Set the in_msg pointer to the correct location based on IV length
2721 */
2722 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2723 {
2724 ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -
2725 ssl->transform_negotiate->fixed_ivlen;
2726 }
2727 else
2728 ssl->in_msg = ssl->in_iv;
2729
Paul Bakker07eb38b2012-12-19 14:42:06 +01002730#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2731 if( ssl_hw_record_activate != NULL)
2732 {
2733 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_INBOUND ) ) != 0 )
2734 {
2735 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2736 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2737 }
2738 }
2739#endif
2740
Paul Bakker5121ce52009-01-03 21:22:43 +00002741 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2742 {
2743 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2744 return( ret );
2745 }
2746
2747 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2748 {
2749 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002750 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002751 }
2752
Paul Bakker1ef83d62012-04-11 12:09:53 +00002753 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002754 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2755
2756 if( ssl->in_msg[0] != SSL_HS_FINISHED ||
2757 ssl->in_hslen != 4 + hash_len )
2758 {
2759 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002760 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002761 }
2762
Paul Bakker5121ce52009-01-03 21:22:43 +00002763 if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
2764 {
2765 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002766 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002767 }
2768
Paul Bakker48916f92012-09-16 19:57:18 +00002769 ssl->verify_data_len = hash_len;
2770 memcpy( ssl->peer_verify_data, buf, hash_len );
2771
Paul Bakker0a597072012-09-25 21:55:46 +00002772 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002773 {
2774 if( ssl->endpoint == SSL_IS_CLIENT )
2775 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2776
2777 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker48916f92012-09-16 19:57:18 +00002778 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002779 }
2780 else
2781 ssl->state++;
2782
2783 SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
2784
2785 return( 0 );
2786}
2787
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002788static int ssl_handshake_init( ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00002789{
2790 if( ssl->transform_negotiate )
2791 ssl_transform_free( ssl->transform_negotiate );
2792 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002793 ssl->transform_negotiate = polarssl_malloc( sizeof(ssl_transform) );
Paul Bakker48916f92012-09-16 19:57:18 +00002794
2795 if( ssl->session_negotiate )
2796 ssl_session_free( ssl->session_negotiate );
2797 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002798 ssl->session_negotiate = polarssl_malloc( sizeof(ssl_session) );
Paul Bakker48916f92012-09-16 19:57:18 +00002799
2800 if( ssl->handshake )
2801 ssl_handshake_free( ssl->handshake );
2802 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002803 ssl->handshake = polarssl_malloc( sizeof(ssl_handshake_params) );
Paul Bakker48916f92012-09-16 19:57:18 +00002804
2805 if( ssl->handshake == NULL ||
2806 ssl->transform_negotiate == NULL ||
2807 ssl->session_negotiate == NULL )
2808 {
2809 SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) );
2810 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2811 }
2812
2813 memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
2814 memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
2815 memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
2816
2817 md5_starts( &ssl->handshake->fin_md5 );
2818 sha1_starts( &ssl->handshake->fin_sha1 );
Paul Bakker9e36f042013-06-30 14:34:05 +02002819 sha256_starts( &ssl->handshake->fin_sha256, 0 );
2820#if defined(POLARSSL_SHA512_C)
2821 sha512_starts( &ssl->handshake->fin_sha512, 1 );
Paul Bakker769075d2012-11-24 11:26:46 +01002822#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002823
2824 ssl->handshake->update_checksum = ssl_update_checksum_start;
Paul Bakker23f36802012-09-28 14:15:14 +00002825 ssl->handshake->sig_alg = SSL_HASH_SHA1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002826
Paul Bakker61d113b2013-07-04 11:51:43 +02002827#if defined(POLARSSL_ECDH_C)
2828 ecdh_init( &ssl->handshake->ecdh_ctx );
2829#endif
2830
Paul Bakker48916f92012-09-16 19:57:18 +00002831 return( 0 );
2832}
2833
Paul Bakker5121ce52009-01-03 21:22:43 +00002834/*
2835 * Initialize an SSL context
2836 */
2837int ssl_init( ssl_context *ssl )
2838{
Paul Bakker48916f92012-09-16 19:57:18 +00002839 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002840 int len = SSL_BUFFER_LEN;
2841
2842 memset( ssl, 0, sizeof( ssl_context ) );
2843
Paul Bakker62f2dee2012-09-28 07:31:51 +00002844 /*
2845 * Sane defaults
2846 */
Paul Bakkered27a042013-04-18 22:46:23 +02002847#if defined(POLARSSL_RSA_C)
Paul Bakkereb2c6582012-09-27 19:15:01 +00002848 ssl->rsa_decrypt = ssl_rsa_decrypt;
2849 ssl->rsa_sign = ssl_rsa_sign;
2850 ssl->rsa_key_len = ssl_rsa_key_len;
Paul Bakkered27a042013-04-18 22:46:23 +02002851#endif
Paul Bakkereb2c6582012-09-27 19:15:01 +00002852
Paul Bakker1d29fb52012-09-28 13:28:45 +00002853 ssl->min_major_ver = SSL_MAJOR_VERSION_3;
2854 ssl->min_minor_ver = SSL_MINOR_VERSION_0;
Paul Bakker2fbefde2013-06-29 16:01:15 +02002855 ssl->max_major_ver = SSL_MAJOR_VERSION_3;
2856 ssl->max_minor_ver = SSL_MINOR_VERSION_3;
Paul Bakker1d29fb52012-09-28 13:28:45 +00002857
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002858 ssl_set_ciphersuites( ssl, ssl_list_ciphersuites() );
Paul Bakker645ce3a2012-10-31 12:32:41 +00002859
Paul Bakker62f2dee2012-09-28 07:31:51 +00002860#if defined(POLARSSL_DHM_C)
2861 if( ( ret = mpi_read_string( &ssl->dhm_P, 16,
2862 POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 ||
2863 ( ret = mpi_read_string( &ssl->dhm_G, 16,
2864 POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 )
2865 {
2866 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
2867 return( ret );
2868 }
2869#endif
2870
2871 /*
2872 * Prepare base structures
2873 */
Paul Bakker6e339b52013-07-03 13:37:05 +02002874 ssl->in_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00002875 ssl->in_hdr = ssl->in_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002876 ssl->in_iv = ssl->in_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002877 ssl->in_msg = ssl->in_ctr + 13;
2878
2879 if( ssl->in_ctr == NULL )
2880 {
2881 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002882 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002883 }
2884
Paul Bakker6e339b52013-07-03 13:37:05 +02002885 ssl->out_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00002886 ssl->out_hdr = ssl->out_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002887 ssl->out_iv = ssl->out_ctr + 13;
Paul Bakker5bd42292012-12-19 14:40:42 +01002888 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002889
2890 if( ssl->out_ctr == NULL )
2891 {
2892 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker6e339b52013-07-03 13:37:05 +02002893 polarssl_free( ssl-> in_ctr );
Paul Bakker69e095c2011-12-10 21:55:01 +00002894 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002895 }
2896
2897 memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
2898 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2899
2900 ssl->hostname = NULL;
2901 ssl->hostname_len = 0;
2902
Paul Bakker606b4ba2013-08-14 16:52:14 +02002903#if defined(POLARSSL_SSL_SESSION_TICKETS)
2904 ssl->ticket_lifetime = SSL_DEFAULT_TICKET_LIFETIME;
2905#endif
2906
Paul Bakker48916f92012-09-16 19:57:18 +00002907 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2908 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002909
2910 return( 0 );
2911}
2912
2913/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00002914 * Reset an initialized and used SSL context for re-use while retaining
2915 * all application-set variables, function pointers and data.
2916 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00002917int ssl_session_reset( ssl_context *ssl )
Paul Bakker7eb013f2011-10-06 12:37:39 +00002918{
Paul Bakker48916f92012-09-16 19:57:18 +00002919 int ret;
2920
Paul Bakker7eb013f2011-10-06 12:37:39 +00002921 ssl->state = SSL_HELLO_REQUEST;
Paul Bakker48916f92012-09-16 19:57:18 +00002922 ssl->renegotiation = SSL_INITIAL_HANDSHAKE;
2923 ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION;
2924
2925 ssl->verify_data_len = 0;
2926 memset( ssl->own_verify_data, 0, 36 );
2927 memset( ssl->peer_verify_data, 0, 36 );
2928
Paul Bakker7eb013f2011-10-06 12:37:39 +00002929 ssl->in_offt = NULL;
2930
Paul Bakker92be97b2013-01-02 17:30:03 +01002931 ssl->in_msg = ssl->in_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002932 ssl->in_msgtype = 0;
2933 ssl->in_msglen = 0;
2934 ssl->in_left = 0;
2935
2936 ssl->in_hslen = 0;
2937 ssl->nb_zero = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002938 ssl->record_read = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002939
Paul Bakker92be97b2013-01-02 17:30:03 +01002940 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002941 ssl->out_msgtype = 0;
2942 ssl->out_msglen = 0;
2943 ssl->out_left = 0;
2944
Paul Bakker48916f92012-09-16 19:57:18 +00002945 ssl->transform_in = NULL;
2946 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002947
2948 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2949 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker05ef8352012-05-08 09:17:57 +00002950
2951#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2952 if( ssl_hw_record_reset != NULL)
2953 {
2954 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) );
Paul Bakker07eb38b2012-12-19 14:42:06 +01002955 if( ( ret = ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002956 {
2957 SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret );
2958 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2959 }
Paul Bakker05ef8352012-05-08 09:17:57 +00002960 }
2961#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00002962
Paul Bakker48916f92012-09-16 19:57:18 +00002963 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002964 {
Paul Bakker48916f92012-09-16 19:57:18 +00002965 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002966 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002967 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002968 }
Paul Bakker48916f92012-09-16 19:57:18 +00002969
Paul Bakkerc0463502013-02-14 11:19:38 +01002970 if( ssl->session )
2971 {
2972 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002973 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01002974 ssl->session = NULL;
2975 }
2976
Paul Bakker48916f92012-09-16 19:57:18 +00002977 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2978 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002979
2980 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00002981}
2982
Paul Bakkera503a632013-08-14 13:48:06 +02002983#if defined(POLARSSL_SSL_SESSION_TICKETS)
Paul Bakker7eb013f2011-10-06 12:37:39 +00002984/*
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02002985 * Allocate and initialize ticket keys
2986 */
2987static int ssl_ticket_keys_init( ssl_context *ssl )
2988{
2989 int ret;
2990 ssl_ticket_keys *tkeys;
Manuel Pégourié-Gonnard56dc9e82013-08-03 17:16:31 +02002991 unsigned char buf[16];
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02002992
2993 if( ssl->ticket_keys != NULL )
2994 return( 0 );
2995
2996 if( ( tkeys = polarssl_malloc( sizeof( ssl_ticket_keys ) ) ) == NULL )
2997 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2998
2999 if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->key_name, 16 ) ) != 0 )
3000 return( ret );
3001
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003002 if( ( ret = ssl->f_rng( ssl->p_rng, buf, 16 ) ) != 0 ||
3003 ( ret = aes_setkey_enc( &tkeys->enc, buf, 128 ) ) != 0 ||
3004 ( ret = aes_setkey_dec( &tkeys->dec, buf, 128 ) ) != 0 )
3005 {
3006 return( ret );
3007 }
3008
Manuel Pégourié-Gonnard56dc9e82013-08-03 17:16:31 +02003009 if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->mac_key, 16 ) ) != 0 )
3010 return( ret );
3011
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003012 ssl->ticket_keys = tkeys;
3013
3014 return( 0 );
3015}
Paul Bakkera503a632013-08-14 13:48:06 +02003016#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003017
3018/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003019 * SSL set accessors
3020 */
3021void ssl_set_endpoint( ssl_context *ssl, int endpoint )
3022{
3023 ssl->endpoint = endpoint;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003024
Paul Bakker606b4ba2013-08-14 16:52:14 +02003025#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003026 if( endpoint == SSL_IS_CLIENT )
3027 ssl->session_tickets = SSL_SESSION_TICKETS_ENABLED;
Paul Bakker606b4ba2013-08-14 16:52:14 +02003028#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003029}
3030
3031void ssl_set_authmode( ssl_context *ssl, int authmode )
3032{
3033 ssl->authmode = authmode;
3034}
3035
Paul Bakkered27a042013-04-18 22:46:23 +02003036#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003037void ssl_set_verify( ssl_context *ssl,
Paul Bakker915275b2012-09-28 07:10:55 +00003038 int (*f_vrfy)(void *, x509_cert *, int, int *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003039 void *p_vrfy )
3040{
3041 ssl->f_vrfy = f_vrfy;
3042 ssl->p_vrfy = p_vrfy;
3043}
Paul Bakkered27a042013-04-18 22:46:23 +02003044#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003045
Paul Bakker5121ce52009-01-03 21:22:43 +00003046void ssl_set_rng( ssl_context *ssl,
Paul Bakkera3d195c2011-11-27 21:07:34 +00003047 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00003048 void *p_rng )
3049{
3050 ssl->f_rng = f_rng;
3051 ssl->p_rng = p_rng;
3052}
3053
3054void ssl_set_dbg( ssl_context *ssl,
Paul Bakkerff60ee62010-03-16 21:09:09 +00003055 void (*f_dbg)(void *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00003056 void *p_dbg )
3057{
3058 ssl->f_dbg = f_dbg;
3059 ssl->p_dbg = p_dbg;
3060}
3061
3062void ssl_set_bio( ssl_context *ssl,
Paul Bakker23986e52011-04-24 08:57:21 +00003063 int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
Paul Bakker39bb4182011-06-21 07:36:43 +00003064 int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
Paul Bakker5121ce52009-01-03 21:22:43 +00003065{
3066 ssl->f_recv = f_recv;
3067 ssl->f_send = f_send;
3068 ssl->p_recv = p_recv;
3069 ssl->p_send = p_send;
3070}
3071
Paul Bakker0a597072012-09-25 21:55:46 +00003072void ssl_set_session_cache( ssl_context *ssl,
3073 int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
3074 int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00003075{
Paul Bakker0a597072012-09-25 21:55:46 +00003076 ssl->f_get_cache = f_get_cache;
3077 ssl->p_get_cache = p_get_cache;
3078 ssl->f_set_cache = f_set_cache;
3079 ssl->p_set_cache = p_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00003080}
3081
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003082int ssl_set_session( ssl_context *ssl, const ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00003083{
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003084 int ret;
3085
3086 if( ssl == NULL ||
3087 session == NULL ||
3088 ssl->session_negotiate == NULL ||
3089 ssl->endpoint != SSL_IS_CLIENT )
3090 {
3091 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3092 }
3093
3094 if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 )
3095 return( ret );
3096
Paul Bakker0a597072012-09-25 21:55:46 +00003097 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003098
3099 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003100}
3101
Paul Bakkerb68cad62012-08-23 08:34:18 +00003102void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00003103{
Paul Bakker8f4ddae2013-04-15 15:09:54 +02003104 ssl->ciphersuite_list[SSL_MINOR_VERSION_0] = ciphersuites;
3105 ssl->ciphersuite_list[SSL_MINOR_VERSION_1] = ciphersuites;
3106 ssl->ciphersuite_list[SSL_MINOR_VERSION_2] = ciphersuites;
3107 ssl->ciphersuite_list[SSL_MINOR_VERSION_3] = ciphersuites;
3108}
3109
3110void ssl_set_ciphersuites_for_version( ssl_context *ssl, const int *ciphersuites,
3111 int major, int minor )
3112{
3113 if( major != SSL_MAJOR_VERSION_3 )
3114 return;
3115
3116 if( minor < SSL_MINOR_VERSION_0 || minor > SSL_MINOR_VERSION_3 )
3117 return;
3118
3119 ssl->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00003120}
3121
Paul Bakkered27a042013-04-18 22:46:23 +02003122#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003123void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain,
Paul Bakker57b79142010-03-24 06:51:15 +00003124 x509_crl *ca_crl, const char *peer_cn )
Paul Bakker5121ce52009-01-03 21:22:43 +00003125{
3126 ssl->ca_chain = ca_chain;
Paul Bakker40ea7de2009-05-03 10:18:48 +00003127 ssl->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00003128 ssl->peer_cn = peer_cn;
3129}
3130
3131void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert,
3132 rsa_context *rsa_key )
3133{
3134 ssl->own_cert = own_cert;
3135 ssl->rsa_key = rsa_key;
3136}
3137
Paul Bakkereb2c6582012-09-27 19:15:01 +00003138void ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert,
3139 void *rsa_key,
3140 rsa_decrypt_func rsa_decrypt,
3141 rsa_sign_func rsa_sign,
3142 rsa_key_len_func rsa_key_len )
Paul Bakker43b7e352011-01-18 15:27:19 +00003143{
3144 ssl->own_cert = own_cert;
Paul Bakkereb2c6582012-09-27 19:15:01 +00003145 ssl->rsa_key = rsa_key;
3146 ssl->rsa_decrypt = rsa_decrypt;
3147 ssl->rsa_sign = rsa_sign;
3148 ssl->rsa_key_len = rsa_key_len;
Paul Bakker43b7e352011-01-18 15:27:19 +00003149}
Paul Bakkered27a042013-04-18 22:46:23 +02003150#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00003151
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003152#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
3153void ssl_set_psk( ssl_context *ssl, const unsigned char *psk, size_t psk_len,
3154 const unsigned char *psk_identity, size_t psk_identity_len )
3155{
3156 ssl->psk = psk;
3157 ssl->psk_len = psk_len;
3158 ssl->psk_identity = psk_identity;
3159 ssl->psk_identity_len = psk_identity_len;
3160}
3161#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00003162
Paul Bakker48916f92012-09-16 19:57:18 +00003163#if defined(POLARSSL_DHM_C)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003164int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00003165{
3166 int ret;
3167
Paul Bakker48916f92012-09-16 19:57:18 +00003168 if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003169 {
3170 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3171 return( ret );
3172 }
3173
Paul Bakker48916f92012-09-16 19:57:18 +00003174 if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003175 {
3176 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3177 return( ret );
3178 }
3179
3180 return( 0 );
3181}
3182
Paul Bakker1b57b062011-01-06 15:48:19 +00003183int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx )
3184{
3185 int ret;
3186
Paul Bakker48916f92012-09-16 19:57:18 +00003187 if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003188 {
3189 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3190 return( ret );
3191 }
3192
Paul Bakker48916f92012-09-16 19:57:18 +00003193 if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003194 {
3195 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3196 return( ret );
3197 }
3198
3199 return( 0 );
3200}
Paul Bakker48916f92012-09-16 19:57:18 +00003201#endif /* POLARSSL_DHM_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00003202
Paul Bakkerff60ee62010-03-16 21:09:09 +00003203int ssl_set_hostname( ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00003204{
3205 if( hostname == NULL )
Paul Bakker40e46942009-01-03 21:51:57 +00003206 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003207
3208 ssl->hostname_len = strlen( hostname );
Paul Bakker6e339b52013-07-03 13:37:05 +02003209 ssl->hostname = (unsigned char *) polarssl_malloc( ssl->hostname_len + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003210
Paul Bakkerb15b8512012-01-13 13:44:06 +00003211 if( ssl->hostname == NULL )
3212 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3213
Paul Bakker3c2122f2013-06-24 19:03:14 +02003214 memcpy( ssl->hostname, (const unsigned char *) hostname,
Paul Bakker5121ce52009-01-03 21:22:43 +00003215 ssl->hostname_len );
Paul Bakkerf7abd422013-04-16 13:15:56 +02003216
Paul Bakker40ea7de2009-05-03 10:18:48 +00003217 ssl->hostname[ssl->hostname_len] = '\0';
Paul Bakker5121ce52009-01-03 21:22:43 +00003218
3219 return( 0 );
3220}
3221
Paul Bakker5701cdc2012-09-27 21:49:42 +00003222void ssl_set_sni( ssl_context *ssl,
3223 int (*f_sni)(void *, ssl_context *,
3224 const unsigned char *, size_t),
3225 void *p_sni )
3226{
3227 ssl->f_sni = f_sni;
3228 ssl->p_sni = p_sni;
3229}
3230
Paul Bakker490ecc82011-10-06 13:04:09 +00003231void ssl_set_max_version( ssl_context *ssl, int major, int minor )
3232{
3233 ssl->max_major_ver = major;
3234 ssl->max_minor_ver = minor;
3235}
3236
Paul Bakker1d29fb52012-09-28 13:28:45 +00003237void ssl_set_min_version( ssl_context *ssl, int major, int minor )
3238{
3239 ssl->min_major_ver = major;
3240 ssl->min_minor_ver = minor;
3241}
3242
Paul Bakker05decb22013-08-15 13:33:48 +02003243#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003244int ssl_set_max_frag_len( ssl_context *ssl, unsigned char mfl_code )
3245{
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003246 if( mfl_code >= sizeof( mfl_code_to_length ) ||
3247 mfl_code_to_length[mfl_code] > SSL_MAX_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003248 {
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003249 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003250 }
3251
3252 ssl->mfl_code = mfl_code;
3253
3254 return( 0 );
3255}
Paul Bakker05decb22013-08-15 13:33:48 +02003256#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003257
Paul Bakker8c1ede62013-07-19 14:14:37 +02003258int ssl_set_truncated_hmac( ssl_context *ssl, int truncate )
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003259{
3260 if( ssl->endpoint != SSL_IS_CLIENT )
3261 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3262
Paul Bakker8c1ede62013-07-19 14:14:37 +02003263 ssl->trunc_hmac = truncate;
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003264
3265 return( 0 );
3266}
3267
Paul Bakker48916f92012-09-16 19:57:18 +00003268void ssl_set_renegotiation( ssl_context *ssl, int renegotiation )
3269{
3270 ssl->disable_renegotiation = renegotiation;
3271}
3272
3273void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy )
3274{
3275 ssl->allow_legacy_renegotiation = allow_legacy;
3276}
3277
Paul Bakkera503a632013-08-14 13:48:06 +02003278#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003279int ssl_set_session_tickets( ssl_context *ssl, int use_tickets )
3280{
3281 ssl->session_tickets = use_tickets;
3282
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003283 if( ssl->endpoint == SSL_IS_CLIENT )
3284 return( 0 );
3285
3286 if( ssl->f_rng == NULL )
3287 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3288
3289 return( ssl_ticket_keys_init( ssl ) );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003290}
Paul Bakker606b4ba2013-08-14 16:52:14 +02003291
3292void ssl_set_session_ticket_lifetime( ssl_context *ssl, int lifetime )
3293{
3294 ssl->ticket_lifetime = lifetime;
3295}
Paul Bakkera503a632013-08-14 13:48:06 +02003296#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003297
Paul Bakker5121ce52009-01-03 21:22:43 +00003298/*
3299 * SSL get accessors
3300 */
Paul Bakker23986e52011-04-24 08:57:21 +00003301size_t ssl_get_bytes_avail( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003302{
3303 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
3304}
3305
Paul Bakkerff60ee62010-03-16 21:09:09 +00003306int ssl_get_verify_result( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003307{
3308 return( ssl->verify_result );
3309}
3310
Paul Bakkere3166ce2011-01-27 17:40:50 +00003311const char *ssl_get_ciphersuite( const ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00003312{
Paul Bakker926c8e42013-03-06 10:23:34 +01003313 if( ssl == NULL || ssl->session == NULL )
3314 return NULL;
3315
Paul Bakkere3166ce2011-01-27 17:40:50 +00003316 return ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00003317}
3318
Paul Bakker43ca69c2011-01-15 17:35:19 +00003319const char *ssl_get_version( const ssl_context *ssl )
3320{
3321 switch( ssl->minor_ver )
3322 {
3323 case SSL_MINOR_VERSION_0:
3324 return( "SSLv3.0" );
3325
3326 case SSL_MINOR_VERSION_1:
3327 return( "TLSv1.0" );
3328
3329 case SSL_MINOR_VERSION_2:
3330 return( "TLSv1.1" );
3331
Paul Bakker1ef83d62012-04-11 12:09:53 +00003332 case SSL_MINOR_VERSION_3:
3333 return( "TLSv1.2" );
3334
Paul Bakker43ca69c2011-01-15 17:35:19 +00003335 default:
3336 break;
3337 }
3338 return( "unknown" );
3339}
3340
Paul Bakkered27a042013-04-18 22:46:23 +02003341#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb0550d92012-10-30 07:51:03 +00003342const x509_cert *ssl_get_peer_cert( const ssl_context *ssl )
3343{
3344 if( ssl == NULL || ssl->session == NULL )
3345 return NULL;
3346
3347 return ssl->session->peer_cert;
3348}
Paul Bakkered27a042013-04-18 22:46:23 +02003349#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00003350
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003351int ssl_get_session( const ssl_context *ssl, ssl_session *dst )
3352{
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003353 if( ssl == NULL ||
3354 dst == NULL ||
3355 ssl->session == NULL ||
3356 ssl->endpoint != SSL_IS_CLIENT )
3357 {
3358 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3359 }
3360
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003361 return( ssl_session_copy( dst, ssl->session ) );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003362}
3363
Paul Bakker5121ce52009-01-03 21:22:43 +00003364/*
Paul Bakker1961b702013-01-25 14:49:24 +01003365 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003366 */
Paul Bakker1961b702013-01-25 14:49:24 +01003367int ssl_handshake_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003368{
Paul Bakker40e46942009-01-03 21:51:57 +00003369 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003370
Paul Bakker40e46942009-01-03 21:51:57 +00003371#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003372 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker1961b702013-01-25 14:49:24 +01003373 ret = ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003374#endif
3375
Paul Bakker40e46942009-01-03 21:51:57 +00003376#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003377 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker1961b702013-01-25 14:49:24 +01003378 ret = ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003379#endif
3380
Paul Bakker1961b702013-01-25 14:49:24 +01003381 return( ret );
3382}
3383
3384/*
3385 * Perform the SSL handshake
3386 */
3387int ssl_handshake( ssl_context *ssl )
3388{
3389 int ret = 0;
3390
3391 SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
3392
3393 while( ssl->state != SSL_HANDSHAKE_OVER )
3394 {
3395 ret = ssl_handshake_step( ssl );
3396
3397 if( ret != 0 )
3398 break;
3399 }
3400
Paul Bakker5121ce52009-01-03 21:22:43 +00003401 SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
3402
3403 return( ret );
3404}
3405
3406/*
Paul Bakker48916f92012-09-16 19:57:18 +00003407 * Renegotiate current connection
3408 */
3409int ssl_renegotiate( ssl_context *ssl )
3410{
3411 int ret;
3412
3413 SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
3414
3415 if( ssl->state != SSL_HANDSHAKE_OVER )
3416 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3417
3418 ssl->state = SSL_HELLO_REQUEST;
3419 ssl->renegotiation = SSL_RENEGOTIATION;
3420
3421 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3422 return( ret );
3423
3424 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3425 {
3426 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3427 return( ret );
3428 }
3429
3430 SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
3431
3432 return( 0 );
3433}
3434
3435/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003436 * Receive application data decrypted from the SSL layer
3437 */
Paul Bakker23986e52011-04-24 08:57:21 +00003438int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003439{
Paul Bakker23986e52011-04-24 08:57:21 +00003440 int ret;
3441 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003442
3443 SSL_DEBUG_MSG( 2, ( "=> read" ) );
3444
3445 if( ssl->state != SSL_HANDSHAKE_OVER )
3446 {
3447 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3448 {
3449 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3450 return( ret );
3451 }
3452 }
3453
3454 if( ssl->in_offt == NULL )
3455 {
3456 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3457 {
Paul Bakker831a7552011-05-18 13:32:51 +00003458 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3459 return( 0 );
3460
Paul Bakker5121ce52009-01-03 21:22:43 +00003461 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3462 return( ret );
3463 }
3464
3465 if( ssl->in_msglen == 0 &&
3466 ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
3467 {
3468 /*
3469 * OpenSSL sends empty messages to randomize the IV
3470 */
3471 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3472 {
Paul Bakker831a7552011-05-18 13:32:51 +00003473 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3474 return( 0 );
3475
Paul Bakker5121ce52009-01-03 21:22:43 +00003476 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3477 return( ret );
3478 }
3479 }
3480
Paul Bakker48916f92012-09-16 19:57:18 +00003481 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
3482 {
3483 SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
3484
3485 if( ssl->endpoint == SSL_IS_CLIENT &&
3486 ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST ||
3487 ssl->in_hslen != 4 ) )
3488 {
3489 SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
3490 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
3491 }
3492
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003493 if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
3494 ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
3495 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) )
Paul Bakker48916f92012-09-16 19:57:18 +00003496 {
3497 SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
3498
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003499 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakker48916f92012-09-16 19:57:18 +00003500 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003501 /*
3502 * SSLv3 does not have a "no_renegotiation" alert
3503 */
3504 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
3505 return( ret );
3506 }
3507 else
3508 {
3509 if( ( ret = ssl_send_alert_message( ssl,
3510 SSL_ALERT_LEVEL_WARNING,
3511 SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
3512 {
3513 return( ret );
3514 }
Paul Bakker48916f92012-09-16 19:57:18 +00003515 }
3516 }
3517 else
3518 {
3519 if( ( ret = ssl_renegotiate( ssl ) ) != 0 )
3520 {
3521 SSL_DEBUG_RET( 1, "ssl_renegotiate", ret );
3522 return( ret );
3523 }
3524
3525 return( POLARSSL_ERR_NET_WANT_READ );
3526 }
3527 }
3528 else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003529 {
3530 SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003531 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003532 }
3533
3534 ssl->in_offt = ssl->in_msg;
3535 }
3536
3537 n = ( len < ssl->in_msglen )
3538 ? len : ssl->in_msglen;
3539
3540 memcpy( buf, ssl->in_offt, n );
3541 ssl->in_msglen -= n;
3542
3543 if( ssl->in_msglen == 0 )
3544 /* all bytes consumed */
3545 ssl->in_offt = NULL;
3546 else
3547 /* more data available */
3548 ssl->in_offt += n;
3549
3550 SSL_DEBUG_MSG( 2, ( "<= read" ) );
3551
Paul Bakker23986e52011-04-24 08:57:21 +00003552 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003553}
3554
3555/*
3556 * Send application data to be encrypted by the SSL layer
3557 */
Paul Bakker23986e52011-04-24 08:57:21 +00003558int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003559{
Paul Bakker23986e52011-04-24 08:57:21 +00003560 int ret;
3561 size_t n;
Paul Bakker05decb22013-08-15 13:33:48 +02003562 unsigned int max_len = SSL_MAX_CONTENT_LEN;
Paul Bakker5121ce52009-01-03 21:22:43 +00003563
3564 SSL_DEBUG_MSG( 2, ( "=> write" ) );
3565
3566 if( ssl->state != SSL_HANDSHAKE_OVER )
3567 {
3568 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3569 {
3570 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3571 return( ret );
3572 }
3573 }
3574
Paul Bakker05decb22013-08-15 13:33:48 +02003575#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003576 /*
3577 * Assume mfl_code is correct since it was checked when set
3578 */
3579 max_len = mfl_code_to_length[ssl->mfl_code];
3580
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003581 /*
Paul Bakker05decb22013-08-15 13:33:48 +02003582 * Check if a smaller max length was negotiated
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003583 */
3584 if( ssl->session_out != NULL &&
3585 mfl_code_to_length[ssl->session_out->mfl_code] < max_len )
3586 {
3587 max_len = mfl_code_to_length[ssl->session_out->mfl_code];
3588 }
Paul Bakker05decb22013-08-15 13:33:48 +02003589#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003590
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003591 n = ( len < max_len) ? len : max_len;
Paul Bakker887bd502011-06-08 13:10:54 +00003592
Paul Bakker5121ce52009-01-03 21:22:43 +00003593 if( ssl->out_left != 0 )
3594 {
3595 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3596 {
3597 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3598 return( ret );
3599 }
3600 }
Paul Bakker887bd502011-06-08 13:10:54 +00003601 else
Paul Bakker1fd00bf2011-03-14 20:50:15 +00003602 {
Paul Bakker887bd502011-06-08 13:10:54 +00003603 ssl->out_msglen = n;
3604 ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
3605 memcpy( ssl->out_msg, buf, n );
3606
3607 if( ( ret = ssl_write_record( ssl ) ) != 0 )
3608 {
3609 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
3610 return( ret );
3611 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003612 }
3613
3614 SSL_DEBUG_MSG( 2, ( "<= write" ) );
3615
Paul Bakker23986e52011-04-24 08:57:21 +00003616 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003617}
3618
3619/*
3620 * Notify the peer that the connection is being closed
3621 */
3622int ssl_close_notify( ssl_context *ssl )
3623{
3624 int ret;
3625
3626 SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
3627
3628 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3629 {
3630 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3631 return( ret );
3632 }
3633
3634 if( ssl->state == SSL_HANDSHAKE_OVER )
3635 {
Paul Bakker48916f92012-09-16 19:57:18 +00003636 if( ( ret = ssl_send_alert_message( ssl,
3637 SSL_ALERT_LEVEL_WARNING,
3638 SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003639 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003640 return( ret );
3641 }
3642 }
3643
3644 SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
3645
3646 return( ret );
3647}
3648
Paul Bakker48916f92012-09-16 19:57:18 +00003649void ssl_transform_free( ssl_transform *transform )
3650{
3651#if defined(POLARSSL_ZLIB_SUPPORT)
3652 deflateEnd( &transform->ctx_deflate );
3653 inflateEnd( &transform->ctx_inflate );
3654#endif
3655
Paul Bakker61d113b2013-07-04 11:51:43 +02003656 md_free_ctx( &transform->md_ctx_enc );
3657 md_free_ctx( &transform->md_ctx_dec );
3658
Paul Bakker48916f92012-09-16 19:57:18 +00003659 memset( transform, 0, sizeof( ssl_transform ) );
3660}
3661
3662void ssl_handshake_free( ssl_handshake_params *handshake )
3663{
3664#if defined(POLARSSL_DHM_C)
3665 dhm_free( &handshake->dhm_ctx );
3666#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02003667#if defined(POLARSSL_ECDH_C)
3668 ecdh_free( &handshake->ecdh_ctx );
3669#endif
3670
Paul Bakker48916f92012-09-16 19:57:18 +00003671 memset( handshake, 0, sizeof( ssl_handshake_params ) );
3672}
3673
3674void ssl_session_free( ssl_session *session )
3675{
Paul Bakkered27a042013-04-18 22:46:23 +02003676#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker0a597072012-09-25 21:55:46 +00003677 if( session->peer_cert != NULL )
Paul Bakker48916f92012-09-16 19:57:18 +00003678 {
Paul Bakker0a597072012-09-25 21:55:46 +00003679 x509_free( session->peer_cert );
Paul Bakker6e339b52013-07-03 13:37:05 +02003680 polarssl_free( session->peer_cert );
Paul Bakker48916f92012-09-16 19:57:18 +00003681 }
Paul Bakkered27a042013-04-18 22:46:23 +02003682#endif
Paul Bakker0a597072012-09-25 21:55:46 +00003683
Paul Bakkera503a632013-08-14 13:48:06 +02003684#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02003685 polarssl_free( session->ticket );
Paul Bakkera503a632013-08-14 13:48:06 +02003686#endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02003687
Paul Bakker0a597072012-09-25 21:55:46 +00003688 memset( session, 0, sizeof( ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003689}
3690
Paul Bakker5121ce52009-01-03 21:22:43 +00003691/*
3692 * Free an SSL context
3693 */
3694void ssl_free( ssl_context *ssl )
3695{
3696 SSL_DEBUG_MSG( 2, ( "=> free" ) );
3697
Paul Bakker5121ce52009-01-03 21:22:43 +00003698 if( ssl->out_ctr != NULL )
3699 {
3700 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02003701 polarssl_free( ssl->out_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00003702 }
3703
3704 if( ssl->in_ctr != NULL )
3705 {
3706 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02003707 polarssl_free( ssl->in_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00003708 }
3709
Paul Bakker40e46942009-01-03 21:51:57 +00003710#if defined(POLARSSL_DHM_C)
Paul Bakker48916f92012-09-16 19:57:18 +00003711 mpi_free( &ssl->dhm_P );
3712 mpi_free( &ssl->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00003713#endif
3714
Paul Bakker48916f92012-09-16 19:57:18 +00003715 if( ssl->transform )
3716 {
3717 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02003718 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003719 }
3720
3721 if( ssl->handshake )
3722 {
3723 ssl_handshake_free( ssl->handshake );
3724 ssl_transform_free( ssl->transform_negotiate );
3725 ssl_session_free( ssl->session_negotiate );
3726
Paul Bakker6e339b52013-07-03 13:37:05 +02003727 polarssl_free( ssl->handshake );
3728 polarssl_free( ssl->transform_negotiate );
3729 polarssl_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00003730 }
3731
Paul Bakkerc0463502013-02-14 11:19:38 +01003732 if( ssl->session )
3733 {
3734 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02003735 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01003736 }
3737
Paul Bakkera503a632013-08-14 13:48:06 +02003738#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003739 polarssl_free( ssl->ticket_keys );
Paul Bakkera503a632013-08-14 13:48:06 +02003740#endif
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003741
Paul Bakker5121ce52009-01-03 21:22:43 +00003742 if ( ssl->hostname != NULL)
3743 {
3744 memset( ssl->hostname, 0, ssl->hostname_len );
Paul Bakker6e339b52013-07-03 13:37:05 +02003745 polarssl_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00003746 ssl->hostname_len = 0;
3747 }
3748
Paul Bakker05ef8352012-05-08 09:17:57 +00003749#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3750 if( ssl_hw_record_finish != NULL )
3751 {
3752 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) );
3753 ssl_hw_record_finish( ssl );
3754 }
3755#endif
3756
Paul Bakker5121ce52009-01-03 21:22:43 +00003757 SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00003758
Paul Bakker86f04f42013-02-14 11:20:09 +01003759 /* Actually clear after last debug message */
Paul Bakker2da561c2009-02-05 18:00:28 +00003760 memset( ssl, 0, sizeof( ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003761}
3762
3763#endif