blob: a19e4dab43781223cbe938e605ed6fe9a42d0c27 [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 Bakkerfab5c822012-02-06 16:45:10 +000044#include "polarssl/sha2.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000045
Paul Bakkerca4ab492012-04-18 14:23:57 +000046#if defined(POLARSSL_GCM_C)
47#include "polarssl/gcm.h"
48#endif
49
Paul Bakker5121ce52009-01-03 21:22:43 +000050#include <stdlib.h>
51#include <time.h>
52
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000053#if defined _MSC_VER && !defined strcasecmp
54#define strcasecmp _stricmp
55#endif
56
Paul Bakker05ef8352012-05-08 09:17:57 +000057#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
58int (*ssl_hw_record_init)(ssl_context *ssl,
59 const unsigned char *key_enc, const unsigned char *key_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +010060 size_t keylen,
Paul Bakker05ef8352012-05-08 09:17:57 +000061 const unsigned char *iv_enc, const unsigned char *iv_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +010062 size_t ivlen,
63 const unsigned char *mac_enc, const unsigned char *mac_dec,
64 size_t maclen) = NULL;
65int (*ssl_hw_record_activate)(ssl_context *ssl, int direction) = NULL;
Paul Bakker05ef8352012-05-08 09:17:57 +000066int (*ssl_hw_record_reset)(ssl_context *ssl) = NULL;
67int (*ssl_hw_record_write)(ssl_context *ssl) = NULL;
68int (*ssl_hw_record_read)(ssl_context *ssl) = NULL;
69int (*ssl_hw_record_finish)(ssl_context *ssl) = NULL;
70#endif
71
Paul Bakkered27a042013-04-18 22:46:23 +020072#if defined(POLARSSL_RSA_C)
Paul Bakkereb2c6582012-09-27 19:15:01 +000073static int ssl_rsa_decrypt( void *ctx, int mode, size_t *olen,
74 const unsigned char *input, unsigned char *output,
75 size_t output_max_len )
76{
77 return rsa_pkcs1_decrypt( (rsa_context *) ctx, mode, olen, input, output,
78 output_max_len );
79}
80
81static int ssl_rsa_sign( void *ctx,
82 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
83 int mode, int hash_id, unsigned int hashlen,
84 const unsigned char *hash, unsigned char *sig )
85{
86 return rsa_pkcs1_sign( (rsa_context *) ctx, f_rng, p_rng, mode, hash_id,
87 hashlen, hash, sig );
88}
89
90static size_t ssl_rsa_key_len( void *ctx )
91{
92 return ( (rsa_context *) ctx )->len;
93}
Paul Bakkered27a042013-04-18 22:46:23 +020094#endif /* POLARSSL_RSA_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +000095
Paul Bakker5121ce52009-01-03 21:22:43 +000096/*
97 * Key material generation
98 */
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +020099static int ssl3_prf( const unsigned char *secret, size_t slen,
100 const char *label,
101 const unsigned char *random, size_t rlen,
Paul Bakker5f70b252012-09-13 14:23:06 +0000102 unsigned char *dstbuf, size_t dlen )
103{
104 size_t i;
105 md5_context md5;
106 sha1_context sha1;
107 unsigned char padding[16];
108 unsigned char sha1sum[20];
109 ((void)label);
110
111 /*
112 * SSLv3:
113 * block =
114 * MD5( secret + SHA1( 'A' + secret + random ) ) +
115 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
116 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
117 * ...
118 */
119 for( i = 0; i < dlen / 16; i++ )
120 {
121 memset( padding, 'A' + i, 1 + i );
122
123 sha1_starts( &sha1 );
124 sha1_update( &sha1, padding, 1 + i );
125 sha1_update( &sha1, secret, slen );
126 sha1_update( &sha1, random, rlen );
127 sha1_finish( &sha1, sha1sum );
128
129 md5_starts( &md5 );
130 md5_update( &md5, secret, slen );
131 md5_update( &md5, sha1sum, 20 );
132 md5_finish( &md5, dstbuf + i * 16 );
133 }
134
135 memset( &md5, 0, sizeof( md5 ) );
136 memset( &sha1, 0, sizeof( sha1 ) );
137
138 memset( padding, 0, sizeof( padding ) );
139 memset( sha1sum, 0, sizeof( sha1sum ) );
140
141 return( 0 );
142}
143
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200144static int tls1_prf( const unsigned char *secret, size_t slen,
145 const char *label,
146 const unsigned char *random, size_t rlen,
Paul Bakker23986e52011-04-24 08:57:21 +0000147 unsigned char *dstbuf, size_t dlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000148{
Paul Bakker23986e52011-04-24 08:57:21 +0000149 size_t nb, hs;
150 size_t i, j, k;
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200151 const unsigned char *S1, *S2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000152 unsigned char tmp[128];
153 unsigned char h_i[20];
154
155 if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
Paul Bakker40e46942009-01-03 21:51:57 +0000156 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000157
158 hs = ( slen + 1 ) / 2;
159 S1 = secret;
160 S2 = secret + slen - hs;
161
162 nb = strlen( label );
163 memcpy( tmp + 20, label, nb );
164 memcpy( tmp + 20 + nb, random, rlen );
165 nb += rlen;
166
167 /*
168 * First compute P_md5(secret,label+random)[0..dlen]
169 */
170 md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
171
172 for( i = 0; i < dlen; i += 16 )
173 {
174 md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
175 md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp );
176
177 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
178
179 for( j = 0; j < k; j++ )
180 dstbuf[i + j] = h_i[j];
181 }
182
183 /*
184 * XOR out with P_sha1(secret,label+random)[0..dlen]
185 */
186 sha1_hmac( S2, hs, tmp + 20, nb, tmp );
187
188 for( i = 0; i < dlen; i += 20 )
189 {
190 sha1_hmac( S2, hs, tmp, 20 + nb, h_i );
191 sha1_hmac( S2, hs, tmp, 20, tmp );
192
193 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
194
195 for( j = 0; j < k; j++ )
196 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
197 }
198
199 memset( tmp, 0, sizeof( tmp ) );
200 memset( h_i, 0, sizeof( h_i ) );
201
202 return( 0 );
203}
204
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200205static int tls_prf_sha256( const unsigned char *secret, size_t slen,
206 const char *label,
207 const unsigned char *random, size_t rlen,
Paul Bakker1ef83d62012-04-11 12:09:53 +0000208 unsigned char *dstbuf, size_t dlen )
209{
210 size_t nb;
211 size_t i, j, k;
212 unsigned char tmp[128];
213 unsigned char h_i[32];
214
215 if( sizeof( tmp ) < 32 + strlen( label ) + rlen )
216 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
217
218 nb = strlen( label );
219 memcpy( tmp + 32, label, nb );
220 memcpy( tmp + 32 + nb, random, rlen );
221 nb += rlen;
222
223 /*
224 * Compute P_<hash>(secret, label + random)[0..dlen]
225 */
226 sha2_hmac( secret, slen, tmp + 32, nb, tmp, 0 );
227
228 for( i = 0; i < dlen; i += 32 )
229 {
230 sha2_hmac( secret, slen, tmp, 32 + nb, h_i, 0 );
231 sha2_hmac( secret, slen, tmp, 32, tmp, 0 );
232
233 k = ( i + 32 > dlen ) ? dlen % 32 : 32;
234
235 for( j = 0; j < k; j++ )
236 dstbuf[i + j] = h_i[j];
237 }
238
239 memset( tmp, 0, sizeof( tmp ) );
240 memset( h_i, 0, sizeof( h_i ) );
241
242 return( 0 );
243}
244
Paul Bakker769075d2012-11-24 11:26:46 +0100245#if defined(POLARSSL_SHA4_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200246static int tls_prf_sha384( const unsigned char *secret, size_t slen,
247 const char *label,
248 const unsigned char *random, size_t rlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000249 unsigned char *dstbuf, size_t dlen )
250{
251 size_t nb;
252 size_t i, j, k;
253 unsigned char tmp[128];
254 unsigned char h_i[48];
255
256 if( sizeof( tmp ) < 48 + strlen( label ) + rlen )
257 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
258
259 nb = strlen( label );
260 memcpy( tmp + 48, label, nb );
261 memcpy( tmp + 48 + nb, random, rlen );
262 nb += rlen;
263
264 /*
265 * Compute P_<hash>(secret, label + random)[0..dlen]
266 */
267 sha4_hmac( secret, slen, tmp + 48, nb, tmp, 1 );
268
269 for( i = 0; i < dlen; i += 48 )
270 {
271 sha4_hmac( secret, slen, tmp, 48 + nb, h_i, 1 );
272 sha4_hmac( secret, slen, tmp, 48, tmp, 1 );
273
274 k = ( i + 48 > dlen ) ? dlen % 48 : 48;
275
276 for( j = 0; j < k; j++ )
277 dstbuf[i + j] = h_i[j];
278 }
279
280 memset( tmp, 0, sizeof( tmp ) );
281 memset( h_i, 0, sizeof( h_i ) );
282
283 return( 0 );
284}
Paul Bakker769075d2012-11-24 11:26:46 +0100285#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +0000286
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200287static void ssl_update_checksum_start(ssl_context *, const unsigned char *, size_t);
288static void ssl_update_checksum_md5sha1(ssl_context *, const unsigned char *, size_t);
289static void ssl_update_checksum_sha256(ssl_context *, const unsigned char *, size_t);
Paul Bakker380da532012-04-18 16:10:25 +0000290
291static void ssl_calc_verify_ssl(ssl_context *,unsigned char *);
292static void ssl_calc_verify_tls(ssl_context *,unsigned char *);
293static void ssl_calc_verify_tls_sha256(ssl_context *,unsigned char *);
Paul Bakker380da532012-04-18 16:10:25 +0000294
Paul Bakkerca4ab492012-04-18 14:23:57 +0000295static void ssl_calc_finished_ssl(ssl_context *,unsigned char *,int);
296static void ssl_calc_finished_tls(ssl_context *,unsigned char *,int);
297static void ssl_calc_finished_tls_sha256(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100298
299#if defined(POLARSSL_SHA4_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200300static void ssl_update_checksum_sha384(ssl_context *, const unsigned char *, size_t);
Paul Bakker769075d2012-11-24 11:26:46 +0100301static void ssl_calc_verify_tls_sha384(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000302static void ssl_calc_finished_tls_sha384(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100303#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000304
Paul Bakker5121ce52009-01-03 21:22:43 +0000305int ssl_derive_keys( ssl_context *ssl )
306{
Paul Bakker5121ce52009-01-03 21:22:43 +0000307 unsigned char tmp[64];
Paul Bakker5121ce52009-01-03 21:22:43 +0000308 unsigned char keyblk[256];
309 unsigned char *key1;
310 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100311 unsigned char *mac_enc;
312 unsigned char *mac_dec;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000313 unsigned int iv_copy_len;
Paul Bakker68884e32013-01-07 18:20:04 +0100314 const cipher_info_t *cipher_info;
315 const md_info_t *md_info;
316
Paul Bakker48916f92012-09-16 19:57:18 +0000317 ssl_session *session = ssl->session_negotiate;
318 ssl_transform *transform = ssl->transform_negotiate;
319 ssl_handshake_params *handshake = ssl->handshake;
Paul Bakker5121ce52009-01-03 21:22:43 +0000320
321 SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
322
Paul Bakker68884e32013-01-07 18:20:04 +0100323 cipher_info = cipher_info_from_type( transform->ciphersuite_info->cipher );
324 if( cipher_info == NULL )
325 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200326 SSL_DEBUG_MSG( 1, ( "cipher info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100327 transform->ciphersuite_info->cipher ) );
328 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
329 }
330
331 md_info = md_info_from_type( transform->ciphersuite_info->mac );
332 if( md_info == NULL )
333 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200334 SSL_DEBUG_MSG( 1, ( "md info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100335 transform->ciphersuite_info->mac ) );
336 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
337 }
338
Paul Bakker5121ce52009-01-03 21:22:43 +0000339 /*
Paul Bakkerca4ab492012-04-18 14:23:57 +0000340 * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
Paul Bakker1ef83d62012-04-11 12:09:53 +0000341 */
342 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000343 {
Paul Bakker48916f92012-09-16 19:57:18 +0000344 handshake->tls_prf = ssl3_prf;
345 handshake->calc_verify = ssl_calc_verify_ssl;
346 handshake->calc_finished = ssl_calc_finished_ssl;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000347 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000348 else if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000349 {
Paul Bakker48916f92012-09-16 19:57:18 +0000350 handshake->tls_prf = tls1_prf;
351 handshake->calc_verify = ssl_calc_verify_tls;
352 handshake->calc_finished = ssl_calc_finished_tls;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000353 }
Paul Bakker769075d2012-11-24 11:26:46 +0100354#if defined(POLARSSL_SHA4_C)
Paul Bakkerb7149bc2013-03-20 15:30:09 +0100355 else if( transform->ciphersuite_info->mac ==
356 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000357 {
Paul Bakker48916f92012-09-16 19:57:18 +0000358 handshake->tls_prf = tls_prf_sha384;
359 handshake->calc_verify = ssl_calc_verify_tls_sha384;
360 handshake->calc_finished = ssl_calc_finished_tls_sha384;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000361 }
Paul Bakker769075d2012-11-24 11:26:46 +0100362#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000363 else
Paul Bakkerca4ab492012-04-18 14:23:57 +0000364 {
Paul Bakker48916f92012-09-16 19:57:18 +0000365 handshake->tls_prf = tls_prf_sha256;
366 handshake->calc_verify = ssl_calc_verify_tls_sha256;
367 handshake->calc_finished = ssl_calc_finished_tls_sha256;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000368 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000369
370 /*
Paul Bakker5121ce52009-01-03 21:22:43 +0000371 * SSLv3:
372 * master =
373 * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
374 * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
375 * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
Paul Bakkerf7abd422013-04-16 13:15:56 +0200376 *
Paul Bakker5121ce52009-01-03 21:22:43 +0000377 * TLSv1:
378 * master = PRF( premaster, "master secret", randbytes )[0..47]
379 */
Paul Bakker0a597072012-09-25 21:55:46 +0000380 if( handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000381 {
Paul Bakker48916f92012-09-16 19:57:18 +0000382 SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
383 handshake->pmslen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000384
Paul Bakker48916f92012-09-16 19:57:18 +0000385 handshake->tls_prf( handshake->premaster, handshake->pmslen,
386 "master secret",
387 handshake->randbytes, 64, session->master, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000388
Paul Bakker48916f92012-09-16 19:57:18 +0000389 memset( handshake->premaster, 0, sizeof( handshake->premaster ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000390 }
391 else
392 SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
393
394 /*
395 * Swap the client and server random values.
396 */
Paul Bakker48916f92012-09-16 19:57:18 +0000397 memcpy( tmp, handshake->randbytes, 64 );
398 memcpy( handshake->randbytes, tmp + 32, 32 );
399 memcpy( handshake->randbytes + 32, tmp, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000400 memset( tmp, 0, sizeof( tmp ) );
401
402 /*
403 * SSLv3:
404 * key block =
405 * MD5( master + SHA1( 'A' + master + randbytes ) ) +
406 * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
407 * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
408 * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
409 * ...
410 *
411 * TLSv1:
412 * key block = PRF( master, "key expansion", randbytes )
413 */
Paul Bakker48916f92012-09-16 19:57:18 +0000414 handshake->tls_prf( session->master, 48, "key expansion",
415 handshake->randbytes, 64, keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000416
Paul Bakker48916f92012-09-16 19:57:18 +0000417 SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
418 ssl_get_ciphersuite_name( session->ciphersuite ) ) );
419 SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
420 SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000421 SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
422
Paul Bakker48916f92012-09-16 19:57:18 +0000423 memset( handshake->randbytes, 0, sizeof( handshake->randbytes ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000424
425 /*
426 * Determine the appropriate key, IV and MAC length.
427 */
Paul Bakker68884e32013-01-07 18:20:04 +0100428
429 if( cipher_info->mode == POLARSSL_MODE_GCM )
Paul Bakker5121ce52009-01-03 21:22:43 +0000430 {
Paul Bakker68884e32013-01-07 18:20:04 +0100431 transform->keylen = cipher_info->key_length;
432 transform->keylen /= 8;
433 transform->minlen = 1;
434 transform->ivlen = 12;
435 transform->fixed_ivlen = 4;
436 transform->maclen = 0;
437 }
438 else
439 {
440 if( md_info->type != POLARSSL_MD_NONE )
441 {
442 md_init_ctx( &transform->md_ctx_enc, md_info );
443 md_init_ctx( &transform->md_ctx_dec, md_info );
Paul Bakker5121ce52009-01-03 21:22:43 +0000444
Paul Bakker68884e32013-01-07 18:20:04 +0100445 transform->maclen = md_get_size( md_info );
446 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000447
Paul Bakker68884e32013-01-07 18:20:04 +0100448 transform->keylen = cipher_info->key_length;
449 transform->keylen /= 8;
450 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +0000451
Paul Bakker68884e32013-01-07 18:20:04 +0100452 transform->minlen = transform->keylen;
453 if( transform->minlen < transform->maclen )
454 {
455 if( cipher_info->mode == POLARSSL_MODE_STREAM )
456 transform->minlen = transform->maclen;
457 else
458 transform->minlen += transform->keylen;
459 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000460 }
461
462 SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000463 transform->keylen, transform->minlen, transform->ivlen,
464 transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000465
466 /*
467 * Finally setup the cipher contexts, IVs and MAC secrets.
468 */
469 if( ssl->endpoint == SSL_IS_CLIENT )
470 {
Paul Bakker48916f92012-09-16 19:57:18 +0000471 key1 = keyblk + transform->maclen * 2;
472 key2 = keyblk + transform->maclen * 2 + transform->keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000473
Paul Bakker68884e32013-01-07 18:20:04 +0100474 mac_enc = keyblk;
475 mac_dec = keyblk + transform->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000476
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000477 /*
478 * This is not used in TLS v1.1.
479 */
Paul Bakker48916f92012-09-16 19:57:18 +0000480 iv_copy_len = ( transform->fixed_ivlen ) ?
481 transform->fixed_ivlen : transform->ivlen;
482 memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len );
483 memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000484 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000485 }
486 else
487 {
Paul Bakker48916f92012-09-16 19:57:18 +0000488 key1 = keyblk + transform->maclen * 2 + transform->keylen;
489 key2 = keyblk + transform->maclen * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000490
Paul Bakker68884e32013-01-07 18:20:04 +0100491 mac_enc = keyblk + transform->maclen;
492 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +0000493
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000494 /*
495 * This is not used in TLS v1.1.
496 */
Paul Bakker48916f92012-09-16 19:57:18 +0000497 iv_copy_len = ( transform->fixed_ivlen ) ?
498 transform->fixed_ivlen : transform->ivlen;
499 memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len );
500 memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000501 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000502 }
503
Paul Bakker68884e32013-01-07 18:20:04 +0100504 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
505 {
506 memcpy( transform->mac_enc, mac_enc, transform->maclen );
507 memcpy( transform->mac_dec, mac_dec, transform->maclen );
508 }
509 else
510 {
511 md_hmac_starts( &transform->md_ctx_enc, mac_enc, transform->maclen );
512 md_hmac_starts( &transform->md_ctx_dec, mac_dec, transform->maclen );
513 }
514
Paul Bakker05ef8352012-05-08 09:17:57 +0000515#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
516 if( ssl_hw_record_init != NULL)
517 {
518 int ret = 0;
519
520 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) );
521
Paul Bakker07eb38b2012-12-19 14:42:06 +0100522 if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->keylen,
523 transform->iv_enc, transform->iv_dec,
524 iv_copy_len,
Paul Bakker68884e32013-01-07 18:20:04 +0100525 mac_enc, mac_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100526 transform->maclen ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +0000527 {
528 SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret );
529 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
530 }
531 }
532#endif
533
Paul Bakker68884e32013-01-07 18:20:04 +0100534 switch( cipher_info->type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000535 {
Paul Bakker40e46942009-01-03 21:51:57 +0000536#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100537 case POLARSSL_CIPHER_ARC4_128:
Paul Bakker48916f92012-09-16 19:57:18 +0000538 arc4_setup( (arc4_context *) transform->ctx_enc, key1,
539 transform->keylen );
540 arc4_setup( (arc4_context *) transform->ctx_dec, key2,
541 transform->keylen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000542 break;
543#endif
544
Paul Bakker40e46942009-01-03 21:51:57 +0000545#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100546 case POLARSSL_CIPHER_DES_EDE3_CBC:
547 des3_set3key_enc( (des3_context *) transform->ctx_enc, key1 );
548 des3_set3key_dec( (des3_context *) transform->ctx_dec, key2 );
549 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000550#endif
551
Paul Bakker40e46942009-01-03 21:51:57 +0000552#if defined(POLARSSL_AES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100553 case POLARSSL_CIPHER_AES_128_CBC:
554 case POLARSSL_CIPHER_AES_256_CBC:
555 aes_setkey_enc( (aes_context*) transform->ctx_enc, key1,
556 cipher_info->key_length );
557 aes_setkey_dec( (aes_context*) transform->ctx_dec, key2,
558 cipher_info->key_length );
Paul Bakker5121ce52009-01-03 21:22:43 +0000559 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000560#endif
561
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000562#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100563 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
564 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
565 camellia_setkey_enc( (camellia_context*) transform->ctx_enc, key1,
566 cipher_info->key_length );
567 camellia_setkey_dec( (camellia_context*) transform->ctx_dec, key2,
568 cipher_info->key_length );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000569 break;
570#endif
571
Paul Bakkerfab5c822012-02-06 16:45:10 +0000572#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100573 case POLARSSL_CIPHER_DES_CBC:
Paul Bakker48916f92012-09-16 19:57:18 +0000574 des_setkey_enc( (des_context *) transform->ctx_enc, key1 );
575 des_setkey_dec( (des_context *) transform->ctx_dec, key2 );
Paul Bakkerfab5c822012-02-06 16:45:10 +0000576 break;
577#endif
Paul Bakker68884e32013-01-07 18:20:04 +0100578
579#if defined(POLARSSL_GCM_C)
580 case POLARSSL_CIPHER_AES_128_GCM:
581 case POLARSSL_CIPHER_AES_256_GCM:
582 gcm_init( (gcm_context *) transform->ctx_enc, key1,
583 cipher_info->key_length );
584 gcm_init( (gcm_context *) transform->ctx_dec, key2,
585 cipher_info->key_length );
586 break;
587#endif
588
589 case POLARSSL_CIPHER_NULL:
590 break;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000591
Paul Bakker5121ce52009-01-03 21:22:43 +0000592 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000593 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000594 }
595
596 memset( keyblk, 0, sizeof( keyblk ) );
597
Paul Bakker2770fbd2012-07-03 13:30:23 +0000598#if defined(POLARSSL_ZLIB_SUPPORT)
599 // Initialize compression
600 //
Paul Bakker48916f92012-09-16 19:57:18 +0000601 if( session->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000602 {
603 SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
604
Paul Bakker48916f92012-09-16 19:57:18 +0000605 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
606 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000607
Paul Bakker48916f92012-09-16 19:57:18 +0000608 if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK ||
609 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000610 {
611 SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
612 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
613 }
614 }
615#endif /* POLARSSL_ZLIB_SUPPORT */
616
Paul Bakker5121ce52009-01-03 21:22:43 +0000617 SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
618
619 return( 0 );
620}
621
Paul Bakker380da532012-04-18 16:10:25 +0000622void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000623{
624 md5_context md5;
625 sha1_context sha1;
626 unsigned char pad_1[48];
627 unsigned char pad_2[48];
628
Paul Bakker380da532012-04-18 16:10:25 +0000629 SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000630
Paul Bakker48916f92012-09-16 19:57:18 +0000631 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
632 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000633
Paul Bakker380da532012-04-18 16:10:25 +0000634 memset( pad_1, 0x36, 48 );
635 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000636
Paul Bakker48916f92012-09-16 19:57:18 +0000637 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000638 md5_update( &md5, pad_1, 48 );
639 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000640
Paul Bakker380da532012-04-18 16:10:25 +0000641 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +0000642 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000643 md5_update( &md5, pad_2, 48 );
644 md5_update( &md5, hash, 16 );
645 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000646
Paul Bakker48916f92012-09-16 19:57:18 +0000647 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000648 sha1_update( &sha1, pad_1, 40 );
649 sha1_finish( &sha1, hash + 16 );
650
651 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +0000652 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000653 sha1_update( &sha1, pad_2, 40 );
654 sha1_update( &sha1, hash + 16, 20 );
655 sha1_finish( &sha1, hash + 16 );
656
657 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
658 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
659
660 return;
661}
662
663void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] )
664{
665 md5_context md5;
666 sha1_context sha1;
667
668 SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
669
Paul Bakker48916f92012-09-16 19:57:18 +0000670 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
671 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000672
Paul Bakker48916f92012-09-16 19:57:18 +0000673 md5_finish( &md5, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000674 sha1_finish( &sha1, hash + 16 );
675
676 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
677 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
678
679 return;
680}
681
682void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] )
683{
684 sha2_context sha2;
685
686 SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
687
Paul Bakker48916f92012-09-16 19:57:18 +0000688 memcpy( &sha2, &ssl->handshake->fin_sha2, sizeof(sha2_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000689 sha2_finish( &sha2, hash );
690
691 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
692 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
693
694 return;
695}
696
Paul Bakker769075d2012-11-24 11:26:46 +0100697#if defined(POLARSSL_SHA4_C)
Paul Bakker380da532012-04-18 16:10:25 +0000698void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] )
699{
700 sha4_context sha4;
701
702 SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
703
Paul Bakker48916f92012-09-16 19:57:18 +0000704 memcpy( &sha4, &ssl->handshake->fin_sha4, sizeof(sha4_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000705 sha4_finish( &sha4, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000706
Paul Bakkerca4ab492012-04-18 14:23:57 +0000707 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000708 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
709
710 return;
711}
Paul Bakker769075d2012-11-24 11:26:46 +0100712#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000713
714/*
715 * SSLv3.0 MAC functions
716 */
Paul Bakker68884e32013-01-07 18:20:04 +0100717static void ssl_mac( md_context_t *md_ctx, unsigned char *secret,
718 unsigned char *buf, size_t len,
719 unsigned char *ctr, int type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000720{
721 unsigned char header[11];
722 unsigned char padding[48];
Paul Bakker68884e32013-01-07 18:20:04 +0100723 int padlen = 0;
724 int md_size = md_get_size( md_ctx->md_info );
725 int md_type = md_get_type( md_ctx->md_info );
726
727 if( md_type == POLARSSL_MD_MD5 )
728 padlen = 48;
729 else if( md_type == POLARSSL_MD_SHA1 )
730 padlen = 40;
731 else if( md_type == POLARSSL_MD_SHA256 )
732 padlen = 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000733
734 memcpy( header, ctr, 8 );
735 header[ 8] = (unsigned char) type;
736 header[ 9] = (unsigned char)( len >> 8 );
737 header[10] = (unsigned char)( len );
738
Paul Bakker68884e32013-01-07 18:20:04 +0100739 memset( padding, 0x36, padlen );
740 md_starts( md_ctx );
741 md_update( md_ctx, secret, md_size );
742 md_update( md_ctx, padding, padlen );
743 md_update( md_ctx, header, 11 );
744 md_update( md_ctx, buf, len );
745 md_finish( md_ctx, buf + len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000746
Paul Bakker68884e32013-01-07 18:20:04 +0100747 memset( padding, 0x5C, padlen );
748 md_starts( md_ctx );
749 md_update( md_ctx, secret, md_size );
750 md_update( md_ctx, padding, padlen );
751 md_update( md_ctx, buf + len, md_size );
752 md_finish( md_ctx, buf + len );
Paul Bakker5f70b252012-09-13 14:23:06 +0000753}
754
Paul Bakker5121ce52009-01-03 21:22:43 +0000755/*
756 * Encryption/decryption functions
Paul Bakkerf7abd422013-04-16 13:15:56 +0200757 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000758static int ssl_encrypt_buf( ssl_context *ssl )
759{
Paul Bakker23986e52011-04-24 08:57:21 +0000760 size_t i, padlen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000761
762 SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
763
764 /*
765 * Add MAC then encrypt
766 */
767 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
768 {
Paul Bakker68884e32013-01-07 18:20:04 +0100769 ssl_mac( &ssl->transform_out->md_ctx_enc,
770 ssl->transform_out->mac_enc,
771 ssl->out_msg, ssl->out_msglen,
772 ssl->out_ctr, ssl->out_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +0000773 }
774 else
775 {
Paul Bakker68884e32013-01-07 18:20:04 +0100776 md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 13 );
777 md_hmac_update( &ssl->transform_out->md_ctx_enc,
778 ssl->out_msg, ssl->out_msglen );
779 md_hmac_finish( &ssl->transform_out->md_ctx_enc,
780 ssl->out_msg + ssl->out_msglen );
781 md_hmac_reset( &ssl->transform_out->md_ctx_enc );
Paul Bakker5121ce52009-01-03 21:22:43 +0000782 }
783
784 SSL_DEBUG_BUF( 4, "computed mac",
Paul Bakker48916f92012-09-16 19:57:18 +0000785 ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000786
Paul Bakker48916f92012-09-16 19:57:18 +0000787 ssl->out_msglen += ssl->transform_out->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000788
Paul Bakker68884e32013-01-07 18:20:04 +0100789#if defined(POLARSSL_CIPHER_NULL_CIPHER)
790 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
791 {
792 padlen = 0;
793 }
794 else
795#endif /* POLARSSL_CIPHER_NULL_CIPHER */
796#if defined(POLARSSL_ARC4_C)
797 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000798 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000799 padlen = 0;
800
801 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
802 "including %d bytes of padding",
803 ssl->out_msglen, 0 ) );
804
805 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
806 ssl->out_msg, ssl->out_msglen );
807
Paul Bakker68884e32013-01-07 18:20:04 +0100808 arc4_crypt( (arc4_context *) ssl->transform_out->ctx_enc,
809 ssl->out_msglen, ssl->out_msg,
810 ssl->out_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +0000811 }
Paul Bakker68884e32013-01-07 18:20:04 +0100812 else
813#endif /* POLARSSL_ARC4_C */
814#if defined(POLARSSL_GCM_C)
815 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
816 ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000817 {
818 size_t enc_msglen;
819 unsigned char *enc_msg;
820 unsigned char add_data[13];
821 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
822
823 padlen = 0;
824 enc_msglen = ssl->out_msglen;
825
826 memcpy( add_data, ssl->out_ctr, 8 );
827 add_data[8] = ssl->out_msgtype;
828 add_data[9] = ssl->major_ver;
829 add_data[10] = ssl->minor_ver;
830 add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
831 add_data[12] = ssl->out_msglen & 0xFF;
832
833 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
834 add_data, 13 );
835
Paul Bakker68884e32013-01-07 18:20:04 +0100836 /*
837 * Generate IV
838 */
839 ret = ssl->f_rng( ssl->p_rng,
Paul Bakker48916f92012-09-16 19:57:18 +0000840 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
Paul Bakker68884e32013-01-07 18:20:04 +0100841 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
842 if( ret != 0 )
843 return( ret );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000844
Paul Bakker68884e32013-01-07 18:20:04 +0100845 memcpy( ssl->out_iv,
846 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
847 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000848
Paul Bakker68884e32013-01-07 18:20:04 +0100849 /*
850 * Fix pointer positions and message length with added IV
851 */
852 enc_msg = ssl->out_msg;
853 enc_msglen = ssl->out_msglen;
854 ssl->out_msglen += ssl->transform_out->ivlen -
855 ssl->transform_out->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000856
Paul Bakker68884e32013-01-07 18:20:04 +0100857 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
858 "including %d bytes of padding",
859 ssl->out_msglen, 0 ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000860
Paul Bakker68884e32013-01-07 18:20:04 +0100861 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
862 ssl->out_msg, ssl->out_msglen );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000863
Paul Bakker68884e32013-01-07 18:20:04 +0100864 /*
865 * Adjust for tag
866 */
867 ssl->out_msglen += 16;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000868
Paul Bakker68884e32013-01-07 18:20:04 +0100869 gcm_crypt_and_tag( (gcm_context *) ssl->transform_out->ctx_enc,
870 GCM_ENCRYPT, enc_msglen,
871 ssl->transform_out->iv_enc, ssl->transform_out->ivlen,
872 add_data, 13,
873 enc_msg, enc_msg,
874 16, enc_msg + enc_msglen );
875
876 SSL_DEBUG_BUF( 4, "after encrypt: tag",
877 enc_msg + enc_msglen, 16 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000878 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000879 else
Paul Bakker68884e32013-01-07 18:20:04 +0100880#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +0000881 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000882 unsigned char *enc_msg;
Paul Bakker23986e52011-04-24 08:57:21 +0000883 size_t enc_msglen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000884
Paul Bakker48916f92012-09-16 19:57:18 +0000885 padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
886 ssl->transform_out->ivlen;
887 if( padlen == ssl->transform_out->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000888 padlen = 0;
889
890 for( i = 0; i <= padlen; i++ )
891 ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
892
893 ssl->out_msglen += padlen + 1;
894
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000895 enc_msglen = ssl->out_msglen;
896 enc_msg = ssl->out_msg;
897
898 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +0000899 * Prepend per-record IV for block cipher in TLS v1.1 and up as per
900 * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000901 */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000902 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000903 {
904 /*
905 * Generate IV
906 */
Paul Bakker48916f92012-09-16 19:57:18 +0000907 int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc,
908 ssl->transform_out->ivlen );
Paul Bakkera3d195c2011-11-27 21:07:34 +0000909 if( ret != 0 )
910 return( ret );
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000911
Paul Bakker92be97b2013-01-02 17:30:03 +0100912 memcpy( ssl->out_iv, ssl->transform_out->iv_enc,
Paul Bakker48916f92012-09-16 19:57:18 +0000913 ssl->transform_out->ivlen );
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000914
915 /*
916 * Fix pointer positions and message length with added IV
917 */
Paul Bakker92be97b2013-01-02 17:30:03 +0100918 enc_msg = ssl->out_msg;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000919 enc_msglen = ssl->out_msglen;
Paul Bakker48916f92012-09-16 19:57:18 +0000920 ssl->out_msglen += ssl->transform_out->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000921 }
922
Paul Bakker5121ce52009-01-03 21:22:43 +0000923 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000924 "including %d bytes of IV and %d bytes of padding",
Paul Bakker48916f92012-09-16 19:57:18 +0000925 ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000926
927 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
Paul Bakker92be97b2013-01-02 17:30:03 +0100928 ssl->out_iv, ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000929
Paul Bakker68884e32013-01-07 18:20:04 +0100930 switch( ssl->transform_out->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +0000931 {
Paul Bakker68884e32013-01-07 18:20:04 +0100932 case POLARSSL_CIPHER_DES_CBC:
933 des_crypt_cbc( (des_context *) ssl->transform_out->ctx_enc,
934 DES_ENCRYPT, enc_msglen,
935 ssl->transform_out->iv_enc, enc_msg, enc_msg );
936 break;
937
938 case POLARSSL_CIPHER_DES_EDE3_CBC:
939 des3_crypt_cbc( (des3_context *) ssl->transform_out->ctx_enc,
940 DES_ENCRYPT, enc_msglen,
941 ssl->transform_out->iv_enc, enc_msg, enc_msg );
942 break;
943
944 case POLARSSL_CIPHER_AES_128_CBC:
945 case POLARSSL_CIPHER_AES_256_CBC:
946 aes_crypt_cbc( (aes_context *) ssl->transform_out->ctx_enc,
947 AES_ENCRYPT, enc_msglen,
948 ssl->transform_out->iv_enc, enc_msg, enc_msg );
949 break;
950
951 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
952 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
953 camellia_crypt_cbc( (camellia_context *) ssl->transform_out->ctx_enc,
954 CAMELLIA_ENCRYPT, enc_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +0000955 ssl->transform_out->iv_enc, enc_msg, enc_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +0000956 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000957
958 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000959 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000960 }
961 }
962
Paul Bakkerca4ab492012-04-18 14:23:57 +0000963 for( i = 8; i > 0; i-- )
964 if( ++ssl->out_ctr[i - 1] != 0 )
965 break;
966
Paul Bakker5121ce52009-01-03 21:22:43 +0000967 SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
968
969 return( 0 );
970}
971
Paul Bakkerb7149bc2013-03-20 15:30:09 +0100972#define POLARSSL_SSL_MAX_MAC_SIZE 48
Paul Bakkerfab5c822012-02-06 16:45:10 +0000973
Paul Bakker5121ce52009-01-03 21:22:43 +0000974static int ssl_decrypt_buf( ssl_context *ssl )
975{
Paul Bakker45829992013-01-03 14:52:21 +0100976 size_t i, padlen = 0, correct = 1;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000977 unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
Paul Bakker5121ce52009-01-03 21:22:43 +0000978
979 SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
980
Paul Bakker48916f92012-09-16 19:57:18 +0000981 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000982 {
983 SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
Paul Bakker48916f92012-09-16 19:57:18 +0000984 ssl->in_msglen, ssl->transform_in->minlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000985 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +0000986 }
987
Paul Bakker68884e32013-01-07 18:20:04 +0100988#if defined(POLARSSL_CIPHER_NULL_CIPHER)
989 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +0000990 {
Paul Bakker68884e32013-01-07 18:20:04 +0100991 padlen = 0;
992 }
993 else
994#endif /* POLARSSL_CIPHER_NULL_CIPHER */
Paul Bakker40e46942009-01-03 21:51:57 +0000995#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100996 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
997 {
998 padlen = 0;
999
1000 arc4_crypt( (arc4_context *) ssl->transform_in->ctx_dec,
Paul Bakkerbaad6502010-03-21 15:42:15 +00001001 ssl->in_msglen, ssl->in_msg,
1002 ssl->in_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001003 }
Paul Bakker68884e32013-01-07 18:20:04 +01001004 else
1005#endif /* POLARSSL_ARC4_C */
1006#if defined(POLARSSL_GCM_C)
1007 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
1008 ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001009 {
1010 unsigned char *dec_msg;
1011 unsigned char *dec_msg_result;
1012 size_t dec_msglen;
1013 unsigned char add_data[13];
1014 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1015
Paul Bakker68884e32013-01-07 18:20:04 +01001016 padlen = 0;
1017
1018 dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
1019 ssl->transform_in->fixed_ivlen );
1020 dec_msglen -= 16;
1021 dec_msg = ssl->in_msg;
1022 dec_msg_result = ssl->in_msg;
1023 ssl->in_msglen = dec_msglen;
1024
1025 memcpy( add_data, ssl->in_ctr, 8 );
1026 add_data[8] = ssl->in_msgtype;
1027 add_data[9] = ssl->major_ver;
1028 add_data[10] = ssl->minor_ver;
1029 add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
1030 add_data[12] = ssl->in_msglen & 0xFF;
1031
1032 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1033 add_data, 13 );
1034
1035 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
1036 ssl->in_iv,
1037 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
1038
1039 SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
1040 ssl->transform_in->ivlen );
1041 SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
1042
1043 ret = gcm_auth_decrypt( (gcm_context *) ssl->transform_in->ctx_dec,
1044 dec_msglen,
1045 ssl->transform_in->iv_dec,
1046 ssl->transform_in->ivlen,
1047 add_data, 13,
1048 dec_msg + dec_msglen, 16,
1049 dec_msg, dec_msg_result );
1050
1051 if( ret != 0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001052 {
Paul Bakker68884e32013-01-07 18:20:04 +01001053 SSL_DEBUG_MSG( 1, ( "AEAD decrypt failed on validation (ret = -0x%02x)",
1054 -ret ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001055
Paul Bakker68884e32013-01-07 18:20:04 +01001056 return( POLARSSL_ERR_SSL_INVALID_MAC );
1057 }
Paul Bakkerca4ab492012-04-18 14:23:57 +00001058 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001059 else
Paul Bakker68884e32013-01-07 18:20:04 +01001060#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001061 {
Paul Bakker45829992013-01-03 14:52:21 +01001062 /*
1063 * Decrypt and check the padding
1064 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001065 unsigned char *dec_msg;
1066 unsigned char *dec_msg_result;
Paul Bakker23986e52011-04-24 08:57:21 +00001067 size_t dec_msglen;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001068 size_t minlen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001069
Paul Bakker5121ce52009-01-03 21:22:43 +00001070 /*
Paul Bakker45829992013-01-03 14:52:21 +01001071 * Check immediate ciphertext sanity
Paul Bakker5121ce52009-01-03 21:22:43 +00001072 */
Paul Bakker48916f92012-09-16 19:57:18 +00001073 if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001074 {
1075 SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
Paul Bakker48916f92012-09-16 19:57:18 +00001076 ssl->in_msglen, ssl->transform_in->ivlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001077 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001078 }
1079
Paul Bakker45829992013-01-03 14:52:21 +01001080 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
1081 minlen += ssl->transform_in->ivlen;
1082
1083 if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
1084 ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
1085 {
1086 SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
1087 ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) );
1088 return( POLARSSL_ERR_SSL_INVALID_MAC );
1089 }
1090
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001091 dec_msglen = ssl->in_msglen;
1092 dec_msg = ssl->in_msg;
1093 dec_msg_result = ssl->in_msg;
1094
1095 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001096 * Initialize for prepended IV for block cipher in TLS v1.1 and up
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001097 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001098 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001099 {
Paul Bakker48916f92012-09-16 19:57:18 +00001100 dec_msglen -= ssl->transform_in->ivlen;
1101 ssl->in_msglen -= ssl->transform_in->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001102
Paul Bakker48916f92012-09-16 19:57:18 +00001103 for( i = 0; i < ssl->transform_in->ivlen; i++ )
Paul Bakker92be97b2013-01-02 17:30:03 +01001104 ssl->transform_in->iv_dec[i] = ssl->in_iv[i];
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001105 }
1106
Paul Bakker68884e32013-01-07 18:20:04 +01001107 switch( ssl->transform_in->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +00001108 {
Paul Bakker68884e32013-01-07 18:20:04 +01001109 case POLARSSL_CIPHER_DES_CBC:
1110 des_crypt_cbc( (des_context *) ssl->transform_in->ctx_dec,
1111 DES_DECRYPT, dec_msglen,
1112 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
Paul Bakker5121ce52009-01-03 21:22:43 +00001113 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001114
Paul Bakker68884e32013-01-07 18:20:04 +01001115 case POLARSSL_CIPHER_DES_EDE3_CBC:
1116 des3_crypt_cbc( (des3_context *) ssl->transform_in->ctx_dec,
1117 DES_DECRYPT, dec_msglen,
1118 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1119 break;
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001120
Paul Bakker68884e32013-01-07 18:20:04 +01001121 case POLARSSL_CIPHER_AES_128_CBC:
1122 case POLARSSL_CIPHER_AES_256_CBC:
1123 aes_crypt_cbc( (aes_context *) ssl->transform_in->ctx_dec,
1124 AES_DECRYPT, dec_msglen,
1125 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1126 break;
1127
1128 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
1129 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
1130 camellia_crypt_cbc( (camellia_context *) ssl->transform_in->ctx_dec,
1131 CAMELLIA_DECRYPT, dec_msglen,
1132 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1133 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001134
1135 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001136 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001137 }
1138
1139 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
Paul Bakker45829992013-01-03 14:52:21 +01001140
1141 if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
1142 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001143#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001144 SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
1145 ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001146#endif
Paul Bakker45829992013-01-03 14:52:21 +01001147 padlen = 0;
Paul Bakker45829992013-01-03 14:52:21 +01001148 correct = 0;
1149 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001150
1151 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1152 {
Paul Bakker48916f92012-09-16 19:57:18 +00001153 if( padlen > ssl->transform_in->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001154 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001155#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001156 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
1157 "should be no more than %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001158 padlen, ssl->transform_in->ivlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001159#endif
Paul Bakker45829992013-01-03 14:52:21 +01001160 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001161 }
1162 }
1163 else
1164 {
1165 /*
Paul Bakker45829992013-01-03 14:52:21 +01001166 * TLSv1+: always check the padding up to the first failure
1167 * and fake check up to 256 bytes of padding
Paul Bakker5121ce52009-01-03 21:22:43 +00001168 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001169 size_t pad_count = 0, fake_pad_count = 0;
1170 size_t padding_idx = ssl->in_msglen - padlen - 1;
1171
Paul Bakker5121ce52009-01-03 21:22:43 +00001172 for( i = 1; i <= padlen; i++ )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001173 pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1174
1175 for( ; i <= 256; i++ )
1176 fake_pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1177
1178 correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
1179 correct &= ( pad_count + fake_pad_count < 512 ); /* Always 1 */
1180
Paul Bakkerd66f0702013-01-31 16:57:45 +01001181#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001182 if( padlen > 0 && correct == 0)
1183 SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001184#endif
Paul Bakkere47b34b2013-02-27 14:48:00 +01001185 padlen &= correct * 0x1FF;
Paul Bakker5121ce52009-01-03 21:22:43 +00001186 }
1187 }
1188
1189 SSL_DEBUG_BUF( 4, "raw buffer after decryption",
1190 ssl->in_msg, ssl->in_msglen );
1191
1192 /*
1193 * Always compute the MAC (RFC4346, CBCTIME).
1194 */
Paul Bakker48916f92012-09-16 19:57:18 +00001195 ssl->in_msglen -= ( ssl->transform_in->maclen + padlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001196
1197 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1198 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1199
Paul Bakker45829992013-01-03 14:52:21 +01001200 memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001201
1202 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1203 {
Paul Bakker68884e32013-01-07 18:20:04 +01001204 ssl_mac( &ssl->transform_in->md_ctx_dec,
1205 ssl->transform_in->mac_dec,
1206 ssl->in_msg, ssl->in_msglen,
1207 ssl->in_ctr, ssl->in_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +00001208 }
1209 else
1210 {
Paul Bakker45829992013-01-03 14:52:21 +01001211 /*
1212 * Process MAC and always update for padlen afterwards to make
1213 * total time independent of padlen
Paul Bakkere47b34b2013-02-27 14:48:00 +01001214 *
1215 * extra_run compensates MAC check for padlen
1216 *
1217 * Known timing attacks:
1218 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
1219 *
1220 * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
1221 * correctly. (We round down instead of up, so -56 is the correct
1222 * value for our calculations instead of -55)
Paul Bakker45829992013-01-03 14:52:21 +01001223 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001224 int j, extra_run = 0;
1225 extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
1226 ( 13 + ssl->in_msglen + 8 ) / 64;
1227
1228 extra_run &= correct * 0xFF;
1229
Paul Bakker68884e32013-01-07 18:20:04 +01001230 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 13 );
1231 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,
1232 ssl->in_msglen );
1233 md_hmac_finish( &ssl->transform_in->md_ctx_dec,
1234 ssl->in_msg + ssl->in_msglen );
1235 for( j = 0; j < extra_run; j++ )
1236 md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001237
Paul Bakker68884e32013-01-07 18:20:04 +01001238 md_hmac_reset( &ssl->transform_in->md_ctx_dec );
Paul Bakker5121ce52009-01-03 21:22:43 +00001239 }
1240
Paul Bakker48916f92012-09-16 19:57:18 +00001241 SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001242 SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001243 ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001244
1245 if( memcmp( tmp, ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001246 ssl->transform_in->maclen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001247 {
Paul Bakkere47b34b2013-02-27 14:48:00 +01001248#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001249 SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001250#endif
Paul Bakker45829992013-01-03 14:52:21 +01001251 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001252 }
1253
1254 /*
Paul Bakker45829992013-01-03 14:52:21 +01001255 * Finally check the correct flag
Paul Bakker5121ce52009-01-03 21:22:43 +00001256 */
Paul Bakker45829992013-01-03 14:52:21 +01001257 if( correct == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +00001258 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001259
1260 if( ssl->in_msglen == 0 )
1261 {
1262 ssl->nb_zero++;
1263
1264 /*
1265 * Three or more empty messages may be a DoS attack
1266 * (excessive CPU consumption).
1267 */
1268 if( ssl->nb_zero > 3 )
1269 {
1270 SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
1271 "messages, possible DoS attack" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001272 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001273 }
1274 }
1275 else
1276 ssl->nb_zero = 0;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001277
Paul Bakker23986e52011-04-24 08:57:21 +00001278 for( i = 8; i > 0; i-- )
1279 if( ++ssl->in_ctr[i - 1] != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001280 break;
1281
1282 SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
1283
1284 return( 0 );
1285}
1286
Paul Bakker2770fbd2012-07-03 13:30:23 +00001287#if defined(POLARSSL_ZLIB_SUPPORT)
1288/*
1289 * Compression/decompression functions
1290 */
1291static int ssl_compress_buf( ssl_context *ssl )
1292{
1293 int ret;
1294 unsigned char *msg_post = ssl->out_msg;
1295 size_t len_pre = ssl->out_msglen;
1296 unsigned char *msg_pre;
1297
1298 SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
1299
1300 msg_pre = (unsigned char*) malloc( len_pre );
1301 if( msg_pre == NULL )
1302 {
1303 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1304 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1305 }
1306
1307 memcpy( msg_pre, ssl->out_msg, len_pre );
1308
1309 SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
1310 ssl->out_msglen ) );
1311
1312 SSL_DEBUG_BUF( 4, "before compression: output payload",
1313 ssl->out_msg, ssl->out_msglen );
1314
Paul Bakker48916f92012-09-16 19:57:18 +00001315 ssl->transform_out->ctx_deflate.next_in = msg_pre;
1316 ssl->transform_out->ctx_deflate.avail_in = len_pre;
1317 ssl->transform_out->ctx_deflate.next_out = msg_post;
1318 ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001319
Paul Bakker48916f92012-09-16 19:57:18 +00001320 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001321 if( ret != Z_OK )
1322 {
1323 SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
1324 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1325 }
1326
Paul Bakker48916f92012-09-16 19:57:18 +00001327 ssl->out_msglen = SSL_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001328
1329 free( msg_pre );
1330
1331 SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
1332 ssl->out_msglen ) );
1333
1334 SSL_DEBUG_BUF( 4, "after compression: output payload",
1335 ssl->out_msg, ssl->out_msglen );
1336
1337 SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
1338
1339 return( 0 );
1340}
1341
1342static int ssl_decompress_buf( ssl_context *ssl )
1343{
1344 int ret;
1345 unsigned char *msg_post = ssl->in_msg;
1346 size_t len_pre = ssl->in_msglen;
1347 unsigned char *msg_pre;
1348
1349 SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
1350
1351 msg_pre = (unsigned char*) malloc( len_pre );
1352 if( msg_pre == NULL )
1353 {
1354 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1355 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1356 }
1357
1358 memcpy( msg_pre, ssl->in_msg, len_pre );
1359
1360 SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
1361 ssl->in_msglen ) );
1362
1363 SSL_DEBUG_BUF( 4, "before decompression: input payload",
1364 ssl->in_msg, ssl->in_msglen );
1365
Paul Bakker48916f92012-09-16 19:57:18 +00001366 ssl->transform_in->ctx_inflate.next_in = msg_pre;
1367 ssl->transform_in->ctx_inflate.avail_in = len_pre;
1368 ssl->transform_in->ctx_inflate.next_out = msg_post;
1369 ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001370
Paul Bakker48916f92012-09-16 19:57:18 +00001371 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001372 if( ret != Z_OK )
1373 {
1374 SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
1375 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1376 }
1377
Paul Bakker48916f92012-09-16 19:57:18 +00001378 ssl->in_msglen = SSL_MAX_CONTENT_LEN - ssl->transform_in->ctx_inflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001379
1380 free( msg_pre );
1381
1382 SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
1383 ssl->in_msglen ) );
1384
1385 SSL_DEBUG_BUF( 4, "after decompression: input payload",
1386 ssl->in_msg, ssl->in_msglen );
1387
1388 SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
1389
1390 return( 0 );
1391}
1392#endif /* POLARSSL_ZLIB_SUPPORT */
1393
Paul Bakker5121ce52009-01-03 21:22:43 +00001394/*
1395 * Fill the input message buffer
1396 */
Paul Bakker23986e52011-04-24 08:57:21 +00001397int ssl_fetch_input( ssl_context *ssl, size_t nb_want )
Paul Bakker5121ce52009-01-03 21:22:43 +00001398{
Paul Bakker23986e52011-04-24 08:57:21 +00001399 int ret;
1400 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001401
1402 SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
1403
1404 while( ssl->in_left < nb_want )
1405 {
1406 len = nb_want - ssl->in_left;
1407 ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
1408
1409 SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
1410 ssl->in_left, nb_want ) );
1411 SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
1412
Paul Bakker831a7552011-05-18 13:32:51 +00001413 if( ret == 0 )
1414 return( POLARSSL_ERR_SSL_CONN_EOF );
1415
Paul Bakker5121ce52009-01-03 21:22:43 +00001416 if( ret < 0 )
1417 return( ret );
1418
1419 ssl->in_left += ret;
1420 }
1421
1422 SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
1423
1424 return( 0 );
1425}
1426
1427/*
1428 * Flush any data not yet written
1429 */
1430int ssl_flush_output( ssl_context *ssl )
1431{
1432 int ret;
1433 unsigned char *buf;
1434
1435 SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
1436
1437 while( ssl->out_left > 0 )
1438 {
1439 SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
1440 5 + ssl->out_msglen, ssl->out_left ) );
1441
Paul Bakker5bd42292012-12-19 14:40:42 +01001442 buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
Paul Bakker5121ce52009-01-03 21:22:43 +00001443 ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
Paul Bakker186751d2012-05-08 13:16:14 +00001444
Paul Bakker5121ce52009-01-03 21:22:43 +00001445 SSL_DEBUG_RET( 2, "ssl->f_send", ret );
1446
1447 if( ret <= 0 )
1448 return( ret );
1449
1450 ssl->out_left -= ret;
1451 }
1452
1453 SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
1454
1455 return( 0 );
1456}
1457
1458/*
1459 * Record layer functions
1460 */
1461int ssl_write_record( ssl_context *ssl )
1462{
Paul Bakker05ef8352012-05-08 09:17:57 +00001463 int ret, done = 0;
Paul Bakker23986e52011-04-24 08:57:21 +00001464 size_t len = ssl->out_msglen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001465
1466 SSL_DEBUG_MSG( 2, ( "=> write record" ) );
1467
Paul Bakker5121ce52009-01-03 21:22:43 +00001468 if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
1469 {
1470 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
1471 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
1472 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
1473
Paul Bakker48916f92012-09-16 19:57:18 +00001474 ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001475 }
1476
Paul Bakker2770fbd2012-07-03 13:30:23 +00001477#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001478 if( ssl->transform_out != NULL &&
1479 ssl->session_out->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001480 {
1481 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
1482 {
1483 SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
1484 return( ret );
1485 }
1486
1487 len = ssl->out_msglen;
1488 }
1489#endif /*POLARSSL_ZLIB_SUPPORT */
1490
Paul Bakker05ef8352012-05-08 09:17:57 +00001491#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1492 if( ssl_hw_record_write != NULL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001493 {
Paul Bakker05ef8352012-05-08 09:17:57 +00001494 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001495
Paul Bakker05ef8352012-05-08 09:17:57 +00001496 ret = ssl_hw_record_write( ssl );
1497 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1498 {
1499 SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret );
1500 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1501 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001502
1503 if( ret == 0 )
1504 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001505 }
1506#endif
1507 if( !done )
1508 {
1509 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
1510 ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
1511 ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00001512 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1513 ssl->out_hdr[4] = (unsigned char)( len );
Paul Bakker05ef8352012-05-08 09:17:57 +00001514
Paul Bakker48916f92012-09-16 19:57:18 +00001515 if( ssl->transform_out != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001516 {
1517 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
1518 {
1519 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
1520 return( ret );
1521 }
1522
1523 len = ssl->out_msglen;
1524 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1525 ssl->out_hdr[4] = (unsigned char)( len );
1526 }
1527
1528 ssl->out_left = 5 + ssl->out_msglen;
1529
1530 SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
1531 "version = [%d:%d], msglen = %d",
1532 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
1533 ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
1534
1535 SSL_DEBUG_BUF( 4, "output record sent to network",
Paul Bakker5bd42292012-12-19 14:40:42 +01001536 ssl->out_hdr, 5 + ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001537 }
1538
Paul Bakker5121ce52009-01-03 21:22:43 +00001539 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1540 {
1541 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
1542 return( ret );
1543 }
1544
1545 SSL_DEBUG_MSG( 2, ( "<= write record" ) );
1546
1547 return( 0 );
1548}
1549
1550int ssl_read_record( ssl_context *ssl )
1551{
Paul Bakker05ef8352012-05-08 09:17:57 +00001552 int ret, done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001553
1554 SSL_DEBUG_MSG( 2, ( "=> read record" ) );
1555
Paul Bakker68884e32013-01-07 18:20:04 +01001556 SSL_DEBUG_BUF( 4, "input record from network",
1557 ssl->in_hdr, 5 + ssl->in_msglen );
1558
Paul Bakker5121ce52009-01-03 21:22:43 +00001559 if( ssl->in_hslen != 0 &&
1560 ssl->in_hslen < ssl->in_msglen )
1561 {
1562 /*
1563 * Get next Handshake message in the current record
1564 */
1565 ssl->in_msglen -= ssl->in_hslen;
1566
Paul Bakker8934a982011-08-05 11:11:53 +00001567 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
Paul Bakker48916f92012-09-16 19:57:18 +00001568 ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001569
1570 ssl->in_hslen = 4;
1571 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1572
1573 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1574 " %d, type = %d, hslen = %d",
1575 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1576
1577 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1578 {
1579 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001580 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001581 }
1582
1583 if( ssl->in_msglen < ssl->in_hslen )
1584 {
1585 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001586 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001587 }
1588
Paul Bakker48916f92012-09-16 19:57:18 +00001589 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001590
1591 return( 0 );
1592 }
1593
1594 ssl->in_hslen = 0;
1595
1596 /*
1597 * Read the record header and validate it
1598 */
1599 if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
1600 {
1601 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1602 return( ret );
1603 }
1604
1605 ssl->in_msgtype = ssl->in_hdr[0];
1606 ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
1607
1608 SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
1609 "version = [%d:%d], msglen = %d",
1610 ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
1611 ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
1612
1613 if( ssl->in_hdr[1] != ssl->major_ver )
1614 {
1615 SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001616 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001617 }
1618
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001619 if( ssl->in_hdr[2] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00001620 {
1621 SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001622 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001623 }
1624
1625 /*
1626 * Make sure the message length is acceptable
1627 */
Paul Bakker48916f92012-09-16 19:57:18 +00001628 if( ssl->transform_in == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001629 {
1630 if( ssl->in_msglen < 1 ||
1631 ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1632 {
1633 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001634 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001635 }
1636 }
1637 else
1638 {
Paul Bakker48916f92012-09-16 19:57:18 +00001639 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001640 {
1641 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001642 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001643 }
1644
1645 if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001646 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN )
Paul Bakker5121ce52009-01-03 21:22:43 +00001647 {
1648 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001649 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001650 }
1651
1652 /*
1653 * TLS encrypted messages can have up to 256 bytes of padding
1654 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001655 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001656 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN + 256 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001657 {
1658 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001659 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001660 }
1661 }
1662
1663 /*
1664 * Read and optionally decrypt the message contents
1665 */
1666 if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 )
1667 {
1668 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1669 return( ret );
1670 }
1671
1672 SSL_DEBUG_BUF( 4, "input record from network",
1673 ssl->in_hdr, 5 + ssl->in_msglen );
1674
Paul Bakker05ef8352012-05-08 09:17:57 +00001675#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1676 if( ssl_hw_record_read != NULL)
1677 {
1678 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) );
1679
1680 ret = ssl_hw_record_read( ssl );
1681 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1682 {
1683 SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret );
1684 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1685 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001686
1687 if( ret == 0 )
1688 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001689 }
1690#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001691 if( !done && ssl->transform_in != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001692 {
1693 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
1694 {
Paul Bakker40865c82013-01-31 17:13:13 +01001695#if defined(POLARSSL_SSL_ALERT_MESSAGES)
1696 if( ret == POLARSSL_ERR_SSL_INVALID_MAC )
1697 {
1698 ssl_send_alert_message( ssl,
1699 SSL_ALERT_LEVEL_FATAL,
1700 SSL_ALERT_MSG_BAD_RECORD_MAC );
1701 }
1702#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001703 SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
1704 return( ret );
1705 }
1706
1707 SSL_DEBUG_BUF( 4, "input payload after decrypt",
1708 ssl->in_msg, ssl->in_msglen );
1709
1710 if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1711 {
1712 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001713 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001714 }
1715 }
1716
Paul Bakker2770fbd2012-07-03 13:30:23 +00001717#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001718 if( ssl->transform_in != NULL &&
1719 ssl->session_in->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001720 {
1721 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
1722 {
1723 SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
1724 return( ret );
1725 }
1726
1727 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1728 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1729 }
1730#endif /* POLARSSL_ZLIB_SUPPORT */
1731
Paul Bakker0a925182012-04-16 06:46:41 +00001732 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE &&
1733 ssl->in_msgtype != SSL_MSG_ALERT &&
1734 ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC &&
1735 ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
1736 {
1737 SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
1738
Paul Bakker48916f92012-09-16 19:57:18 +00001739 if( ( ret = ssl_send_alert_message( ssl,
1740 SSL_ALERT_LEVEL_FATAL,
1741 SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
Paul Bakker0a925182012-04-16 06:46:41 +00001742 {
1743 return( ret );
1744 }
1745
1746 return( POLARSSL_ERR_SSL_INVALID_RECORD );
1747 }
1748
Paul Bakker5121ce52009-01-03 21:22:43 +00001749 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
1750 {
1751 ssl->in_hslen = 4;
1752 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1753
1754 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1755 " %d, type = %d, hslen = %d",
1756 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1757
1758 /*
1759 * Additional checks to validate the handshake header
1760 */
1761 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1762 {
1763 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001764 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001765 }
1766
1767 if( ssl->in_msglen < ssl->in_hslen )
1768 {
1769 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001770 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001771 }
1772
Paul Bakker48916f92012-09-16 19:57:18 +00001773 if( ssl->state != SSL_HANDSHAKE_OVER )
1774 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001775 }
1776
1777 if( ssl->in_msgtype == SSL_MSG_ALERT )
1778 {
1779 SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
1780 ssl->in_msg[0], ssl->in_msg[1] ) );
1781
1782 /*
1783 * Ignore non-fatal alerts, except close_notify
1784 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001785 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001786 {
Paul Bakker2770fbd2012-07-03 13:30:23 +00001787 SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
1788 ssl->in_msg[1] ) );
Paul Bakker9d781402011-05-09 16:17:09 +00001789 /**
1790 * Subtract from error code as ssl->in_msg[1] is 7-bit positive
1791 * error identifier.
1792 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00001793 return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001794 }
1795
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001796 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
1797 ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00001798 {
1799 SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001800 return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001801 }
1802 }
1803
1804 ssl->in_left = 0;
1805
1806 SSL_DEBUG_MSG( 2, ( "<= read record" ) );
1807
1808 return( 0 );
1809}
1810
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001811int ssl_send_fatal_handshake_failure( ssl_context *ssl )
1812{
1813 int ret;
1814
1815 if( ( ret = ssl_send_alert_message( ssl,
1816 SSL_ALERT_LEVEL_FATAL,
1817 SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
1818 {
1819 return( ret );
1820 }
1821
1822 return( 0 );
1823}
1824
Paul Bakker0a925182012-04-16 06:46:41 +00001825int ssl_send_alert_message( ssl_context *ssl,
1826 unsigned char level,
1827 unsigned char message )
1828{
1829 int ret;
1830
1831 SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
1832
1833 ssl->out_msgtype = SSL_MSG_ALERT;
1834 ssl->out_msglen = 2;
1835 ssl->out_msg[0] = level;
1836 ssl->out_msg[1] = message;
1837
1838 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1839 {
1840 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1841 return( ret );
1842 }
1843
1844 SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
1845
1846 return( 0 );
1847}
1848
Paul Bakker5121ce52009-01-03 21:22:43 +00001849/*
1850 * Handshake functions
1851 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001852#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1853 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1854 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001855int ssl_write_certificate( ssl_context *ssl )
1856{
Paul Bakkered27a042013-04-18 22:46:23 +02001857 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001858 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001859
1860 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1861
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001862 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1863 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001864 {
1865 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1866 ssl->state++;
1867 return( 0 );
1868 }
1869
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001870 return( ret );
1871}
1872
1873int ssl_parse_certificate( ssl_context *ssl )
1874{
1875 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1876 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1877
1878 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
1879
1880 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1881 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1882 {
1883 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
1884 ssl->state++;
1885 return( 0 );
1886 }
1887
1888 return( ret );
1889}
1890#else
1891int ssl_write_certificate( ssl_context *ssl )
1892{
1893 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1894 size_t i, n;
1895 const x509_cert *crt;
1896 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1897
1898 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1899
1900 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1901 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1902 {
1903 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1904 ssl->state++;
1905 return( 0 );
1906 }
1907
Paul Bakker5121ce52009-01-03 21:22:43 +00001908 if( ssl->endpoint == SSL_IS_CLIENT )
1909 {
1910 if( ssl->client_auth == 0 )
1911 {
1912 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1913 ssl->state++;
1914 return( 0 );
1915 }
1916
1917 /*
1918 * If using SSLv3 and got no cert, send an Alert message
1919 * (otherwise an empty Certificate message will be sent).
1920 */
1921 if( ssl->own_cert == NULL &&
1922 ssl->minor_ver == SSL_MINOR_VERSION_0 )
1923 {
1924 ssl->out_msglen = 2;
1925 ssl->out_msgtype = SSL_MSG_ALERT;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001926 ssl->out_msg[0] = SSL_ALERT_LEVEL_WARNING;
1927 ssl->out_msg[1] = SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00001928
1929 SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
1930 goto write_msg;
1931 }
1932 }
1933 else /* SSL_IS_SERVER */
1934 {
1935 if( ssl->own_cert == NULL )
1936 {
1937 SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001938 return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001939 }
1940 }
1941
1942 SSL_DEBUG_CRT( 3, "own certificate", ssl->own_cert );
1943
1944 /*
1945 * 0 . 0 handshake type
1946 * 1 . 3 handshake length
1947 * 4 . 6 length of all certs
1948 * 7 . 9 length of cert. 1
1949 * 10 . n-1 peer certificate
1950 * n . n+2 length of cert. 2
1951 * n+3 . ... upper level cert, etc.
1952 */
1953 i = 7;
1954 crt = ssl->own_cert;
1955
Paul Bakker29087132010-03-21 21:03:34 +00001956 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001957 {
1958 n = crt->raw.len;
1959 if( i + 3 + n > SSL_MAX_CONTENT_LEN )
1960 {
1961 SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
1962 i + 3 + n, SSL_MAX_CONTENT_LEN ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001963 return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001964 }
1965
1966 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
1967 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
1968 ssl->out_msg[i + 2] = (unsigned char)( n );
1969
1970 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
1971 i += n; crt = crt->next;
1972 }
1973
1974 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
1975 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
1976 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
1977
1978 ssl->out_msglen = i;
1979 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1980 ssl->out_msg[0] = SSL_HS_CERTIFICATE;
1981
1982write_msg:
1983
1984 ssl->state++;
1985
1986 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1987 {
1988 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1989 return( ret );
1990 }
1991
1992 SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
1993
Paul Bakkered27a042013-04-18 22:46:23 +02001994 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001995}
1996
1997int ssl_parse_certificate( ssl_context *ssl )
1998{
Paul Bakkered27a042013-04-18 22:46:23 +02001999 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker23986e52011-04-24 08:57:21 +00002000 size_t i, n;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002001 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002002
2003 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2004
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002005 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2006 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002007 {
2008 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2009 ssl->state++;
2010 return( 0 );
2011 }
2012
Paul Bakker5121ce52009-01-03 21:22:43 +00002013 if( ssl->endpoint == SSL_IS_SERVER &&
2014 ssl->authmode == SSL_VERIFY_NONE )
2015 {
Paul Bakkercdf07e92011-01-30 17:05:13 +00002016 ssl->verify_result = BADCERT_SKIP_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00002017 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2018 ssl->state++;
2019 return( 0 );
2020 }
2021
2022 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2023 {
2024 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2025 return( ret );
2026 }
2027
2028 ssl->state++;
2029
2030 /*
2031 * Check if the client sent an empty certificate
2032 */
2033 if( ssl->endpoint == SSL_IS_SERVER &&
2034 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2035 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002036 if( ssl->in_msglen == 2 &&
2037 ssl->in_msgtype == SSL_MSG_ALERT &&
2038 ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2039 ssl->in_msg[1] == SSL_ALERT_MSG_NO_CERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002040 {
2041 SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2042
Paul Bakkercdf07e92011-01-30 17:05:13 +00002043 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002044 if( ssl->authmode == SSL_VERIFY_OPTIONAL )
2045 return( 0 );
2046 else
Paul Bakker40e46942009-01-03 21:51:57 +00002047 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002048 }
2049 }
2050
2051 if( ssl->endpoint == SSL_IS_SERVER &&
2052 ssl->minor_ver != SSL_MINOR_VERSION_0 )
2053 {
2054 if( ssl->in_hslen == 7 &&
2055 ssl->in_msgtype == SSL_MSG_HANDSHAKE &&
2056 ssl->in_msg[0] == SSL_HS_CERTIFICATE &&
2057 memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
2058 {
2059 SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2060
Paul Bakkercdf07e92011-01-30 17:05:13 +00002061 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002062 if( ssl->authmode == SSL_VERIFY_REQUIRED )
Paul Bakker40e46942009-01-03 21:51:57 +00002063 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002064 else
2065 return( 0 );
2066 }
2067 }
2068
2069 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2070 {
2071 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002072 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002073 }
2074
2075 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
2076 {
2077 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002078 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002079 }
2080
2081 /*
2082 * Same message structure as in ssl_write_certificate()
2083 */
2084 n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
2085
2086 if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
2087 {
2088 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002089 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002090 }
2091
Paul Bakker48916f92012-09-16 19:57:18 +00002092 if( ( ssl->session_negotiate->peer_cert = (x509_cert *) malloc(
Paul Bakker5121ce52009-01-03 21:22:43 +00002093 sizeof( x509_cert ) ) ) == NULL )
2094 {
2095 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
2096 sizeof( x509_cert ) ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002097 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002098 }
2099
Paul Bakker48916f92012-09-16 19:57:18 +00002100 memset( ssl->session_negotiate->peer_cert, 0, sizeof( x509_cert ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002101
2102 i = 7;
2103
2104 while( i < ssl->in_hslen )
2105 {
2106 if( ssl->in_msg[i] != 0 )
2107 {
2108 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002109 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002110 }
2111
2112 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2113 | (unsigned int) ssl->in_msg[i + 2];
2114 i += 3;
2115
2116 if( n < 128 || i + n > ssl->in_hslen )
2117 {
2118 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002119 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002120 }
2121
Paul Bakker89ecb2d2013-06-24 19:06:15 +02002122 ret = x509parse_crt_der( ssl->session_negotiate->peer_cert,
2123 ssl->in_msg + i, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002124 if( ret != 0 )
2125 {
2126 SSL_DEBUG_RET( 1, " x509parse_crt", ret );
2127 return( ret );
2128 }
2129
2130 i += n;
2131 }
2132
Paul Bakker48916f92012-09-16 19:57:18 +00002133 SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00002134
2135 if( ssl->authmode != SSL_VERIFY_NONE )
2136 {
2137 if( ssl->ca_chain == NULL )
2138 {
2139 SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002140 return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002141 }
2142
Paul Bakker48916f92012-09-16 19:57:18 +00002143 ret = x509parse_verify( ssl->session_negotiate->peer_cert,
2144 ssl->ca_chain, ssl->ca_crl,
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002145 ssl->peer_cn, &ssl->verify_result,
2146 ssl->f_vrfy, ssl->p_vrfy );
Paul Bakker5121ce52009-01-03 21:22:43 +00002147
2148 if( ret != 0 )
2149 SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2150
2151 if( ssl->authmode != SSL_VERIFY_REQUIRED )
2152 ret = 0;
2153 }
2154
2155 SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
2156
2157 return( ret );
2158}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002159#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2160 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2161 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002162
2163int ssl_write_change_cipher_spec( ssl_context *ssl )
2164{
2165 int ret;
2166
2167 SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
2168
2169 ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
2170 ssl->out_msglen = 1;
2171 ssl->out_msg[0] = 1;
2172
Paul Bakker5121ce52009-01-03 21:22:43 +00002173 ssl->state++;
2174
2175 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2176 {
2177 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2178 return( ret );
2179 }
2180
2181 SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
2182
2183 return( 0 );
2184}
2185
2186int ssl_parse_change_cipher_spec( ssl_context *ssl )
2187{
2188 int ret;
2189
2190 SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
2191
Paul Bakker5121ce52009-01-03 21:22:43 +00002192 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2193 {
2194 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2195 return( ret );
2196 }
2197
2198 if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
2199 {
2200 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002201 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002202 }
2203
2204 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
2205 {
2206 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002207 return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
Paul Bakker5121ce52009-01-03 21:22:43 +00002208 }
2209
2210 ssl->state++;
2211
2212 SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
2213
2214 return( 0 );
2215}
2216
Paul Bakker41c83d32013-03-20 14:39:14 +01002217void ssl_optimize_checksum( ssl_context *ssl,
2218 const ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00002219{
Paul Bakker769075d2012-11-24 11:26:46 +01002220#if !defined(POLARSSL_SHA4_C)
2221 ((void) ciphersuite);
2222#endif
2223
Paul Bakker380da532012-04-18 16:10:25 +00002224 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00002225 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker769075d2012-11-24 11:26:46 +01002226#if defined(POLARSSL_SHA4_C)
Paul Bakkerb7149bc2013-03-20 15:30:09 +01002227 else if( ciphersuite_info->mac == POLARSSL_MD_SHA384 )
Paul Bakker380da532012-04-18 16:10:25 +00002228 {
Paul Bakker48916f92012-09-16 19:57:18 +00002229 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
Paul Bakker380da532012-04-18 16:10:25 +00002230 }
Paul Bakker769075d2012-11-24 11:26:46 +01002231#endif
Paul Bakker380da532012-04-18 16:10:25 +00002232 else
Paul Bakker48916f92012-09-16 19:57:18 +00002233 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakker380da532012-04-18 16:10:25 +00002234}
Paul Bakkerf7abd422013-04-16 13:15:56 +02002235
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002236static void ssl_update_checksum_start( ssl_context *ssl,
2237 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002238{
Paul Bakker48916f92012-09-16 19:57:18 +00002239 md5_update( &ssl->handshake->fin_md5 , buf, len );
2240 sha1_update( &ssl->handshake->fin_sha1, buf, len );
2241 sha2_update( &ssl->handshake->fin_sha2, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002242#if defined(POLARSSL_SHA4_C)
Paul Bakker48916f92012-09-16 19:57:18 +00002243 sha4_update( &ssl->handshake->fin_sha4, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002244#endif
Paul Bakker380da532012-04-18 16:10:25 +00002245}
2246
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002247static void ssl_update_checksum_md5sha1( ssl_context *ssl,
2248 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002249{
Paul Bakker48916f92012-09-16 19:57:18 +00002250 md5_update( &ssl->handshake->fin_md5 , buf, len );
2251 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002252}
2253
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002254static void ssl_update_checksum_sha256( ssl_context *ssl,
2255 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002256{
Paul Bakker48916f92012-09-16 19:57:18 +00002257 sha2_update( &ssl->handshake->fin_sha2, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002258}
2259
Paul Bakker769075d2012-11-24 11:26:46 +01002260#if defined(POLARSSL_SHA4_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002261static void ssl_update_checksum_sha384( ssl_context *ssl,
2262 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002263{
Paul Bakker48916f92012-09-16 19:57:18 +00002264 sha4_update( &ssl->handshake->fin_sha4, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002265}
Paul Bakker769075d2012-11-24 11:26:46 +01002266#endif
Paul Bakker380da532012-04-18 16:10:25 +00002267
Paul Bakker1ef83d62012-04-11 12:09:53 +00002268static void ssl_calc_finished_ssl(
2269 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002270{
Paul Bakker3c2122f2013-06-24 19:03:14 +02002271 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002272 md5_context md5;
2273 sha1_context sha1;
2274
Paul Bakker5121ce52009-01-03 21:22:43 +00002275 unsigned char padbuf[48];
2276 unsigned char md5sum[16];
2277 unsigned char sha1sum[20];
2278
Paul Bakker48916f92012-09-16 19:57:18 +00002279 ssl_session *session = ssl->session_negotiate;
2280 if( !session )
2281 session = ssl->session;
2282
Paul Bakker1ef83d62012-04-11 12:09:53 +00002283 SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
2284
Paul Bakker48916f92012-09-16 19:57:18 +00002285 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2286 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002287
2288 /*
2289 * SSLv3:
2290 * hash =
2291 * MD5( master + pad2 +
2292 * MD5( handshake + sender + master + pad1 ) )
2293 * + SHA1( master + pad2 +
2294 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002295 */
2296
Paul Bakker90995b52013-06-24 19:20:35 +02002297#if !defined(POLARSSL_MD5_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002298 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002299 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002300#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002301
Paul Bakker90995b52013-06-24 19:20:35 +02002302#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002303 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002304 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002305#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002306
Paul Bakker3c2122f2013-06-24 19:03:14 +02002307 sender = ( from == SSL_IS_CLIENT ) ? "CLNT"
2308 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00002309
Paul Bakker1ef83d62012-04-11 12:09:53 +00002310 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002311
Paul Bakker3c2122f2013-06-24 19:03:14 +02002312 md5_update( &md5, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002313 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002314 md5_update( &md5, padbuf, 48 );
2315 md5_finish( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002316
Paul Bakker3c2122f2013-06-24 19:03:14 +02002317 sha1_update( &sha1, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002318 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002319 sha1_update( &sha1, padbuf, 40 );
2320 sha1_finish( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002321
Paul Bakker1ef83d62012-04-11 12:09:53 +00002322 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002323
Paul Bakker1ef83d62012-04-11 12:09:53 +00002324 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +00002325 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002326 md5_update( &md5, padbuf, 48 );
2327 md5_update( &md5, md5sum, 16 );
2328 md5_finish( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00002329
Paul Bakker1ef83d62012-04-11 12:09:53 +00002330 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +00002331 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002332 sha1_update( &sha1, padbuf , 40 );
2333 sha1_update( &sha1, sha1sum, 20 );
2334 sha1_finish( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002335
Paul Bakker1ef83d62012-04-11 12:09:53 +00002336 SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002337
Paul Bakker1ef83d62012-04-11 12:09:53 +00002338 memset( &md5, 0, sizeof( md5_context ) );
2339 memset( &sha1, 0, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002340
2341 memset( padbuf, 0, sizeof( padbuf ) );
2342 memset( md5sum, 0, sizeof( md5sum ) );
2343 memset( sha1sum, 0, sizeof( sha1sum ) );
2344
2345 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2346}
2347
Paul Bakker1ef83d62012-04-11 12:09:53 +00002348static void ssl_calc_finished_tls(
2349 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002350{
Paul Bakker1ef83d62012-04-11 12:09:53 +00002351 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002352 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002353 md5_context md5;
Paul Bakker5121ce52009-01-03 21:22:43 +00002354 sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002355 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00002356
Paul Bakker48916f92012-09-16 19:57:18 +00002357 ssl_session *session = ssl->session_negotiate;
2358 if( !session )
2359 session = ssl->session;
2360
Paul Bakker1ef83d62012-04-11 12:09:53 +00002361 SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002362
Paul Bakker48916f92012-09-16 19:57:18 +00002363 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2364 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002365
Paul Bakker1ef83d62012-04-11 12:09:53 +00002366 /*
2367 * TLSv1:
2368 * hash = PRF( master, finished_label,
2369 * MD5( handshake ) + SHA1( handshake ) )[0..11]
2370 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002371
Paul Bakker90995b52013-06-24 19:20:35 +02002372#if !defined(POLARSSL_MD5_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002373 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
2374 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002375#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002376
Paul Bakker90995b52013-06-24 19:20:35 +02002377#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002378 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
2379 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002380#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002381
2382 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002383 ? "client finished"
2384 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002385
2386 md5_finish( &md5, padbuf );
2387 sha1_finish( &sha1, padbuf + 16 );
2388
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002389 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002390 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002391
2392 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2393
2394 memset( &md5, 0, sizeof( md5_context ) );
2395 memset( &sha1, 0, sizeof( sha1_context ) );
2396
2397 memset( padbuf, 0, sizeof( padbuf ) );
2398
2399 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2400}
2401
Paul Bakkerca4ab492012-04-18 14:23:57 +00002402static void ssl_calc_finished_tls_sha256(
Paul Bakker1ef83d62012-04-11 12:09:53 +00002403 ssl_context *ssl, unsigned char *buf, int from )
2404{
2405 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002406 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002407 sha2_context sha2;
2408 unsigned char padbuf[32];
2409
Paul Bakker48916f92012-09-16 19:57:18 +00002410 ssl_session *session = ssl->session_negotiate;
2411 if( !session )
2412 session = ssl->session;
2413
Paul Bakker380da532012-04-18 16:10:25 +00002414 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002415
Paul Bakker48916f92012-09-16 19:57:18 +00002416 memcpy( &sha2, &ssl->handshake->fin_sha2, sizeof(sha2_context) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002417
2418 /*
2419 * TLSv1.2:
2420 * hash = PRF( master, finished_label,
2421 * Hash( handshake ) )[0.11]
2422 */
2423
Paul Bakker90995b52013-06-24 19:20:35 +02002424#if !defined(POLARSSL_SHA2_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002425 SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
2426 sha2.state, sizeof( sha2.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002427#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002428
2429 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002430 ? "client finished"
2431 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002432
2433 sha2_finish( &sha2, padbuf );
2434
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002435 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002436 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002437
2438 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2439
2440 memset( &sha2, 0, sizeof( sha2_context ) );
2441
2442 memset( padbuf, 0, sizeof( padbuf ) );
2443
2444 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2445}
2446
Paul Bakker769075d2012-11-24 11:26:46 +01002447#if defined(POLARSSL_SHA4_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002448static void ssl_calc_finished_tls_sha384(
2449 ssl_context *ssl, unsigned char *buf, int from )
2450{
2451 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002452 const char *sender;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002453 sha4_context sha4;
2454 unsigned char padbuf[48];
2455
Paul Bakker48916f92012-09-16 19:57:18 +00002456 ssl_session *session = ssl->session_negotiate;
2457 if( !session )
2458 session = ssl->session;
2459
Paul Bakker380da532012-04-18 16:10:25 +00002460 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002461
Paul Bakker48916f92012-09-16 19:57:18 +00002462 memcpy( &sha4, &ssl->handshake->fin_sha4, sizeof(sha4_context) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002463
2464 /*
2465 * TLSv1.2:
2466 * hash = PRF( master, finished_label,
2467 * Hash( handshake ) )[0.11]
2468 */
2469
Paul Bakker90995b52013-06-24 19:20:35 +02002470#if !defined(POLARSSL_SHA4_ALT)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002471 SSL_DEBUG_BUF( 4, "finished sha4 state", (unsigned char *)
2472 sha4.state, sizeof( sha4.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002473#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002474
2475 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002476 ? "client finished"
2477 : "server finished";
Paul Bakkerca4ab492012-04-18 14:23:57 +00002478
2479 sha4_finish( &sha4, padbuf );
2480
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002481 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002482 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002483
2484 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2485
2486 memset( &sha4, 0, sizeof( sha4_context ) );
2487
2488 memset( padbuf, 0, sizeof( padbuf ) );
2489
2490 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2491}
Paul Bakker769075d2012-11-24 11:26:46 +01002492#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002493
Paul Bakker48916f92012-09-16 19:57:18 +00002494void ssl_handshake_wrapup( ssl_context *ssl )
2495{
2496 SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
2497
2498 /*
2499 * Free our handshake params
2500 */
2501 ssl_handshake_free( ssl->handshake );
2502 free( ssl->handshake );
2503 ssl->handshake = NULL;
2504
2505 /*
2506 * Switch in our now active transform context
2507 */
2508 if( ssl->transform )
2509 {
2510 ssl_transform_free( ssl->transform );
2511 free( ssl->transform );
2512 }
2513 ssl->transform = ssl->transform_negotiate;
2514 ssl->transform_negotiate = NULL;
2515
Paul Bakker0a597072012-09-25 21:55:46 +00002516 if( ssl->session )
2517 {
2518 ssl_session_free( ssl->session );
2519 free( ssl->session );
2520 }
2521 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00002522 ssl->session_negotiate = NULL;
2523
Paul Bakker0a597072012-09-25 21:55:46 +00002524 /*
2525 * Add cache entry
2526 */
2527 if( ssl->f_set_cache != NULL )
2528 if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 )
2529 SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
2530
Paul Bakker48916f92012-09-16 19:57:18 +00002531 ssl->state++;
2532
2533 SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
2534}
2535
Paul Bakker1ef83d62012-04-11 12:09:53 +00002536int ssl_write_finished( ssl_context *ssl )
2537{
2538 int ret, hash_len;
2539
2540 SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
2541
Paul Bakker92be97b2013-01-02 17:30:03 +01002542 /*
2543 * Set the out_msg pointer to the correct location based on IV length
2544 */
2545 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2546 {
2547 ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -
2548 ssl->transform_negotiate->fixed_ivlen;
2549 }
2550 else
2551 ssl->out_msg = ssl->out_iv;
2552
Paul Bakker48916f92012-09-16 19:57:18 +00002553 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002554
2555 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002556 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2557
Paul Bakker48916f92012-09-16 19:57:18 +00002558 ssl->verify_data_len = hash_len;
2559 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
2560
Paul Bakker5121ce52009-01-03 21:22:43 +00002561 ssl->out_msglen = 4 + hash_len;
2562 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2563 ssl->out_msg[0] = SSL_HS_FINISHED;
2564
2565 /*
2566 * In case of session resuming, invert the client and server
2567 * ChangeCipherSpec messages order.
2568 */
Paul Bakker0a597072012-09-25 21:55:46 +00002569 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002570 {
2571 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker48916f92012-09-16 19:57:18 +00002572 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002573 else
2574 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2575 }
2576 else
2577 ssl->state++;
2578
Paul Bakker48916f92012-09-16 19:57:18 +00002579 /*
2580 * Switch to our negotiated transform and session parameters for outbound data.
2581 */
2582 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
2583 ssl->transform_out = ssl->transform_negotiate;
2584 ssl->session_out = ssl->session_negotiate;
2585 memset( ssl->out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002586
Paul Bakker07eb38b2012-12-19 14:42:06 +01002587#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2588 if( ssl_hw_record_activate != NULL)
2589 {
2590 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
2591 {
2592 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2593 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2594 }
2595 }
2596#endif
2597
Paul Bakker5121ce52009-01-03 21:22:43 +00002598 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2599 {
2600 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2601 return( ret );
2602 }
2603
2604 SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
2605
2606 return( 0 );
2607}
2608
2609int ssl_parse_finished( ssl_context *ssl )
2610{
Paul Bakker23986e52011-04-24 08:57:21 +00002611 int ret;
2612 unsigned int hash_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002613 unsigned char buf[36];
2614
2615 SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
2616
Paul Bakker48916f92012-09-16 19:57:18 +00002617 ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002618
Paul Bakker48916f92012-09-16 19:57:18 +00002619 /*
2620 * Switch to our negotiated transform and session parameters for inbound data.
2621 */
2622 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
2623 ssl->transform_in = ssl->transform_negotiate;
2624 ssl->session_in = ssl->session_negotiate;
2625 memset( ssl->in_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002626
Paul Bakker92be97b2013-01-02 17:30:03 +01002627 /*
2628 * Set the in_msg pointer to the correct location based on IV length
2629 */
2630 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2631 {
2632 ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -
2633 ssl->transform_negotiate->fixed_ivlen;
2634 }
2635 else
2636 ssl->in_msg = ssl->in_iv;
2637
Paul Bakker07eb38b2012-12-19 14:42:06 +01002638#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2639 if( ssl_hw_record_activate != NULL)
2640 {
2641 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_INBOUND ) ) != 0 )
2642 {
2643 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2644 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2645 }
2646 }
2647#endif
2648
Paul Bakker5121ce52009-01-03 21:22:43 +00002649 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2650 {
2651 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2652 return( ret );
2653 }
2654
2655 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2656 {
2657 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002658 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002659 }
2660
Paul Bakker1ef83d62012-04-11 12:09:53 +00002661 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002662 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2663
2664 if( ssl->in_msg[0] != SSL_HS_FINISHED ||
2665 ssl->in_hslen != 4 + hash_len )
2666 {
2667 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002668 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002669 }
2670
Paul Bakker5121ce52009-01-03 21:22:43 +00002671 if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
2672 {
2673 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002674 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002675 }
2676
Paul Bakker48916f92012-09-16 19:57:18 +00002677 ssl->verify_data_len = hash_len;
2678 memcpy( ssl->peer_verify_data, buf, hash_len );
2679
Paul Bakker0a597072012-09-25 21:55:46 +00002680 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002681 {
2682 if( ssl->endpoint == SSL_IS_CLIENT )
2683 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2684
2685 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker48916f92012-09-16 19:57:18 +00002686 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002687 }
2688 else
2689 ssl->state++;
2690
2691 SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
2692
2693 return( 0 );
2694}
2695
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002696static int ssl_handshake_init( ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00002697{
2698 if( ssl->transform_negotiate )
2699 ssl_transform_free( ssl->transform_negotiate );
2700 else
2701 ssl->transform_negotiate = malloc( sizeof(ssl_transform) );
2702
2703 if( ssl->session_negotiate )
2704 ssl_session_free( ssl->session_negotiate );
2705 else
2706 ssl->session_negotiate = malloc( sizeof(ssl_session) );
2707
2708 if( ssl->handshake )
2709 ssl_handshake_free( ssl->handshake );
2710 else
2711 ssl->handshake = malloc( sizeof(ssl_handshake_params) );
2712
2713 if( ssl->handshake == NULL ||
2714 ssl->transform_negotiate == NULL ||
2715 ssl->session_negotiate == NULL )
2716 {
2717 SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) );
2718 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2719 }
2720
2721 memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
2722 memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
2723 memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
2724
2725 md5_starts( &ssl->handshake->fin_md5 );
2726 sha1_starts( &ssl->handshake->fin_sha1 );
2727 sha2_starts( &ssl->handshake->fin_sha2, 0 );
Paul Bakker769075d2012-11-24 11:26:46 +01002728#if defined(POLARSSL_SHA4_C)
Paul Bakker48916f92012-09-16 19:57:18 +00002729 sha4_starts( &ssl->handshake->fin_sha4, 1 );
Paul Bakker769075d2012-11-24 11:26:46 +01002730#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002731
2732 ssl->handshake->update_checksum = ssl_update_checksum_start;
Paul Bakker23f36802012-09-28 14:15:14 +00002733 ssl->handshake->sig_alg = SSL_HASH_SHA1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002734
Paul Bakker48916f92012-09-16 19:57:18 +00002735 return( 0 );
2736}
2737
Paul Bakker5121ce52009-01-03 21:22:43 +00002738/*
2739 * Initialize an SSL context
2740 */
2741int ssl_init( ssl_context *ssl )
2742{
Paul Bakker48916f92012-09-16 19:57:18 +00002743 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002744 int len = SSL_BUFFER_LEN;
2745
2746 memset( ssl, 0, sizeof( ssl_context ) );
2747
Paul Bakker62f2dee2012-09-28 07:31:51 +00002748 /*
2749 * Sane defaults
2750 */
Paul Bakkered27a042013-04-18 22:46:23 +02002751#if defined(POLARSSL_RSA_C)
Paul Bakkereb2c6582012-09-27 19:15:01 +00002752 ssl->rsa_decrypt = ssl_rsa_decrypt;
2753 ssl->rsa_sign = ssl_rsa_sign;
2754 ssl->rsa_key_len = ssl_rsa_key_len;
Paul Bakkered27a042013-04-18 22:46:23 +02002755#endif
Paul Bakkereb2c6582012-09-27 19:15:01 +00002756
Paul Bakker1d29fb52012-09-28 13:28:45 +00002757 ssl->min_major_ver = SSL_MAJOR_VERSION_3;
2758 ssl->min_minor_ver = SSL_MINOR_VERSION_0;
2759
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002760 ssl_set_ciphersuites( ssl, ssl_list_ciphersuites() );
Paul Bakker645ce3a2012-10-31 12:32:41 +00002761
Paul Bakker62f2dee2012-09-28 07:31:51 +00002762#if defined(POLARSSL_DHM_C)
2763 if( ( ret = mpi_read_string( &ssl->dhm_P, 16,
2764 POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 ||
2765 ( ret = mpi_read_string( &ssl->dhm_G, 16,
2766 POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 )
2767 {
2768 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
2769 return( ret );
2770 }
2771#endif
2772
2773 /*
2774 * Prepare base structures
2775 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002776 ssl->in_ctr = (unsigned char *) malloc( len );
2777 ssl->in_hdr = ssl->in_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002778 ssl->in_iv = ssl->in_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002779 ssl->in_msg = ssl->in_ctr + 13;
2780
2781 if( ssl->in_ctr == NULL )
2782 {
2783 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002784 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002785 }
2786
2787 ssl->out_ctr = (unsigned char *) malloc( len );
2788 ssl->out_hdr = ssl->out_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002789 ssl->out_iv = ssl->out_ctr + 13;
Paul Bakker5bd42292012-12-19 14:40:42 +01002790 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002791
2792 if( ssl->out_ctr == NULL )
2793 {
2794 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
2795 free( ssl-> in_ctr );
Paul Bakker69e095c2011-12-10 21:55:01 +00002796 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002797 }
2798
2799 memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
2800 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2801
2802 ssl->hostname = NULL;
2803 ssl->hostname_len = 0;
2804
Paul Bakker48916f92012-09-16 19:57:18 +00002805 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2806 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002807
2808 return( 0 );
2809}
2810
2811/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00002812 * Reset an initialized and used SSL context for re-use while retaining
2813 * all application-set variables, function pointers and data.
2814 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00002815int ssl_session_reset( ssl_context *ssl )
Paul Bakker7eb013f2011-10-06 12:37:39 +00002816{
Paul Bakker48916f92012-09-16 19:57:18 +00002817 int ret;
2818
Paul Bakker7eb013f2011-10-06 12:37:39 +00002819 ssl->state = SSL_HELLO_REQUEST;
Paul Bakker48916f92012-09-16 19:57:18 +00002820 ssl->renegotiation = SSL_INITIAL_HANDSHAKE;
2821 ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION;
2822
2823 ssl->verify_data_len = 0;
2824 memset( ssl->own_verify_data, 0, 36 );
2825 memset( ssl->peer_verify_data, 0, 36 );
2826
Paul Bakker7eb013f2011-10-06 12:37:39 +00002827 ssl->in_offt = NULL;
2828
Paul Bakker92be97b2013-01-02 17:30:03 +01002829 ssl->in_msg = ssl->in_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002830 ssl->in_msgtype = 0;
2831 ssl->in_msglen = 0;
2832 ssl->in_left = 0;
2833
2834 ssl->in_hslen = 0;
2835 ssl->nb_zero = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002836 ssl->record_read = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002837
Paul Bakker92be97b2013-01-02 17:30:03 +01002838 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002839 ssl->out_msgtype = 0;
2840 ssl->out_msglen = 0;
2841 ssl->out_left = 0;
2842
Paul Bakker48916f92012-09-16 19:57:18 +00002843 ssl->transform_in = NULL;
2844 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002845
2846 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2847 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker05ef8352012-05-08 09:17:57 +00002848
2849#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2850 if( ssl_hw_record_reset != NULL)
2851 {
2852 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) );
Paul Bakker07eb38b2012-12-19 14:42:06 +01002853 if( ( ret = ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002854 {
2855 SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret );
2856 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2857 }
Paul Bakker05ef8352012-05-08 09:17:57 +00002858 }
2859#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00002860
Paul Bakker48916f92012-09-16 19:57:18 +00002861 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002862 {
Paul Bakker48916f92012-09-16 19:57:18 +00002863 ssl_transform_free( ssl->transform );
2864 free( ssl->transform );
2865 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002866 }
Paul Bakker48916f92012-09-16 19:57:18 +00002867
Paul Bakkerc0463502013-02-14 11:19:38 +01002868 if( ssl->session )
2869 {
2870 ssl_session_free( ssl->session );
2871 free( ssl->session );
2872 ssl->session = NULL;
2873 }
2874
Paul Bakker48916f92012-09-16 19:57:18 +00002875 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2876 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002877
2878 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00002879}
2880
2881/*
Paul Bakker5121ce52009-01-03 21:22:43 +00002882 * SSL set accessors
2883 */
2884void ssl_set_endpoint( ssl_context *ssl, int endpoint )
2885{
2886 ssl->endpoint = endpoint;
2887}
2888
2889void ssl_set_authmode( ssl_context *ssl, int authmode )
2890{
2891 ssl->authmode = authmode;
2892}
2893
Paul Bakkered27a042013-04-18 22:46:23 +02002894#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002895void ssl_set_verify( ssl_context *ssl,
Paul Bakker915275b2012-09-28 07:10:55 +00002896 int (*f_vrfy)(void *, x509_cert *, int, int *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002897 void *p_vrfy )
2898{
2899 ssl->f_vrfy = f_vrfy;
2900 ssl->p_vrfy = p_vrfy;
2901}
Paul Bakkered27a042013-04-18 22:46:23 +02002902#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002903
Paul Bakker5121ce52009-01-03 21:22:43 +00002904void ssl_set_rng( ssl_context *ssl,
Paul Bakkera3d195c2011-11-27 21:07:34 +00002905 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00002906 void *p_rng )
2907{
2908 ssl->f_rng = f_rng;
2909 ssl->p_rng = p_rng;
2910}
2911
2912void ssl_set_dbg( ssl_context *ssl,
Paul Bakkerff60ee62010-03-16 21:09:09 +00002913 void (*f_dbg)(void *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00002914 void *p_dbg )
2915{
2916 ssl->f_dbg = f_dbg;
2917 ssl->p_dbg = p_dbg;
2918}
2919
2920void ssl_set_bio( ssl_context *ssl,
Paul Bakker23986e52011-04-24 08:57:21 +00002921 int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
Paul Bakker39bb4182011-06-21 07:36:43 +00002922 int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
Paul Bakker5121ce52009-01-03 21:22:43 +00002923{
2924 ssl->f_recv = f_recv;
2925 ssl->f_send = f_send;
2926 ssl->p_recv = p_recv;
2927 ssl->p_send = p_send;
2928}
2929
Paul Bakker0a597072012-09-25 21:55:46 +00002930void ssl_set_session_cache( ssl_context *ssl,
2931 int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
2932 int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00002933{
Paul Bakker0a597072012-09-25 21:55:46 +00002934 ssl->f_get_cache = f_get_cache;
2935 ssl->p_get_cache = p_get_cache;
2936 ssl->f_set_cache = f_set_cache;
2937 ssl->p_set_cache = p_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00002938}
2939
Paul Bakker0a597072012-09-25 21:55:46 +00002940void ssl_set_session( ssl_context *ssl, const ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00002941{
Paul Bakker0a597072012-09-25 21:55:46 +00002942 memcpy( ssl->session_negotiate, session, sizeof(ssl_session) );
2943 ssl->handshake->resume = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002944}
2945
Paul Bakkerb68cad62012-08-23 08:34:18 +00002946void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00002947{
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002948 ssl->ciphersuite_list[SSL_MINOR_VERSION_0] = ciphersuites;
2949 ssl->ciphersuite_list[SSL_MINOR_VERSION_1] = ciphersuites;
2950 ssl->ciphersuite_list[SSL_MINOR_VERSION_2] = ciphersuites;
2951 ssl->ciphersuite_list[SSL_MINOR_VERSION_3] = ciphersuites;
2952}
2953
2954void ssl_set_ciphersuites_for_version( ssl_context *ssl, const int *ciphersuites,
2955 int major, int minor )
2956{
2957 if( major != SSL_MAJOR_VERSION_3 )
2958 return;
2959
2960 if( minor < SSL_MINOR_VERSION_0 || minor > SSL_MINOR_VERSION_3 )
2961 return;
2962
2963 ssl->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00002964}
2965
Paul Bakkered27a042013-04-18 22:46:23 +02002966#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00002967void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain,
Paul Bakker57b79142010-03-24 06:51:15 +00002968 x509_crl *ca_crl, const char *peer_cn )
Paul Bakker5121ce52009-01-03 21:22:43 +00002969{
2970 ssl->ca_chain = ca_chain;
Paul Bakker40ea7de2009-05-03 10:18:48 +00002971 ssl->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00002972 ssl->peer_cn = peer_cn;
2973}
2974
2975void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert,
2976 rsa_context *rsa_key )
2977{
2978 ssl->own_cert = own_cert;
2979 ssl->rsa_key = rsa_key;
2980}
2981
Paul Bakkereb2c6582012-09-27 19:15:01 +00002982void ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert,
2983 void *rsa_key,
2984 rsa_decrypt_func rsa_decrypt,
2985 rsa_sign_func rsa_sign,
2986 rsa_key_len_func rsa_key_len )
Paul Bakker43b7e352011-01-18 15:27:19 +00002987{
2988 ssl->own_cert = own_cert;
Paul Bakkereb2c6582012-09-27 19:15:01 +00002989 ssl->rsa_key = rsa_key;
2990 ssl->rsa_decrypt = rsa_decrypt;
2991 ssl->rsa_sign = rsa_sign;
2992 ssl->rsa_key_len = rsa_key_len;
Paul Bakker43b7e352011-01-18 15:27:19 +00002993}
Paul Bakkered27a042013-04-18 22:46:23 +02002994#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00002995
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002996#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
2997void ssl_set_psk( ssl_context *ssl, const unsigned char *psk, size_t psk_len,
2998 const unsigned char *psk_identity, size_t psk_identity_len )
2999{
3000 ssl->psk = psk;
3001 ssl->psk_len = psk_len;
3002 ssl->psk_identity = psk_identity;
3003 ssl->psk_identity_len = psk_identity_len;
3004}
3005#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00003006
Paul Bakker48916f92012-09-16 19:57:18 +00003007#if defined(POLARSSL_DHM_C)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003008int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00003009{
3010 int ret;
3011
Paul Bakker48916f92012-09-16 19:57:18 +00003012 if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003013 {
3014 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3015 return( ret );
3016 }
3017
Paul Bakker48916f92012-09-16 19:57:18 +00003018 if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003019 {
3020 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3021 return( ret );
3022 }
3023
3024 return( 0 );
3025}
3026
Paul Bakker1b57b062011-01-06 15:48:19 +00003027int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx )
3028{
3029 int ret;
3030
Paul Bakker48916f92012-09-16 19:57:18 +00003031 if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003032 {
3033 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3034 return( ret );
3035 }
3036
Paul Bakker48916f92012-09-16 19:57:18 +00003037 if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003038 {
3039 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3040 return( ret );
3041 }
3042
3043 return( 0 );
3044}
Paul Bakker48916f92012-09-16 19:57:18 +00003045#endif /* POLARSSL_DHM_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00003046
Paul Bakkerff60ee62010-03-16 21:09:09 +00003047int ssl_set_hostname( ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00003048{
3049 if( hostname == NULL )
Paul Bakker40e46942009-01-03 21:51:57 +00003050 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003051
3052 ssl->hostname_len = strlen( hostname );
Paul Bakker40ea7de2009-05-03 10:18:48 +00003053 ssl->hostname = (unsigned char *) malloc( ssl->hostname_len + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003054
Paul Bakkerb15b8512012-01-13 13:44:06 +00003055 if( ssl->hostname == NULL )
3056 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3057
Paul Bakker3c2122f2013-06-24 19:03:14 +02003058 memcpy( ssl->hostname, (const unsigned char *) hostname,
Paul Bakker5121ce52009-01-03 21:22:43 +00003059 ssl->hostname_len );
Paul Bakkerf7abd422013-04-16 13:15:56 +02003060
Paul Bakker40ea7de2009-05-03 10:18:48 +00003061 ssl->hostname[ssl->hostname_len] = '\0';
Paul Bakker5121ce52009-01-03 21:22:43 +00003062
3063 return( 0 );
3064}
3065
Paul Bakker5701cdc2012-09-27 21:49:42 +00003066void ssl_set_sni( ssl_context *ssl,
3067 int (*f_sni)(void *, ssl_context *,
3068 const unsigned char *, size_t),
3069 void *p_sni )
3070{
3071 ssl->f_sni = f_sni;
3072 ssl->p_sni = p_sni;
3073}
3074
Paul Bakker490ecc82011-10-06 13:04:09 +00003075void ssl_set_max_version( ssl_context *ssl, int major, int minor )
3076{
3077 ssl->max_major_ver = major;
3078 ssl->max_minor_ver = minor;
3079}
3080
Paul Bakker1d29fb52012-09-28 13:28:45 +00003081void ssl_set_min_version( ssl_context *ssl, int major, int minor )
3082{
3083 ssl->min_major_ver = major;
3084 ssl->min_minor_ver = minor;
3085}
3086
Paul Bakker48916f92012-09-16 19:57:18 +00003087void ssl_set_renegotiation( ssl_context *ssl, int renegotiation )
3088{
3089 ssl->disable_renegotiation = renegotiation;
3090}
3091
3092void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy )
3093{
3094 ssl->allow_legacy_renegotiation = allow_legacy;
3095}
3096
Paul Bakker5121ce52009-01-03 21:22:43 +00003097/*
3098 * SSL get accessors
3099 */
Paul Bakker23986e52011-04-24 08:57:21 +00003100size_t ssl_get_bytes_avail( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003101{
3102 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
3103}
3104
Paul Bakkerff60ee62010-03-16 21:09:09 +00003105int ssl_get_verify_result( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003106{
3107 return( ssl->verify_result );
3108}
3109
Paul Bakkere3166ce2011-01-27 17:40:50 +00003110const char *ssl_get_ciphersuite( const ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00003111{
Paul Bakker926c8e42013-03-06 10:23:34 +01003112 if( ssl == NULL || ssl->session == NULL )
3113 return NULL;
3114
Paul Bakkere3166ce2011-01-27 17:40:50 +00003115 return ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00003116}
3117
Paul Bakker43ca69c2011-01-15 17:35:19 +00003118const char *ssl_get_version( const ssl_context *ssl )
3119{
3120 switch( ssl->minor_ver )
3121 {
3122 case SSL_MINOR_VERSION_0:
3123 return( "SSLv3.0" );
3124
3125 case SSL_MINOR_VERSION_1:
3126 return( "TLSv1.0" );
3127
3128 case SSL_MINOR_VERSION_2:
3129 return( "TLSv1.1" );
3130
Paul Bakker1ef83d62012-04-11 12:09:53 +00003131 case SSL_MINOR_VERSION_3:
3132 return( "TLSv1.2" );
3133
Paul Bakker43ca69c2011-01-15 17:35:19 +00003134 default:
3135 break;
3136 }
3137 return( "unknown" );
3138}
3139
Paul Bakkered27a042013-04-18 22:46:23 +02003140#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb0550d92012-10-30 07:51:03 +00003141const x509_cert *ssl_get_peer_cert( const ssl_context *ssl )
3142{
3143 if( ssl == NULL || ssl->session == NULL )
3144 return NULL;
3145
3146 return ssl->session->peer_cert;
3147}
Paul Bakkered27a042013-04-18 22:46:23 +02003148#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00003149
Paul Bakker5121ce52009-01-03 21:22:43 +00003150/*
Paul Bakker1961b702013-01-25 14:49:24 +01003151 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003152 */
Paul Bakker1961b702013-01-25 14:49:24 +01003153int ssl_handshake_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003154{
Paul Bakker40e46942009-01-03 21:51:57 +00003155 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003156
Paul Bakker40e46942009-01-03 21:51:57 +00003157#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003158 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker1961b702013-01-25 14:49:24 +01003159 ret = ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003160#endif
3161
Paul Bakker40e46942009-01-03 21:51:57 +00003162#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003163 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker1961b702013-01-25 14:49:24 +01003164 ret = ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003165#endif
3166
Paul Bakker1961b702013-01-25 14:49:24 +01003167 return( ret );
3168}
3169
3170/*
3171 * Perform the SSL handshake
3172 */
3173int ssl_handshake( ssl_context *ssl )
3174{
3175 int ret = 0;
3176
3177 SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
3178
3179 while( ssl->state != SSL_HANDSHAKE_OVER )
3180 {
3181 ret = ssl_handshake_step( ssl );
3182
3183 if( ret != 0 )
3184 break;
3185 }
3186
Paul Bakker5121ce52009-01-03 21:22:43 +00003187 SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
3188
3189 return( ret );
3190}
3191
3192/*
Paul Bakker48916f92012-09-16 19:57:18 +00003193 * Renegotiate current connection
3194 */
3195int ssl_renegotiate( ssl_context *ssl )
3196{
3197 int ret;
3198
3199 SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
3200
3201 if( ssl->state != SSL_HANDSHAKE_OVER )
3202 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3203
3204 ssl->state = SSL_HELLO_REQUEST;
3205 ssl->renegotiation = SSL_RENEGOTIATION;
3206
3207 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3208 return( ret );
3209
3210 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3211 {
3212 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3213 return( ret );
3214 }
3215
3216 SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
3217
3218 return( 0 );
3219}
3220
3221/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003222 * Receive application data decrypted from the SSL layer
3223 */
Paul Bakker23986e52011-04-24 08:57:21 +00003224int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003225{
Paul Bakker23986e52011-04-24 08:57:21 +00003226 int ret;
3227 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003228
3229 SSL_DEBUG_MSG( 2, ( "=> read" ) );
3230
3231 if( ssl->state != SSL_HANDSHAKE_OVER )
3232 {
3233 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3234 {
3235 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3236 return( ret );
3237 }
3238 }
3239
3240 if( ssl->in_offt == NULL )
3241 {
3242 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3243 {
Paul Bakker831a7552011-05-18 13:32:51 +00003244 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3245 return( 0 );
3246
Paul Bakker5121ce52009-01-03 21:22:43 +00003247 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3248 return( ret );
3249 }
3250
3251 if( ssl->in_msglen == 0 &&
3252 ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
3253 {
3254 /*
3255 * OpenSSL sends empty messages to randomize the IV
3256 */
3257 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3258 {
Paul Bakker831a7552011-05-18 13:32:51 +00003259 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3260 return( 0 );
3261
Paul Bakker5121ce52009-01-03 21:22:43 +00003262 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3263 return( ret );
3264 }
3265 }
3266
Paul Bakker48916f92012-09-16 19:57:18 +00003267 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
3268 {
3269 SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
3270
3271 if( ssl->endpoint == SSL_IS_CLIENT &&
3272 ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST ||
3273 ssl->in_hslen != 4 ) )
3274 {
3275 SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
3276 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
3277 }
3278
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003279 if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
3280 ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
3281 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) )
Paul Bakker48916f92012-09-16 19:57:18 +00003282 {
3283 SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
3284
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003285 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakker48916f92012-09-16 19:57:18 +00003286 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003287 /*
3288 * SSLv3 does not have a "no_renegotiation" alert
3289 */
3290 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
3291 return( ret );
3292 }
3293 else
3294 {
3295 if( ( ret = ssl_send_alert_message( ssl,
3296 SSL_ALERT_LEVEL_WARNING,
3297 SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
3298 {
3299 return( ret );
3300 }
Paul Bakker48916f92012-09-16 19:57:18 +00003301 }
3302 }
3303 else
3304 {
3305 if( ( ret = ssl_renegotiate( ssl ) ) != 0 )
3306 {
3307 SSL_DEBUG_RET( 1, "ssl_renegotiate", ret );
3308 return( ret );
3309 }
3310
3311 return( POLARSSL_ERR_NET_WANT_READ );
3312 }
3313 }
3314 else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003315 {
3316 SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003317 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003318 }
3319
3320 ssl->in_offt = ssl->in_msg;
3321 }
3322
3323 n = ( len < ssl->in_msglen )
3324 ? len : ssl->in_msglen;
3325
3326 memcpy( buf, ssl->in_offt, n );
3327 ssl->in_msglen -= n;
3328
3329 if( ssl->in_msglen == 0 )
3330 /* all bytes consumed */
3331 ssl->in_offt = NULL;
3332 else
3333 /* more data available */
3334 ssl->in_offt += n;
3335
3336 SSL_DEBUG_MSG( 2, ( "<= read" ) );
3337
Paul Bakker23986e52011-04-24 08:57:21 +00003338 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003339}
3340
3341/*
3342 * Send application data to be encrypted by the SSL layer
3343 */
Paul Bakker23986e52011-04-24 08:57:21 +00003344int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003345{
Paul Bakker23986e52011-04-24 08:57:21 +00003346 int ret;
3347 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003348
3349 SSL_DEBUG_MSG( 2, ( "=> write" ) );
3350
3351 if( ssl->state != SSL_HANDSHAKE_OVER )
3352 {
3353 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3354 {
3355 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3356 return( ret );
3357 }
3358 }
3359
Paul Bakker887bd502011-06-08 13:10:54 +00003360 n = ( len < SSL_MAX_CONTENT_LEN )
3361 ? len : SSL_MAX_CONTENT_LEN;
3362
Paul Bakker5121ce52009-01-03 21:22:43 +00003363 if( ssl->out_left != 0 )
3364 {
3365 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3366 {
3367 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3368 return( ret );
3369 }
3370 }
Paul Bakker887bd502011-06-08 13:10:54 +00003371 else
Paul Bakker1fd00bf2011-03-14 20:50:15 +00003372 {
Paul Bakker887bd502011-06-08 13:10:54 +00003373 ssl->out_msglen = n;
3374 ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
3375 memcpy( ssl->out_msg, buf, n );
3376
3377 if( ( ret = ssl_write_record( ssl ) ) != 0 )
3378 {
3379 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
3380 return( ret );
3381 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003382 }
3383
3384 SSL_DEBUG_MSG( 2, ( "<= write" ) );
3385
Paul Bakker23986e52011-04-24 08:57:21 +00003386 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003387}
3388
3389/*
3390 * Notify the peer that the connection is being closed
3391 */
3392int ssl_close_notify( ssl_context *ssl )
3393{
3394 int ret;
3395
3396 SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
3397
3398 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3399 {
3400 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3401 return( ret );
3402 }
3403
3404 if( ssl->state == SSL_HANDSHAKE_OVER )
3405 {
Paul Bakker48916f92012-09-16 19:57:18 +00003406 if( ( ret = ssl_send_alert_message( ssl,
3407 SSL_ALERT_LEVEL_WARNING,
3408 SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003409 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003410 return( ret );
3411 }
3412 }
3413
3414 SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
3415
3416 return( ret );
3417}
3418
Paul Bakker48916f92012-09-16 19:57:18 +00003419void ssl_transform_free( ssl_transform *transform )
3420{
3421#if defined(POLARSSL_ZLIB_SUPPORT)
3422 deflateEnd( &transform->ctx_deflate );
3423 inflateEnd( &transform->ctx_inflate );
3424#endif
3425
3426 memset( transform, 0, sizeof( ssl_transform ) );
3427}
3428
3429void ssl_handshake_free( ssl_handshake_params *handshake )
3430{
3431#if defined(POLARSSL_DHM_C)
3432 dhm_free( &handshake->dhm_ctx );
3433#endif
3434 memset( handshake, 0, sizeof( ssl_handshake_params ) );
3435}
3436
3437void ssl_session_free( ssl_session *session )
3438{
Paul Bakkered27a042013-04-18 22:46:23 +02003439#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker0a597072012-09-25 21:55:46 +00003440 if( session->peer_cert != NULL )
Paul Bakker48916f92012-09-16 19:57:18 +00003441 {
Paul Bakker0a597072012-09-25 21:55:46 +00003442 x509_free( session->peer_cert );
3443 free( session->peer_cert );
Paul Bakker48916f92012-09-16 19:57:18 +00003444 }
Paul Bakkered27a042013-04-18 22:46:23 +02003445#endif
Paul Bakker0a597072012-09-25 21:55:46 +00003446
3447 memset( session, 0, sizeof( ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003448}
3449
Paul Bakker5121ce52009-01-03 21:22:43 +00003450/*
3451 * Free an SSL context
3452 */
3453void ssl_free( ssl_context *ssl )
3454{
3455 SSL_DEBUG_MSG( 2, ( "=> free" ) );
3456
Paul Bakker5121ce52009-01-03 21:22:43 +00003457 if( ssl->out_ctr != NULL )
3458 {
3459 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
3460 free( ssl->out_ctr );
3461 }
3462
3463 if( ssl->in_ctr != NULL )
3464 {
3465 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
3466 free( ssl->in_ctr );
3467 }
3468
Paul Bakker40e46942009-01-03 21:51:57 +00003469#if defined(POLARSSL_DHM_C)
Paul Bakker48916f92012-09-16 19:57:18 +00003470 mpi_free( &ssl->dhm_P );
3471 mpi_free( &ssl->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00003472#endif
3473
Paul Bakker48916f92012-09-16 19:57:18 +00003474 if( ssl->transform )
3475 {
3476 ssl_transform_free( ssl->transform );
3477 free( ssl->transform );
3478 }
3479
3480 if( ssl->handshake )
3481 {
3482 ssl_handshake_free( ssl->handshake );
3483 ssl_transform_free( ssl->transform_negotiate );
3484 ssl_session_free( ssl->session_negotiate );
3485
3486 free( ssl->handshake );
3487 free( ssl->transform_negotiate );
3488 free( ssl->session_negotiate );
3489 }
3490
Paul Bakkerc0463502013-02-14 11:19:38 +01003491 if( ssl->session )
3492 {
3493 ssl_session_free( ssl->session );
3494 free( ssl->session );
3495 }
3496
Paul Bakker5121ce52009-01-03 21:22:43 +00003497 if ( ssl->hostname != NULL)
3498 {
3499 memset( ssl->hostname, 0, ssl->hostname_len );
3500 free( ssl->hostname );
3501 ssl->hostname_len = 0;
3502 }
3503
Paul Bakker05ef8352012-05-08 09:17:57 +00003504#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3505 if( ssl_hw_record_finish != NULL )
3506 {
3507 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) );
3508 ssl_hw_record_finish( ssl );
3509 }
3510#endif
3511
Paul Bakker5121ce52009-01-03 21:22:43 +00003512 SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00003513
Paul Bakker86f04f42013-02-14 11:20:09 +01003514 /* Actually clear after last debug message */
Paul Bakker2da561c2009-02-05 18:00:28 +00003515 memset( ssl, 0, sizeof( ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003516}
3517
3518#endif