blob: 7e7ddd7136d34fb614da3926bfad4c9ccc7fdd25 [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 Bakker0be444a2013-08-27 21:55:01 +020038#include "polarssl/debug.h"
39#include "polarssl/ssl.h"
40
Paul Bakker6e339b52013-07-03 13:37:05 +020041#if defined(POLARSSL_MEMORY_C)
42#include "polarssl/memory.h"
43#else
44#define polarssl_malloc malloc
45#define polarssl_free free
46#endif
47
Paul Bakker5121ce52009-01-03 21:22:43 +000048#include <stdlib.h>
Paul Bakker5121ce52009-01-03 21:22:43 +000049
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000050#if defined _MSC_VER && !defined strcasecmp
51#define strcasecmp _stricmp
52#endif
53
Paul Bakker05decb22013-08-15 13:33:48 +020054#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020055/*
56 * Convert max_fragment_length codes to length.
57 * RFC 6066 says:
58 * enum{
59 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
60 * } MaxFragmentLength;
61 * and we add 0 -> extension unused
62 */
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +020063static unsigned int mfl_code_to_length[SSL_MAX_FRAG_LEN_INVALID] =
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020064{
65 SSL_MAX_CONTENT_LEN, /* SSL_MAX_FRAG_LEN_NONE */
66 512, /* SSL_MAX_FRAG_LEN_512 */
67 1024, /* SSL_MAX_FRAG_LEN_1024 */
68 2048, /* SSL_MAX_FRAG_LEN_2048 */
69 4096, /* SSL_MAX_FRAG_LEN_4096 */
70};
Paul Bakker05decb22013-08-15 13:33:48 +020071#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020072
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020073static int ssl_session_copy( ssl_session *dst, const ssl_session *src )
74{
75 int ret;
76
77 ssl_session_free( dst );
78 memcpy( dst, src, sizeof( ssl_session ) );
79
80#if defined(POLARSSL_X509_PARSE_C)
81 if( src->peer_cert != NULL )
82 {
83 if( ( dst->peer_cert = polarssl_malloc( sizeof(x509_cert) ) ) == NULL )
84 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
85
86 memset( dst->peer_cert, 0, sizeof(x509_cert) );
87
88 if( ( ret = x509parse_crt( dst->peer_cert, src->peer_cert->raw.p,
89 src->peer_cert->raw.len ) != 0 ) )
90 {
91 polarssl_free( dst->peer_cert );
92 dst->peer_cert = NULL;
93 return( ret );
94 }
95 }
96#endif /* POLARSSL_X509_PARSE_C */
97
Paul Bakkera503a632013-08-14 13:48:06 +020098#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020099 if( src->ticket != NULL )
100 {
101 if( ( dst->ticket = polarssl_malloc( src->ticket_len ) ) == NULL )
102 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
103
104 memcpy( dst->ticket, src->ticket, src->ticket_len );
105 }
Paul Bakkera503a632013-08-14 13:48:06 +0200106#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200107
108 return( 0 );
109}
110
Paul Bakker05ef8352012-05-08 09:17:57 +0000111#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
112int (*ssl_hw_record_init)(ssl_context *ssl,
113 const unsigned char *key_enc, const unsigned char *key_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100114 size_t keylen,
Paul Bakker05ef8352012-05-08 09:17:57 +0000115 const unsigned char *iv_enc, const unsigned char *iv_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100116 size_t ivlen,
117 const unsigned char *mac_enc, const unsigned char *mac_dec,
118 size_t maclen) = NULL;
119int (*ssl_hw_record_activate)(ssl_context *ssl, int direction) = NULL;
Paul Bakker05ef8352012-05-08 09:17:57 +0000120int (*ssl_hw_record_reset)(ssl_context *ssl) = NULL;
121int (*ssl_hw_record_write)(ssl_context *ssl) = NULL;
122int (*ssl_hw_record_read)(ssl_context *ssl) = NULL;
123int (*ssl_hw_record_finish)(ssl_context *ssl) = NULL;
124#endif
125
Paul Bakker5121ce52009-01-03 21:22:43 +0000126/*
127 * Key material generation
128 */
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200129#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200130static int ssl3_prf( const unsigned char *secret, size_t slen,
131 const char *label,
132 const unsigned char *random, size_t rlen,
Paul Bakker5f70b252012-09-13 14:23:06 +0000133 unsigned char *dstbuf, size_t dlen )
134{
135 size_t i;
136 md5_context md5;
137 sha1_context sha1;
138 unsigned char padding[16];
139 unsigned char sha1sum[20];
140 ((void)label);
141
142 /*
143 * SSLv3:
144 * block =
145 * MD5( secret + SHA1( 'A' + secret + random ) ) +
146 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
147 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
148 * ...
149 */
150 for( i = 0; i < dlen / 16; i++ )
151 {
152 memset( padding, 'A' + i, 1 + i );
153
154 sha1_starts( &sha1 );
155 sha1_update( &sha1, padding, 1 + i );
156 sha1_update( &sha1, secret, slen );
157 sha1_update( &sha1, random, rlen );
158 sha1_finish( &sha1, sha1sum );
159
160 md5_starts( &md5 );
161 md5_update( &md5, secret, slen );
162 md5_update( &md5, sha1sum, 20 );
163 md5_finish( &md5, dstbuf + i * 16 );
164 }
165
166 memset( &md5, 0, sizeof( md5 ) );
167 memset( &sha1, 0, sizeof( sha1 ) );
168
169 memset( padding, 0, sizeof( padding ) );
170 memset( sha1sum, 0, sizeof( sha1sum ) );
171
172 return( 0 );
173}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200174#endif /* POLARSSL_SSL_PROTO_SSL3 */
Paul Bakker5f70b252012-09-13 14:23:06 +0000175
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200176#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200177static int tls1_prf( const unsigned char *secret, size_t slen,
178 const char *label,
179 const unsigned char *random, size_t rlen,
Paul Bakker23986e52011-04-24 08:57:21 +0000180 unsigned char *dstbuf, size_t dlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000181{
Paul Bakker23986e52011-04-24 08:57:21 +0000182 size_t nb, hs;
183 size_t i, j, k;
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200184 const unsigned char *S1, *S2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000185 unsigned char tmp[128];
186 unsigned char h_i[20];
187
188 if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
Paul Bakker40e46942009-01-03 21:51:57 +0000189 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000190
191 hs = ( slen + 1 ) / 2;
192 S1 = secret;
193 S2 = secret + slen - hs;
194
195 nb = strlen( label );
196 memcpy( tmp + 20, label, nb );
197 memcpy( tmp + 20 + nb, random, rlen );
198 nb += rlen;
199
200 /*
201 * First compute P_md5(secret,label+random)[0..dlen]
202 */
203 md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
204
205 for( i = 0; i < dlen; i += 16 )
206 {
207 md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
208 md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp );
209
210 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
211
212 for( j = 0; j < k; j++ )
213 dstbuf[i + j] = h_i[j];
214 }
215
216 /*
217 * XOR out with P_sha1(secret,label+random)[0..dlen]
218 */
219 sha1_hmac( S2, hs, tmp + 20, nb, tmp );
220
221 for( i = 0; i < dlen; i += 20 )
222 {
223 sha1_hmac( S2, hs, tmp, 20 + nb, h_i );
224 sha1_hmac( S2, hs, tmp, 20, tmp );
225
226 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
227
228 for( j = 0; j < k; j++ )
229 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
230 }
231
232 memset( tmp, 0, sizeof( tmp ) );
233 memset( h_i, 0, sizeof( h_i ) );
234
235 return( 0 );
236}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200237#endif /* POLARSSL_SSL_PROTO_TLS1) || POLARSSL_SSL_PROTO_TLS1_1 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000238
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200239#if defined(POLARSSL_SSL_PROTO_TLS1_2)
240#if defined(POLARSSL_SHA256_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200241static int tls_prf_sha256( const unsigned char *secret, size_t slen,
242 const char *label,
243 const unsigned char *random, size_t rlen,
Paul Bakker1ef83d62012-04-11 12:09:53 +0000244 unsigned char *dstbuf, size_t dlen )
245{
246 size_t nb;
247 size_t i, j, k;
248 unsigned char tmp[128];
249 unsigned char h_i[32];
250
251 if( sizeof( tmp ) < 32 + strlen( label ) + rlen )
252 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
253
254 nb = strlen( label );
255 memcpy( tmp + 32, label, nb );
256 memcpy( tmp + 32 + nb, random, rlen );
257 nb += rlen;
258
259 /*
260 * Compute P_<hash>(secret, label + random)[0..dlen]
261 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200262 sha256_hmac( secret, slen, tmp + 32, nb, tmp, 0 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000263
264 for( i = 0; i < dlen; i += 32 )
265 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200266 sha256_hmac( secret, slen, tmp, 32 + nb, h_i, 0 );
267 sha256_hmac( secret, slen, tmp, 32, tmp, 0 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000268
269 k = ( i + 32 > dlen ) ? dlen % 32 : 32;
270
271 for( j = 0; j < k; j++ )
272 dstbuf[i + j] = h_i[j];
273 }
274
275 memset( tmp, 0, sizeof( tmp ) );
276 memset( h_i, 0, sizeof( h_i ) );
277
278 return( 0 );
279}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200280#endif /* POLARSSL_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000281
Paul Bakker9e36f042013-06-30 14:34:05 +0200282#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200283static int tls_prf_sha384( const unsigned char *secret, size_t slen,
284 const char *label,
285 const unsigned char *random, size_t rlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000286 unsigned char *dstbuf, size_t dlen )
287{
288 size_t nb;
289 size_t i, j, k;
290 unsigned char tmp[128];
291 unsigned char h_i[48];
292
293 if( sizeof( tmp ) < 48 + strlen( label ) + rlen )
294 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
295
296 nb = strlen( label );
297 memcpy( tmp + 48, label, nb );
298 memcpy( tmp + 48 + nb, random, rlen );
299 nb += rlen;
300
301 /*
302 * Compute P_<hash>(secret, label + random)[0..dlen]
303 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200304 sha512_hmac( secret, slen, tmp + 48, nb, tmp, 1 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000305
306 for( i = 0; i < dlen; i += 48 )
307 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200308 sha512_hmac( secret, slen, tmp, 48 + nb, h_i, 1 );
309 sha512_hmac( secret, slen, tmp, 48, tmp, 1 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000310
311 k = ( i + 48 > dlen ) ? dlen % 48 : 48;
312
313 for( j = 0; j < k; j++ )
314 dstbuf[i + j] = h_i[j];
315 }
316
317 memset( tmp, 0, sizeof( tmp ) );
318 memset( h_i, 0, sizeof( h_i ) );
319
320 return( 0 );
321}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200322#endif /* POLARSSL_SHA512_C */
323#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +0000324
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200325static void ssl_update_checksum_start(ssl_context *, const unsigned char *, size_t);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200326
327#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
328 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200329static void ssl_update_checksum_md5sha1(ssl_context *, const unsigned char *, size_t);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200330#endif
Paul Bakker380da532012-04-18 16:10:25 +0000331
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200332#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker380da532012-04-18 16:10:25 +0000333static void ssl_calc_verify_ssl(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000334static void ssl_calc_finished_ssl(ssl_context *,unsigned char *,int);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200335#endif
336
337#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
338static void ssl_calc_verify_tls(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000339static void ssl_calc_finished_tls(ssl_context *,unsigned char *,int);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200340#endif
341
342#if defined(POLARSSL_SSL_PROTO_TLS1_2)
343#if defined(POLARSSL_SHA256_C)
344static void ssl_update_checksum_sha256(ssl_context *, const unsigned char *, size_t);
345static void ssl_calc_verify_tls_sha256(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000346static void ssl_calc_finished_tls_sha256(ssl_context *,unsigned char *,int);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200347#endif
Paul Bakker769075d2012-11-24 11:26:46 +0100348
Paul Bakker9e36f042013-06-30 14:34:05 +0200349#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200350static void ssl_update_checksum_sha384(ssl_context *, const unsigned char *, size_t);
Paul Bakker769075d2012-11-24 11:26:46 +0100351static void ssl_calc_verify_tls_sha384(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000352static void ssl_calc_finished_tls_sha384(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100353#endif
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200354#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000355
Paul Bakker5121ce52009-01-03 21:22:43 +0000356int ssl_derive_keys( ssl_context *ssl )
357{
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200358 int ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000359 unsigned char tmp[64];
Paul Bakker5121ce52009-01-03 21:22:43 +0000360 unsigned char keyblk[256];
361 unsigned char *key1;
362 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100363 unsigned char *mac_enc;
364 unsigned char *mac_dec;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000365 unsigned int iv_copy_len;
Paul Bakker68884e32013-01-07 18:20:04 +0100366 const cipher_info_t *cipher_info;
367 const md_info_t *md_info;
368
Paul Bakker48916f92012-09-16 19:57:18 +0000369 ssl_session *session = ssl->session_negotiate;
370 ssl_transform *transform = ssl->transform_negotiate;
371 ssl_handshake_params *handshake = ssl->handshake;
Paul Bakker5121ce52009-01-03 21:22:43 +0000372
373 SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
374
Paul Bakker68884e32013-01-07 18:20:04 +0100375 cipher_info = cipher_info_from_type( transform->ciphersuite_info->cipher );
376 if( cipher_info == NULL )
377 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200378 SSL_DEBUG_MSG( 1, ( "cipher info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100379 transform->ciphersuite_info->cipher ) );
380 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
381 }
382
383 md_info = md_info_from_type( transform->ciphersuite_info->mac );
384 if( md_info == NULL )
385 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200386 SSL_DEBUG_MSG( 1, ( "md info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100387 transform->ciphersuite_info->mac ) );
388 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
389 }
390
Paul Bakker5121ce52009-01-03 21:22:43 +0000391 /*
Paul Bakkerca4ab492012-04-18 14:23:57 +0000392 * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
Paul Bakker1ef83d62012-04-11 12:09:53 +0000393 */
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200394#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker1ef83d62012-04-11 12:09:53 +0000395 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000396 {
Paul Bakker48916f92012-09-16 19:57:18 +0000397 handshake->tls_prf = ssl3_prf;
398 handshake->calc_verify = ssl_calc_verify_ssl;
399 handshake->calc_finished = ssl_calc_finished_ssl;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000400 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200401 else
402#endif
403#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
404 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000405 {
Paul Bakker48916f92012-09-16 19:57:18 +0000406 handshake->tls_prf = tls1_prf;
407 handshake->calc_verify = ssl_calc_verify_tls;
408 handshake->calc_finished = ssl_calc_finished_tls;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000409 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200410 else
411#endif
412#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker9e36f042013-06-30 14:34:05 +0200413#if defined(POLARSSL_SHA512_C)
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200414 if( ssl->minor_ver == SSL_MINOR_VERSION_3 &&
415 transform->ciphersuite_info->mac == POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000416 {
Paul Bakker48916f92012-09-16 19:57:18 +0000417 handshake->tls_prf = tls_prf_sha384;
418 handshake->calc_verify = ssl_calc_verify_tls_sha384;
419 handshake->calc_finished = ssl_calc_finished_tls_sha384;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000420 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000421 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200422#endif
423#if defined(POLARSSL_SHA256_C)
424 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000425 {
Paul Bakker48916f92012-09-16 19:57:18 +0000426 handshake->tls_prf = tls_prf_sha256;
427 handshake->calc_verify = ssl_calc_verify_tls_sha256;
428 handshake->calc_finished = ssl_calc_finished_tls_sha256;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000429 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200430 else
431#endif
432#endif
Paul Bakker577e0062013-08-28 11:57:20 +0200433 {
434 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200435 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +0200436 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000437
438 /*
Paul Bakker5121ce52009-01-03 21:22:43 +0000439 * SSLv3:
440 * master =
441 * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
442 * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
443 * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
Paul Bakkerf7abd422013-04-16 13:15:56 +0200444 *
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200445 * TLSv1+:
Paul Bakker5121ce52009-01-03 21:22:43 +0000446 * master = PRF( premaster, "master secret", randbytes )[0..47]
447 */
Paul Bakker0a597072012-09-25 21:55:46 +0000448 if( handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000449 {
Paul Bakker48916f92012-09-16 19:57:18 +0000450 SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
451 handshake->pmslen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000452
Paul Bakker48916f92012-09-16 19:57:18 +0000453 handshake->tls_prf( handshake->premaster, handshake->pmslen,
454 "master secret",
455 handshake->randbytes, 64, session->master, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000456
Paul Bakker48916f92012-09-16 19:57:18 +0000457 memset( handshake->premaster, 0, sizeof( handshake->premaster ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000458 }
459 else
460 SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
461
462 /*
463 * Swap the client and server random values.
464 */
Paul Bakker48916f92012-09-16 19:57:18 +0000465 memcpy( tmp, handshake->randbytes, 64 );
466 memcpy( handshake->randbytes, tmp + 32, 32 );
467 memcpy( handshake->randbytes + 32, tmp, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000468 memset( tmp, 0, sizeof( tmp ) );
469
470 /*
471 * SSLv3:
472 * key block =
473 * MD5( master + SHA1( 'A' + master + randbytes ) ) +
474 * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
475 * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
476 * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
477 * ...
478 *
479 * TLSv1:
480 * key block = PRF( master, "key expansion", randbytes )
481 */
Paul Bakker48916f92012-09-16 19:57:18 +0000482 handshake->tls_prf( session->master, 48, "key expansion",
483 handshake->randbytes, 64, keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000484
Paul Bakker48916f92012-09-16 19:57:18 +0000485 SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
486 ssl_get_ciphersuite_name( session->ciphersuite ) ) );
487 SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
488 SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000489 SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
490
Paul Bakker48916f92012-09-16 19:57:18 +0000491 memset( handshake->randbytes, 0, sizeof( handshake->randbytes ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000492
493 /*
494 * Determine the appropriate key, IV and MAC length.
495 */
Paul Bakker68884e32013-01-07 18:20:04 +0100496
497 if( cipher_info->mode == POLARSSL_MODE_GCM )
Paul Bakker5121ce52009-01-03 21:22:43 +0000498 {
Paul Bakker68884e32013-01-07 18:20:04 +0100499 transform->keylen = cipher_info->key_length;
500 transform->keylen /= 8;
501 transform->minlen = 1;
502 transform->ivlen = 12;
503 transform->fixed_ivlen = 4;
504 transform->maclen = 0;
505 }
506 else
507 {
508 if( md_info->type != POLARSSL_MD_NONE )
509 {
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200510 int ret;
511
Paul Bakker61d113b2013-07-04 11:51:43 +0200512 if( ( ret = md_init_ctx( &transform->md_ctx_enc, md_info ) ) != 0 )
513 {
514 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
515 return( ret );
516 }
517
518 if( ( ret = md_init_ctx( &transform->md_ctx_dec, md_info ) ) != 0 )
519 {
520 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
521 return( ret );
522 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000523
Paul Bakker68884e32013-01-07 18:20:04 +0100524 transform->maclen = md_get_size( md_info );
Manuel Pégourié-Gonnard277f7f22013-07-19 12:19:21 +0200525
Paul Bakker1f2bc622013-08-15 13:45:55 +0200526#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard277f7f22013-07-19 12:19:21 +0200527 /*
528 * If HMAC is to be truncated, we shall keep the leftmost bytes,
529 * (rfc 6066 page 13 or rfc 2104 section 4),
530 * so we only need to adjust the length here.
531 */
532 if( session->trunc_hmac == SSL_TRUNC_HMAC_ENABLED )
533 transform->maclen = SSL_TRUNCATED_HMAC_LEN;
Paul Bakker1f2bc622013-08-15 13:45:55 +0200534#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Paul Bakker68884e32013-01-07 18:20:04 +0100535 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000536
Paul Bakker68884e32013-01-07 18:20:04 +0100537 transform->keylen = cipher_info->key_length;
538 transform->keylen /= 8;
539 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +0000540
Paul Bakker68884e32013-01-07 18:20:04 +0100541 transform->minlen = transform->keylen;
542 if( transform->minlen < transform->maclen )
543 {
544 if( cipher_info->mode == POLARSSL_MODE_STREAM )
545 transform->minlen = transform->maclen;
546 else
547 transform->minlen += transform->keylen;
548 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000549 }
550
551 SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000552 transform->keylen, transform->minlen, transform->ivlen,
553 transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000554
555 /*
556 * Finally setup the cipher contexts, IVs and MAC secrets.
557 */
558 if( ssl->endpoint == SSL_IS_CLIENT )
559 {
Paul Bakker48916f92012-09-16 19:57:18 +0000560 key1 = keyblk + transform->maclen * 2;
561 key2 = keyblk + transform->maclen * 2 + transform->keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000562
Paul Bakker68884e32013-01-07 18:20:04 +0100563 mac_enc = keyblk;
564 mac_dec = keyblk + transform->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000565
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000566 /*
567 * This is not used in TLS v1.1.
568 */
Paul Bakker48916f92012-09-16 19:57:18 +0000569 iv_copy_len = ( transform->fixed_ivlen ) ?
570 transform->fixed_ivlen : transform->ivlen;
571 memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len );
572 memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000573 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000574 }
575 else
576 {
Paul Bakker48916f92012-09-16 19:57:18 +0000577 key1 = keyblk + transform->maclen * 2 + transform->keylen;
578 key2 = keyblk + transform->maclen * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000579
Paul Bakker68884e32013-01-07 18:20:04 +0100580 mac_enc = keyblk + transform->maclen;
581 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +0000582
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000583 /*
584 * This is not used in TLS v1.1.
585 */
Paul Bakker48916f92012-09-16 19:57:18 +0000586 iv_copy_len = ( transform->fixed_ivlen ) ?
587 transform->fixed_ivlen : transform->ivlen;
588 memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len );
589 memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000590 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000591 }
592
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200593#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker68884e32013-01-07 18:20:04 +0100594 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
595 {
596 memcpy( transform->mac_enc, mac_enc, transform->maclen );
597 memcpy( transform->mac_dec, mac_dec, transform->maclen );
598 }
599 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200600#endif
601#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
602 defined(POLARSSL_SSL_PROTO_TLS1_2)
603 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 )
Paul Bakker68884e32013-01-07 18:20:04 +0100604 {
605 md_hmac_starts( &transform->md_ctx_enc, mac_enc, transform->maclen );
606 md_hmac_starts( &transform->md_ctx_dec, mac_dec, transform->maclen );
607 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200608 else
609#endif
Paul Bakker577e0062013-08-28 11:57:20 +0200610 {
611 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200612 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +0200613 }
Paul Bakker68884e32013-01-07 18:20:04 +0100614
Paul Bakker05ef8352012-05-08 09:17:57 +0000615#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
616 if( ssl_hw_record_init != NULL)
617 {
618 int ret = 0;
619
620 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) );
621
Paul Bakker07eb38b2012-12-19 14:42:06 +0100622 if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->keylen,
623 transform->iv_enc, transform->iv_dec,
624 iv_copy_len,
Paul Bakker68884e32013-01-07 18:20:04 +0100625 mac_enc, mac_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100626 transform->maclen ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +0000627 {
628 SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret );
629 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
630 }
631 }
632#endif
633
Paul Bakker68884e32013-01-07 18:20:04 +0100634 switch( cipher_info->type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000635 {
Paul Bakker68884e32013-01-07 18:20:04 +0100636 case POLARSSL_CIPHER_ARC4_128:
Paul Bakker68884e32013-01-07 18:20:04 +0100637 case POLARSSL_CIPHER_DES_EDE3_CBC:
Paul Bakkercca5b812013-08-31 17:40:26 +0200638 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
639 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
Paul Bakker68884e32013-01-07 18:20:04 +0100640 case POLARSSL_CIPHER_AES_128_CBC:
641 case POLARSSL_CIPHER_AES_256_CBC:
Paul Bakkercca5b812013-08-31 17:40:26 +0200642 case POLARSSL_CIPHER_DES_CBC:
Manuel Pégourié-Gonnard226d5da2013-09-05 13:19:22 +0200643 case POLARSSL_CIPHER_AES_128_GCM:
644 case POLARSSL_CIPHER_AES_256_GCM:
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200645 if( ( ret = cipher_init_ctx( &transform->cipher_ctx_enc,
646 cipher_info ) ) != 0 )
647 {
Paul Bakker45125bc2013-09-04 16:47:11 +0200648 SSL_DEBUG_RET( 1, "cipher_init_ctx", ret );
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200649 return( ret );
650 }
651
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200652 if( ( ret = cipher_init_ctx( &transform->cipher_ctx_dec,
653 cipher_info ) ) != 0 )
654 {
Paul Bakker45125bc2013-09-04 16:47:11 +0200655 SSL_DEBUG_RET( 1, "cipher_init_ctx", ret );
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200656 return( ret );
657 }
658
Paul Bakker45125bc2013-09-04 16:47:11 +0200659 if( ( ret = cipher_setkey( &transform->cipher_ctx_enc, key1,
660 cipher_info->key_length,
661 POLARSSL_ENCRYPT ) ) != 0 )
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200662 {
Paul Bakker45125bc2013-09-04 16:47:11 +0200663 SSL_DEBUG_RET( 1, "cipher_setkey", ret );
664 return( ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200665 }
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200666
Paul Bakker45125bc2013-09-04 16:47:11 +0200667 if( ( ret = cipher_setkey( &transform->cipher_ctx_dec, key2,
668 cipher_info->key_length,
669 POLARSSL_DECRYPT ) ) != 0 )
670 {
671 SSL_DEBUG_RET( 1, "cipher_setkey", ret );
672 return( ret );
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200673 }
674
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200675 if( cipher_info->mode == POLARSSL_MODE_CBC )
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200676 {
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200677 if( ( ret = cipher_set_padding_mode( &transform->cipher_ctx_enc,
678 POLARSSL_PADDING_NONE ) ) != 0 )
679 {
Paul Bakker45125bc2013-09-04 16:47:11 +0200680 SSL_DEBUG_RET( 1, "cipher_set_padding_mode", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200681 return( ret );
682 }
683
684 if( ( ret = cipher_set_padding_mode( &transform->cipher_ctx_dec,
685 POLARSSL_PADDING_NONE ) ) != 0 )
686 {
Paul Bakker45125bc2013-09-04 16:47:11 +0200687 SSL_DEBUG_RET( 1, "cipher_set_padding_mode", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200688 return( ret );
689 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200690 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000691 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000692
Paul Bakker68884e32013-01-07 18:20:04 +0100693 case POLARSSL_CIPHER_NULL:
694 break;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000695
Paul Bakker5121ce52009-01-03 21:22:43 +0000696 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000697 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000698 }
699
700 memset( keyblk, 0, sizeof( keyblk ) );
701
Paul Bakker2770fbd2012-07-03 13:30:23 +0000702#if defined(POLARSSL_ZLIB_SUPPORT)
703 // Initialize compression
704 //
Paul Bakker48916f92012-09-16 19:57:18 +0000705 if( session->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000706 {
707 SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
708
Paul Bakker48916f92012-09-16 19:57:18 +0000709 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
710 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000711
Paul Bakker48916f92012-09-16 19:57:18 +0000712 if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK ||
713 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000714 {
715 SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
716 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
717 }
718 }
719#endif /* POLARSSL_ZLIB_SUPPORT */
720
Paul Bakker5121ce52009-01-03 21:22:43 +0000721 SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
722
723 return( 0 );
724}
725
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200726#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker380da532012-04-18 16:10:25 +0000727void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000728{
729 md5_context md5;
730 sha1_context sha1;
731 unsigned char pad_1[48];
732 unsigned char pad_2[48];
733
Paul Bakker380da532012-04-18 16:10:25 +0000734 SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000735
Paul Bakker48916f92012-09-16 19:57:18 +0000736 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
737 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000738
Paul Bakker380da532012-04-18 16:10:25 +0000739 memset( pad_1, 0x36, 48 );
740 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000741
Paul Bakker48916f92012-09-16 19:57:18 +0000742 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000743 md5_update( &md5, pad_1, 48 );
744 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000745
Paul Bakker380da532012-04-18 16:10:25 +0000746 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +0000747 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000748 md5_update( &md5, pad_2, 48 );
749 md5_update( &md5, hash, 16 );
750 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000751
Paul Bakker48916f92012-09-16 19:57:18 +0000752 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000753 sha1_update( &sha1, pad_1, 40 );
754 sha1_finish( &sha1, hash + 16 );
755
756 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +0000757 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000758 sha1_update( &sha1, pad_2, 40 );
759 sha1_update( &sha1, hash + 16, 20 );
760 sha1_finish( &sha1, hash + 16 );
761
762 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
763 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
764
765 return;
766}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200767#endif
Paul Bakker380da532012-04-18 16:10:25 +0000768
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200769#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker380da532012-04-18 16:10:25 +0000770void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] )
771{
772 md5_context md5;
773 sha1_context sha1;
774
775 SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
776
Paul Bakker48916f92012-09-16 19:57:18 +0000777 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
778 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000779
Paul Bakker48916f92012-09-16 19:57:18 +0000780 md5_finish( &md5, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000781 sha1_finish( &sha1, hash + 16 );
782
783 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
784 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
785
786 return;
787}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200788#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 */
Paul Bakker380da532012-04-18 16:10:25 +0000789
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200790#if defined(POLARSSL_SSL_PROTO_TLS1_2)
791#if defined(POLARSSL_SHA256_C)
Paul Bakker380da532012-04-18 16:10:25 +0000792void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] )
793{
Paul Bakker9e36f042013-06-30 14:34:05 +0200794 sha256_context sha256;
Paul Bakker380da532012-04-18 16:10:25 +0000795
796 SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
797
Paul Bakker9e36f042013-06-30 14:34:05 +0200798 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
799 sha256_finish( &sha256, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000800
801 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
802 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
803
804 return;
805}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200806#endif /* POLARSSL_SHA256_C */
Paul Bakker380da532012-04-18 16:10:25 +0000807
Paul Bakker9e36f042013-06-30 14:34:05 +0200808#if defined(POLARSSL_SHA512_C)
Paul Bakker380da532012-04-18 16:10:25 +0000809void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] )
810{
Paul Bakker9e36f042013-06-30 14:34:05 +0200811 sha512_context sha512;
Paul Bakker380da532012-04-18 16:10:25 +0000812
813 SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
814
Paul Bakker9e36f042013-06-30 14:34:05 +0200815 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
816 sha512_finish( &sha512, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000817
Paul Bakkerca4ab492012-04-18 14:23:57 +0000818 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000819 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
820
821 return;
822}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200823#endif /* POLARSSL_SHA512_C */
824#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000825
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200826#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +0000827/*
828 * SSLv3.0 MAC functions
829 */
Paul Bakker68884e32013-01-07 18:20:04 +0100830static void ssl_mac( md_context_t *md_ctx, unsigned char *secret,
831 unsigned char *buf, size_t len,
832 unsigned char *ctr, int type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000833{
834 unsigned char header[11];
835 unsigned char padding[48];
Paul Bakker68884e32013-01-07 18:20:04 +0100836 int padlen = 0;
837 int md_size = md_get_size( md_ctx->md_info );
838 int md_type = md_get_type( md_ctx->md_info );
839
840 if( md_type == POLARSSL_MD_MD5 )
841 padlen = 48;
842 else if( md_type == POLARSSL_MD_SHA1 )
843 padlen = 40;
844 else if( md_type == POLARSSL_MD_SHA256 )
845 padlen = 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000846
847 memcpy( header, ctr, 8 );
848 header[ 8] = (unsigned char) type;
849 header[ 9] = (unsigned char)( len >> 8 );
850 header[10] = (unsigned char)( len );
851
Paul Bakker68884e32013-01-07 18:20:04 +0100852 memset( padding, 0x36, padlen );
853 md_starts( md_ctx );
854 md_update( md_ctx, secret, md_size );
855 md_update( md_ctx, padding, padlen );
856 md_update( md_ctx, header, 11 );
857 md_update( md_ctx, buf, len );
858 md_finish( md_ctx, buf + len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000859
Paul Bakker68884e32013-01-07 18:20:04 +0100860 memset( padding, 0x5C, padlen );
861 md_starts( md_ctx );
862 md_update( md_ctx, secret, md_size );
863 md_update( md_ctx, padding, padlen );
864 md_update( md_ctx, buf + len, md_size );
865 md_finish( md_ctx, buf + len );
Paul Bakker5f70b252012-09-13 14:23:06 +0000866}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200867#endif /* POLARSSL_SSL_PROTO_SSL3 */
Paul Bakker5f70b252012-09-13 14:23:06 +0000868
Paul Bakker5121ce52009-01-03 21:22:43 +0000869/*
870 * Encryption/decryption functions
Paul Bakkerf7abd422013-04-16 13:15:56 +0200871 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000872static int ssl_encrypt_buf( ssl_context *ssl )
873{
Paul Bakker23986e52011-04-24 08:57:21 +0000874 size_t i, padlen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000875
876 SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
877
878 /*
879 * Add MAC then encrypt
880 */
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200881#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +0000882 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
883 {
Paul Bakker68884e32013-01-07 18:20:04 +0100884 ssl_mac( &ssl->transform_out->md_ctx_enc,
885 ssl->transform_out->mac_enc,
886 ssl->out_msg, ssl->out_msglen,
887 ssl->out_ctr, ssl->out_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +0000888 }
889 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200890#endif
891#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
892 defined(POLARSSL_SSL_PROTO_TLS1_2)
893 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000894 {
Paul Bakker68884e32013-01-07 18:20:04 +0100895 md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 13 );
896 md_hmac_update( &ssl->transform_out->md_ctx_enc,
897 ssl->out_msg, ssl->out_msglen );
898 md_hmac_finish( &ssl->transform_out->md_ctx_enc,
899 ssl->out_msg + ssl->out_msglen );
900 md_hmac_reset( &ssl->transform_out->md_ctx_enc );
Paul Bakker5121ce52009-01-03 21:22:43 +0000901 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200902 else
903#endif
Paul Bakker577e0062013-08-28 11:57:20 +0200904 {
905 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200906 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +0200907 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000908
909 SSL_DEBUG_BUF( 4, "computed mac",
Paul Bakker48916f92012-09-16 19:57:18 +0000910 ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000911
Paul Bakker48916f92012-09-16 19:57:18 +0000912 ssl->out_msglen += ssl->transform_out->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000913
Paul Bakker68884e32013-01-07 18:20:04 +0100914#if defined(POLARSSL_CIPHER_NULL_CIPHER)
915 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
916 {
917 padlen = 0;
918 }
919 else
920#endif /* POLARSSL_CIPHER_NULL_CIPHER */
Paul Bakker68884e32013-01-07 18:20:04 +0100921 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000922 {
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200923 int ret;
924 size_t olen = 0;
925
Paul Bakker5121ce52009-01-03 21:22:43 +0000926 padlen = 0;
927
928 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
929 "including %d bytes of padding",
930 ssl->out_msglen, 0 ) );
931
932 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
933 ssl->out_msg, ssl->out_msglen );
934
Paul Bakker45125bc2013-09-04 16:47:11 +0200935 if( ( ret = cipher_reset( &ssl->transform_out->cipher_ctx_enc ) ) != 0 )
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200936 {
Paul Bakker45125bc2013-09-04 16:47:11 +0200937 SSL_DEBUG_RET( 1, "cipher_reset", ret );
938 return( ret );
939 }
940
941 if( ( ret = cipher_set_iv( &ssl->transform_out->cipher_ctx_enc,
942 ssl->transform_out->iv_enc,
943 ssl->transform_out->ivlen ) ) != 0 )
944 {
945 SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200946 return( ret );
947 }
948
949 if( ( ret = cipher_update( &ssl->transform_out->cipher_ctx_enc,
950 ssl->out_msg, ssl->out_msglen, ssl->out_msg,
951 &olen ) ) != 0 )
952 {
Paul Bakker45125bc2013-09-04 16:47:11 +0200953 SSL_DEBUG_RET( 1, "cipher_update", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200954 return( ret );
955 }
956
957 if( ssl->out_msglen != olen )
958 {
959 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect %d %d",
960 ssl->out_msglen, olen ) );
961 // TODO Real error number
962 return( -1 );
963 }
964
965 if( ( ret = cipher_finish( &ssl->transform_out->cipher_ctx_enc,
Paul Bakker45125bc2013-09-04 16:47:11 +0200966 ssl->out_msg + olen, &olen ) ) != 0 )
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200967 {
Paul Bakker45125bc2013-09-04 16:47:11 +0200968 SSL_DEBUG_RET( 1, "cipher_finish", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200969 return( ret );
970 }
971
972 if( 0 != olen )
973 {
974 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect %d %d",
975 0, olen ) );
976 // TODO Real error number
977 return( -1 );
978 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000979 }
Paul Bakker68884e32013-01-07 18:20:04 +0100980 else
Paul Bakker68884e32013-01-07 18:20:04 +0100981#if defined(POLARSSL_GCM_C)
982 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
983 ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000984 {
985 size_t enc_msglen;
986 unsigned char *enc_msg;
987 unsigned char add_data[13];
988 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
989
990 padlen = 0;
991 enc_msglen = ssl->out_msglen;
992
993 memcpy( add_data, ssl->out_ctr, 8 );
994 add_data[8] = ssl->out_msgtype;
995 add_data[9] = ssl->major_ver;
996 add_data[10] = ssl->minor_ver;
997 add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
998 add_data[12] = ssl->out_msglen & 0xFF;
999
1000 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1001 add_data, 13 );
1002
Paul Bakker68884e32013-01-07 18:20:04 +01001003 /*
1004 * Generate IV
1005 */
1006 ret = ssl->f_rng( ssl->p_rng,
Paul Bakker48916f92012-09-16 19:57:18 +00001007 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
Paul Bakker68884e32013-01-07 18:20:04 +01001008 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
1009 if( ret != 0 )
1010 return( ret );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001011
Paul Bakker68884e32013-01-07 18:20:04 +01001012 memcpy( ssl->out_iv,
1013 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
1014 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001015
Manuel Pégourié-Gonnard226d5da2013-09-05 13:19:22 +02001016 SSL_DEBUG_BUF( 4, "IV used", ssl->out_iv,
1017 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
1018
Paul Bakker68884e32013-01-07 18:20:04 +01001019 /*
1020 * Fix pointer positions and message length with added IV
1021 */
1022 enc_msg = ssl->out_msg;
1023 enc_msglen = ssl->out_msglen;
1024 ssl->out_msglen += ssl->transform_out->ivlen -
1025 ssl->transform_out->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001026
Paul Bakker68884e32013-01-07 18:20:04 +01001027 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
1028 "including %d bytes of padding",
1029 ssl->out_msglen, 0 ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001030
Paul Bakker68884e32013-01-07 18:20:04 +01001031 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
1032 ssl->out_msg, ssl->out_msglen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001033
Paul Bakker68884e32013-01-07 18:20:04 +01001034 /*
1035 * Adjust for tag
1036 */
1037 ssl->out_msglen += 16;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001038
Manuel Pégourié-Gonnardb8bd5932013-09-05 13:38:15 +02001039 gcm_crypt_and_tag( ssl->transform_out->cipher_ctx_enc.cipher_ctx,
Paul Bakker68884e32013-01-07 18:20:04 +01001040 GCM_ENCRYPT, enc_msglen,
1041 ssl->transform_out->iv_enc, ssl->transform_out->ivlen,
1042 add_data, 13,
1043 enc_msg, enc_msg,
1044 16, enc_msg + enc_msglen );
1045
1046 SSL_DEBUG_BUF( 4, "after encrypt: tag",
1047 enc_msg + enc_msglen, 16 );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001048 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001049 else
Paul Bakker68884e32013-01-07 18:20:04 +01001050#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001051 {
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001052 int ret;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001053 unsigned char *enc_msg;
Paul Bakker23986e52011-04-24 08:57:21 +00001054 size_t enc_msglen;
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001055 size_t olen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001056
Paul Bakker48916f92012-09-16 19:57:18 +00001057 padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
1058 ssl->transform_out->ivlen;
1059 if( padlen == ssl->transform_out->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001060 padlen = 0;
1061
1062 for( i = 0; i <= padlen; i++ )
1063 ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
1064
1065 ssl->out_msglen += padlen + 1;
1066
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001067 enc_msglen = ssl->out_msglen;
1068 enc_msg = ssl->out_msg;
1069
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001070#if defined(POLARSSL_SSL_PROTO_TLS1_1) || defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001071 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001072 * Prepend per-record IV for block cipher in TLS v1.1 and up as per
1073 * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001074 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001075 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001076 {
1077 /*
1078 * Generate IV
1079 */
Paul Bakker48916f92012-09-16 19:57:18 +00001080 int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc,
1081 ssl->transform_out->ivlen );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001082 if( ret != 0 )
1083 return( ret );
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001084
Paul Bakker92be97b2013-01-02 17:30:03 +01001085 memcpy( ssl->out_iv, ssl->transform_out->iv_enc,
Paul Bakker48916f92012-09-16 19:57:18 +00001086 ssl->transform_out->ivlen );
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001087
1088 /*
1089 * Fix pointer positions and message length with added IV
1090 */
Paul Bakker92be97b2013-01-02 17:30:03 +01001091 enc_msg = ssl->out_msg;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001092 enc_msglen = ssl->out_msglen;
Paul Bakker48916f92012-09-16 19:57:18 +00001093 ssl->out_msglen += ssl->transform_out->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001094 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001095#endif /* POLARSSL_SSL_PROTO_TLS1_1 || POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001096
Paul Bakker5121ce52009-01-03 21:22:43 +00001097 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001098 "including %d bytes of IV and %d bytes of padding",
Paul Bakker48916f92012-09-16 19:57:18 +00001099 ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001100
1101 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
Paul Bakker92be97b2013-01-02 17:30:03 +01001102 ssl->out_iv, ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001103
Paul Bakker45125bc2013-09-04 16:47:11 +02001104 if( ( ret = cipher_reset( &ssl->transform_out->cipher_ctx_enc ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001105 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001106 SSL_DEBUG_RET( 1, "cipher_reset", ret );
1107 return( ret );
1108 }
1109
1110 if( ( ret = cipher_set_iv( &ssl->transform_out->cipher_ctx_enc,
1111 ssl->transform_out->iv_enc,
1112 ssl->transform_out->ivlen ) ) != 0 )
1113 {
1114 SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001115 return( ret );
1116 }
Paul Bakker68884e32013-01-07 18:20:04 +01001117
Paul Bakkercca5b812013-08-31 17:40:26 +02001118 if( ( ret = cipher_update( &ssl->transform_out->cipher_ctx_enc,
1119 enc_msg, enc_msglen, enc_msg,
1120 &olen ) ) != 0 )
1121 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001122 SSL_DEBUG_RET( 1, "cipher_update", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001123 return( ret );
1124 }
Paul Bakker68884e32013-01-07 18:20:04 +01001125
Paul Bakkercca5b812013-08-31 17:40:26 +02001126 enc_msglen -= olen;
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001127
Paul Bakkercca5b812013-08-31 17:40:26 +02001128 if( ( ret = cipher_finish( &ssl->transform_out->cipher_ctx_enc,
Paul Bakker45125bc2013-09-04 16:47:11 +02001129 enc_msg + olen, &olen ) ) != 0 )
Paul Bakkercca5b812013-08-31 17:40:26 +02001130 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001131 SSL_DEBUG_RET( 1, "cipher_finish", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001132 return( ret );
1133 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001134
Paul Bakkercca5b812013-08-31 17:40:26 +02001135 if( enc_msglen != olen )
1136 {
1137 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect %d %d",
1138 enc_msglen, olen ) );
1139 // TODO Real error number
1140 return( -1 );
1141 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001142
1143#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1)
Paul Bakkercca5b812013-08-31 17:40:26 +02001144 if( ssl->minor_ver < SSL_MINOR_VERSION_2 )
1145 {
1146 /*
1147 * Save IV in SSL3 and TLS1
1148 */
1149 memcpy( ssl->transform_out->iv_enc,
1150 ssl->transform_out->cipher_ctx_enc.iv,
1151 ssl->transform_out->ivlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001152 }
Paul Bakkercca5b812013-08-31 17:40:26 +02001153#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001154 }
1155
Paul Bakkerca4ab492012-04-18 14:23:57 +00001156 for( i = 8; i > 0; i-- )
1157 if( ++ssl->out_ctr[i - 1] != 0 )
1158 break;
1159
Paul Bakker5121ce52009-01-03 21:22:43 +00001160 SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
1161
1162 return( 0 );
1163}
1164
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001165#define POLARSSL_SSL_MAX_MAC_SIZE 48
Paul Bakkerfab5c822012-02-06 16:45:10 +00001166
Paul Bakker5121ce52009-01-03 21:22:43 +00001167static int ssl_decrypt_buf( ssl_context *ssl )
1168{
Paul Bakker45829992013-01-03 14:52:21 +01001169 size_t i, padlen = 0, correct = 1;
Paul Bakkerfab5c822012-02-06 16:45:10 +00001170 unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
Paul Bakker5121ce52009-01-03 21:22:43 +00001171
1172 SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
1173
Paul Bakker48916f92012-09-16 19:57:18 +00001174 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001175 {
1176 SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
Paul Bakker48916f92012-09-16 19:57:18 +00001177 ssl->in_msglen, ssl->transform_in->minlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001178 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001179 }
1180
Paul Bakker68884e32013-01-07 18:20:04 +01001181#if defined(POLARSSL_CIPHER_NULL_CIPHER)
1182 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001183 {
Paul Bakker68884e32013-01-07 18:20:04 +01001184 padlen = 0;
1185 }
1186 else
1187#endif /* POLARSSL_CIPHER_NULL_CIPHER */
Paul Bakker40e46942009-01-03 21:51:57 +00001188#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001189 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
1190 {
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001191 int ret;
1192 size_t olen = 0;
1193
Paul Bakker68884e32013-01-07 18:20:04 +01001194 padlen = 0;
1195
Paul Bakker45125bc2013-09-04 16:47:11 +02001196 if( ( ret = cipher_reset( &ssl->transform_in->cipher_ctx_dec ) ) != 0 )
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001197 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001198 SSL_DEBUG_RET( 1, "cipher_reset", ret );
1199 return( ret );
1200 }
1201
1202 if( ( ret = cipher_set_iv( &ssl->transform_in->cipher_ctx_dec,
1203 ssl->transform_in->iv_dec,
1204 ssl->transform_in->ivlen ) ) != 0 )
1205 {
1206 SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001207 return( ret );
1208 }
1209
1210 if( ( ret = cipher_update( &ssl->transform_in->cipher_ctx_dec,
1211 ssl->in_msg, ssl->in_msglen, ssl->in_msg,
1212 &olen ) ) != 0 )
1213 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001214 SSL_DEBUG_RET( 1, "cipher_update", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001215 return( ret );
1216 }
1217
1218 if( ssl->in_msglen != olen )
1219 {
1220 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect" ) );
1221 // TODO Real error number
1222 return( -1 );
1223 }
1224
1225 if( ( ret = cipher_finish( &ssl->transform_in->cipher_ctx_dec,
Paul Bakker45125bc2013-09-04 16:47:11 +02001226 ssl->in_msg + olen, &olen ) ) != 0 )
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001227 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001228 SSL_DEBUG_RET( 1, "cipher_finish", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001229 return( ret );
1230 }
1231
1232 if( 0 != olen )
1233 {
1234 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect" ) );
1235 // TODO Real error number
1236 return( -1 );
1237 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001238 }
Paul Bakker68884e32013-01-07 18:20:04 +01001239 else
1240#endif /* POLARSSL_ARC4_C */
1241#if defined(POLARSSL_GCM_C)
1242 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
1243 ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001244 {
1245 unsigned char *dec_msg;
1246 unsigned char *dec_msg_result;
1247 size_t dec_msglen;
1248 unsigned char add_data[13];
1249 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1250
Paul Bakker68884e32013-01-07 18:20:04 +01001251 padlen = 0;
1252
1253 dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
1254 ssl->transform_in->fixed_ivlen );
1255 dec_msglen -= 16;
1256 dec_msg = ssl->in_msg;
1257 dec_msg_result = ssl->in_msg;
1258 ssl->in_msglen = dec_msglen;
1259
1260 memcpy( add_data, ssl->in_ctr, 8 );
1261 add_data[8] = ssl->in_msgtype;
1262 add_data[9] = ssl->major_ver;
1263 add_data[10] = ssl->minor_ver;
1264 add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
1265 add_data[12] = ssl->in_msglen & 0xFF;
1266
1267 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1268 add_data, 13 );
1269
1270 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
1271 ssl->in_iv,
1272 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
1273
1274 SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
1275 ssl->transform_in->ivlen );
1276 SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
1277
Manuel Pégourié-Gonnardb8bd5932013-09-05 13:38:15 +02001278 ret = gcm_auth_decrypt( ssl->transform_in->cipher_ctx_dec.cipher_ctx,
Paul Bakker68884e32013-01-07 18:20:04 +01001279 dec_msglen,
1280 ssl->transform_in->iv_dec,
1281 ssl->transform_in->ivlen,
1282 add_data, 13,
1283 dec_msg + dec_msglen, 16,
1284 dec_msg, dec_msg_result );
1285
1286 if( ret != 0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001287 {
Paul Bakker68884e32013-01-07 18:20:04 +01001288 SSL_DEBUG_MSG( 1, ( "AEAD decrypt failed on validation (ret = -0x%02x)",
1289 -ret ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001290
Paul Bakker68884e32013-01-07 18:20:04 +01001291 return( POLARSSL_ERR_SSL_INVALID_MAC );
1292 }
Manuel Pégourié-Gonnard226d5da2013-09-05 13:19:22 +02001293
Paul Bakkerca4ab492012-04-18 14:23:57 +00001294 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001295 else
Paul Bakker68884e32013-01-07 18:20:04 +01001296#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001297 {
Paul Bakker45829992013-01-03 14:52:21 +01001298 /*
1299 * Decrypt and check the padding
1300 */
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001301 int ret;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001302 unsigned char *dec_msg;
1303 unsigned char *dec_msg_result;
Paul Bakker23986e52011-04-24 08:57:21 +00001304 size_t dec_msglen;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001305 size_t minlen = 0;
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001306 size_t olen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001307
Paul Bakker5121ce52009-01-03 21:22:43 +00001308 /*
Paul Bakker45829992013-01-03 14:52:21 +01001309 * Check immediate ciphertext sanity
Paul Bakker5121ce52009-01-03 21:22:43 +00001310 */
Paul Bakker48916f92012-09-16 19:57:18 +00001311 if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001312 {
1313 SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
Paul Bakker48916f92012-09-16 19:57:18 +00001314 ssl->in_msglen, ssl->transform_in->ivlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001315 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001316 }
1317
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001318#if defined(POLARSSL_SSL_PROTO_TLS1_1) || defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker45829992013-01-03 14:52:21 +01001319 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
1320 minlen += ssl->transform_in->ivlen;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001321#endif
Paul Bakker45829992013-01-03 14:52:21 +01001322
1323 if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
1324 ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
1325 {
1326 SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
1327 ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) );
1328 return( POLARSSL_ERR_SSL_INVALID_MAC );
1329 }
1330
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001331 dec_msglen = ssl->in_msglen;
1332 dec_msg = ssl->in_msg;
1333 dec_msg_result = ssl->in_msg;
1334
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001335#if defined(POLARSSL_SSL_PROTO_TLS1_1) || defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001336 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001337 * Initialize for prepended IV for block cipher in TLS v1.1 and up
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001338 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001339 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001340 {
Paul Bakker48916f92012-09-16 19:57:18 +00001341 dec_msglen -= ssl->transform_in->ivlen;
1342 ssl->in_msglen -= ssl->transform_in->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001343
Paul Bakker48916f92012-09-16 19:57:18 +00001344 for( i = 0; i < ssl->transform_in->ivlen; i++ )
Paul Bakker92be97b2013-01-02 17:30:03 +01001345 ssl->transform_in->iv_dec[i] = ssl->in_iv[i];
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001346 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001347#endif /* POLARSSL_SSL_PROTO_TLS1_1 || POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001348
Paul Bakker45125bc2013-09-04 16:47:11 +02001349 if( ( ret = cipher_reset( &ssl->transform_in->cipher_ctx_dec ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001350 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001351 SSL_DEBUG_RET( 1, "cipher_reset", ret );
1352 return( ret );
1353 }
1354
1355 if( ( ret = cipher_set_iv( &ssl->transform_in->cipher_ctx_dec,
1356 ssl->transform_in->iv_dec,
1357 ssl->transform_in->ivlen ) ) != 0 )
1358 {
1359 SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001360 return( ret );
1361 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001362
Paul Bakkercca5b812013-08-31 17:40:26 +02001363 if( ( ret = cipher_update( &ssl->transform_in->cipher_ctx_dec,
1364 dec_msg, dec_msglen, dec_msg_result,
1365 &olen ) ) != 0 )
1366 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001367 SSL_DEBUG_RET( 1, "cipher_update", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001368 return( ret );
1369 }
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001370
Paul Bakkercca5b812013-08-31 17:40:26 +02001371 dec_msglen -= olen;
1372 if( ( ret = cipher_finish( &ssl->transform_in->cipher_ctx_dec,
Paul Bakker45125bc2013-09-04 16:47:11 +02001373 dec_msg_result + olen, &olen ) ) != 0 )
Paul Bakkercca5b812013-08-31 17:40:26 +02001374 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001375 SSL_DEBUG_RET( 1, "cipher_finish", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001376 return( ret );
1377 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001378
Paul Bakkercca5b812013-08-31 17:40:26 +02001379 if( dec_msglen != olen )
1380 {
1381 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect" ) );
1382 // TODO Real error number
1383 return( -1 );
1384 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001385
1386#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1)
Paul Bakkercca5b812013-08-31 17:40:26 +02001387 if( ssl->minor_ver < SSL_MINOR_VERSION_2 )
1388 {
1389 /*
1390 * Save IV in SSL3 and TLS1
1391 */
1392 memcpy( ssl->transform_in->iv_dec,
1393 ssl->transform_in->cipher_ctx_dec.iv,
1394 ssl->transform_in->ivlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001395 }
Paul Bakkercca5b812013-08-31 17:40:26 +02001396#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001397
1398 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
Paul Bakker45829992013-01-03 14:52:21 +01001399
1400 if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
1401 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001402#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001403 SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
1404 ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001405#endif
Paul Bakker45829992013-01-03 14:52:21 +01001406 padlen = 0;
Paul Bakker45829992013-01-03 14:52:21 +01001407 correct = 0;
1408 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001409
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001410#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00001411 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1412 {
Paul Bakker48916f92012-09-16 19:57:18 +00001413 if( padlen > ssl->transform_in->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001414 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001415#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001416 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
1417 "should be no more than %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001418 padlen, ssl->transform_in->ivlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001419#endif
Paul Bakker45829992013-01-03 14:52:21 +01001420 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001421 }
1422 }
1423 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001424#endif
1425#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
1426 defined(POLARSSL_SSL_PROTO_TLS1_2)
1427 if( ssl->minor_ver > SSL_MINOR_VERSION_0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001428 {
1429 /*
Paul Bakker45829992013-01-03 14:52:21 +01001430 * TLSv1+: always check the padding up to the first failure
1431 * and fake check up to 256 bytes of padding
Paul Bakker5121ce52009-01-03 21:22:43 +00001432 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001433 size_t pad_count = 0, fake_pad_count = 0;
1434 size_t padding_idx = ssl->in_msglen - padlen - 1;
1435
Paul Bakker5121ce52009-01-03 21:22:43 +00001436 for( i = 1; i <= padlen; i++ )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001437 pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1438
1439 for( ; i <= 256; i++ )
1440 fake_pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1441
1442 correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
1443 correct &= ( pad_count + fake_pad_count < 512 ); /* Always 1 */
1444
Paul Bakkerd66f0702013-01-31 16:57:45 +01001445#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001446 if( padlen > 0 && correct == 0)
1447 SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001448#endif
Paul Bakkere47b34b2013-02-27 14:48:00 +01001449 padlen &= correct * 0x1FF;
Paul Bakker5121ce52009-01-03 21:22:43 +00001450 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001451 else
1452#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
1453 POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02001454 {
1455 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001456 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +02001457 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001458 }
1459
1460 SSL_DEBUG_BUF( 4, "raw buffer after decryption",
1461 ssl->in_msg, ssl->in_msglen );
1462
1463 /*
1464 * Always compute the MAC (RFC4346, CBCTIME).
1465 */
Paul Bakker48916f92012-09-16 19:57:18 +00001466 ssl->in_msglen -= ( ssl->transform_in->maclen + padlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001467
1468 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1469 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1470
Paul Bakker45829992013-01-03 14:52:21 +01001471 memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001472
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001473#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00001474 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1475 {
Paul Bakker68884e32013-01-07 18:20:04 +01001476 ssl_mac( &ssl->transform_in->md_ctx_dec,
1477 ssl->transform_in->mac_dec,
1478 ssl->in_msg, ssl->in_msglen,
1479 ssl->in_ctr, ssl->in_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +00001480 }
1481 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001482#endif /* POLARSSL_SSL_PROTO_SSL3 */
1483#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
1484 defined(POLARSSL_SSL_PROTO_TLS1_2)
1485 if( ssl->minor_ver > SSL_MINOR_VERSION_0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001486 {
Paul Bakker45829992013-01-03 14:52:21 +01001487 /*
1488 * Process MAC and always update for padlen afterwards to make
1489 * total time independent of padlen
Paul Bakkere47b34b2013-02-27 14:48:00 +01001490 *
1491 * extra_run compensates MAC check for padlen
1492 *
1493 * Known timing attacks:
1494 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
1495 *
1496 * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
1497 * correctly. (We round down instead of up, so -56 is the correct
1498 * value for our calculations instead of -55)
Paul Bakker45829992013-01-03 14:52:21 +01001499 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001500 int j, extra_run = 0;
1501 extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
1502 ( 13 + ssl->in_msglen + 8 ) / 64;
1503
1504 extra_run &= correct * 0xFF;
1505
Paul Bakker68884e32013-01-07 18:20:04 +01001506 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 13 );
1507 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,
1508 ssl->in_msglen );
1509 md_hmac_finish( &ssl->transform_in->md_ctx_dec,
1510 ssl->in_msg + ssl->in_msglen );
1511 for( j = 0; j < extra_run; j++ )
1512 md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001513
Paul Bakker68884e32013-01-07 18:20:04 +01001514 md_hmac_reset( &ssl->transform_in->md_ctx_dec );
Paul Bakker5121ce52009-01-03 21:22:43 +00001515 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001516 else
1517#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
1518 POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02001519 {
1520 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001521 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +02001522 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001523
Paul Bakker48916f92012-09-16 19:57:18 +00001524 SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001525 SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001526 ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001527
1528 if( memcmp( tmp, ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001529 ssl->transform_in->maclen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001530 {
Paul Bakkere47b34b2013-02-27 14:48:00 +01001531#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001532 SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001533#endif
Paul Bakker45829992013-01-03 14:52:21 +01001534 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001535 }
1536
1537 /*
Paul Bakker45829992013-01-03 14:52:21 +01001538 * Finally check the correct flag
Paul Bakker5121ce52009-01-03 21:22:43 +00001539 */
Paul Bakker45829992013-01-03 14:52:21 +01001540 if( correct == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +00001541 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001542
1543 if( ssl->in_msglen == 0 )
1544 {
1545 ssl->nb_zero++;
1546
1547 /*
1548 * Three or more empty messages may be a DoS attack
1549 * (excessive CPU consumption).
1550 */
1551 if( ssl->nb_zero > 3 )
1552 {
1553 SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
1554 "messages, possible DoS attack" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001555 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001556 }
1557 }
1558 else
1559 ssl->nb_zero = 0;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001560
Paul Bakker23986e52011-04-24 08:57:21 +00001561 for( i = 8; i > 0; i-- )
1562 if( ++ssl->in_ctr[i - 1] != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001563 break;
1564
1565 SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
1566
1567 return( 0 );
1568}
1569
Paul Bakker2770fbd2012-07-03 13:30:23 +00001570#if defined(POLARSSL_ZLIB_SUPPORT)
1571/*
1572 * Compression/decompression functions
1573 */
1574static int ssl_compress_buf( ssl_context *ssl )
1575{
1576 int ret;
1577 unsigned char *msg_post = ssl->out_msg;
1578 size_t len_pre = ssl->out_msglen;
1579 unsigned char *msg_pre;
1580
1581 SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
1582
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001583 if( len_pre == 0 )
1584 return( 0 );
1585
Paul Bakker6e339b52013-07-03 13:37:05 +02001586 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001587 if( msg_pre == NULL )
1588 {
1589 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1590 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1591 }
1592
1593 memcpy( msg_pre, ssl->out_msg, len_pre );
1594
1595 SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
1596 ssl->out_msglen ) );
1597
1598 SSL_DEBUG_BUF( 4, "before compression: output payload",
1599 ssl->out_msg, ssl->out_msglen );
1600
Paul Bakker48916f92012-09-16 19:57:18 +00001601 ssl->transform_out->ctx_deflate.next_in = msg_pre;
1602 ssl->transform_out->ctx_deflate.avail_in = len_pre;
1603 ssl->transform_out->ctx_deflate.next_out = msg_post;
1604 ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001605
Paul Bakker48916f92012-09-16 19:57:18 +00001606 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001607 if( ret != Z_OK )
1608 {
1609 SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
1610 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1611 }
1612
Paul Bakker48916f92012-09-16 19:57:18 +00001613 ssl->out_msglen = SSL_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001614
Paul Bakker6e339b52013-07-03 13:37:05 +02001615 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001616
1617 SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
1618 ssl->out_msglen ) );
1619
1620 SSL_DEBUG_BUF( 4, "after compression: output payload",
1621 ssl->out_msg, ssl->out_msglen );
1622
1623 SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
1624
1625 return( 0 );
1626}
1627
1628static int ssl_decompress_buf( ssl_context *ssl )
1629{
1630 int ret;
1631 unsigned char *msg_post = ssl->in_msg;
1632 size_t len_pre = ssl->in_msglen;
1633 unsigned char *msg_pre;
1634
1635 SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
1636
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001637 if( len_pre == 0 )
1638 return( 0 );
1639
Paul Bakker6e339b52013-07-03 13:37:05 +02001640 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001641 if( msg_pre == NULL )
1642 {
1643 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1644 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1645 }
1646
1647 memcpy( msg_pre, ssl->in_msg, len_pre );
1648
1649 SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
1650 ssl->in_msglen ) );
1651
1652 SSL_DEBUG_BUF( 4, "before decompression: input payload",
1653 ssl->in_msg, ssl->in_msglen );
1654
Paul Bakker48916f92012-09-16 19:57:18 +00001655 ssl->transform_in->ctx_inflate.next_in = msg_pre;
1656 ssl->transform_in->ctx_inflate.avail_in = len_pre;
1657 ssl->transform_in->ctx_inflate.next_out = msg_post;
1658 ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001659
Paul Bakker48916f92012-09-16 19:57:18 +00001660 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001661 if( ret != Z_OK )
1662 {
1663 SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
1664 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1665 }
1666
Paul Bakker48916f92012-09-16 19:57:18 +00001667 ssl->in_msglen = SSL_MAX_CONTENT_LEN - ssl->transform_in->ctx_inflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001668
Paul Bakker6e339b52013-07-03 13:37:05 +02001669 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001670
1671 SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
1672 ssl->in_msglen ) );
1673
1674 SSL_DEBUG_BUF( 4, "after decompression: input payload",
1675 ssl->in_msg, ssl->in_msglen );
1676
1677 SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
1678
1679 return( 0 );
1680}
1681#endif /* POLARSSL_ZLIB_SUPPORT */
1682
Paul Bakker5121ce52009-01-03 21:22:43 +00001683/*
1684 * Fill the input message buffer
1685 */
Paul Bakker23986e52011-04-24 08:57:21 +00001686int ssl_fetch_input( ssl_context *ssl, size_t nb_want )
Paul Bakker5121ce52009-01-03 21:22:43 +00001687{
Paul Bakker23986e52011-04-24 08:57:21 +00001688 int ret;
1689 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001690
1691 SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
1692
1693 while( ssl->in_left < nb_want )
1694 {
1695 len = nb_want - ssl->in_left;
1696 ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
1697
1698 SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
1699 ssl->in_left, nb_want ) );
1700 SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
1701
Paul Bakker831a7552011-05-18 13:32:51 +00001702 if( ret == 0 )
1703 return( POLARSSL_ERR_SSL_CONN_EOF );
1704
Paul Bakker5121ce52009-01-03 21:22:43 +00001705 if( ret < 0 )
1706 return( ret );
1707
1708 ssl->in_left += ret;
1709 }
1710
1711 SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
1712
1713 return( 0 );
1714}
1715
1716/*
1717 * Flush any data not yet written
1718 */
1719int ssl_flush_output( ssl_context *ssl )
1720{
1721 int ret;
1722 unsigned char *buf;
1723
1724 SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
1725
1726 while( ssl->out_left > 0 )
1727 {
1728 SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
1729 5 + ssl->out_msglen, ssl->out_left ) );
1730
Paul Bakker5bd42292012-12-19 14:40:42 +01001731 buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
Paul Bakker5121ce52009-01-03 21:22:43 +00001732 ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
Paul Bakker186751d2012-05-08 13:16:14 +00001733
Paul Bakker5121ce52009-01-03 21:22:43 +00001734 SSL_DEBUG_RET( 2, "ssl->f_send", ret );
1735
1736 if( ret <= 0 )
1737 return( ret );
1738
1739 ssl->out_left -= ret;
1740 }
1741
1742 SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
1743
1744 return( 0 );
1745}
1746
1747/*
1748 * Record layer functions
1749 */
1750int ssl_write_record( ssl_context *ssl )
1751{
Paul Bakker05ef8352012-05-08 09:17:57 +00001752 int ret, done = 0;
Paul Bakker23986e52011-04-24 08:57:21 +00001753 size_t len = ssl->out_msglen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001754
1755 SSL_DEBUG_MSG( 2, ( "=> write record" ) );
1756
Paul Bakker5121ce52009-01-03 21:22:43 +00001757 if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
1758 {
1759 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
1760 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
1761 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
1762
Paul Bakker48916f92012-09-16 19:57:18 +00001763 ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001764 }
1765
Paul Bakker2770fbd2012-07-03 13:30:23 +00001766#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001767 if( ssl->transform_out != NULL &&
1768 ssl->session_out->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001769 {
1770 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
1771 {
1772 SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
1773 return( ret );
1774 }
1775
1776 len = ssl->out_msglen;
1777 }
1778#endif /*POLARSSL_ZLIB_SUPPORT */
1779
Paul Bakker05ef8352012-05-08 09:17:57 +00001780#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1781 if( ssl_hw_record_write != NULL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001782 {
Paul Bakker05ef8352012-05-08 09:17:57 +00001783 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001784
Paul Bakker05ef8352012-05-08 09:17:57 +00001785 ret = ssl_hw_record_write( ssl );
1786 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1787 {
1788 SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret );
1789 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1790 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001791
1792 if( ret == 0 )
1793 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001794 }
1795#endif
1796 if( !done )
1797 {
1798 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
1799 ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
1800 ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00001801 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1802 ssl->out_hdr[4] = (unsigned char)( len );
Paul Bakker05ef8352012-05-08 09:17:57 +00001803
Paul Bakker48916f92012-09-16 19:57:18 +00001804 if( ssl->transform_out != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001805 {
1806 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
1807 {
1808 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
1809 return( ret );
1810 }
1811
1812 len = ssl->out_msglen;
1813 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1814 ssl->out_hdr[4] = (unsigned char)( len );
1815 }
1816
1817 ssl->out_left = 5 + ssl->out_msglen;
1818
1819 SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
1820 "version = [%d:%d], msglen = %d",
1821 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
1822 ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
1823
1824 SSL_DEBUG_BUF( 4, "output record sent to network",
Paul Bakker5bd42292012-12-19 14:40:42 +01001825 ssl->out_hdr, 5 + ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001826 }
1827
Paul Bakker5121ce52009-01-03 21:22:43 +00001828 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1829 {
1830 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
1831 return( ret );
1832 }
1833
1834 SSL_DEBUG_MSG( 2, ( "<= write record" ) );
1835
1836 return( 0 );
1837}
1838
1839int ssl_read_record( ssl_context *ssl )
1840{
Paul Bakker05ef8352012-05-08 09:17:57 +00001841 int ret, done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001842
1843 SSL_DEBUG_MSG( 2, ( "=> read record" ) );
1844
Paul Bakker68884e32013-01-07 18:20:04 +01001845 SSL_DEBUG_BUF( 4, "input record from network",
1846 ssl->in_hdr, 5 + ssl->in_msglen );
1847
Paul Bakker5121ce52009-01-03 21:22:43 +00001848 if( ssl->in_hslen != 0 &&
1849 ssl->in_hslen < ssl->in_msglen )
1850 {
1851 /*
1852 * Get next Handshake message in the current record
1853 */
1854 ssl->in_msglen -= ssl->in_hslen;
1855
Paul Bakker8934a982011-08-05 11:11:53 +00001856 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
Paul Bakker48916f92012-09-16 19:57:18 +00001857 ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001858
1859 ssl->in_hslen = 4;
1860 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1861
1862 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1863 " %d, type = %d, hslen = %d",
1864 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1865
1866 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1867 {
1868 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001869 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001870 }
1871
1872 if( ssl->in_msglen < ssl->in_hslen )
1873 {
1874 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001875 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001876 }
1877
Paul Bakker48916f92012-09-16 19:57:18 +00001878 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001879
1880 return( 0 );
1881 }
1882
1883 ssl->in_hslen = 0;
1884
1885 /*
1886 * Read the record header and validate it
1887 */
1888 if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
1889 {
1890 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1891 return( ret );
1892 }
1893
1894 ssl->in_msgtype = ssl->in_hdr[0];
1895 ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
1896
1897 SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
1898 "version = [%d:%d], msglen = %d",
1899 ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
1900 ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
1901
1902 if( ssl->in_hdr[1] != ssl->major_ver )
1903 {
1904 SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001905 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001906 }
1907
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001908 if( ssl->in_hdr[2] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00001909 {
1910 SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001911 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001912 }
1913
1914 /*
1915 * Make sure the message length is acceptable
1916 */
Paul Bakker48916f92012-09-16 19:57:18 +00001917 if( ssl->transform_in == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001918 {
1919 if( ssl->in_msglen < 1 ||
1920 ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1921 {
1922 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001923 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001924 }
1925 }
1926 else
1927 {
Paul Bakker48916f92012-09-16 19:57:18 +00001928 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001929 {
1930 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001931 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001932 }
1933
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001934#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00001935 if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001936 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN )
Paul Bakker5121ce52009-01-03 21:22:43 +00001937 {
1938 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001939 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001940 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001941#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001942
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001943#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
1944 defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker5121ce52009-01-03 21:22:43 +00001945 /*
1946 * TLS encrypted messages can have up to 256 bytes of padding
1947 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001948 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001949 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN + 256 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001950 {
1951 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001952 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001953 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001954#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001955 }
1956
1957 /*
1958 * Read and optionally decrypt the message contents
1959 */
1960 if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 )
1961 {
1962 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1963 return( ret );
1964 }
1965
1966 SSL_DEBUG_BUF( 4, "input record from network",
1967 ssl->in_hdr, 5 + ssl->in_msglen );
1968
Paul Bakker05ef8352012-05-08 09:17:57 +00001969#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1970 if( ssl_hw_record_read != NULL)
1971 {
1972 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) );
1973
1974 ret = ssl_hw_record_read( ssl );
1975 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1976 {
1977 SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret );
1978 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1979 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001980
1981 if( ret == 0 )
1982 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001983 }
1984#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001985 if( !done && ssl->transform_in != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001986 {
1987 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
1988 {
Paul Bakker40865c82013-01-31 17:13:13 +01001989#if defined(POLARSSL_SSL_ALERT_MESSAGES)
1990 if( ret == POLARSSL_ERR_SSL_INVALID_MAC )
1991 {
1992 ssl_send_alert_message( ssl,
1993 SSL_ALERT_LEVEL_FATAL,
1994 SSL_ALERT_MSG_BAD_RECORD_MAC );
1995 }
1996#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001997 SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
1998 return( ret );
1999 }
2000
2001 SSL_DEBUG_BUF( 4, "input payload after decrypt",
2002 ssl->in_msg, ssl->in_msglen );
2003
2004 if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
2005 {
2006 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002007 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002008 }
2009 }
2010
Paul Bakker2770fbd2012-07-03 13:30:23 +00002011#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00002012 if( ssl->transform_in != NULL &&
2013 ssl->session_in->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002014 {
2015 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
2016 {
2017 SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
2018 return( ret );
2019 }
2020
2021 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
2022 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
2023 }
2024#endif /* POLARSSL_ZLIB_SUPPORT */
2025
Paul Bakker0a925182012-04-16 06:46:41 +00002026 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE &&
2027 ssl->in_msgtype != SSL_MSG_ALERT &&
2028 ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC &&
2029 ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
2030 {
2031 SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
2032
Paul Bakker48916f92012-09-16 19:57:18 +00002033 if( ( ret = ssl_send_alert_message( ssl,
2034 SSL_ALERT_LEVEL_FATAL,
2035 SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
Paul Bakker0a925182012-04-16 06:46:41 +00002036 {
2037 return( ret );
2038 }
2039
2040 return( POLARSSL_ERR_SSL_INVALID_RECORD );
2041 }
2042
Paul Bakker5121ce52009-01-03 21:22:43 +00002043 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
2044 {
2045 ssl->in_hslen = 4;
2046 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
2047
2048 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
2049 " %d, type = %d, hslen = %d",
2050 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
2051
2052 /*
2053 * Additional checks to validate the handshake header
2054 */
2055 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
2056 {
2057 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002058 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002059 }
2060
2061 if( ssl->in_msglen < ssl->in_hslen )
2062 {
2063 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002064 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002065 }
2066
Paul Bakker48916f92012-09-16 19:57:18 +00002067 if( ssl->state != SSL_HANDSHAKE_OVER )
2068 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00002069 }
2070
2071 if( ssl->in_msgtype == SSL_MSG_ALERT )
2072 {
2073 SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
2074 ssl->in_msg[0], ssl->in_msg[1] ) );
2075
2076 /*
2077 * Ignore non-fatal alerts, except close_notify
2078 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002079 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002080 {
Paul Bakker2770fbd2012-07-03 13:30:23 +00002081 SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
2082 ssl->in_msg[1] ) );
Paul Bakker9d781402011-05-09 16:17:09 +00002083 /**
2084 * Subtract from error code as ssl->in_msg[1] is 7-bit positive
2085 * error identifier.
2086 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00002087 return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002088 }
2089
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002090 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2091 ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00002092 {
2093 SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002094 return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00002095 }
2096 }
2097
2098 ssl->in_left = 0;
2099
2100 SSL_DEBUG_MSG( 2, ( "<= read record" ) );
2101
2102 return( 0 );
2103}
2104
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002105int ssl_send_fatal_handshake_failure( ssl_context *ssl )
2106{
2107 int ret;
2108
2109 if( ( ret = ssl_send_alert_message( ssl,
2110 SSL_ALERT_LEVEL_FATAL,
2111 SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
2112 {
2113 return( ret );
2114 }
2115
2116 return( 0 );
2117}
2118
Paul Bakker0a925182012-04-16 06:46:41 +00002119int ssl_send_alert_message( ssl_context *ssl,
2120 unsigned char level,
2121 unsigned char message )
2122{
2123 int ret;
2124
2125 SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
2126
2127 ssl->out_msgtype = SSL_MSG_ALERT;
2128 ssl->out_msglen = 2;
2129 ssl->out_msg[0] = level;
2130 ssl->out_msg[1] = message;
2131
2132 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2133 {
2134 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2135 return( ret );
2136 }
2137
2138 SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
2139
2140 return( 0 );
2141}
2142
Paul Bakker5121ce52009-01-03 21:22:43 +00002143/*
2144 * Handshake functions
2145 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002146#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
2147 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
2148 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00002149int ssl_write_certificate( ssl_context *ssl )
2150{
Paul Bakkered27a042013-04-18 22:46:23 +02002151 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002152 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002153
2154 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
2155
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002156 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2157 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002158 {
2159 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2160 ssl->state++;
2161 return( 0 );
2162 }
2163
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002164 return( ret );
2165}
2166
2167int ssl_parse_certificate( ssl_context *ssl )
2168{
2169 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
2170 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
2171
2172 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2173
2174 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2175 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
2176 {
2177 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2178 ssl->state++;
2179 return( 0 );
2180 }
2181
2182 return( ret );
2183}
2184#else
2185int ssl_write_certificate( ssl_context *ssl )
2186{
2187 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
2188 size_t i, n;
2189 const x509_cert *crt;
2190 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
2191
2192 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
2193
2194 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2195 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
2196 {
2197 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2198 ssl->state++;
2199 return( 0 );
2200 }
2201
Paul Bakker5121ce52009-01-03 21:22:43 +00002202 if( ssl->endpoint == SSL_IS_CLIENT )
2203 {
2204 if( ssl->client_auth == 0 )
2205 {
2206 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2207 ssl->state++;
2208 return( 0 );
2209 }
2210
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002211#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00002212 /*
2213 * If using SSLv3 and got no cert, send an Alert message
2214 * (otherwise an empty Certificate message will be sent).
2215 */
2216 if( ssl->own_cert == NULL &&
2217 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2218 {
2219 ssl->out_msglen = 2;
2220 ssl->out_msgtype = SSL_MSG_ALERT;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002221 ssl->out_msg[0] = SSL_ALERT_LEVEL_WARNING;
2222 ssl->out_msg[1] = SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00002223
2224 SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
2225 goto write_msg;
2226 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002227#endif /* POLARSSL_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002228 }
2229 else /* SSL_IS_SERVER */
2230 {
2231 if( ssl->own_cert == NULL )
2232 {
2233 SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002234 return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002235 }
2236 }
2237
2238 SSL_DEBUG_CRT( 3, "own certificate", ssl->own_cert );
2239
2240 /*
2241 * 0 . 0 handshake type
2242 * 1 . 3 handshake length
2243 * 4 . 6 length of all certs
2244 * 7 . 9 length of cert. 1
2245 * 10 . n-1 peer certificate
2246 * n . n+2 length of cert. 2
2247 * n+3 . ... upper level cert, etc.
2248 */
2249 i = 7;
2250 crt = ssl->own_cert;
2251
Paul Bakker29087132010-03-21 21:03:34 +00002252 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002253 {
2254 n = crt->raw.len;
2255 if( i + 3 + n > SSL_MAX_CONTENT_LEN )
2256 {
2257 SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
2258 i + 3 + n, SSL_MAX_CONTENT_LEN ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002259 return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002260 }
2261
2262 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
2263 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
2264 ssl->out_msg[i + 2] = (unsigned char)( n );
2265
2266 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
2267 i += n; crt = crt->next;
2268 }
2269
2270 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
2271 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
2272 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
2273
2274 ssl->out_msglen = i;
2275 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2276 ssl->out_msg[0] = SSL_HS_CERTIFICATE;
2277
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002278#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00002279write_msg:
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002280#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002281
2282 ssl->state++;
2283
2284 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2285 {
2286 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2287 return( ret );
2288 }
2289
2290 SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
2291
Paul Bakkered27a042013-04-18 22:46:23 +02002292 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002293}
2294
2295int ssl_parse_certificate( ssl_context *ssl )
2296{
Paul Bakkered27a042013-04-18 22:46:23 +02002297 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker23986e52011-04-24 08:57:21 +00002298 size_t i, n;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002299 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002300
2301 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2302
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002303 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2304 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002305 {
2306 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2307 ssl->state++;
2308 return( 0 );
2309 }
2310
Paul Bakker5121ce52009-01-03 21:22:43 +00002311 if( ssl->endpoint == SSL_IS_SERVER &&
2312 ssl->authmode == SSL_VERIFY_NONE )
2313 {
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002314 ssl->session_negotiate->verify_result = BADCERT_SKIP_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00002315 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2316 ssl->state++;
2317 return( 0 );
2318 }
2319
2320 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2321 {
2322 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2323 return( ret );
2324 }
2325
2326 ssl->state++;
2327
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002328#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00002329 /*
2330 * Check if the client sent an empty certificate
2331 */
2332 if( ssl->endpoint == SSL_IS_SERVER &&
2333 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2334 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002335 if( ssl->in_msglen == 2 &&
2336 ssl->in_msgtype == SSL_MSG_ALERT &&
2337 ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2338 ssl->in_msg[1] == SSL_ALERT_MSG_NO_CERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002339 {
2340 SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2341
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002342 ssl->session_negotiate->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002343 if( ssl->authmode == SSL_VERIFY_OPTIONAL )
2344 return( 0 );
2345 else
Paul Bakker40e46942009-01-03 21:51:57 +00002346 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002347 }
2348 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002349#endif /* POLARSSL_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002350
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002351#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
2352 defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker5121ce52009-01-03 21:22:43 +00002353 if( ssl->endpoint == SSL_IS_SERVER &&
2354 ssl->minor_ver != SSL_MINOR_VERSION_0 )
2355 {
2356 if( ssl->in_hslen == 7 &&
2357 ssl->in_msgtype == SSL_MSG_HANDSHAKE &&
2358 ssl->in_msg[0] == SSL_HS_CERTIFICATE &&
2359 memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
2360 {
2361 SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2362
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002363 ssl->session_negotiate->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002364 if( ssl->authmode == SSL_VERIFY_REQUIRED )
Paul Bakker40e46942009-01-03 21:51:57 +00002365 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002366 else
2367 return( 0 );
2368 }
2369 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002370#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
2371 POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002372
2373 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2374 {
2375 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002376 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002377 }
2378
2379 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
2380 {
2381 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002382 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002383 }
2384
2385 /*
2386 * Same message structure as in ssl_write_certificate()
2387 */
2388 n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
2389
2390 if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
2391 {
2392 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002393 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002394 }
2395
Paul Bakker6e339b52013-07-03 13:37:05 +02002396 if( ( ssl->session_negotiate->peer_cert = (x509_cert *) polarssl_malloc(
Paul Bakker5121ce52009-01-03 21:22:43 +00002397 sizeof( x509_cert ) ) ) == NULL )
2398 {
2399 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
2400 sizeof( x509_cert ) ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002401 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002402 }
2403
Paul Bakker48916f92012-09-16 19:57:18 +00002404 memset( ssl->session_negotiate->peer_cert, 0, sizeof( x509_cert ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002405
2406 i = 7;
2407
2408 while( i < ssl->in_hslen )
2409 {
2410 if( ssl->in_msg[i] != 0 )
2411 {
2412 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002413 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002414 }
2415
2416 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2417 | (unsigned int) ssl->in_msg[i + 2];
2418 i += 3;
2419
2420 if( n < 128 || i + n > ssl->in_hslen )
2421 {
2422 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002423 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002424 }
2425
Paul Bakker89ecb2d2013-06-24 19:06:15 +02002426 ret = x509parse_crt_der( ssl->session_negotiate->peer_cert,
2427 ssl->in_msg + i, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002428 if( ret != 0 )
2429 {
2430 SSL_DEBUG_RET( 1, " x509parse_crt", ret );
2431 return( ret );
2432 }
2433
2434 i += n;
2435 }
2436
Paul Bakker48916f92012-09-16 19:57:18 +00002437 SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00002438
2439 if( ssl->authmode != SSL_VERIFY_NONE )
2440 {
2441 if( ssl->ca_chain == NULL )
2442 {
2443 SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002444 return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002445 }
2446
Paul Bakker48916f92012-09-16 19:57:18 +00002447 ret = x509parse_verify( ssl->session_negotiate->peer_cert,
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002448 ssl->ca_chain, ssl->ca_crl, ssl->peer_cn,
2449 &ssl->session_negotiate->verify_result,
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002450 ssl->f_vrfy, ssl->p_vrfy );
Paul Bakker5121ce52009-01-03 21:22:43 +00002451
2452 if( ret != 0 )
2453 SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2454
2455 if( ssl->authmode != SSL_VERIFY_REQUIRED )
2456 ret = 0;
2457 }
2458
2459 SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
2460
2461 return( ret );
2462}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002463#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2464 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2465 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002466
2467int ssl_write_change_cipher_spec( ssl_context *ssl )
2468{
2469 int ret;
2470
2471 SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
2472
2473 ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
2474 ssl->out_msglen = 1;
2475 ssl->out_msg[0] = 1;
2476
Paul Bakker5121ce52009-01-03 21:22:43 +00002477 ssl->state++;
2478
2479 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2480 {
2481 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2482 return( ret );
2483 }
2484
2485 SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
2486
2487 return( 0 );
2488}
2489
2490int ssl_parse_change_cipher_spec( ssl_context *ssl )
2491{
2492 int ret;
2493
2494 SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
2495
Paul Bakker5121ce52009-01-03 21:22:43 +00002496 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2497 {
2498 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2499 return( ret );
2500 }
2501
2502 if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
2503 {
2504 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002505 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002506 }
2507
2508 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
2509 {
2510 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002511 return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
Paul Bakker5121ce52009-01-03 21:22:43 +00002512 }
2513
2514 ssl->state++;
2515
2516 SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
2517
2518 return( 0 );
2519}
2520
Paul Bakker41c83d32013-03-20 14:39:14 +01002521void ssl_optimize_checksum( ssl_context *ssl,
2522 const ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00002523{
Paul Bakkerfb08fd22013-08-27 15:06:26 +02002524 ((void) ciphersuite_info);
Paul Bakker769075d2012-11-24 11:26:46 +01002525
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002526#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
2527 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker380da532012-04-18 16:10:25 +00002528 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00002529 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker380da532012-04-18 16:10:25 +00002530 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002531#endif
2532#if defined(POLARSSL_SSL_PROTO_TLS1_2)
2533#if defined(POLARSSL_SHA512_C)
2534 if( ciphersuite_info->mac == POLARSSL_MD_SHA384 )
2535 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
2536 else
2537#endif
2538#if defined(POLARSSL_SHA256_C)
2539 if( ciphersuite_info->mac != POLARSSL_MD_SHA384 )
Paul Bakker48916f92012-09-16 19:57:18 +00002540 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002541 else
2542#endif
2543#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
2544 /* Should never happen */
2545 return;
Paul Bakker380da532012-04-18 16:10:25 +00002546}
Paul Bakkerf7abd422013-04-16 13:15:56 +02002547
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002548static void ssl_update_checksum_start( ssl_context *ssl,
2549 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002550{
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002551#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
2552 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker48916f92012-09-16 19:57:18 +00002553 md5_update( &ssl->handshake->fin_md5 , buf, len );
2554 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002555#endif
2556#if defined(POLARSSL_SSL_PROTO_TLS1_2)
2557#if defined(POLARSSL_SHA256_C)
Paul Bakker9e36f042013-06-30 14:34:05 +02002558 sha256_update( &ssl->handshake->fin_sha256, buf, len );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002559#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02002560#if defined(POLARSSL_SHA512_C)
2561 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002562#endif
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002563#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00002564}
2565
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002566#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
2567 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002568static void ssl_update_checksum_md5sha1( ssl_context *ssl,
2569 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002570{
Paul Bakker48916f92012-09-16 19:57:18 +00002571 md5_update( &ssl->handshake->fin_md5 , buf, len );
2572 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002573}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002574#endif
Paul Bakker380da532012-04-18 16:10:25 +00002575
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002576#if defined(POLARSSL_SSL_PROTO_TLS1_2)
2577#if defined(POLARSSL_SHA256_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002578static void ssl_update_checksum_sha256( ssl_context *ssl,
2579 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002580{
Paul Bakker9e36f042013-06-30 14:34:05 +02002581 sha256_update( &ssl->handshake->fin_sha256, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002582}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002583#endif
Paul Bakker380da532012-04-18 16:10:25 +00002584
Paul Bakker9e36f042013-06-30 14:34:05 +02002585#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002586static void ssl_update_checksum_sha384( ssl_context *ssl,
2587 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002588{
Paul Bakker9e36f042013-06-30 14:34:05 +02002589 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002590}
Paul Bakker769075d2012-11-24 11:26:46 +01002591#endif
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002592#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00002593
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002594#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002595static void ssl_calc_finished_ssl(
2596 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002597{
Paul Bakker3c2122f2013-06-24 19:03:14 +02002598 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002599 md5_context md5;
2600 sha1_context sha1;
2601
Paul Bakker5121ce52009-01-03 21:22:43 +00002602 unsigned char padbuf[48];
2603 unsigned char md5sum[16];
2604 unsigned char sha1sum[20];
2605
Paul Bakker48916f92012-09-16 19:57:18 +00002606 ssl_session *session = ssl->session_negotiate;
2607 if( !session )
2608 session = ssl->session;
2609
Paul Bakker1ef83d62012-04-11 12:09:53 +00002610 SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
2611
Paul Bakker48916f92012-09-16 19:57:18 +00002612 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2613 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002614
2615 /*
2616 * SSLv3:
2617 * hash =
2618 * MD5( master + pad2 +
2619 * MD5( handshake + sender + master + pad1 ) )
2620 * + SHA1( master + pad2 +
2621 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002622 */
2623
Paul Bakker90995b52013-06-24 19:20:35 +02002624#if !defined(POLARSSL_MD5_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002625 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002626 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002627#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002628
Paul Bakker90995b52013-06-24 19:20:35 +02002629#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002630 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002631 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002632#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002633
Paul Bakker3c2122f2013-06-24 19:03:14 +02002634 sender = ( from == SSL_IS_CLIENT ) ? "CLNT"
2635 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00002636
Paul Bakker1ef83d62012-04-11 12:09:53 +00002637 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002638
Paul Bakker3c2122f2013-06-24 19:03:14 +02002639 md5_update( &md5, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002640 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002641 md5_update( &md5, padbuf, 48 );
2642 md5_finish( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002643
Paul Bakker3c2122f2013-06-24 19:03:14 +02002644 sha1_update( &sha1, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002645 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002646 sha1_update( &sha1, padbuf, 40 );
2647 sha1_finish( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002648
Paul Bakker1ef83d62012-04-11 12:09:53 +00002649 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002650
Paul Bakker1ef83d62012-04-11 12:09:53 +00002651 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +00002652 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002653 md5_update( &md5, padbuf, 48 );
2654 md5_update( &md5, md5sum, 16 );
2655 md5_finish( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00002656
Paul Bakker1ef83d62012-04-11 12:09:53 +00002657 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +00002658 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002659 sha1_update( &sha1, padbuf , 40 );
2660 sha1_update( &sha1, sha1sum, 20 );
2661 sha1_finish( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002662
Paul Bakker1ef83d62012-04-11 12:09:53 +00002663 SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002664
Paul Bakker1ef83d62012-04-11 12:09:53 +00002665 memset( &md5, 0, sizeof( md5_context ) );
2666 memset( &sha1, 0, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002667
2668 memset( padbuf, 0, sizeof( padbuf ) );
2669 memset( md5sum, 0, sizeof( md5sum ) );
2670 memset( sha1sum, 0, sizeof( sha1sum ) );
2671
2672 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2673}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002674#endif /* POLARSSL_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002675
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002676#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002677static void ssl_calc_finished_tls(
2678 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002679{
Paul Bakker1ef83d62012-04-11 12:09:53 +00002680 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002681 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002682 md5_context md5;
Paul Bakker5121ce52009-01-03 21:22:43 +00002683 sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002684 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00002685
Paul Bakker48916f92012-09-16 19:57:18 +00002686 ssl_session *session = ssl->session_negotiate;
2687 if( !session )
2688 session = ssl->session;
2689
Paul Bakker1ef83d62012-04-11 12:09:53 +00002690 SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002691
Paul Bakker48916f92012-09-16 19:57:18 +00002692 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2693 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002694
Paul Bakker1ef83d62012-04-11 12:09:53 +00002695 /*
2696 * TLSv1:
2697 * hash = PRF( master, finished_label,
2698 * MD5( handshake ) + SHA1( handshake ) )[0..11]
2699 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002700
Paul Bakker90995b52013-06-24 19:20:35 +02002701#if !defined(POLARSSL_MD5_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002702 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
2703 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002704#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002705
Paul Bakker90995b52013-06-24 19:20:35 +02002706#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002707 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
2708 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002709#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002710
2711 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002712 ? "client finished"
2713 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002714
2715 md5_finish( &md5, padbuf );
2716 sha1_finish( &sha1, padbuf + 16 );
2717
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002718 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002719 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002720
2721 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2722
2723 memset( &md5, 0, sizeof( md5_context ) );
2724 memset( &sha1, 0, sizeof( sha1_context ) );
2725
2726 memset( padbuf, 0, sizeof( padbuf ) );
2727
2728 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2729}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002730#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00002731
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002732#if defined(POLARSSL_SSL_PROTO_TLS1_2)
2733#if defined(POLARSSL_SHA256_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002734static void ssl_calc_finished_tls_sha256(
Paul Bakker1ef83d62012-04-11 12:09:53 +00002735 ssl_context *ssl, unsigned char *buf, int from )
2736{
2737 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002738 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002739 sha256_context sha256;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002740 unsigned char padbuf[32];
2741
Paul Bakker48916f92012-09-16 19:57:18 +00002742 ssl_session *session = ssl->session_negotiate;
2743 if( !session )
2744 session = ssl->session;
2745
Paul Bakker380da532012-04-18 16:10:25 +00002746 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002747
Paul Bakker9e36f042013-06-30 14:34:05 +02002748 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002749
2750 /*
2751 * TLSv1.2:
2752 * hash = PRF( master, finished_label,
2753 * Hash( handshake ) )[0.11]
2754 */
2755
Paul Bakker9e36f042013-06-30 14:34:05 +02002756#if !defined(POLARSSL_SHA256_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002757 SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
Paul Bakker9e36f042013-06-30 14:34:05 +02002758 sha256.state, sizeof( sha256.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002759#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002760
2761 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002762 ? "client finished"
2763 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002764
Paul Bakker9e36f042013-06-30 14:34:05 +02002765 sha256_finish( &sha256, padbuf );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002766
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002767 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002768 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002769
2770 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2771
Paul Bakker9e36f042013-06-30 14:34:05 +02002772 memset( &sha256, 0, sizeof( sha256_context ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002773
2774 memset( padbuf, 0, sizeof( padbuf ) );
2775
2776 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2777}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002778#endif /* POLARSSL_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +00002779
Paul Bakker9e36f042013-06-30 14:34:05 +02002780#if defined(POLARSSL_SHA512_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002781static void ssl_calc_finished_tls_sha384(
2782 ssl_context *ssl, unsigned char *buf, int from )
2783{
2784 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002785 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002786 sha512_context sha512;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002787 unsigned char padbuf[48];
2788
Paul Bakker48916f92012-09-16 19:57:18 +00002789 ssl_session *session = ssl->session_negotiate;
2790 if( !session )
2791 session = ssl->session;
2792
Paul Bakker380da532012-04-18 16:10:25 +00002793 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002794
Paul Bakker9e36f042013-06-30 14:34:05 +02002795 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002796
2797 /*
2798 * TLSv1.2:
2799 * hash = PRF( master, finished_label,
2800 * Hash( handshake ) )[0.11]
2801 */
2802
Paul Bakker9e36f042013-06-30 14:34:05 +02002803#if !defined(POLARSSL_SHA512_ALT)
2804 SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
2805 sha512.state, sizeof( sha512.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002806#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002807
2808 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002809 ? "client finished"
2810 : "server finished";
Paul Bakkerca4ab492012-04-18 14:23:57 +00002811
Paul Bakker9e36f042013-06-30 14:34:05 +02002812 sha512_finish( &sha512, padbuf );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002813
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002814 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002815 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002816
2817 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2818
Paul Bakker9e36f042013-06-30 14:34:05 +02002819 memset( &sha512, 0, sizeof( sha512_context ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002820
2821 memset( padbuf, 0, sizeof( padbuf ) );
2822
2823 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2824}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002825#endif /* POLARSSL_SHA512_C */
2826#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +00002827
Paul Bakker48916f92012-09-16 19:57:18 +00002828void ssl_handshake_wrapup( ssl_context *ssl )
2829{
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002830 int resume = ssl->handshake->resume;
2831
Paul Bakker48916f92012-09-16 19:57:18 +00002832 SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
2833
2834 /*
2835 * Free our handshake params
2836 */
2837 ssl_handshake_free( ssl->handshake );
Paul Bakker6e339b52013-07-03 13:37:05 +02002838 polarssl_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00002839 ssl->handshake = NULL;
2840
2841 /*
2842 * Switch in our now active transform context
2843 */
2844 if( ssl->transform )
2845 {
2846 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002847 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002848 }
2849 ssl->transform = ssl->transform_negotiate;
2850 ssl->transform_negotiate = NULL;
2851
Paul Bakker0a597072012-09-25 21:55:46 +00002852 if( ssl->session )
2853 {
2854 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002855 polarssl_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00002856 }
2857 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00002858 ssl->session_negotiate = NULL;
2859
Paul Bakker0a597072012-09-25 21:55:46 +00002860 /*
2861 * Add cache entry
2862 */
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002863 if( ssl->f_set_cache != NULL &&
2864 ssl->session->length != 0 &&
2865 resume == 0 )
2866 {
Paul Bakker0a597072012-09-25 21:55:46 +00002867 if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 )
2868 SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002869 }
Paul Bakker0a597072012-09-25 21:55:46 +00002870
Paul Bakker48916f92012-09-16 19:57:18 +00002871 ssl->state++;
2872
2873 SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
2874}
2875
Paul Bakker1ef83d62012-04-11 12:09:53 +00002876int ssl_write_finished( ssl_context *ssl )
2877{
2878 int ret, hash_len;
2879
2880 SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
2881
Paul Bakker92be97b2013-01-02 17:30:03 +01002882 /*
2883 * Set the out_msg pointer to the correct location based on IV length
2884 */
2885 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2886 {
2887 ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -
2888 ssl->transform_negotiate->fixed_ivlen;
2889 }
2890 else
2891 ssl->out_msg = ssl->out_iv;
2892
Paul Bakker48916f92012-09-16 19:57:18 +00002893 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002894
2895 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002896 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2897
Paul Bakker48916f92012-09-16 19:57:18 +00002898 ssl->verify_data_len = hash_len;
2899 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
2900
Paul Bakker5121ce52009-01-03 21:22:43 +00002901 ssl->out_msglen = 4 + hash_len;
2902 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2903 ssl->out_msg[0] = SSL_HS_FINISHED;
2904
2905 /*
2906 * In case of session resuming, invert the client and server
2907 * ChangeCipherSpec messages order.
2908 */
Paul Bakker0a597072012-09-25 21:55:46 +00002909 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002910 {
2911 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker48916f92012-09-16 19:57:18 +00002912 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002913 else
2914 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2915 }
2916 else
2917 ssl->state++;
2918
Paul Bakker48916f92012-09-16 19:57:18 +00002919 /*
2920 * Switch to our negotiated transform and session parameters for outbound data.
2921 */
2922 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
2923 ssl->transform_out = ssl->transform_negotiate;
2924 ssl->session_out = ssl->session_negotiate;
2925 memset( ssl->out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002926
Paul Bakker07eb38b2012-12-19 14:42:06 +01002927#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2928 if( ssl_hw_record_activate != NULL)
2929 {
2930 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
2931 {
2932 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2933 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2934 }
2935 }
2936#endif
2937
Paul Bakker5121ce52009-01-03 21:22:43 +00002938 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2939 {
2940 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2941 return( ret );
2942 }
2943
2944 SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
2945
2946 return( 0 );
2947}
2948
2949int ssl_parse_finished( ssl_context *ssl )
2950{
Paul Bakker23986e52011-04-24 08:57:21 +00002951 int ret;
2952 unsigned int hash_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002953 unsigned char buf[36];
2954
2955 SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
2956
Paul Bakker48916f92012-09-16 19:57:18 +00002957 ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002958
Paul Bakker48916f92012-09-16 19:57:18 +00002959 /*
2960 * Switch to our negotiated transform and session parameters for inbound data.
2961 */
2962 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
2963 ssl->transform_in = ssl->transform_negotiate;
2964 ssl->session_in = ssl->session_negotiate;
2965 memset( ssl->in_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002966
Paul Bakker92be97b2013-01-02 17:30:03 +01002967 /*
2968 * Set the in_msg pointer to the correct location based on IV length
2969 */
2970 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2971 {
2972 ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -
2973 ssl->transform_negotiate->fixed_ivlen;
2974 }
2975 else
2976 ssl->in_msg = ssl->in_iv;
2977
Paul Bakker07eb38b2012-12-19 14:42:06 +01002978#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2979 if( ssl_hw_record_activate != NULL)
2980 {
2981 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_INBOUND ) ) != 0 )
2982 {
2983 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2984 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2985 }
2986 }
2987#endif
2988
Paul Bakker5121ce52009-01-03 21:22:43 +00002989 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2990 {
2991 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2992 return( ret );
2993 }
2994
2995 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2996 {
2997 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002998 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002999 }
3000
Paul Bakker1ef83d62012-04-11 12:09:53 +00003001 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00003002 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
3003
3004 if( ssl->in_msg[0] != SSL_HS_FINISHED ||
3005 ssl->in_hslen != 4 + hash_len )
3006 {
3007 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003008 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003009 }
3010
Paul Bakker5121ce52009-01-03 21:22:43 +00003011 if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
3012 {
3013 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003014 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003015 }
3016
Paul Bakker48916f92012-09-16 19:57:18 +00003017 ssl->verify_data_len = hash_len;
3018 memcpy( ssl->peer_verify_data, buf, hash_len );
3019
Paul Bakker0a597072012-09-25 21:55:46 +00003020 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003021 {
3022 if( ssl->endpoint == SSL_IS_CLIENT )
3023 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
3024
3025 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker48916f92012-09-16 19:57:18 +00003026 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00003027 }
3028 else
3029 ssl->state++;
3030
3031 SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
3032
3033 return( 0 );
3034}
3035
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003036static int ssl_handshake_init( ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00003037{
3038 if( ssl->transform_negotiate )
3039 ssl_transform_free( ssl->transform_negotiate );
3040 else
Paul Bakker6e339b52013-07-03 13:37:05 +02003041 ssl->transform_negotiate = polarssl_malloc( sizeof(ssl_transform) );
Paul Bakker48916f92012-09-16 19:57:18 +00003042
3043 if( ssl->session_negotiate )
3044 ssl_session_free( ssl->session_negotiate );
3045 else
Paul Bakker6e339b52013-07-03 13:37:05 +02003046 ssl->session_negotiate = polarssl_malloc( sizeof(ssl_session) );
Paul Bakker48916f92012-09-16 19:57:18 +00003047
3048 if( ssl->handshake )
3049 ssl_handshake_free( ssl->handshake );
3050 else
Paul Bakker6e339b52013-07-03 13:37:05 +02003051 ssl->handshake = polarssl_malloc( sizeof(ssl_handshake_params) );
Paul Bakker48916f92012-09-16 19:57:18 +00003052
3053 if( ssl->handshake == NULL ||
3054 ssl->transform_negotiate == NULL ||
3055 ssl->session_negotiate == NULL )
3056 {
3057 SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) );
3058 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3059 }
3060
3061 memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
3062 memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
3063 memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
3064
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003065#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
3066 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker48916f92012-09-16 19:57:18 +00003067 md5_starts( &ssl->handshake->fin_md5 );
3068 sha1_starts( &ssl->handshake->fin_sha1 );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003069#endif
3070#if defined(POLARSSL_SSL_PROTO_TLS1_2)
3071#if defined(POLARSSL_SHA256_C)
Paul Bakker9e36f042013-06-30 14:34:05 +02003072 sha256_starts( &ssl->handshake->fin_sha256, 0 );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003073#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02003074#if defined(POLARSSL_SHA512_C)
3075 sha512_starts( &ssl->handshake->fin_sha512, 1 );
Paul Bakker769075d2012-11-24 11:26:46 +01003076#endif
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003077#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker48916f92012-09-16 19:57:18 +00003078
3079 ssl->handshake->update_checksum = ssl_update_checksum_start;
Paul Bakker23f36802012-09-28 14:15:14 +00003080 ssl->handshake->sig_alg = SSL_HASH_SHA1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02003081
Paul Bakker61d113b2013-07-04 11:51:43 +02003082#if defined(POLARSSL_ECDH_C)
3083 ecdh_init( &ssl->handshake->ecdh_ctx );
3084#endif
3085
Paul Bakker48916f92012-09-16 19:57:18 +00003086 return( 0 );
3087}
3088
Paul Bakker5121ce52009-01-03 21:22:43 +00003089/*
3090 * Initialize an SSL context
3091 */
3092int ssl_init( ssl_context *ssl )
3093{
Paul Bakker48916f92012-09-16 19:57:18 +00003094 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003095 int len = SSL_BUFFER_LEN;
3096
3097 memset( ssl, 0, sizeof( ssl_context ) );
3098
Paul Bakker62f2dee2012-09-28 07:31:51 +00003099 /*
3100 * Sane defaults
3101 */
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003102 ssl->min_major_ver = SSL_MIN_MAJOR_VERSION;
3103 ssl->min_minor_ver = SSL_MIN_MINOR_VERSION;
3104 ssl->max_major_ver = SSL_MAX_MAJOR_VERSION;
3105 ssl->max_minor_ver = SSL_MAX_MINOR_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00003106
Paul Bakker8f4ddae2013-04-15 15:09:54 +02003107 ssl_set_ciphersuites( ssl, ssl_list_ciphersuites() );
Paul Bakker645ce3a2012-10-31 12:32:41 +00003108
Paul Bakker62f2dee2012-09-28 07:31:51 +00003109#if defined(POLARSSL_DHM_C)
3110 if( ( ret = mpi_read_string( &ssl->dhm_P, 16,
3111 POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 ||
3112 ( ret = mpi_read_string( &ssl->dhm_G, 16,
3113 POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 )
3114 {
3115 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3116 return( ret );
3117 }
3118#endif
3119
3120 /*
3121 * Prepare base structures
3122 */
Paul Bakker6e339b52013-07-03 13:37:05 +02003123 ssl->in_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00003124 ssl->in_hdr = ssl->in_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01003125 ssl->in_iv = ssl->in_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00003126 ssl->in_msg = ssl->in_ctr + 13;
3127
3128 if( ssl->in_ctr == NULL )
3129 {
3130 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00003131 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003132 }
3133
Paul Bakker6e339b52013-07-03 13:37:05 +02003134 ssl->out_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00003135 ssl->out_hdr = ssl->out_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01003136 ssl->out_iv = ssl->out_ctr + 13;
Paul Bakker5bd42292012-12-19 14:40:42 +01003137 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00003138
3139 if( ssl->out_ctr == NULL )
3140 {
3141 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker6e339b52013-07-03 13:37:05 +02003142 polarssl_free( ssl-> in_ctr );
Paul Bakker69e095c2011-12-10 21:55:01 +00003143 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003144 }
3145
3146 memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
3147 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
3148
Paul Bakker0be444a2013-08-27 21:55:01 +02003149#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
Paul Bakker5121ce52009-01-03 21:22:43 +00003150 ssl->hostname = NULL;
3151 ssl->hostname_len = 0;
Paul Bakker0be444a2013-08-27 21:55:01 +02003152#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003153
Paul Bakker606b4ba2013-08-14 16:52:14 +02003154#if defined(POLARSSL_SSL_SESSION_TICKETS)
3155 ssl->ticket_lifetime = SSL_DEFAULT_TICKET_LIFETIME;
3156#endif
3157
Paul Bakker48916f92012-09-16 19:57:18 +00003158 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3159 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003160
3161 return( 0 );
3162}
3163
3164/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00003165 * Reset an initialized and used SSL context for re-use while retaining
3166 * all application-set variables, function pointers and data.
3167 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00003168int ssl_session_reset( ssl_context *ssl )
Paul Bakker7eb013f2011-10-06 12:37:39 +00003169{
Paul Bakker48916f92012-09-16 19:57:18 +00003170 int ret;
3171
Paul Bakker7eb013f2011-10-06 12:37:39 +00003172 ssl->state = SSL_HELLO_REQUEST;
Paul Bakker48916f92012-09-16 19:57:18 +00003173 ssl->renegotiation = SSL_INITIAL_HANDSHAKE;
3174 ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION;
3175
3176 ssl->verify_data_len = 0;
3177 memset( ssl->own_verify_data, 0, 36 );
3178 memset( ssl->peer_verify_data, 0, 36 );
3179
Paul Bakker7eb013f2011-10-06 12:37:39 +00003180 ssl->in_offt = NULL;
3181
Paul Bakker92be97b2013-01-02 17:30:03 +01003182 ssl->in_msg = ssl->in_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003183 ssl->in_msgtype = 0;
3184 ssl->in_msglen = 0;
3185 ssl->in_left = 0;
3186
3187 ssl->in_hslen = 0;
3188 ssl->nb_zero = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003189 ssl->record_read = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003190
Paul Bakker92be97b2013-01-02 17:30:03 +01003191 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003192 ssl->out_msgtype = 0;
3193 ssl->out_msglen = 0;
3194 ssl->out_left = 0;
3195
Paul Bakker48916f92012-09-16 19:57:18 +00003196 ssl->transform_in = NULL;
3197 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003198
3199 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
3200 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker05ef8352012-05-08 09:17:57 +00003201
3202#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3203 if( ssl_hw_record_reset != NULL)
3204 {
3205 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) );
Paul Bakker07eb38b2012-12-19 14:42:06 +01003206 if( ( ret = ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00003207 {
3208 SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret );
3209 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
3210 }
Paul Bakker05ef8352012-05-08 09:17:57 +00003211 }
3212#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00003213
Paul Bakker48916f92012-09-16 19:57:18 +00003214 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00003215 {
Paul Bakker48916f92012-09-16 19:57:18 +00003216 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02003217 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003218 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00003219 }
Paul Bakker48916f92012-09-16 19:57:18 +00003220
Paul Bakkerc0463502013-02-14 11:19:38 +01003221 if( ssl->session )
3222 {
3223 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02003224 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01003225 ssl->session = NULL;
3226 }
3227
Paul Bakker48916f92012-09-16 19:57:18 +00003228 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3229 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00003230
3231 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00003232}
3233
Paul Bakkera503a632013-08-14 13:48:06 +02003234#if defined(POLARSSL_SSL_SESSION_TICKETS)
Paul Bakker7eb013f2011-10-06 12:37:39 +00003235/*
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003236 * Allocate and initialize ticket keys
3237 */
3238static int ssl_ticket_keys_init( ssl_context *ssl )
3239{
3240 int ret;
3241 ssl_ticket_keys *tkeys;
Manuel Pégourié-Gonnard56dc9e82013-08-03 17:16:31 +02003242 unsigned char buf[16];
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003243
3244 if( ssl->ticket_keys != NULL )
3245 return( 0 );
3246
3247 if( ( tkeys = polarssl_malloc( sizeof( ssl_ticket_keys ) ) ) == NULL )
3248 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3249
3250 if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->key_name, 16 ) ) != 0 )
3251 return( ret );
3252
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003253 if( ( ret = ssl->f_rng( ssl->p_rng, buf, 16 ) ) != 0 ||
3254 ( ret = aes_setkey_enc( &tkeys->enc, buf, 128 ) ) != 0 ||
3255 ( ret = aes_setkey_dec( &tkeys->dec, buf, 128 ) ) != 0 )
3256 {
3257 return( ret );
3258 }
3259
Manuel Pégourié-Gonnard56dc9e82013-08-03 17:16:31 +02003260 if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->mac_key, 16 ) ) != 0 )
3261 return( ret );
3262
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003263 ssl->ticket_keys = tkeys;
3264
3265 return( 0 );
3266}
Paul Bakkera503a632013-08-14 13:48:06 +02003267#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003268
3269/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003270 * SSL set accessors
3271 */
3272void ssl_set_endpoint( ssl_context *ssl, int endpoint )
3273{
3274 ssl->endpoint = endpoint;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003275
Paul Bakker606b4ba2013-08-14 16:52:14 +02003276#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003277 if( endpoint == SSL_IS_CLIENT )
3278 ssl->session_tickets = SSL_SESSION_TICKETS_ENABLED;
Paul Bakker606b4ba2013-08-14 16:52:14 +02003279#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003280}
3281
3282void ssl_set_authmode( ssl_context *ssl, int authmode )
3283{
3284 ssl->authmode = authmode;
3285}
3286
Paul Bakkered27a042013-04-18 22:46:23 +02003287#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003288void ssl_set_verify( ssl_context *ssl,
Paul Bakker915275b2012-09-28 07:10:55 +00003289 int (*f_vrfy)(void *, x509_cert *, int, int *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003290 void *p_vrfy )
3291{
3292 ssl->f_vrfy = f_vrfy;
3293 ssl->p_vrfy = p_vrfy;
3294}
Paul Bakkered27a042013-04-18 22:46:23 +02003295#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003296
Paul Bakker5121ce52009-01-03 21:22:43 +00003297void ssl_set_rng( ssl_context *ssl,
Paul Bakkera3d195c2011-11-27 21:07:34 +00003298 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00003299 void *p_rng )
3300{
3301 ssl->f_rng = f_rng;
3302 ssl->p_rng = p_rng;
3303}
3304
3305void ssl_set_dbg( ssl_context *ssl,
Paul Bakkerff60ee62010-03-16 21:09:09 +00003306 void (*f_dbg)(void *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00003307 void *p_dbg )
3308{
3309 ssl->f_dbg = f_dbg;
3310 ssl->p_dbg = p_dbg;
3311}
3312
3313void ssl_set_bio( ssl_context *ssl,
Paul Bakker23986e52011-04-24 08:57:21 +00003314 int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
Paul Bakker39bb4182011-06-21 07:36:43 +00003315 int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
Paul Bakker5121ce52009-01-03 21:22:43 +00003316{
3317 ssl->f_recv = f_recv;
3318 ssl->f_send = f_send;
3319 ssl->p_recv = p_recv;
3320 ssl->p_send = p_send;
3321}
3322
Paul Bakker0a597072012-09-25 21:55:46 +00003323void ssl_set_session_cache( ssl_context *ssl,
3324 int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
3325 int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00003326{
Paul Bakker0a597072012-09-25 21:55:46 +00003327 ssl->f_get_cache = f_get_cache;
3328 ssl->p_get_cache = p_get_cache;
3329 ssl->f_set_cache = f_set_cache;
3330 ssl->p_set_cache = p_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00003331}
3332
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003333int ssl_set_session( ssl_context *ssl, const ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00003334{
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003335 int ret;
3336
3337 if( ssl == NULL ||
3338 session == NULL ||
3339 ssl->session_negotiate == NULL ||
3340 ssl->endpoint != SSL_IS_CLIENT )
3341 {
3342 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3343 }
3344
3345 if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 )
3346 return( ret );
3347
Paul Bakker0a597072012-09-25 21:55:46 +00003348 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003349
3350 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003351}
3352
Paul Bakkerb68cad62012-08-23 08:34:18 +00003353void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00003354{
Paul Bakker8f4ddae2013-04-15 15:09:54 +02003355 ssl->ciphersuite_list[SSL_MINOR_VERSION_0] = ciphersuites;
3356 ssl->ciphersuite_list[SSL_MINOR_VERSION_1] = ciphersuites;
3357 ssl->ciphersuite_list[SSL_MINOR_VERSION_2] = ciphersuites;
3358 ssl->ciphersuite_list[SSL_MINOR_VERSION_3] = ciphersuites;
3359}
3360
3361void ssl_set_ciphersuites_for_version( ssl_context *ssl, const int *ciphersuites,
3362 int major, int minor )
3363{
3364 if( major != SSL_MAJOR_VERSION_3 )
3365 return;
3366
3367 if( minor < SSL_MINOR_VERSION_0 || minor > SSL_MINOR_VERSION_3 )
3368 return;
3369
3370 ssl->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00003371}
3372
Paul Bakkered27a042013-04-18 22:46:23 +02003373#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003374void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain,
Paul Bakker57b79142010-03-24 06:51:15 +00003375 x509_crl *ca_crl, const char *peer_cn )
Paul Bakker5121ce52009-01-03 21:22:43 +00003376{
3377 ssl->ca_chain = ca_chain;
Paul Bakker40ea7de2009-05-03 10:18:48 +00003378 ssl->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00003379 ssl->peer_cn = peer_cn;
3380}
3381
3382void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert,
Manuel Pégourié-Gonnardac755232013-08-19 14:10:16 +02003383 pk_context *pk_key )
Paul Bakker5121ce52009-01-03 21:22:43 +00003384{
3385 ssl->own_cert = own_cert;
Manuel Pégourié-Gonnardac755232013-08-19 14:10:16 +02003386 ssl->pk_key = pk_key;
Paul Bakker5121ce52009-01-03 21:22:43 +00003387}
3388
Manuel Pégourié-Gonnardac755232013-08-19 14:10:16 +02003389#if defined(POLARSSL_RSA_C)
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003390int ssl_set_own_cert_rsa( ssl_context *ssl, x509_cert *own_cert,
Manuel Pégourié-Gonnardac755232013-08-19 14:10:16 +02003391 rsa_context *rsa_key )
Paul Bakker43b7e352011-01-18 15:27:19 +00003392{
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003393 int ret;
3394
Paul Bakker43b7e352011-01-18 15:27:19 +00003395 ssl->own_cert = own_cert;
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003396
3397 if( ( ssl->pk_key = polarssl_malloc( sizeof( pk_context ) ) ) == NULL )
3398 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3399
3400 ssl->pk_key_own_alloc = 1;
3401
3402 pk_init( ssl->pk_key );
3403
3404 ret = pk_init_ctx( ssl->pk_key, pk_info_from_type( POLARSSL_PK_RSA ) );
3405 if( ret != 0 )
3406 return( ret );
3407
3408 if( ( ret = rsa_copy( ssl->pk_key->pk_ctx, rsa_key ) ) != 0 )
3409 return( ret );
3410
3411 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003412}
Manuel Pégourié-Gonnardac755232013-08-19 14:10:16 +02003413#endif /* POLARSSL_RSA_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00003414
Manuel Pégourié-Gonnard2fb15f62013-08-22 17:54:20 +02003415int ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert,
3416 void *rsa_key,
3417 rsa_decrypt_func rsa_decrypt,
3418 rsa_sign_func rsa_sign,
3419 rsa_key_len_func rsa_key_len )
Paul Bakker43b7e352011-01-18 15:27:19 +00003420{
Manuel Pégourié-Gonnardac755232013-08-19 14:10:16 +02003421 ssl->own_cert = own_cert;
Manuel Pégourié-Gonnard070cc7f2013-08-21 15:09:31 +02003422
3423 if( ( ssl->pk_key = polarssl_malloc( sizeof( pk_context ) ) ) == NULL )
3424 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3425
3426 ssl->pk_key_own_alloc = 1;
3427
3428 pk_init( ssl->pk_key );
3429
3430 return( pk_init_ctx_rsa_alt( ssl->pk_key, rsa_key,
3431 rsa_decrypt, rsa_sign, rsa_key_len ) );
Paul Bakker43b7e352011-01-18 15:27:19 +00003432}
Paul Bakkered27a042013-04-18 22:46:23 +02003433#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00003434
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003435#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
3436void ssl_set_psk( ssl_context *ssl, const unsigned char *psk, size_t psk_len,
3437 const unsigned char *psk_identity, size_t psk_identity_len )
3438{
3439 ssl->psk = psk;
3440 ssl->psk_len = psk_len;
3441 ssl->psk_identity = psk_identity;
3442 ssl->psk_identity_len = psk_identity_len;
3443}
3444#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00003445
Paul Bakker48916f92012-09-16 19:57:18 +00003446#if defined(POLARSSL_DHM_C)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003447int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00003448{
3449 int ret;
3450
Paul Bakker48916f92012-09-16 19:57:18 +00003451 if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003452 {
3453 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3454 return( ret );
3455 }
3456
Paul Bakker48916f92012-09-16 19:57:18 +00003457 if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003458 {
3459 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3460 return( ret );
3461 }
3462
3463 return( 0 );
3464}
3465
Paul Bakker1b57b062011-01-06 15:48:19 +00003466int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx )
3467{
3468 int ret;
3469
Paul Bakker48916f92012-09-16 19:57:18 +00003470 if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003471 {
3472 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3473 return( ret );
3474 }
3475
Paul Bakker48916f92012-09-16 19:57:18 +00003476 if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003477 {
3478 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3479 return( ret );
3480 }
3481
3482 return( 0 );
3483}
Paul Bakker48916f92012-09-16 19:57:18 +00003484#endif /* POLARSSL_DHM_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00003485
Paul Bakker0be444a2013-08-27 21:55:01 +02003486#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003487int ssl_set_hostname( ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00003488{
3489 if( hostname == NULL )
Paul Bakker40e46942009-01-03 21:51:57 +00003490 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003491
3492 ssl->hostname_len = strlen( hostname );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02003493
3494 if( ssl->hostname_len + 1 == 0 )
3495 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3496
Paul Bakker6e339b52013-07-03 13:37:05 +02003497 ssl->hostname = (unsigned char *) polarssl_malloc( ssl->hostname_len + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003498
Paul Bakkerb15b8512012-01-13 13:44:06 +00003499 if( ssl->hostname == NULL )
3500 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3501
Paul Bakker3c2122f2013-06-24 19:03:14 +02003502 memcpy( ssl->hostname, (const unsigned char *) hostname,
Paul Bakker5121ce52009-01-03 21:22:43 +00003503 ssl->hostname_len );
Paul Bakkerf7abd422013-04-16 13:15:56 +02003504
Paul Bakker40ea7de2009-05-03 10:18:48 +00003505 ssl->hostname[ssl->hostname_len] = '\0';
Paul Bakker5121ce52009-01-03 21:22:43 +00003506
3507 return( 0 );
3508}
3509
Paul Bakker5701cdc2012-09-27 21:49:42 +00003510void ssl_set_sni( ssl_context *ssl,
3511 int (*f_sni)(void *, ssl_context *,
3512 const unsigned char *, size_t),
3513 void *p_sni )
3514{
3515 ssl->f_sni = f_sni;
3516 ssl->p_sni = p_sni;
3517}
Paul Bakker0be444a2013-08-27 21:55:01 +02003518#endif /* POLARSSL_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00003519
Paul Bakker490ecc82011-10-06 13:04:09 +00003520void ssl_set_max_version( ssl_context *ssl, int major, int minor )
3521{
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003522 if( major >= SSL_MIN_MAJOR_VERSION && major <= SSL_MAX_MAJOR_VERSION &&
3523 minor >= SSL_MIN_MINOR_VERSION && minor <= SSL_MAX_MINOR_VERSION )
3524 {
3525 ssl->max_major_ver = major;
3526 ssl->max_minor_ver = minor;
3527 }
Paul Bakker490ecc82011-10-06 13:04:09 +00003528}
3529
Paul Bakker1d29fb52012-09-28 13:28:45 +00003530void ssl_set_min_version( ssl_context *ssl, int major, int minor )
3531{
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003532 if( major >= SSL_MIN_MAJOR_VERSION && major <= SSL_MAX_MAJOR_VERSION &&
3533 minor >= SSL_MIN_MINOR_VERSION && minor <= SSL_MAX_MINOR_VERSION )
3534 {
3535 ssl->min_major_ver = major;
3536 ssl->min_minor_ver = minor;
3537 }
Paul Bakker1d29fb52012-09-28 13:28:45 +00003538}
3539
Paul Bakker05decb22013-08-15 13:33:48 +02003540#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003541int ssl_set_max_frag_len( ssl_context *ssl, unsigned char mfl_code )
3542{
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003543 if( mfl_code >= sizeof( mfl_code_to_length ) ||
3544 mfl_code_to_length[mfl_code] > SSL_MAX_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003545 {
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003546 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003547 }
3548
3549 ssl->mfl_code = mfl_code;
3550
3551 return( 0 );
3552}
Paul Bakker05decb22013-08-15 13:33:48 +02003553#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003554
Paul Bakker1f2bc622013-08-15 13:45:55 +02003555#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Paul Bakker8c1ede62013-07-19 14:14:37 +02003556int ssl_set_truncated_hmac( ssl_context *ssl, int truncate )
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003557{
3558 if( ssl->endpoint != SSL_IS_CLIENT )
3559 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3560
Paul Bakker8c1ede62013-07-19 14:14:37 +02003561 ssl->trunc_hmac = truncate;
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003562
3563 return( 0 );
3564}
Paul Bakker1f2bc622013-08-15 13:45:55 +02003565#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003566
Paul Bakker48916f92012-09-16 19:57:18 +00003567void ssl_set_renegotiation( ssl_context *ssl, int renegotiation )
3568{
3569 ssl->disable_renegotiation = renegotiation;
3570}
3571
3572void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy )
3573{
3574 ssl->allow_legacy_renegotiation = allow_legacy;
3575}
3576
Paul Bakkera503a632013-08-14 13:48:06 +02003577#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003578int ssl_set_session_tickets( ssl_context *ssl, int use_tickets )
3579{
3580 ssl->session_tickets = use_tickets;
3581
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003582 if( ssl->endpoint == SSL_IS_CLIENT )
3583 return( 0 );
3584
3585 if( ssl->f_rng == NULL )
3586 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3587
3588 return( ssl_ticket_keys_init( ssl ) );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003589}
Paul Bakker606b4ba2013-08-14 16:52:14 +02003590
3591void ssl_set_session_ticket_lifetime( ssl_context *ssl, int lifetime )
3592{
3593 ssl->ticket_lifetime = lifetime;
3594}
Paul Bakkera503a632013-08-14 13:48:06 +02003595#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003596
Paul Bakker5121ce52009-01-03 21:22:43 +00003597/*
3598 * SSL get accessors
3599 */
Paul Bakker23986e52011-04-24 08:57:21 +00003600size_t ssl_get_bytes_avail( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003601{
3602 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
3603}
3604
Paul Bakkerff60ee62010-03-16 21:09:09 +00003605int ssl_get_verify_result( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003606{
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02003607 return( ssl->session->verify_result );
Paul Bakker5121ce52009-01-03 21:22:43 +00003608}
3609
Paul Bakkere3166ce2011-01-27 17:40:50 +00003610const char *ssl_get_ciphersuite( const ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00003611{
Paul Bakker926c8e42013-03-06 10:23:34 +01003612 if( ssl == NULL || ssl->session == NULL )
3613 return NULL;
3614
Paul Bakkere3166ce2011-01-27 17:40:50 +00003615 return ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00003616}
3617
Paul Bakker43ca69c2011-01-15 17:35:19 +00003618const char *ssl_get_version( const ssl_context *ssl )
3619{
3620 switch( ssl->minor_ver )
3621 {
3622 case SSL_MINOR_VERSION_0:
3623 return( "SSLv3.0" );
3624
3625 case SSL_MINOR_VERSION_1:
3626 return( "TLSv1.0" );
3627
3628 case SSL_MINOR_VERSION_2:
3629 return( "TLSv1.1" );
3630
Paul Bakker1ef83d62012-04-11 12:09:53 +00003631 case SSL_MINOR_VERSION_3:
3632 return( "TLSv1.2" );
3633
Paul Bakker43ca69c2011-01-15 17:35:19 +00003634 default:
3635 break;
3636 }
3637 return( "unknown" );
3638}
3639
Paul Bakkered27a042013-04-18 22:46:23 +02003640#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb0550d92012-10-30 07:51:03 +00003641const x509_cert *ssl_get_peer_cert( const ssl_context *ssl )
3642{
3643 if( ssl == NULL || ssl->session == NULL )
3644 return NULL;
3645
3646 return ssl->session->peer_cert;
3647}
Paul Bakkered27a042013-04-18 22:46:23 +02003648#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00003649
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003650int ssl_get_session( const ssl_context *ssl, ssl_session *dst )
3651{
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003652 if( ssl == NULL ||
3653 dst == NULL ||
3654 ssl->session == NULL ||
3655 ssl->endpoint != SSL_IS_CLIENT )
3656 {
3657 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3658 }
3659
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003660 return( ssl_session_copy( dst, ssl->session ) );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003661}
3662
Paul Bakker5121ce52009-01-03 21:22:43 +00003663/*
Paul Bakker1961b702013-01-25 14:49:24 +01003664 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003665 */
Paul Bakker1961b702013-01-25 14:49:24 +01003666int ssl_handshake_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003667{
Paul Bakker40e46942009-01-03 21:51:57 +00003668 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003669
Paul Bakker40e46942009-01-03 21:51:57 +00003670#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003671 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker1961b702013-01-25 14:49:24 +01003672 ret = ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003673#endif
3674
Paul Bakker40e46942009-01-03 21:51:57 +00003675#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003676 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker1961b702013-01-25 14:49:24 +01003677 ret = ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003678#endif
3679
Paul Bakker1961b702013-01-25 14:49:24 +01003680 return( ret );
3681}
3682
3683/*
3684 * Perform the SSL handshake
3685 */
3686int ssl_handshake( ssl_context *ssl )
3687{
3688 int ret = 0;
3689
3690 SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
3691
3692 while( ssl->state != SSL_HANDSHAKE_OVER )
3693 {
3694 ret = ssl_handshake_step( ssl );
3695
3696 if( ret != 0 )
3697 break;
3698 }
3699
Paul Bakker5121ce52009-01-03 21:22:43 +00003700 SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
3701
3702 return( ret );
3703}
3704
3705/*
Paul Bakker48916f92012-09-16 19:57:18 +00003706 * Renegotiate current connection
3707 */
3708int ssl_renegotiate( ssl_context *ssl )
3709{
3710 int ret;
3711
3712 SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
3713
3714 if( ssl->state != SSL_HANDSHAKE_OVER )
3715 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3716
3717 ssl->state = SSL_HELLO_REQUEST;
3718 ssl->renegotiation = SSL_RENEGOTIATION;
3719
3720 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3721 return( ret );
3722
3723 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3724 {
3725 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3726 return( ret );
3727 }
3728
3729 SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
3730
3731 return( 0 );
3732}
3733
3734/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003735 * Receive application data decrypted from the SSL layer
3736 */
Paul Bakker23986e52011-04-24 08:57:21 +00003737int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003738{
Paul Bakker23986e52011-04-24 08:57:21 +00003739 int ret;
3740 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003741
3742 SSL_DEBUG_MSG( 2, ( "=> read" ) );
3743
3744 if( ssl->state != SSL_HANDSHAKE_OVER )
3745 {
3746 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3747 {
3748 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3749 return( ret );
3750 }
3751 }
3752
3753 if( ssl->in_offt == NULL )
3754 {
3755 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3756 {
Paul Bakker831a7552011-05-18 13:32:51 +00003757 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3758 return( 0 );
3759
Paul Bakker5121ce52009-01-03 21:22:43 +00003760 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3761 return( ret );
3762 }
3763
3764 if( ssl->in_msglen == 0 &&
3765 ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
3766 {
3767 /*
3768 * OpenSSL sends empty messages to randomize the IV
3769 */
3770 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3771 {
Paul Bakker831a7552011-05-18 13:32:51 +00003772 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3773 return( 0 );
3774
Paul Bakker5121ce52009-01-03 21:22:43 +00003775 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3776 return( ret );
3777 }
3778 }
3779
Paul Bakker48916f92012-09-16 19:57:18 +00003780 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
3781 {
3782 SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
3783
3784 if( ssl->endpoint == SSL_IS_CLIENT &&
3785 ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST ||
3786 ssl->in_hslen != 4 ) )
3787 {
3788 SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
3789 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
3790 }
3791
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003792 if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
3793 ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
3794 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) )
Paul Bakker48916f92012-09-16 19:57:18 +00003795 {
3796 SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
3797
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003798#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003799 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakker48916f92012-09-16 19:57:18 +00003800 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003801 /*
3802 * SSLv3 does not have a "no_renegotiation" alert
3803 */
3804 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
3805 return( ret );
3806 }
3807 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003808#endif
3809#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
3810 defined(POLARSSL_SSL_PROTO_TLS1_2)
3811 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 )
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003812 {
3813 if( ( ret = ssl_send_alert_message( ssl,
3814 SSL_ALERT_LEVEL_WARNING,
3815 SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
3816 {
3817 return( ret );
3818 }
Paul Bakker48916f92012-09-16 19:57:18 +00003819 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003820 else
3821#endif
Paul Bakker577e0062013-08-28 11:57:20 +02003822 {
3823 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003824 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +02003825 }
Paul Bakker48916f92012-09-16 19:57:18 +00003826 }
3827 else
3828 {
3829 if( ( ret = ssl_renegotiate( ssl ) ) != 0 )
3830 {
3831 SSL_DEBUG_RET( 1, "ssl_renegotiate", ret );
3832 return( ret );
3833 }
3834
3835 return( POLARSSL_ERR_NET_WANT_READ );
3836 }
3837 }
3838 else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003839 {
3840 SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003841 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003842 }
3843
3844 ssl->in_offt = ssl->in_msg;
3845 }
3846
3847 n = ( len < ssl->in_msglen )
3848 ? len : ssl->in_msglen;
3849
3850 memcpy( buf, ssl->in_offt, n );
3851 ssl->in_msglen -= n;
3852
3853 if( ssl->in_msglen == 0 )
3854 /* all bytes consumed */
3855 ssl->in_offt = NULL;
3856 else
3857 /* more data available */
3858 ssl->in_offt += n;
3859
3860 SSL_DEBUG_MSG( 2, ( "<= read" ) );
3861
Paul Bakker23986e52011-04-24 08:57:21 +00003862 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003863}
3864
3865/*
3866 * Send application data to be encrypted by the SSL layer
3867 */
Paul Bakker23986e52011-04-24 08:57:21 +00003868int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003869{
Paul Bakker23986e52011-04-24 08:57:21 +00003870 int ret;
3871 size_t n;
Paul Bakker05decb22013-08-15 13:33:48 +02003872 unsigned int max_len = SSL_MAX_CONTENT_LEN;
Paul Bakker5121ce52009-01-03 21:22:43 +00003873
3874 SSL_DEBUG_MSG( 2, ( "=> write" ) );
3875
3876 if( ssl->state != SSL_HANDSHAKE_OVER )
3877 {
3878 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3879 {
3880 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3881 return( ret );
3882 }
3883 }
3884
Paul Bakker05decb22013-08-15 13:33:48 +02003885#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003886 /*
3887 * Assume mfl_code is correct since it was checked when set
3888 */
3889 max_len = mfl_code_to_length[ssl->mfl_code];
3890
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003891 /*
Paul Bakker05decb22013-08-15 13:33:48 +02003892 * Check if a smaller max length was negotiated
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003893 */
3894 if( ssl->session_out != NULL &&
3895 mfl_code_to_length[ssl->session_out->mfl_code] < max_len )
3896 {
3897 max_len = mfl_code_to_length[ssl->session_out->mfl_code];
3898 }
Paul Bakker05decb22013-08-15 13:33:48 +02003899#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003900
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003901 n = ( len < max_len) ? len : max_len;
Paul Bakker887bd502011-06-08 13:10:54 +00003902
Paul Bakker5121ce52009-01-03 21:22:43 +00003903 if( ssl->out_left != 0 )
3904 {
3905 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3906 {
3907 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3908 return( ret );
3909 }
3910 }
Paul Bakker887bd502011-06-08 13:10:54 +00003911 else
Paul Bakker1fd00bf2011-03-14 20:50:15 +00003912 {
Paul Bakker887bd502011-06-08 13:10:54 +00003913 ssl->out_msglen = n;
3914 ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
3915 memcpy( ssl->out_msg, buf, n );
3916
3917 if( ( ret = ssl_write_record( ssl ) ) != 0 )
3918 {
3919 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
3920 return( ret );
3921 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003922 }
3923
3924 SSL_DEBUG_MSG( 2, ( "<= write" ) );
3925
Paul Bakker23986e52011-04-24 08:57:21 +00003926 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003927}
3928
3929/*
3930 * Notify the peer that the connection is being closed
3931 */
3932int ssl_close_notify( ssl_context *ssl )
3933{
3934 int ret;
3935
3936 SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
3937
3938 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3939 {
3940 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3941 return( ret );
3942 }
3943
3944 if( ssl->state == SSL_HANDSHAKE_OVER )
3945 {
Paul Bakker48916f92012-09-16 19:57:18 +00003946 if( ( ret = ssl_send_alert_message( ssl,
3947 SSL_ALERT_LEVEL_WARNING,
3948 SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003949 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003950 return( ret );
3951 }
3952 }
3953
3954 SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
3955
3956 return( ret );
3957}
3958
Paul Bakker48916f92012-09-16 19:57:18 +00003959void ssl_transform_free( ssl_transform *transform )
3960{
3961#if defined(POLARSSL_ZLIB_SUPPORT)
3962 deflateEnd( &transform->ctx_deflate );
3963 inflateEnd( &transform->ctx_inflate );
3964#endif
3965
Paul Bakker61d113b2013-07-04 11:51:43 +02003966 md_free_ctx( &transform->md_ctx_enc );
3967 md_free_ctx( &transform->md_ctx_dec );
3968
Paul Bakker48916f92012-09-16 19:57:18 +00003969 memset( transform, 0, sizeof( ssl_transform ) );
3970}
3971
3972void ssl_handshake_free( ssl_handshake_params *handshake )
3973{
3974#if defined(POLARSSL_DHM_C)
3975 dhm_free( &handshake->dhm_ctx );
3976#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02003977#if defined(POLARSSL_ECDH_C)
3978 ecdh_free( &handshake->ecdh_ctx );
3979#endif
3980
Paul Bakker48916f92012-09-16 19:57:18 +00003981 memset( handshake, 0, sizeof( ssl_handshake_params ) );
3982}
3983
3984void ssl_session_free( ssl_session *session )
3985{
Paul Bakkered27a042013-04-18 22:46:23 +02003986#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker0a597072012-09-25 21:55:46 +00003987 if( session->peer_cert != NULL )
Paul Bakker48916f92012-09-16 19:57:18 +00003988 {
Paul Bakker0a597072012-09-25 21:55:46 +00003989 x509_free( session->peer_cert );
Paul Bakker6e339b52013-07-03 13:37:05 +02003990 polarssl_free( session->peer_cert );
Paul Bakker48916f92012-09-16 19:57:18 +00003991 }
Paul Bakkered27a042013-04-18 22:46:23 +02003992#endif
Paul Bakker0a597072012-09-25 21:55:46 +00003993
Paul Bakkera503a632013-08-14 13:48:06 +02003994#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02003995 polarssl_free( session->ticket );
Paul Bakkera503a632013-08-14 13:48:06 +02003996#endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02003997
Paul Bakker0a597072012-09-25 21:55:46 +00003998 memset( session, 0, sizeof( ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003999}
4000
Paul Bakker5121ce52009-01-03 21:22:43 +00004001/*
4002 * Free an SSL context
4003 */
4004void ssl_free( ssl_context *ssl )
4005{
4006 SSL_DEBUG_MSG( 2, ( "=> free" ) );
4007
Paul Bakker5121ce52009-01-03 21:22:43 +00004008 if( ssl->out_ctr != NULL )
4009 {
4010 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02004011 polarssl_free( ssl->out_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00004012 }
4013
4014 if( ssl->in_ctr != NULL )
4015 {
4016 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02004017 polarssl_free( ssl->in_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00004018 }
4019
Paul Bakker40e46942009-01-03 21:51:57 +00004020#if defined(POLARSSL_DHM_C)
Paul Bakker48916f92012-09-16 19:57:18 +00004021 mpi_free( &ssl->dhm_P );
4022 mpi_free( &ssl->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00004023#endif
4024
Paul Bakker48916f92012-09-16 19:57:18 +00004025 if( ssl->transform )
4026 {
4027 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02004028 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00004029 }
4030
4031 if( ssl->handshake )
4032 {
4033 ssl_handshake_free( ssl->handshake );
4034 ssl_transform_free( ssl->transform_negotiate );
4035 ssl_session_free( ssl->session_negotiate );
4036
Paul Bakker6e339b52013-07-03 13:37:05 +02004037 polarssl_free( ssl->handshake );
4038 polarssl_free( ssl->transform_negotiate );
4039 polarssl_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00004040 }
4041
Paul Bakkerc0463502013-02-14 11:19:38 +01004042 if( ssl->session )
4043 {
4044 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02004045 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01004046 }
4047
Paul Bakkera503a632013-08-14 13:48:06 +02004048#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02004049 polarssl_free( ssl->ticket_keys );
Paul Bakkera503a632013-08-14 13:48:06 +02004050#endif
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02004051
Paul Bakker0be444a2013-08-27 21:55:01 +02004052#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
Paul Bakker5121ce52009-01-03 21:22:43 +00004053 if ( ssl->hostname != NULL)
4054 {
4055 memset( ssl->hostname, 0, ssl->hostname_len );
Paul Bakker6e339b52013-07-03 13:37:05 +02004056 polarssl_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00004057 ssl->hostname_len = 0;
4058 }
Paul Bakker0be444a2013-08-27 21:55:01 +02004059#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00004060
Manuel Pégourié-Gonnard070cc7f2013-08-21 15:09:31 +02004061 if( ssl->pk_key_own_alloc )
4062 {
4063 pk_free( ssl->pk_key );
4064 polarssl_free( ssl->pk_key );
4065 }
4066
Paul Bakker05ef8352012-05-08 09:17:57 +00004067#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
4068 if( ssl_hw_record_finish != NULL )
4069 {
4070 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) );
4071 ssl_hw_record_finish( ssl );
4072 }
4073#endif
4074
Paul Bakker5121ce52009-01-03 21:22:43 +00004075 SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00004076
Paul Bakker86f04f42013-02-14 11:20:09 +01004077 /* Actually clear after last debug message */
Paul Bakker2da561c2009-02-05 18:00:28 +00004078 memset( ssl, 0, sizeof( ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004079}
4080
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02004081/*
4082 * Get the SSL_SIG_* constant corresponding to a public key
4083 */
4084unsigned char ssl_sig_from_pk( pk_context *pk )
4085{
4086#if defined(POLARSSL_RSA_C)
4087 if( pk_can_do( pk, POLARSSL_PK_RSA ) )
4088 return( SSL_SIG_RSA );
4089#endif
4090#if defined(POLARSSL_ECDSA_C)
4091 if( pk_can_do( pk, POLARSSL_PK_ECDSA ) )
4092 return( SSL_SIG_ECDSA );
4093#endif
4094 return( SSL_SIG_ANON );
4095}
4096
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004097pk_type_t ssl_pk_alg_from_sig( unsigned char sig )
4098{
4099 switch( sig )
4100 {
4101#if defined(POLARSSL_RSA_C)
4102 case SSL_SIG_RSA:
4103 return( POLARSSL_PK_RSA );
4104#endif
4105#if defined(POLARSSL_ECDSA_C)
4106 case SSL_SIG_ECDSA:
4107 return( POLARSSL_PK_ECDSA );
4108#endif
4109 default:
4110 return( POLARSSL_PK_NONE );
4111 }
4112}
4113
4114md_type_t ssl_md_alg_from_hash( unsigned char hash )
4115{
4116 switch( hash )
4117 {
4118#if defined(POLARSSL_MD5_C)
4119 case SSL_HASH_MD5:
4120 return( POLARSSL_MD_MD5 );
4121#endif
4122#if defined(POLARSSL_SHA1_C)
4123 case SSL_HASH_SHA1:
4124 return( POLARSSL_MD_SHA1 );
4125#endif
4126#if defined(POLARSSL_SHA256_C)
4127 case SSL_HASH_SHA224:
4128 return( POLARSSL_MD_SHA224 );
4129 case SSL_HASH_SHA256:
4130 return( POLARSSL_MD_SHA256 );
4131#endif
4132#if defined(POLARSSL_SHA512_C)
4133 case SSL_HASH_SHA384:
4134 return( POLARSSL_MD_SHA384 );
4135 case SSL_HASH_SHA512:
4136 return( POLARSSL_MD_SHA512 );
4137#endif
4138 default:
4139 return( POLARSSL_MD_NONE );
4140 }
4141}
4142
Paul Bakker5121ce52009-01-03 21:22:43 +00004143#endif