blob: db87fe0c0d6e653b314231149cc1dea5916d6aac [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 shared functions
3 *
Paul Bakker68884e32013-01-07 18:20:04 +01004 * Copyright (C) 2006-2013, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25/*
26 * The SSL 3.0 specification was drafted by Netscape in 1996,
27 * and became an IETF standard in 1999.
28 *
29 * http://wp.netscape.com/eng/ssl3/
30 * http://www.ietf.org/rfc/rfc2246.txt
31 * http://www.ietf.org/rfc/rfc4346.txt
32 */
33
Paul Bakker40e46942009-01-03 21:51:57 +000034#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakker40e46942009-01-03 21:51:57 +000036#if defined(POLARSSL_SSL_TLS_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Paul Bakker40e46942009-01-03 21:51:57 +000038#include "polarssl/aes.h"
39#include "polarssl/arc4.h"
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000040#include "polarssl/camellia.h"
Paul Bakker40e46942009-01-03 21:51:57 +000041#include "polarssl/des.h"
42#include "polarssl/debug.h"
43#include "polarssl/ssl.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000044
Paul Bakkerca4ab492012-04-18 14:23:57 +000045#if defined(POLARSSL_GCM_C)
46#include "polarssl/gcm.h"
47#endif
48
Paul Bakker6e339b52013-07-03 13:37:05 +020049#if defined(POLARSSL_MEMORY_C)
50#include "polarssl/memory.h"
51#else
52#define polarssl_malloc malloc
53#define polarssl_free free
54#endif
55
Paul Bakker5121ce52009-01-03 21:22:43 +000056#include <stdlib.h>
Paul Bakker5121ce52009-01-03 21:22:43 +000057
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000058#if defined _MSC_VER && !defined strcasecmp
59#define strcasecmp _stricmp
60#endif
61
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020062/*
63 * Convert max_fragment_length codes to length.
64 * RFC 6066 says:
65 * enum{
66 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
67 * } MaxFragmentLength;
68 * and we add 0 -> extension unused
69 */
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +020070static unsigned int mfl_code_to_length[SSL_MAX_FRAG_LEN_INVALID] =
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020071{
72 SSL_MAX_CONTENT_LEN, /* SSL_MAX_FRAG_LEN_NONE */
73 512, /* SSL_MAX_FRAG_LEN_512 */
74 1024, /* SSL_MAX_FRAG_LEN_1024 */
75 2048, /* SSL_MAX_FRAG_LEN_2048 */
76 4096, /* SSL_MAX_FRAG_LEN_4096 */
77};
78
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020079static int ssl_session_copy( ssl_session *dst, const ssl_session *src )
80{
81 int ret;
82
83 ssl_session_free( dst );
84 memcpy( dst, src, sizeof( ssl_session ) );
85
86#if defined(POLARSSL_X509_PARSE_C)
87 if( src->peer_cert != NULL )
88 {
89 if( ( dst->peer_cert = polarssl_malloc( sizeof(x509_cert) ) ) == NULL )
90 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
91
92 memset( dst->peer_cert, 0, sizeof(x509_cert) );
93
94 if( ( ret = x509parse_crt( dst->peer_cert, src->peer_cert->raw.p,
95 src->peer_cert->raw.len ) != 0 ) )
96 {
97 polarssl_free( dst->peer_cert );
98 dst->peer_cert = NULL;
99 return( ret );
100 }
101 }
102#endif /* POLARSSL_X509_PARSE_C */
103
104 if( src->ticket != NULL )
105 {
106 if( ( dst->ticket = polarssl_malloc( src->ticket_len ) ) == NULL )
107 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
108
109 memcpy( dst->ticket, src->ticket, src->ticket_len );
110 }
111
112 return( 0 );
113}
114
Paul Bakker05ef8352012-05-08 09:17:57 +0000115#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
116int (*ssl_hw_record_init)(ssl_context *ssl,
117 const unsigned char *key_enc, const unsigned char *key_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100118 size_t keylen,
Paul Bakker05ef8352012-05-08 09:17:57 +0000119 const unsigned char *iv_enc, const unsigned char *iv_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100120 size_t ivlen,
121 const unsigned char *mac_enc, const unsigned char *mac_dec,
122 size_t maclen) = NULL;
123int (*ssl_hw_record_activate)(ssl_context *ssl, int direction) = NULL;
Paul Bakker05ef8352012-05-08 09:17:57 +0000124int (*ssl_hw_record_reset)(ssl_context *ssl) = NULL;
125int (*ssl_hw_record_write)(ssl_context *ssl) = NULL;
126int (*ssl_hw_record_read)(ssl_context *ssl) = NULL;
127int (*ssl_hw_record_finish)(ssl_context *ssl) = NULL;
128#endif
129
Paul Bakkered27a042013-04-18 22:46:23 +0200130#if defined(POLARSSL_RSA_C)
Paul Bakkereb2c6582012-09-27 19:15:01 +0000131static int ssl_rsa_decrypt( void *ctx, int mode, size_t *olen,
132 const unsigned char *input, unsigned char *output,
133 size_t output_max_len )
134{
135 return rsa_pkcs1_decrypt( (rsa_context *) ctx, mode, olen, input, output,
136 output_max_len );
137}
138
139static int ssl_rsa_sign( void *ctx,
140 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
141 int mode, int hash_id, unsigned int hashlen,
142 const unsigned char *hash, unsigned char *sig )
143{
144 return rsa_pkcs1_sign( (rsa_context *) ctx, f_rng, p_rng, mode, hash_id,
145 hashlen, hash, sig );
146}
147
148static size_t ssl_rsa_key_len( void *ctx )
149{
150 return ( (rsa_context *) ctx )->len;
151}
Paul Bakkered27a042013-04-18 22:46:23 +0200152#endif /* POLARSSL_RSA_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +0000153
Paul Bakker5121ce52009-01-03 21:22:43 +0000154/*
155 * Key material generation
156 */
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200157static int ssl3_prf( const unsigned char *secret, size_t slen,
158 const char *label,
159 const unsigned char *random, size_t rlen,
Paul Bakker5f70b252012-09-13 14:23:06 +0000160 unsigned char *dstbuf, size_t dlen )
161{
162 size_t i;
163 md5_context md5;
164 sha1_context sha1;
165 unsigned char padding[16];
166 unsigned char sha1sum[20];
167 ((void)label);
168
169 /*
170 * SSLv3:
171 * block =
172 * MD5( secret + SHA1( 'A' + secret + random ) ) +
173 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
174 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
175 * ...
176 */
177 for( i = 0; i < dlen / 16; i++ )
178 {
179 memset( padding, 'A' + i, 1 + i );
180
181 sha1_starts( &sha1 );
182 sha1_update( &sha1, padding, 1 + i );
183 sha1_update( &sha1, secret, slen );
184 sha1_update( &sha1, random, rlen );
185 sha1_finish( &sha1, sha1sum );
186
187 md5_starts( &md5 );
188 md5_update( &md5, secret, slen );
189 md5_update( &md5, sha1sum, 20 );
190 md5_finish( &md5, dstbuf + i * 16 );
191 }
192
193 memset( &md5, 0, sizeof( md5 ) );
194 memset( &sha1, 0, sizeof( sha1 ) );
195
196 memset( padding, 0, sizeof( padding ) );
197 memset( sha1sum, 0, sizeof( sha1sum ) );
198
199 return( 0 );
200}
201
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200202static int tls1_prf( const unsigned char *secret, size_t slen,
203 const char *label,
204 const unsigned char *random, size_t rlen,
Paul Bakker23986e52011-04-24 08:57:21 +0000205 unsigned char *dstbuf, size_t dlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000206{
Paul Bakker23986e52011-04-24 08:57:21 +0000207 size_t nb, hs;
208 size_t i, j, k;
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200209 const unsigned char *S1, *S2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000210 unsigned char tmp[128];
211 unsigned char h_i[20];
212
213 if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
Paul Bakker40e46942009-01-03 21:51:57 +0000214 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000215
216 hs = ( slen + 1 ) / 2;
217 S1 = secret;
218 S2 = secret + slen - hs;
219
220 nb = strlen( label );
221 memcpy( tmp + 20, label, nb );
222 memcpy( tmp + 20 + nb, random, rlen );
223 nb += rlen;
224
225 /*
226 * First compute P_md5(secret,label+random)[0..dlen]
227 */
228 md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
229
230 for( i = 0; i < dlen; i += 16 )
231 {
232 md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
233 md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp );
234
235 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
236
237 for( j = 0; j < k; j++ )
238 dstbuf[i + j] = h_i[j];
239 }
240
241 /*
242 * XOR out with P_sha1(secret,label+random)[0..dlen]
243 */
244 sha1_hmac( S2, hs, tmp + 20, nb, tmp );
245
246 for( i = 0; i < dlen; i += 20 )
247 {
248 sha1_hmac( S2, hs, tmp, 20 + nb, h_i );
249 sha1_hmac( S2, hs, tmp, 20, tmp );
250
251 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
252
253 for( j = 0; j < k; j++ )
254 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
255 }
256
257 memset( tmp, 0, sizeof( tmp ) );
258 memset( h_i, 0, sizeof( h_i ) );
259
260 return( 0 );
261}
262
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200263static int tls_prf_sha256( const unsigned char *secret, size_t slen,
264 const char *label,
265 const unsigned char *random, size_t rlen,
Paul Bakker1ef83d62012-04-11 12:09:53 +0000266 unsigned char *dstbuf, size_t dlen )
267{
268 size_t nb;
269 size_t i, j, k;
270 unsigned char tmp[128];
271 unsigned char h_i[32];
272
273 if( sizeof( tmp ) < 32 + strlen( label ) + rlen )
274 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
275
276 nb = strlen( label );
277 memcpy( tmp + 32, label, nb );
278 memcpy( tmp + 32 + nb, random, rlen );
279 nb += rlen;
280
281 /*
282 * Compute P_<hash>(secret, label + random)[0..dlen]
283 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200284 sha256_hmac( secret, slen, tmp + 32, nb, tmp, 0 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000285
286 for( i = 0; i < dlen; i += 32 )
287 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200288 sha256_hmac( secret, slen, tmp, 32 + nb, h_i, 0 );
289 sha256_hmac( secret, slen, tmp, 32, tmp, 0 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000290
291 k = ( i + 32 > dlen ) ? dlen % 32 : 32;
292
293 for( j = 0; j < k; j++ )
294 dstbuf[i + j] = h_i[j];
295 }
296
297 memset( tmp, 0, sizeof( tmp ) );
298 memset( h_i, 0, sizeof( h_i ) );
299
300 return( 0 );
301}
302
Paul Bakker9e36f042013-06-30 14:34:05 +0200303#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200304static int tls_prf_sha384( const unsigned char *secret, size_t slen,
305 const char *label,
306 const unsigned char *random, size_t rlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000307 unsigned char *dstbuf, size_t dlen )
308{
309 size_t nb;
310 size_t i, j, k;
311 unsigned char tmp[128];
312 unsigned char h_i[48];
313
314 if( sizeof( tmp ) < 48 + strlen( label ) + rlen )
315 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
316
317 nb = strlen( label );
318 memcpy( tmp + 48, label, nb );
319 memcpy( tmp + 48 + nb, random, rlen );
320 nb += rlen;
321
322 /*
323 * Compute P_<hash>(secret, label + random)[0..dlen]
324 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200325 sha512_hmac( secret, slen, tmp + 48, nb, tmp, 1 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000326
327 for( i = 0; i < dlen; i += 48 )
328 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200329 sha512_hmac( secret, slen, tmp, 48 + nb, h_i, 1 );
330 sha512_hmac( secret, slen, tmp, 48, tmp, 1 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000331
332 k = ( i + 48 > dlen ) ? dlen % 48 : 48;
333
334 for( j = 0; j < k; j++ )
335 dstbuf[i + j] = h_i[j];
336 }
337
338 memset( tmp, 0, sizeof( tmp ) );
339 memset( h_i, 0, sizeof( h_i ) );
340
341 return( 0 );
342}
Paul Bakker769075d2012-11-24 11:26:46 +0100343#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +0000344
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200345static void ssl_update_checksum_start(ssl_context *, const unsigned char *, size_t);
346static void ssl_update_checksum_md5sha1(ssl_context *, const unsigned char *, size_t);
347static void ssl_update_checksum_sha256(ssl_context *, const unsigned char *, size_t);
Paul Bakker380da532012-04-18 16:10:25 +0000348
349static void ssl_calc_verify_ssl(ssl_context *,unsigned char *);
350static void ssl_calc_verify_tls(ssl_context *,unsigned char *);
351static void ssl_calc_verify_tls_sha256(ssl_context *,unsigned char *);
Paul Bakker380da532012-04-18 16:10:25 +0000352
Paul Bakkerca4ab492012-04-18 14:23:57 +0000353static void ssl_calc_finished_ssl(ssl_context *,unsigned char *,int);
354static void ssl_calc_finished_tls(ssl_context *,unsigned char *,int);
355static void ssl_calc_finished_tls_sha256(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100356
Paul Bakker9e36f042013-06-30 14:34:05 +0200357#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200358static void ssl_update_checksum_sha384(ssl_context *, const unsigned char *, size_t);
Paul Bakker769075d2012-11-24 11:26:46 +0100359static void ssl_calc_verify_tls_sha384(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000360static void ssl_calc_finished_tls_sha384(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100361#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000362
Paul Bakker5121ce52009-01-03 21:22:43 +0000363int ssl_derive_keys( ssl_context *ssl )
364{
Paul Bakker5121ce52009-01-03 21:22:43 +0000365 unsigned char tmp[64];
Paul Bakker5121ce52009-01-03 21:22:43 +0000366 unsigned char keyblk[256];
367 unsigned char *key1;
368 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100369 unsigned char *mac_enc;
370 unsigned char *mac_dec;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000371 unsigned int iv_copy_len;
Paul Bakker68884e32013-01-07 18:20:04 +0100372 const cipher_info_t *cipher_info;
373 const md_info_t *md_info;
Paul Bakker61d113b2013-07-04 11:51:43 +0200374 int ret;
Paul Bakker68884e32013-01-07 18:20:04 +0100375
Paul Bakker48916f92012-09-16 19:57:18 +0000376 ssl_session *session = ssl->session_negotiate;
377 ssl_transform *transform = ssl->transform_negotiate;
378 ssl_handshake_params *handshake = ssl->handshake;
Paul Bakker5121ce52009-01-03 21:22:43 +0000379
380 SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
381
Paul Bakker68884e32013-01-07 18:20:04 +0100382 cipher_info = cipher_info_from_type( transform->ciphersuite_info->cipher );
383 if( cipher_info == NULL )
384 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200385 SSL_DEBUG_MSG( 1, ( "cipher info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100386 transform->ciphersuite_info->cipher ) );
387 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
388 }
389
390 md_info = md_info_from_type( transform->ciphersuite_info->mac );
391 if( md_info == NULL )
392 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200393 SSL_DEBUG_MSG( 1, ( "md info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100394 transform->ciphersuite_info->mac ) );
395 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
396 }
397
Paul Bakker5121ce52009-01-03 21:22:43 +0000398 /*
Paul Bakkerca4ab492012-04-18 14:23:57 +0000399 * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
Paul Bakker1ef83d62012-04-11 12:09:53 +0000400 */
401 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000402 {
Paul Bakker48916f92012-09-16 19:57:18 +0000403 handshake->tls_prf = ssl3_prf;
404 handshake->calc_verify = ssl_calc_verify_ssl;
405 handshake->calc_finished = ssl_calc_finished_ssl;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000406 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000407 else if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000408 {
Paul Bakker48916f92012-09-16 19:57:18 +0000409 handshake->tls_prf = tls1_prf;
410 handshake->calc_verify = ssl_calc_verify_tls;
411 handshake->calc_finished = ssl_calc_finished_tls;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000412 }
Paul Bakker9e36f042013-06-30 14:34:05 +0200413#if defined(POLARSSL_SHA512_C)
Paul Bakkerb7149bc2013-03-20 15:30:09 +0100414 else if( transform->ciphersuite_info->mac ==
415 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 Bakker769075d2012-11-24 11:26:46 +0100421#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000422 else
Paul Bakkerca4ab492012-04-18 14:23:57 +0000423 {
Paul Bakker48916f92012-09-16 19:57:18 +0000424 handshake->tls_prf = tls_prf_sha256;
425 handshake->calc_verify = ssl_calc_verify_tls_sha256;
426 handshake->calc_finished = ssl_calc_finished_tls_sha256;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000427 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000428
429 /*
Paul Bakker5121ce52009-01-03 21:22:43 +0000430 * SSLv3:
431 * master =
432 * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
433 * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
434 * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
Paul Bakkerf7abd422013-04-16 13:15:56 +0200435 *
Paul Bakker5121ce52009-01-03 21:22:43 +0000436 * TLSv1:
437 * master = PRF( premaster, "master secret", randbytes )[0..47]
438 */
Paul Bakker0a597072012-09-25 21:55:46 +0000439 if( handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000440 {
Paul Bakker48916f92012-09-16 19:57:18 +0000441 SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
442 handshake->pmslen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000443
Paul Bakker48916f92012-09-16 19:57:18 +0000444 handshake->tls_prf( handshake->premaster, handshake->pmslen,
445 "master secret",
446 handshake->randbytes, 64, session->master, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000447
Paul Bakker48916f92012-09-16 19:57:18 +0000448 memset( handshake->premaster, 0, sizeof( handshake->premaster ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000449 }
450 else
451 SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
452
453 /*
454 * Swap the client and server random values.
455 */
Paul Bakker48916f92012-09-16 19:57:18 +0000456 memcpy( tmp, handshake->randbytes, 64 );
457 memcpy( handshake->randbytes, tmp + 32, 32 );
458 memcpy( handshake->randbytes + 32, tmp, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000459 memset( tmp, 0, sizeof( tmp ) );
460
461 /*
462 * SSLv3:
463 * key block =
464 * MD5( master + SHA1( 'A' + master + randbytes ) ) +
465 * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
466 * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
467 * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
468 * ...
469 *
470 * TLSv1:
471 * key block = PRF( master, "key expansion", randbytes )
472 */
Paul Bakker48916f92012-09-16 19:57:18 +0000473 handshake->tls_prf( session->master, 48, "key expansion",
474 handshake->randbytes, 64, keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000475
Paul Bakker48916f92012-09-16 19:57:18 +0000476 SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
477 ssl_get_ciphersuite_name( session->ciphersuite ) ) );
478 SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
479 SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000480 SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
481
Paul Bakker48916f92012-09-16 19:57:18 +0000482 memset( handshake->randbytes, 0, sizeof( handshake->randbytes ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000483
484 /*
485 * Determine the appropriate key, IV and MAC length.
486 */
Paul Bakker68884e32013-01-07 18:20:04 +0100487
488 if( cipher_info->mode == POLARSSL_MODE_GCM )
Paul Bakker5121ce52009-01-03 21:22:43 +0000489 {
Paul Bakker68884e32013-01-07 18:20:04 +0100490 transform->keylen = cipher_info->key_length;
491 transform->keylen /= 8;
492 transform->minlen = 1;
493 transform->ivlen = 12;
494 transform->fixed_ivlen = 4;
495 transform->maclen = 0;
496 }
497 else
498 {
499 if( md_info->type != POLARSSL_MD_NONE )
500 {
Paul Bakker61d113b2013-07-04 11:51:43 +0200501 if( ( ret = md_init_ctx( &transform->md_ctx_enc, md_info ) ) != 0 )
502 {
503 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
504 return( ret );
505 }
506
507 if( ( ret = md_init_ctx( &transform->md_ctx_dec, md_info ) ) != 0 )
508 {
509 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
510 return( ret );
511 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000512
Paul Bakker68884e32013-01-07 18:20:04 +0100513 transform->maclen = md_get_size( md_info );
Manuel Pégourié-Gonnard277f7f22013-07-19 12:19:21 +0200514
515 /*
516 * If HMAC is to be truncated, we shall keep the leftmost bytes,
517 * (rfc 6066 page 13 or rfc 2104 section 4),
518 * so we only need to adjust the length here.
519 */
520 if( session->trunc_hmac == SSL_TRUNC_HMAC_ENABLED )
521 transform->maclen = SSL_TRUNCATED_HMAC_LEN;
Paul Bakker68884e32013-01-07 18:20:04 +0100522 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000523
Paul Bakker68884e32013-01-07 18:20:04 +0100524 transform->keylen = cipher_info->key_length;
525 transform->keylen /= 8;
526 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +0000527
Paul Bakker68884e32013-01-07 18:20:04 +0100528 transform->minlen = transform->keylen;
529 if( transform->minlen < transform->maclen )
530 {
531 if( cipher_info->mode == POLARSSL_MODE_STREAM )
532 transform->minlen = transform->maclen;
533 else
534 transform->minlen += transform->keylen;
535 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000536 }
537
538 SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000539 transform->keylen, transform->minlen, transform->ivlen,
540 transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000541
542 /*
543 * Finally setup the cipher contexts, IVs and MAC secrets.
544 */
545 if( ssl->endpoint == SSL_IS_CLIENT )
546 {
Paul Bakker48916f92012-09-16 19:57:18 +0000547 key1 = keyblk + transform->maclen * 2;
548 key2 = keyblk + transform->maclen * 2 + transform->keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000549
Paul Bakker68884e32013-01-07 18:20:04 +0100550 mac_enc = keyblk;
551 mac_dec = keyblk + transform->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000552
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000553 /*
554 * This is not used in TLS v1.1.
555 */
Paul Bakker48916f92012-09-16 19:57:18 +0000556 iv_copy_len = ( transform->fixed_ivlen ) ?
557 transform->fixed_ivlen : transform->ivlen;
558 memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len );
559 memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000560 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000561 }
562 else
563 {
Paul Bakker48916f92012-09-16 19:57:18 +0000564 key1 = keyblk + transform->maclen * 2 + transform->keylen;
565 key2 = keyblk + transform->maclen * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000566
Paul Bakker68884e32013-01-07 18:20:04 +0100567 mac_enc = keyblk + transform->maclen;
568 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +0000569
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000570 /*
571 * This is not used in TLS v1.1.
572 */
Paul Bakker48916f92012-09-16 19:57:18 +0000573 iv_copy_len = ( transform->fixed_ivlen ) ?
574 transform->fixed_ivlen : transform->ivlen;
575 memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len );
576 memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000577 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000578 }
579
Paul Bakker68884e32013-01-07 18:20:04 +0100580 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
581 {
582 memcpy( transform->mac_enc, mac_enc, transform->maclen );
583 memcpy( transform->mac_dec, mac_dec, transform->maclen );
584 }
585 else
586 {
587 md_hmac_starts( &transform->md_ctx_enc, mac_enc, transform->maclen );
588 md_hmac_starts( &transform->md_ctx_dec, mac_dec, transform->maclen );
589 }
590
Paul Bakker05ef8352012-05-08 09:17:57 +0000591#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
592 if( ssl_hw_record_init != NULL)
593 {
594 int ret = 0;
595
596 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) );
597
Paul Bakker07eb38b2012-12-19 14:42:06 +0100598 if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->keylen,
599 transform->iv_enc, transform->iv_dec,
600 iv_copy_len,
Paul Bakker68884e32013-01-07 18:20:04 +0100601 mac_enc, mac_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100602 transform->maclen ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +0000603 {
604 SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret );
605 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
606 }
607 }
608#endif
609
Paul Bakker68884e32013-01-07 18:20:04 +0100610 switch( cipher_info->type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000611 {
Paul Bakker40e46942009-01-03 21:51:57 +0000612#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100613 case POLARSSL_CIPHER_ARC4_128:
Paul Bakker48916f92012-09-16 19:57:18 +0000614 arc4_setup( (arc4_context *) transform->ctx_enc, key1,
615 transform->keylen );
616 arc4_setup( (arc4_context *) transform->ctx_dec, key2,
617 transform->keylen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000618 break;
619#endif
620
Paul Bakker40e46942009-01-03 21:51:57 +0000621#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100622 case POLARSSL_CIPHER_DES_EDE3_CBC:
623 des3_set3key_enc( (des3_context *) transform->ctx_enc, key1 );
624 des3_set3key_dec( (des3_context *) transform->ctx_dec, key2 );
625 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000626#endif
627
Paul Bakker40e46942009-01-03 21:51:57 +0000628#if defined(POLARSSL_AES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100629 case POLARSSL_CIPHER_AES_128_CBC:
630 case POLARSSL_CIPHER_AES_256_CBC:
631 aes_setkey_enc( (aes_context*) transform->ctx_enc, key1,
632 cipher_info->key_length );
633 aes_setkey_dec( (aes_context*) transform->ctx_dec, key2,
634 cipher_info->key_length );
Paul Bakker5121ce52009-01-03 21:22:43 +0000635 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000636#endif
637
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000638#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100639 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
640 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
641 camellia_setkey_enc( (camellia_context*) transform->ctx_enc, key1,
642 cipher_info->key_length );
643 camellia_setkey_dec( (camellia_context*) transform->ctx_dec, key2,
644 cipher_info->key_length );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000645 break;
646#endif
647
Paul Bakkerfab5c822012-02-06 16:45:10 +0000648#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100649 case POLARSSL_CIPHER_DES_CBC:
Paul Bakker48916f92012-09-16 19:57:18 +0000650 des_setkey_enc( (des_context *) transform->ctx_enc, key1 );
651 des_setkey_dec( (des_context *) transform->ctx_dec, key2 );
Paul Bakkerfab5c822012-02-06 16:45:10 +0000652 break;
653#endif
Paul Bakker68884e32013-01-07 18:20:04 +0100654
655#if defined(POLARSSL_GCM_C)
656 case POLARSSL_CIPHER_AES_128_GCM:
657 case POLARSSL_CIPHER_AES_256_GCM:
658 gcm_init( (gcm_context *) transform->ctx_enc, key1,
659 cipher_info->key_length );
660 gcm_init( (gcm_context *) transform->ctx_dec, key2,
661 cipher_info->key_length );
662 break;
663#endif
664
665 case POLARSSL_CIPHER_NULL:
666 break;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000667
Paul Bakker5121ce52009-01-03 21:22:43 +0000668 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000669 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000670 }
671
672 memset( keyblk, 0, sizeof( keyblk ) );
673
Paul Bakker2770fbd2012-07-03 13:30:23 +0000674#if defined(POLARSSL_ZLIB_SUPPORT)
675 // Initialize compression
676 //
Paul Bakker48916f92012-09-16 19:57:18 +0000677 if( session->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000678 {
679 SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
680
Paul Bakker48916f92012-09-16 19:57:18 +0000681 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
682 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000683
Paul Bakker48916f92012-09-16 19:57:18 +0000684 if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK ||
685 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000686 {
687 SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
688 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
689 }
690 }
691#endif /* POLARSSL_ZLIB_SUPPORT */
692
Paul Bakker5121ce52009-01-03 21:22:43 +0000693 SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
694
695 return( 0 );
696}
697
Paul Bakker380da532012-04-18 16:10:25 +0000698void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000699{
700 md5_context md5;
701 sha1_context sha1;
702 unsigned char pad_1[48];
703 unsigned char pad_2[48];
704
Paul Bakker380da532012-04-18 16:10:25 +0000705 SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000706
Paul Bakker48916f92012-09-16 19:57:18 +0000707 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
708 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000709
Paul Bakker380da532012-04-18 16:10:25 +0000710 memset( pad_1, 0x36, 48 );
711 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000712
Paul Bakker48916f92012-09-16 19:57:18 +0000713 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000714 md5_update( &md5, pad_1, 48 );
715 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000716
Paul Bakker380da532012-04-18 16:10:25 +0000717 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +0000718 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000719 md5_update( &md5, pad_2, 48 );
720 md5_update( &md5, hash, 16 );
721 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000722
Paul Bakker48916f92012-09-16 19:57:18 +0000723 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000724 sha1_update( &sha1, pad_1, 40 );
725 sha1_finish( &sha1, hash + 16 );
726
727 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +0000728 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000729 sha1_update( &sha1, pad_2, 40 );
730 sha1_update( &sha1, hash + 16, 20 );
731 sha1_finish( &sha1, hash + 16 );
732
733 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
734 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
735
736 return;
737}
738
739void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] )
740{
741 md5_context md5;
742 sha1_context sha1;
743
744 SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
745
Paul Bakker48916f92012-09-16 19:57:18 +0000746 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
747 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000748
Paul Bakker48916f92012-09-16 19:57:18 +0000749 md5_finish( &md5, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000750 sha1_finish( &sha1, hash + 16 );
751
752 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
753 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
754
755 return;
756}
757
758void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] )
759{
Paul Bakker9e36f042013-06-30 14:34:05 +0200760 sha256_context sha256;
Paul Bakker380da532012-04-18 16:10:25 +0000761
762 SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
763
Paul Bakker9e36f042013-06-30 14:34:05 +0200764 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
765 sha256_finish( &sha256, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000766
767 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
768 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
769
770 return;
771}
772
Paul Bakker9e36f042013-06-30 14:34:05 +0200773#if defined(POLARSSL_SHA512_C)
Paul Bakker380da532012-04-18 16:10:25 +0000774void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] )
775{
Paul Bakker9e36f042013-06-30 14:34:05 +0200776 sha512_context sha512;
Paul Bakker380da532012-04-18 16:10:25 +0000777
778 SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
779
Paul Bakker9e36f042013-06-30 14:34:05 +0200780 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
781 sha512_finish( &sha512, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000782
Paul Bakkerca4ab492012-04-18 14:23:57 +0000783 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000784 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
785
786 return;
787}
Paul Bakker769075d2012-11-24 11:26:46 +0100788#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000789
790/*
791 * SSLv3.0 MAC functions
792 */
Paul Bakker68884e32013-01-07 18:20:04 +0100793static void ssl_mac( md_context_t *md_ctx, unsigned char *secret,
794 unsigned char *buf, size_t len,
795 unsigned char *ctr, int type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000796{
797 unsigned char header[11];
798 unsigned char padding[48];
Paul Bakker68884e32013-01-07 18:20:04 +0100799 int padlen = 0;
800 int md_size = md_get_size( md_ctx->md_info );
801 int md_type = md_get_type( md_ctx->md_info );
802
803 if( md_type == POLARSSL_MD_MD5 )
804 padlen = 48;
805 else if( md_type == POLARSSL_MD_SHA1 )
806 padlen = 40;
807 else if( md_type == POLARSSL_MD_SHA256 )
808 padlen = 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000809
810 memcpy( header, ctr, 8 );
811 header[ 8] = (unsigned char) type;
812 header[ 9] = (unsigned char)( len >> 8 );
813 header[10] = (unsigned char)( len );
814
Paul Bakker68884e32013-01-07 18:20:04 +0100815 memset( padding, 0x36, padlen );
816 md_starts( md_ctx );
817 md_update( md_ctx, secret, md_size );
818 md_update( md_ctx, padding, padlen );
819 md_update( md_ctx, header, 11 );
820 md_update( md_ctx, buf, len );
821 md_finish( md_ctx, buf + len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000822
Paul Bakker68884e32013-01-07 18:20:04 +0100823 memset( padding, 0x5C, padlen );
824 md_starts( md_ctx );
825 md_update( md_ctx, secret, md_size );
826 md_update( md_ctx, padding, padlen );
827 md_update( md_ctx, buf + len, md_size );
828 md_finish( md_ctx, buf + len );
Paul Bakker5f70b252012-09-13 14:23:06 +0000829}
830
Paul Bakker5121ce52009-01-03 21:22:43 +0000831/*
832 * Encryption/decryption functions
Paul Bakkerf7abd422013-04-16 13:15:56 +0200833 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000834static int ssl_encrypt_buf( ssl_context *ssl )
835{
Paul Bakker23986e52011-04-24 08:57:21 +0000836 size_t i, padlen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000837
838 SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
839
840 /*
841 * Add MAC then encrypt
842 */
843 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
844 {
Paul Bakker68884e32013-01-07 18:20:04 +0100845 ssl_mac( &ssl->transform_out->md_ctx_enc,
846 ssl->transform_out->mac_enc,
847 ssl->out_msg, ssl->out_msglen,
848 ssl->out_ctr, ssl->out_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +0000849 }
850 else
851 {
Paul Bakker68884e32013-01-07 18:20:04 +0100852 md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 13 );
853 md_hmac_update( &ssl->transform_out->md_ctx_enc,
854 ssl->out_msg, ssl->out_msglen );
855 md_hmac_finish( &ssl->transform_out->md_ctx_enc,
856 ssl->out_msg + ssl->out_msglen );
857 md_hmac_reset( &ssl->transform_out->md_ctx_enc );
Paul Bakker5121ce52009-01-03 21:22:43 +0000858 }
859
860 SSL_DEBUG_BUF( 4, "computed mac",
Paul Bakker48916f92012-09-16 19:57:18 +0000861 ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000862
Paul Bakker48916f92012-09-16 19:57:18 +0000863 ssl->out_msglen += ssl->transform_out->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000864
Paul Bakker68884e32013-01-07 18:20:04 +0100865#if defined(POLARSSL_CIPHER_NULL_CIPHER)
866 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
867 {
868 padlen = 0;
869 }
870 else
871#endif /* POLARSSL_CIPHER_NULL_CIPHER */
872#if defined(POLARSSL_ARC4_C)
873 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000874 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000875 padlen = 0;
876
877 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
878 "including %d bytes of padding",
879 ssl->out_msglen, 0 ) );
880
881 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
882 ssl->out_msg, ssl->out_msglen );
883
Paul Bakker68884e32013-01-07 18:20:04 +0100884 arc4_crypt( (arc4_context *) ssl->transform_out->ctx_enc,
885 ssl->out_msglen, ssl->out_msg,
886 ssl->out_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +0000887 }
Paul Bakker68884e32013-01-07 18:20:04 +0100888 else
889#endif /* POLARSSL_ARC4_C */
890#if defined(POLARSSL_GCM_C)
891 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
892 ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000893 {
894 size_t enc_msglen;
895 unsigned char *enc_msg;
896 unsigned char add_data[13];
897 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
898
899 padlen = 0;
900 enc_msglen = ssl->out_msglen;
901
902 memcpy( add_data, ssl->out_ctr, 8 );
903 add_data[8] = ssl->out_msgtype;
904 add_data[9] = ssl->major_ver;
905 add_data[10] = ssl->minor_ver;
906 add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
907 add_data[12] = ssl->out_msglen & 0xFF;
908
909 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
910 add_data, 13 );
911
Paul Bakker68884e32013-01-07 18:20:04 +0100912 /*
913 * Generate IV
914 */
915 ret = ssl->f_rng( ssl->p_rng,
Paul Bakker48916f92012-09-16 19:57:18 +0000916 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
Paul Bakker68884e32013-01-07 18:20:04 +0100917 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
918 if( ret != 0 )
919 return( ret );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000920
Paul Bakker68884e32013-01-07 18:20:04 +0100921 memcpy( ssl->out_iv,
922 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
923 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000924
Paul Bakker68884e32013-01-07 18:20:04 +0100925 /*
926 * Fix pointer positions and message length with added IV
927 */
928 enc_msg = ssl->out_msg;
929 enc_msglen = ssl->out_msglen;
930 ssl->out_msglen += ssl->transform_out->ivlen -
931 ssl->transform_out->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000932
Paul Bakker68884e32013-01-07 18:20:04 +0100933 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
934 "including %d bytes of padding",
935 ssl->out_msglen, 0 ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000936
Paul Bakker68884e32013-01-07 18:20:04 +0100937 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
938 ssl->out_msg, ssl->out_msglen );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000939
Paul Bakker68884e32013-01-07 18:20:04 +0100940 /*
941 * Adjust for tag
942 */
943 ssl->out_msglen += 16;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000944
Paul Bakker68884e32013-01-07 18:20:04 +0100945 gcm_crypt_and_tag( (gcm_context *) ssl->transform_out->ctx_enc,
946 GCM_ENCRYPT, enc_msglen,
947 ssl->transform_out->iv_enc, ssl->transform_out->ivlen,
948 add_data, 13,
949 enc_msg, enc_msg,
950 16, enc_msg + enc_msglen );
951
952 SSL_DEBUG_BUF( 4, "after encrypt: tag",
953 enc_msg + enc_msglen, 16 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000954 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000955 else
Paul Bakker68884e32013-01-07 18:20:04 +0100956#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +0000957 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000958 unsigned char *enc_msg;
Paul Bakker23986e52011-04-24 08:57:21 +0000959 size_t enc_msglen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000960
Paul Bakker48916f92012-09-16 19:57:18 +0000961 padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
962 ssl->transform_out->ivlen;
963 if( padlen == ssl->transform_out->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000964 padlen = 0;
965
966 for( i = 0; i <= padlen; i++ )
967 ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
968
969 ssl->out_msglen += padlen + 1;
970
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000971 enc_msglen = ssl->out_msglen;
972 enc_msg = ssl->out_msg;
973
974 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +0000975 * Prepend per-record IV for block cipher in TLS v1.1 and up as per
976 * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000977 */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000978 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000979 {
980 /*
981 * Generate IV
982 */
Paul Bakker48916f92012-09-16 19:57:18 +0000983 int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc,
984 ssl->transform_out->ivlen );
Paul Bakkera3d195c2011-11-27 21:07:34 +0000985 if( ret != 0 )
986 return( ret );
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000987
Paul Bakker92be97b2013-01-02 17:30:03 +0100988 memcpy( ssl->out_iv, ssl->transform_out->iv_enc,
Paul Bakker48916f92012-09-16 19:57:18 +0000989 ssl->transform_out->ivlen );
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000990
991 /*
992 * Fix pointer positions and message length with added IV
993 */
Paul Bakker92be97b2013-01-02 17:30:03 +0100994 enc_msg = ssl->out_msg;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000995 enc_msglen = ssl->out_msglen;
Paul Bakker48916f92012-09-16 19:57:18 +0000996 ssl->out_msglen += ssl->transform_out->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000997 }
998
Paul Bakker5121ce52009-01-03 21:22:43 +0000999 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001000 "including %d bytes of IV and %d bytes of padding",
Paul Bakker48916f92012-09-16 19:57:18 +00001001 ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001002
1003 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
Paul Bakker92be97b2013-01-02 17:30:03 +01001004 ssl->out_iv, ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001005
Paul Bakker68884e32013-01-07 18:20:04 +01001006 switch( ssl->transform_out->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +00001007 {
Paul Bakker68884e32013-01-07 18:20:04 +01001008 case POLARSSL_CIPHER_DES_CBC:
1009 des_crypt_cbc( (des_context *) ssl->transform_out->ctx_enc,
1010 DES_ENCRYPT, enc_msglen,
1011 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1012 break;
1013
1014 case POLARSSL_CIPHER_DES_EDE3_CBC:
1015 des3_crypt_cbc( (des3_context *) ssl->transform_out->ctx_enc,
1016 DES_ENCRYPT, enc_msglen,
1017 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1018 break;
1019
1020 case POLARSSL_CIPHER_AES_128_CBC:
1021 case POLARSSL_CIPHER_AES_256_CBC:
1022 aes_crypt_cbc( (aes_context *) ssl->transform_out->ctx_enc,
1023 AES_ENCRYPT, enc_msglen,
1024 ssl->transform_out->iv_enc, enc_msg, enc_msg );
1025 break;
1026
1027 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
1028 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
1029 camellia_crypt_cbc( (camellia_context *) ssl->transform_out->ctx_enc,
1030 CAMELLIA_ENCRYPT, enc_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001031 ssl->transform_out->iv_enc, enc_msg, enc_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001032 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001033
1034 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001035 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001036 }
1037 }
1038
Paul Bakkerca4ab492012-04-18 14:23:57 +00001039 for( i = 8; i > 0; i-- )
1040 if( ++ssl->out_ctr[i - 1] != 0 )
1041 break;
1042
Paul Bakker5121ce52009-01-03 21:22:43 +00001043 SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
1044
1045 return( 0 );
1046}
1047
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001048#define POLARSSL_SSL_MAX_MAC_SIZE 48
Paul Bakkerfab5c822012-02-06 16:45:10 +00001049
Paul Bakker5121ce52009-01-03 21:22:43 +00001050static int ssl_decrypt_buf( ssl_context *ssl )
1051{
Paul Bakker45829992013-01-03 14:52:21 +01001052 size_t i, padlen = 0, correct = 1;
Paul Bakkerfab5c822012-02-06 16:45:10 +00001053 unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
Paul Bakker5121ce52009-01-03 21:22:43 +00001054
1055 SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
1056
Paul Bakker48916f92012-09-16 19:57:18 +00001057 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001058 {
1059 SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
Paul Bakker48916f92012-09-16 19:57:18 +00001060 ssl->in_msglen, ssl->transform_in->minlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001061 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001062 }
1063
Paul Bakker68884e32013-01-07 18:20:04 +01001064#if defined(POLARSSL_CIPHER_NULL_CIPHER)
1065 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001066 {
Paul Bakker68884e32013-01-07 18:20:04 +01001067 padlen = 0;
1068 }
1069 else
1070#endif /* POLARSSL_CIPHER_NULL_CIPHER */
Paul Bakker40e46942009-01-03 21:51:57 +00001071#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001072 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
1073 {
1074 padlen = 0;
1075
1076 arc4_crypt( (arc4_context *) ssl->transform_in->ctx_dec,
Paul Bakkerbaad6502010-03-21 15:42:15 +00001077 ssl->in_msglen, ssl->in_msg,
1078 ssl->in_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001079 }
Paul Bakker68884e32013-01-07 18:20:04 +01001080 else
1081#endif /* POLARSSL_ARC4_C */
1082#if defined(POLARSSL_GCM_C)
1083 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
1084 ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001085 {
1086 unsigned char *dec_msg;
1087 unsigned char *dec_msg_result;
1088 size_t dec_msglen;
1089 unsigned char add_data[13];
1090 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1091
Paul Bakker68884e32013-01-07 18:20:04 +01001092 padlen = 0;
1093
1094 dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
1095 ssl->transform_in->fixed_ivlen );
1096 dec_msglen -= 16;
1097 dec_msg = ssl->in_msg;
1098 dec_msg_result = ssl->in_msg;
1099 ssl->in_msglen = dec_msglen;
1100
1101 memcpy( add_data, ssl->in_ctr, 8 );
1102 add_data[8] = ssl->in_msgtype;
1103 add_data[9] = ssl->major_ver;
1104 add_data[10] = ssl->minor_ver;
1105 add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
1106 add_data[12] = ssl->in_msglen & 0xFF;
1107
1108 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1109 add_data, 13 );
1110
1111 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
1112 ssl->in_iv,
1113 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
1114
1115 SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
1116 ssl->transform_in->ivlen );
1117 SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
1118
1119 ret = gcm_auth_decrypt( (gcm_context *) ssl->transform_in->ctx_dec,
1120 dec_msglen,
1121 ssl->transform_in->iv_dec,
1122 ssl->transform_in->ivlen,
1123 add_data, 13,
1124 dec_msg + dec_msglen, 16,
1125 dec_msg, dec_msg_result );
1126
1127 if( ret != 0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001128 {
Paul Bakker68884e32013-01-07 18:20:04 +01001129 SSL_DEBUG_MSG( 1, ( "AEAD decrypt failed on validation (ret = -0x%02x)",
1130 -ret ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001131
Paul Bakker68884e32013-01-07 18:20:04 +01001132 return( POLARSSL_ERR_SSL_INVALID_MAC );
1133 }
Paul Bakkerca4ab492012-04-18 14:23:57 +00001134 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001135 else
Paul Bakker68884e32013-01-07 18:20:04 +01001136#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001137 {
Paul Bakker45829992013-01-03 14:52:21 +01001138 /*
1139 * Decrypt and check the padding
1140 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001141 unsigned char *dec_msg;
1142 unsigned char *dec_msg_result;
Paul Bakker23986e52011-04-24 08:57:21 +00001143 size_t dec_msglen;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001144 size_t minlen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001145
Paul Bakker5121ce52009-01-03 21:22:43 +00001146 /*
Paul Bakker45829992013-01-03 14:52:21 +01001147 * Check immediate ciphertext sanity
Paul Bakker5121ce52009-01-03 21:22:43 +00001148 */
Paul Bakker48916f92012-09-16 19:57:18 +00001149 if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001150 {
1151 SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
Paul Bakker48916f92012-09-16 19:57:18 +00001152 ssl->in_msglen, ssl->transform_in->ivlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001153 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001154 }
1155
Paul Bakker45829992013-01-03 14:52:21 +01001156 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
1157 minlen += ssl->transform_in->ivlen;
1158
1159 if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
1160 ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
1161 {
1162 SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
1163 ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) );
1164 return( POLARSSL_ERR_SSL_INVALID_MAC );
1165 }
1166
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001167 dec_msglen = ssl->in_msglen;
1168 dec_msg = ssl->in_msg;
1169 dec_msg_result = ssl->in_msg;
1170
1171 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001172 * Initialize for prepended IV for block cipher in TLS v1.1 and up
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001173 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001174 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001175 {
Paul Bakker48916f92012-09-16 19:57:18 +00001176 dec_msglen -= ssl->transform_in->ivlen;
1177 ssl->in_msglen -= ssl->transform_in->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001178
Paul Bakker48916f92012-09-16 19:57:18 +00001179 for( i = 0; i < ssl->transform_in->ivlen; i++ )
Paul Bakker92be97b2013-01-02 17:30:03 +01001180 ssl->transform_in->iv_dec[i] = ssl->in_iv[i];
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001181 }
1182
Paul Bakker68884e32013-01-07 18:20:04 +01001183 switch( ssl->transform_in->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +00001184 {
Paul Bakker68884e32013-01-07 18:20:04 +01001185 case POLARSSL_CIPHER_DES_CBC:
1186 des_crypt_cbc( (des_context *) ssl->transform_in->ctx_dec,
1187 DES_DECRYPT, dec_msglen,
1188 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
Paul Bakker5121ce52009-01-03 21:22:43 +00001189 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001190
Paul Bakker68884e32013-01-07 18:20:04 +01001191 case POLARSSL_CIPHER_DES_EDE3_CBC:
1192 des3_crypt_cbc( (des3_context *) ssl->transform_in->ctx_dec,
1193 DES_DECRYPT, dec_msglen,
1194 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1195 break;
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001196
Paul Bakker68884e32013-01-07 18:20:04 +01001197 case POLARSSL_CIPHER_AES_128_CBC:
1198 case POLARSSL_CIPHER_AES_256_CBC:
1199 aes_crypt_cbc( (aes_context *) ssl->transform_in->ctx_dec,
1200 AES_DECRYPT, dec_msglen,
1201 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1202 break;
1203
1204 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
1205 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
1206 camellia_crypt_cbc( (camellia_context *) ssl->transform_in->ctx_dec,
1207 CAMELLIA_DECRYPT, dec_msglen,
1208 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1209 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001210
1211 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001212 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001213 }
1214
1215 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
Paul Bakker45829992013-01-03 14:52:21 +01001216
1217 if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
1218 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001219#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001220 SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
1221 ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001222#endif
Paul Bakker45829992013-01-03 14:52:21 +01001223 padlen = 0;
Paul Bakker45829992013-01-03 14:52:21 +01001224 correct = 0;
1225 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001226
1227 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1228 {
Paul Bakker48916f92012-09-16 19:57:18 +00001229 if( padlen > ssl->transform_in->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001230 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001231#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001232 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
1233 "should be no more than %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001234 padlen, ssl->transform_in->ivlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001235#endif
Paul Bakker45829992013-01-03 14:52:21 +01001236 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001237 }
1238 }
1239 else
1240 {
1241 /*
Paul Bakker45829992013-01-03 14:52:21 +01001242 * TLSv1+: always check the padding up to the first failure
1243 * and fake check up to 256 bytes of padding
Paul Bakker5121ce52009-01-03 21:22:43 +00001244 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001245 size_t pad_count = 0, fake_pad_count = 0;
1246 size_t padding_idx = ssl->in_msglen - padlen - 1;
1247
Paul Bakker5121ce52009-01-03 21:22:43 +00001248 for( i = 1; i <= padlen; i++ )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001249 pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1250
1251 for( ; i <= 256; i++ )
1252 fake_pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1253
1254 correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
1255 correct &= ( pad_count + fake_pad_count < 512 ); /* Always 1 */
1256
Paul Bakkerd66f0702013-01-31 16:57:45 +01001257#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001258 if( padlen > 0 && correct == 0)
1259 SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001260#endif
Paul Bakkere47b34b2013-02-27 14:48:00 +01001261 padlen &= correct * 0x1FF;
Paul Bakker5121ce52009-01-03 21:22:43 +00001262 }
1263 }
1264
1265 SSL_DEBUG_BUF( 4, "raw buffer after decryption",
1266 ssl->in_msg, ssl->in_msglen );
1267
1268 /*
1269 * Always compute the MAC (RFC4346, CBCTIME).
1270 */
Paul Bakker48916f92012-09-16 19:57:18 +00001271 ssl->in_msglen -= ( ssl->transform_in->maclen + padlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001272
1273 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1274 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1275
Paul Bakker45829992013-01-03 14:52:21 +01001276 memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001277
1278 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1279 {
Paul Bakker68884e32013-01-07 18:20:04 +01001280 ssl_mac( &ssl->transform_in->md_ctx_dec,
1281 ssl->transform_in->mac_dec,
1282 ssl->in_msg, ssl->in_msglen,
1283 ssl->in_ctr, ssl->in_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +00001284 }
1285 else
1286 {
Paul Bakker45829992013-01-03 14:52:21 +01001287 /*
1288 * Process MAC and always update for padlen afterwards to make
1289 * total time independent of padlen
Paul Bakkere47b34b2013-02-27 14:48:00 +01001290 *
1291 * extra_run compensates MAC check for padlen
1292 *
1293 * Known timing attacks:
1294 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
1295 *
1296 * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
1297 * correctly. (We round down instead of up, so -56 is the correct
1298 * value for our calculations instead of -55)
Paul Bakker45829992013-01-03 14:52:21 +01001299 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001300 int j, extra_run = 0;
1301 extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
1302 ( 13 + ssl->in_msglen + 8 ) / 64;
1303
1304 extra_run &= correct * 0xFF;
1305
Paul Bakker68884e32013-01-07 18:20:04 +01001306 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 13 );
1307 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,
1308 ssl->in_msglen );
1309 md_hmac_finish( &ssl->transform_in->md_ctx_dec,
1310 ssl->in_msg + ssl->in_msglen );
1311 for( j = 0; j < extra_run; j++ )
1312 md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001313
Paul Bakker68884e32013-01-07 18:20:04 +01001314 md_hmac_reset( &ssl->transform_in->md_ctx_dec );
Paul Bakker5121ce52009-01-03 21:22:43 +00001315 }
1316
Paul Bakker48916f92012-09-16 19:57:18 +00001317 SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001318 SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001319 ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001320
1321 if( memcmp( tmp, ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001322 ssl->transform_in->maclen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001323 {
Paul Bakkere47b34b2013-02-27 14:48:00 +01001324#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001325 SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001326#endif
Paul Bakker45829992013-01-03 14:52:21 +01001327 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001328 }
1329
1330 /*
Paul Bakker45829992013-01-03 14:52:21 +01001331 * Finally check the correct flag
Paul Bakker5121ce52009-01-03 21:22:43 +00001332 */
Paul Bakker45829992013-01-03 14:52:21 +01001333 if( correct == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +00001334 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001335
1336 if( ssl->in_msglen == 0 )
1337 {
1338 ssl->nb_zero++;
1339
1340 /*
1341 * Three or more empty messages may be a DoS attack
1342 * (excessive CPU consumption).
1343 */
1344 if( ssl->nb_zero > 3 )
1345 {
1346 SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
1347 "messages, possible DoS attack" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001348 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001349 }
1350 }
1351 else
1352 ssl->nb_zero = 0;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001353
Paul Bakker23986e52011-04-24 08:57:21 +00001354 for( i = 8; i > 0; i-- )
1355 if( ++ssl->in_ctr[i - 1] != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001356 break;
1357
1358 SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
1359
1360 return( 0 );
1361}
1362
Paul Bakker2770fbd2012-07-03 13:30:23 +00001363#if defined(POLARSSL_ZLIB_SUPPORT)
1364/*
1365 * Compression/decompression functions
1366 */
1367static int ssl_compress_buf( ssl_context *ssl )
1368{
1369 int ret;
1370 unsigned char *msg_post = ssl->out_msg;
1371 size_t len_pre = ssl->out_msglen;
1372 unsigned char *msg_pre;
1373
1374 SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
1375
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001376 if( len_pre == 0 )
1377 return( 0 );
1378
Paul Bakker6e339b52013-07-03 13:37:05 +02001379 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001380 if( msg_pre == NULL )
1381 {
1382 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1383 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1384 }
1385
1386 memcpy( msg_pre, ssl->out_msg, len_pre );
1387
1388 SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
1389 ssl->out_msglen ) );
1390
1391 SSL_DEBUG_BUF( 4, "before compression: output payload",
1392 ssl->out_msg, ssl->out_msglen );
1393
Paul Bakker48916f92012-09-16 19:57:18 +00001394 ssl->transform_out->ctx_deflate.next_in = msg_pre;
1395 ssl->transform_out->ctx_deflate.avail_in = len_pre;
1396 ssl->transform_out->ctx_deflate.next_out = msg_post;
1397 ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001398
Paul Bakker48916f92012-09-16 19:57:18 +00001399 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001400 if( ret != Z_OK )
1401 {
1402 SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
1403 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1404 }
1405
Paul Bakker48916f92012-09-16 19:57:18 +00001406 ssl->out_msglen = SSL_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001407
Paul Bakker6e339b52013-07-03 13:37:05 +02001408 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001409
1410 SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
1411 ssl->out_msglen ) );
1412
1413 SSL_DEBUG_BUF( 4, "after compression: output payload",
1414 ssl->out_msg, ssl->out_msglen );
1415
1416 SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
1417
1418 return( 0 );
1419}
1420
1421static int ssl_decompress_buf( ssl_context *ssl )
1422{
1423 int ret;
1424 unsigned char *msg_post = ssl->in_msg;
1425 size_t len_pre = ssl->in_msglen;
1426 unsigned char *msg_pre;
1427
1428 SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
1429
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001430 if( len_pre == 0 )
1431 return( 0 );
1432
Paul Bakker6e339b52013-07-03 13:37:05 +02001433 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001434 if( msg_pre == NULL )
1435 {
1436 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1437 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1438 }
1439
1440 memcpy( msg_pre, ssl->in_msg, len_pre );
1441
1442 SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
1443 ssl->in_msglen ) );
1444
1445 SSL_DEBUG_BUF( 4, "before decompression: input payload",
1446 ssl->in_msg, ssl->in_msglen );
1447
Paul Bakker48916f92012-09-16 19:57:18 +00001448 ssl->transform_in->ctx_inflate.next_in = msg_pre;
1449 ssl->transform_in->ctx_inflate.avail_in = len_pre;
1450 ssl->transform_in->ctx_inflate.next_out = msg_post;
1451 ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001452
Paul Bakker48916f92012-09-16 19:57:18 +00001453 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001454 if( ret != Z_OK )
1455 {
1456 SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
1457 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1458 }
1459
Paul Bakker48916f92012-09-16 19:57:18 +00001460 ssl->in_msglen = SSL_MAX_CONTENT_LEN - ssl->transform_in->ctx_inflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001461
Paul Bakker6e339b52013-07-03 13:37:05 +02001462 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001463
1464 SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
1465 ssl->in_msglen ) );
1466
1467 SSL_DEBUG_BUF( 4, "after decompression: input payload",
1468 ssl->in_msg, ssl->in_msglen );
1469
1470 SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
1471
1472 return( 0 );
1473}
1474#endif /* POLARSSL_ZLIB_SUPPORT */
1475
Paul Bakker5121ce52009-01-03 21:22:43 +00001476/*
1477 * Fill the input message buffer
1478 */
Paul Bakker23986e52011-04-24 08:57:21 +00001479int ssl_fetch_input( ssl_context *ssl, size_t nb_want )
Paul Bakker5121ce52009-01-03 21:22:43 +00001480{
Paul Bakker23986e52011-04-24 08:57:21 +00001481 int ret;
1482 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001483
1484 SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
1485
1486 while( ssl->in_left < nb_want )
1487 {
1488 len = nb_want - ssl->in_left;
1489 ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
1490
1491 SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
1492 ssl->in_left, nb_want ) );
1493 SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
1494
Paul Bakker831a7552011-05-18 13:32:51 +00001495 if( ret == 0 )
1496 return( POLARSSL_ERR_SSL_CONN_EOF );
1497
Paul Bakker5121ce52009-01-03 21:22:43 +00001498 if( ret < 0 )
1499 return( ret );
1500
1501 ssl->in_left += ret;
1502 }
1503
1504 SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
1505
1506 return( 0 );
1507}
1508
1509/*
1510 * Flush any data not yet written
1511 */
1512int ssl_flush_output( ssl_context *ssl )
1513{
1514 int ret;
1515 unsigned char *buf;
1516
1517 SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
1518
1519 while( ssl->out_left > 0 )
1520 {
1521 SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
1522 5 + ssl->out_msglen, ssl->out_left ) );
1523
Paul Bakker5bd42292012-12-19 14:40:42 +01001524 buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
Paul Bakker5121ce52009-01-03 21:22:43 +00001525 ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
Paul Bakker186751d2012-05-08 13:16:14 +00001526
Paul Bakker5121ce52009-01-03 21:22:43 +00001527 SSL_DEBUG_RET( 2, "ssl->f_send", ret );
1528
1529 if( ret <= 0 )
1530 return( ret );
1531
1532 ssl->out_left -= ret;
1533 }
1534
1535 SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
1536
1537 return( 0 );
1538}
1539
1540/*
1541 * Record layer functions
1542 */
1543int ssl_write_record( ssl_context *ssl )
1544{
Paul Bakker05ef8352012-05-08 09:17:57 +00001545 int ret, done = 0;
Paul Bakker23986e52011-04-24 08:57:21 +00001546 size_t len = ssl->out_msglen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001547
1548 SSL_DEBUG_MSG( 2, ( "=> write record" ) );
1549
Paul Bakker5121ce52009-01-03 21:22:43 +00001550 if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
1551 {
1552 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
1553 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
1554 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
1555
Paul Bakker48916f92012-09-16 19:57:18 +00001556 ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001557 }
1558
Paul Bakker2770fbd2012-07-03 13:30:23 +00001559#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001560 if( ssl->transform_out != NULL &&
1561 ssl->session_out->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001562 {
1563 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
1564 {
1565 SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
1566 return( ret );
1567 }
1568
1569 len = ssl->out_msglen;
1570 }
1571#endif /*POLARSSL_ZLIB_SUPPORT */
1572
Paul Bakker05ef8352012-05-08 09:17:57 +00001573#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1574 if( ssl_hw_record_write != NULL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001575 {
Paul Bakker05ef8352012-05-08 09:17:57 +00001576 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001577
Paul Bakker05ef8352012-05-08 09:17:57 +00001578 ret = ssl_hw_record_write( ssl );
1579 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1580 {
1581 SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret );
1582 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1583 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001584
1585 if( ret == 0 )
1586 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001587 }
1588#endif
1589 if( !done )
1590 {
1591 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
1592 ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
1593 ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00001594 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1595 ssl->out_hdr[4] = (unsigned char)( len );
Paul Bakker05ef8352012-05-08 09:17:57 +00001596
Paul Bakker48916f92012-09-16 19:57:18 +00001597 if( ssl->transform_out != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001598 {
1599 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
1600 {
1601 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
1602 return( ret );
1603 }
1604
1605 len = ssl->out_msglen;
1606 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1607 ssl->out_hdr[4] = (unsigned char)( len );
1608 }
1609
1610 ssl->out_left = 5 + ssl->out_msglen;
1611
1612 SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
1613 "version = [%d:%d], msglen = %d",
1614 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
1615 ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
1616
1617 SSL_DEBUG_BUF( 4, "output record sent to network",
Paul Bakker5bd42292012-12-19 14:40:42 +01001618 ssl->out_hdr, 5 + ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001619 }
1620
Paul Bakker5121ce52009-01-03 21:22:43 +00001621 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1622 {
1623 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
1624 return( ret );
1625 }
1626
1627 SSL_DEBUG_MSG( 2, ( "<= write record" ) );
1628
1629 return( 0 );
1630}
1631
1632int ssl_read_record( ssl_context *ssl )
1633{
Paul Bakker05ef8352012-05-08 09:17:57 +00001634 int ret, done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001635
1636 SSL_DEBUG_MSG( 2, ( "=> read record" ) );
1637
Paul Bakker68884e32013-01-07 18:20:04 +01001638 SSL_DEBUG_BUF( 4, "input record from network",
1639 ssl->in_hdr, 5 + ssl->in_msglen );
1640
Paul Bakker5121ce52009-01-03 21:22:43 +00001641 if( ssl->in_hslen != 0 &&
1642 ssl->in_hslen < ssl->in_msglen )
1643 {
1644 /*
1645 * Get next Handshake message in the current record
1646 */
1647 ssl->in_msglen -= ssl->in_hslen;
1648
Paul Bakker8934a982011-08-05 11:11:53 +00001649 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
Paul Bakker48916f92012-09-16 19:57:18 +00001650 ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001651
1652 ssl->in_hslen = 4;
1653 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1654
1655 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1656 " %d, type = %d, hslen = %d",
1657 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1658
1659 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1660 {
1661 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001662 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001663 }
1664
1665 if( ssl->in_msglen < ssl->in_hslen )
1666 {
1667 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001668 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001669 }
1670
Paul Bakker48916f92012-09-16 19:57:18 +00001671 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001672
1673 return( 0 );
1674 }
1675
1676 ssl->in_hslen = 0;
1677
1678 /*
1679 * Read the record header and validate it
1680 */
1681 if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
1682 {
1683 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1684 return( ret );
1685 }
1686
1687 ssl->in_msgtype = ssl->in_hdr[0];
1688 ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
1689
1690 SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
1691 "version = [%d:%d], msglen = %d",
1692 ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
1693 ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
1694
1695 if( ssl->in_hdr[1] != ssl->major_ver )
1696 {
1697 SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001698 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001699 }
1700
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001701 if( ssl->in_hdr[2] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00001702 {
1703 SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001704 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001705 }
1706
1707 /*
1708 * Make sure the message length is acceptable
1709 */
Paul Bakker48916f92012-09-16 19:57:18 +00001710 if( ssl->transform_in == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001711 {
1712 if( ssl->in_msglen < 1 ||
1713 ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1714 {
1715 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001716 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001717 }
1718 }
1719 else
1720 {
Paul Bakker48916f92012-09-16 19:57:18 +00001721 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001722 {
1723 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001724 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001725 }
1726
1727 if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001728 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN )
Paul Bakker5121ce52009-01-03 21:22:43 +00001729 {
1730 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001731 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001732 }
1733
1734 /*
1735 * TLS encrypted messages can have up to 256 bytes of padding
1736 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001737 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001738 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN + 256 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001739 {
1740 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001741 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001742 }
1743 }
1744
1745 /*
1746 * Read and optionally decrypt the message contents
1747 */
1748 if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 )
1749 {
1750 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1751 return( ret );
1752 }
1753
1754 SSL_DEBUG_BUF( 4, "input record from network",
1755 ssl->in_hdr, 5 + ssl->in_msglen );
1756
Paul Bakker05ef8352012-05-08 09:17:57 +00001757#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1758 if( ssl_hw_record_read != NULL)
1759 {
1760 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) );
1761
1762 ret = ssl_hw_record_read( ssl );
1763 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1764 {
1765 SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret );
1766 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1767 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001768
1769 if( ret == 0 )
1770 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001771 }
1772#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001773 if( !done && ssl->transform_in != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001774 {
1775 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
1776 {
Paul Bakker40865c82013-01-31 17:13:13 +01001777#if defined(POLARSSL_SSL_ALERT_MESSAGES)
1778 if( ret == POLARSSL_ERR_SSL_INVALID_MAC )
1779 {
1780 ssl_send_alert_message( ssl,
1781 SSL_ALERT_LEVEL_FATAL,
1782 SSL_ALERT_MSG_BAD_RECORD_MAC );
1783 }
1784#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001785 SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
1786 return( ret );
1787 }
1788
1789 SSL_DEBUG_BUF( 4, "input payload after decrypt",
1790 ssl->in_msg, ssl->in_msglen );
1791
1792 if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1793 {
1794 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001795 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001796 }
1797 }
1798
Paul Bakker2770fbd2012-07-03 13:30:23 +00001799#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001800 if( ssl->transform_in != NULL &&
1801 ssl->session_in->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001802 {
1803 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
1804 {
1805 SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
1806 return( ret );
1807 }
1808
1809 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1810 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1811 }
1812#endif /* POLARSSL_ZLIB_SUPPORT */
1813
Paul Bakker0a925182012-04-16 06:46:41 +00001814 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE &&
1815 ssl->in_msgtype != SSL_MSG_ALERT &&
1816 ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC &&
1817 ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
1818 {
1819 SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
1820
Paul Bakker48916f92012-09-16 19:57:18 +00001821 if( ( ret = ssl_send_alert_message( ssl,
1822 SSL_ALERT_LEVEL_FATAL,
1823 SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
Paul Bakker0a925182012-04-16 06:46:41 +00001824 {
1825 return( ret );
1826 }
1827
1828 return( POLARSSL_ERR_SSL_INVALID_RECORD );
1829 }
1830
Paul Bakker5121ce52009-01-03 21:22:43 +00001831 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
1832 {
1833 ssl->in_hslen = 4;
1834 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1835
1836 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1837 " %d, type = %d, hslen = %d",
1838 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1839
1840 /*
1841 * Additional checks to validate the handshake header
1842 */
1843 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1844 {
1845 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001846 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001847 }
1848
1849 if( ssl->in_msglen < ssl->in_hslen )
1850 {
1851 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001852 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001853 }
1854
Paul Bakker48916f92012-09-16 19:57:18 +00001855 if( ssl->state != SSL_HANDSHAKE_OVER )
1856 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001857 }
1858
1859 if( ssl->in_msgtype == SSL_MSG_ALERT )
1860 {
1861 SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
1862 ssl->in_msg[0], ssl->in_msg[1] ) );
1863
1864 /*
1865 * Ignore non-fatal alerts, except close_notify
1866 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001867 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001868 {
Paul Bakker2770fbd2012-07-03 13:30:23 +00001869 SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
1870 ssl->in_msg[1] ) );
Paul Bakker9d781402011-05-09 16:17:09 +00001871 /**
1872 * Subtract from error code as ssl->in_msg[1] is 7-bit positive
1873 * error identifier.
1874 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00001875 return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001876 }
1877
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001878 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
1879 ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00001880 {
1881 SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001882 return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001883 }
1884 }
1885
1886 ssl->in_left = 0;
1887
1888 SSL_DEBUG_MSG( 2, ( "<= read record" ) );
1889
1890 return( 0 );
1891}
1892
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001893int ssl_send_fatal_handshake_failure( ssl_context *ssl )
1894{
1895 int ret;
1896
1897 if( ( ret = ssl_send_alert_message( ssl,
1898 SSL_ALERT_LEVEL_FATAL,
1899 SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
1900 {
1901 return( ret );
1902 }
1903
1904 return( 0 );
1905}
1906
Paul Bakker0a925182012-04-16 06:46:41 +00001907int ssl_send_alert_message( ssl_context *ssl,
1908 unsigned char level,
1909 unsigned char message )
1910{
1911 int ret;
1912
1913 SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
1914
1915 ssl->out_msgtype = SSL_MSG_ALERT;
1916 ssl->out_msglen = 2;
1917 ssl->out_msg[0] = level;
1918 ssl->out_msg[1] = message;
1919
1920 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1921 {
1922 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1923 return( ret );
1924 }
1925
1926 SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
1927
1928 return( 0 );
1929}
1930
Paul Bakker5121ce52009-01-03 21:22:43 +00001931/*
1932 * Handshake functions
1933 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001934#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1935 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1936 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001937int ssl_write_certificate( ssl_context *ssl )
1938{
Paul Bakkered27a042013-04-18 22:46:23 +02001939 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001940 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001941
1942 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1943
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001944 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1945 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001946 {
1947 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1948 ssl->state++;
1949 return( 0 );
1950 }
1951
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001952 return( ret );
1953}
1954
1955int ssl_parse_certificate( ssl_context *ssl )
1956{
1957 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1958 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1959
1960 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
1961
1962 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1963 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1964 {
1965 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
1966 ssl->state++;
1967 return( 0 );
1968 }
1969
1970 return( ret );
1971}
1972#else
1973int ssl_write_certificate( ssl_context *ssl )
1974{
1975 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1976 size_t i, n;
1977 const x509_cert *crt;
1978 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1979
1980 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1981
1982 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1983 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1984 {
1985 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1986 ssl->state++;
1987 return( 0 );
1988 }
1989
Paul Bakker5121ce52009-01-03 21:22:43 +00001990 if( ssl->endpoint == SSL_IS_CLIENT )
1991 {
1992 if( ssl->client_auth == 0 )
1993 {
1994 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1995 ssl->state++;
1996 return( 0 );
1997 }
1998
1999 /*
2000 * If using SSLv3 and got no cert, send an Alert message
2001 * (otherwise an empty Certificate message will be sent).
2002 */
2003 if( ssl->own_cert == NULL &&
2004 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2005 {
2006 ssl->out_msglen = 2;
2007 ssl->out_msgtype = SSL_MSG_ALERT;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002008 ssl->out_msg[0] = SSL_ALERT_LEVEL_WARNING;
2009 ssl->out_msg[1] = SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00002010
2011 SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
2012 goto write_msg;
2013 }
2014 }
2015 else /* SSL_IS_SERVER */
2016 {
2017 if( ssl->own_cert == NULL )
2018 {
2019 SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002020 return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002021 }
2022 }
2023
2024 SSL_DEBUG_CRT( 3, "own certificate", ssl->own_cert );
2025
2026 /*
2027 * 0 . 0 handshake type
2028 * 1 . 3 handshake length
2029 * 4 . 6 length of all certs
2030 * 7 . 9 length of cert. 1
2031 * 10 . n-1 peer certificate
2032 * n . n+2 length of cert. 2
2033 * n+3 . ... upper level cert, etc.
2034 */
2035 i = 7;
2036 crt = ssl->own_cert;
2037
Paul Bakker29087132010-03-21 21:03:34 +00002038 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002039 {
2040 n = crt->raw.len;
2041 if( i + 3 + n > SSL_MAX_CONTENT_LEN )
2042 {
2043 SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
2044 i + 3 + n, SSL_MAX_CONTENT_LEN ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002045 return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002046 }
2047
2048 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
2049 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
2050 ssl->out_msg[i + 2] = (unsigned char)( n );
2051
2052 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
2053 i += n; crt = crt->next;
2054 }
2055
2056 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
2057 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
2058 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
2059
2060 ssl->out_msglen = i;
2061 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2062 ssl->out_msg[0] = SSL_HS_CERTIFICATE;
2063
2064write_msg:
2065
2066 ssl->state++;
2067
2068 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2069 {
2070 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2071 return( ret );
2072 }
2073
2074 SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
2075
Paul Bakkered27a042013-04-18 22:46:23 +02002076 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002077}
2078
2079int ssl_parse_certificate( ssl_context *ssl )
2080{
Paul Bakkered27a042013-04-18 22:46:23 +02002081 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker23986e52011-04-24 08:57:21 +00002082 size_t i, n;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002083 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002084
2085 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2086
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002087 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2088 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002089 {
2090 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2091 ssl->state++;
2092 return( 0 );
2093 }
2094
Paul Bakker5121ce52009-01-03 21:22:43 +00002095 if( ssl->endpoint == SSL_IS_SERVER &&
2096 ssl->authmode == SSL_VERIFY_NONE )
2097 {
Paul Bakkercdf07e92011-01-30 17:05:13 +00002098 ssl->verify_result = BADCERT_SKIP_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00002099 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2100 ssl->state++;
2101 return( 0 );
2102 }
2103
2104 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2105 {
2106 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2107 return( ret );
2108 }
2109
2110 ssl->state++;
2111
2112 /*
2113 * Check if the client sent an empty certificate
2114 */
2115 if( ssl->endpoint == SSL_IS_SERVER &&
2116 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2117 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002118 if( ssl->in_msglen == 2 &&
2119 ssl->in_msgtype == SSL_MSG_ALERT &&
2120 ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2121 ssl->in_msg[1] == SSL_ALERT_MSG_NO_CERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002122 {
2123 SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2124
Paul Bakkercdf07e92011-01-30 17:05:13 +00002125 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002126 if( ssl->authmode == SSL_VERIFY_OPTIONAL )
2127 return( 0 );
2128 else
Paul Bakker40e46942009-01-03 21:51:57 +00002129 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002130 }
2131 }
2132
2133 if( ssl->endpoint == SSL_IS_SERVER &&
2134 ssl->minor_ver != SSL_MINOR_VERSION_0 )
2135 {
2136 if( ssl->in_hslen == 7 &&
2137 ssl->in_msgtype == SSL_MSG_HANDSHAKE &&
2138 ssl->in_msg[0] == SSL_HS_CERTIFICATE &&
2139 memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
2140 {
2141 SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2142
Paul Bakkercdf07e92011-01-30 17:05:13 +00002143 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002144 if( ssl->authmode == SSL_VERIFY_REQUIRED )
Paul Bakker40e46942009-01-03 21:51:57 +00002145 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002146 else
2147 return( 0 );
2148 }
2149 }
2150
2151 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2152 {
2153 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002154 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002155 }
2156
2157 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
2158 {
2159 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002160 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002161 }
2162
2163 /*
2164 * Same message structure as in ssl_write_certificate()
2165 */
2166 n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
2167
2168 if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
2169 {
2170 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002171 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002172 }
2173
Paul Bakker6e339b52013-07-03 13:37:05 +02002174 if( ( ssl->session_negotiate->peer_cert = (x509_cert *) polarssl_malloc(
Paul Bakker5121ce52009-01-03 21:22:43 +00002175 sizeof( x509_cert ) ) ) == NULL )
2176 {
2177 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
2178 sizeof( x509_cert ) ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002179 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002180 }
2181
Paul Bakker48916f92012-09-16 19:57:18 +00002182 memset( ssl->session_negotiate->peer_cert, 0, sizeof( x509_cert ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002183
2184 i = 7;
2185
2186 while( i < ssl->in_hslen )
2187 {
2188 if( ssl->in_msg[i] != 0 )
2189 {
2190 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002191 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002192 }
2193
2194 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2195 | (unsigned int) ssl->in_msg[i + 2];
2196 i += 3;
2197
2198 if( n < 128 || i + n > ssl->in_hslen )
2199 {
2200 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002201 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002202 }
2203
Paul Bakker89ecb2d2013-06-24 19:06:15 +02002204 ret = x509parse_crt_der( ssl->session_negotiate->peer_cert,
2205 ssl->in_msg + i, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002206 if( ret != 0 )
2207 {
2208 SSL_DEBUG_RET( 1, " x509parse_crt", ret );
2209 return( ret );
2210 }
2211
2212 i += n;
2213 }
2214
Paul Bakker48916f92012-09-16 19:57:18 +00002215 SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00002216
2217 if( ssl->authmode != SSL_VERIFY_NONE )
2218 {
2219 if( ssl->ca_chain == NULL )
2220 {
2221 SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002222 return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002223 }
2224
Paul Bakker48916f92012-09-16 19:57:18 +00002225 ret = x509parse_verify( ssl->session_negotiate->peer_cert,
2226 ssl->ca_chain, ssl->ca_crl,
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002227 ssl->peer_cn, &ssl->verify_result,
2228 ssl->f_vrfy, ssl->p_vrfy );
Paul Bakker5121ce52009-01-03 21:22:43 +00002229
2230 if( ret != 0 )
2231 SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2232
2233 if( ssl->authmode != SSL_VERIFY_REQUIRED )
2234 ret = 0;
2235 }
2236
2237 SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
2238
2239 return( ret );
2240}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002241#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2242 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2243 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002244
2245int ssl_write_change_cipher_spec( ssl_context *ssl )
2246{
2247 int ret;
2248
2249 SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
2250
2251 ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
2252 ssl->out_msglen = 1;
2253 ssl->out_msg[0] = 1;
2254
Paul Bakker5121ce52009-01-03 21:22:43 +00002255 ssl->state++;
2256
2257 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2258 {
2259 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2260 return( ret );
2261 }
2262
2263 SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
2264
2265 return( 0 );
2266}
2267
2268int ssl_parse_change_cipher_spec( ssl_context *ssl )
2269{
2270 int ret;
2271
2272 SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
2273
Paul Bakker5121ce52009-01-03 21:22:43 +00002274 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2275 {
2276 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2277 return( ret );
2278 }
2279
2280 if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
2281 {
2282 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002283 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002284 }
2285
2286 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
2287 {
2288 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002289 return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
Paul Bakker5121ce52009-01-03 21:22:43 +00002290 }
2291
2292 ssl->state++;
2293
2294 SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
2295
2296 return( 0 );
2297}
2298
Paul Bakker41c83d32013-03-20 14:39:14 +01002299void ssl_optimize_checksum( ssl_context *ssl,
2300 const ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00002301{
Paul Bakker9e36f042013-06-30 14:34:05 +02002302#if !defined(POLARSSL_SHA512_C)
Paul Bakker769075d2012-11-24 11:26:46 +01002303 ((void) ciphersuite);
2304#endif
2305
Paul Bakker380da532012-04-18 16:10:25 +00002306 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00002307 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker9e36f042013-06-30 14:34:05 +02002308#if defined(POLARSSL_SHA512_C)
Paul Bakkerb7149bc2013-03-20 15:30:09 +01002309 else if( ciphersuite_info->mac == POLARSSL_MD_SHA384 )
Paul Bakker380da532012-04-18 16:10:25 +00002310 {
Paul Bakker48916f92012-09-16 19:57:18 +00002311 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
Paul Bakker380da532012-04-18 16:10:25 +00002312 }
Paul Bakker769075d2012-11-24 11:26:46 +01002313#endif
Paul Bakker380da532012-04-18 16:10:25 +00002314 else
Paul Bakker48916f92012-09-16 19:57:18 +00002315 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakker380da532012-04-18 16:10:25 +00002316}
Paul Bakkerf7abd422013-04-16 13:15:56 +02002317
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002318static void ssl_update_checksum_start( ssl_context *ssl,
2319 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002320{
Paul Bakker48916f92012-09-16 19:57:18 +00002321 md5_update( &ssl->handshake->fin_md5 , buf, len );
2322 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker9e36f042013-06-30 14:34:05 +02002323 sha256_update( &ssl->handshake->fin_sha256, buf, len );
2324#if defined(POLARSSL_SHA512_C)
2325 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002326#endif
Paul Bakker380da532012-04-18 16:10:25 +00002327}
2328
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002329static void ssl_update_checksum_md5sha1( ssl_context *ssl,
2330 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002331{
Paul Bakker48916f92012-09-16 19:57:18 +00002332 md5_update( &ssl->handshake->fin_md5 , buf, len );
2333 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002334}
2335
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002336static void ssl_update_checksum_sha256( ssl_context *ssl,
2337 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002338{
Paul Bakker9e36f042013-06-30 14:34:05 +02002339 sha256_update( &ssl->handshake->fin_sha256, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002340}
2341
Paul Bakker9e36f042013-06-30 14:34:05 +02002342#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002343static void ssl_update_checksum_sha384( ssl_context *ssl,
2344 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002345{
Paul Bakker9e36f042013-06-30 14:34:05 +02002346 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002347}
Paul Bakker769075d2012-11-24 11:26:46 +01002348#endif
Paul Bakker380da532012-04-18 16:10:25 +00002349
Paul Bakker1ef83d62012-04-11 12:09:53 +00002350static void ssl_calc_finished_ssl(
2351 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002352{
Paul Bakker3c2122f2013-06-24 19:03:14 +02002353 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002354 md5_context md5;
2355 sha1_context sha1;
2356
Paul Bakker5121ce52009-01-03 21:22:43 +00002357 unsigned char padbuf[48];
2358 unsigned char md5sum[16];
2359 unsigned char sha1sum[20];
2360
Paul Bakker48916f92012-09-16 19:57:18 +00002361 ssl_session *session = ssl->session_negotiate;
2362 if( !session )
2363 session = ssl->session;
2364
Paul Bakker1ef83d62012-04-11 12:09:53 +00002365 SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
2366
Paul Bakker48916f92012-09-16 19:57:18 +00002367 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2368 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002369
2370 /*
2371 * SSLv3:
2372 * hash =
2373 * MD5( master + pad2 +
2374 * MD5( handshake + sender + master + pad1 ) )
2375 * + SHA1( master + pad2 +
2376 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002377 */
2378
Paul Bakker90995b52013-06-24 19:20:35 +02002379#if !defined(POLARSSL_MD5_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002380 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002381 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002382#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002383
Paul Bakker90995b52013-06-24 19:20:35 +02002384#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002385 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002386 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002387#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002388
Paul Bakker3c2122f2013-06-24 19:03:14 +02002389 sender = ( from == SSL_IS_CLIENT ) ? "CLNT"
2390 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00002391
Paul Bakker1ef83d62012-04-11 12:09:53 +00002392 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002393
Paul Bakker3c2122f2013-06-24 19:03:14 +02002394 md5_update( &md5, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002395 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002396 md5_update( &md5, padbuf, 48 );
2397 md5_finish( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002398
Paul Bakker3c2122f2013-06-24 19:03:14 +02002399 sha1_update( &sha1, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002400 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002401 sha1_update( &sha1, padbuf, 40 );
2402 sha1_finish( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002403
Paul Bakker1ef83d62012-04-11 12:09:53 +00002404 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002405
Paul Bakker1ef83d62012-04-11 12:09:53 +00002406 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +00002407 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002408 md5_update( &md5, padbuf, 48 );
2409 md5_update( &md5, md5sum, 16 );
2410 md5_finish( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00002411
Paul Bakker1ef83d62012-04-11 12:09:53 +00002412 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +00002413 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002414 sha1_update( &sha1, padbuf , 40 );
2415 sha1_update( &sha1, sha1sum, 20 );
2416 sha1_finish( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002417
Paul Bakker1ef83d62012-04-11 12:09:53 +00002418 SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002419
Paul Bakker1ef83d62012-04-11 12:09:53 +00002420 memset( &md5, 0, sizeof( md5_context ) );
2421 memset( &sha1, 0, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002422
2423 memset( padbuf, 0, sizeof( padbuf ) );
2424 memset( md5sum, 0, sizeof( md5sum ) );
2425 memset( sha1sum, 0, sizeof( sha1sum ) );
2426
2427 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2428}
2429
Paul Bakker1ef83d62012-04-11 12:09:53 +00002430static void ssl_calc_finished_tls(
2431 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002432{
Paul Bakker1ef83d62012-04-11 12:09:53 +00002433 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002434 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002435 md5_context md5;
Paul Bakker5121ce52009-01-03 21:22:43 +00002436 sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002437 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00002438
Paul Bakker48916f92012-09-16 19:57:18 +00002439 ssl_session *session = ssl->session_negotiate;
2440 if( !session )
2441 session = ssl->session;
2442
Paul Bakker1ef83d62012-04-11 12:09:53 +00002443 SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002444
Paul Bakker48916f92012-09-16 19:57:18 +00002445 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2446 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002447
Paul Bakker1ef83d62012-04-11 12:09:53 +00002448 /*
2449 * TLSv1:
2450 * hash = PRF( master, finished_label,
2451 * MD5( handshake ) + SHA1( handshake ) )[0..11]
2452 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002453
Paul Bakker90995b52013-06-24 19:20:35 +02002454#if !defined(POLARSSL_MD5_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002455 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
2456 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002457#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002458
Paul Bakker90995b52013-06-24 19:20:35 +02002459#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002460 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
2461 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002462#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002463
2464 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002465 ? "client finished"
2466 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002467
2468 md5_finish( &md5, padbuf );
2469 sha1_finish( &sha1, padbuf + 16 );
2470
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002471 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002472 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002473
2474 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2475
2476 memset( &md5, 0, sizeof( md5_context ) );
2477 memset( &sha1, 0, sizeof( sha1_context ) );
2478
2479 memset( padbuf, 0, sizeof( padbuf ) );
2480
2481 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2482}
2483
Paul Bakkerca4ab492012-04-18 14:23:57 +00002484static void ssl_calc_finished_tls_sha256(
Paul Bakker1ef83d62012-04-11 12:09:53 +00002485 ssl_context *ssl, unsigned char *buf, int from )
2486{
2487 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002488 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002489 sha256_context sha256;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002490 unsigned char padbuf[32];
2491
Paul Bakker48916f92012-09-16 19:57:18 +00002492 ssl_session *session = ssl->session_negotiate;
2493 if( !session )
2494 session = ssl->session;
2495
Paul Bakker380da532012-04-18 16:10:25 +00002496 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002497
Paul Bakker9e36f042013-06-30 14:34:05 +02002498 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002499
2500 /*
2501 * TLSv1.2:
2502 * hash = PRF( master, finished_label,
2503 * Hash( handshake ) )[0.11]
2504 */
2505
Paul Bakker9e36f042013-06-30 14:34:05 +02002506#if !defined(POLARSSL_SHA256_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002507 SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
Paul Bakker9e36f042013-06-30 14:34:05 +02002508 sha256.state, sizeof( sha256.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002509#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002510
2511 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002512 ? "client finished"
2513 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002514
Paul Bakker9e36f042013-06-30 14:34:05 +02002515 sha256_finish( &sha256, padbuf );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002516
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002517 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002518 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002519
2520 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2521
Paul Bakker9e36f042013-06-30 14:34:05 +02002522 memset( &sha256, 0, sizeof( sha256_context ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002523
2524 memset( padbuf, 0, sizeof( padbuf ) );
2525
2526 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2527}
2528
Paul Bakker9e36f042013-06-30 14:34:05 +02002529#if defined(POLARSSL_SHA512_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002530static void ssl_calc_finished_tls_sha384(
2531 ssl_context *ssl, unsigned char *buf, int from )
2532{
2533 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002534 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002535 sha512_context sha512;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002536 unsigned char padbuf[48];
2537
Paul Bakker48916f92012-09-16 19:57:18 +00002538 ssl_session *session = ssl->session_negotiate;
2539 if( !session )
2540 session = ssl->session;
2541
Paul Bakker380da532012-04-18 16:10:25 +00002542 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002543
Paul Bakker9e36f042013-06-30 14:34:05 +02002544 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002545
2546 /*
2547 * TLSv1.2:
2548 * hash = PRF( master, finished_label,
2549 * Hash( handshake ) )[0.11]
2550 */
2551
Paul Bakker9e36f042013-06-30 14:34:05 +02002552#if !defined(POLARSSL_SHA512_ALT)
2553 SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
2554 sha512.state, sizeof( sha512.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002555#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002556
2557 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002558 ? "client finished"
2559 : "server finished";
Paul Bakkerca4ab492012-04-18 14:23:57 +00002560
Paul Bakker9e36f042013-06-30 14:34:05 +02002561 sha512_finish( &sha512, padbuf );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002562
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002563 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002564 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002565
2566 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2567
Paul Bakker9e36f042013-06-30 14:34:05 +02002568 memset( &sha512, 0, sizeof( sha512_context ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002569
2570 memset( padbuf, 0, sizeof( padbuf ) );
2571
2572 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2573}
Paul Bakker769075d2012-11-24 11:26:46 +01002574#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002575
Paul Bakker48916f92012-09-16 19:57:18 +00002576void ssl_handshake_wrapup( ssl_context *ssl )
2577{
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002578 int resume = ssl->handshake->resume;
2579
Paul Bakker48916f92012-09-16 19:57:18 +00002580 SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
2581
2582 /*
2583 * Free our handshake params
2584 */
2585 ssl_handshake_free( ssl->handshake );
Paul Bakker6e339b52013-07-03 13:37:05 +02002586 polarssl_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00002587 ssl->handshake = NULL;
2588
2589 /*
2590 * Switch in our now active transform context
2591 */
2592 if( ssl->transform )
2593 {
2594 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002595 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002596 }
2597 ssl->transform = ssl->transform_negotiate;
2598 ssl->transform_negotiate = NULL;
2599
Paul Bakker0a597072012-09-25 21:55:46 +00002600 if( ssl->session )
2601 {
2602 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002603 polarssl_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00002604 }
2605 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00002606 ssl->session_negotiate = NULL;
2607
Paul Bakker0a597072012-09-25 21:55:46 +00002608 /*
2609 * Add cache entry
2610 */
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002611 if( ssl->f_set_cache != NULL &&
2612 ssl->session->length != 0 &&
2613 resume == 0 )
2614 {
Paul Bakker0a597072012-09-25 21:55:46 +00002615 if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 )
2616 SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002617 }
Paul Bakker0a597072012-09-25 21:55:46 +00002618
Paul Bakker48916f92012-09-16 19:57:18 +00002619 ssl->state++;
2620
2621 SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
2622}
2623
Paul Bakker1ef83d62012-04-11 12:09:53 +00002624int ssl_write_finished( ssl_context *ssl )
2625{
2626 int ret, hash_len;
2627
2628 SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
2629
Paul Bakker92be97b2013-01-02 17:30:03 +01002630 /*
2631 * Set the out_msg pointer to the correct location based on IV length
2632 */
2633 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2634 {
2635 ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -
2636 ssl->transform_negotiate->fixed_ivlen;
2637 }
2638 else
2639 ssl->out_msg = ssl->out_iv;
2640
Paul Bakker48916f92012-09-16 19:57:18 +00002641 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002642
2643 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002644 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2645
Paul Bakker48916f92012-09-16 19:57:18 +00002646 ssl->verify_data_len = hash_len;
2647 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
2648
Paul Bakker5121ce52009-01-03 21:22:43 +00002649 ssl->out_msglen = 4 + hash_len;
2650 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2651 ssl->out_msg[0] = SSL_HS_FINISHED;
2652
2653 /*
2654 * In case of session resuming, invert the client and server
2655 * ChangeCipherSpec messages order.
2656 */
Paul Bakker0a597072012-09-25 21:55:46 +00002657 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002658 {
2659 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker48916f92012-09-16 19:57:18 +00002660 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002661 else
2662 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2663 }
2664 else
2665 ssl->state++;
2666
Paul Bakker48916f92012-09-16 19:57:18 +00002667 /*
2668 * Switch to our negotiated transform and session parameters for outbound data.
2669 */
2670 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
2671 ssl->transform_out = ssl->transform_negotiate;
2672 ssl->session_out = ssl->session_negotiate;
2673 memset( ssl->out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002674
Paul Bakker07eb38b2012-12-19 14:42:06 +01002675#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2676 if( ssl_hw_record_activate != NULL)
2677 {
2678 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
2679 {
2680 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2681 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2682 }
2683 }
2684#endif
2685
Paul Bakker5121ce52009-01-03 21:22:43 +00002686 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2687 {
2688 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2689 return( ret );
2690 }
2691
2692 SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
2693
2694 return( 0 );
2695}
2696
2697int ssl_parse_finished( ssl_context *ssl )
2698{
Paul Bakker23986e52011-04-24 08:57:21 +00002699 int ret;
2700 unsigned int hash_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002701 unsigned char buf[36];
2702
2703 SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
2704
Paul Bakker48916f92012-09-16 19:57:18 +00002705 ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002706
Paul Bakker48916f92012-09-16 19:57:18 +00002707 /*
2708 * Switch to our negotiated transform and session parameters for inbound data.
2709 */
2710 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
2711 ssl->transform_in = ssl->transform_negotiate;
2712 ssl->session_in = ssl->session_negotiate;
2713 memset( ssl->in_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002714
Paul Bakker92be97b2013-01-02 17:30:03 +01002715 /*
2716 * Set the in_msg pointer to the correct location based on IV length
2717 */
2718 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2719 {
2720 ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -
2721 ssl->transform_negotiate->fixed_ivlen;
2722 }
2723 else
2724 ssl->in_msg = ssl->in_iv;
2725
Paul Bakker07eb38b2012-12-19 14:42:06 +01002726#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2727 if( ssl_hw_record_activate != NULL)
2728 {
2729 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_INBOUND ) ) != 0 )
2730 {
2731 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2732 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2733 }
2734 }
2735#endif
2736
Paul Bakker5121ce52009-01-03 21:22:43 +00002737 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2738 {
2739 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2740 return( ret );
2741 }
2742
2743 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2744 {
2745 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002746 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002747 }
2748
Paul Bakker1ef83d62012-04-11 12:09:53 +00002749 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002750 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2751
2752 if( ssl->in_msg[0] != SSL_HS_FINISHED ||
2753 ssl->in_hslen != 4 + hash_len )
2754 {
2755 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002756 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002757 }
2758
Paul Bakker5121ce52009-01-03 21:22:43 +00002759 if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
2760 {
2761 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002762 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002763 }
2764
Paul Bakker48916f92012-09-16 19:57:18 +00002765 ssl->verify_data_len = hash_len;
2766 memcpy( ssl->peer_verify_data, buf, hash_len );
2767
Paul Bakker0a597072012-09-25 21:55:46 +00002768 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002769 {
2770 if( ssl->endpoint == SSL_IS_CLIENT )
2771 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2772
2773 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker48916f92012-09-16 19:57:18 +00002774 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002775 }
2776 else
2777 ssl->state++;
2778
2779 SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
2780
2781 return( 0 );
2782}
2783
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002784static int ssl_handshake_init( ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00002785{
2786 if( ssl->transform_negotiate )
2787 ssl_transform_free( ssl->transform_negotiate );
2788 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002789 ssl->transform_negotiate = polarssl_malloc( sizeof(ssl_transform) );
Paul Bakker48916f92012-09-16 19:57:18 +00002790
2791 if( ssl->session_negotiate )
2792 ssl_session_free( ssl->session_negotiate );
2793 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002794 ssl->session_negotiate = polarssl_malloc( sizeof(ssl_session) );
Paul Bakker48916f92012-09-16 19:57:18 +00002795
2796 if( ssl->handshake )
2797 ssl_handshake_free( ssl->handshake );
2798 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002799 ssl->handshake = polarssl_malloc( sizeof(ssl_handshake_params) );
Paul Bakker48916f92012-09-16 19:57:18 +00002800
2801 if( ssl->handshake == NULL ||
2802 ssl->transform_negotiate == NULL ||
2803 ssl->session_negotiate == NULL )
2804 {
2805 SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) );
2806 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2807 }
2808
2809 memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
2810 memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
2811 memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
2812
2813 md5_starts( &ssl->handshake->fin_md5 );
2814 sha1_starts( &ssl->handshake->fin_sha1 );
Paul Bakker9e36f042013-06-30 14:34:05 +02002815 sha256_starts( &ssl->handshake->fin_sha256, 0 );
2816#if defined(POLARSSL_SHA512_C)
2817 sha512_starts( &ssl->handshake->fin_sha512, 1 );
Paul Bakker769075d2012-11-24 11:26:46 +01002818#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002819
2820 ssl->handshake->update_checksum = ssl_update_checksum_start;
Paul Bakker23f36802012-09-28 14:15:14 +00002821 ssl->handshake->sig_alg = SSL_HASH_SHA1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002822
Paul Bakker61d113b2013-07-04 11:51:43 +02002823#if defined(POLARSSL_ECDH_C)
2824 ecdh_init( &ssl->handshake->ecdh_ctx );
2825#endif
2826
Paul Bakker48916f92012-09-16 19:57:18 +00002827 return( 0 );
2828}
2829
Paul Bakker5121ce52009-01-03 21:22:43 +00002830/*
2831 * Initialize an SSL context
2832 */
2833int ssl_init( ssl_context *ssl )
2834{
Paul Bakker48916f92012-09-16 19:57:18 +00002835 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002836 int len = SSL_BUFFER_LEN;
2837
2838 memset( ssl, 0, sizeof( ssl_context ) );
2839
Paul Bakker62f2dee2012-09-28 07:31:51 +00002840 /*
2841 * Sane defaults
2842 */
Paul Bakkered27a042013-04-18 22:46:23 +02002843#if defined(POLARSSL_RSA_C)
Paul Bakkereb2c6582012-09-27 19:15:01 +00002844 ssl->rsa_decrypt = ssl_rsa_decrypt;
2845 ssl->rsa_sign = ssl_rsa_sign;
2846 ssl->rsa_key_len = ssl_rsa_key_len;
Paul Bakkered27a042013-04-18 22:46:23 +02002847#endif
Paul Bakkereb2c6582012-09-27 19:15:01 +00002848
Paul Bakker1d29fb52012-09-28 13:28:45 +00002849 ssl->min_major_ver = SSL_MAJOR_VERSION_3;
2850 ssl->min_minor_ver = SSL_MINOR_VERSION_0;
Paul Bakker2fbefde2013-06-29 16:01:15 +02002851 ssl->max_major_ver = SSL_MAJOR_VERSION_3;
2852 ssl->max_minor_ver = SSL_MINOR_VERSION_3;
Paul Bakker1d29fb52012-09-28 13:28:45 +00002853
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002854 ssl_set_ciphersuites( ssl, ssl_list_ciphersuites() );
Paul Bakker645ce3a2012-10-31 12:32:41 +00002855
Paul Bakker62f2dee2012-09-28 07:31:51 +00002856#if defined(POLARSSL_DHM_C)
2857 if( ( ret = mpi_read_string( &ssl->dhm_P, 16,
2858 POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 ||
2859 ( ret = mpi_read_string( &ssl->dhm_G, 16,
2860 POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 )
2861 {
2862 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
2863 return( ret );
2864 }
2865#endif
2866
2867 /*
2868 * Prepare base structures
2869 */
Paul Bakker6e339b52013-07-03 13:37:05 +02002870 ssl->in_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00002871 ssl->in_hdr = ssl->in_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002872 ssl->in_iv = ssl->in_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002873 ssl->in_msg = ssl->in_ctr + 13;
2874
2875 if( ssl->in_ctr == NULL )
2876 {
2877 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002878 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002879 }
2880
Paul Bakker6e339b52013-07-03 13:37:05 +02002881 ssl->out_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00002882 ssl->out_hdr = ssl->out_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002883 ssl->out_iv = ssl->out_ctr + 13;
Paul Bakker5bd42292012-12-19 14:40:42 +01002884 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002885
2886 if( ssl->out_ctr == NULL )
2887 {
2888 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker6e339b52013-07-03 13:37:05 +02002889 polarssl_free( ssl-> in_ctr );
Paul Bakker69e095c2011-12-10 21:55:01 +00002890 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002891 }
2892
2893 memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
2894 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2895
2896 ssl->hostname = NULL;
2897 ssl->hostname_len = 0;
2898
Paul Bakker48916f92012-09-16 19:57:18 +00002899 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2900 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002901
2902 return( 0 );
2903}
2904
2905/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00002906 * Reset an initialized and used SSL context for re-use while retaining
2907 * all application-set variables, function pointers and data.
2908 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00002909int ssl_session_reset( ssl_context *ssl )
Paul Bakker7eb013f2011-10-06 12:37:39 +00002910{
Paul Bakker48916f92012-09-16 19:57:18 +00002911 int ret;
2912
Paul Bakker7eb013f2011-10-06 12:37:39 +00002913 ssl->state = SSL_HELLO_REQUEST;
Paul Bakker48916f92012-09-16 19:57:18 +00002914 ssl->renegotiation = SSL_INITIAL_HANDSHAKE;
2915 ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION;
2916
2917 ssl->verify_data_len = 0;
2918 memset( ssl->own_verify_data, 0, 36 );
2919 memset( ssl->peer_verify_data, 0, 36 );
2920
Paul Bakker7eb013f2011-10-06 12:37:39 +00002921 ssl->in_offt = NULL;
2922
Paul Bakker92be97b2013-01-02 17:30:03 +01002923 ssl->in_msg = ssl->in_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002924 ssl->in_msgtype = 0;
2925 ssl->in_msglen = 0;
2926 ssl->in_left = 0;
2927
2928 ssl->in_hslen = 0;
2929 ssl->nb_zero = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002930 ssl->record_read = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002931
Paul Bakker92be97b2013-01-02 17:30:03 +01002932 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002933 ssl->out_msgtype = 0;
2934 ssl->out_msglen = 0;
2935 ssl->out_left = 0;
2936
Paul Bakker48916f92012-09-16 19:57:18 +00002937 ssl->transform_in = NULL;
2938 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002939
2940 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2941 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker05ef8352012-05-08 09:17:57 +00002942
2943#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2944 if( ssl_hw_record_reset != NULL)
2945 {
2946 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) );
Paul Bakker07eb38b2012-12-19 14:42:06 +01002947 if( ( ret = ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002948 {
2949 SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret );
2950 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2951 }
Paul Bakker05ef8352012-05-08 09:17:57 +00002952 }
2953#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00002954
Paul Bakker48916f92012-09-16 19:57:18 +00002955 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002956 {
Paul Bakker48916f92012-09-16 19:57:18 +00002957 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002958 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002959 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002960 }
Paul Bakker48916f92012-09-16 19:57:18 +00002961
Paul Bakkerc0463502013-02-14 11:19:38 +01002962 if( ssl->session )
2963 {
2964 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002965 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01002966 ssl->session = NULL;
2967 }
2968
Paul Bakker48916f92012-09-16 19:57:18 +00002969 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2970 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002971
2972 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00002973}
2974
2975/*
Paul Bakker5121ce52009-01-03 21:22:43 +00002976 * SSL set accessors
2977 */
2978void ssl_set_endpoint( ssl_context *ssl, int endpoint )
2979{
2980 ssl->endpoint = endpoint;
2981}
2982
2983void ssl_set_authmode( ssl_context *ssl, int authmode )
2984{
2985 ssl->authmode = authmode;
2986}
2987
Paul Bakkered27a042013-04-18 22:46:23 +02002988#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002989void ssl_set_verify( ssl_context *ssl,
Paul Bakker915275b2012-09-28 07:10:55 +00002990 int (*f_vrfy)(void *, x509_cert *, int, int *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002991 void *p_vrfy )
2992{
2993 ssl->f_vrfy = f_vrfy;
2994 ssl->p_vrfy = p_vrfy;
2995}
Paul Bakkered27a042013-04-18 22:46:23 +02002996#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002997
Paul Bakker5121ce52009-01-03 21:22:43 +00002998void ssl_set_rng( ssl_context *ssl,
Paul Bakkera3d195c2011-11-27 21:07:34 +00002999 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00003000 void *p_rng )
3001{
3002 ssl->f_rng = f_rng;
3003 ssl->p_rng = p_rng;
3004}
3005
3006void ssl_set_dbg( ssl_context *ssl,
Paul Bakkerff60ee62010-03-16 21:09:09 +00003007 void (*f_dbg)(void *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00003008 void *p_dbg )
3009{
3010 ssl->f_dbg = f_dbg;
3011 ssl->p_dbg = p_dbg;
3012}
3013
3014void ssl_set_bio( ssl_context *ssl,
Paul Bakker23986e52011-04-24 08:57:21 +00003015 int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
Paul Bakker39bb4182011-06-21 07:36:43 +00003016 int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
Paul Bakker5121ce52009-01-03 21:22:43 +00003017{
3018 ssl->f_recv = f_recv;
3019 ssl->f_send = f_send;
3020 ssl->p_recv = p_recv;
3021 ssl->p_send = p_send;
3022}
3023
Paul Bakker0a597072012-09-25 21:55:46 +00003024void ssl_set_session_cache( ssl_context *ssl,
3025 int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
3026 int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00003027{
Paul Bakker0a597072012-09-25 21:55:46 +00003028 ssl->f_get_cache = f_get_cache;
3029 ssl->p_get_cache = p_get_cache;
3030 ssl->f_set_cache = f_set_cache;
3031 ssl->p_set_cache = p_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00003032}
3033
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003034int ssl_set_session( ssl_context *ssl, const ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00003035{
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003036 int ret;
3037
3038 if( ssl == NULL ||
3039 session == NULL ||
3040 ssl->session_negotiate == NULL ||
3041 ssl->endpoint != SSL_IS_CLIENT )
3042 {
3043 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3044 }
3045
3046 if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 )
3047 return( ret );
3048
Paul Bakker0a597072012-09-25 21:55:46 +00003049 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003050
3051 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003052}
3053
Paul Bakkerb68cad62012-08-23 08:34:18 +00003054void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00003055{
Paul Bakker8f4ddae2013-04-15 15:09:54 +02003056 ssl->ciphersuite_list[SSL_MINOR_VERSION_0] = ciphersuites;
3057 ssl->ciphersuite_list[SSL_MINOR_VERSION_1] = ciphersuites;
3058 ssl->ciphersuite_list[SSL_MINOR_VERSION_2] = ciphersuites;
3059 ssl->ciphersuite_list[SSL_MINOR_VERSION_3] = ciphersuites;
3060}
3061
3062void ssl_set_ciphersuites_for_version( ssl_context *ssl, const int *ciphersuites,
3063 int major, int minor )
3064{
3065 if( major != SSL_MAJOR_VERSION_3 )
3066 return;
3067
3068 if( minor < SSL_MINOR_VERSION_0 || minor > SSL_MINOR_VERSION_3 )
3069 return;
3070
3071 ssl->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00003072}
3073
Paul Bakkered27a042013-04-18 22:46:23 +02003074#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003075void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain,
Paul Bakker57b79142010-03-24 06:51:15 +00003076 x509_crl *ca_crl, const char *peer_cn )
Paul Bakker5121ce52009-01-03 21:22:43 +00003077{
3078 ssl->ca_chain = ca_chain;
Paul Bakker40ea7de2009-05-03 10:18:48 +00003079 ssl->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00003080 ssl->peer_cn = peer_cn;
3081}
3082
3083void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert,
3084 rsa_context *rsa_key )
3085{
3086 ssl->own_cert = own_cert;
3087 ssl->rsa_key = rsa_key;
3088}
3089
Paul Bakkereb2c6582012-09-27 19:15:01 +00003090void ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert,
3091 void *rsa_key,
3092 rsa_decrypt_func rsa_decrypt,
3093 rsa_sign_func rsa_sign,
3094 rsa_key_len_func rsa_key_len )
Paul Bakker43b7e352011-01-18 15:27:19 +00003095{
3096 ssl->own_cert = own_cert;
Paul Bakkereb2c6582012-09-27 19:15:01 +00003097 ssl->rsa_key = rsa_key;
3098 ssl->rsa_decrypt = rsa_decrypt;
3099 ssl->rsa_sign = rsa_sign;
3100 ssl->rsa_key_len = rsa_key_len;
Paul Bakker43b7e352011-01-18 15:27:19 +00003101}
Paul Bakkered27a042013-04-18 22:46:23 +02003102#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00003103
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003104#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
3105void ssl_set_psk( ssl_context *ssl, const unsigned char *psk, size_t psk_len,
3106 const unsigned char *psk_identity, size_t psk_identity_len )
3107{
3108 ssl->psk = psk;
3109 ssl->psk_len = psk_len;
3110 ssl->psk_identity = psk_identity;
3111 ssl->psk_identity_len = psk_identity_len;
3112}
3113#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00003114
Paul Bakker48916f92012-09-16 19:57:18 +00003115#if defined(POLARSSL_DHM_C)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003116int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00003117{
3118 int ret;
3119
Paul Bakker48916f92012-09-16 19:57:18 +00003120 if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003121 {
3122 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3123 return( ret );
3124 }
3125
Paul Bakker48916f92012-09-16 19:57:18 +00003126 if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003127 {
3128 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3129 return( ret );
3130 }
3131
3132 return( 0 );
3133}
3134
Paul Bakker1b57b062011-01-06 15:48:19 +00003135int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx )
3136{
3137 int ret;
3138
Paul Bakker48916f92012-09-16 19:57:18 +00003139 if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003140 {
3141 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3142 return( ret );
3143 }
3144
Paul Bakker48916f92012-09-16 19:57:18 +00003145 if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003146 {
3147 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3148 return( ret );
3149 }
3150
3151 return( 0 );
3152}
Paul Bakker48916f92012-09-16 19:57:18 +00003153#endif /* POLARSSL_DHM_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00003154
Paul Bakkerff60ee62010-03-16 21:09:09 +00003155int ssl_set_hostname( ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00003156{
3157 if( hostname == NULL )
Paul Bakker40e46942009-01-03 21:51:57 +00003158 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003159
3160 ssl->hostname_len = strlen( hostname );
Paul Bakker6e339b52013-07-03 13:37:05 +02003161 ssl->hostname = (unsigned char *) polarssl_malloc( ssl->hostname_len + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003162
Paul Bakkerb15b8512012-01-13 13:44:06 +00003163 if( ssl->hostname == NULL )
3164 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3165
Paul Bakker3c2122f2013-06-24 19:03:14 +02003166 memcpy( ssl->hostname, (const unsigned char *) hostname,
Paul Bakker5121ce52009-01-03 21:22:43 +00003167 ssl->hostname_len );
Paul Bakkerf7abd422013-04-16 13:15:56 +02003168
Paul Bakker40ea7de2009-05-03 10:18:48 +00003169 ssl->hostname[ssl->hostname_len] = '\0';
Paul Bakker5121ce52009-01-03 21:22:43 +00003170
3171 return( 0 );
3172}
3173
Paul Bakker5701cdc2012-09-27 21:49:42 +00003174void ssl_set_sni( ssl_context *ssl,
3175 int (*f_sni)(void *, ssl_context *,
3176 const unsigned char *, size_t),
3177 void *p_sni )
3178{
3179 ssl->f_sni = f_sni;
3180 ssl->p_sni = p_sni;
3181}
3182
Paul Bakker490ecc82011-10-06 13:04:09 +00003183void ssl_set_max_version( ssl_context *ssl, int major, int minor )
3184{
3185 ssl->max_major_ver = major;
3186 ssl->max_minor_ver = minor;
3187}
3188
Paul Bakker1d29fb52012-09-28 13:28:45 +00003189void ssl_set_min_version( ssl_context *ssl, int major, int minor )
3190{
3191 ssl->min_major_ver = major;
3192 ssl->min_minor_ver = minor;
3193}
3194
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003195int ssl_set_max_frag_len( ssl_context *ssl, unsigned char mfl_code )
3196{
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003197 if( mfl_code >= sizeof( mfl_code_to_length ) ||
3198 mfl_code_to_length[mfl_code] > SSL_MAX_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003199 {
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003200 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003201 }
3202
3203 ssl->mfl_code = mfl_code;
3204
3205 return( 0 );
3206}
3207
Paul Bakker8c1ede62013-07-19 14:14:37 +02003208int ssl_set_truncated_hmac( ssl_context *ssl, int truncate )
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003209{
3210 if( ssl->endpoint != SSL_IS_CLIENT )
3211 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3212
Paul Bakker8c1ede62013-07-19 14:14:37 +02003213 ssl->trunc_hmac = truncate;
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003214
3215 return( 0 );
3216}
3217
Paul Bakker48916f92012-09-16 19:57:18 +00003218void ssl_set_renegotiation( ssl_context *ssl, int renegotiation )
3219{
3220 ssl->disable_renegotiation = renegotiation;
3221}
3222
3223void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy )
3224{
3225 ssl->allow_legacy_renegotiation = allow_legacy;
3226}
3227
Paul Bakker5121ce52009-01-03 21:22:43 +00003228/*
3229 * SSL get accessors
3230 */
Paul Bakker23986e52011-04-24 08:57:21 +00003231size_t ssl_get_bytes_avail( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003232{
3233 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
3234}
3235
Paul Bakkerff60ee62010-03-16 21:09:09 +00003236int ssl_get_verify_result( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003237{
3238 return( ssl->verify_result );
3239}
3240
Paul Bakkere3166ce2011-01-27 17:40:50 +00003241const char *ssl_get_ciphersuite( const ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00003242{
Paul Bakker926c8e42013-03-06 10:23:34 +01003243 if( ssl == NULL || ssl->session == NULL )
3244 return NULL;
3245
Paul Bakkere3166ce2011-01-27 17:40:50 +00003246 return ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00003247}
3248
Paul Bakker43ca69c2011-01-15 17:35:19 +00003249const char *ssl_get_version( const ssl_context *ssl )
3250{
3251 switch( ssl->minor_ver )
3252 {
3253 case SSL_MINOR_VERSION_0:
3254 return( "SSLv3.0" );
3255
3256 case SSL_MINOR_VERSION_1:
3257 return( "TLSv1.0" );
3258
3259 case SSL_MINOR_VERSION_2:
3260 return( "TLSv1.1" );
3261
Paul Bakker1ef83d62012-04-11 12:09:53 +00003262 case SSL_MINOR_VERSION_3:
3263 return( "TLSv1.2" );
3264
Paul Bakker43ca69c2011-01-15 17:35:19 +00003265 default:
3266 break;
3267 }
3268 return( "unknown" );
3269}
3270
Paul Bakkered27a042013-04-18 22:46:23 +02003271#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb0550d92012-10-30 07:51:03 +00003272const x509_cert *ssl_get_peer_cert( const ssl_context *ssl )
3273{
3274 if( ssl == NULL || ssl->session == NULL )
3275 return NULL;
3276
3277 return ssl->session->peer_cert;
3278}
Paul Bakkered27a042013-04-18 22:46:23 +02003279#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00003280
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003281int ssl_get_session( const ssl_context *ssl, ssl_session *dst )
3282{
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003283 if( ssl == NULL ||
3284 dst == NULL ||
3285 ssl->session == NULL ||
3286 ssl->endpoint != SSL_IS_CLIENT )
3287 {
3288 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3289 }
3290
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003291 return( ssl_session_copy( dst, ssl->session ) );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003292}
3293
Paul Bakker5121ce52009-01-03 21:22:43 +00003294/*
Paul Bakker1961b702013-01-25 14:49:24 +01003295 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003296 */
Paul Bakker1961b702013-01-25 14:49:24 +01003297int ssl_handshake_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003298{
Paul Bakker40e46942009-01-03 21:51:57 +00003299 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003300
Paul Bakker40e46942009-01-03 21:51:57 +00003301#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003302 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker1961b702013-01-25 14:49:24 +01003303 ret = ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003304#endif
3305
Paul Bakker40e46942009-01-03 21:51:57 +00003306#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003307 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker1961b702013-01-25 14:49:24 +01003308 ret = ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003309#endif
3310
Paul Bakker1961b702013-01-25 14:49:24 +01003311 return( ret );
3312}
3313
3314/*
3315 * Perform the SSL handshake
3316 */
3317int ssl_handshake( ssl_context *ssl )
3318{
3319 int ret = 0;
3320
3321 SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
3322
3323 while( ssl->state != SSL_HANDSHAKE_OVER )
3324 {
3325 ret = ssl_handshake_step( ssl );
3326
3327 if( ret != 0 )
3328 break;
3329 }
3330
Paul Bakker5121ce52009-01-03 21:22:43 +00003331 SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
3332
3333 return( ret );
3334}
3335
3336/*
Paul Bakker48916f92012-09-16 19:57:18 +00003337 * Renegotiate current connection
3338 */
3339int ssl_renegotiate( ssl_context *ssl )
3340{
3341 int ret;
3342
3343 SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
3344
3345 if( ssl->state != SSL_HANDSHAKE_OVER )
3346 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3347
3348 ssl->state = SSL_HELLO_REQUEST;
3349 ssl->renegotiation = SSL_RENEGOTIATION;
3350
3351 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3352 return( ret );
3353
3354 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3355 {
3356 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3357 return( ret );
3358 }
3359
3360 SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
3361
3362 return( 0 );
3363}
3364
3365/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003366 * Receive application data decrypted from the SSL layer
3367 */
Paul Bakker23986e52011-04-24 08:57:21 +00003368int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003369{
Paul Bakker23986e52011-04-24 08:57:21 +00003370 int ret;
3371 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003372
3373 SSL_DEBUG_MSG( 2, ( "=> read" ) );
3374
3375 if( ssl->state != SSL_HANDSHAKE_OVER )
3376 {
3377 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3378 {
3379 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3380 return( ret );
3381 }
3382 }
3383
3384 if( ssl->in_offt == NULL )
3385 {
3386 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3387 {
Paul Bakker831a7552011-05-18 13:32:51 +00003388 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3389 return( 0 );
3390
Paul Bakker5121ce52009-01-03 21:22:43 +00003391 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3392 return( ret );
3393 }
3394
3395 if( ssl->in_msglen == 0 &&
3396 ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
3397 {
3398 /*
3399 * OpenSSL sends empty messages to randomize the IV
3400 */
3401 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3402 {
Paul Bakker831a7552011-05-18 13:32:51 +00003403 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3404 return( 0 );
3405
Paul Bakker5121ce52009-01-03 21:22:43 +00003406 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3407 return( ret );
3408 }
3409 }
3410
Paul Bakker48916f92012-09-16 19:57:18 +00003411 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
3412 {
3413 SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
3414
3415 if( ssl->endpoint == SSL_IS_CLIENT &&
3416 ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST ||
3417 ssl->in_hslen != 4 ) )
3418 {
3419 SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
3420 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
3421 }
3422
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003423 if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
3424 ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
3425 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) )
Paul Bakker48916f92012-09-16 19:57:18 +00003426 {
3427 SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
3428
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003429 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakker48916f92012-09-16 19:57:18 +00003430 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003431 /*
3432 * SSLv3 does not have a "no_renegotiation" alert
3433 */
3434 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
3435 return( ret );
3436 }
3437 else
3438 {
3439 if( ( ret = ssl_send_alert_message( ssl,
3440 SSL_ALERT_LEVEL_WARNING,
3441 SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
3442 {
3443 return( ret );
3444 }
Paul Bakker48916f92012-09-16 19:57:18 +00003445 }
3446 }
3447 else
3448 {
3449 if( ( ret = ssl_renegotiate( ssl ) ) != 0 )
3450 {
3451 SSL_DEBUG_RET( 1, "ssl_renegotiate", ret );
3452 return( ret );
3453 }
3454
3455 return( POLARSSL_ERR_NET_WANT_READ );
3456 }
3457 }
3458 else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003459 {
3460 SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003461 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003462 }
3463
3464 ssl->in_offt = ssl->in_msg;
3465 }
3466
3467 n = ( len < ssl->in_msglen )
3468 ? len : ssl->in_msglen;
3469
3470 memcpy( buf, ssl->in_offt, n );
3471 ssl->in_msglen -= n;
3472
3473 if( ssl->in_msglen == 0 )
3474 /* all bytes consumed */
3475 ssl->in_offt = NULL;
3476 else
3477 /* more data available */
3478 ssl->in_offt += n;
3479
3480 SSL_DEBUG_MSG( 2, ( "<= read" ) );
3481
Paul Bakker23986e52011-04-24 08:57:21 +00003482 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003483}
3484
3485/*
3486 * Send application data to be encrypted by the SSL layer
3487 */
Paul Bakker23986e52011-04-24 08:57:21 +00003488int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003489{
Paul Bakker23986e52011-04-24 08:57:21 +00003490 int ret;
3491 size_t n;
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003492 unsigned int max_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00003493
3494 SSL_DEBUG_MSG( 2, ( "=> write" ) );
3495
3496 if( ssl->state != SSL_HANDSHAKE_OVER )
3497 {
3498 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3499 {
3500 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3501 return( ret );
3502 }
3503 }
3504
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003505 /*
3506 * Assume mfl_code is correct since it was checked when set
3507 */
3508 max_len = mfl_code_to_length[ssl->mfl_code];
3509
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02003510 /*
3511 * Check if a smaller max length was negociated
3512 */
3513 if( ssl->session_out != NULL &&
3514 mfl_code_to_length[ssl->session_out->mfl_code] < max_len )
3515 {
3516 max_len = mfl_code_to_length[ssl->session_out->mfl_code];
3517 }
3518
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003519 n = ( len < max_len) ? len : max_len;
Paul Bakker887bd502011-06-08 13:10:54 +00003520
Paul Bakker5121ce52009-01-03 21:22:43 +00003521 if( ssl->out_left != 0 )
3522 {
3523 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3524 {
3525 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3526 return( ret );
3527 }
3528 }
Paul Bakker887bd502011-06-08 13:10:54 +00003529 else
Paul Bakker1fd00bf2011-03-14 20:50:15 +00003530 {
Paul Bakker887bd502011-06-08 13:10:54 +00003531 ssl->out_msglen = n;
3532 ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
3533 memcpy( ssl->out_msg, buf, n );
3534
3535 if( ( ret = ssl_write_record( ssl ) ) != 0 )
3536 {
3537 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
3538 return( ret );
3539 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003540 }
3541
3542 SSL_DEBUG_MSG( 2, ( "<= write" ) );
3543
Paul Bakker23986e52011-04-24 08:57:21 +00003544 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003545}
3546
3547/*
3548 * Notify the peer that the connection is being closed
3549 */
3550int ssl_close_notify( ssl_context *ssl )
3551{
3552 int ret;
3553
3554 SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
3555
3556 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3557 {
3558 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3559 return( ret );
3560 }
3561
3562 if( ssl->state == SSL_HANDSHAKE_OVER )
3563 {
Paul Bakker48916f92012-09-16 19:57:18 +00003564 if( ( ret = ssl_send_alert_message( ssl,
3565 SSL_ALERT_LEVEL_WARNING,
3566 SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003567 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003568 return( ret );
3569 }
3570 }
3571
3572 SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
3573
3574 return( ret );
3575}
3576
Paul Bakker48916f92012-09-16 19:57:18 +00003577void ssl_transform_free( ssl_transform *transform )
3578{
3579#if defined(POLARSSL_ZLIB_SUPPORT)
3580 deflateEnd( &transform->ctx_deflate );
3581 inflateEnd( &transform->ctx_inflate );
3582#endif
3583
Paul Bakker61d113b2013-07-04 11:51:43 +02003584 md_free_ctx( &transform->md_ctx_enc );
3585 md_free_ctx( &transform->md_ctx_dec );
3586
Paul Bakker48916f92012-09-16 19:57:18 +00003587 memset( transform, 0, sizeof( ssl_transform ) );
3588}
3589
3590void ssl_handshake_free( ssl_handshake_params *handshake )
3591{
3592#if defined(POLARSSL_DHM_C)
3593 dhm_free( &handshake->dhm_ctx );
3594#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02003595#if defined(POLARSSL_ECDH_C)
3596 ecdh_free( &handshake->ecdh_ctx );
3597#endif
3598
Paul Bakker48916f92012-09-16 19:57:18 +00003599 memset( handshake, 0, sizeof( ssl_handshake_params ) );
3600}
3601
3602void ssl_session_free( ssl_session *session )
3603{
Paul Bakkered27a042013-04-18 22:46:23 +02003604#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker0a597072012-09-25 21:55:46 +00003605 if( session->peer_cert != NULL )
Paul Bakker48916f92012-09-16 19:57:18 +00003606 {
Paul Bakker0a597072012-09-25 21:55:46 +00003607 x509_free( session->peer_cert );
Paul Bakker6e339b52013-07-03 13:37:05 +02003608 polarssl_free( session->peer_cert );
Paul Bakker48916f92012-09-16 19:57:18 +00003609 }
Paul Bakkered27a042013-04-18 22:46:23 +02003610#endif
Paul Bakker0a597072012-09-25 21:55:46 +00003611
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02003612 polarssl_free( session->ticket );
3613
Paul Bakker0a597072012-09-25 21:55:46 +00003614 memset( session, 0, sizeof( ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003615}
3616
Paul Bakker5121ce52009-01-03 21:22:43 +00003617/*
3618 * Free an SSL context
3619 */
3620void ssl_free( ssl_context *ssl )
3621{
3622 SSL_DEBUG_MSG( 2, ( "=> free" ) );
3623
Paul Bakker5121ce52009-01-03 21:22:43 +00003624 if( ssl->out_ctr != NULL )
3625 {
3626 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02003627 polarssl_free( ssl->out_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00003628 }
3629
3630 if( ssl->in_ctr != NULL )
3631 {
3632 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02003633 polarssl_free( ssl->in_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00003634 }
3635
Paul Bakker40e46942009-01-03 21:51:57 +00003636#if defined(POLARSSL_DHM_C)
Paul Bakker48916f92012-09-16 19:57:18 +00003637 mpi_free( &ssl->dhm_P );
3638 mpi_free( &ssl->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00003639#endif
3640
Paul Bakker48916f92012-09-16 19:57:18 +00003641 if( ssl->transform )
3642 {
3643 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02003644 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003645 }
3646
3647 if( ssl->handshake )
3648 {
3649 ssl_handshake_free( ssl->handshake );
3650 ssl_transform_free( ssl->transform_negotiate );
3651 ssl_session_free( ssl->session_negotiate );
3652
Paul Bakker6e339b52013-07-03 13:37:05 +02003653 polarssl_free( ssl->handshake );
3654 polarssl_free( ssl->transform_negotiate );
3655 polarssl_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00003656 }
3657
Paul Bakkerc0463502013-02-14 11:19:38 +01003658 if( ssl->session )
3659 {
3660 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02003661 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01003662 }
3663
Paul Bakker5121ce52009-01-03 21:22:43 +00003664 if ( ssl->hostname != NULL)
3665 {
3666 memset( ssl->hostname, 0, ssl->hostname_len );
Paul Bakker6e339b52013-07-03 13:37:05 +02003667 polarssl_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00003668 ssl->hostname_len = 0;
3669 }
3670
Paul Bakker05ef8352012-05-08 09:17:57 +00003671#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3672 if( ssl_hw_record_finish != NULL )
3673 {
3674 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) );
3675 ssl_hw_record_finish( ssl );
3676 }
3677#endif
3678
Paul Bakker5121ce52009-01-03 21:22:43 +00003679 SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00003680
Paul Bakker86f04f42013-02-14 11:20:09 +01003681 /* Actually clear after last debug message */
Paul Bakker2da561c2009-02-05 18:00:28 +00003682 memset( ssl, 0, sizeof( ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003683}
3684
3685#endif