blob: 033c9faf6a62457b2cbebba06aa46eb2438d1c6f [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 Bakker5fd49172013-08-19 13:29:26 +02001014#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001015 case POLARSSL_CIPHER_DES_CBC:
1016 des_crypt_cbc( (des_context *) ssl->transform_out->ctx_enc,
1017 DES_ENCRYPT, enc_msglen,
1018 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1019 break;
1020
1021 case POLARSSL_CIPHER_DES_EDE3_CBC:
1022 des3_crypt_cbc( (des3_context *) ssl->transform_out->ctx_enc,
1023 DES_ENCRYPT, enc_msglen,
1024 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1025 break;
Paul Bakker5fd49172013-08-19 13:29:26 +02001026#endif
Paul Bakker68884e32013-01-07 18:20:04 +01001027
Paul Bakker5fd49172013-08-19 13:29:26 +02001028#if defined(POLARSSL_AES_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001029 case POLARSSL_CIPHER_AES_128_CBC:
1030 case POLARSSL_CIPHER_AES_256_CBC:
1031 aes_crypt_cbc( (aes_context *) ssl->transform_out->ctx_enc,
1032 AES_ENCRYPT, enc_msglen,
1033 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1034 break;
Paul Bakker5fd49172013-08-19 13:29:26 +02001035#endif
Paul Bakker68884e32013-01-07 18:20:04 +01001036
Paul Bakker5fd49172013-08-19 13:29:26 +02001037#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001038 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
1039 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
1040 camellia_crypt_cbc( (camellia_context *) ssl->transform_out->ctx_enc,
1041 CAMELLIA_ENCRYPT, enc_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001042 ssl->transform_out->iv_enc, enc_msg, enc_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001043 break;
Paul Bakker5fd49172013-08-19 13:29:26 +02001044#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001045
1046 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001047 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001048 }
1049 }
1050
Paul Bakkerca4ab492012-04-18 14:23:57 +00001051 for( i = 8; i > 0; i-- )
1052 if( ++ssl->out_ctr[i - 1] != 0 )
1053 break;
1054
Paul Bakker5121ce52009-01-03 21:22:43 +00001055 SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
1056
1057 return( 0 );
1058}
1059
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001060#define POLARSSL_SSL_MAX_MAC_SIZE 48
Paul Bakkerfab5c822012-02-06 16:45:10 +00001061
Paul Bakker5121ce52009-01-03 21:22:43 +00001062static int ssl_decrypt_buf( ssl_context *ssl )
1063{
Paul Bakker45829992013-01-03 14:52:21 +01001064 size_t i, padlen = 0, correct = 1;
Paul Bakkerfab5c822012-02-06 16:45:10 +00001065 unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
Paul Bakker5121ce52009-01-03 21:22:43 +00001066
1067 SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
1068
Paul Bakker48916f92012-09-16 19:57:18 +00001069 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001070 {
1071 SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
Paul Bakker48916f92012-09-16 19:57:18 +00001072 ssl->in_msglen, ssl->transform_in->minlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001073 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001074 }
1075
Paul Bakker68884e32013-01-07 18:20:04 +01001076#if defined(POLARSSL_CIPHER_NULL_CIPHER)
1077 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001078 {
Paul Bakker68884e32013-01-07 18:20:04 +01001079 padlen = 0;
1080 }
1081 else
1082#endif /* POLARSSL_CIPHER_NULL_CIPHER */
Paul Bakker40e46942009-01-03 21:51:57 +00001083#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001084 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
1085 {
1086 padlen = 0;
1087
1088 arc4_crypt( (arc4_context *) ssl->transform_in->ctx_dec,
Paul Bakkerbaad6502010-03-21 15:42:15 +00001089 ssl->in_msglen, ssl->in_msg,
1090 ssl->in_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001091 }
Paul Bakker68884e32013-01-07 18:20:04 +01001092 else
1093#endif /* POLARSSL_ARC4_C */
1094#if defined(POLARSSL_GCM_C)
1095 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
1096 ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001097 {
1098 unsigned char *dec_msg;
1099 unsigned char *dec_msg_result;
1100 size_t dec_msglen;
1101 unsigned char add_data[13];
1102 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1103
Paul Bakker68884e32013-01-07 18:20:04 +01001104 padlen = 0;
1105
1106 dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
1107 ssl->transform_in->fixed_ivlen );
1108 dec_msglen -= 16;
1109 dec_msg = ssl->in_msg;
1110 dec_msg_result = ssl->in_msg;
1111 ssl->in_msglen = dec_msglen;
1112
1113 memcpy( add_data, ssl->in_ctr, 8 );
1114 add_data[8] = ssl->in_msgtype;
1115 add_data[9] = ssl->major_ver;
1116 add_data[10] = ssl->minor_ver;
1117 add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
1118 add_data[12] = ssl->in_msglen & 0xFF;
1119
1120 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1121 add_data, 13 );
1122
1123 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
1124 ssl->in_iv,
1125 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
1126
1127 SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
1128 ssl->transform_in->ivlen );
1129 SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
1130
1131 ret = gcm_auth_decrypt( (gcm_context *) ssl->transform_in->ctx_dec,
1132 dec_msglen,
1133 ssl->transform_in->iv_dec,
1134 ssl->transform_in->ivlen,
1135 add_data, 13,
1136 dec_msg + dec_msglen, 16,
1137 dec_msg, dec_msg_result );
1138
1139 if( ret != 0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001140 {
Paul Bakker68884e32013-01-07 18:20:04 +01001141 SSL_DEBUG_MSG( 1, ( "AEAD decrypt failed on validation (ret = -0x%02x)",
1142 -ret ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001143
Paul Bakker68884e32013-01-07 18:20:04 +01001144 return( POLARSSL_ERR_SSL_INVALID_MAC );
1145 }
Paul Bakkerca4ab492012-04-18 14:23:57 +00001146 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001147 else
Paul Bakker68884e32013-01-07 18:20:04 +01001148#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001149 {
Paul Bakker45829992013-01-03 14:52:21 +01001150 /*
1151 * Decrypt and check the padding
1152 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001153 unsigned char *dec_msg;
1154 unsigned char *dec_msg_result;
Paul Bakker23986e52011-04-24 08:57:21 +00001155 size_t dec_msglen;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001156 size_t minlen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001157
Paul Bakker5121ce52009-01-03 21:22:43 +00001158 /*
Paul Bakker45829992013-01-03 14:52:21 +01001159 * Check immediate ciphertext sanity
Paul Bakker5121ce52009-01-03 21:22:43 +00001160 */
Paul Bakker48916f92012-09-16 19:57:18 +00001161 if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001162 {
1163 SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
Paul Bakker48916f92012-09-16 19:57:18 +00001164 ssl->in_msglen, ssl->transform_in->ivlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001165 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001166 }
1167
Paul Bakker45829992013-01-03 14:52:21 +01001168 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
1169 minlen += ssl->transform_in->ivlen;
1170
1171 if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
1172 ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
1173 {
1174 SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
1175 ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) );
1176 return( POLARSSL_ERR_SSL_INVALID_MAC );
1177 }
1178
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001179 dec_msglen = ssl->in_msglen;
1180 dec_msg = ssl->in_msg;
1181 dec_msg_result = ssl->in_msg;
1182
1183 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001184 * Initialize for prepended IV for block cipher in TLS v1.1 and up
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001185 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001186 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001187 {
Paul Bakker48916f92012-09-16 19:57:18 +00001188 dec_msglen -= ssl->transform_in->ivlen;
1189 ssl->in_msglen -= ssl->transform_in->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001190
Paul Bakker48916f92012-09-16 19:57:18 +00001191 for( i = 0; i < ssl->transform_in->ivlen; i++ )
Paul Bakker92be97b2013-01-02 17:30:03 +01001192 ssl->transform_in->iv_dec[i] = ssl->in_iv[i];
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001193 }
1194
Paul Bakker68884e32013-01-07 18:20:04 +01001195 switch( ssl->transform_in->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +00001196 {
Paul Bakker5fd49172013-08-19 13:29:26 +02001197#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001198 case POLARSSL_CIPHER_DES_CBC:
1199 des_crypt_cbc( (des_context *) ssl->transform_in->ctx_dec,
1200 DES_DECRYPT, dec_msglen,
1201 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
Paul Bakker5121ce52009-01-03 21:22:43 +00001202 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001203
Paul Bakker68884e32013-01-07 18:20:04 +01001204 case POLARSSL_CIPHER_DES_EDE3_CBC:
1205 des3_crypt_cbc( (des3_context *) ssl->transform_in->ctx_dec,
1206 DES_DECRYPT, dec_msglen,
1207 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1208 break;
Paul Bakker5fd49172013-08-19 13:29:26 +02001209#endif
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001210
Paul Bakker5fd49172013-08-19 13:29:26 +02001211#if defined(POLARSSL_AES_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001212 case POLARSSL_CIPHER_AES_128_CBC:
1213 case POLARSSL_CIPHER_AES_256_CBC:
1214 aes_crypt_cbc( (aes_context *) ssl->transform_in->ctx_dec,
1215 AES_DECRYPT, dec_msglen,
1216 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1217 break;
Paul Bakker5fd49172013-08-19 13:29:26 +02001218#endif
Paul Bakker68884e32013-01-07 18:20:04 +01001219
Paul Bakker5fd49172013-08-19 13:29:26 +02001220#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001221 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
1222 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
1223 camellia_crypt_cbc( (camellia_context *) ssl->transform_in->ctx_dec,
1224 CAMELLIA_DECRYPT, dec_msglen,
1225 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1226 break;
Paul Bakker5fd49172013-08-19 13:29:26 +02001227#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001228
1229 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001230 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001231 }
1232
1233 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
Paul Bakker45829992013-01-03 14:52:21 +01001234
1235 if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
1236 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001237#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001238 SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
1239 ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001240#endif
Paul Bakker45829992013-01-03 14:52:21 +01001241 padlen = 0;
Paul Bakker45829992013-01-03 14:52:21 +01001242 correct = 0;
1243 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001244
1245 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1246 {
Paul Bakker48916f92012-09-16 19:57:18 +00001247 if( padlen > ssl->transform_in->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001248 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001249#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001250 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
1251 "should be no more than %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001252 padlen, ssl->transform_in->ivlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001253#endif
Paul Bakker45829992013-01-03 14:52:21 +01001254 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001255 }
1256 }
1257 else
1258 {
1259 /*
Paul Bakker45829992013-01-03 14:52:21 +01001260 * TLSv1+: always check the padding up to the first failure
1261 * and fake check up to 256 bytes of padding
Paul Bakker5121ce52009-01-03 21:22:43 +00001262 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001263 size_t pad_count = 0, fake_pad_count = 0;
1264 size_t padding_idx = ssl->in_msglen - padlen - 1;
1265
Paul Bakker5121ce52009-01-03 21:22:43 +00001266 for( i = 1; i <= padlen; i++ )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001267 pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1268
1269 for( ; i <= 256; i++ )
1270 fake_pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1271
1272 correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
1273 correct &= ( pad_count + fake_pad_count < 512 ); /* Always 1 */
1274
Paul Bakkerd66f0702013-01-31 16:57:45 +01001275#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001276 if( padlen > 0 && correct == 0)
1277 SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001278#endif
Paul Bakkere47b34b2013-02-27 14:48:00 +01001279 padlen &= correct * 0x1FF;
Paul Bakker5121ce52009-01-03 21:22:43 +00001280 }
1281 }
1282
1283 SSL_DEBUG_BUF( 4, "raw buffer after decryption",
1284 ssl->in_msg, ssl->in_msglen );
1285
1286 /*
1287 * Always compute the MAC (RFC4346, CBCTIME).
1288 */
Paul Bakker48916f92012-09-16 19:57:18 +00001289 ssl->in_msglen -= ( ssl->transform_in->maclen + padlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001290
1291 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1292 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1293
Paul Bakker45829992013-01-03 14:52:21 +01001294 memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001295
1296 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1297 {
Paul Bakker68884e32013-01-07 18:20:04 +01001298 ssl_mac( &ssl->transform_in->md_ctx_dec,
1299 ssl->transform_in->mac_dec,
1300 ssl->in_msg, ssl->in_msglen,
1301 ssl->in_ctr, ssl->in_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +00001302 }
1303 else
1304 {
Paul Bakker45829992013-01-03 14:52:21 +01001305 /*
1306 * Process MAC and always update for padlen afterwards to make
1307 * total time independent of padlen
Paul Bakkere47b34b2013-02-27 14:48:00 +01001308 *
1309 * extra_run compensates MAC check for padlen
1310 *
1311 * Known timing attacks:
1312 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
1313 *
1314 * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
1315 * correctly. (We round down instead of up, so -56 is the correct
1316 * value for our calculations instead of -55)
Paul Bakker45829992013-01-03 14:52:21 +01001317 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001318 int j, extra_run = 0;
1319 extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
1320 ( 13 + ssl->in_msglen + 8 ) / 64;
1321
1322 extra_run &= correct * 0xFF;
1323
Paul Bakker68884e32013-01-07 18:20:04 +01001324 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 13 );
1325 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,
1326 ssl->in_msglen );
1327 md_hmac_finish( &ssl->transform_in->md_ctx_dec,
1328 ssl->in_msg + ssl->in_msglen );
1329 for( j = 0; j < extra_run; j++ )
1330 md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001331
Paul Bakker68884e32013-01-07 18:20:04 +01001332 md_hmac_reset( &ssl->transform_in->md_ctx_dec );
Paul Bakker5121ce52009-01-03 21:22:43 +00001333 }
1334
Paul Bakker48916f92012-09-16 19:57:18 +00001335 SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001336 SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001337 ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001338
1339 if( memcmp( tmp, ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001340 ssl->transform_in->maclen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001341 {
Paul Bakkere47b34b2013-02-27 14:48:00 +01001342#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001343 SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001344#endif
Paul Bakker45829992013-01-03 14:52:21 +01001345 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001346 }
1347
1348 /*
Paul Bakker45829992013-01-03 14:52:21 +01001349 * Finally check the correct flag
Paul Bakker5121ce52009-01-03 21:22:43 +00001350 */
Paul Bakker45829992013-01-03 14:52:21 +01001351 if( correct == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +00001352 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001353
1354 if( ssl->in_msglen == 0 )
1355 {
1356 ssl->nb_zero++;
1357
1358 /*
1359 * Three or more empty messages may be a DoS attack
1360 * (excessive CPU consumption).
1361 */
1362 if( ssl->nb_zero > 3 )
1363 {
1364 SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
1365 "messages, possible DoS attack" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001366 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001367 }
1368 }
1369 else
1370 ssl->nb_zero = 0;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001371
Paul Bakker23986e52011-04-24 08:57:21 +00001372 for( i = 8; i > 0; i-- )
1373 if( ++ssl->in_ctr[i - 1] != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001374 break;
1375
1376 SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
1377
1378 return( 0 );
1379}
1380
Paul Bakker2770fbd2012-07-03 13:30:23 +00001381#if defined(POLARSSL_ZLIB_SUPPORT)
1382/*
1383 * Compression/decompression functions
1384 */
1385static int ssl_compress_buf( ssl_context *ssl )
1386{
1387 int ret;
1388 unsigned char *msg_post = ssl->out_msg;
1389 size_t len_pre = ssl->out_msglen;
1390 unsigned char *msg_pre;
1391
1392 SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
1393
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001394 if( len_pre == 0 )
1395 return( 0 );
1396
Paul Bakker6e339b52013-07-03 13:37:05 +02001397 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001398 if( msg_pre == NULL )
1399 {
1400 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1401 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1402 }
1403
1404 memcpy( msg_pre, ssl->out_msg, len_pre );
1405
1406 SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
1407 ssl->out_msglen ) );
1408
1409 SSL_DEBUG_BUF( 4, "before compression: output payload",
1410 ssl->out_msg, ssl->out_msglen );
1411
Paul Bakker48916f92012-09-16 19:57:18 +00001412 ssl->transform_out->ctx_deflate.next_in = msg_pre;
1413 ssl->transform_out->ctx_deflate.avail_in = len_pre;
1414 ssl->transform_out->ctx_deflate.next_out = msg_post;
1415 ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001416
Paul Bakker48916f92012-09-16 19:57:18 +00001417 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001418 if( ret != Z_OK )
1419 {
1420 SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
1421 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1422 }
1423
Paul Bakker48916f92012-09-16 19:57:18 +00001424 ssl->out_msglen = SSL_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001425
Paul Bakker6e339b52013-07-03 13:37:05 +02001426 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001427
1428 SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
1429 ssl->out_msglen ) );
1430
1431 SSL_DEBUG_BUF( 4, "after compression: output payload",
1432 ssl->out_msg, ssl->out_msglen );
1433
1434 SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
1435
1436 return( 0 );
1437}
1438
1439static int ssl_decompress_buf( ssl_context *ssl )
1440{
1441 int ret;
1442 unsigned char *msg_post = ssl->in_msg;
1443 size_t len_pre = ssl->in_msglen;
1444 unsigned char *msg_pre;
1445
1446 SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
1447
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001448 if( len_pre == 0 )
1449 return( 0 );
1450
Paul Bakker6e339b52013-07-03 13:37:05 +02001451 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001452 if( msg_pre == NULL )
1453 {
1454 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1455 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1456 }
1457
1458 memcpy( msg_pre, ssl->in_msg, len_pre );
1459
1460 SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
1461 ssl->in_msglen ) );
1462
1463 SSL_DEBUG_BUF( 4, "before decompression: input payload",
1464 ssl->in_msg, ssl->in_msglen );
1465
Paul Bakker48916f92012-09-16 19:57:18 +00001466 ssl->transform_in->ctx_inflate.next_in = msg_pre;
1467 ssl->transform_in->ctx_inflate.avail_in = len_pre;
1468 ssl->transform_in->ctx_inflate.next_out = msg_post;
1469 ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001470
Paul Bakker48916f92012-09-16 19:57:18 +00001471 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001472 if( ret != Z_OK )
1473 {
1474 SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
1475 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1476 }
1477
Paul Bakker48916f92012-09-16 19:57:18 +00001478 ssl->in_msglen = SSL_MAX_CONTENT_LEN - ssl->transform_in->ctx_inflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001479
Paul Bakker6e339b52013-07-03 13:37:05 +02001480 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001481
1482 SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
1483 ssl->in_msglen ) );
1484
1485 SSL_DEBUG_BUF( 4, "after decompression: input payload",
1486 ssl->in_msg, ssl->in_msglen );
1487
1488 SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
1489
1490 return( 0 );
1491}
1492#endif /* POLARSSL_ZLIB_SUPPORT */
1493
Paul Bakker5121ce52009-01-03 21:22:43 +00001494/*
1495 * Fill the input message buffer
1496 */
Paul Bakker23986e52011-04-24 08:57:21 +00001497int ssl_fetch_input( ssl_context *ssl, size_t nb_want )
Paul Bakker5121ce52009-01-03 21:22:43 +00001498{
Paul Bakker23986e52011-04-24 08:57:21 +00001499 int ret;
1500 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001501
1502 SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
1503
1504 while( ssl->in_left < nb_want )
1505 {
1506 len = nb_want - ssl->in_left;
1507 ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
1508
1509 SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
1510 ssl->in_left, nb_want ) );
1511 SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
1512
Paul Bakker831a7552011-05-18 13:32:51 +00001513 if( ret == 0 )
1514 return( POLARSSL_ERR_SSL_CONN_EOF );
1515
Paul Bakker5121ce52009-01-03 21:22:43 +00001516 if( ret < 0 )
1517 return( ret );
1518
1519 ssl->in_left += ret;
1520 }
1521
1522 SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
1523
1524 return( 0 );
1525}
1526
1527/*
1528 * Flush any data not yet written
1529 */
1530int ssl_flush_output( ssl_context *ssl )
1531{
1532 int ret;
1533 unsigned char *buf;
1534
1535 SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
1536
1537 while( ssl->out_left > 0 )
1538 {
1539 SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
1540 5 + ssl->out_msglen, ssl->out_left ) );
1541
Paul Bakker5bd42292012-12-19 14:40:42 +01001542 buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
Paul Bakker5121ce52009-01-03 21:22:43 +00001543 ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
Paul Bakker186751d2012-05-08 13:16:14 +00001544
Paul Bakker5121ce52009-01-03 21:22:43 +00001545 SSL_DEBUG_RET( 2, "ssl->f_send", ret );
1546
1547 if( ret <= 0 )
1548 return( ret );
1549
1550 ssl->out_left -= ret;
1551 }
1552
1553 SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
1554
1555 return( 0 );
1556}
1557
1558/*
1559 * Record layer functions
1560 */
1561int ssl_write_record( ssl_context *ssl )
1562{
Paul Bakker05ef8352012-05-08 09:17:57 +00001563 int ret, done = 0;
Paul Bakker23986e52011-04-24 08:57:21 +00001564 size_t len = ssl->out_msglen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001565
1566 SSL_DEBUG_MSG( 2, ( "=> write record" ) );
1567
Paul Bakker5121ce52009-01-03 21:22:43 +00001568 if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
1569 {
1570 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
1571 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
1572 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
1573
Paul Bakker48916f92012-09-16 19:57:18 +00001574 ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001575 }
1576
Paul Bakker2770fbd2012-07-03 13:30:23 +00001577#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001578 if( ssl->transform_out != NULL &&
1579 ssl->session_out->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001580 {
1581 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
1582 {
1583 SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
1584 return( ret );
1585 }
1586
1587 len = ssl->out_msglen;
1588 }
1589#endif /*POLARSSL_ZLIB_SUPPORT */
1590
Paul Bakker05ef8352012-05-08 09:17:57 +00001591#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1592 if( ssl_hw_record_write != NULL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001593 {
Paul Bakker05ef8352012-05-08 09:17:57 +00001594 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001595
Paul Bakker05ef8352012-05-08 09:17:57 +00001596 ret = ssl_hw_record_write( ssl );
1597 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1598 {
1599 SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret );
1600 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1601 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001602
1603 if( ret == 0 )
1604 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001605 }
1606#endif
1607 if( !done )
1608 {
1609 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
1610 ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
1611 ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00001612 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1613 ssl->out_hdr[4] = (unsigned char)( len );
Paul Bakker05ef8352012-05-08 09:17:57 +00001614
Paul Bakker48916f92012-09-16 19:57:18 +00001615 if( ssl->transform_out != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001616 {
1617 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
1618 {
1619 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
1620 return( ret );
1621 }
1622
1623 len = ssl->out_msglen;
1624 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1625 ssl->out_hdr[4] = (unsigned char)( len );
1626 }
1627
1628 ssl->out_left = 5 + ssl->out_msglen;
1629
1630 SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
1631 "version = [%d:%d], msglen = %d",
1632 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
1633 ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
1634
1635 SSL_DEBUG_BUF( 4, "output record sent to network",
Paul Bakker5bd42292012-12-19 14:40:42 +01001636 ssl->out_hdr, 5 + ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001637 }
1638
Paul Bakker5121ce52009-01-03 21:22:43 +00001639 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1640 {
1641 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
1642 return( ret );
1643 }
1644
1645 SSL_DEBUG_MSG( 2, ( "<= write record" ) );
1646
1647 return( 0 );
1648}
1649
1650int ssl_read_record( ssl_context *ssl )
1651{
Paul Bakker05ef8352012-05-08 09:17:57 +00001652 int ret, done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001653
1654 SSL_DEBUG_MSG( 2, ( "=> read record" ) );
1655
Paul Bakker68884e32013-01-07 18:20:04 +01001656 SSL_DEBUG_BUF( 4, "input record from network",
1657 ssl->in_hdr, 5 + ssl->in_msglen );
1658
Paul Bakker5121ce52009-01-03 21:22:43 +00001659 if( ssl->in_hslen != 0 &&
1660 ssl->in_hslen < ssl->in_msglen )
1661 {
1662 /*
1663 * Get next Handshake message in the current record
1664 */
1665 ssl->in_msglen -= ssl->in_hslen;
1666
Paul Bakker8934a982011-08-05 11:11:53 +00001667 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
Paul Bakker48916f92012-09-16 19:57:18 +00001668 ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001669
1670 ssl->in_hslen = 4;
1671 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1672
1673 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1674 " %d, type = %d, hslen = %d",
1675 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1676
1677 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1678 {
1679 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001680 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001681 }
1682
1683 if( ssl->in_msglen < ssl->in_hslen )
1684 {
1685 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001686 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001687 }
1688
Paul Bakker48916f92012-09-16 19:57:18 +00001689 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001690
1691 return( 0 );
1692 }
1693
1694 ssl->in_hslen = 0;
1695
1696 /*
1697 * Read the record header and validate it
1698 */
1699 if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
1700 {
1701 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1702 return( ret );
1703 }
1704
1705 ssl->in_msgtype = ssl->in_hdr[0];
1706 ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
1707
1708 SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
1709 "version = [%d:%d], msglen = %d",
1710 ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
1711 ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
1712
1713 if( ssl->in_hdr[1] != ssl->major_ver )
1714 {
1715 SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001716 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001717 }
1718
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001719 if( ssl->in_hdr[2] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00001720 {
1721 SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001722 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001723 }
1724
1725 /*
1726 * Make sure the message length is acceptable
1727 */
Paul Bakker48916f92012-09-16 19:57:18 +00001728 if( ssl->transform_in == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001729 {
1730 if( ssl->in_msglen < 1 ||
1731 ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1732 {
1733 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001734 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001735 }
1736 }
1737 else
1738 {
Paul Bakker48916f92012-09-16 19:57:18 +00001739 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001740 {
1741 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001742 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001743 }
1744
1745 if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001746 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN )
Paul Bakker5121ce52009-01-03 21:22:43 +00001747 {
1748 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001749 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001750 }
1751
1752 /*
1753 * TLS encrypted messages can have up to 256 bytes of padding
1754 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001755 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001756 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN + 256 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001757 {
1758 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001759 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001760 }
1761 }
1762
1763 /*
1764 * Read and optionally decrypt the message contents
1765 */
1766 if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 )
1767 {
1768 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1769 return( ret );
1770 }
1771
1772 SSL_DEBUG_BUF( 4, "input record from network",
1773 ssl->in_hdr, 5 + ssl->in_msglen );
1774
Paul Bakker05ef8352012-05-08 09:17:57 +00001775#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1776 if( ssl_hw_record_read != NULL)
1777 {
1778 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) );
1779
1780 ret = ssl_hw_record_read( ssl );
1781 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1782 {
1783 SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret );
1784 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1785 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001786
1787 if( ret == 0 )
1788 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001789 }
1790#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001791 if( !done && ssl->transform_in != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001792 {
1793 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
1794 {
Paul Bakker40865c82013-01-31 17:13:13 +01001795#if defined(POLARSSL_SSL_ALERT_MESSAGES)
1796 if( ret == POLARSSL_ERR_SSL_INVALID_MAC )
1797 {
1798 ssl_send_alert_message( ssl,
1799 SSL_ALERT_LEVEL_FATAL,
1800 SSL_ALERT_MSG_BAD_RECORD_MAC );
1801 }
1802#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001803 SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
1804 return( ret );
1805 }
1806
1807 SSL_DEBUG_BUF( 4, "input payload after decrypt",
1808 ssl->in_msg, ssl->in_msglen );
1809
1810 if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1811 {
1812 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001813 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001814 }
1815 }
1816
Paul Bakker2770fbd2012-07-03 13:30:23 +00001817#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001818 if( ssl->transform_in != NULL &&
1819 ssl->session_in->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001820 {
1821 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
1822 {
1823 SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
1824 return( ret );
1825 }
1826
1827 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1828 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1829 }
1830#endif /* POLARSSL_ZLIB_SUPPORT */
1831
Paul Bakker0a925182012-04-16 06:46:41 +00001832 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE &&
1833 ssl->in_msgtype != SSL_MSG_ALERT &&
1834 ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC &&
1835 ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
1836 {
1837 SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
1838
Paul Bakker48916f92012-09-16 19:57:18 +00001839 if( ( ret = ssl_send_alert_message( ssl,
1840 SSL_ALERT_LEVEL_FATAL,
1841 SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
Paul Bakker0a925182012-04-16 06:46:41 +00001842 {
1843 return( ret );
1844 }
1845
1846 return( POLARSSL_ERR_SSL_INVALID_RECORD );
1847 }
1848
Paul Bakker5121ce52009-01-03 21:22:43 +00001849 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
1850 {
1851 ssl->in_hslen = 4;
1852 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1853
1854 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1855 " %d, type = %d, hslen = %d",
1856 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1857
1858 /*
1859 * Additional checks to validate the handshake header
1860 */
1861 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1862 {
1863 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001864 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001865 }
1866
1867 if( ssl->in_msglen < ssl->in_hslen )
1868 {
1869 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001870 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001871 }
1872
Paul Bakker48916f92012-09-16 19:57:18 +00001873 if( ssl->state != SSL_HANDSHAKE_OVER )
1874 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001875 }
1876
1877 if( ssl->in_msgtype == SSL_MSG_ALERT )
1878 {
1879 SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
1880 ssl->in_msg[0], ssl->in_msg[1] ) );
1881
1882 /*
1883 * Ignore non-fatal alerts, except close_notify
1884 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001885 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001886 {
Paul Bakker2770fbd2012-07-03 13:30:23 +00001887 SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
1888 ssl->in_msg[1] ) );
Paul Bakker9d781402011-05-09 16:17:09 +00001889 /**
1890 * Subtract from error code as ssl->in_msg[1] is 7-bit positive
1891 * error identifier.
1892 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00001893 return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001894 }
1895
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001896 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
1897 ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00001898 {
1899 SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001900 return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001901 }
1902 }
1903
1904 ssl->in_left = 0;
1905
1906 SSL_DEBUG_MSG( 2, ( "<= read record" ) );
1907
1908 return( 0 );
1909}
1910
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001911int ssl_send_fatal_handshake_failure( ssl_context *ssl )
1912{
1913 int ret;
1914
1915 if( ( ret = ssl_send_alert_message( ssl,
1916 SSL_ALERT_LEVEL_FATAL,
1917 SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
1918 {
1919 return( ret );
1920 }
1921
1922 return( 0 );
1923}
1924
Paul Bakker0a925182012-04-16 06:46:41 +00001925int ssl_send_alert_message( ssl_context *ssl,
1926 unsigned char level,
1927 unsigned char message )
1928{
1929 int ret;
1930
1931 SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
1932
1933 ssl->out_msgtype = SSL_MSG_ALERT;
1934 ssl->out_msglen = 2;
1935 ssl->out_msg[0] = level;
1936 ssl->out_msg[1] = message;
1937
1938 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1939 {
1940 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1941 return( ret );
1942 }
1943
1944 SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
1945
1946 return( 0 );
1947}
1948
Paul Bakker5121ce52009-01-03 21:22:43 +00001949/*
1950 * Handshake functions
1951 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001952#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1953 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1954 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001955int ssl_write_certificate( ssl_context *ssl )
1956{
Paul Bakkered27a042013-04-18 22:46:23 +02001957 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001958 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001959
1960 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1961
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001962 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1963 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001964 {
1965 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1966 ssl->state++;
1967 return( 0 );
1968 }
1969
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001970 return( ret );
1971}
1972
1973int ssl_parse_certificate( ssl_context *ssl )
1974{
1975 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1976 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1977
1978 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
1979
1980 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1981 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1982 {
1983 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
1984 ssl->state++;
1985 return( 0 );
1986 }
1987
1988 return( ret );
1989}
1990#else
1991int ssl_write_certificate( ssl_context *ssl )
1992{
1993 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1994 size_t i, n;
1995 const x509_cert *crt;
1996 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1997
1998 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1999
2000 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2001 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
2002 {
2003 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2004 ssl->state++;
2005 return( 0 );
2006 }
2007
Paul Bakker5121ce52009-01-03 21:22:43 +00002008 if( ssl->endpoint == SSL_IS_CLIENT )
2009 {
2010 if( ssl->client_auth == 0 )
2011 {
2012 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2013 ssl->state++;
2014 return( 0 );
2015 }
2016
2017 /*
2018 * If using SSLv3 and got no cert, send an Alert message
2019 * (otherwise an empty Certificate message will be sent).
2020 */
2021 if( ssl->own_cert == NULL &&
2022 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2023 {
2024 ssl->out_msglen = 2;
2025 ssl->out_msgtype = SSL_MSG_ALERT;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002026 ssl->out_msg[0] = SSL_ALERT_LEVEL_WARNING;
2027 ssl->out_msg[1] = SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00002028
2029 SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
2030 goto write_msg;
2031 }
2032 }
2033 else /* SSL_IS_SERVER */
2034 {
2035 if( ssl->own_cert == NULL )
2036 {
2037 SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002038 return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002039 }
2040 }
2041
2042 SSL_DEBUG_CRT( 3, "own certificate", ssl->own_cert );
2043
2044 /*
2045 * 0 . 0 handshake type
2046 * 1 . 3 handshake length
2047 * 4 . 6 length of all certs
2048 * 7 . 9 length of cert. 1
2049 * 10 . n-1 peer certificate
2050 * n . n+2 length of cert. 2
2051 * n+3 . ... upper level cert, etc.
2052 */
2053 i = 7;
2054 crt = ssl->own_cert;
2055
Paul Bakker29087132010-03-21 21:03:34 +00002056 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002057 {
2058 n = crt->raw.len;
2059 if( i + 3 + n > SSL_MAX_CONTENT_LEN )
2060 {
2061 SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
2062 i + 3 + n, SSL_MAX_CONTENT_LEN ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002063 return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002064 }
2065
2066 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
2067 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
2068 ssl->out_msg[i + 2] = (unsigned char)( n );
2069
2070 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
2071 i += n; crt = crt->next;
2072 }
2073
2074 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
2075 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
2076 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
2077
2078 ssl->out_msglen = i;
2079 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2080 ssl->out_msg[0] = SSL_HS_CERTIFICATE;
2081
2082write_msg:
2083
2084 ssl->state++;
2085
2086 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2087 {
2088 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2089 return( ret );
2090 }
2091
2092 SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
2093
Paul Bakkered27a042013-04-18 22:46:23 +02002094 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002095}
2096
2097int ssl_parse_certificate( ssl_context *ssl )
2098{
Paul Bakkered27a042013-04-18 22:46:23 +02002099 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker23986e52011-04-24 08:57:21 +00002100 size_t i, n;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002101 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002102
2103 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2104
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002105 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2106 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002107 {
2108 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2109 ssl->state++;
2110 return( 0 );
2111 }
2112
Paul Bakker5121ce52009-01-03 21:22:43 +00002113 if( ssl->endpoint == SSL_IS_SERVER &&
2114 ssl->authmode == SSL_VERIFY_NONE )
2115 {
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002116 ssl->session_negotiate->verify_result = BADCERT_SKIP_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00002117 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2118 ssl->state++;
2119 return( 0 );
2120 }
2121
2122 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2123 {
2124 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2125 return( ret );
2126 }
2127
2128 ssl->state++;
2129
2130 /*
2131 * Check if the client sent an empty certificate
2132 */
2133 if( ssl->endpoint == SSL_IS_SERVER &&
2134 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2135 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002136 if( ssl->in_msglen == 2 &&
2137 ssl->in_msgtype == SSL_MSG_ALERT &&
2138 ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2139 ssl->in_msg[1] == SSL_ALERT_MSG_NO_CERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002140 {
2141 SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2142
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002143 ssl->session_negotiate->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002144 if( ssl->authmode == SSL_VERIFY_OPTIONAL )
2145 return( 0 );
2146 else
Paul Bakker40e46942009-01-03 21:51:57 +00002147 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002148 }
2149 }
2150
2151 if( ssl->endpoint == SSL_IS_SERVER &&
2152 ssl->minor_ver != SSL_MINOR_VERSION_0 )
2153 {
2154 if( ssl->in_hslen == 7 &&
2155 ssl->in_msgtype == SSL_MSG_HANDSHAKE &&
2156 ssl->in_msg[0] == SSL_HS_CERTIFICATE &&
2157 memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
2158 {
2159 SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2160
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002161 ssl->session_negotiate->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002162 if( ssl->authmode == SSL_VERIFY_REQUIRED )
Paul Bakker40e46942009-01-03 21:51:57 +00002163 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002164 else
2165 return( 0 );
2166 }
2167 }
2168
2169 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2170 {
2171 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002172 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002173 }
2174
2175 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
2176 {
2177 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002178 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002179 }
2180
2181 /*
2182 * Same message structure as in ssl_write_certificate()
2183 */
2184 n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
2185
2186 if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
2187 {
2188 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002189 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002190 }
2191
Paul Bakker6e339b52013-07-03 13:37:05 +02002192 if( ( ssl->session_negotiate->peer_cert = (x509_cert *) polarssl_malloc(
Paul Bakker5121ce52009-01-03 21:22:43 +00002193 sizeof( x509_cert ) ) ) == NULL )
2194 {
2195 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
2196 sizeof( x509_cert ) ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002197 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002198 }
2199
Paul Bakker48916f92012-09-16 19:57:18 +00002200 memset( ssl->session_negotiate->peer_cert, 0, sizeof( x509_cert ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002201
2202 i = 7;
2203
2204 while( i < ssl->in_hslen )
2205 {
2206 if( ssl->in_msg[i] != 0 )
2207 {
2208 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002209 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002210 }
2211
2212 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2213 | (unsigned int) ssl->in_msg[i + 2];
2214 i += 3;
2215
2216 if( n < 128 || i + n > ssl->in_hslen )
2217 {
2218 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002219 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002220 }
2221
Paul Bakker89ecb2d2013-06-24 19:06:15 +02002222 ret = x509parse_crt_der( ssl->session_negotiate->peer_cert,
2223 ssl->in_msg + i, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002224 if( ret != 0 )
2225 {
2226 SSL_DEBUG_RET( 1, " x509parse_crt", ret );
2227 return( ret );
2228 }
2229
2230 i += n;
2231 }
2232
Paul Bakker48916f92012-09-16 19:57:18 +00002233 SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00002234
2235 if( ssl->authmode != SSL_VERIFY_NONE )
2236 {
2237 if( ssl->ca_chain == NULL )
2238 {
2239 SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002240 return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002241 }
2242
Paul Bakker48916f92012-09-16 19:57:18 +00002243 ret = x509parse_verify( ssl->session_negotiate->peer_cert,
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002244 ssl->ca_chain, ssl->ca_crl, ssl->peer_cn,
2245 &ssl->session_negotiate->verify_result,
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002246 ssl->f_vrfy, ssl->p_vrfy );
Paul Bakker5121ce52009-01-03 21:22:43 +00002247
2248 if( ret != 0 )
2249 SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2250
2251 if( ssl->authmode != SSL_VERIFY_REQUIRED )
2252 ret = 0;
2253 }
2254
2255 SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
2256
2257 return( ret );
2258}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002259#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2260 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2261 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002262
2263int ssl_write_change_cipher_spec( ssl_context *ssl )
2264{
2265 int ret;
2266
2267 SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
2268
2269 ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
2270 ssl->out_msglen = 1;
2271 ssl->out_msg[0] = 1;
2272
Paul Bakker5121ce52009-01-03 21:22:43 +00002273 ssl->state++;
2274
2275 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2276 {
2277 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2278 return( ret );
2279 }
2280
2281 SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
2282
2283 return( 0 );
2284}
2285
2286int ssl_parse_change_cipher_spec( ssl_context *ssl )
2287{
2288 int ret;
2289
2290 SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
2291
Paul Bakker5121ce52009-01-03 21:22:43 +00002292 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2293 {
2294 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2295 return( ret );
2296 }
2297
2298 if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
2299 {
2300 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002301 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002302 }
2303
2304 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
2305 {
2306 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002307 return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
Paul Bakker5121ce52009-01-03 21:22:43 +00002308 }
2309
2310 ssl->state++;
2311
2312 SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
2313
2314 return( 0 );
2315}
2316
Paul Bakker41c83d32013-03-20 14:39:14 +01002317void ssl_optimize_checksum( ssl_context *ssl,
2318 const ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00002319{
Paul Bakker9e36f042013-06-30 14:34:05 +02002320#if !defined(POLARSSL_SHA512_C)
Paul Bakkerfb08fd22013-08-27 15:06:26 +02002321 ((void) ciphersuite_info);
Paul Bakker769075d2012-11-24 11:26:46 +01002322#endif
2323
Paul Bakker380da532012-04-18 16:10:25 +00002324 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00002325 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker9e36f042013-06-30 14:34:05 +02002326#if defined(POLARSSL_SHA512_C)
Paul Bakkerb7149bc2013-03-20 15:30:09 +01002327 else if( ciphersuite_info->mac == POLARSSL_MD_SHA384 )
Paul Bakker380da532012-04-18 16:10:25 +00002328 {
Paul Bakker48916f92012-09-16 19:57:18 +00002329 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
Paul Bakker380da532012-04-18 16:10:25 +00002330 }
Paul Bakker769075d2012-11-24 11:26:46 +01002331#endif
Paul Bakker380da532012-04-18 16:10:25 +00002332 else
Paul Bakker48916f92012-09-16 19:57:18 +00002333 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakker380da532012-04-18 16:10:25 +00002334}
Paul Bakkerf7abd422013-04-16 13:15:56 +02002335
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002336static void ssl_update_checksum_start( ssl_context *ssl,
2337 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002338{
Paul Bakker48916f92012-09-16 19:57:18 +00002339 md5_update( &ssl->handshake->fin_md5 , buf, len );
2340 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker9e36f042013-06-30 14:34:05 +02002341 sha256_update( &ssl->handshake->fin_sha256, buf, len );
2342#if defined(POLARSSL_SHA512_C)
2343 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002344#endif
Paul Bakker380da532012-04-18 16:10:25 +00002345}
2346
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002347static void ssl_update_checksum_md5sha1( ssl_context *ssl,
2348 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002349{
Paul Bakker48916f92012-09-16 19:57:18 +00002350 md5_update( &ssl->handshake->fin_md5 , buf, len );
2351 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002352}
2353
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002354static void ssl_update_checksum_sha256( ssl_context *ssl,
2355 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002356{
Paul Bakker9e36f042013-06-30 14:34:05 +02002357 sha256_update( &ssl->handshake->fin_sha256, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002358}
2359
Paul Bakker9e36f042013-06-30 14:34:05 +02002360#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002361static void ssl_update_checksum_sha384( ssl_context *ssl,
2362 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002363{
Paul Bakker9e36f042013-06-30 14:34:05 +02002364 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002365}
Paul Bakker769075d2012-11-24 11:26:46 +01002366#endif
Paul Bakker380da532012-04-18 16:10:25 +00002367
Paul Bakker1ef83d62012-04-11 12:09:53 +00002368static void ssl_calc_finished_ssl(
2369 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002370{
Paul Bakker3c2122f2013-06-24 19:03:14 +02002371 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002372 md5_context md5;
2373 sha1_context sha1;
2374
Paul Bakker5121ce52009-01-03 21:22:43 +00002375 unsigned char padbuf[48];
2376 unsigned char md5sum[16];
2377 unsigned char sha1sum[20];
2378
Paul Bakker48916f92012-09-16 19:57:18 +00002379 ssl_session *session = ssl->session_negotiate;
2380 if( !session )
2381 session = ssl->session;
2382
Paul Bakker1ef83d62012-04-11 12:09:53 +00002383 SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
2384
Paul Bakker48916f92012-09-16 19:57:18 +00002385 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2386 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002387
2388 /*
2389 * SSLv3:
2390 * hash =
2391 * MD5( master + pad2 +
2392 * MD5( handshake + sender + master + pad1 ) )
2393 * + SHA1( master + pad2 +
2394 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002395 */
2396
Paul Bakker90995b52013-06-24 19:20:35 +02002397#if !defined(POLARSSL_MD5_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002398 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002399 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002400#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002401
Paul Bakker90995b52013-06-24 19:20:35 +02002402#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002403 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002404 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002405#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002406
Paul Bakker3c2122f2013-06-24 19:03:14 +02002407 sender = ( from == SSL_IS_CLIENT ) ? "CLNT"
2408 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00002409
Paul Bakker1ef83d62012-04-11 12:09:53 +00002410 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002411
Paul Bakker3c2122f2013-06-24 19:03:14 +02002412 md5_update( &md5, (const unsigned char *) sender, 4 );
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_finish( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002416
Paul Bakker3c2122f2013-06-24 19:03:14 +02002417 sha1_update( &sha1, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002418 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002419 sha1_update( &sha1, padbuf, 40 );
2420 sha1_finish( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002421
Paul Bakker1ef83d62012-04-11 12:09:53 +00002422 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002423
Paul Bakker1ef83d62012-04-11 12:09:53 +00002424 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +00002425 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002426 md5_update( &md5, padbuf, 48 );
2427 md5_update( &md5, md5sum, 16 );
2428 md5_finish( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00002429
Paul Bakker1ef83d62012-04-11 12:09:53 +00002430 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +00002431 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002432 sha1_update( &sha1, padbuf , 40 );
2433 sha1_update( &sha1, sha1sum, 20 );
2434 sha1_finish( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002435
Paul Bakker1ef83d62012-04-11 12:09:53 +00002436 SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002437
Paul Bakker1ef83d62012-04-11 12:09:53 +00002438 memset( &md5, 0, sizeof( md5_context ) );
2439 memset( &sha1, 0, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002440
2441 memset( padbuf, 0, sizeof( padbuf ) );
2442 memset( md5sum, 0, sizeof( md5sum ) );
2443 memset( sha1sum, 0, sizeof( sha1sum ) );
2444
2445 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2446}
2447
Paul Bakker1ef83d62012-04-11 12:09:53 +00002448static void ssl_calc_finished_tls(
2449 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002450{
Paul Bakker1ef83d62012-04-11 12:09:53 +00002451 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002452 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002453 md5_context md5;
Paul Bakker5121ce52009-01-03 21:22:43 +00002454 sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002455 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00002456
Paul Bakker48916f92012-09-16 19:57:18 +00002457 ssl_session *session = ssl->session_negotiate;
2458 if( !session )
2459 session = ssl->session;
2460
Paul Bakker1ef83d62012-04-11 12:09:53 +00002461 SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002462
Paul Bakker48916f92012-09-16 19:57:18 +00002463 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2464 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002465
Paul Bakker1ef83d62012-04-11 12:09:53 +00002466 /*
2467 * TLSv1:
2468 * hash = PRF( master, finished_label,
2469 * MD5( handshake ) + SHA1( handshake ) )[0..11]
2470 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002471
Paul Bakker90995b52013-06-24 19:20:35 +02002472#if !defined(POLARSSL_MD5_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002473 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
2474 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002475#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002476
Paul Bakker90995b52013-06-24 19:20:35 +02002477#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002478 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
2479 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002480#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002481
2482 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002483 ? "client finished"
2484 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002485
2486 md5_finish( &md5, padbuf );
2487 sha1_finish( &sha1, padbuf + 16 );
2488
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002489 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002490 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002491
2492 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2493
2494 memset( &md5, 0, sizeof( md5_context ) );
2495 memset( &sha1, 0, sizeof( sha1_context ) );
2496
2497 memset( padbuf, 0, sizeof( padbuf ) );
2498
2499 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2500}
2501
Paul Bakkerca4ab492012-04-18 14:23:57 +00002502static void ssl_calc_finished_tls_sha256(
Paul Bakker1ef83d62012-04-11 12:09:53 +00002503 ssl_context *ssl, unsigned char *buf, int from )
2504{
2505 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002506 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002507 sha256_context sha256;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002508 unsigned char padbuf[32];
2509
Paul Bakker48916f92012-09-16 19:57:18 +00002510 ssl_session *session = ssl->session_negotiate;
2511 if( !session )
2512 session = ssl->session;
2513
Paul Bakker380da532012-04-18 16:10:25 +00002514 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002515
Paul Bakker9e36f042013-06-30 14:34:05 +02002516 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002517
2518 /*
2519 * TLSv1.2:
2520 * hash = PRF( master, finished_label,
2521 * Hash( handshake ) )[0.11]
2522 */
2523
Paul Bakker9e36f042013-06-30 14:34:05 +02002524#if !defined(POLARSSL_SHA256_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002525 SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
Paul Bakker9e36f042013-06-30 14:34:05 +02002526 sha256.state, sizeof( sha256.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002527#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002528
2529 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002530 ? "client finished"
2531 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002532
Paul Bakker9e36f042013-06-30 14:34:05 +02002533 sha256_finish( &sha256, padbuf );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002534
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002535 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002536 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002537
2538 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2539
Paul Bakker9e36f042013-06-30 14:34:05 +02002540 memset( &sha256, 0, sizeof( sha256_context ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002541
2542 memset( padbuf, 0, sizeof( padbuf ) );
2543
2544 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2545}
2546
Paul Bakker9e36f042013-06-30 14:34:05 +02002547#if defined(POLARSSL_SHA512_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002548static void ssl_calc_finished_tls_sha384(
2549 ssl_context *ssl, unsigned char *buf, int from )
2550{
2551 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002552 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002553 sha512_context sha512;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002554 unsigned char padbuf[48];
2555
Paul Bakker48916f92012-09-16 19:57:18 +00002556 ssl_session *session = ssl->session_negotiate;
2557 if( !session )
2558 session = ssl->session;
2559
Paul Bakker380da532012-04-18 16:10:25 +00002560 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002561
Paul Bakker9e36f042013-06-30 14:34:05 +02002562 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002563
2564 /*
2565 * TLSv1.2:
2566 * hash = PRF( master, finished_label,
2567 * Hash( handshake ) )[0.11]
2568 */
2569
Paul Bakker9e36f042013-06-30 14:34:05 +02002570#if !defined(POLARSSL_SHA512_ALT)
2571 SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
2572 sha512.state, sizeof( sha512.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002573#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002574
2575 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002576 ? "client finished"
2577 : "server finished";
Paul Bakkerca4ab492012-04-18 14:23:57 +00002578
Paul Bakker9e36f042013-06-30 14:34:05 +02002579 sha512_finish( &sha512, padbuf );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002580
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002581 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002582 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002583
2584 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2585
Paul Bakker9e36f042013-06-30 14:34:05 +02002586 memset( &sha512, 0, sizeof( sha512_context ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002587
2588 memset( padbuf, 0, sizeof( padbuf ) );
2589
2590 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2591}
Paul Bakker769075d2012-11-24 11:26:46 +01002592#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002593
Paul Bakker48916f92012-09-16 19:57:18 +00002594void ssl_handshake_wrapup( ssl_context *ssl )
2595{
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002596 int resume = ssl->handshake->resume;
2597
Paul Bakker48916f92012-09-16 19:57:18 +00002598 SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
2599
2600 /*
2601 * Free our handshake params
2602 */
2603 ssl_handshake_free( ssl->handshake );
Paul Bakker6e339b52013-07-03 13:37:05 +02002604 polarssl_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00002605 ssl->handshake = NULL;
2606
2607 /*
2608 * Switch in our now active transform context
2609 */
2610 if( ssl->transform )
2611 {
2612 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002613 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002614 }
2615 ssl->transform = ssl->transform_negotiate;
2616 ssl->transform_negotiate = NULL;
2617
Paul Bakker0a597072012-09-25 21:55:46 +00002618 if( ssl->session )
2619 {
2620 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002621 polarssl_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00002622 }
2623 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00002624 ssl->session_negotiate = NULL;
2625
Paul Bakker0a597072012-09-25 21:55:46 +00002626 /*
2627 * Add cache entry
2628 */
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002629 if( ssl->f_set_cache != NULL &&
2630 ssl->session->length != 0 &&
2631 resume == 0 )
2632 {
Paul Bakker0a597072012-09-25 21:55:46 +00002633 if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 )
2634 SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002635 }
Paul Bakker0a597072012-09-25 21:55:46 +00002636
Paul Bakker48916f92012-09-16 19:57:18 +00002637 ssl->state++;
2638
2639 SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
2640}
2641
Paul Bakker1ef83d62012-04-11 12:09:53 +00002642int ssl_write_finished( ssl_context *ssl )
2643{
2644 int ret, hash_len;
2645
2646 SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
2647
Paul Bakker92be97b2013-01-02 17:30:03 +01002648 /*
2649 * Set the out_msg pointer to the correct location based on IV length
2650 */
2651 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2652 {
2653 ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -
2654 ssl->transform_negotiate->fixed_ivlen;
2655 }
2656 else
2657 ssl->out_msg = ssl->out_iv;
2658
Paul Bakker48916f92012-09-16 19:57:18 +00002659 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002660
2661 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002662 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2663
Paul Bakker48916f92012-09-16 19:57:18 +00002664 ssl->verify_data_len = hash_len;
2665 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
2666
Paul Bakker5121ce52009-01-03 21:22:43 +00002667 ssl->out_msglen = 4 + hash_len;
2668 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2669 ssl->out_msg[0] = SSL_HS_FINISHED;
2670
2671 /*
2672 * In case of session resuming, invert the client and server
2673 * ChangeCipherSpec messages order.
2674 */
Paul Bakker0a597072012-09-25 21:55:46 +00002675 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002676 {
2677 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker48916f92012-09-16 19:57:18 +00002678 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002679 else
2680 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2681 }
2682 else
2683 ssl->state++;
2684
Paul Bakker48916f92012-09-16 19:57:18 +00002685 /*
2686 * Switch to our negotiated transform and session parameters for outbound data.
2687 */
2688 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
2689 ssl->transform_out = ssl->transform_negotiate;
2690 ssl->session_out = ssl->session_negotiate;
2691 memset( ssl->out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002692
Paul Bakker07eb38b2012-12-19 14:42:06 +01002693#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2694 if( ssl_hw_record_activate != NULL)
2695 {
2696 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
2697 {
2698 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2699 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2700 }
2701 }
2702#endif
2703
Paul Bakker5121ce52009-01-03 21:22:43 +00002704 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2705 {
2706 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2707 return( ret );
2708 }
2709
2710 SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
2711
2712 return( 0 );
2713}
2714
2715int ssl_parse_finished( ssl_context *ssl )
2716{
Paul Bakker23986e52011-04-24 08:57:21 +00002717 int ret;
2718 unsigned int hash_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002719 unsigned char buf[36];
2720
2721 SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
2722
Paul Bakker48916f92012-09-16 19:57:18 +00002723 ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002724
Paul Bakker48916f92012-09-16 19:57:18 +00002725 /*
2726 * Switch to our negotiated transform and session parameters for inbound data.
2727 */
2728 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
2729 ssl->transform_in = ssl->transform_negotiate;
2730 ssl->session_in = ssl->session_negotiate;
2731 memset( ssl->in_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002732
Paul Bakker92be97b2013-01-02 17:30:03 +01002733 /*
2734 * Set the in_msg pointer to the correct location based on IV length
2735 */
2736 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2737 {
2738 ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -
2739 ssl->transform_negotiate->fixed_ivlen;
2740 }
2741 else
2742 ssl->in_msg = ssl->in_iv;
2743
Paul Bakker07eb38b2012-12-19 14:42:06 +01002744#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2745 if( ssl_hw_record_activate != NULL)
2746 {
2747 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_INBOUND ) ) != 0 )
2748 {
2749 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2750 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2751 }
2752 }
2753#endif
2754
Paul Bakker5121ce52009-01-03 21:22:43 +00002755 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2756 {
2757 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2758 return( ret );
2759 }
2760
2761 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2762 {
2763 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002764 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002765 }
2766
Paul Bakker1ef83d62012-04-11 12:09:53 +00002767 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002768 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2769
2770 if( ssl->in_msg[0] != SSL_HS_FINISHED ||
2771 ssl->in_hslen != 4 + hash_len )
2772 {
2773 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002774 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002775 }
2776
Paul Bakker5121ce52009-01-03 21:22:43 +00002777 if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
2778 {
2779 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002780 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002781 }
2782
Paul Bakker48916f92012-09-16 19:57:18 +00002783 ssl->verify_data_len = hash_len;
2784 memcpy( ssl->peer_verify_data, buf, hash_len );
2785
Paul Bakker0a597072012-09-25 21:55:46 +00002786 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002787 {
2788 if( ssl->endpoint == SSL_IS_CLIENT )
2789 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2790
2791 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker48916f92012-09-16 19:57:18 +00002792 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002793 }
2794 else
2795 ssl->state++;
2796
2797 SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
2798
2799 return( 0 );
2800}
2801
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002802static int ssl_handshake_init( ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00002803{
2804 if( ssl->transform_negotiate )
2805 ssl_transform_free( ssl->transform_negotiate );
2806 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002807 ssl->transform_negotiate = polarssl_malloc( sizeof(ssl_transform) );
Paul Bakker48916f92012-09-16 19:57:18 +00002808
2809 if( ssl->session_negotiate )
2810 ssl_session_free( ssl->session_negotiate );
2811 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002812 ssl->session_negotiate = polarssl_malloc( sizeof(ssl_session) );
Paul Bakker48916f92012-09-16 19:57:18 +00002813
2814 if( ssl->handshake )
2815 ssl_handshake_free( ssl->handshake );
2816 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002817 ssl->handshake = polarssl_malloc( sizeof(ssl_handshake_params) );
Paul Bakker48916f92012-09-16 19:57:18 +00002818
2819 if( ssl->handshake == NULL ||
2820 ssl->transform_negotiate == NULL ||
2821 ssl->session_negotiate == NULL )
2822 {
2823 SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) );
2824 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2825 }
2826
2827 memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
2828 memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
2829 memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
2830
2831 md5_starts( &ssl->handshake->fin_md5 );
2832 sha1_starts( &ssl->handshake->fin_sha1 );
Paul Bakker9e36f042013-06-30 14:34:05 +02002833 sha256_starts( &ssl->handshake->fin_sha256, 0 );
2834#if defined(POLARSSL_SHA512_C)
2835 sha512_starts( &ssl->handshake->fin_sha512, 1 );
Paul Bakker769075d2012-11-24 11:26:46 +01002836#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002837
2838 ssl->handshake->update_checksum = ssl_update_checksum_start;
Paul Bakker23f36802012-09-28 14:15:14 +00002839 ssl->handshake->sig_alg = SSL_HASH_SHA1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002840
Paul Bakker61d113b2013-07-04 11:51:43 +02002841#if defined(POLARSSL_ECDH_C)
2842 ecdh_init( &ssl->handshake->ecdh_ctx );
2843#endif
2844
Paul Bakker48916f92012-09-16 19:57:18 +00002845 return( 0 );
2846}
2847
Paul Bakker5121ce52009-01-03 21:22:43 +00002848/*
2849 * Initialize an SSL context
2850 */
2851int ssl_init( ssl_context *ssl )
2852{
Paul Bakker48916f92012-09-16 19:57:18 +00002853 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002854 int len = SSL_BUFFER_LEN;
2855
2856 memset( ssl, 0, sizeof( ssl_context ) );
2857
Paul Bakker62f2dee2012-09-28 07:31:51 +00002858 /*
2859 * Sane defaults
2860 */
Paul Bakkered27a042013-04-18 22:46:23 +02002861#if defined(POLARSSL_RSA_C)
Paul Bakkereb2c6582012-09-27 19:15:01 +00002862 ssl->rsa_decrypt = ssl_rsa_decrypt;
2863 ssl->rsa_sign = ssl_rsa_sign;
2864 ssl->rsa_key_len = ssl_rsa_key_len;
Paul Bakkered27a042013-04-18 22:46:23 +02002865#endif
Paul Bakkereb2c6582012-09-27 19:15:01 +00002866
Paul Bakker1d29fb52012-09-28 13:28:45 +00002867 ssl->min_major_ver = SSL_MAJOR_VERSION_3;
2868 ssl->min_minor_ver = SSL_MINOR_VERSION_0;
Paul Bakker2fbefde2013-06-29 16:01:15 +02002869 ssl->max_major_ver = SSL_MAJOR_VERSION_3;
2870 ssl->max_minor_ver = SSL_MINOR_VERSION_3;
Paul Bakker1d29fb52012-09-28 13:28:45 +00002871
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002872 ssl_set_ciphersuites( ssl, ssl_list_ciphersuites() );
Paul Bakker645ce3a2012-10-31 12:32:41 +00002873
Paul Bakker62f2dee2012-09-28 07:31:51 +00002874#if defined(POLARSSL_DHM_C)
2875 if( ( ret = mpi_read_string( &ssl->dhm_P, 16,
2876 POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 ||
2877 ( ret = mpi_read_string( &ssl->dhm_G, 16,
2878 POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 )
2879 {
2880 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
2881 return( ret );
2882 }
2883#endif
2884
2885 /*
2886 * Prepare base structures
2887 */
Paul Bakker6e339b52013-07-03 13:37:05 +02002888 ssl->in_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00002889 ssl->in_hdr = ssl->in_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002890 ssl->in_iv = ssl->in_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002891 ssl->in_msg = ssl->in_ctr + 13;
2892
2893 if( ssl->in_ctr == NULL )
2894 {
2895 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002896 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002897 }
2898
Paul Bakker6e339b52013-07-03 13:37:05 +02002899 ssl->out_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00002900 ssl->out_hdr = ssl->out_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002901 ssl->out_iv = ssl->out_ctr + 13;
Paul Bakker5bd42292012-12-19 14:40:42 +01002902 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002903
2904 if( ssl->out_ctr == NULL )
2905 {
2906 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker6e339b52013-07-03 13:37:05 +02002907 polarssl_free( ssl-> in_ctr );
Paul Bakker69e095c2011-12-10 21:55:01 +00002908 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002909 }
2910
2911 memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
2912 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2913
2914 ssl->hostname = NULL;
2915 ssl->hostname_len = 0;
2916
Paul Bakker606b4ba2013-08-14 16:52:14 +02002917#if defined(POLARSSL_SSL_SESSION_TICKETS)
2918 ssl->ticket_lifetime = SSL_DEFAULT_TICKET_LIFETIME;
2919#endif
2920
Paul Bakker48916f92012-09-16 19:57:18 +00002921 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2922 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002923
2924 return( 0 );
2925}
2926
2927/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00002928 * Reset an initialized and used SSL context for re-use while retaining
2929 * all application-set variables, function pointers and data.
2930 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00002931int ssl_session_reset( ssl_context *ssl )
Paul Bakker7eb013f2011-10-06 12:37:39 +00002932{
Paul Bakker48916f92012-09-16 19:57:18 +00002933 int ret;
2934
Paul Bakker7eb013f2011-10-06 12:37:39 +00002935 ssl->state = SSL_HELLO_REQUEST;
Paul Bakker48916f92012-09-16 19:57:18 +00002936 ssl->renegotiation = SSL_INITIAL_HANDSHAKE;
2937 ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION;
2938
2939 ssl->verify_data_len = 0;
2940 memset( ssl->own_verify_data, 0, 36 );
2941 memset( ssl->peer_verify_data, 0, 36 );
2942
Paul Bakker7eb013f2011-10-06 12:37:39 +00002943 ssl->in_offt = NULL;
2944
Paul Bakker92be97b2013-01-02 17:30:03 +01002945 ssl->in_msg = ssl->in_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002946 ssl->in_msgtype = 0;
2947 ssl->in_msglen = 0;
2948 ssl->in_left = 0;
2949
2950 ssl->in_hslen = 0;
2951 ssl->nb_zero = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002952 ssl->record_read = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002953
Paul Bakker92be97b2013-01-02 17:30:03 +01002954 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002955 ssl->out_msgtype = 0;
2956 ssl->out_msglen = 0;
2957 ssl->out_left = 0;
2958
Paul Bakker48916f92012-09-16 19:57:18 +00002959 ssl->transform_in = NULL;
2960 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002961
2962 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2963 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker05ef8352012-05-08 09:17:57 +00002964
2965#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2966 if( ssl_hw_record_reset != NULL)
2967 {
2968 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) );
Paul Bakker07eb38b2012-12-19 14:42:06 +01002969 if( ( ret = ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002970 {
2971 SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret );
2972 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2973 }
Paul Bakker05ef8352012-05-08 09:17:57 +00002974 }
2975#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00002976
Paul Bakker48916f92012-09-16 19:57:18 +00002977 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002978 {
Paul Bakker48916f92012-09-16 19:57:18 +00002979 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002980 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002981 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002982 }
Paul Bakker48916f92012-09-16 19:57:18 +00002983
Paul Bakkerc0463502013-02-14 11:19:38 +01002984 if( ssl->session )
2985 {
2986 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002987 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01002988 ssl->session = NULL;
2989 }
2990
Paul Bakker48916f92012-09-16 19:57:18 +00002991 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2992 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002993
2994 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00002995}
2996
Paul Bakkera503a632013-08-14 13:48:06 +02002997#if defined(POLARSSL_SSL_SESSION_TICKETS)
Paul Bakker7eb013f2011-10-06 12:37:39 +00002998/*
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02002999 * Allocate and initialize ticket keys
3000 */
3001static int ssl_ticket_keys_init( ssl_context *ssl )
3002{
3003 int ret;
3004 ssl_ticket_keys *tkeys;
Manuel Pégourié-Gonnard56dc9e82013-08-03 17:16:31 +02003005 unsigned char buf[16];
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003006
3007 if( ssl->ticket_keys != NULL )
3008 return( 0 );
3009
3010 if( ( tkeys = polarssl_malloc( sizeof( ssl_ticket_keys ) ) ) == NULL )
3011 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3012
3013 if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->key_name, 16 ) ) != 0 )
3014 return( ret );
3015
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003016 if( ( ret = ssl->f_rng( ssl->p_rng, buf, 16 ) ) != 0 ||
3017 ( ret = aes_setkey_enc( &tkeys->enc, buf, 128 ) ) != 0 ||
3018 ( ret = aes_setkey_dec( &tkeys->dec, buf, 128 ) ) != 0 )
3019 {
3020 return( ret );
3021 }
3022
Manuel Pégourié-Gonnard56dc9e82013-08-03 17:16:31 +02003023 if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->mac_key, 16 ) ) != 0 )
3024 return( ret );
3025
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003026 ssl->ticket_keys = tkeys;
3027
3028 return( 0 );
3029}
Paul Bakkera503a632013-08-14 13:48:06 +02003030#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003031
3032/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003033 * SSL set accessors
3034 */
3035void ssl_set_endpoint( ssl_context *ssl, int endpoint )
3036{
3037 ssl->endpoint = endpoint;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003038
Paul Bakker606b4ba2013-08-14 16:52:14 +02003039#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003040 if( endpoint == SSL_IS_CLIENT )
3041 ssl->session_tickets = SSL_SESSION_TICKETS_ENABLED;
Paul Bakker606b4ba2013-08-14 16:52:14 +02003042#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003043}
3044
3045void ssl_set_authmode( ssl_context *ssl, int authmode )
3046{
3047 ssl->authmode = authmode;
3048}
3049
Paul Bakkered27a042013-04-18 22:46:23 +02003050#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003051void ssl_set_verify( ssl_context *ssl,
Paul Bakker915275b2012-09-28 07:10:55 +00003052 int (*f_vrfy)(void *, x509_cert *, int, int *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003053 void *p_vrfy )
3054{
3055 ssl->f_vrfy = f_vrfy;
3056 ssl->p_vrfy = p_vrfy;
3057}
Paul Bakkered27a042013-04-18 22:46:23 +02003058#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003059
Paul Bakker5121ce52009-01-03 21:22:43 +00003060void ssl_set_rng( ssl_context *ssl,
Paul Bakkera3d195c2011-11-27 21:07:34 +00003061 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00003062 void *p_rng )
3063{
3064 ssl->f_rng = f_rng;
3065 ssl->p_rng = p_rng;
3066}
3067
3068void ssl_set_dbg( ssl_context *ssl,
Paul Bakkerff60ee62010-03-16 21:09:09 +00003069 void (*f_dbg)(void *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00003070 void *p_dbg )
3071{
3072 ssl->f_dbg = f_dbg;
3073 ssl->p_dbg = p_dbg;
3074}
3075
3076void ssl_set_bio( ssl_context *ssl,
Paul Bakker23986e52011-04-24 08:57:21 +00003077 int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
Paul Bakker39bb4182011-06-21 07:36:43 +00003078 int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
Paul Bakker5121ce52009-01-03 21:22:43 +00003079{
3080 ssl->f_recv = f_recv;
3081 ssl->f_send = f_send;
3082 ssl->p_recv = p_recv;
3083 ssl->p_send = p_send;
3084}
3085
Paul Bakker0a597072012-09-25 21:55:46 +00003086void ssl_set_session_cache( ssl_context *ssl,
3087 int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
3088 int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00003089{
Paul Bakker0a597072012-09-25 21:55:46 +00003090 ssl->f_get_cache = f_get_cache;
3091 ssl->p_get_cache = p_get_cache;
3092 ssl->f_set_cache = f_set_cache;
3093 ssl->p_set_cache = p_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00003094}
3095
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003096int ssl_set_session( ssl_context *ssl, const ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00003097{
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003098 int ret;
3099
3100 if( ssl == NULL ||
3101 session == NULL ||
3102 ssl->session_negotiate == NULL ||
3103 ssl->endpoint != SSL_IS_CLIENT )
3104 {
3105 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3106 }
3107
3108 if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 )
3109 return( ret );
3110
Paul Bakker0a597072012-09-25 21:55:46 +00003111 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003112
3113 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003114}
3115
Paul Bakkerb68cad62012-08-23 08:34:18 +00003116void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00003117{
Paul Bakker8f4ddae2013-04-15 15:09:54 +02003118 ssl->ciphersuite_list[SSL_MINOR_VERSION_0] = ciphersuites;
3119 ssl->ciphersuite_list[SSL_MINOR_VERSION_1] = ciphersuites;
3120 ssl->ciphersuite_list[SSL_MINOR_VERSION_2] = ciphersuites;
3121 ssl->ciphersuite_list[SSL_MINOR_VERSION_3] = ciphersuites;
3122}
3123
3124void ssl_set_ciphersuites_for_version( ssl_context *ssl, const int *ciphersuites,
3125 int major, int minor )
3126{
3127 if( major != SSL_MAJOR_VERSION_3 )
3128 return;
3129
3130 if( minor < SSL_MINOR_VERSION_0 || minor > SSL_MINOR_VERSION_3 )
3131 return;
3132
3133 ssl->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00003134}
3135
Paul Bakkered27a042013-04-18 22:46:23 +02003136#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003137void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain,
Paul Bakker57b79142010-03-24 06:51:15 +00003138 x509_crl *ca_crl, const char *peer_cn )
Paul Bakker5121ce52009-01-03 21:22:43 +00003139{
3140 ssl->ca_chain = ca_chain;
Paul Bakker40ea7de2009-05-03 10:18:48 +00003141 ssl->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00003142 ssl->peer_cn = peer_cn;
3143}
3144
3145void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert,
3146 rsa_context *rsa_key )
3147{
3148 ssl->own_cert = own_cert;
3149 ssl->rsa_key = rsa_key;
3150}
3151
Paul Bakkereb2c6582012-09-27 19:15:01 +00003152void ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert,
3153 void *rsa_key,
3154 rsa_decrypt_func rsa_decrypt,
3155 rsa_sign_func rsa_sign,
3156 rsa_key_len_func rsa_key_len )
Paul Bakker43b7e352011-01-18 15:27:19 +00003157{
3158 ssl->own_cert = own_cert;
Paul Bakkereb2c6582012-09-27 19:15:01 +00003159 ssl->rsa_key = rsa_key;
3160 ssl->rsa_decrypt = rsa_decrypt;
3161 ssl->rsa_sign = rsa_sign;
3162 ssl->rsa_key_len = rsa_key_len;
Paul Bakker43b7e352011-01-18 15:27:19 +00003163}
Paul Bakkered27a042013-04-18 22:46:23 +02003164#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00003165
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003166#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
3167void ssl_set_psk( ssl_context *ssl, const unsigned char *psk, size_t psk_len,
3168 const unsigned char *psk_identity, size_t psk_identity_len )
3169{
3170 ssl->psk = psk;
3171 ssl->psk_len = psk_len;
3172 ssl->psk_identity = psk_identity;
3173 ssl->psk_identity_len = psk_identity_len;
3174}
3175#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00003176
Paul Bakker48916f92012-09-16 19:57:18 +00003177#if defined(POLARSSL_DHM_C)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003178int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00003179{
3180 int ret;
3181
Paul Bakker48916f92012-09-16 19:57:18 +00003182 if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003183 {
3184 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3185 return( ret );
3186 }
3187
Paul Bakker48916f92012-09-16 19:57:18 +00003188 if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003189 {
3190 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3191 return( ret );
3192 }
3193
3194 return( 0 );
3195}
3196
Paul Bakker1b57b062011-01-06 15:48:19 +00003197int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx )
3198{
3199 int ret;
3200
Paul Bakker48916f92012-09-16 19:57:18 +00003201 if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003202 {
3203 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3204 return( ret );
3205 }
3206
Paul Bakker48916f92012-09-16 19:57:18 +00003207 if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003208 {
3209 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3210 return( ret );
3211 }
3212
3213 return( 0 );
3214}
Paul Bakker48916f92012-09-16 19:57:18 +00003215#endif /* POLARSSL_DHM_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00003216
Paul Bakkerff60ee62010-03-16 21:09:09 +00003217int ssl_set_hostname( ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00003218{
3219 if( hostname == NULL )
Paul Bakker40e46942009-01-03 21:51:57 +00003220 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003221
3222 ssl->hostname_len = strlen( hostname );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02003223
3224 if( ssl->hostname_len + 1 == 0 )
3225 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3226
Paul Bakker6e339b52013-07-03 13:37:05 +02003227 ssl->hostname = (unsigned char *) polarssl_malloc( ssl->hostname_len + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003228
Paul Bakkerb15b8512012-01-13 13:44:06 +00003229 if( ssl->hostname == NULL )
3230 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3231
Paul Bakker3c2122f2013-06-24 19:03:14 +02003232 memcpy( ssl->hostname, (const unsigned char *) hostname,
Paul Bakker5121ce52009-01-03 21:22:43 +00003233 ssl->hostname_len );
Paul Bakkerf7abd422013-04-16 13:15:56 +02003234
Paul Bakker40ea7de2009-05-03 10:18:48 +00003235 ssl->hostname[ssl->hostname_len] = '\0';
Paul Bakker5121ce52009-01-03 21:22:43 +00003236
3237 return( 0 );
3238}
3239
Paul Bakker5701cdc2012-09-27 21:49:42 +00003240void ssl_set_sni( ssl_context *ssl,
3241 int (*f_sni)(void *, ssl_context *,
3242 const unsigned char *, size_t),
3243 void *p_sni )
3244{
3245 ssl->f_sni = f_sni;
3246 ssl->p_sni = p_sni;
3247}
3248
Paul Bakker490ecc82011-10-06 13:04:09 +00003249void ssl_set_max_version( ssl_context *ssl, int major, int minor )
3250{
3251 ssl->max_major_ver = major;
3252 ssl->max_minor_ver = minor;
3253}
3254
Paul Bakker1d29fb52012-09-28 13:28:45 +00003255void ssl_set_min_version( ssl_context *ssl, int major, int minor )
3256{
3257 ssl->min_major_ver = major;
3258 ssl->min_minor_ver = minor;
3259}
3260
Paul Bakker05decb22013-08-15 13:33:48 +02003261#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003262int ssl_set_max_frag_len( ssl_context *ssl, unsigned char mfl_code )
3263{
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003264 if( mfl_code >= sizeof( mfl_code_to_length ) ||
3265 mfl_code_to_length[mfl_code] > SSL_MAX_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003266 {
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003267 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003268 }
3269
3270 ssl->mfl_code = mfl_code;
3271
3272 return( 0 );
3273}
Paul Bakker05decb22013-08-15 13:33:48 +02003274#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003275
Paul Bakker1f2bc622013-08-15 13:45:55 +02003276#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Paul Bakker8c1ede62013-07-19 14:14:37 +02003277int ssl_set_truncated_hmac( ssl_context *ssl, int truncate )
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003278{
3279 if( ssl->endpoint != SSL_IS_CLIENT )
3280 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3281
Paul Bakker8c1ede62013-07-19 14:14:37 +02003282 ssl->trunc_hmac = truncate;
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003283
3284 return( 0 );
3285}
Paul Bakker1f2bc622013-08-15 13:45:55 +02003286#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003287
Paul Bakker48916f92012-09-16 19:57:18 +00003288void ssl_set_renegotiation( ssl_context *ssl, int renegotiation )
3289{
3290 ssl->disable_renegotiation = renegotiation;
3291}
3292
3293void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy )
3294{
3295 ssl->allow_legacy_renegotiation = allow_legacy;
3296}
3297
Paul Bakkera503a632013-08-14 13:48:06 +02003298#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003299int ssl_set_session_tickets( ssl_context *ssl, int use_tickets )
3300{
3301 ssl->session_tickets = use_tickets;
3302
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003303 if( ssl->endpoint == SSL_IS_CLIENT )
3304 return( 0 );
3305
3306 if( ssl->f_rng == NULL )
3307 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3308
3309 return( ssl_ticket_keys_init( ssl ) );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003310}
Paul Bakker606b4ba2013-08-14 16:52:14 +02003311
3312void ssl_set_session_ticket_lifetime( ssl_context *ssl, int lifetime )
3313{
3314 ssl->ticket_lifetime = lifetime;
3315}
Paul Bakkera503a632013-08-14 13:48:06 +02003316#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003317
Paul Bakker5121ce52009-01-03 21:22:43 +00003318/*
3319 * SSL get accessors
3320 */
Paul Bakker23986e52011-04-24 08:57:21 +00003321size_t ssl_get_bytes_avail( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003322{
3323 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
3324}
3325
Paul Bakkerff60ee62010-03-16 21:09:09 +00003326int ssl_get_verify_result( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003327{
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02003328 return( ssl->session->verify_result );
Paul Bakker5121ce52009-01-03 21:22:43 +00003329}
3330
Paul Bakkere3166ce2011-01-27 17:40:50 +00003331const char *ssl_get_ciphersuite( const ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00003332{
Paul Bakker926c8e42013-03-06 10:23:34 +01003333 if( ssl == NULL || ssl->session == NULL )
3334 return NULL;
3335
Paul Bakkere3166ce2011-01-27 17:40:50 +00003336 return ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00003337}
3338
Paul Bakker43ca69c2011-01-15 17:35:19 +00003339const char *ssl_get_version( const ssl_context *ssl )
3340{
3341 switch( ssl->minor_ver )
3342 {
3343 case SSL_MINOR_VERSION_0:
3344 return( "SSLv3.0" );
3345
3346 case SSL_MINOR_VERSION_1:
3347 return( "TLSv1.0" );
3348
3349 case SSL_MINOR_VERSION_2:
3350 return( "TLSv1.1" );
3351
Paul Bakker1ef83d62012-04-11 12:09:53 +00003352 case SSL_MINOR_VERSION_3:
3353 return( "TLSv1.2" );
3354
Paul Bakker43ca69c2011-01-15 17:35:19 +00003355 default:
3356 break;
3357 }
3358 return( "unknown" );
3359}
3360
Paul Bakkered27a042013-04-18 22:46:23 +02003361#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb0550d92012-10-30 07:51:03 +00003362const x509_cert *ssl_get_peer_cert( const ssl_context *ssl )
3363{
3364 if( ssl == NULL || ssl->session == NULL )
3365 return NULL;
3366
3367 return ssl->session->peer_cert;
3368}
Paul Bakkered27a042013-04-18 22:46:23 +02003369#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00003370
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003371int ssl_get_session( const ssl_context *ssl, ssl_session *dst )
3372{
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003373 if( ssl == NULL ||
3374 dst == NULL ||
3375 ssl->session == NULL ||
3376 ssl->endpoint != SSL_IS_CLIENT )
3377 {
3378 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3379 }
3380
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003381 return( ssl_session_copy( dst, ssl->session ) );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003382}
3383
Paul Bakker5121ce52009-01-03 21:22:43 +00003384/*
Paul Bakker1961b702013-01-25 14:49:24 +01003385 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003386 */
Paul Bakker1961b702013-01-25 14:49:24 +01003387int ssl_handshake_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003388{
Paul Bakker40e46942009-01-03 21:51:57 +00003389 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003390
Paul Bakker40e46942009-01-03 21:51:57 +00003391#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003392 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker1961b702013-01-25 14:49:24 +01003393 ret = ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003394#endif
3395
Paul Bakker40e46942009-01-03 21:51:57 +00003396#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003397 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker1961b702013-01-25 14:49:24 +01003398 ret = ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003399#endif
3400
Paul Bakker1961b702013-01-25 14:49:24 +01003401 return( ret );
3402}
3403
3404/*
3405 * Perform the SSL handshake
3406 */
3407int ssl_handshake( ssl_context *ssl )
3408{
3409 int ret = 0;
3410
3411 SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
3412
3413 while( ssl->state != SSL_HANDSHAKE_OVER )
3414 {
3415 ret = ssl_handshake_step( ssl );
3416
3417 if( ret != 0 )
3418 break;
3419 }
3420
Paul Bakker5121ce52009-01-03 21:22:43 +00003421 SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
3422
3423 return( ret );
3424}
3425
3426/*
Paul Bakker48916f92012-09-16 19:57:18 +00003427 * Renegotiate current connection
3428 */
3429int ssl_renegotiate( ssl_context *ssl )
3430{
3431 int ret;
3432
3433 SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
3434
3435 if( ssl->state != SSL_HANDSHAKE_OVER )
3436 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3437
3438 ssl->state = SSL_HELLO_REQUEST;
3439 ssl->renegotiation = SSL_RENEGOTIATION;
3440
3441 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3442 return( ret );
3443
3444 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3445 {
3446 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3447 return( ret );
3448 }
3449
3450 SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
3451
3452 return( 0 );
3453}
3454
3455/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003456 * Receive application data decrypted from the SSL layer
3457 */
Paul Bakker23986e52011-04-24 08:57:21 +00003458int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003459{
Paul Bakker23986e52011-04-24 08:57:21 +00003460 int ret;
3461 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003462
3463 SSL_DEBUG_MSG( 2, ( "=> read" ) );
3464
3465 if( ssl->state != SSL_HANDSHAKE_OVER )
3466 {
3467 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3468 {
3469 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3470 return( ret );
3471 }
3472 }
3473
3474 if( ssl->in_offt == NULL )
3475 {
3476 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3477 {
Paul Bakker831a7552011-05-18 13:32:51 +00003478 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3479 return( 0 );
3480
Paul Bakker5121ce52009-01-03 21:22:43 +00003481 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3482 return( ret );
3483 }
3484
3485 if( ssl->in_msglen == 0 &&
3486 ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
3487 {
3488 /*
3489 * OpenSSL sends empty messages to randomize the IV
3490 */
3491 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3492 {
Paul Bakker831a7552011-05-18 13:32:51 +00003493 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3494 return( 0 );
3495
Paul Bakker5121ce52009-01-03 21:22:43 +00003496 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3497 return( ret );
3498 }
3499 }
3500
Paul Bakker48916f92012-09-16 19:57:18 +00003501 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
3502 {
3503 SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
3504
3505 if( ssl->endpoint == SSL_IS_CLIENT &&
3506 ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST ||
3507 ssl->in_hslen != 4 ) )
3508 {
3509 SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
3510 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
3511 }
3512
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003513 if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
3514 ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
3515 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) )
Paul Bakker48916f92012-09-16 19:57:18 +00003516 {
3517 SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
3518
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003519 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakker48916f92012-09-16 19:57:18 +00003520 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003521 /*
3522 * SSLv3 does not have a "no_renegotiation" alert
3523 */
3524 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
3525 return( ret );
3526 }
3527 else
3528 {
3529 if( ( ret = ssl_send_alert_message( ssl,
3530 SSL_ALERT_LEVEL_WARNING,
3531 SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
3532 {
3533 return( ret );
3534 }
Paul Bakker48916f92012-09-16 19:57:18 +00003535 }
3536 }
3537 else
3538 {
3539 if( ( ret = ssl_renegotiate( ssl ) ) != 0 )
3540 {
3541 SSL_DEBUG_RET( 1, "ssl_renegotiate", ret );
3542 return( ret );
3543 }
3544
3545 return( POLARSSL_ERR_NET_WANT_READ );
3546 }
3547 }
3548 else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003549 {
3550 SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003551 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003552 }
3553
3554 ssl->in_offt = ssl->in_msg;
3555 }
3556
3557 n = ( len < ssl->in_msglen )
3558 ? len : ssl->in_msglen;
3559
3560 memcpy( buf, ssl->in_offt, n );
3561 ssl->in_msglen -= n;
3562
3563 if( ssl->in_msglen == 0 )
3564 /* all bytes consumed */
3565 ssl->in_offt = NULL;
3566 else
3567 /* more data available */
3568 ssl->in_offt += n;
3569
3570 SSL_DEBUG_MSG( 2, ( "<= read" ) );
3571
Paul Bakker23986e52011-04-24 08:57:21 +00003572 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003573}
3574
3575/*
3576 * Send application data to be encrypted by the SSL layer
3577 */
Paul Bakker23986e52011-04-24 08:57:21 +00003578int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003579{
Paul Bakker23986e52011-04-24 08:57:21 +00003580 int ret;
3581 size_t n;
Paul Bakker05decb22013-08-15 13:33:48 +02003582 unsigned int max_len = SSL_MAX_CONTENT_LEN;
Paul Bakker5121ce52009-01-03 21:22:43 +00003583
3584 SSL_DEBUG_MSG( 2, ( "=> write" ) );
3585
3586 if( ssl->state != SSL_HANDSHAKE_OVER )
3587 {
3588 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3589 {
3590 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3591 return( ret );
3592 }
3593 }
3594
Paul Bakker05decb22013-08-15 13:33:48 +02003595#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003596 /*
3597 * Assume mfl_code is correct since it was checked when set
3598 */
3599 max_len = mfl_code_to_length[ssl->mfl_code];
3600
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003601 /*
Paul Bakker05decb22013-08-15 13:33:48 +02003602 * Check if a smaller max length was negotiated
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003603 */
3604 if( ssl->session_out != NULL &&
3605 mfl_code_to_length[ssl->session_out->mfl_code] < max_len )
3606 {
3607 max_len = mfl_code_to_length[ssl->session_out->mfl_code];
3608 }
Paul Bakker05decb22013-08-15 13:33:48 +02003609#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003610
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003611 n = ( len < max_len) ? len : max_len;
Paul Bakker887bd502011-06-08 13:10:54 +00003612
Paul Bakker5121ce52009-01-03 21:22:43 +00003613 if( ssl->out_left != 0 )
3614 {
3615 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3616 {
3617 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3618 return( ret );
3619 }
3620 }
Paul Bakker887bd502011-06-08 13:10:54 +00003621 else
Paul Bakker1fd00bf2011-03-14 20:50:15 +00003622 {
Paul Bakker887bd502011-06-08 13:10:54 +00003623 ssl->out_msglen = n;
3624 ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
3625 memcpy( ssl->out_msg, buf, n );
3626
3627 if( ( ret = ssl_write_record( ssl ) ) != 0 )
3628 {
3629 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
3630 return( ret );
3631 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003632 }
3633
3634 SSL_DEBUG_MSG( 2, ( "<= write" ) );
3635
Paul Bakker23986e52011-04-24 08:57:21 +00003636 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003637}
3638
3639/*
3640 * Notify the peer that the connection is being closed
3641 */
3642int ssl_close_notify( ssl_context *ssl )
3643{
3644 int ret;
3645
3646 SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
3647
3648 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3649 {
3650 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3651 return( ret );
3652 }
3653
3654 if( ssl->state == SSL_HANDSHAKE_OVER )
3655 {
Paul Bakker48916f92012-09-16 19:57:18 +00003656 if( ( ret = ssl_send_alert_message( ssl,
3657 SSL_ALERT_LEVEL_WARNING,
3658 SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003659 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003660 return( ret );
3661 }
3662 }
3663
3664 SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
3665
3666 return( ret );
3667}
3668
Paul Bakker48916f92012-09-16 19:57:18 +00003669void ssl_transform_free( ssl_transform *transform )
3670{
3671#if defined(POLARSSL_ZLIB_SUPPORT)
3672 deflateEnd( &transform->ctx_deflate );
3673 inflateEnd( &transform->ctx_inflate );
3674#endif
3675
Paul Bakker61d113b2013-07-04 11:51:43 +02003676 md_free_ctx( &transform->md_ctx_enc );
3677 md_free_ctx( &transform->md_ctx_dec );
3678
Paul Bakker48916f92012-09-16 19:57:18 +00003679 memset( transform, 0, sizeof( ssl_transform ) );
3680}
3681
3682void ssl_handshake_free( ssl_handshake_params *handshake )
3683{
3684#if defined(POLARSSL_DHM_C)
3685 dhm_free( &handshake->dhm_ctx );
3686#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02003687#if defined(POLARSSL_ECDH_C)
3688 ecdh_free( &handshake->ecdh_ctx );
3689#endif
3690
Paul Bakker48916f92012-09-16 19:57:18 +00003691 memset( handshake, 0, sizeof( ssl_handshake_params ) );
3692}
3693
3694void ssl_session_free( ssl_session *session )
3695{
Paul Bakkered27a042013-04-18 22:46:23 +02003696#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker0a597072012-09-25 21:55:46 +00003697 if( session->peer_cert != NULL )
Paul Bakker48916f92012-09-16 19:57:18 +00003698 {
Paul Bakker0a597072012-09-25 21:55:46 +00003699 x509_free( session->peer_cert );
Paul Bakker6e339b52013-07-03 13:37:05 +02003700 polarssl_free( session->peer_cert );
Paul Bakker48916f92012-09-16 19:57:18 +00003701 }
Paul Bakkered27a042013-04-18 22:46:23 +02003702#endif
Paul Bakker0a597072012-09-25 21:55:46 +00003703
Paul Bakkera503a632013-08-14 13:48:06 +02003704#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02003705 polarssl_free( session->ticket );
Paul Bakkera503a632013-08-14 13:48:06 +02003706#endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02003707
Paul Bakker0a597072012-09-25 21:55:46 +00003708 memset( session, 0, sizeof( ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003709}
3710
Paul Bakker5121ce52009-01-03 21:22:43 +00003711/*
3712 * Free an SSL context
3713 */
3714void ssl_free( ssl_context *ssl )
3715{
3716 SSL_DEBUG_MSG( 2, ( "=> free" ) );
3717
Paul Bakker5121ce52009-01-03 21:22:43 +00003718 if( ssl->out_ctr != NULL )
3719 {
3720 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02003721 polarssl_free( ssl->out_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00003722 }
3723
3724 if( ssl->in_ctr != NULL )
3725 {
3726 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02003727 polarssl_free( ssl->in_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00003728 }
3729
Paul Bakker40e46942009-01-03 21:51:57 +00003730#if defined(POLARSSL_DHM_C)
Paul Bakker48916f92012-09-16 19:57:18 +00003731 mpi_free( &ssl->dhm_P );
3732 mpi_free( &ssl->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00003733#endif
3734
Paul Bakker48916f92012-09-16 19:57:18 +00003735 if( ssl->transform )
3736 {
3737 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02003738 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003739 }
3740
3741 if( ssl->handshake )
3742 {
3743 ssl_handshake_free( ssl->handshake );
3744 ssl_transform_free( ssl->transform_negotiate );
3745 ssl_session_free( ssl->session_negotiate );
3746
Paul Bakker6e339b52013-07-03 13:37:05 +02003747 polarssl_free( ssl->handshake );
3748 polarssl_free( ssl->transform_negotiate );
3749 polarssl_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00003750 }
3751
Paul Bakkerc0463502013-02-14 11:19:38 +01003752 if( ssl->session )
3753 {
3754 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02003755 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01003756 }
3757
Paul Bakkera503a632013-08-14 13:48:06 +02003758#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003759 polarssl_free( ssl->ticket_keys );
Paul Bakkera503a632013-08-14 13:48:06 +02003760#endif
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003761
Paul Bakker5121ce52009-01-03 21:22:43 +00003762 if ( ssl->hostname != NULL)
3763 {
3764 memset( ssl->hostname, 0, ssl->hostname_len );
Paul Bakker6e339b52013-07-03 13:37:05 +02003765 polarssl_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00003766 ssl->hostname_len = 0;
3767 }
3768
Paul Bakker05ef8352012-05-08 09:17:57 +00003769#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3770 if( ssl_hw_record_finish != NULL )
3771 {
3772 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) );
3773 ssl_hw_record_finish( ssl );
3774 }
3775#endif
3776
Paul Bakker5121ce52009-01-03 21:22:43 +00003777 SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00003778
Paul Bakker86f04f42013-02-14 11:20:09 +01003779 /* Actually clear after last debug message */
Paul Bakker2da561c2009-02-05 18:00:28 +00003780 memset( ssl, 0, sizeof( ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003781}
3782
3783#endif