blob: 039b536d83d56e3b26235cc3295a107f5a0b9777 [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
Paul Bakker1f2bc622013-08-15 13:45:55 +0200519#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard277f7f22013-07-19 12:19:21 +0200520 /*
521 * If HMAC is to be truncated, we shall keep the leftmost bytes,
522 * (rfc 6066 page 13 or rfc 2104 section 4),
523 * so we only need to adjust the length here.
524 */
525 if( session->trunc_hmac == SSL_TRUNC_HMAC_ENABLED )
526 transform->maclen = SSL_TRUNCATED_HMAC_LEN;
Paul Bakker1f2bc622013-08-15 13:45:55 +0200527#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Paul Bakker68884e32013-01-07 18:20:04 +0100528 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000529
Paul Bakker68884e32013-01-07 18:20:04 +0100530 transform->keylen = cipher_info->key_length;
531 transform->keylen /= 8;
532 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +0000533
Paul Bakker68884e32013-01-07 18:20:04 +0100534 transform->minlen = transform->keylen;
535 if( transform->minlen < transform->maclen )
536 {
537 if( cipher_info->mode == POLARSSL_MODE_STREAM )
538 transform->minlen = transform->maclen;
539 else
540 transform->minlen += transform->keylen;
541 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000542 }
543
544 SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000545 transform->keylen, transform->minlen, transform->ivlen,
546 transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000547
548 /*
549 * Finally setup the cipher contexts, IVs and MAC secrets.
550 */
551 if( ssl->endpoint == SSL_IS_CLIENT )
552 {
Paul Bakker48916f92012-09-16 19:57:18 +0000553 key1 = keyblk + transform->maclen * 2;
554 key2 = keyblk + transform->maclen * 2 + transform->keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000555
Paul Bakker68884e32013-01-07 18:20:04 +0100556 mac_enc = keyblk;
557 mac_dec = keyblk + transform->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000558
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000559 /*
560 * This is not used in TLS v1.1.
561 */
Paul Bakker48916f92012-09-16 19:57:18 +0000562 iv_copy_len = ( transform->fixed_ivlen ) ?
563 transform->fixed_ivlen : transform->ivlen;
564 memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len );
565 memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000566 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000567 }
568 else
569 {
Paul Bakker48916f92012-09-16 19:57:18 +0000570 key1 = keyblk + transform->maclen * 2 + transform->keylen;
571 key2 = keyblk + transform->maclen * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000572
Paul Bakker68884e32013-01-07 18:20:04 +0100573 mac_enc = keyblk + transform->maclen;
574 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +0000575
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000576 /*
577 * This is not used in TLS v1.1.
578 */
Paul Bakker48916f92012-09-16 19:57:18 +0000579 iv_copy_len = ( transform->fixed_ivlen ) ?
580 transform->fixed_ivlen : transform->ivlen;
581 memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len );
582 memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000583 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000584 }
585
Paul Bakker68884e32013-01-07 18:20:04 +0100586 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
587 {
588 memcpy( transform->mac_enc, mac_enc, transform->maclen );
589 memcpy( transform->mac_dec, mac_dec, transform->maclen );
590 }
591 else
592 {
593 md_hmac_starts( &transform->md_ctx_enc, mac_enc, transform->maclen );
594 md_hmac_starts( &transform->md_ctx_dec, mac_dec, transform->maclen );
595 }
596
Paul Bakker05ef8352012-05-08 09:17:57 +0000597#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
598 if( ssl_hw_record_init != NULL)
599 {
600 int ret = 0;
601
602 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) );
603
Paul Bakker07eb38b2012-12-19 14:42:06 +0100604 if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->keylen,
605 transform->iv_enc, transform->iv_dec,
606 iv_copy_len,
Paul Bakker68884e32013-01-07 18:20:04 +0100607 mac_enc, mac_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100608 transform->maclen ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +0000609 {
610 SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret );
611 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
612 }
613 }
614#endif
615
Paul Bakker68884e32013-01-07 18:20:04 +0100616 switch( cipher_info->type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000617 {
Paul Bakker40e46942009-01-03 21:51:57 +0000618#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100619 case POLARSSL_CIPHER_ARC4_128:
Paul Bakker48916f92012-09-16 19:57:18 +0000620 arc4_setup( (arc4_context *) transform->ctx_enc, key1,
621 transform->keylen );
622 arc4_setup( (arc4_context *) transform->ctx_dec, key2,
623 transform->keylen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000624 break;
625#endif
626
Paul Bakker40e46942009-01-03 21:51:57 +0000627#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100628 case POLARSSL_CIPHER_DES_EDE3_CBC:
629 des3_set3key_enc( (des3_context *) transform->ctx_enc, key1 );
630 des3_set3key_dec( (des3_context *) transform->ctx_dec, key2 );
631 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000632#endif
633
Paul Bakker40e46942009-01-03 21:51:57 +0000634#if defined(POLARSSL_AES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100635 case POLARSSL_CIPHER_AES_128_CBC:
636 case POLARSSL_CIPHER_AES_256_CBC:
637 aes_setkey_enc( (aes_context*) transform->ctx_enc, key1,
638 cipher_info->key_length );
639 aes_setkey_dec( (aes_context*) transform->ctx_dec, key2,
640 cipher_info->key_length );
Paul Bakker5121ce52009-01-03 21:22:43 +0000641 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000642#endif
643
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000644#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100645 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
646 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
647 camellia_setkey_enc( (camellia_context*) transform->ctx_enc, key1,
648 cipher_info->key_length );
649 camellia_setkey_dec( (camellia_context*) transform->ctx_dec, key2,
650 cipher_info->key_length );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000651 break;
652#endif
653
Paul Bakkerfab5c822012-02-06 16:45:10 +0000654#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100655 case POLARSSL_CIPHER_DES_CBC:
Paul Bakker48916f92012-09-16 19:57:18 +0000656 des_setkey_enc( (des_context *) transform->ctx_enc, key1 );
657 des_setkey_dec( (des_context *) transform->ctx_dec, key2 );
Paul Bakkerfab5c822012-02-06 16:45:10 +0000658 break;
659#endif
Paul Bakker68884e32013-01-07 18:20:04 +0100660
661#if defined(POLARSSL_GCM_C)
662 case POLARSSL_CIPHER_AES_128_GCM:
663 case POLARSSL_CIPHER_AES_256_GCM:
664 gcm_init( (gcm_context *) transform->ctx_enc, key1,
665 cipher_info->key_length );
666 gcm_init( (gcm_context *) transform->ctx_dec, key2,
667 cipher_info->key_length );
668 break;
669#endif
670
671 case POLARSSL_CIPHER_NULL:
672 break;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000673
Paul Bakker5121ce52009-01-03 21:22:43 +0000674 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000675 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000676 }
677
678 memset( keyblk, 0, sizeof( keyblk ) );
679
Paul Bakker2770fbd2012-07-03 13:30:23 +0000680#if defined(POLARSSL_ZLIB_SUPPORT)
681 // Initialize compression
682 //
Paul Bakker48916f92012-09-16 19:57:18 +0000683 if( session->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000684 {
685 SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
686
Paul Bakker48916f92012-09-16 19:57:18 +0000687 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
688 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000689
Paul Bakker48916f92012-09-16 19:57:18 +0000690 if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK ||
691 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000692 {
693 SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
694 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
695 }
696 }
697#endif /* POLARSSL_ZLIB_SUPPORT */
698
Paul Bakker5121ce52009-01-03 21:22:43 +0000699 SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
700
701 return( 0 );
702}
703
Paul Bakker380da532012-04-18 16:10:25 +0000704void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000705{
706 md5_context md5;
707 sha1_context sha1;
708 unsigned char pad_1[48];
709 unsigned char pad_2[48];
710
Paul Bakker380da532012-04-18 16:10:25 +0000711 SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000712
Paul Bakker48916f92012-09-16 19:57:18 +0000713 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
714 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000715
Paul Bakker380da532012-04-18 16:10:25 +0000716 memset( pad_1, 0x36, 48 );
717 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000718
Paul Bakker48916f92012-09-16 19:57:18 +0000719 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000720 md5_update( &md5, pad_1, 48 );
721 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000722
Paul Bakker380da532012-04-18 16:10:25 +0000723 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +0000724 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000725 md5_update( &md5, pad_2, 48 );
726 md5_update( &md5, hash, 16 );
727 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000728
Paul Bakker48916f92012-09-16 19:57:18 +0000729 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000730 sha1_update( &sha1, pad_1, 40 );
731 sha1_finish( &sha1, hash + 16 );
732
733 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +0000734 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000735 sha1_update( &sha1, pad_2, 40 );
736 sha1_update( &sha1, hash + 16, 20 );
737 sha1_finish( &sha1, hash + 16 );
738
739 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
740 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
741
742 return;
743}
744
745void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] )
746{
747 md5_context md5;
748 sha1_context sha1;
749
750 SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
751
Paul Bakker48916f92012-09-16 19:57:18 +0000752 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
753 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000754
Paul Bakker48916f92012-09-16 19:57:18 +0000755 md5_finish( &md5, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000756 sha1_finish( &sha1, hash + 16 );
757
758 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
759 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
760
761 return;
762}
763
764void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] )
765{
Paul Bakker9e36f042013-06-30 14:34:05 +0200766 sha256_context sha256;
Paul Bakker380da532012-04-18 16:10:25 +0000767
768 SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
769
Paul Bakker9e36f042013-06-30 14:34:05 +0200770 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
771 sha256_finish( &sha256, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000772
773 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
774 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
775
776 return;
777}
778
Paul Bakker9e36f042013-06-30 14:34:05 +0200779#if defined(POLARSSL_SHA512_C)
Paul Bakker380da532012-04-18 16:10:25 +0000780void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] )
781{
Paul Bakker9e36f042013-06-30 14:34:05 +0200782 sha512_context sha512;
Paul Bakker380da532012-04-18 16:10:25 +0000783
784 SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
785
Paul Bakker9e36f042013-06-30 14:34:05 +0200786 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
787 sha512_finish( &sha512, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000788
Paul Bakkerca4ab492012-04-18 14:23:57 +0000789 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000790 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
791
792 return;
793}
Paul Bakker769075d2012-11-24 11:26:46 +0100794#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000795
796/*
797 * SSLv3.0 MAC functions
798 */
Paul Bakker68884e32013-01-07 18:20:04 +0100799static void ssl_mac( md_context_t *md_ctx, unsigned char *secret,
800 unsigned char *buf, size_t len,
801 unsigned char *ctr, int type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000802{
803 unsigned char header[11];
804 unsigned char padding[48];
Paul Bakker68884e32013-01-07 18:20:04 +0100805 int padlen = 0;
806 int md_size = md_get_size( md_ctx->md_info );
807 int md_type = md_get_type( md_ctx->md_info );
808
809 if( md_type == POLARSSL_MD_MD5 )
810 padlen = 48;
811 else if( md_type == POLARSSL_MD_SHA1 )
812 padlen = 40;
813 else if( md_type == POLARSSL_MD_SHA256 )
814 padlen = 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000815
816 memcpy( header, ctr, 8 );
817 header[ 8] = (unsigned char) type;
818 header[ 9] = (unsigned char)( len >> 8 );
819 header[10] = (unsigned char)( len );
820
Paul Bakker68884e32013-01-07 18:20:04 +0100821 memset( padding, 0x36, padlen );
822 md_starts( md_ctx );
823 md_update( md_ctx, secret, md_size );
824 md_update( md_ctx, padding, padlen );
825 md_update( md_ctx, header, 11 );
826 md_update( md_ctx, buf, len );
827 md_finish( md_ctx, buf + len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000828
Paul Bakker68884e32013-01-07 18:20:04 +0100829 memset( padding, 0x5C, padlen );
830 md_starts( md_ctx );
831 md_update( md_ctx, secret, md_size );
832 md_update( md_ctx, padding, padlen );
833 md_update( md_ctx, buf + len, md_size );
834 md_finish( md_ctx, buf + len );
Paul Bakker5f70b252012-09-13 14:23:06 +0000835}
836
Paul Bakker5121ce52009-01-03 21:22:43 +0000837/*
838 * Encryption/decryption functions
Paul Bakkerf7abd422013-04-16 13:15:56 +0200839 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000840static int ssl_encrypt_buf( ssl_context *ssl )
841{
Paul Bakker23986e52011-04-24 08:57:21 +0000842 size_t i, padlen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000843
844 SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
845
846 /*
847 * Add MAC then encrypt
848 */
849 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
850 {
Paul Bakker68884e32013-01-07 18:20:04 +0100851 ssl_mac( &ssl->transform_out->md_ctx_enc,
852 ssl->transform_out->mac_enc,
853 ssl->out_msg, ssl->out_msglen,
854 ssl->out_ctr, ssl->out_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +0000855 }
856 else
857 {
Paul Bakker68884e32013-01-07 18:20:04 +0100858 md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 13 );
859 md_hmac_update( &ssl->transform_out->md_ctx_enc,
860 ssl->out_msg, ssl->out_msglen );
861 md_hmac_finish( &ssl->transform_out->md_ctx_enc,
862 ssl->out_msg + ssl->out_msglen );
863 md_hmac_reset( &ssl->transform_out->md_ctx_enc );
Paul Bakker5121ce52009-01-03 21:22:43 +0000864 }
865
866 SSL_DEBUG_BUF( 4, "computed mac",
Paul Bakker48916f92012-09-16 19:57:18 +0000867 ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000868
Paul Bakker48916f92012-09-16 19:57:18 +0000869 ssl->out_msglen += ssl->transform_out->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000870
Paul Bakker68884e32013-01-07 18:20:04 +0100871#if defined(POLARSSL_CIPHER_NULL_CIPHER)
872 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
873 {
874 padlen = 0;
875 }
876 else
877#endif /* POLARSSL_CIPHER_NULL_CIPHER */
878#if defined(POLARSSL_ARC4_C)
879 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000880 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000881 padlen = 0;
882
883 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
884 "including %d bytes of padding",
885 ssl->out_msglen, 0 ) );
886
887 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
888 ssl->out_msg, ssl->out_msglen );
889
Paul Bakker68884e32013-01-07 18:20:04 +0100890 arc4_crypt( (arc4_context *) ssl->transform_out->ctx_enc,
891 ssl->out_msglen, ssl->out_msg,
892 ssl->out_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +0000893 }
Paul Bakker68884e32013-01-07 18:20:04 +0100894 else
895#endif /* POLARSSL_ARC4_C */
896#if defined(POLARSSL_GCM_C)
897 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
898 ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000899 {
900 size_t enc_msglen;
901 unsigned char *enc_msg;
902 unsigned char add_data[13];
903 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
904
905 padlen = 0;
906 enc_msglen = ssl->out_msglen;
907
908 memcpy( add_data, ssl->out_ctr, 8 );
909 add_data[8] = ssl->out_msgtype;
910 add_data[9] = ssl->major_ver;
911 add_data[10] = ssl->minor_ver;
912 add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
913 add_data[12] = ssl->out_msglen & 0xFF;
914
915 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
916 add_data, 13 );
917
Paul Bakker68884e32013-01-07 18:20:04 +0100918 /*
919 * Generate IV
920 */
921 ret = ssl->f_rng( ssl->p_rng,
Paul Bakker48916f92012-09-16 19:57:18 +0000922 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
Paul Bakker68884e32013-01-07 18:20:04 +0100923 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
924 if( ret != 0 )
925 return( ret );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000926
Paul Bakker68884e32013-01-07 18:20:04 +0100927 memcpy( ssl->out_iv,
928 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
929 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000930
Paul Bakker68884e32013-01-07 18:20:04 +0100931 /*
932 * Fix pointer positions and message length with added IV
933 */
934 enc_msg = ssl->out_msg;
935 enc_msglen = ssl->out_msglen;
936 ssl->out_msglen += ssl->transform_out->ivlen -
937 ssl->transform_out->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000938
Paul Bakker68884e32013-01-07 18:20:04 +0100939 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
940 "including %d bytes of padding",
941 ssl->out_msglen, 0 ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000942
Paul Bakker68884e32013-01-07 18:20:04 +0100943 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
944 ssl->out_msg, ssl->out_msglen );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000945
Paul Bakker68884e32013-01-07 18:20:04 +0100946 /*
947 * Adjust for tag
948 */
949 ssl->out_msglen += 16;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000950
Paul Bakker68884e32013-01-07 18:20:04 +0100951 gcm_crypt_and_tag( (gcm_context *) ssl->transform_out->ctx_enc,
952 GCM_ENCRYPT, enc_msglen,
953 ssl->transform_out->iv_enc, ssl->transform_out->ivlen,
954 add_data, 13,
955 enc_msg, enc_msg,
956 16, enc_msg + enc_msglen );
957
958 SSL_DEBUG_BUF( 4, "after encrypt: tag",
959 enc_msg + enc_msglen, 16 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000960 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000961 else
Paul Bakker68884e32013-01-07 18:20:04 +0100962#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +0000963 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000964 unsigned char *enc_msg;
Paul Bakker23986e52011-04-24 08:57:21 +0000965 size_t enc_msglen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000966
Paul Bakker48916f92012-09-16 19:57:18 +0000967 padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
968 ssl->transform_out->ivlen;
969 if( padlen == ssl->transform_out->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000970 padlen = 0;
971
972 for( i = 0; i <= padlen; i++ )
973 ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
974
975 ssl->out_msglen += padlen + 1;
976
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000977 enc_msglen = ssl->out_msglen;
978 enc_msg = ssl->out_msg;
979
980 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +0000981 * Prepend per-record IV for block cipher in TLS v1.1 and up as per
982 * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000983 */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000984 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000985 {
986 /*
987 * Generate IV
988 */
Paul Bakker48916f92012-09-16 19:57:18 +0000989 int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc,
990 ssl->transform_out->ivlen );
Paul Bakkera3d195c2011-11-27 21:07:34 +0000991 if( ret != 0 )
992 return( ret );
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000993
Paul Bakker92be97b2013-01-02 17:30:03 +0100994 memcpy( ssl->out_iv, ssl->transform_out->iv_enc,
Paul Bakker48916f92012-09-16 19:57:18 +0000995 ssl->transform_out->ivlen );
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000996
997 /*
998 * Fix pointer positions and message length with added IV
999 */
Paul Bakker92be97b2013-01-02 17:30:03 +01001000 enc_msg = ssl->out_msg;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001001 enc_msglen = ssl->out_msglen;
Paul Bakker48916f92012-09-16 19:57:18 +00001002 ssl->out_msglen += ssl->transform_out->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001003 }
1004
Paul Bakker5121ce52009-01-03 21:22:43 +00001005 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001006 "including %d bytes of IV and %d bytes of padding",
Paul Bakker48916f92012-09-16 19:57:18 +00001007 ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001008
1009 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
Paul Bakker92be97b2013-01-02 17:30:03 +01001010 ssl->out_iv, ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001011
Paul Bakker68884e32013-01-07 18:20:04 +01001012 switch( ssl->transform_out->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +00001013 {
Paul Bakker68884e32013-01-07 18:20:04 +01001014 case POLARSSL_CIPHER_DES_CBC:
1015 des_crypt_cbc( (des_context *) ssl->transform_out->ctx_enc,
1016 DES_ENCRYPT, enc_msglen,
1017 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1018 break;
1019
1020 case POLARSSL_CIPHER_DES_EDE3_CBC:
1021 des3_crypt_cbc( (des3_context *) ssl->transform_out->ctx_enc,
1022 DES_ENCRYPT, enc_msglen,
1023 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1024 break;
1025
1026 case POLARSSL_CIPHER_AES_128_CBC:
1027 case POLARSSL_CIPHER_AES_256_CBC:
1028 aes_crypt_cbc( (aes_context *) ssl->transform_out->ctx_enc,
1029 AES_ENCRYPT, enc_msglen,
1030 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1031 break;
1032
1033 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
1034 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
1035 camellia_crypt_cbc( (camellia_context *) ssl->transform_out->ctx_enc,
1036 CAMELLIA_ENCRYPT, enc_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001037 ssl->transform_out->iv_enc, enc_msg, enc_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001038 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001039
1040 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001041 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001042 }
1043 }
1044
Paul Bakkerca4ab492012-04-18 14:23:57 +00001045 for( i = 8; i > 0; i-- )
1046 if( ++ssl->out_ctr[i - 1] != 0 )
1047 break;
1048
Paul Bakker5121ce52009-01-03 21:22:43 +00001049 SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
1050
1051 return( 0 );
1052}
1053
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001054#define POLARSSL_SSL_MAX_MAC_SIZE 48
Paul Bakkerfab5c822012-02-06 16:45:10 +00001055
Paul Bakker5121ce52009-01-03 21:22:43 +00001056static int ssl_decrypt_buf( ssl_context *ssl )
1057{
Paul Bakker45829992013-01-03 14:52:21 +01001058 size_t i, padlen = 0, correct = 1;
Paul Bakkerfab5c822012-02-06 16:45:10 +00001059 unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
Paul Bakker5121ce52009-01-03 21:22:43 +00001060
1061 SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
1062
Paul Bakker48916f92012-09-16 19:57:18 +00001063 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001064 {
1065 SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
Paul Bakker48916f92012-09-16 19:57:18 +00001066 ssl->in_msglen, ssl->transform_in->minlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001067 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001068 }
1069
Paul Bakker68884e32013-01-07 18:20:04 +01001070#if defined(POLARSSL_CIPHER_NULL_CIPHER)
1071 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001072 {
Paul Bakker68884e32013-01-07 18:20:04 +01001073 padlen = 0;
1074 }
1075 else
1076#endif /* POLARSSL_CIPHER_NULL_CIPHER */
Paul Bakker40e46942009-01-03 21:51:57 +00001077#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001078 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
1079 {
1080 padlen = 0;
1081
1082 arc4_crypt( (arc4_context *) ssl->transform_in->ctx_dec,
Paul Bakkerbaad6502010-03-21 15:42:15 +00001083 ssl->in_msglen, ssl->in_msg,
1084 ssl->in_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001085 }
Paul Bakker68884e32013-01-07 18:20:04 +01001086 else
1087#endif /* POLARSSL_ARC4_C */
1088#if defined(POLARSSL_GCM_C)
1089 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
1090 ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001091 {
1092 unsigned char *dec_msg;
1093 unsigned char *dec_msg_result;
1094 size_t dec_msglen;
1095 unsigned char add_data[13];
1096 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1097
Paul Bakker68884e32013-01-07 18:20:04 +01001098 padlen = 0;
1099
1100 dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
1101 ssl->transform_in->fixed_ivlen );
1102 dec_msglen -= 16;
1103 dec_msg = ssl->in_msg;
1104 dec_msg_result = ssl->in_msg;
1105 ssl->in_msglen = dec_msglen;
1106
1107 memcpy( add_data, ssl->in_ctr, 8 );
1108 add_data[8] = ssl->in_msgtype;
1109 add_data[9] = ssl->major_ver;
1110 add_data[10] = ssl->minor_ver;
1111 add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
1112 add_data[12] = ssl->in_msglen & 0xFF;
1113
1114 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1115 add_data, 13 );
1116
1117 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
1118 ssl->in_iv,
1119 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
1120
1121 SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
1122 ssl->transform_in->ivlen );
1123 SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
1124
1125 ret = gcm_auth_decrypt( (gcm_context *) ssl->transform_in->ctx_dec,
1126 dec_msglen,
1127 ssl->transform_in->iv_dec,
1128 ssl->transform_in->ivlen,
1129 add_data, 13,
1130 dec_msg + dec_msglen, 16,
1131 dec_msg, dec_msg_result );
1132
1133 if( ret != 0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001134 {
Paul Bakker68884e32013-01-07 18:20:04 +01001135 SSL_DEBUG_MSG( 1, ( "AEAD decrypt failed on validation (ret = -0x%02x)",
1136 -ret ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001137
Paul Bakker68884e32013-01-07 18:20:04 +01001138 return( POLARSSL_ERR_SSL_INVALID_MAC );
1139 }
Paul Bakkerca4ab492012-04-18 14:23:57 +00001140 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001141 else
Paul Bakker68884e32013-01-07 18:20:04 +01001142#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001143 {
Paul Bakker45829992013-01-03 14:52:21 +01001144 /*
1145 * Decrypt and check the padding
1146 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001147 unsigned char *dec_msg;
1148 unsigned char *dec_msg_result;
Paul Bakker23986e52011-04-24 08:57:21 +00001149 size_t dec_msglen;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001150 size_t minlen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001151
Paul Bakker5121ce52009-01-03 21:22:43 +00001152 /*
Paul Bakker45829992013-01-03 14:52:21 +01001153 * Check immediate ciphertext sanity
Paul Bakker5121ce52009-01-03 21:22:43 +00001154 */
Paul Bakker48916f92012-09-16 19:57:18 +00001155 if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001156 {
1157 SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
Paul Bakker48916f92012-09-16 19:57:18 +00001158 ssl->in_msglen, ssl->transform_in->ivlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001159 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001160 }
1161
Paul Bakker45829992013-01-03 14:52:21 +01001162 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
1163 minlen += ssl->transform_in->ivlen;
1164
1165 if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
1166 ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
1167 {
1168 SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
1169 ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) );
1170 return( POLARSSL_ERR_SSL_INVALID_MAC );
1171 }
1172
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001173 dec_msglen = ssl->in_msglen;
1174 dec_msg = ssl->in_msg;
1175 dec_msg_result = ssl->in_msg;
1176
1177 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001178 * Initialize for prepended IV for block cipher in TLS v1.1 and up
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001179 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001180 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001181 {
Paul Bakker48916f92012-09-16 19:57:18 +00001182 dec_msglen -= ssl->transform_in->ivlen;
1183 ssl->in_msglen -= ssl->transform_in->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001184
Paul Bakker48916f92012-09-16 19:57:18 +00001185 for( i = 0; i < ssl->transform_in->ivlen; i++ )
Paul Bakker92be97b2013-01-02 17:30:03 +01001186 ssl->transform_in->iv_dec[i] = ssl->in_iv[i];
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001187 }
1188
Paul Bakker68884e32013-01-07 18:20:04 +01001189 switch( ssl->transform_in->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +00001190 {
Paul Bakker68884e32013-01-07 18:20:04 +01001191 case POLARSSL_CIPHER_DES_CBC:
1192 des_crypt_cbc( (des_context *) ssl->transform_in->ctx_dec,
1193 DES_DECRYPT, dec_msglen,
1194 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
Paul Bakker5121ce52009-01-03 21:22:43 +00001195 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001196
Paul Bakker68884e32013-01-07 18:20:04 +01001197 case POLARSSL_CIPHER_DES_EDE3_CBC:
1198 des3_crypt_cbc( (des3_context *) ssl->transform_in->ctx_dec,
1199 DES_DECRYPT, dec_msglen,
1200 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1201 break;
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001202
Paul Bakker68884e32013-01-07 18:20:04 +01001203 case POLARSSL_CIPHER_AES_128_CBC:
1204 case POLARSSL_CIPHER_AES_256_CBC:
1205 aes_crypt_cbc( (aes_context *) ssl->transform_in->ctx_dec,
1206 AES_DECRYPT, dec_msglen,
1207 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1208 break;
1209
1210 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
1211 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
1212 camellia_crypt_cbc( (camellia_context *) ssl->transform_in->ctx_dec,
1213 CAMELLIA_DECRYPT, dec_msglen,
1214 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1215 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001216
1217 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001218 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001219 }
1220
1221 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
Paul Bakker45829992013-01-03 14:52:21 +01001222
1223 if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
1224 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001225#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001226 SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
1227 ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001228#endif
Paul Bakker45829992013-01-03 14:52:21 +01001229 padlen = 0;
Paul Bakker45829992013-01-03 14:52:21 +01001230 correct = 0;
1231 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001232
1233 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1234 {
Paul Bakker48916f92012-09-16 19:57:18 +00001235 if( padlen > ssl->transform_in->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001236 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001237#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001238 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
1239 "should be no more than %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001240 padlen, ssl->transform_in->ivlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001241#endif
Paul Bakker45829992013-01-03 14:52:21 +01001242 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001243 }
1244 }
1245 else
1246 {
1247 /*
Paul Bakker45829992013-01-03 14:52:21 +01001248 * TLSv1+: always check the padding up to the first failure
1249 * and fake check up to 256 bytes of padding
Paul Bakker5121ce52009-01-03 21:22:43 +00001250 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001251 size_t pad_count = 0, fake_pad_count = 0;
1252 size_t padding_idx = ssl->in_msglen - padlen - 1;
1253
Paul Bakker5121ce52009-01-03 21:22:43 +00001254 for( i = 1; i <= padlen; i++ )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001255 pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1256
1257 for( ; i <= 256; i++ )
1258 fake_pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1259
1260 correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
1261 correct &= ( pad_count + fake_pad_count < 512 ); /* Always 1 */
1262
Paul Bakkerd66f0702013-01-31 16:57:45 +01001263#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001264 if( padlen > 0 && correct == 0)
1265 SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001266#endif
Paul Bakkere47b34b2013-02-27 14:48:00 +01001267 padlen &= correct * 0x1FF;
Paul Bakker5121ce52009-01-03 21:22:43 +00001268 }
1269 }
1270
1271 SSL_DEBUG_BUF( 4, "raw buffer after decryption",
1272 ssl->in_msg, ssl->in_msglen );
1273
1274 /*
1275 * Always compute the MAC (RFC4346, CBCTIME).
1276 */
Paul Bakker48916f92012-09-16 19:57:18 +00001277 ssl->in_msglen -= ( ssl->transform_in->maclen + padlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001278
1279 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1280 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1281
Paul Bakker45829992013-01-03 14:52:21 +01001282 memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001283
1284 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1285 {
Paul Bakker68884e32013-01-07 18:20:04 +01001286 ssl_mac( &ssl->transform_in->md_ctx_dec,
1287 ssl->transform_in->mac_dec,
1288 ssl->in_msg, ssl->in_msglen,
1289 ssl->in_ctr, ssl->in_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +00001290 }
1291 else
1292 {
Paul Bakker45829992013-01-03 14:52:21 +01001293 /*
1294 * Process MAC and always update for padlen afterwards to make
1295 * total time independent of padlen
Paul Bakkere47b34b2013-02-27 14:48:00 +01001296 *
1297 * extra_run compensates MAC check for padlen
1298 *
1299 * Known timing attacks:
1300 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
1301 *
1302 * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
1303 * correctly. (We round down instead of up, so -56 is the correct
1304 * value for our calculations instead of -55)
Paul Bakker45829992013-01-03 14:52:21 +01001305 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001306 int j, extra_run = 0;
1307 extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
1308 ( 13 + ssl->in_msglen + 8 ) / 64;
1309
1310 extra_run &= correct * 0xFF;
1311
Paul Bakker68884e32013-01-07 18:20:04 +01001312 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 13 );
1313 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,
1314 ssl->in_msglen );
1315 md_hmac_finish( &ssl->transform_in->md_ctx_dec,
1316 ssl->in_msg + ssl->in_msglen );
1317 for( j = 0; j < extra_run; j++ )
1318 md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001319
Paul Bakker68884e32013-01-07 18:20:04 +01001320 md_hmac_reset( &ssl->transform_in->md_ctx_dec );
Paul Bakker5121ce52009-01-03 21:22:43 +00001321 }
1322
Paul Bakker48916f92012-09-16 19:57:18 +00001323 SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001324 SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001325 ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001326
1327 if( memcmp( tmp, ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001328 ssl->transform_in->maclen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001329 {
Paul Bakkere47b34b2013-02-27 14:48:00 +01001330#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001331 SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001332#endif
Paul Bakker45829992013-01-03 14:52:21 +01001333 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001334 }
1335
1336 /*
Paul Bakker45829992013-01-03 14:52:21 +01001337 * Finally check the correct flag
Paul Bakker5121ce52009-01-03 21:22:43 +00001338 */
Paul Bakker45829992013-01-03 14:52:21 +01001339 if( correct == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +00001340 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001341
1342 if( ssl->in_msglen == 0 )
1343 {
1344 ssl->nb_zero++;
1345
1346 /*
1347 * Three or more empty messages may be a DoS attack
1348 * (excessive CPU consumption).
1349 */
1350 if( ssl->nb_zero > 3 )
1351 {
1352 SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
1353 "messages, possible DoS attack" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001354 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001355 }
1356 }
1357 else
1358 ssl->nb_zero = 0;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001359
Paul Bakker23986e52011-04-24 08:57:21 +00001360 for( i = 8; i > 0; i-- )
1361 if( ++ssl->in_ctr[i - 1] != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001362 break;
1363
1364 SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
1365
1366 return( 0 );
1367}
1368
Paul Bakker2770fbd2012-07-03 13:30:23 +00001369#if defined(POLARSSL_ZLIB_SUPPORT)
1370/*
1371 * Compression/decompression functions
1372 */
1373static int ssl_compress_buf( ssl_context *ssl )
1374{
1375 int ret;
1376 unsigned char *msg_post = ssl->out_msg;
1377 size_t len_pre = ssl->out_msglen;
1378 unsigned char *msg_pre;
1379
1380 SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
1381
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001382 if( len_pre == 0 )
1383 return( 0 );
1384
Paul Bakker6e339b52013-07-03 13:37:05 +02001385 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001386 if( msg_pre == NULL )
1387 {
1388 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1389 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1390 }
1391
1392 memcpy( msg_pre, ssl->out_msg, len_pre );
1393
1394 SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
1395 ssl->out_msglen ) );
1396
1397 SSL_DEBUG_BUF( 4, "before compression: output payload",
1398 ssl->out_msg, ssl->out_msglen );
1399
Paul Bakker48916f92012-09-16 19:57:18 +00001400 ssl->transform_out->ctx_deflate.next_in = msg_pre;
1401 ssl->transform_out->ctx_deflate.avail_in = len_pre;
1402 ssl->transform_out->ctx_deflate.next_out = msg_post;
1403 ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001404
Paul Bakker48916f92012-09-16 19:57:18 +00001405 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001406 if( ret != Z_OK )
1407 {
1408 SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
1409 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1410 }
1411
Paul Bakker48916f92012-09-16 19:57:18 +00001412 ssl->out_msglen = SSL_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001413
Paul Bakker6e339b52013-07-03 13:37:05 +02001414 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001415
1416 SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
1417 ssl->out_msglen ) );
1418
1419 SSL_DEBUG_BUF( 4, "after compression: output payload",
1420 ssl->out_msg, ssl->out_msglen );
1421
1422 SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
1423
1424 return( 0 );
1425}
1426
1427static int ssl_decompress_buf( ssl_context *ssl )
1428{
1429 int ret;
1430 unsigned char *msg_post = ssl->in_msg;
1431 size_t len_pre = ssl->in_msglen;
1432 unsigned char *msg_pre;
1433
1434 SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
1435
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001436 if( len_pre == 0 )
1437 return( 0 );
1438
Paul Bakker6e339b52013-07-03 13:37:05 +02001439 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001440 if( msg_pre == NULL )
1441 {
1442 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1443 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1444 }
1445
1446 memcpy( msg_pre, ssl->in_msg, len_pre );
1447
1448 SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
1449 ssl->in_msglen ) );
1450
1451 SSL_DEBUG_BUF( 4, "before decompression: input payload",
1452 ssl->in_msg, ssl->in_msglen );
1453
Paul Bakker48916f92012-09-16 19:57:18 +00001454 ssl->transform_in->ctx_inflate.next_in = msg_pre;
1455 ssl->transform_in->ctx_inflate.avail_in = len_pre;
1456 ssl->transform_in->ctx_inflate.next_out = msg_post;
1457 ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001458
Paul Bakker48916f92012-09-16 19:57:18 +00001459 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001460 if( ret != Z_OK )
1461 {
1462 SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
1463 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1464 }
1465
Paul Bakker48916f92012-09-16 19:57:18 +00001466 ssl->in_msglen = SSL_MAX_CONTENT_LEN - ssl->transform_in->ctx_inflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001467
Paul Bakker6e339b52013-07-03 13:37:05 +02001468 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001469
1470 SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
1471 ssl->in_msglen ) );
1472
1473 SSL_DEBUG_BUF( 4, "after decompression: input payload",
1474 ssl->in_msg, ssl->in_msglen );
1475
1476 SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
1477
1478 return( 0 );
1479}
1480#endif /* POLARSSL_ZLIB_SUPPORT */
1481
Paul Bakker5121ce52009-01-03 21:22:43 +00001482/*
1483 * Fill the input message buffer
1484 */
Paul Bakker23986e52011-04-24 08:57:21 +00001485int ssl_fetch_input( ssl_context *ssl, size_t nb_want )
Paul Bakker5121ce52009-01-03 21:22:43 +00001486{
Paul Bakker23986e52011-04-24 08:57:21 +00001487 int ret;
1488 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001489
1490 SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
1491
1492 while( ssl->in_left < nb_want )
1493 {
1494 len = nb_want - ssl->in_left;
1495 ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
1496
1497 SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
1498 ssl->in_left, nb_want ) );
1499 SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
1500
Paul Bakker831a7552011-05-18 13:32:51 +00001501 if( ret == 0 )
1502 return( POLARSSL_ERR_SSL_CONN_EOF );
1503
Paul Bakker5121ce52009-01-03 21:22:43 +00001504 if( ret < 0 )
1505 return( ret );
1506
1507 ssl->in_left += ret;
1508 }
1509
1510 SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
1511
1512 return( 0 );
1513}
1514
1515/*
1516 * Flush any data not yet written
1517 */
1518int ssl_flush_output( ssl_context *ssl )
1519{
1520 int ret;
1521 unsigned char *buf;
1522
1523 SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
1524
1525 while( ssl->out_left > 0 )
1526 {
1527 SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
1528 5 + ssl->out_msglen, ssl->out_left ) );
1529
Paul Bakker5bd42292012-12-19 14:40:42 +01001530 buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
Paul Bakker5121ce52009-01-03 21:22:43 +00001531 ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
Paul Bakker186751d2012-05-08 13:16:14 +00001532
Paul Bakker5121ce52009-01-03 21:22:43 +00001533 SSL_DEBUG_RET( 2, "ssl->f_send", ret );
1534
1535 if( ret <= 0 )
1536 return( ret );
1537
1538 ssl->out_left -= ret;
1539 }
1540
1541 SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
1542
1543 return( 0 );
1544}
1545
1546/*
1547 * Record layer functions
1548 */
1549int ssl_write_record( ssl_context *ssl )
1550{
Paul Bakker05ef8352012-05-08 09:17:57 +00001551 int ret, done = 0;
Paul Bakker23986e52011-04-24 08:57:21 +00001552 size_t len = ssl->out_msglen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001553
1554 SSL_DEBUG_MSG( 2, ( "=> write record" ) );
1555
Paul Bakker5121ce52009-01-03 21:22:43 +00001556 if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
1557 {
1558 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
1559 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
1560 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
1561
Paul Bakker48916f92012-09-16 19:57:18 +00001562 ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001563 }
1564
Paul Bakker2770fbd2012-07-03 13:30:23 +00001565#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001566 if( ssl->transform_out != NULL &&
1567 ssl->session_out->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001568 {
1569 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
1570 {
1571 SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
1572 return( ret );
1573 }
1574
1575 len = ssl->out_msglen;
1576 }
1577#endif /*POLARSSL_ZLIB_SUPPORT */
1578
Paul Bakker05ef8352012-05-08 09:17:57 +00001579#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1580 if( ssl_hw_record_write != NULL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001581 {
Paul Bakker05ef8352012-05-08 09:17:57 +00001582 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001583
Paul Bakker05ef8352012-05-08 09:17:57 +00001584 ret = ssl_hw_record_write( ssl );
1585 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1586 {
1587 SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret );
1588 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1589 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001590
1591 if( ret == 0 )
1592 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001593 }
1594#endif
1595 if( !done )
1596 {
1597 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
1598 ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
1599 ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00001600 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1601 ssl->out_hdr[4] = (unsigned char)( len );
Paul Bakker05ef8352012-05-08 09:17:57 +00001602
Paul Bakker48916f92012-09-16 19:57:18 +00001603 if( ssl->transform_out != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001604 {
1605 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
1606 {
1607 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
1608 return( ret );
1609 }
1610
1611 len = ssl->out_msglen;
1612 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1613 ssl->out_hdr[4] = (unsigned char)( len );
1614 }
1615
1616 ssl->out_left = 5 + ssl->out_msglen;
1617
1618 SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
1619 "version = [%d:%d], msglen = %d",
1620 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
1621 ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
1622
1623 SSL_DEBUG_BUF( 4, "output record sent to network",
Paul Bakker5bd42292012-12-19 14:40:42 +01001624 ssl->out_hdr, 5 + ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001625 }
1626
Paul Bakker5121ce52009-01-03 21:22:43 +00001627 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1628 {
1629 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
1630 return( ret );
1631 }
1632
1633 SSL_DEBUG_MSG( 2, ( "<= write record" ) );
1634
1635 return( 0 );
1636}
1637
1638int ssl_read_record( ssl_context *ssl )
1639{
Paul Bakker05ef8352012-05-08 09:17:57 +00001640 int ret, done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001641
1642 SSL_DEBUG_MSG( 2, ( "=> read record" ) );
1643
Paul Bakker68884e32013-01-07 18:20:04 +01001644 SSL_DEBUG_BUF( 4, "input record from network",
1645 ssl->in_hdr, 5 + ssl->in_msglen );
1646
Paul Bakker5121ce52009-01-03 21:22:43 +00001647 if( ssl->in_hslen != 0 &&
1648 ssl->in_hslen < ssl->in_msglen )
1649 {
1650 /*
1651 * Get next Handshake message in the current record
1652 */
1653 ssl->in_msglen -= ssl->in_hslen;
1654
Paul Bakker8934a982011-08-05 11:11:53 +00001655 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
Paul Bakker48916f92012-09-16 19:57:18 +00001656 ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001657
1658 ssl->in_hslen = 4;
1659 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1660
1661 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1662 " %d, type = %d, hslen = %d",
1663 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1664
1665 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1666 {
1667 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001668 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001669 }
1670
1671 if( ssl->in_msglen < ssl->in_hslen )
1672 {
1673 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001674 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001675 }
1676
Paul Bakker48916f92012-09-16 19:57:18 +00001677 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001678
1679 return( 0 );
1680 }
1681
1682 ssl->in_hslen = 0;
1683
1684 /*
1685 * Read the record header and validate it
1686 */
1687 if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
1688 {
1689 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1690 return( ret );
1691 }
1692
1693 ssl->in_msgtype = ssl->in_hdr[0];
1694 ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
1695
1696 SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
1697 "version = [%d:%d], msglen = %d",
1698 ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
1699 ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
1700
1701 if( ssl->in_hdr[1] != ssl->major_ver )
1702 {
1703 SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001704 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001705 }
1706
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001707 if( ssl->in_hdr[2] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00001708 {
1709 SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001710 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001711 }
1712
1713 /*
1714 * Make sure the message length is acceptable
1715 */
Paul Bakker48916f92012-09-16 19:57:18 +00001716 if( ssl->transform_in == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001717 {
1718 if( ssl->in_msglen < 1 ||
1719 ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1720 {
1721 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001722 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001723 }
1724 }
1725 else
1726 {
Paul Bakker48916f92012-09-16 19:57:18 +00001727 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001728 {
1729 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001730 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001731 }
1732
1733 if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001734 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN )
Paul Bakker5121ce52009-01-03 21:22:43 +00001735 {
1736 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001737 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001738 }
1739
1740 /*
1741 * TLS encrypted messages can have up to 256 bytes of padding
1742 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001743 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001744 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN + 256 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001745 {
1746 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001747 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001748 }
1749 }
1750
1751 /*
1752 * Read and optionally decrypt the message contents
1753 */
1754 if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 )
1755 {
1756 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1757 return( ret );
1758 }
1759
1760 SSL_DEBUG_BUF( 4, "input record from network",
1761 ssl->in_hdr, 5 + ssl->in_msglen );
1762
Paul Bakker05ef8352012-05-08 09:17:57 +00001763#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1764 if( ssl_hw_record_read != NULL)
1765 {
1766 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) );
1767
1768 ret = ssl_hw_record_read( ssl );
1769 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1770 {
1771 SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret );
1772 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1773 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001774
1775 if( ret == 0 )
1776 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001777 }
1778#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001779 if( !done && ssl->transform_in != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001780 {
1781 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
1782 {
Paul Bakker40865c82013-01-31 17:13:13 +01001783#if defined(POLARSSL_SSL_ALERT_MESSAGES)
1784 if( ret == POLARSSL_ERR_SSL_INVALID_MAC )
1785 {
1786 ssl_send_alert_message( ssl,
1787 SSL_ALERT_LEVEL_FATAL,
1788 SSL_ALERT_MSG_BAD_RECORD_MAC );
1789 }
1790#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001791 SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
1792 return( ret );
1793 }
1794
1795 SSL_DEBUG_BUF( 4, "input payload after decrypt",
1796 ssl->in_msg, ssl->in_msglen );
1797
1798 if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1799 {
1800 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001801 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001802 }
1803 }
1804
Paul Bakker2770fbd2012-07-03 13:30:23 +00001805#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001806 if( ssl->transform_in != NULL &&
1807 ssl->session_in->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001808 {
1809 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
1810 {
1811 SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
1812 return( ret );
1813 }
1814
1815 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1816 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1817 }
1818#endif /* POLARSSL_ZLIB_SUPPORT */
1819
Paul Bakker0a925182012-04-16 06:46:41 +00001820 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE &&
1821 ssl->in_msgtype != SSL_MSG_ALERT &&
1822 ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC &&
1823 ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
1824 {
1825 SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
1826
Paul Bakker48916f92012-09-16 19:57:18 +00001827 if( ( ret = ssl_send_alert_message( ssl,
1828 SSL_ALERT_LEVEL_FATAL,
1829 SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
Paul Bakker0a925182012-04-16 06:46:41 +00001830 {
1831 return( ret );
1832 }
1833
1834 return( POLARSSL_ERR_SSL_INVALID_RECORD );
1835 }
1836
Paul Bakker5121ce52009-01-03 21:22:43 +00001837 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
1838 {
1839 ssl->in_hslen = 4;
1840 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1841
1842 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1843 " %d, type = %d, hslen = %d",
1844 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1845
1846 /*
1847 * Additional checks to validate the handshake header
1848 */
1849 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1850 {
1851 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001852 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001853 }
1854
1855 if( ssl->in_msglen < ssl->in_hslen )
1856 {
1857 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001858 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001859 }
1860
Paul Bakker48916f92012-09-16 19:57:18 +00001861 if( ssl->state != SSL_HANDSHAKE_OVER )
1862 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001863 }
1864
1865 if( ssl->in_msgtype == SSL_MSG_ALERT )
1866 {
1867 SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
1868 ssl->in_msg[0], ssl->in_msg[1] ) );
1869
1870 /*
1871 * Ignore non-fatal alerts, except close_notify
1872 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001873 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001874 {
Paul Bakker2770fbd2012-07-03 13:30:23 +00001875 SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
1876 ssl->in_msg[1] ) );
Paul Bakker9d781402011-05-09 16:17:09 +00001877 /**
1878 * Subtract from error code as ssl->in_msg[1] is 7-bit positive
1879 * error identifier.
1880 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00001881 return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001882 }
1883
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001884 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
1885 ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00001886 {
1887 SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001888 return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001889 }
1890 }
1891
1892 ssl->in_left = 0;
1893
1894 SSL_DEBUG_MSG( 2, ( "<= read record" ) );
1895
1896 return( 0 );
1897}
1898
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001899int ssl_send_fatal_handshake_failure( ssl_context *ssl )
1900{
1901 int ret;
1902
1903 if( ( ret = ssl_send_alert_message( ssl,
1904 SSL_ALERT_LEVEL_FATAL,
1905 SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
1906 {
1907 return( ret );
1908 }
1909
1910 return( 0 );
1911}
1912
Paul Bakker0a925182012-04-16 06:46:41 +00001913int ssl_send_alert_message( ssl_context *ssl,
1914 unsigned char level,
1915 unsigned char message )
1916{
1917 int ret;
1918
1919 SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
1920
1921 ssl->out_msgtype = SSL_MSG_ALERT;
1922 ssl->out_msglen = 2;
1923 ssl->out_msg[0] = level;
1924 ssl->out_msg[1] = message;
1925
1926 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1927 {
1928 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1929 return( ret );
1930 }
1931
1932 SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
1933
1934 return( 0 );
1935}
1936
Paul Bakker5121ce52009-01-03 21:22:43 +00001937/*
1938 * Handshake functions
1939 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001940#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1941 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1942 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001943int ssl_write_certificate( ssl_context *ssl )
1944{
Paul Bakkered27a042013-04-18 22:46:23 +02001945 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001946 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001947
1948 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1949
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001950 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1951 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001952 {
1953 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1954 ssl->state++;
1955 return( 0 );
1956 }
1957
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001958 return( ret );
1959}
1960
1961int ssl_parse_certificate( ssl_context *ssl )
1962{
1963 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1964 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1965
1966 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
1967
1968 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1969 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1970 {
1971 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
1972 ssl->state++;
1973 return( 0 );
1974 }
1975
1976 return( ret );
1977}
1978#else
1979int ssl_write_certificate( ssl_context *ssl )
1980{
1981 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1982 size_t i, n;
1983 const x509_cert *crt;
1984 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1985
1986 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1987
1988 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1989 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1990 {
1991 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1992 ssl->state++;
1993 return( 0 );
1994 }
1995
Paul Bakker5121ce52009-01-03 21:22:43 +00001996 if( ssl->endpoint == SSL_IS_CLIENT )
1997 {
1998 if( ssl->client_auth == 0 )
1999 {
2000 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2001 ssl->state++;
2002 return( 0 );
2003 }
2004
2005 /*
2006 * If using SSLv3 and got no cert, send an Alert message
2007 * (otherwise an empty Certificate message will be sent).
2008 */
2009 if( ssl->own_cert == NULL &&
2010 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2011 {
2012 ssl->out_msglen = 2;
2013 ssl->out_msgtype = SSL_MSG_ALERT;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002014 ssl->out_msg[0] = SSL_ALERT_LEVEL_WARNING;
2015 ssl->out_msg[1] = SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00002016
2017 SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
2018 goto write_msg;
2019 }
2020 }
2021 else /* SSL_IS_SERVER */
2022 {
2023 if( ssl->own_cert == NULL )
2024 {
2025 SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002026 return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002027 }
2028 }
2029
2030 SSL_DEBUG_CRT( 3, "own certificate", ssl->own_cert );
2031
2032 /*
2033 * 0 . 0 handshake type
2034 * 1 . 3 handshake length
2035 * 4 . 6 length of all certs
2036 * 7 . 9 length of cert. 1
2037 * 10 . n-1 peer certificate
2038 * n . n+2 length of cert. 2
2039 * n+3 . ... upper level cert, etc.
2040 */
2041 i = 7;
2042 crt = ssl->own_cert;
2043
Paul Bakker29087132010-03-21 21:03:34 +00002044 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002045 {
2046 n = crt->raw.len;
2047 if( i + 3 + n > SSL_MAX_CONTENT_LEN )
2048 {
2049 SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
2050 i + 3 + n, SSL_MAX_CONTENT_LEN ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002051 return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002052 }
2053
2054 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
2055 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
2056 ssl->out_msg[i + 2] = (unsigned char)( n );
2057
2058 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
2059 i += n; crt = crt->next;
2060 }
2061
2062 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
2063 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
2064 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
2065
2066 ssl->out_msglen = i;
2067 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2068 ssl->out_msg[0] = SSL_HS_CERTIFICATE;
2069
2070write_msg:
2071
2072 ssl->state++;
2073
2074 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2075 {
2076 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2077 return( ret );
2078 }
2079
2080 SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
2081
Paul Bakkered27a042013-04-18 22:46:23 +02002082 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002083}
2084
2085int ssl_parse_certificate( ssl_context *ssl )
2086{
Paul Bakkered27a042013-04-18 22:46:23 +02002087 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker23986e52011-04-24 08:57:21 +00002088 size_t i, n;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002089 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002090
2091 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2092
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002093 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2094 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002095 {
2096 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2097 ssl->state++;
2098 return( 0 );
2099 }
2100
Paul Bakker5121ce52009-01-03 21:22:43 +00002101 if( ssl->endpoint == SSL_IS_SERVER &&
2102 ssl->authmode == SSL_VERIFY_NONE )
2103 {
Paul Bakkercdf07e92011-01-30 17:05:13 +00002104 ssl->verify_result = BADCERT_SKIP_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00002105 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2106 ssl->state++;
2107 return( 0 );
2108 }
2109
2110 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2111 {
2112 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2113 return( ret );
2114 }
2115
2116 ssl->state++;
2117
2118 /*
2119 * Check if the client sent an empty certificate
2120 */
2121 if( ssl->endpoint == SSL_IS_SERVER &&
2122 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2123 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002124 if( ssl->in_msglen == 2 &&
2125 ssl->in_msgtype == SSL_MSG_ALERT &&
2126 ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2127 ssl->in_msg[1] == SSL_ALERT_MSG_NO_CERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002128 {
2129 SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2130
Paul Bakkercdf07e92011-01-30 17:05:13 +00002131 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002132 if( ssl->authmode == SSL_VERIFY_OPTIONAL )
2133 return( 0 );
2134 else
Paul Bakker40e46942009-01-03 21:51:57 +00002135 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002136 }
2137 }
2138
2139 if( ssl->endpoint == SSL_IS_SERVER &&
2140 ssl->minor_ver != SSL_MINOR_VERSION_0 )
2141 {
2142 if( ssl->in_hslen == 7 &&
2143 ssl->in_msgtype == SSL_MSG_HANDSHAKE &&
2144 ssl->in_msg[0] == SSL_HS_CERTIFICATE &&
2145 memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
2146 {
2147 SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2148
Paul Bakkercdf07e92011-01-30 17:05:13 +00002149 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002150 if( ssl->authmode == SSL_VERIFY_REQUIRED )
Paul Bakker40e46942009-01-03 21:51:57 +00002151 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002152 else
2153 return( 0 );
2154 }
2155 }
2156
2157 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2158 {
2159 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002160 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002161 }
2162
2163 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
2164 {
2165 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002166 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002167 }
2168
2169 /*
2170 * Same message structure as in ssl_write_certificate()
2171 */
2172 n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
2173
2174 if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
2175 {
2176 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002177 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002178 }
2179
Paul Bakker6e339b52013-07-03 13:37:05 +02002180 if( ( ssl->session_negotiate->peer_cert = (x509_cert *) polarssl_malloc(
Paul Bakker5121ce52009-01-03 21:22:43 +00002181 sizeof( x509_cert ) ) ) == NULL )
2182 {
2183 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
2184 sizeof( x509_cert ) ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002185 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002186 }
2187
Paul Bakker48916f92012-09-16 19:57:18 +00002188 memset( ssl->session_negotiate->peer_cert, 0, sizeof( x509_cert ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002189
2190 i = 7;
2191
2192 while( i < ssl->in_hslen )
2193 {
2194 if( ssl->in_msg[i] != 0 )
2195 {
2196 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002197 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002198 }
2199
2200 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2201 | (unsigned int) ssl->in_msg[i + 2];
2202 i += 3;
2203
2204 if( n < 128 || i + n > ssl->in_hslen )
2205 {
2206 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002207 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002208 }
2209
Paul Bakker89ecb2d2013-06-24 19:06:15 +02002210 ret = x509parse_crt_der( ssl->session_negotiate->peer_cert,
2211 ssl->in_msg + i, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002212 if( ret != 0 )
2213 {
2214 SSL_DEBUG_RET( 1, " x509parse_crt", ret );
2215 return( ret );
2216 }
2217
2218 i += n;
2219 }
2220
Paul Bakker48916f92012-09-16 19:57:18 +00002221 SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00002222
2223 if( ssl->authmode != SSL_VERIFY_NONE )
2224 {
2225 if( ssl->ca_chain == NULL )
2226 {
2227 SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002228 return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002229 }
2230
Paul Bakker48916f92012-09-16 19:57:18 +00002231 ret = x509parse_verify( ssl->session_negotiate->peer_cert,
2232 ssl->ca_chain, ssl->ca_crl,
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002233 ssl->peer_cn, &ssl->verify_result,
2234 ssl->f_vrfy, ssl->p_vrfy );
Paul Bakker5121ce52009-01-03 21:22:43 +00002235
2236 if( ret != 0 )
2237 SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2238
2239 if( ssl->authmode != SSL_VERIFY_REQUIRED )
2240 ret = 0;
2241 }
2242
2243 SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
2244
2245 return( ret );
2246}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002247#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2248 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2249 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002250
2251int ssl_write_change_cipher_spec( ssl_context *ssl )
2252{
2253 int ret;
2254
2255 SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
2256
2257 ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
2258 ssl->out_msglen = 1;
2259 ssl->out_msg[0] = 1;
2260
Paul Bakker5121ce52009-01-03 21:22:43 +00002261 ssl->state++;
2262
2263 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2264 {
2265 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2266 return( ret );
2267 }
2268
2269 SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
2270
2271 return( 0 );
2272}
2273
2274int ssl_parse_change_cipher_spec( ssl_context *ssl )
2275{
2276 int ret;
2277
2278 SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
2279
Paul Bakker5121ce52009-01-03 21:22:43 +00002280 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2281 {
2282 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2283 return( ret );
2284 }
2285
2286 if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
2287 {
2288 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002289 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002290 }
2291
2292 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
2293 {
2294 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002295 return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
Paul Bakker5121ce52009-01-03 21:22:43 +00002296 }
2297
2298 ssl->state++;
2299
2300 SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
2301
2302 return( 0 );
2303}
2304
Paul Bakker41c83d32013-03-20 14:39:14 +01002305void ssl_optimize_checksum( ssl_context *ssl,
2306 const ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00002307{
Paul Bakker9e36f042013-06-30 14:34:05 +02002308#if !defined(POLARSSL_SHA512_C)
Paul Bakker769075d2012-11-24 11:26:46 +01002309 ((void) ciphersuite);
2310#endif
2311
Paul Bakker380da532012-04-18 16:10:25 +00002312 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00002313 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker9e36f042013-06-30 14:34:05 +02002314#if defined(POLARSSL_SHA512_C)
Paul Bakkerb7149bc2013-03-20 15:30:09 +01002315 else if( ciphersuite_info->mac == POLARSSL_MD_SHA384 )
Paul Bakker380da532012-04-18 16:10:25 +00002316 {
Paul Bakker48916f92012-09-16 19:57:18 +00002317 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
Paul Bakker380da532012-04-18 16:10:25 +00002318 }
Paul Bakker769075d2012-11-24 11:26:46 +01002319#endif
Paul Bakker380da532012-04-18 16:10:25 +00002320 else
Paul Bakker48916f92012-09-16 19:57:18 +00002321 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakker380da532012-04-18 16:10:25 +00002322}
Paul Bakkerf7abd422013-04-16 13:15:56 +02002323
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002324static void ssl_update_checksum_start( ssl_context *ssl,
2325 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002326{
Paul Bakker48916f92012-09-16 19:57:18 +00002327 md5_update( &ssl->handshake->fin_md5 , buf, len );
2328 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker9e36f042013-06-30 14:34:05 +02002329 sha256_update( &ssl->handshake->fin_sha256, buf, len );
2330#if defined(POLARSSL_SHA512_C)
2331 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002332#endif
Paul Bakker380da532012-04-18 16:10:25 +00002333}
2334
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002335static void ssl_update_checksum_md5sha1( ssl_context *ssl,
2336 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002337{
Paul Bakker48916f92012-09-16 19:57:18 +00002338 md5_update( &ssl->handshake->fin_md5 , buf, len );
2339 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002340}
2341
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002342static void ssl_update_checksum_sha256( ssl_context *ssl,
2343 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002344{
Paul Bakker9e36f042013-06-30 14:34:05 +02002345 sha256_update( &ssl->handshake->fin_sha256, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002346}
2347
Paul Bakker9e36f042013-06-30 14:34:05 +02002348#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002349static void ssl_update_checksum_sha384( ssl_context *ssl,
2350 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002351{
Paul Bakker9e36f042013-06-30 14:34:05 +02002352 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002353}
Paul Bakker769075d2012-11-24 11:26:46 +01002354#endif
Paul Bakker380da532012-04-18 16:10:25 +00002355
Paul Bakker1ef83d62012-04-11 12:09:53 +00002356static void ssl_calc_finished_ssl(
2357 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002358{
Paul Bakker3c2122f2013-06-24 19:03:14 +02002359 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002360 md5_context md5;
2361 sha1_context sha1;
2362
Paul Bakker5121ce52009-01-03 21:22:43 +00002363 unsigned char padbuf[48];
2364 unsigned char md5sum[16];
2365 unsigned char sha1sum[20];
2366
Paul Bakker48916f92012-09-16 19:57:18 +00002367 ssl_session *session = ssl->session_negotiate;
2368 if( !session )
2369 session = ssl->session;
2370
Paul Bakker1ef83d62012-04-11 12:09:53 +00002371 SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
2372
Paul Bakker48916f92012-09-16 19:57:18 +00002373 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2374 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002375
2376 /*
2377 * SSLv3:
2378 * hash =
2379 * MD5( master + pad2 +
2380 * MD5( handshake + sender + master + pad1 ) )
2381 * + SHA1( master + pad2 +
2382 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002383 */
2384
Paul Bakker90995b52013-06-24 19:20:35 +02002385#if !defined(POLARSSL_MD5_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002386 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002387 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002388#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002389
Paul Bakker90995b52013-06-24 19:20:35 +02002390#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002391 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002392 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002393#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002394
Paul Bakker3c2122f2013-06-24 19:03:14 +02002395 sender = ( from == SSL_IS_CLIENT ) ? "CLNT"
2396 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00002397
Paul Bakker1ef83d62012-04-11 12:09:53 +00002398 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002399
Paul Bakker3c2122f2013-06-24 19:03:14 +02002400 md5_update( &md5, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002401 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002402 md5_update( &md5, padbuf, 48 );
2403 md5_finish( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002404
Paul Bakker3c2122f2013-06-24 19:03:14 +02002405 sha1_update( &sha1, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002406 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002407 sha1_update( &sha1, padbuf, 40 );
2408 sha1_finish( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002409
Paul Bakker1ef83d62012-04-11 12:09:53 +00002410 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002411
Paul Bakker1ef83d62012-04-11 12:09:53 +00002412 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +00002413 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002414 md5_update( &md5, padbuf, 48 );
2415 md5_update( &md5, md5sum, 16 );
2416 md5_finish( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00002417
Paul Bakker1ef83d62012-04-11 12:09:53 +00002418 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +00002419 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002420 sha1_update( &sha1, padbuf , 40 );
2421 sha1_update( &sha1, sha1sum, 20 );
2422 sha1_finish( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002423
Paul Bakker1ef83d62012-04-11 12:09:53 +00002424 SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002425
Paul Bakker1ef83d62012-04-11 12:09:53 +00002426 memset( &md5, 0, sizeof( md5_context ) );
2427 memset( &sha1, 0, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002428
2429 memset( padbuf, 0, sizeof( padbuf ) );
2430 memset( md5sum, 0, sizeof( md5sum ) );
2431 memset( sha1sum, 0, sizeof( sha1sum ) );
2432
2433 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2434}
2435
Paul Bakker1ef83d62012-04-11 12:09:53 +00002436static void ssl_calc_finished_tls(
2437 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002438{
Paul Bakker1ef83d62012-04-11 12:09:53 +00002439 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002440 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002441 md5_context md5;
Paul Bakker5121ce52009-01-03 21:22:43 +00002442 sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002443 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00002444
Paul Bakker48916f92012-09-16 19:57:18 +00002445 ssl_session *session = ssl->session_negotiate;
2446 if( !session )
2447 session = ssl->session;
2448
Paul Bakker1ef83d62012-04-11 12:09:53 +00002449 SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002450
Paul Bakker48916f92012-09-16 19:57:18 +00002451 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2452 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002453
Paul Bakker1ef83d62012-04-11 12:09:53 +00002454 /*
2455 * TLSv1:
2456 * hash = PRF( master, finished_label,
2457 * MD5( handshake ) + SHA1( handshake ) )[0..11]
2458 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002459
Paul Bakker90995b52013-06-24 19:20:35 +02002460#if !defined(POLARSSL_MD5_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002461 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
2462 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002463#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002464
Paul Bakker90995b52013-06-24 19:20:35 +02002465#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002466 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
2467 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002468#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002469
2470 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002471 ? "client finished"
2472 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002473
2474 md5_finish( &md5, padbuf );
2475 sha1_finish( &sha1, padbuf + 16 );
2476
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002477 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002478 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002479
2480 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2481
2482 memset( &md5, 0, sizeof( md5_context ) );
2483 memset( &sha1, 0, sizeof( sha1_context ) );
2484
2485 memset( padbuf, 0, sizeof( padbuf ) );
2486
2487 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2488}
2489
Paul Bakkerca4ab492012-04-18 14:23:57 +00002490static void ssl_calc_finished_tls_sha256(
Paul Bakker1ef83d62012-04-11 12:09:53 +00002491 ssl_context *ssl, unsigned char *buf, int from )
2492{
2493 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002494 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002495 sha256_context sha256;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002496 unsigned char padbuf[32];
2497
Paul Bakker48916f92012-09-16 19:57:18 +00002498 ssl_session *session = ssl->session_negotiate;
2499 if( !session )
2500 session = ssl->session;
2501
Paul Bakker380da532012-04-18 16:10:25 +00002502 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002503
Paul Bakker9e36f042013-06-30 14:34:05 +02002504 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002505
2506 /*
2507 * TLSv1.2:
2508 * hash = PRF( master, finished_label,
2509 * Hash( handshake ) )[0.11]
2510 */
2511
Paul Bakker9e36f042013-06-30 14:34:05 +02002512#if !defined(POLARSSL_SHA256_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002513 SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
Paul Bakker9e36f042013-06-30 14:34:05 +02002514 sha256.state, sizeof( sha256.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002515#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002516
2517 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002518 ? "client finished"
2519 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002520
Paul Bakker9e36f042013-06-30 14:34:05 +02002521 sha256_finish( &sha256, padbuf );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002522
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002523 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002524 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002525
2526 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2527
Paul Bakker9e36f042013-06-30 14:34:05 +02002528 memset( &sha256, 0, sizeof( sha256_context ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002529
2530 memset( padbuf, 0, sizeof( padbuf ) );
2531
2532 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2533}
2534
Paul Bakker9e36f042013-06-30 14:34:05 +02002535#if defined(POLARSSL_SHA512_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002536static void ssl_calc_finished_tls_sha384(
2537 ssl_context *ssl, unsigned char *buf, int from )
2538{
2539 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002540 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002541 sha512_context sha512;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002542 unsigned char padbuf[48];
2543
Paul Bakker48916f92012-09-16 19:57:18 +00002544 ssl_session *session = ssl->session_negotiate;
2545 if( !session )
2546 session = ssl->session;
2547
Paul Bakker380da532012-04-18 16:10:25 +00002548 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002549
Paul Bakker9e36f042013-06-30 14:34:05 +02002550 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002551
2552 /*
2553 * TLSv1.2:
2554 * hash = PRF( master, finished_label,
2555 * Hash( handshake ) )[0.11]
2556 */
2557
Paul Bakker9e36f042013-06-30 14:34:05 +02002558#if !defined(POLARSSL_SHA512_ALT)
2559 SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
2560 sha512.state, sizeof( sha512.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002561#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002562
2563 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002564 ? "client finished"
2565 : "server finished";
Paul Bakkerca4ab492012-04-18 14:23:57 +00002566
Paul Bakker9e36f042013-06-30 14:34:05 +02002567 sha512_finish( &sha512, padbuf );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002568
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002569 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002570 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002571
2572 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2573
Paul Bakker9e36f042013-06-30 14:34:05 +02002574 memset( &sha512, 0, sizeof( sha512_context ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002575
2576 memset( padbuf, 0, sizeof( padbuf ) );
2577
2578 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2579}
Paul Bakker769075d2012-11-24 11:26:46 +01002580#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002581
Paul Bakker48916f92012-09-16 19:57:18 +00002582void ssl_handshake_wrapup( ssl_context *ssl )
2583{
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002584 int resume = ssl->handshake->resume;
2585
Paul Bakker48916f92012-09-16 19:57:18 +00002586 SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
2587
2588 /*
2589 * Free our handshake params
2590 */
2591 ssl_handshake_free( ssl->handshake );
Paul Bakker6e339b52013-07-03 13:37:05 +02002592 polarssl_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00002593 ssl->handshake = NULL;
2594
2595 /*
2596 * Switch in our now active transform context
2597 */
2598 if( ssl->transform )
2599 {
2600 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002601 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002602 }
2603 ssl->transform = ssl->transform_negotiate;
2604 ssl->transform_negotiate = NULL;
2605
Paul Bakker0a597072012-09-25 21:55:46 +00002606 if( ssl->session )
2607 {
2608 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002609 polarssl_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00002610 }
2611 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00002612 ssl->session_negotiate = NULL;
2613
Paul Bakker0a597072012-09-25 21:55:46 +00002614 /*
2615 * Add cache entry
2616 */
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002617 if( ssl->f_set_cache != NULL &&
2618 ssl->session->length != 0 &&
2619 resume == 0 )
2620 {
Paul Bakker0a597072012-09-25 21:55:46 +00002621 if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 )
2622 SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002623 }
Paul Bakker0a597072012-09-25 21:55:46 +00002624
Paul Bakker48916f92012-09-16 19:57:18 +00002625 ssl->state++;
2626
2627 SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
2628}
2629
Paul Bakker1ef83d62012-04-11 12:09:53 +00002630int ssl_write_finished( ssl_context *ssl )
2631{
2632 int ret, hash_len;
2633
2634 SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
2635
Paul Bakker92be97b2013-01-02 17:30:03 +01002636 /*
2637 * Set the out_msg pointer to the correct location based on IV length
2638 */
2639 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2640 {
2641 ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -
2642 ssl->transform_negotiate->fixed_ivlen;
2643 }
2644 else
2645 ssl->out_msg = ssl->out_iv;
2646
Paul Bakker48916f92012-09-16 19:57:18 +00002647 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002648
2649 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002650 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2651
Paul Bakker48916f92012-09-16 19:57:18 +00002652 ssl->verify_data_len = hash_len;
2653 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
2654
Paul Bakker5121ce52009-01-03 21:22:43 +00002655 ssl->out_msglen = 4 + hash_len;
2656 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2657 ssl->out_msg[0] = SSL_HS_FINISHED;
2658
2659 /*
2660 * In case of session resuming, invert the client and server
2661 * ChangeCipherSpec messages order.
2662 */
Paul Bakker0a597072012-09-25 21:55:46 +00002663 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002664 {
2665 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker48916f92012-09-16 19:57:18 +00002666 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002667 else
2668 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2669 }
2670 else
2671 ssl->state++;
2672
Paul Bakker48916f92012-09-16 19:57:18 +00002673 /*
2674 * Switch to our negotiated transform and session parameters for outbound data.
2675 */
2676 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
2677 ssl->transform_out = ssl->transform_negotiate;
2678 ssl->session_out = ssl->session_negotiate;
2679 memset( ssl->out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002680
Paul Bakker07eb38b2012-12-19 14:42:06 +01002681#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2682 if( ssl_hw_record_activate != NULL)
2683 {
2684 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
2685 {
2686 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2687 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2688 }
2689 }
2690#endif
2691
Paul Bakker5121ce52009-01-03 21:22:43 +00002692 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2693 {
2694 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2695 return( ret );
2696 }
2697
2698 SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
2699
2700 return( 0 );
2701}
2702
2703int ssl_parse_finished( ssl_context *ssl )
2704{
Paul Bakker23986e52011-04-24 08:57:21 +00002705 int ret;
2706 unsigned int hash_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002707 unsigned char buf[36];
2708
2709 SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
2710
Paul Bakker48916f92012-09-16 19:57:18 +00002711 ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002712
Paul Bakker48916f92012-09-16 19:57:18 +00002713 /*
2714 * Switch to our negotiated transform and session parameters for inbound data.
2715 */
2716 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
2717 ssl->transform_in = ssl->transform_negotiate;
2718 ssl->session_in = ssl->session_negotiate;
2719 memset( ssl->in_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002720
Paul Bakker92be97b2013-01-02 17:30:03 +01002721 /*
2722 * Set the in_msg pointer to the correct location based on IV length
2723 */
2724 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2725 {
2726 ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -
2727 ssl->transform_negotiate->fixed_ivlen;
2728 }
2729 else
2730 ssl->in_msg = ssl->in_iv;
2731
Paul Bakker07eb38b2012-12-19 14:42:06 +01002732#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2733 if( ssl_hw_record_activate != NULL)
2734 {
2735 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_INBOUND ) ) != 0 )
2736 {
2737 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2738 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2739 }
2740 }
2741#endif
2742
Paul Bakker5121ce52009-01-03 21:22:43 +00002743 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2744 {
2745 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2746 return( ret );
2747 }
2748
2749 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2750 {
2751 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002752 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002753 }
2754
Paul Bakker1ef83d62012-04-11 12:09:53 +00002755 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002756 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2757
2758 if( ssl->in_msg[0] != SSL_HS_FINISHED ||
2759 ssl->in_hslen != 4 + hash_len )
2760 {
2761 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002762 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002763 }
2764
Paul Bakker5121ce52009-01-03 21:22:43 +00002765 if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
2766 {
2767 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002768 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002769 }
2770
Paul Bakker48916f92012-09-16 19:57:18 +00002771 ssl->verify_data_len = hash_len;
2772 memcpy( ssl->peer_verify_data, buf, hash_len );
2773
Paul Bakker0a597072012-09-25 21:55:46 +00002774 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002775 {
2776 if( ssl->endpoint == SSL_IS_CLIENT )
2777 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2778
2779 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker48916f92012-09-16 19:57:18 +00002780 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002781 }
2782 else
2783 ssl->state++;
2784
2785 SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
2786
2787 return( 0 );
2788}
2789
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002790static int ssl_handshake_init( ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00002791{
2792 if( ssl->transform_negotiate )
2793 ssl_transform_free( ssl->transform_negotiate );
2794 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002795 ssl->transform_negotiate = polarssl_malloc( sizeof(ssl_transform) );
Paul Bakker48916f92012-09-16 19:57:18 +00002796
2797 if( ssl->session_negotiate )
2798 ssl_session_free( ssl->session_negotiate );
2799 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002800 ssl->session_negotiate = polarssl_malloc( sizeof(ssl_session) );
Paul Bakker48916f92012-09-16 19:57:18 +00002801
2802 if( ssl->handshake )
2803 ssl_handshake_free( ssl->handshake );
2804 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002805 ssl->handshake = polarssl_malloc( sizeof(ssl_handshake_params) );
Paul Bakker48916f92012-09-16 19:57:18 +00002806
2807 if( ssl->handshake == NULL ||
2808 ssl->transform_negotiate == NULL ||
2809 ssl->session_negotiate == NULL )
2810 {
2811 SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) );
2812 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2813 }
2814
2815 memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
2816 memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
2817 memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
2818
2819 md5_starts( &ssl->handshake->fin_md5 );
2820 sha1_starts( &ssl->handshake->fin_sha1 );
Paul Bakker9e36f042013-06-30 14:34:05 +02002821 sha256_starts( &ssl->handshake->fin_sha256, 0 );
2822#if defined(POLARSSL_SHA512_C)
2823 sha512_starts( &ssl->handshake->fin_sha512, 1 );
Paul Bakker769075d2012-11-24 11:26:46 +01002824#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002825
2826 ssl->handshake->update_checksum = ssl_update_checksum_start;
Paul Bakker23f36802012-09-28 14:15:14 +00002827 ssl->handshake->sig_alg = SSL_HASH_SHA1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002828
Paul Bakker61d113b2013-07-04 11:51:43 +02002829#if defined(POLARSSL_ECDH_C)
2830 ecdh_init( &ssl->handshake->ecdh_ctx );
2831#endif
2832
Paul Bakker48916f92012-09-16 19:57:18 +00002833 return( 0 );
2834}
2835
Paul Bakker5121ce52009-01-03 21:22:43 +00002836/*
2837 * Initialize an SSL context
2838 */
2839int ssl_init( ssl_context *ssl )
2840{
Paul Bakker48916f92012-09-16 19:57:18 +00002841 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002842 int len = SSL_BUFFER_LEN;
2843
2844 memset( ssl, 0, sizeof( ssl_context ) );
2845
Paul Bakker62f2dee2012-09-28 07:31:51 +00002846 /*
2847 * Sane defaults
2848 */
Paul Bakkered27a042013-04-18 22:46:23 +02002849#if defined(POLARSSL_RSA_C)
Paul Bakkereb2c6582012-09-27 19:15:01 +00002850 ssl->rsa_decrypt = ssl_rsa_decrypt;
2851 ssl->rsa_sign = ssl_rsa_sign;
2852 ssl->rsa_key_len = ssl_rsa_key_len;
Paul Bakkered27a042013-04-18 22:46:23 +02002853#endif
Paul Bakkereb2c6582012-09-27 19:15:01 +00002854
Paul Bakker1d29fb52012-09-28 13:28:45 +00002855 ssl->min_major_ver = SSL_MAJOR_VERSION_3;
2856 ssl->min_minor_ver = SSL_MINOR_VERSION_0;
Paul Bakker2fbefde2013-06-29 16:01:15 +02002857 ssl->max_major_ver = SSL_MAJOR_VERSION_3;
2858 ssl->max_minor_ver = SSL_MINOR_VERSION_3;
Paul Bakker1d29fb52012-09-28 13:28:45 +00002859
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002860 ssl_set_ciphersuites( ssl, ssl_list_ciphersuites() );
Paul Bakker645ce3a2012-10-31 12:32:41 +00002861
Paul Bakker62f2dee2012-09-28 07:31:51 +00002862#if defined(POLARSSL_DHM_C)
2863 if( ( ret = mpi_read_string( &ssl->dhm_P, 16,
2864 POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 ||
2865 ( ret = mpi_read_string( &ssl->dhm_G, 16,
2866 POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 )
2867 {
2868 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
2869 return( ret );
2870 }
2871#endif
2872
2873 /*
2874 * Prepare base structures
2875 */
Paul Bakker6e339b52013-07-03 13:37:05 +02002876 ssl->in_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00002877 ssl->in_hdr = ssl->in_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002878 ssl->in_iv = ssl->in_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002879 ssl->in_msg = ssl->in_ctr + 13;
2880
2881 if( ssl->in_ctr == NULL )
2882 {
2883 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002884 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002885 }
2886
Paul Bakker6e339b52013-07-03 13:37:05 +02002887 ssl->out_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00002888 ssl->out_hdr = ssl->out_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002889 ssl->out_iv = ssl->out_ctr + 13;
Paul Bakker5bd42292012-12-19 14:40:42 +01002890 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002891
2892 if( ssl->out_ctr == NULL )
2893 {
2894 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker6e339b52013-07-03 13:37:05 +02002895 polarssl_free( ssl-> in_ctr );
Paul Bakker69e095c2011-12-10 21:55:01 +00002896 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002897 }
2898
2899 memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
2900 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2901
2902 ssl->hostname = NULL;
2903 ssl->hostname_len = 0;
2904
Paul Bakker606b4ba2013-08-14 16:52:14 +02002905#if defined(POLARSSL_SSL_SESSION_TICKETS)
2906 ssl->ticket_lifetime = SSL_DEFAULT_TICKET_LIFETIME;
2907#endif
2908
Paul Bakker48916f92012-09-16 19:57:18 +00002909 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2910 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002911
2912 return( 0 );
2913}
2914
2915/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00002916 * Reset an initialized and used SSL context for re-use while retaining
2917 * all application-set variables, function pointers and data.
2918 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00002919int ssl_session_reset( ssl_context *ssl )
Paul Bakker7eb013f2011-10-06 12:37:39 +00002920{
Paul Bakker48916f92012-09-16 19:57:18 +00002921 int ret;
2922
Paul Bakker7eb013f2011-10-06 12:37:39 +00002923 ssl->state = SSL_HELLO_REQUEST;
Paul Bakker48916f92012-09-16 19:57:18 +00002924 ssl->renegotiation = SSL_INITIAL_HANDSHAKE;
2925 ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION;
2926
2927 ssl->verify_data_len = 0;
2928 memset( ssl->own_verify_data, 0, 36 );
2929 memset( ssl->peer_verify_data, 0, 36 );
2930
Paul Bakker7eb013f2011-10-06 12:37:39 +00002931 ssl->in_offt = NULL;
2932
Paul Bakker92be97b2013-01-02 17:30:03 +01002933 ssl->in_msg = ssl->in_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002934 ssl->in_msgtype = 0;
2935 ssl->in_msglen = 0;
2936 ssl->in_left = 0;
2937
2938 ssl->in_hslen = 0;
2939 ssl->nb_zero = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002940 ssl->record_read = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002941
Paul Bakker92be97b2013-01-02 17:30:03 +01002942 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002943 ssl->out_msgtype = 0;
2944 ssl->out_msglen = 0;
2945 ssl->out_left = 0;
2946
Paul Bakker48916f92012-09-16 19:57:18 +00002947 ssl->transform_in = NULL;
2948 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002949
2950 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2951 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker05ef8352012-05-08 09:17:57 +00002952
2953#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2954 if( ssl_hw_record_reset != NULL)
2955 {
2956 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) );
Paul Bakker07eb38b2012-12-19 14:42:06 +01002957 if( ( ret = ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002958 {
2959 SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret );
2960 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2961 }
Paul Bakker05ef8352012-05-08 09:17:57 +00002962 }
2963#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00002964
Paul Bakker48916f92012-09-16 19:57:18 +00002965 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002966 {
Paul Bakker48916f92012-09-16 19:57:18 +00002967 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002968 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002969 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002970 }
Paul Bakker48916f92012-09-16 19:57:18 +00002971
Paul Bakkerc0463502013-02-14 11:19:38 +01002972 if( ssl->session )
2973 {
2974 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002975 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01002976 ssl->session = NULL;
2977 }
2978
Paul Bakker48916f92012-09-16 19:57:18 +00002979 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2980 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002981
2982 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00002983}
2984
Paul Bakkera503a632013-08-14 13:48:06 +02002985#if defined(POLARSSL_SSL_SESSION_TICKETS)
Paul Bakker7eb013f2011-10-06 12:37:39 +00002986/*
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02002987 * Allocate and initialize ticket keys
2988 */
2989static int ssl_ticket_keys_init( ssl_context *ssl )
2990{
2991 int ret;
2992 ssl_ticket_keys *tkeys;
Manuel Pégourié-Gonnard56dc9e82013-08-03 17:16:31 +02002993 unsigned char buf[16];
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02002994
2995 if( ssl->ticket_keys != NULL )
2996 return( 0 );
2997
2998 if( ( tkeys = polarssl_malloc( sizeof( ssl_ticket_keys ) ) ) == NULL )
2999 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3000
3001 if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->key_name, 16 ) ) != 0 )
3002 return( ret );
3003
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003004 if( ( ret = ssl->f_rng( ssl->p_rng, buf, 16 ) ) != 0 ||
3005 ( ret = aes_setkey_enc( &tkeys->enc, buf, 128 ) ) != 0 ||
3006 ( ret = aes_setkey_dec( &tkeys->dec, buf, 128 ) ) != 0 )
3007 {
3008 return( ret );
3009 }
3010
Manuel Pégourié-Gonnard56dc9e82013-08-03 17:16:31 +02003011 if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->mac_key, 16 ) ) != 0 )
3012 return( ret );
3013
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003014 ssl->ticket_keys = tkeys;
3015
3016 return( 0 );
3017}
Paul Bakkera503a632013-08-14 13:48:06 +02003018#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003019
3020/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003021 * SSL set accessors
3022 */
3023void ssl_set_endpoint( ssl_context *ssl, int endpoint )
3024{
3025 ssl->endpoint = endpoint;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003026
Paul Bakker606b4ba2013-08-14 16:52:14 +02003027#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003028 if( endpoint == SSL_IS_CLIENT )
3029 ssl->session_tickets = SSL_SESSION_TICKETS_ENABLED;
Paul Bakker606b4ba2013-08-14 16:52:14 +02003030#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003031}
3032
3033void ssl_set_authmode( ssl_context *ssl, int authmode )
3034{
3035 ssl->authmode = authmode;
3036}
3037
Paul Bakkered27a042013-04-18 22:46:23 +02003038#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003039void ssl_set_verify( ssl_context *ssl,
Paul Bakker915275b2012-09-28 07:10:55 +00003040 int (*f_vrfy)(void *, x509_cert *, int, int *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003041 void *p_vrfy )
3042{
3043 ssl->f_vrfy = f_vrfy;
3044 ssl->p_vrfy = p_vrfy;
3045}
Paul Bakkered27a042013-04-18 22:46:23 +02003046#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003047
Paul Bakker5121ce52009-01-03 21:22:43 +00003048void ssl_set_rng( ssl_context *ssl,
Paul Bakkera3d195c2011-11-27 21:07:34 +00003049 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00003050 void *p_rng )
3051{
3052 ssl->f_rng = f_rng;
3053 ssl->p_rng = p_rng;
3054}
3055
3056void ssl_set_dbg( ssl_context *ssl,
Paul Bakkerff60ee62010-03-16 21:09:09 +00003057 void (*f_dbg)(void *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00003058 void *p_dbg )
3059{
3060 ssl->f_dbg = f_dbg;
3061 ssl->p_dbg = p_dbg;
3062}
3063
3064void ssl_set_bio( ssl_context *ssl,
Paul Bakker23986e52011-04-24 08:57:21 +00003065 int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
Paul Bakker39bb4182011-06-21 07:36:43 +00003066 int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
Paul Bakker5121ce52009-01-03 21:22:43 +00003067{
3068 ssl->f_recv = f_recv;
3069 ssl->f_send = f_send;
3070 ssl->p_recv = p_recv;
3071 ssl->p_send = p_send;
3072}
3073
Paul Bakker0a597072012-09-25 21:55:46 +00003074void ssl_set_session_cache( ssl_context *ssl,
3075 int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
3076 int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00003077{
Paul Bakker0a597072012-09-25 21:55:46 +00003078 ssl->f_get_cache = f_get_cache;
3079 ssl->p_get_cache = p_get_cache;
3080 ssl->f_set_cache = f_set_cache;
3081 ssl->p_set_cache = p_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00003082}
3083
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003084int ssl_set_session( ssl_context *ssl, const ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00003085{
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003086 int ret;
3087
3088 if( ssl == NULL ||
3089 session == NULL ||
3090 ssl->session_negotiate == NULL ||
3091 ssl->endpoint != SSL_IS_CLIENT )
3092 {
3093 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3094 }
3095
3096 if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 )
3097 return( ret );
3098
Paul Bakker0a597072012-09-25 21:55:46 +00003099 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003100
3101 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003102}
3103
Paul Bakkerb68cad62012-08-23 08:34:18 +00003104void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00003105{
Paul Bakker8f4ddae2013-04-15 15:09:54 +02003106 ssl->ciphersuite_list[SSL_MINOR_VERSION_0] = ciphersuites;
3107 ssl->ciphersuite_list[SSL_MINOR_VERSION_1] = ciphersuites;
3108 ssl->ciphersuite_list[SSL_MINOR_VERSION_2] = ciphersuites;
3109 ssl->ciphersuite_list[SSL_MINOR_VERSION_3] = ciphersuites;
3110}
3111
3112void ssl_set_ciphersuites_for_version( ssl_context *ssl, const int *ciphersuites,
3113 int major, int minor )
3114{
3115 if( major != SSL_MAJOR_VERSION_3 )
3116 return;
3117
3118 if( minor < SSL_MINOR_VERSION_0 || minor > SSL_MINOR_VERSION_3 )
3119 return;
3120
3121 ssl->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00003122}
3123
Paul Bakkered27a042013-04-18 22:46:23 +02003124#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003125void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain,
Paul Bakker57b79142010-03-24 06:51:15 +00003126 x509_crl *ca_crl, const char *peer_cn )
Paul Bakker5121ce52009-01-03 21:22:43 +00003127{
3128 ssl->ca_chain = ca_chain;
Paul Bakker40ea7de2009-05-03 10:18:48 +00003129 ssl->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00003130 ssl->peer_cn = peer_cn;
3131}
3132
3133void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert,
3134 rsa_context *rsa_key )
3135{
3136 ssl->own_cert = own_cert;
3137 ssl->rsa_key = rsa_key;
3138}
3139
Paul Bakkereb2c6582012-09-27 19:15:01 +00003140void ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert,
3141 void *rsa_key,
3142 rsa_decrypt_func rsa_decrypt,
3143 rsa_sign_func rsa_sign,
3144 rsa_key_len_func rsa_key_len )
Paul Bakker43b7e352011-01-18 15:27:19 +00003145{
3146 ssl->own_cert = own_cert;
Paul Bakkereb2c6582012-09-27 19:15:01 +00003147 ssl->rsa_key = rsa_key;
3148 ssl->rsa_decrypt = rsa_decrypt;
3149 ssl->rsa_sign = rsa_sign;
3150 ssl->rsa_key_len = rsa_key_len;
Paul Bakker43b7e352011-01-18 15:27:19 +00003151}
Paul Bakkered27a042013-04-18 22:46:23 +02003152#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00003153
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003154#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
3155void ssl_set_psk( ssl_context *ssl, const unsigned char *psk, size_t psk_len,
3156 const unsigned char *psk_identity, size_t psk_identity_len )
3157{
3158 ssl->psk = psk;
3159 ssl->psk_len = psk_len;
3160 ssl->psk_identity = psk_identity;
3161 ssl->psk_identity_len = psk_identity_len;
3162}
3163#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00003164
Paul Bakker48916f92012-09-16 19:57:18 +00003165#if defined(POLARSSL_DHM_C)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003166int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00003167{
3168 int ret;
3169
Paul Bakker48916f92012-09-16 19:57:18 +00003170 if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003171 {
3172 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3173 return( ret );
3174 }
3175
Paul Bakker48916f92012-09-16 19:57:18 +00003176 if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003177 {
3178 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3179 return( ret );
3180 }
3181
3182 return( 0 );
3183}
3184
Paul Bakker1b57b062011-01-06 15:48:19 +00003185int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx )
3186{
3187 int ret;
3188
Paul Bakker48916f92012-09-16 19:57:18 +00003189 if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003190 {
3191 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3192 return( ret );
3193 }
3194
Paul Bakker48916f92012-09-16 19:57:18 +00003195 if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003196 {
3197 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3198 return( ret );
3199 }
3200
3201 return( 0 );
3202}
Paul Bakker48916f92012-09-16 19:57:18 +00003203#endif /* POLARSSL_DHM_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00003204
Paul Bakkerff60ee62010-03-16 21:09:09 +00003205int ssl_set_hostname( ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00003206{
3207 if( hostname == NULL )
Paul Bakker40e46942009-01-03 21:51:57 +00003208 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003209
3210 ssl->hostname_len = strlen( hostname );
Paul Bakker6e339b52013-07-03 13:37:05 +02003211 ssl->hostname = (unsigned char *) polarssl_malloc( ssl->hostname_len + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003212
Paul Bakkerb15b8512012-01-13 13:44:06 +00003213 if( ssl->hostname == NULL )
3214 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3215
Paul Bakker3c2122f2013-06-24 19:03:14 +02003216 memcpy( ssl->hostname, (const unsigned char *) hostname,
Paul Bakker5121ce52009-01-03 21:22:43 +00003217 ssl->hostname_len );
Paul Bakkerf7abd422013-04-16 13:15:56 +02003218
Paul Bakker40ea7de2009-05-03 10:18:48 +00003219 ssl->hostname[ssl->hostname_len] = '\0';
Paul Bakker5121ce52009-01-03 21:22:43 +00003220
3221 return( 0 );
3222}
3223
Paul Bakker5701cdc2012-09-27 21:49:42 +00003224void ssl_set_sni( ssl_context *ssl,
3225 int (*f_sni)(void *, ssl_context *,
3226 const unsigned char *, size_t),
3227 void *p_sni )
3228{
3229 ssl->f_sni = f_sni;
3230 ssl->p_sni = p_sni;
3231}
3232
Paul Bakker490ecc82011-10-06 13:04:09 +00003233void ssl_set_max_version( ssl_context *ssl, int major, int minor )
3234{
3235 ssl->max_major_ver = major;
3236 ssl->max_minor_ver = minor;
3237}
3238
Paul Bakker1d29fb52012-09-28 13:28:45 +00003239void ssl_set_min_version( ssl_context *ssl, int major, int minor )
3240{
3241 ssl->min_major_ver = major;
3242 ssl->min_minor_ver = minor;
3243}
3244
Paul Bakker05decb22013-08-15 13:33:48 +02003245#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003246int ssl_set_max_frag_len( ssl_context *ssl, unsigned char mfl_code )
3247{
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003248 if( mfl_code >= sizeof( mfl_code_to_length ) ||
3249 mfl_code_to_length[mfl_code] > SSL_MAX_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003250 {
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003251 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003252 }
3253
3254 ssl->mfl_code = mfl_code;
3255
3256 return( 0 );
3257}
Paul Bakker05decb22013-08-15 13:33:48 +02003258#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003259
Paul Bakker1f2bc622013-08-15 13:45:55 +02003260#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Paul Bakker8c1ede62013-07-19 14:14:37 +02003261int ssl_set_truncated_hmac( ssl_context *ssl, int truncate )
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003262{
3263 if( ssl->endpoint != SSL_IS_CLIENT )
3264 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3265
Paul Bakker8c1ede62013-07-19 14:14:37 +02003266 ssl->trunc_hmac = truncate;
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003267
3268 return( 0 );
3269}
Paul Bakker1f2bc622013-08-15 13:45:55 +02003270#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003271
Paul Bakker48916f92012-09-16 19:57:18 +00003272void ssl_set_renegotiation( ssl_context *ssl, int renegotiation )
3273{
3274 ssl->disable_renegotiation = renegotiation;
3275}
3276
3277void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy )
3278{
3279 ssl->allow_legacy_renegotiation = allow_legacy;
3280}
3281
Paul Bakkera503a632013-08-14 13:48:06 +02003282#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003283int ssl_set_session_tickets( ssl_context *ssl, int use_tickets )
3284{
3285 ssl->session_tickets = use_tickets;
3286
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003287 if( ssl->endpoint == SSL_IS_CLIENT )
3288 return( 0 );
3289
3290 if( ssl->f_rng == NULL )
3291 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3292
3293 return( ssl_ticket_keys_init( ssl ) );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003294}
Paul Bakker606b4ba2013-08-14 16:52:14 +02003295
3296void ssl_set_session_ticket_lifetime( ssl_context *ssl, int lifetime )
3297{
3298 ssl->ticket_lifetime = lifetime;
3299}
Paul Bakkera503a632013-08-14 13:48:06 +02003300#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003301
Paul Bakker5121ce52009-01-03 21:22:43 +00003302/*
3303 * SSL get accessors
3304 */
Paul Bakker23986e52011-04-24 08:57:21 +00003305size_t ssl_get_bytes_avail( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003306{
3307 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
3308}
3309
Paul Bakkerff60ee62010-03-16 21:09:09 +00003310int ssl_get_verify_result( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003311{
3312 return( ssl->verify_result );
3313}
3314
Paul Bakkere3166ce2011-01-27 17:40:50 +00003315const char *ssl_get_ciphersuite( const ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00003316{
Paul Bakker926c8e42013-03-06 10:23:34 +01003317 if( ssl == NULL || ssl->session == NULL )
3318 return NULL;
3319
Paul Bakkere3166ce2011-01-27 17:40:50 +00003320 return ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00003321}
3322
Paul Bakker43ca69c2011-01-15 17:35:19 +00003323const char *ssl_get_version( const ssl_context *ssl )
3324{
3325 switch( ssl->minor_ver )
3326 {
3327 case SSL_MINOR_VERSION_0:
3328 return( "SSLv3.0" );
3329
3330 case SSL_MINOR_VERSION_1:
3331 return( "TLSv1.0" );
3332
3333 case SSL_MINOR_VERSION_2:
3334 return( "TLSv1.1" );
3335
Paul Bakker1ef83d62012-04-11 12:09:53 +00003336 case SSL_MINOR_VERSION_3:
3337 return( "TLSv1.2" );
3338
Paul Bakker43ca69c2011-01-15 17:35:19 +00003339 default:
3340 break;
3341 }
3342 return( "unknown" );
3343}
3344
Paul Bakkered27a042013-04-18 22:46:23 +02003345#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb0550d92012-10-30 07:51:03 +00003346const x509_cert *ssl_get_peer_cert( const ssl_context *ssl )
3347{
3348 if( ssl == NULL || ssl->session == NULL )
3349 return NULL;
3350
3351 return ssl->session->peer_cert;
3352}
Paul Bakkered27a042013-04-18 22:46:23 +02003353#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00003354
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003355int ssl_get_session( const ssl_context *ssl, ssl_session *dst )
3356{
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003357 if( ssl == NULL ||
3358 dst == NULL ||
3359 ssl->session == NULL ||
3360 ssl->endpoint != SSL_IS_CLIENT )
3361 {
3362 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3363 }
3364
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003365 return( ssl_session_copy( dst, ssl->session ) );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003366}
3367
Paul Bakker5121ce52009-01-03 21:22:43 +00003368/*
Paul Bakker1961b702013-01-25 14:49:24 +01003369 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003370 */
Paul Bakker1961b702013-01-25 14:49:24 +01003371int ssl_handshake_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003372{
Paul Bakker40e46942009-01-03 21:51:57 +00003373 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003374
Paul Bakker40e46942009-01-03 21:51:57 +00003375#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003376 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker1961b702013-01-25 14:49:24 +01003377 ret = ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003378#endif
3379
Paul Bakker40e46942009-01-03 21:51:57 +00003380#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003381 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker1961b702013-01-25 14:49:24 +01003382 ret = ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003383#endif
3384
Paul Bakker1961b702013-01-25 14:49:24 +01003385 return( ret );
3386}
3387
3388/*
3389 * Perform the SSL handshake
3390 */
3391int ssl_handshake( ssl_context *ssl )
3392{
3393 int ret = 0;
3394
3395 SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
3396
3397 while( ssl->state != SSL_HANDSHAKE_OVER )
3398 {
3399 ret = ssl_handshake_step( ssl );
3400
3401 if( ret != 0 )
3402 break;
3403 }
3404
Paul Bakker5121ce52009-01-03 21:22:43 +00003405 SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
3406
3407 return( ret );
3408}
3409
3410/*
Paul Bakker48916f92012-09-16 19:57:18 +00003411 * Renegotiate current connection
3412 */
3413int ssl_renegotiate( ssl_context *ssl )
3414{
3415 int ret;
3416
3417 SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
3418
3419 if( ssl->state != SSL_HANDSHAKE_OVER )
3420 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3421
3422 ssl->state = SSL_HELLO_REQUEST;
3423 ssl->renegotiation = SSL_RENEGOTIATION;
3424
3425 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3426 return( ret );
3427
3428 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3429 {
3430 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3431 return( ret );
3432 }
3433
3434 SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
3435
3436 return( 0 );
3437}
3438
3439/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003440 * Receive application data decrypted from the SSL layer
3441 */
Paul Bakker23986e52011-04-24 08:57:21 +00003442int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003443{
Paul Bakker23986e52011-04-24 08:57:21 +00003444 int ret;
3445 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003446
3447 SSL_DEBUG_MSG( 2, ( "=> read" ) );
3448
3449 if( ssl->state != SSL_HANDSHAKE_OVER )
3450 {
3451 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3452 {
3453 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3454 return( ret );
3455 }
3456 }
3457
3458 if( ssl->in_offt == NULL )
3459 {
3460 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3461 {
Paul Bakker831a7552011-05-18 13:32:51 +00003462 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3463 return( 0 );
3464
Paul Bakker5121ce52009-01-03 21:22:43 +00003465 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3466 return( ret );
3467 }
3468
3469 if( ssl->in_msglen == 0 &&
3470 ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
3471 {
3472 /*
3473 * OpenSSL sends empty messages to randomize the IV
3474 */
3475 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3476 {
Paul Bakker831a7552011-05-18 13:32:51 +00003477 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3478 return( 0 );
3479
Paul Bakker5121ce52009-01-03 21:22:43 +00003480 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3481 return( ret );
3482 }
3483 }
3484
Paul Bakker48916f92012-09-16 19:57:18 +00003485 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
3486 {
3487 SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
3488
3489 if( ssl->endpoint == SSL_IS_CLIENT &&
3490 ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST ||
3491 ssl->in_hslen != 4 ) )
3492 {
3493 SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
3494 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
3495 }
3496
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003497 if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
3498 ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
3499 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) )
Paul Bakker48916f92012-09-16 19:57:18 +00003500 {
3501 SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
3502
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003503 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakker48916f92012-09-16 19:57:18 +00003504 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003505 /*
3506 * SSLv3 does not have a "no_renegotiation" alert
3507 */
3508 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
3509 return( ret );
3510 }
3511 else
3512 {
3513 if( ( ret = ssl_send_alert_message( ssl,
3514 SSL_ALERT_LEVEL_WARNING,
3515 SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
3516 {
3517 return( ret );
3518 }
Paul Bakker48916f92012-09-16 19:57:18 +00003519 }
3520 }
3521 else
3522 {
3523 if( ( ret = ssl_renegotiate( ssl ) ) != 0 )
3524 {
3525 SSL_DEBUG_RET( 1, "ssl_renegotiate", ret );
3526 return( ret );
3527 }
3528
3529 return( POLARSSL_ERR_NET_WANT_READ );
3530 }
3531 }
3532 else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003533 {
3534 SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003535 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003536 }
3537
3538 ssl->in_offt = ssl->in_msg;
3539 }
3540
3541 n = ( len < ssl->in_msglen )
3542 ? len : ssl->in_msglen;
3543
3544 memcpy( buf, ssl->in_offt, n );
3545 ssl->in_msglen -= n;
3546
3547 if( ssl->in_msglen == 0 )
3548 /* all bytes consumed */
3549 ssl->in_offt = NULL;
3550 else
3551 /* more data available */
3552 ssl->in_offt += n;
3553
3554 SSL_DEBUG_MSG( 2, ( "<= read" ) );
3555
Paul Bakker23986e52011-04-24 08:57:21 +00003556 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003557}
3558
3559/*
3560 * Send application data to be encrypted by the SSL layer
3561 */
Paul Bakker23986e52011-04-24 08:57:21 +00003562int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003563{
Paul Bakker23986e52011-04-24 08:57:21 +00003564 int ret;
3565 size_t n;
Paul Bakker05decb22013-08-15 13:33:48 +02003566 unsigned int max_len = SSL_MAX_CONTENT_LEN;
Paul Bakker5121ce52009-01-03 21:22:43 +00003567
3568 SSL_DEBUG_MSG( 2, ( "=> write" ) );
3569
3570 if( ssl->state != SSL_HANDSHAKE_OVER )
3571 {
3572 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3573 {
3574 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3575 return( ret );
3576 }
3577 }
3578
Paul Bakker05decb22013-08-15 13:33:48 +02003579#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003580 /*
3581 * Assume mfl_code is correct since it was checked when set
3582 */
3583 max_len = mfl_code_to_length[ssl->mfl_code];
3584
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003585 /*
Paul Bakker05decb22013-08-15 13:33:48 +02003586 * Check if a smaller max length was negotiated
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003587 */
3588 if( ssl->session_out != NULL &&
3589 mfl_code_to_length[ssl->session_out->mfl_code] < max_len )
3590 {
3591 max_len = mfl_code_to_length[ssl->session_out->mfl_code];
3592 }
Paul Bakker05decb22013-08-15 13:33:48 +02003593#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003594
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003595 n = ( len < max_len) ? len : max_len;
Paul Bakker887bd502011-06-08 13:10:54 +00003596
Paul Bakker5121ce52009-01-03 21:22:43 +00003597 if( ssl->out_left != 0 )
3598 {
3599 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3600 {
3601 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3602 return( ret );
3603 }
3604 }
Paul Bakker887bd502011-06-08 13:10:54 +00003605 else
Paul Bakker1fd00bf2011-03-14 20:50:15 +00003606 {
Paul Bakker887bd502011-06-08 13:10:54 +00003607 ssl->out_msglen = n;
3608 ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
3609 memcpy( ssl->out_msg, buf, n );
3610
3611 if( ( ret = ssl_write_record( ssl ) ) != 0 )
3612 {
3613 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
3614 return( ret );
3615 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003616 }
3617
3618 SSL_DEBUG_MSG( 2, ( "<= write" ) );
3619
Paul Bakker23986e52011-04-24 08:57:21 +00003620 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003621}
3622
3623/*
3624 * Notify the peer that the connection is being closed
3625 */
3626int ssl_close_notify( ssl_context *ssl )
3627{
3628 int ret;
3629
3630 SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
3631
3632 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3633 {
3634 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3635 return( ret );
3636 }
3637
3638 if( ssl->state == SSL_HANDSHAKE_OVER )
3639 {
Paul Bakker48916f92012-09-16 19:57:18 +00003640 if( ( ret = ssl_send_alert_message( ssl,
3641 SSL_ALERT_LEVEL_WARNING,
3642 SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003643 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003644 return( ret );
3645 }
3646 }
3647
3648 SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
3649
3650 return( ret );
3651}
3652
Paul Bakker48916f92012-09-16 19:57:18 +00003653void ssl_transform_free( ssl_transform *transform )
3654{
3655#if defined(POLARSSL_ZLIB_SUPPORT)
3656 deflateEnd( &transform->ctx_deflate );
3657 inflateEnd( &transform->ctx_inflate );
3658#endif
3659
Paul Bakker61d113b2013-07-04 11:51:43 +02003660 md_free_ctx( &transform->md_ctx_enc );
3661 md_free_ctx( &transform->md_ctx_dec );
3662
Paul Bakker48916f92012-09-16 19:57:18 +00003663 memset( transform, 0, sizeof( ssl_transform ) );
3664}
3665
3666void ssl_handshake_free( ssl_handshake_params *handshake )
3667{
3668#if defined(POLARSSL_DHM_C)
3669 dhm_free( &handshake->dhm_ctx );
3670#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02003671#if defined(POLARSSL_ECDH_C)
3672 ecdh_free( &handshake->ecdh_ctx );
3673#endif
3674
Paul Bakker48916f92012-09-16 19:57:18 +00003675 memset( handshake, 0, sizeof( ssl_handshake_params ) );
3676}
3677
3678void ssl_session_free( ssl_session *session )
3679{
Paul Bakkered27a042013-04-18 22:46:23 +02003680#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker0a597072012-09-25 21:55:46 +00003681 if( session->peer_cert != NULL )
Paul Bakker48916f92012-09-16 19:57:18 +00003682 {
Paul Bakker0a597072012-09-25 21:55:46 +00003683 x509_free( session->peer_cert );
Paul Bakker6e339b52013-07-03 13:37:05 +02003684 polarssl_free( session->peer_cert );
Paul Bakker48916f92012-09-16 19:57:18 +00003685 }
Paul Bakkered27a042013-04-18 22:46:23 +02003686#endif
Paul Bakker0a597072012-09-25 21:55:46 +00003687
Paul Bakkera503a632013-08-14 13:48:06 +02003688#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02003689 polarssl_free( session->ticket );
Paul Bakkera503a632013-08-14 13:48:06 +02003690#endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02003691
Paul Bakker0a597072012-09-25 21:55:46 +00003692 memset( session, 0, sizeof( ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003693}
3694
Paul Bakker5121ce52009-01-03 21:22:43 +00003695/*
3696 * Free an SSL context
3697 */
3698void ssl_free( ssl_context *ssl )
3699{
3700 SSL_DEBUG_MSG( 2, ( "=> free" ) );
3701
Paul Bakker5121ce52009-01-03 21:22:43 +00003702 if( ssl->out_ctr != NULL )
3703 {
3704 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02003705 polarssl_free( ssl->out_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00003706 }
3707
3708 if( ssl->in_ctr != NULL )
3709 {
3710 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02003711 polarssl_free( ssl->in_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00003712 }
3713
Paul Bakker40e46942009-01-03 21:51:57 +00003714#if defined(POLARSSL_DHM_C)
Paul Bakker48916f92012-09-16 19:57:18 +00003715 mpi_free( &ssl->dhm_P );
3716 mpi_free( &ssl->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00003717#endif
3718
Paul Bakker48916f92012-09-16 19:57:18 +00003719 if( ssl->transform )
3720 {
3721 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02003722 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003723 }
3724
3725 if( ssl->handshake )
3726 {
3727 ssl_handshake_free( ssl->handshake );
3728 ssl_transform_free( ssl->transform_negotiate );
3729 ssl_session_free( ssl->session_negotiate );
3730
Paul Bakker6e339b52013-07-03 13:37:05 +02003731 polarssl_free( ssl->handshake );
3732 polarssl_free( ssl->transform_negotiate );
3733 polarssl_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00003734 }
3735
Paul Bakkerc0463502013-02-14 11:19:38 +01003736 if( ssl->session )
3737 {
3738 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02003739 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01003740 }
3741
Paul Bakkera503a632013-08-14 13:48:06 +02003742#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003743 polarssl_free( ssl->ticket_keys );
Paul Bakkera503a632013-08-14 13:48:06 +02003744#endif
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003745
Paul Bakker5121ce52009-01-03 21:22:43 +00003746 if ( ssl->hostname != NULL)
3747 {
3748 memset( ssl->hostname, 0, ssl->hostname_len );
Paul Bakker6e339b52013-07-03 13:37:05 +02003749 polarssl_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00003750 ssl->hostname_len = 0;
3751 }
3752
Paul Bakker05ef8352012-05-08 09:17:57 +00003753#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3754 if( ssl_hw_record_finish != NULL )
3755 {
3756 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) );
3757 ssl_hw_record_finish( ssl );
3758 }
3759#endif
3760
Paul Bakker5121ce52009-01-03 21:22:43 +00003761 SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00003762
Paul Bakker86f04f42013-02-14 11:20:09 +01003763 /* Actually clear after last debug message */
Paul Bakker2da561c2009-02-05 18:00:28 +00003764 memset( ssl, 0, sizeof( ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003765}
3766
3767#endif