blob: dfeed3377bb75b5912d908b0beb73fd45eb2a87d [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 shared functions
3 *
Paul Bakker68884e32013-01-07 18:20:04 +01004 * Copyright (C) 2006-2013, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25/*
26 * The SSL 3.0 specification was drafted by Netscape in 1996,
27 * and became an IETF standard in 1999.
28 *
29 * http://wp.netscape.com/eng/ssl3/
30 * http://www.ietf.org/rfc/rfc2246.txt
31 * http://www.ietf.org/rfc/rfc4346.txt
32 */
33
Paul Bakker40e46942009-01-03 21:51:57 +000034#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakker40e46942009-01-03 21:51:57 +000036#if defined(POLARSSL_SSL_TLS_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Paul Bakker40e46942009-01-03 21:51:57 +000038#include "polarssl/aes.h"
39#include "polarssl/arc4.h"
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000040#include "polarssl/camellia.h"
Paul Bakker40e46942009-01-03 21:51:57 +000041#include "polarssl/des.h"
42#include "polarssl/debug.h"
43#include "polarssl/ssl.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000044
Paul Bakkerca4ab492012-04-18 14:23:57 +000045#if defined(POLARSSL_GCM_C)
46#include "polarssl/gcm.h"
47#endif
48
Paul Bakker6e339b52013-07-03 13:37:05 +020049#if defined(POLARSSL_MEMORY_C)
50#include "polarssl/memory.h"
51#else
52#define polarssl_malloc malloc
53#define polarssl_free free
54#endif
55
Paul Bakker5121ce52009-01-03 21:22:43 +000056#include <stdlib.h>
Paul Bakker5121ce52009-01-03 21:22:43 +000057
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000058#if defined _MSC_VER && !defined strcasecmp
59#define strcasecmp _stricmp
60#endif
61
Paul Bakker05ef8352012-05-08 09:17:57 +000062#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
63int (*ssl_hw_record_init)(ssl_context *ssl,
64 const unsigned char *key_enc, const unsigned char *key_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +010065 size_t keylen,
Paul Bakker05ef8352012-05-08 09:17:57 +000066 const unsigned char *iv_enc, const unsigned char *iv_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +010067 size_t ivlen,
68 const unsigned char *mac_enc, const unsigned char *mac_dec,
69 size_t maclen) = NULL;
70int (*ssl_hw_record_activate)(ssl_context *ssl, int direction) = NULL;
Paul Bakker05ef8352012-05-08 09:17:57 +000071int (*ssl_hw_record_reset)(ssl_context *ssl) = NULL;
72int (*ssl_hw_record_write)(ssl_context *ssl) = NULL;
73int (*ssl_hw_record_read)(ssl_context *ssl) = NULL;
74int (*ssl_hw_record_finish)(ssl_context *ssl) = NULL;
75#endif
76
Paul Bakkered27a042013-04-18 22:46:23 +020077#if defined(POLARSSL_RSA_C)
Paul Bakkereb2c6582012-09-27 19:15:01 +000078static int ssl_rsa_decrypt( void *ctx, int mode, size_t *olen,
79 const unsigned char *input, unsigned char *output,
80 size_t output_max_len )
81{
82 return rsa_pkcs1_decrypt( (rsa_context *) ctx, mode, olen, input, output,
83 output_max_len );
84}
85
86static int ssl_rsa_sign( void *ctx,
87 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
88 int mode, int hash_id, unsigned int hashlen,
89 const unsigned char *hash, unsigned char *sig )
90{
91 return rsa_pkcs1_sign( (rsa_context *) ctx, f_rng, p_rng, mode, hash_id,
92 hashlen, hash, sig );
93}
94
95static size_t ssl_rsa_key_len( void *ctx )
96{
97 return ( (rsa_context *) ctx )->len;
98}
Paul Bakkered27a042013-04-18 22:46:23 +020099#endif /* POLARSSL_RSA_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +0000100
Paul Bakker5121ce52009-01-03 21:22:43 +0000101/*
102 * Key material generation
103 */
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200104static int ssl3_prf( const unsigned char *secret, size_t slen,
105 const char *label,
106 const unsigned char *random, size_t rlen,
Paul Bakker5f70b252012-09-13 14:23:06 +0000107 unsigned char *dstbuf, size_t dlen )
108{
109 size_t i;
110 md5_context md5;
111 sha1_context sha1;
112 unsigned char padding[16];
113 unsigned char sha1sum[20];
114 ((void)label);
115
116 /*
117 * SSLv3:
118 * block =
119 * MD5( secret + SHA1( 'A' + secret + random ) ) +
120 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
121 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
122 * ...
123 */
124 for( i = 0; i < dlen / 16; i++ )
125 {
126 memset( padding, 'A' + i, 1 + i );
127
128 sha1_starts( &sha1 );
129 sha1_update( &sha1, padding, 1 + i );
130 sha1_update( &sha1, secret, slen );
131 sha1_update( &sha1, random, rlen );
132 sha1_finish( &sha1, sha1sum );
133
134 md5_starts( &md5 );
135 md5_update( &md5, secret, slen );
136 md5_update( &md5, sha1sum, 20 );
137 md5_finish( &md5, dstbuf + i * 16 );
138 }
139
140 memset( &md5, 0, sizeof( md5 ) );
141 memset( &sha1, 0, sizeof( sha1 ) );
142
143 memset( padding, 0, sizeof( padding ) );
144 memset( sha1sum, 0, sizeof( sha1sum ) );
145
146 return( 0 );
147}
148
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200149static int tls1_prf( const unsigned char *secret, size_t slen,
150 const char *label,
151 const unsigned char *random, size_t rlen,
Paul Bakker23986e52011-04-24 08:57:21 +0000152 unsigned char *dstbuf, size_t dlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000153{
Paul Bakker23986e52011-04-24 08:57:21 +0000154 size_t nb, hs;
155 size_t i, j, k;
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200156 const unsigned char *S1, *S2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000157 unsigned char tmp[128];
158 unsigned char h_i[20];
159
160 if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
Paul Bakker40e46942009-01-03 21:51:57 +0000161 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000162
163 hs = ( slen + 1 ) / 2;
164 S1 = secret;
165 S2 = secret + slen - hs;
166
167 nb = strlen( label );
168 memcpy( tmp + 20, label, nb );
169 memcpy( tmp + 20 + nb, random, rlen );
170 nb += rlen;
171
172 /*
173 * First compute P_md5(secret,label+random)[0..dlen]
174 */
175 md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
176
177 for( i = 0; i < dlen; i += 16 )
178 {
179 md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
180 md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp );
181
182 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
183
184 for( j = 0; j < k; j++ )
185 dstbuf[i + j] = h_i[j];
186 }
187
188 /*
189 * XOR out with P_sha1(secret,label+random)[0..dlen]
190 */
191 sha1_hmac( S2, hs, tmp + 20, nb, tmp );
192
193 for( i = 0; i < dlen; i += 20 )
194 {
195 sha1_hmac( S2, hs, tmp, 20 + nb, h_i );
196 sha1_hmac( S2, hs, tmp, 20, tmp );
197
198 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
199
200 for( j = 0; j < k; j++ )
201 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
202 }
203
204 memset( tmp, 0, sizeof( tmp ) );
205 memset( h_i, 0, sizeof( h_i ) );
206
207 return( 0 );
208}
209
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200210static int tls_prf_sha256( const unsigned char *secret, size_t slen,
211 const char *label,
212 const unsigned char *random, size_t rlen,
Paul Bakker1ef83d62012-04-11 12:09:53 +0000213 unsigned char *dstbuf, size_t dlen )
214{
215 size_t nb;
216 size_t i, j, k;
217 unsigned char tmp[128];
218 unsigned char h_i[32];
219
220 if( sizeof( tmp ) < 32 + strlen( label ) + rlen )
221 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
222
223 nb = strlen( label );
224 memcpy( tmp + 32, label, nb );
225 memcpy( tmp + 32 + nb, random, rlen );
226 nb += rlen;
227
228 /*
229 * Compute P_<hash>(secret, label + random)[0..dlen]
230 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200231 sha256_hmac( secret, slen, tmp + 32, nb, tmp, 0 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000232
233 for( i = 0; i < dlen; i += 32 )
234 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200235 sha256_hmac( secret, slen, tmp, 32 + nb, h_i, 0 );
236 sha256_hmac( secret, slen, tmp, 32, tmp, 0 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000237
238 k = ( i + 32 > dlen ) ? dlen % 32 : 32;
239
240 for( j = 0; j < k; j++ )
241 dstbuf[i + j] = h_i[j];
242 }
243
244 memset( tmp, 0, sizeof( tmp ) );
245 memset( h_i, 0, sizeof( h_i ) );
246
247 return( 0 );
248}
249
Paul Bakker9e36f042013-06-30 14:34:05 +0200250#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200251static int tls_prf_sha384( const unsigned char *secret, size_t slen,
252 const char *label,
253 const unsigned char *random, size_t rlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000254 unsigned char *dstbuf, size_t dlen )
255{
256 size_t nb;
257 size_t i, j, k;
258 unsigned char tmp[128];
259 unsigned char h_i[48];
260
261 if( sizeof( tmp ) < 48 + strlen( label ) + rlen )
262 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
263
264 nb = strlen( label );
265 memcpy( tmp + 48, label, nb );
266 memcpy( tmp + 48 + nb, random, rlen );
267 nb += rlen;
268
269 /*
270 * Compute P_<hash>(secret, label + random)[0..dlen]
271 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200272 sha512_hmac( secret, slen, tmp + 48, nb, tmp, 1 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000273
274 for( i = 0; i < dlen; i += 48 )
275 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200276 sha512_hmac( secret, slen, tmp, 48 + nb, h_i, 1 );
277 sha512_hmac( secret, slen, tmp, 48, tmp, 1 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000278
279 k = ( i + 48 > dlen ) ? dlen % 48 : 48;
280
281 for( j = 0; j < k; j++ )
282 dstbuf[i + j] = h_i[j];
283 }
284
285 memset( tmp, 0, sizeof( tmp ) );
286 memset( h_i, 0, sizeof( h_i ) );
287
288 return( 0 );
289}
Paul Bakker769075d2012-11-24 11:26:46 +0100290#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +0000291
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200292static void ssl_update_checksum_start(ssl_context *, const unsigned char *, size_t);
293static void ssl_update_checksum_md5sha1(ssl_context *, const unsigned char *, size_t);
294static void ssl_update_checksum_sha256(ssl_context *, const unsigned char *, size_t);
Paul Bakker380da532012-04-18 16:10:25 +0000295
296static void ssl_calc_verify_ssl(ssl_context *,unsigned char *);
297static void ssl_calc_verify_tls(ssl_context *,unsigned char *);
298static void ssl_calc_verify_tls_sha256(ssl_context *,unsigned char *);
Paul Bakker380da532012-04-18 16:10:25 +0000299
Paul Bakkerca4ab492012-04-18 14:23:57 +0000300static void ssl_calc_finished_ssl(ssl_context *,unsigned char *,int);
301static void ssl_calc_finished_tls(ssl_context *,unsigned char *,int);
302static void ssl_calc_finished_tls_sha256(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100303
Paul Bakker9e36f042013-06-30 14:34:05 +0200304#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200305static void ssl_update_checksum_sha384(ssl_context *, const unsigned char *, size_t);
Paul Bakker769075d2012-11-24 11:26:46 +0100306static void ssl_calc_verify_tls_sha384(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000307static void ssl_calc_finished_tls_sha384(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100308#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000309
Paul Bakker5121ce52009-01-03 21:22:43 +0000310int ssl_derive_keys( ssl_context *ssl )
311{
Paul Bakker5121ce52009-01-03 21:22:43 +0000312 unsigned char tmp[64];
Paul Bakker5121ce52009-01-03 21:22:43 +0000313 unsigned char keyblk[256];
314 unsigned char *key1;
315 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100316 unsigned char *mac_enc;
317 unsigned char *mac_dec;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000318 unsigned int iv_copy_len;
Paul Bakker68884e32013-01-07 18:20:04 +0100319 const cipher_info_t *cipher_info;
320 const md_info_t *md_info;
Paul Bakker61d113b2013-07-04 11:51:43 +0200321 int ret;
Paul Bakker68884e32013-01-07 18:20:04 +0100322
Paul Bakker48916f92012-09-16 19:57:18 +0000323 ssl_session *session = ssl->session_negotiate;
324 ssl_transform *transform = ssl->transform_negotiate;
325 ssl_handshake_params *handshake = ssl->handshake;
Paul Bakker5121ce52009-01-03 21:22:43 +0000326
327 SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
328
Paul Bakker68884e32013-01-07 18:20:04 +0100329 cipher_info = cipher_info_from_type( transform->ciphersuite_info->cipher );
330 if( cipher_info == NULL )
331 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200332 SSL_DEBUG_MSG( 1, ( "cipher info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100333 transform->ciphersuite_info->cipher ) );
334 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
335 }
336
337 md_info = md_info_from_type( transform->ciphersuite_info->mac );
338 if( md_info == NULL )
339 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200340 SSL_DEBUG_MSG( 1, ( "md info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100341 transform->ciphersuite_info->mac ) );
342 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
343 }
344
Paul Bakker5121ce52009-01-03 21:22:43 +0000345 /*
Paul Bakkerca4ab492012-04-18 14:23:57 +0000346 * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
Paul Bakker1ef83d62012-04-11 12:09:53 +0000347 */
348 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000349 {
Paul Bakker48916f92012-09-16 19:57:18 +0000350 handshake->tls_prf = ssl3_prf;
351 handshake->calc_verify = ssl_calc_verify_ssl;
352 handshake->calc_finished = ssl_calc_finished_ssl;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000353 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000354 else if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000355 {
Paul Bakker48916f92012-09-16 19:57:18 +0000356 handshake->tls_prf = tls1_prf;
357 handshake->calc_verify = ssl_calc_verify_tls;
358 handshake->calc_finished = ssl_calc_finished_tls;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000359 }
Paul Bakker9e36f042013-06-30 14:34:05 +0200360#if defined(POLARSSL_SHA512_C)
Paul Bakkerb7149bc2013-03-20 15:30:09 +0100361 else if( transform->ciphersuite_info->mac ==
362 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000363 {
Paul Bakker48916f92012-09-16 19:57:18 +0000364 handshake->tls_prf = tls_prf_sha384;
365 handshake->calc_verify = ssl_calc_verify_tls_sha384;
366 handshake->calc_finished = ssl_calc_finished_tls_sha384;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000367 }
Paul Bakker769075d2012-11-24 11:26:46 +0100368#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000369 else
Paul Bakkerca4ab492012-04-18 14:23:57 +0000370 {
Paul Bakker48916f92012-09-16 19:57:18 +0000371 handshake->tls_prf = tls_prf_sha256;
372 handshake->calc_verify = ssl_calc_verify_tls_sha256;
373 handshake->calc_finished = ssl_calc_finished_tls_sha256;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000374 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000375
376 /*
Paul Bakker5121ce52009-01-03 21:22:43 +0000377 * SSLv3:
378 * master =
379 * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
380 * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
381 * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
Paul Bakkerf7abd422013-04-16 13:15:56 +0200382 *
Paul Bakker5121ce52009-01-03 21:22:43 +0000383 * TLSv1:
384 * master = PRF( premaster, "master secret", randbytes )[0..47]
385 */
Paul Bakker0a597072012-09-25 21:55:46 +0000386 if( handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000387 {
Paul Bakker48916f92012-09-16 19:57:18 +0000388 SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
389 handshake->pmslen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000390
Paul Bakker48916f92012-09-16 19:57:18 +0000391 handshake->tls_prf( handshake->premaster, handshake->pmslen,
392 "master secret",
393 handshake->randbytes, 64, session->master, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000394
Paul Bakker48916f92012-09-16 19:57:18 +0000395 memset( handshake->premaster, 0, sizeof( handshake->premaster ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000396 }
397 else
398 SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
399
400 /*
401 * Swap the client and server random values.
402 */
Paul Bakker48916f92012-09-16 19:57:18 +0000403 memcpy( tmp, handshake->randbytes, 64 );
404 memcpy( handshake->randbytes, tmp + 32, 32 );
405 memcpy( handshake->randbytes + 32, tmp, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000406 memset( tmp, 0, sizeof( tmp ) );
407
408 /*
409 * SSLv3:
410 * key block =
411 * MD5( master + SHA1( 'A' + master + randbytes ) ) +
412 * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
413 * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
414 * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
415 * ...
416 *
417 * TLSv1:
418 * key block = PRF( master, "key expansion", randbytes )
419 */
Paul Bakker48916f92012-09-16 19:57:18 +0000420 handshake->tls_prf( session->master, 48, "key expansion",
421 handshake->randbytes, 64, keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000422
Paul Bakker48916f92012-09-16 19:57:18 +0000423 SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
424 ssl_get_ciphersuite_name( session->ciphersuite ) ) );
425 SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
426 SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000427 SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
428
Paul Bakker48916f92012-09-16 19:57:18 +0000429 memset( handshake->randbytes, 0, sizeof( handshake->randbytes ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000430
431 /*
432 * Determine the appropriate key, IV and MAC length.
433 */
Paul Bakker68884e32013-01-07 18:20:04 +0100434
435 if( cipher_info->mode == POLARSSL_MODE_GCM )
Paul Bakker5121ce52009-01-03 21:22:43 +0000436 {
Paul Bakker68884e32013-01-07 18:20:04 +0100437 transform->keylen = cipher_info->key_length;
438 transform->keylen /= 8;
439 transform->minlen = 1;
440 transform->ivlen = 12;
441 transform->fixed_ivlen = 4;
442 transform->maclen = 0;
443 }
444 else
445 {
446 if( md_info->type != POLARSSL_MD_NONE )
447 {
Paul Bakker61d113b2013-07-04 11:51:43 +0200448 if( ( ret = md_init_ctx( &transform->md_ctx_enc, md_info ) ) != 0 )
449 {
450 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
451 return( ret );
452 }
453
454 if( ( ret = md_init_ctx( &transform->md_ctx_dec, md_info ) ) != 0 )
455 {
456 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
457 return( ret );
458 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000459
Paul Bakker68884e32013-01-07 18:20:04 +0100460 transform->maclen = md_get_size( md_info );
461 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000462
Paul Bakker68884e32013-01-07 18:20:04 +0100463 transform->keylen = cipher_info->key_length;
464 transform->keylen /= 8;
465 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +0000466
Paul Bakker68884e32013-01-07 18:20:04 +0100467 transform->minlen = transform->keylen;
468 if( transform->minlen < transform->maclen )
469 {
470 if( cipher_info->mode == POLARSSL_MODE_STREAM )
471 transform->minlen = transform->maclen;
472 else
473 transform->minlen += transform->keylen;
474 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000475 }
476
477 SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000478 transform->keylen, transform->minlen, transform->ivlen,
479 transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000480
481 /*
482 * Finally setup the cipher contexts, IVs and MAC secrets.
483 */
484 if( ssl->endpoint == SSL_IS_CLIENT )
485 {
Paul Bakker48916f92012-09-16 19:57:18 +0000486 key1 = keyblk + transform->maclen * 2;
487 key2 = keyblk + transform->maclen * 2 + transform->keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000488
Paul Bakker68884e32013-01-07 18:20:04 +0100489 mac_enc = keyblk;
490 mac_dec = keyblk + transform->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000491
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000492 /*
493 * This is not used in TLS v1.1.
494 */
Paul Bakker48916f92012-09-16 19:57:18 +0000495 iv_copy_len = ( transform->fixed_ivlen ) ?
496 transform->fixed_ivlen : transform->ivlen;
497 memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len );
498 memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000499 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000500 }
501 else
502 {
Paul Bakker48916f92012-09-16 19:57:18 +0000503 key1 = keyblk + transform->maclen * 2 + transform->keylen;
504 key2 = keyblk + transform->maclen * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000505
Paul Bakker68884e32013-01-07 18:20:04 +0100506 mac_enc = keyblk + transform->maclen;
507 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +0000508
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000509 /*
510 * This is not used in TLS v1.1.
511 */
Paul Bakker48916f92012-09-16 19:57:18 +0000512 iv_copy_len = ( transform->fixed_ivlen ) ?
513 transform->fixed_ivlen : transform->ivlen;
514 memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len );
515 memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000516 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000517 }
518
Paul Bakker68884e32013-01-07 18:20:04 +0100519 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
520 {
521 memcpy( transform->mac_enc, mac_enc, transform->maclen );
522 memcpy( transform->mac_dec, mac_dec, transform->maclen );
523 }
524 else
525 {
526 md_hmac_starts( &transform->md_ctx_enc, mac_enc, transform->maclen );
527 md_hmac_starts( &transform->md_ctx_dec, mac_dec, transform->maclen );
528 }
529
Paul Bakker05ef8352012-05-08 09:17:57 +0000530#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
531 if( ssl_hw_record_init != NULL)
532 {
533 int ret = 0;
534
535 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) );
536
Paul Bakker07eb38b2012-12-19 14:42:06 +0100537 if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->keylen,
538 transform->iv_enc, transform->iv_dec,
539 iv_copy_len,
Paul Bakker68884e32013-01-07 18:20:04 +0100540 mac_enc, mac_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100541 transform->maclen ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +0000542 {
543 SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret );
544 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
545 }
546 }
547#endif
548
Paul Bakker68884e32013-01-07 18:20:04 +0100549 switch( cipher_info->type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000550 {
Paul Bakker40e46942009-01-03 21:51:57 +0000551#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100552 case POLARSSL_CIPHER_ARC4_128:
Paul Bakker48916f92012-09-16 19:57:18 +0000553 arc4_setup( (arc4_context *) transform->ctx_enc, key1,
554 transform->keylen );
555 arc4_setup( (arc4_context *) transform->ctx_dec, key2,
556 transform->keylen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000557 break;
558#endif
559
Paul Bakker40e46942009-01-03 21:51:57 +0000560#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100561 case POLARSSL_CIPHER_DES_EDE3_CBC:
562 des3_set3key_enc( (des3_context *) transform->ctx_enc, key1 );
563 des3_set3key_dec( (des3_context *) transform->ctx_dec, key2 );
564 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000565#endif
566
Paul Bakker40e46942009-01-03 21:51:57 +0000567#if defined(POLARSSL_AES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100568 case POLARSSL_CIPHER_AES_128_CBC:
569 case POLARSSL_CIPHER_AES_256_CBC:
570 aes_setkey_enc( (aes_context*) transform->ctx_enc, key1,
571 cipher_info->key_length );
572 aes_setkey_dec( (aes_context*) transform->ctx_dec, key2,
573 cipher_info->key_length );
Paul Bakker5121ce52009-01-03 21:22:43 +0000574 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000575#endif
576
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000577#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100578 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
579 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
580 camellia_setkey_enc( (camellia_context*) transform->ctx_enc, key1,
581 cipher_info->key_length );
582 camellia_setkey_dec( (camellia_context*) transform->ctx_dec, key2,
583 cipher_info->key_length );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000584 break;
585#endif
586
Paul Bakkerfab5c822012-02-06 16:45:10 +0000587#if defined(POLARSSL_DES_C)
Paul Bakker68884e32013-01-07 18:20:04 +0100588 case POLARSSL_CIPHER_DES_CBC:
Paul Bakker48916f92012-09-16 19:57:18 +0000589 des_setkey_enc( (des_context *) transform->ctx_enc, key1 );
590 des_setkey_dec( (des_context *) transform->ctx_dec, key2 );
Paul Bakkerfab5c822012-02-06 16:45:10 +0000591 break;
592#endif
Paul Bakker68884e32013-01-07 18:20:04 +0100593
594#if defined(POLARSSL_GCM_C)
595 case POLARSSL_CIPHER_AES_128_GCM:
596 case POLARSSL_CIPHER_AES_256_GCM:
597 gcm_init( (gcm_context *) transform->ctx_enc, key1,
598 cipher_info->key_length );
599 gcm_init( (gcm_context *) transform->ctx_dec, key2,
600 cipher_info->key_length );
601 break;
602#endif
603
604 case POLARSSL_CIPHER_NULL:
605 break;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000606
Paul Bakker5121ce52009-01-03 21:22:43 +0000607 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000608 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000609 }
610
611 memset( keyblk, 0, sizeof( keyblk ) );
612
Paul Bakker2770fbd2012-07-03 13:30:23 +0000613#if defined(POLARSSL_ZLIB_SUPPORT)
614 // Initialize compression
615 //
Paul Bakker48916f92012-09-16 19:57:18 +0000616 if( session->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000617 {
618 SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
619
Paul Bakker48916f92012-09-16 19:57:18 +0000620 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
621 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000622
Paul Bakker48916f92012-09-16 19:57:18 +0000623 if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK ||
624 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000625 {
626 SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
627 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
628 }
629 }
630#endif /* POLARSSL_ZLIB_SUPPORT */
631
Paul Bakker5121ce52009-01-03 21:22:43 +0000632 SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
633
634 return( 0 );
635}
636
Paul Bakker380da532012-04-18 16:10:25 +0000637void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000638{
639 md5_context md5;
640 sha1_context sha1;
641 unsigned char pad_1[48];
642 unsigned char pad_2[48];
643
Paul Bakker380da532012-04-18 16:10:25 +0000644 SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000645
Paul Bakker48916f92012-09-16 19:57:18 +0000646 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
647 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000648
Paul Bakker380da532012-04-18 16:10:25 +0000649 memset( pad_1, 0x36, 48 );
650 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000651
Paul Bakker48916f92012-09-16 19:57:18 +0000652 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000653 md5_update( &md5, pad_1, 48 );
654 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000655
Paul Bakker380da532012-04-18 16:10:25 +0000656 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +0000657 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000658 md5_update( &md5, pad_2, 48 );
659 md5_update( &md5, hash, 16 );
660 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000661
Paul Bakker48916f92012-09-16 19:57:18 +0000662 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000663 sha1_update( &sha1, pad_1, 40 );
664 sha1_finish( &sha1, hash + 16 );
665
666 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +0000667 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000668 sha1_update( &sha1, pad_2, 40 );
669 sha1_update( &sha1, hash + 16, 20 );
670 sha1_finish( &sha1, hash + 16 );
671
672 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
673 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
674
675 return;
676}
677
678void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] )
679{
680 md5_context md5;
681 sha1_context sha1;
682
683 SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
684
Paul Bakker48916f92012-09-16 19:57:18 +0000685 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
686 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000687
Paul Bakker48916f92012-09-16 19:57:18 +0000688 md5_finish( &md5, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000689 sha1_finish( &sha1, hash + 16 );
690
691 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
692 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
693
694 return;
695}
696
697void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] )
698{
Paul Bakker9e36f042013-06-30 14:34:05 +0200699 sha256_context sha256;
Paul Bakker380da532012-04-18 16:10:25 +0000700
701 SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
702
Paul Bakker9e36f042013-06-30 14:34:05 +0200703 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
704 sha256_finish( &sha256, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000705
706 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
707 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
708
709 return;
710}
711
Paul Bakker9e36f042013-06-30 14:34:05 +0200712#if defined(POLARSSL_SHA512_C)
Paul Bakker380da532012-04-18 16:10:25 +0000713void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] )
714{
Paul Bakker9e36f042013-06-30 14:34:05 +0200715 sha512_context sha512;
Paul Bakker380da532012-04-18 16:10:25 +0000716
717 SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
718
Paul Bakker9e36f042013-06-30 14:34:05 +0200719 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
720 sha512_finish( &sha512, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000721
Paul Bakkerca4ab492012-04-18 14:23:57 +0000722 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000723 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
724
725 return;
726}
Paul Bakker769075d2012-11-24 11:26:46 +0100727#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000728
729/*
730 * SSLv3.0 MAC functions
731 */
Paul Bakker68884e32013-01-07 18:20:04 +0100732static void ssl_mac( md_context_t *md_ctx, unsigned char *secret,
733 unsigned char *buf, size_t len,
734 unsigned char *ctr, int type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000735{
736 unsigned char header[11];
737 unsigned char padding[48];
Paul Bakker68884e32013-01-07 18:20:04 +0100738 int padlen = 0;
739 int md_size = md_get_size( md_ctx->md_info );
740 int md_type = md_get_type( md_ctx->md_info );
741
742 if( md_type == POLARSSL_MD_MD5 )
743 padlen = 48;
744 else if( md_type == POLARSSL_MD_SHA1 )
745 padlen = 40;
746 else if( md_type == POLARSSL_MD_SHA256 )
747 padlen = 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000748
749 memcpy( header, ctr, 8 );
750 header[ 8] = (unsigned char) type;
751 header[ 9] = (unsigned char)( len >> 8 );
752 header[10] = (unsigned char)( len );
753
Paul Bakker68884e32013-01-07 18:20:04 +0100754 memset( padding, 0x36, padlen );
755 md_starts( md_ctx );
756 md_update( md_ctx, secret, md_size );
757 md_update( md_ctx, padding, padlen );
758 md_update( md_ctx, header, 11 );
759 md_update( md_ctx, buf, len );
760 md_finish( md_ctx, buf + len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000761
Paul Bakker68884e32013-01-07 18:20:04 +0100762 memset( padding, 0x5C, padlen );
763 md_starts( md_ctx );
764 md_update( md_ctx, secret, md_size );
765 md_update( md_ctx, padding, padlen );
766 md_update( md_ctx, buf + len, md_size );
767 md_finish( md_ctx, buf + len );
Paul Bakker5f70b252012-09-13 14:23:06 +0000768}
769
Paul Bakker5121ce52009-01-03 21:22:43 +0000770/*
771 * Encryption/decryption functions
Paul Bakkerf7abd422013-04-16 13:15:56 +0200772 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000773static int ssl_encrypt_buf( ssl_context *ssl )
774{
Paul Bakker23986e52011-04-24 08:57:21 +0000775 size_t i, padlen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000776
777 SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
778
779 /*
780 * Add MAC then encrypt
781 */
782 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
783 {
Paul Bakker68884e32013-01-07 18:20:04 +0100784 ssl_mac( &ssl->transform_out->md_ctx_enc,
785 ssl->transform_out->mac_enc,
786 ssl->out_msg, ssl->out_msglen,
787 ssl->out_ctr, ssl->out_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +0000788 }
789 else
790 {
Paul Bakker68884e32013-01-07 18:20:04 +0100791 md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 13 );
792 md_hmac_update( &ssl->transform_out->md_ctx_enc,
793 ssl->out_msg, ssl->out_msglen );
794 md_hmac_finish( &ssl->transform_out->md_ctx_enc,
795 ssl->out_msg + ssl->out_msglen );
796 md_hmac_reset( &ssl->transform_out->md_ctx_enc );
Paul Bakker5121ce52009-01-03 21:22:43 +0000797 }
798
799 SSL_DEBUG_BUF( 4, "computed mac",
Paul Bakker48916f92012-09-16 19:57:18 +0000800 ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000801
Paul Bakker48916f92012-09-16 19:57:18 +0000802 ssl->out_msglen += ssl->transform_out->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000803
Paul Bakker68884e32013-01-07 18:20:04 +0100804#if defined(POLARSSL_CIPHER_NULL_CIPHER)
805 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
806 {
807 padlen = 0;
808 }
809 else
810#endif /* POLARSSL_CIPHER_NULL_CIPHER */
811#if defined(POLARSSL_ARC4_C)
812 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000813 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000814 padlen = 0;
815
816 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
817 "including %d bytes of padding",
818 ssl->out_msglen, 0 ) );
819
820 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
821 ssl->out_msg, ssl->out_msglen );
822
Paul Bakker68884e32013-01-07 18:20:04 +0100823 arc4_crypt( (arc4_context *) ssl->transform_out->ctx_enc,
824 ssl->out_msglen, ssl->out_msg,
825 ssl->out_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +0000826 }
Paul Bakker68884e32013-01-07 18:20:04 +0100827 else
828#endif /* POLARSSL_ARC4_C */
829#if defined(POLARSSL_GCM_C)
830 if( ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
831 ssl->transform_out->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000832 {
833 size_t enc_msglen;
834 unsigned char *enc_msg;
835 unsigned char add_data[13];
836 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
837
838 padlen = 0;
839 enc_msglen = ssl->out_msglen;
840
841 memcpy( add_data, ssl->out_ctr, 8 );
842 add_data[8] = ssl->out_msgtype;
843 add_data[9] = ssl->major_ver;
844 add_data[10] = ssl->minor_ver;
845 add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
846 add_data[12] = ssl->out_msglen & 0xFF;
847
848 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
849 add_data, 13 );
850
Paul Bakker68884e32013-01-07 18:20:04 +0100851 /*
852 * Generate IV
853 */
854 ret = ssl->f_rng( ssl->p_rng,
Paul Bakker48916f92012-09-16 19:57:18 +0000855 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
Paul Bakker68884e32013-01-07 18:20:04 +0100856 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
857 if( ret != 0 )
858 return( ret );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000859
Paul Bakker68884e32013-01-07 18:20:04 +0100860 memcpy( ssl->out_iv,
861 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
862 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000863
Paul Bakker68884e32013-01-07 18:20:04 +0100864 /*
865 * Fix pointer positions and message length with added IV
866 */
867 enc_msg = ssl->out_msg;
868 enc_msglen = ssl->out_msglen;
869 ssl->out_msglen += ssl->transform_out->ivlen -
870 ssl->transform_out->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000871
Paul Bakker68884e32013-01-07 18:20:04 +0100872 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
873 "including %d bytes of padding",
874 ssl->out_msglen, 0 ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000875
Paul Bakker68884e32013-01-07 18:20:04 +0100876 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
877 ssl->out_msg, ssl->out_msglen );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000878
Paul Bakker68884e32013-01-07 18:20:04 +0100879 /*
880 * Adjust for tag
881 */
882 ssl->out_msglen += 16;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000883
Paul Bakker68884e32013-01-07 18:20:04 +0100884 gcm_crypt_and_tag( (gcm_context *) ssl->transform_out->ctx_enc,
885 GCM_ENCRYPT, enc_msglen,
886 ssl->transform_out->iv_enc, ssl->transform_out->ivlen,
887 add_data, 13,
888 enc_msg, enc_msg,
889 16, enc_msg + enc_msglen );
890
891 SSL_DEBUG_BUF( 4, "after encrypt: tag",
892 enc_msg + enc_msglen, 16 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000893 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000894 else
Paul Bakker68884e32013-01-07 18:20:04 +0100895#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +0000896 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000897 unsigned char *enc_msg;
Paul Bakker23986e52011-04-24 08:57:21 +0000898 size_t enc_msglen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000899
Paul Bakker48916f92012-09-16 19:57:18 +0000900 padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
901 ssl->transform_out->ivlen;
902 if( padlen == ssl->transform_out->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000903 padlen = 0;
904
905 for( i = 0; i <= padlen; i++ )
906 ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
907
908 ssl->out_msglen += padlen + 1;
909
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000910 enc_msglen = ssl->out_msglen;
911 enc_msg = ssl->out_msg;
912
913 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +0000914 * Prepend per-record IV for block cipher in TLS v1.1 and up as per
915 * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000916 */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000917 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000918 {
919 /*
920 * Generate IV
921 */
Paul Bakker48916f92012-09-16 19:57:18 +0000922 int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc,
923 ssl->transform_out->ivlen );
Paul Bakkera3d195c2011-11-27 21:07:34 +0000924 if( ret != 0 )
925 return( ret );
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000926
Paul Bakker92be97b2013-01-02 17:30:03 +0100927 memcpy( ssl->out_iv, ssl->transform_out->iv_enc,
Paul Bakker48916f92012-09-16 19:57:18 +0000928 ssl->transform_out->ivlen );
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000929
930 /*
931 * Fix pointer positions and message length with added IV
932 */
Paul Bakker92be97b2013-01-02 17:30:03 +0100933 enc_msg = ssl->out_msg;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000934 enc_msglen = ssl->out_msglen;
Paul Bakker48916f92012-09-16 19:57:18 +0000935 ssl->out_msglen += ssl->transform_out->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000936 }
937
Paul Bakker5121ce52009-01-03 21:22:43 +0000938 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000939 "including %d bytes of IV and %d bytes of padding",
Paul Bakker48916f92012-09-16 19:57:18 +0000940 ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000941
942 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
Paul Bakker92be97b2013-01-02 17:30:03 +0100943 ssl->out_iv, ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000944
Paul Bakker68884e32013-01-07 18:20:04 +0100945 switch( ssl->transform_out->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +0000946 {
Paul Bakker68884e32013-01-07 18:20:04 +0100947 case POLARSSL_CIPHER_DES_CBC:
948 des_crypt_cbc( (des_context *) ssl->transform_out->ctx_enc,
949 DES_ENCRYPT, enc_msglen,
950 ssl->transform_out->iv_enc, enc_msg, enc_msg );
951 break;
952
953 case POLARSSL_CIPHER_DES_EDE3_CBC:
954 des3_crypt_cbc( (des3_context *) ssl->transform_out->ctx_enc,
955 DES_ENCRYPT, enc_msglen,
956 ssl->transform_out->iv_enc, enc_msg, enc_msg );
957 break;
958
959 case POLARSSL_CIPHER_AES_128_CBC:
960 case POLARSSL_CIPHER_AES_256_CBC:
961 aes_crypt_cbc( (aes_context *) ssl->transform_out->ctx_enc,
962 AES_ENCRYPT, enc_msglen,
963 ssl->transform_out->iv_enc, enc_msg, enc_msg );
964 break;
965
966 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
967 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
968 camellia_crypt_cbc( (camellia_context *) ssl->transform_out->ctx_enc,
969 CAMELLIA_ENCRYPT, enc_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +0000970 ssl->transform_out->iv_enc, enc_msg, enc_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +0000971 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000972
973 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000974 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000975 }
976 }
977
Paul Bakkerca4ab492012-04-18 14:23:57 +0000978 for( i = 8; i > 0; i-- )
979 if( ++ssl->out_ctr[i - 1] != 0 )
980 break;
981
Paul Bakker5121ce52009-01-03 21:22:43 +0000982 SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
983
984 return( 0 );
985}
986
Paul Bakkerb7149bc2013-03-20 15:30:09 +0100987#define POLARSSL_SSL_MAX_MAC_SIZE 48
Paul Bakkerfab5c822012-02-06 16:45:10 +0000988
Paul Bakker5121ce52009-01-03 21:22:43 +0000989static int ssl_decrypt_buf( ssl_context *ssl )
990{
Paul Bakker45829992013-01-03 14:52:21 +0100991 size_t i, padlen = 0, correct = 1;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000992 unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
Paul Bakker5121ce52009-01-03 21:22:43 +0000993
994 SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
995
Paul Bakker48916f92012-09-16 19:57:18 +0000996 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000997 {
998 SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
Paul Bakker48916f92012-09-16 19:57:18 +0000999 ssl->in_msglen, ssl->transform_in->minlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001000 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001001 }
1002
Paul Bakker68884e32013-01-07 18:20:04 +01001003#if defined(POLARSSL_CIPHER_NULL_CIPHER)
1004 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001005 {
Paul Bakker68884e32013-01-07 18:20:04 +01001006 padlen = 0;
1007 }
1008 else
1009#endif /* POLARSSL_CIPHER_NULL_CIPHER */
Paul Bakker40e46942009-01-03 21:51:57 +00001010#if defined(POLARSSL_ARC4_C)
Paul Bakker68884e32013-01-07 18:20:04 +01001011 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
1012 {
1013 padlen = 0;
1014
1015 arc4_crypt( (arc4_context *) ssl->transform_in->ctx_dec,
Paul Bakkerbaad6502010-03-21 15:42:15 +00001016 ssl->in_msglen, ssl->in_msg,
1017 ssl->in_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001018 }
Paul Bakker68884e32013-01-07 18:20:04 +01001019 else
1020#endif /* POLARSSL_ARC4_C */
1021#if defined(POLARSSL_GCM_C)
1022 if( ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_128_GCM ||
1023 ssl->transform_in->ciphersuite_info->cipher == POLARSSL_CIPHER_AES_256_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001024 {
1025 unsigned char *dec_msg;
1026 unsigned char *dec_msg_result;
1027 size_t dec_msglen;
1028 unsigned char add_data[13];
1029 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1030
Paul Bakker68884e32013-01-07 18:20:04 +01001031 padlen = 0;
1032
1033 dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
1034 ssl->transform_in->fixed_ivlen );
1035 dec_msglen -= 16;
1036 dec_msg = ssl->in_msg;
1037 dec_msg_result = ssl->in_msg;
1038 ssl->in_msglen = dec_msglen;
1039
1040 memcpy( add_data, ssl->in_ctr, 8 );
1041 add_data[8] = ssl->in_msgtype;
1042 add_data[9] = ssl->major_ver;
1043 add_data[10] = ssl->minor_ver;
1044 add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
1045 add_data[12] = ssl->in_msglen & 0xFF;
1046
1047 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1048 add_data, 13 );
1049
1050 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
1051 ssl->in_iv,
1052 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
1053
1054 SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
1055 ssl->transform_in->ivlen );
1056 SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
1057
1058 ret = gcm_auth_decrypt( (gcm_context *) ssl->transform_in->ctx_dec,
1059 dec_msglen,
1060 ssl->transform_in->iv_dec,
1061 ssl->transform_in->ivlen,
1062 add_data, 13,
1063 dec_msg + dec_msglen, 16,
1064 dec_msg, dec_msg_result );
1065
1066 if( ret != 0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001067 {
Paul Bakker68884e32013-01-07 18:20:04 +01001068 SSL_DEBUG_MSG( 1, ( "AEAD decrypt failed on validation (ret = -0x%02x)",
1069 -ret ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001070
Paul Bakker68884e32013-01-07 18:20:04 +01001071 return( POLARSSL_ERR_SSL_INVALID_MAC );
1072 }
Paul Bakkerca4ab492012-04-18 14:23:57 +00001073 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001074 else
Paul Bakker68884e32013-01-07 18:20:04 +01001075#endif /* POLARSSL_GCM_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00001076 {
Paul Bakker45829992013-01-03 14:52:21 +01001077 /*
1078 * Decrypt and check the padding
1079 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001080 unsigned char *dec_msg;
1081 unsigned char *dec_msg_result;
Paul Bakker23986e52011-04-24 08:57:21 +00001082 size_t dec_msglen;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001083 size_t minlen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001084
Paul Bakker5121ce52009-01-03 21:22:43 +00001085 /*
Paul Bakker45829992013-01-03 14:52:21 +01001086 * Check immediate ciphertext sanity
Paul Bakker5121ce52009-01-03 21:22:43 +00001087 */
Paul Bakker48916f92012-09-16 19:57:18 +00001088 if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001089 {
1090 SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
Paul Bakker48916f92012-09-16 19:57:18 +00001091 ssl->in_msglen, ssl->transform_in->ivlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001092 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001093 }
1094
Paul Bakker45829992013-01-03 14:52:21 +01001095 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
1096 minlen += ssl->transform_in->ivlen;
1097
1098 if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
1099 ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
1100 {
1101 SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
1102 ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) );
1103 return( POLARSSL_ERR_SSL_INVALID_MAC );
1104 }
1105
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001106 dec_msglen = ssl->in_msglen;
1107 dec_msg = ssl->in_msg;
1108 dec_msg_result = ssl->in_msg;
1109
1110 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001111 * Initialize for prepended IV for block cipher in TLS v1.1 and up
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001112 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001113 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001114 {
Paul Bakker48916f92012-09-16 19:57:18 +00001115 dec_msglen -= ssl->transform_in->ivlen;
1116 ssl->in_msglen -= ssl->transform_in->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001117
Paul Bakker48916f92012-09-16 19:57:18 +00001118 for( i = 0; i < ssl->transform_in->ivlen; i++ )
Paul Bakker92be97b2013-01-02 17:30:03 +01001119 ssl->transform_in->iv_dec[i] = ssl->in_iv[i];
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001120 }
1121
Paul Bakker68884e32013-01-07 18:20:04 +01001122 switch( ssl->transform_in->ciphersuite_info->cipher )
Paul Bakker5121ce52009-01-03 21:22:43 +00001123 {
Paul Bakker68884e32013-01-07 18:20:04 +01001124 case POLARSSL_CIPHER_DES_CBC:
1125 des_crypt_cbc( (des_context *) ssl->transform_in->ctx_dec,
1126 DES_DECRYPT, dec_msglen,
1127 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
Paul Bakker5121ce52009-01-03 21:22:43 +00001128 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001129
Paul Bakker68884e32013-01-07 18:20:04 +01001130 case POLARSSL_CIPHER_DES_EDE3_CBC:
1131 des3_crypt_cbc( (des3_context *) ssl->transform_in->ctx_dec,
1132 DES_DECRYPT, dec_msglen,
1133 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1134 break;
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001135
Paul Bakker68884e32013-01-07 18:20:04 +01001136 case POLARSSL_CIPHER_AES_128_CBC:
1137 case POLARSSL_CIPHER_AES_256_CBC:
1138 aes_crypt_cbc( (aes_context *) ssl->transform_in->ctx_dec,
1139 AES_DECRYPT, dec_msglen,
1140 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1141 break;
1142
1143 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
1144 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
1145 camellia_crypt_cbc( (camellia_context *) ssl->transform_in->ctx_dec,
1146 CAMELLIA_DECRYPT, dec_msglen,
1147 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
1148 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001149
1150 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001151 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001152 }
1153
1154 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
Paul Bakker45829992013-01-03 14:52:21 +01001155
1156 if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
1157 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001158#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001159 SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
1160 ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001161#endif
Paul Bakker45829992013-01-03 14:52:21 +01001162 padlen = 0;
Paul Bakker45829992013-01-03 14:52:21 +01001163 correct = 0;
1164 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001165
1166 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1167 {
Paul Bakker48916f92012-09-16 19:57:18 +00001168 if( padlen > ssl->transform_in->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001169 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001170#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001171 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
1172 "should be no more than %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001173 padlen, ssl->transform_in->ivlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001174#endif
Paul Bakker45829992013-01-03 14:52:21 +01001175 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001176 }
1177 }
1178 else
1179 {
1180 /*
Paul Bakker45829992013-01-03 14:52:21 +01001181 * TLSv1+: always check the padding up to the first failure
1182 * and fake check up to 256 bytes of padding
Paul Bakker5121ce52009-01-03 21:22:43 +00001183 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001184 size_t pad_count = 0, fake_pad_count = 0;
1185 size_t padding_idx = ssl->in_msglen - padlen - 1;
1186
Paul Bakker5121ce52009-01-03 21:22:43 +00001187 for( i = 1; i <= padlen; i++ )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001188 pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1189
1190 for( ; i <= 256; i++ )
1191 fake_pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1192
1193 correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
1194 correct &= ( pad_count + fake_pad_count < 512 ); /* Always 1 */
1195
Paul Bakkerd66f0702013-01-31 16:57:45 +01001196#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001197 if( padlen > 0 && correct == 0)
1198 SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001199#endif
Paul Bakkere47b34b2013-02-27 14:48:00 +01001200 padlen &= correct * 0x1FF;
Paul Bakker5121ce52009-01-03 21:22:43 +00001201 }
1202 }
1203
1204 SSL_DEBUG_BUF( 4, "raw buffer after decryption",
1205 ssl->in_msg, ssl->in_msglen );
1206
1207 /*
1208 * Always compute the MAC (RFC4346, CBCTIME).
1209 */
Paul Bakker48916f92012-09-16 19:57:18 +00001210 ssl->in_msglen -= ( ssl->transform_in->maclen + padlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001211
1212 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1213 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1214
Paul Bakker45829992013-01-03 14:52:21 +01001215 memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001216
1217 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1218 {
Paul Bakker68884e32013-01-07 18:20:04 +01001219 ssl_mac( &ssl->transform_in->md_ctx_dec,
1220 ssl->transform_in->mac_dec,
1221 ssl->in_msg, ssl->in_msglen,
1222 ssl->in_ctr, ssl->in_msgtype );
Paul Bakker5121ce52009-01-03 21:22:43 +00001223 }
1224 else
1225 {
Paul Bakker45829992013-01-03 14:52:21 +01001226 /*
1227 * Process MAC and always update for padlen afterwards to make
1228 * total time independent of padlen
Paul Bakkere47b34b2013-02-27 14:48:00 +01001229 *
1230 * extra_run compensates MAC check for padlen
1231 *
1232 * Known timing attacks:
1233 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
1234 *
1235 * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
1236 * correctly. (We round down instead of up, so -56 is the correct
1237 * value for our calculations instead of -55)
Paul Bakker45829992013-01-03 14:52:21 +01001238 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001239 int j, extra_run = 0;
1240 extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
1241 ( 13 + ssl->in_msglen + 8 ) / 64;
1242
1243 extra_run &= correct * 0xFF;
1244
Paul Bakker68884e32013-01-07 18:20:04 +01001245 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 13 );
1246 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,
1247 ssl->in_msglen );
1248 md_hmac_finish( &ssl->transform_in->md_ctx_dec,
1249 ssl->in_msg + ssl->in_msglen );
1250 for( j = 0; j < extra_run; j++ )
1251 md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001252
Paul Bakker68884e32013-01-07 18:20:04 +01001253 md_hmac_reset( &ssl->transform_in->md_ctx_dec );
Paul Bakker5121ce52009-01-03 21:22:43 +00001254 }
1255
Paul Bakker48916f92012-09-16 19:57:18 +00001256 SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001257 SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001258 ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001259
1260 if( memcmp( tmp, ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001261 ssl->transform_in->maclen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001262 {
Paul Bakkere47b34b2013-02-27 14:48:00 +01001263#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001264 SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001265#endif
Paul Bakker45829992013-01-03 14:52:21 +01001266 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001267 }
1268
1269 /*
Paul Bakker45829992013-01-03 14:52:21 +01001270 * Finally check the correct flag
Paul Bakker5121ce52009-01-03 21:22:43 +00001271 */
Paul Bakker45829992013-01-03 14:52:21 +01001272 if( correct == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +00001273 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001274
1275 if( ssl->in_msglen == 0 )
1276 {
1277 ssl->nb_zero++;
1278
1279 /*
1280 * Three or more empty messages may be a DoS attack
1281 * (excessive CPU consumption).
1282 */
1283 if( ssl->nb_zero > 3 )
1284 {
1285 SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
1286 "messages, possible DoS attack" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001287 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001288 }
1289 }
1290 else
1291 ssl->nb_zero = 0;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001292
Paul Bakker23986e52011-04-24 08:57:21 +00001293 for( i = 8; i > 0; i-- )
1294 if( ++ssl->in_ctr[i - 1] != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001295 break;
1296
1297 SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
1298
1299 return( 0 );
1300}
1301
Paul Bakker2770fbd2012-07-03 13:30:23 +00001302#if defined(POLARSSL_ZLIB_SUPPORT)
1303/*
1304 * Compression/decompression functions
1305 */
1306static int ssl_compress_buf( ssl_context *ssl )
1307{
1308 int ret;
1309 unsigned char *msg_post = ssl->out_msg;
1310 size_t len_pre = ssl->out_msglen;
1311 unsigned char *msg_pre;
1312
1313 SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
1314
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001315 if( len_pre == 0 )
1316 return( 0 );
1317
Paul Bakker6e339b52013-07-03 13:37:05 +02001318 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001319 if( msg_pre == NULL )
1320 {
1321 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1322 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1323 }
1324
1325 memcpy( msg_pre, ssl->out_msg, len_pre );
1326
1327 SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
1328 ssl->out_msglen ) );
1329
1330 SSL_DEBUG_BUF( 4, "before compression: output payload",
1331 ssl->out_msg, ssl->out_msglen );
1332
Paul Bakker48916f92012-09-16 19:57:18 +00001333 ssl->transform_out->ctx_deflate.next_in = msg_pre;
1334 ssl->transform_out->ctx_deflate.avail_in = len_pre;
1335 ssl->transform_out->ctx_deflate.next_out = msg_post;
1336 ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001337
Paul Bakker48916f92012-09-16 19:57:18 +00001338 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001339 if( ret != Z_OK )
1340 {
1341 SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
1342 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1343 }
1344
Paul Bakker48916f92012-09-16 19:57:18 +00001345 ssl->out_msglen = SSL_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001346
Paul Bakker6e339b52013-07-03 13:37:05 +02001347 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001348
1349 SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
1350 ssl->out_msglen ) );
1351
1352 SSL_DEBUG_BUF( 4, "after compression: output payload",
1353 ssl->out_msg, ssl->out_msglen );
1354
1355 SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
1356
1357 return( 0 );
1358}
1359
1360static int ssl_decompress_buf( ssl_context *ssl )
1361{
1362 int ret;
1363 unsigned char *msg_post = ssl->in_msg;
1364 size_t len_pre = ssl->in_msglen;
1365 unsigned char *msg_pre;
1366
1367 SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
1368
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001369 if( len_pre == 0 )
1370 return( 0 );
1371
Paul Bakker6e339b52013-07-03 13:37:05 +02001372 msg_pre = (unsigned char*) polarssl_malloc( len_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001373 if( msg_pre == NULL )
1374 {
1375 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1376 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1377 }
1378
1379 memcpy( msg_pre, ssl->in_msg, len_pre );
1380
1381 SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
1382 ssl->in_msglen ) );
1383
1384 SSL_DEBUG_BUF( 4, "before decompression: input payload",
1385 ssl->in_msg, ssl->in_msglen );
1386
Paul Bakker48916f92012-09-16 19:57:18 +00001387 ssl->transform_in->ctx_inflate.next_in = msg_pre;
1388 ssl->transform_in->ctx_inflate.avail_in = len_pre;
1389 ssl->transform_in->ctx_inflate.next_out = msg_post;
1390 ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001391
Paul Bakker48916f92012-09-16 19:57:18 +00001392 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001393 if( ret != Z_OK )
1394 {
1395 SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
1396 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1397 }
1398
Paul Bakker48916f92012-09-16 19:57:18 +00001399 ssl->in_msglen = SSL_MAX_CONTENT_LEN - ssl->transform_in->ctx_inflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001400
Paul Bakker6e339b52013-07-03 13:37:05 +02001401 polarssl_free( msg_pre );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001402
1403 SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
1404 ssl->in_msglen ) );
1405
1406 SSL_DEBUG_BUF( 4, "after decompression: input payload",
1407 ssl->in_msg, ssl->in_msglen );
1408
1409 SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
1410
1411 return( 0 );
1412}
1413#endif /* POLARSSL_ZLIB_SUPPORT */
1414
Paul Bakker5121ce52009-01-03 21:22:43 +00001415/*
1416 * Fill the input message buffer
1417 */
Paul Bakker23986e52011-04-24 08:57:21 +00001418int ssl_fetch_input( ssl_context *ssl, size_t nb_want )
Paul Bakker5121ce52009-01-03 21:22:43 +00001419{
Paul Bakker23986e52011-04-24 08:57:21 +00001420 int ret;
1421 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001422
1423 SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
1424
1425 while( ssl->in_left < nb_want )
1426 {
1427 len = nb_want - ssl->in_left;
1428 ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
1429
1430 SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
1431 ssl->in_left, nb_want ) );
1432 SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
1433
Paul Bakker831a7552011-05-18 13:32:51 +00001434 if( ret == 0 )
1435 return( POLARSSL_ERR_SSL_CONN_EOF );
1436
Paul Bakker5121ce52009-01-03 21:22:43 +00001437 if( ret < 0 )
1438 return( ret );
1439
1440 ssl->in_left += ret;
1441 }
1442
1443 SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
1444
1445 return( 0 );
1446}
1447
1448/*
1449 * Flush any data not yet written
1450 */
1451int ssl_flush_output( ssl_context *ssl )
1452{
1453 int ret;
1454 unsigned char *buf;
1455
1456 SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
1457
1458 while( ssl->out_left > 0 )
1459 {
1460 SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
1461 5 + ssl->out_msglen, ssl->out_left ) );
1462
Paul Bakker5bd42292012-12-19 14:40:42 +01001463 buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
Paul Bakker5121ce52009-01-03 21:22:43 +00001464 ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
Paul Bakker186751d2012-05-08 13:16:14 +00001465
Paul Bakker5121ce52009-01-03 21:22:43 +00001466 SSL_DEBUG_RET( 2, "ssl->f_send", ret );
1467
1468 if( ret <= 0 )
1469 return( ret );
1470
1471 ssl->out_left -= ret;
1472 }
1473
1474 SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
1475
1476 return( 0 );
1477}
1478
1479/*
1480 * Record layer functions
1481 */
1482int ssl_write_record( ssl_context *ssl )
1483{
Paul Bakker05ef8352012-05-08 09:17:57 +00001484 int ret, done = 0;
Paul Bakker23986e52011-04-24 08:57:21 +00001485 size_t len = ssl->out_msglen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001486
1487 SSL_DEBUG_MSG( 2, ( "=> write record" ) );
1488
Paul Bakker5121ce52009-01-03 21:22:43 +00001489 if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
1490 {
1491 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
1492 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
1493 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
1494
Paul Bakker48916f92012-09-16 19:57:18 +00001495 ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001496 }
1497
Paul Bakker2770fbd2012-07-03 13:30:23 +00001498#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001499 if( ssl->transform_out != NULL &&
1500 ssl->session_out->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001501 {
1502 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
1503 {
1504 SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
1505 return( ret );
1506 }
1507
1508 len = ssl->out_msglen;
1509 }
1510#endif /*POLARSSL_ZLIB_SUPPORT */
1511
Paul Bakker05ef8352012-05-08 09:17:57 +00001512#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1513 if( ssl_hw_record_write != NULL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001514 {
Paul Bakker05ef8352012-05-08 09:17:57 +00001515 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001516
Paul Bakker05ef8352012-05-08 09:17:57 +00001517 ret = ssl_hw_record_write( ssl );
1518 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1519 {
1520 SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret );
1521 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1522 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001523
1524 if( ret == 0 )
1525 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001526 }
1527#endif
1528 if( !done )
1529 {
1530 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
1531 ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
1532 ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00001533 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1534 ssl->out_hdr[4] = (unsigned char)( len );
Paul Bakker05ef8352012-05-08 09:17:57 +00001535
Paul Bakker48916f92012-09-16 19:57:18 +00001536 if( ssl->transform_out != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001537 {
1538 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
1539 {
1540 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
1541 return( ret );
1542 }
1543
1544 len = ssl->out_msglen;
1545 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1546 ssl->out_hdr[4] = (unsigned char)( len );
1547 }
1548
1549 ssl->out_left = 5 + ssl->out_msglen;
1550
1551 SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
1552 "version = [%d:%d], msglen = %d",
1553 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
1554 ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
1555
1556 SSL_DEBUG_BUF( 4, "output record sent to network",
Paul Bakker5bd42292012-12-19 14:40:42 +01001557 ssl->out_hdr, 5 + ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001558 }
1559
Paul Bakker5121ce52009-01-03 21:22:43 +00001560 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1561 {
1562 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
1563 return( ret );
1564 }
1565
1566 SSL_DEBUG_MSG( 2, ( "<= write record" ) );
1567
1568 return( 0 );
1569}
1570
1571int ssl_read_record( ssl_context *ssl )
1572{
Paul Bakker05ef8352012-05-08 09:17:57 +00001573 int ret, done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001574
1575 SSL_DEBUG_MSG( 2, ( "=> read record" ) );
1576
Paul Bakker68884e32013-01-07 18:20:04 +01001577 SSL_DEBUG_BUF( 4, "input record from network",
1578 ssl->in_hdr, 5 + ssl->in_msglen );
1579
Paul Bakker5121ce52009-01-03 21:22:43 +00001580 if( ssl->in_hslen != 0 &&
1581 ssl->in_hslen < ssl->in_msglen )
1582 {
1583 /*
1584 * Get next Handshake message in the current record
1585 */
1586 ssl->in_msglen -= ssl->in_hslen;
1587
Paul Bakker8934a982011-08-05 11:11:53 +00001588 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
Paul Bakker48916f92012-09-16 19:57:18 +00001589 ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001590
1591 ssl->in_hslen = 4;
1592 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1593
1594 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1595 " %d, type = %d, hslen = %d",
1596 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1597
1598 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1599 {
1600 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001601 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001602 }
1603
1604 if( ssl->in_msglen < ssl->in_hslen )
1605 {
1606 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001607 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001608 }
1609
Paul Bakker48916f92012-09-16 19:57:18 +00001610 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001611
1612 return( 0 );
1613 }
1614
1615 ssl->in_hslen = 0;
1616
1617 /*
1618 * Read the record header and validate it
1619 */
1620 if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
1621 {
1622 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1623 return( ret );
1624 }
1625
1626 ssl->in_msgtype = ssl->in_hdr[0];
1627 ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
1628
1629 SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
1630 "version = [%d:%d], msglen = %d",
1631 ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
1632 ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
1633
1634 if( ssl->in_hdr[1] != ssl->major_ver )
1635 {
1636 SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001637 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001638 }
1639
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001640 if( ssl->in_hdr[2] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00001641 {
1642 SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001643 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001644 }
1645
1646 /*
1647 * Make sure the message length is acceptable
1648 */
Paul Bakker48916f92012-09-16 19:57:18 +00001649 if( ssl->transform_in == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001650 {
1651 if( ssl->in_msglen < 1 ||
1652 ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1653 {
1654 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001655 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001656 }
1657 }
1658 else
1659 {
Paul Bakker48916f92012-09-16 19:57:18 +00001660 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001661 {
1662 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001663 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001664 }
1665
1666 if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001667 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN )
Paul Bakker5121ce52009-01-03 21:22:43 +00001668 {
1669 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001670 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001671 }
1672
1673 /*
1674 * TLS encrypted messages can have up to 256 bytes of padding
1675 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001676 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001677 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN + 256 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001678 {
1679 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001680 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001681 }
1682 }
1683
1684 /*
1685 * Read and optionally decrypt the message contents
1686 */
1687 if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 )
1688 {
1689 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1690 return( ret );
1691 }
1692
1693 SSL_DEBUG_BUF( 4, "input record from network",
1694 ssl->in_hdr, 5 + ssl->in_msglen );
1695
Paul Bakker05ef8352012-05-08 09:17:57 +00001696#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1697 if( ssl_hw_record_read != NULL)
1698 {
1699 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) );
1700
1701 ret = ssl_hw_record_read( ssl );
1702 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1703 {
1704 SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret );
1705 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1706 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001707
1708 if( ret == 0 )
1709 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001710 }
1711#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001712 if( !done && ssl->transform_in != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001713 {
1714 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
1715 {
Paul Bakker40865c82013-01-31 17:13:13 +01001716#if defined(POLARSSL_SSL_ALERT_MESSAGES)
1717 if( ret == POLARSSL_ERR_SSL_INVALID_MAC )
1718 {
1719 ssl_send_alert_message( ssl,
1720 SSL_ALERT_LEVEL_FATAL,
1721 SSL_ALERT_MSG_BAD_RECORD_MAC );
1722 }
1723#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001724 SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
1725 return( ret );
1726 }
1727
1728 SSL_DEBUG_BUF( 4, "input payload after decrypt",
1729 ssl->in_msg, ssl->in_msglen );
1730
1731 if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1732 {
1733 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001734 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001735 }
1736 }
1737
Paul Bakker2770fbd2012-07-03 13:30:23 +00001738#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001739 if( ssl->transform_in != NULL &&
1740 ssl->session_in->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001741 {
1742 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
1743 {
1744 SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
1745 return( ret );
1746 }
1747
1748 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1749 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1750 }
1751#endif /* POLARSSL_ZLIB_SUPPORT */
1752
Paul Bakker0a925182012-04-16 06:46:41 +00001753 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE &&
1754 ssl->in_msgtype != SSL_MSG_ALERT &&
1755 ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC &&
1756 ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
1757 {
1758 SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
1759
Paul Bakker48916f92012-09-16 19:57:18 +00001760 if( ( ret = ssl_send_alert_message( ssl,
1761 SSL_ALERT_LEVEL_FATAL,
1762 SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
Paul Bakker0a925182012-04-16 06:46:41 +00001763 {
1764 return( ret );
1765 }
1766
1767 return( POLARSSL_ERR_SSL_INVALID_RECORD );
1768 }
1769
Paul Bakker5121ce52009-01-03 21:22:43 +00001770 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
1771 {
1772 ssl->in_hslen = 4;
1773 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1774
1775 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1776 " %d, type = %d, hslen = %d",
1777 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1778
1779 /*
1780 * Additional checks to validate the handshake header
1781 */
1782 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1783 {
1784 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001785 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001786 }
1787
1788 if( ssl->in_msglen < ssl->in_hslen )
1789 {
1790 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001791 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001792 }
1793
Paul Bakker48916f92012-09-16 19:57:18 +00001794 if( ssl->state != SSL_HANDSHAKE_OVER )
1795 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001796 }
1797
1798 if( ssl->in_msgtype == SSL_MSG_ALERT )
1799 {
1800 SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
1801 ssl->in_msg[0], ssl->in_msg[1] ) );
1802
1803 /*
1804 * Ignore non-fatal alerts, except close_notify
1805 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001806 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001807 {
Paul Bakker2770fbd2012-07-03 13:30:23 +00001808 SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
1809 ssl->in_msg[1] ) );
Paul Bakker9d781402011-05-09 16:17:09 +00001810 /**
1811 * Subtract from error code as ssl->in_msg[1] is 7-bit positive
1812 * error identifier.
1813 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00001814 return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001815 }
1816
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001817 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
1818 ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00001819 {
1820 SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001821 return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001822 }
1823 }
1824
1825 ssl->in_left = 0;
1826
1827 SSL_DEBUG_MSG( 2, ( "<= read record" ) );
1828
1829 return( 0 );
1830}
1831
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001832int ssl_send_fatal_handshake_failure( ssl_context *ssl )
1833{
1834 int ret;
1835
1836 if( ( ret = ssl_send_alert_message( ssl,
1837 SSL_ALERT_LEVEL_FATAL,
1838 SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
1839 {
1840 return( ret );
1841 }
1842
1843 return( 0 );
1844}
1845
Paul Bakker0a925182012-04-16 06:46:41 +00001846int ssl_send_alert_message( ssl_context *ssl,
1847 unsigned char level,
1848 unsigned char message )
1849{
1850 int ret;
1851
1852 SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
1853
1854 ssl->out_msgtype = SSL_MSG_ALERT;
1855 ssl->out_msglen = 2;
1856 ssl->out_msg[0] = level;
1857 ssl->out_msg[1] = message;
1858
1859 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1860 {
1861 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1862 return( ret );
1863 }
1864
1865 SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
1866
1867 return( 0 );
1868}
1869
Paul Bakker5121ce52009-01-03 21:22:43 +00001870/*
1871 * Handshake functions
1872 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001873#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1874 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1875 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001876int ssl_write_certificate( ssl_context *ssl )
1877{
Paul Bakkered27a042013-04-18 22:46:23 +02001878 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001879 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001880
1881 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1882
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001883 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1884 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001885 {
1886 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1887 ssl->state++;
1888 return( 0 );
1889 }
1890
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001891 return( ret );
1892}
1893
1894int ssl_parse_certificate( ssl_context *ssl )
1895{
1896 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1897 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1898
1899 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
1900
1901 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1902 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1903 {
1904 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
1905 ssl->state++;
1906 return( 0 );
1907 }
1908
1909 return( ret );
1910}
1911#else
1912int ssl_write_certificate( ssl_context *ssl )
1913{
1914 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1915 size_t i, n;
1916 const x509_cert *crt;
1917 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1918
1919 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1920
1921 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1922 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1923 {
1924 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1925 ssl->state++;
1926 return( 0 );
1927 }
1928
Paul Bakker5121ce52009-01-03 21:22:43 +00001929 if( ssl->endpoint == SSL_IS_CLIENT )
1930 {
1931 if( ssl->client_auth == 0 )
1932 {
1933 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1934 ssl->state++;
1935 return( 0 );
1936 }
1937
1938 /*
1939 * If using SSLv3 and got no cert, send an Alert message
1940 * (otherwise an empty Certificate message will be sent).
1941 */
1942 if( ssl->own_cert == NULL &&
1943 ssl->minor_ver == SSL_MINOR_VERSION_0 )
1944 {
1945 ssl->out_msglen = 2;
1946 ssl->out_msgtype = SSL_MSG_ALERT;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001947 ssl->out_msg[0] = SSL_ALERT_LEVEL_WARNING;
1948 ssl->out_msg[1] = SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00001949
1950 SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
1951 goto write_msg;
1952 }
1953 }
1954 else /* SSL_IS_SERVER */
1955 {
1956 if( ssl->own_cert == NULL )
1957 {
1958 SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001959 return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001960 }
1961 }
1962
1963 SSL_DEBUG_CRT( 3, "own certificate", ssl->own_cert );
1964
1965 /*
1966 * 0 . 0 handshake type
1967 * 1 . 3 handshake length
1968 * 4 . 6 length of all certs
1969 * 7 . 9 length of cert. 1
1970 * 10 . n-1 peer certificate
1971 * n . n+2 length of cert. 2
1972 * n+3 . ... upper level cert, etc.
1973 */
1974 i = 7;
1975 crt = ssl->own_cert;
1976
Paul Bakker29087132010-03-21 21:03:34 +00001977 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001978 {
1979 n = crt->raw.len;
1980 if( i + 3 + n > SSL_MAX_CONTENT_LEN )
1981 {
1982 SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
1983 i + 3 + n, SSL_MAX_CONTENT_LEN ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001984 return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001985 }
1986
1987 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
1988 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
1989 ssl->out_msg[i + 2] = (unsigned char)( n );
1990
1991 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
1992 i += n; crt = crt->next;
1993 }
1994
1995 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
1996 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
1997 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
1998
1999 ssl->out_msglen = i;
2000 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2001 ssl->out_msg[0] = SSL_HS_CERTIFICATE;
2002
2003write_msg:
2004
2005 ssl->state++;
2006
2007 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2008 {
2009 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2010 return( ret );
2011 }
2012
2013 SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
2014
Paul Bakkered27a042013-04-18 22:46:23 +02002015 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002016}
2017
2018int ssl_parse_certificate( ssl_context *ssl )
2019{
Paul Bakkered27a042013-04-18 22:46:23 +02002020 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker23986e52011-04-24 08:57:21 +00002021 size_t i, n;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002022 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002023
2024 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2025
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002026 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2027 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002028 {
2029 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2030 ssl->state++;
2031 return( 0 );
2032 }
2033
Paul Bakker5121ce52009-01-03 21:22:43 +00002034 if( ssl->endpoint == SSL_IS_SERVER &&
2035 ssl->authmode == SSL_VERIFY_NONE )
2036 {
Paul Bakkercdf07e92011-01-30 17:05:13 +00002037 ssl->verify_result = BADCERT_SKIP_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00002038 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2039 ssl->state++;
2040 return( 0 );
2041 }
2042
2043 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2044 {
2045 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2046 return( ret );
2047 }
2048
2049 ssl->state++;
2050
2051 /*
2052 * Check if the client sent an empty certificate
2053 */
2054 if( ssl->endpoint == SSL_IS_SERVER &&
2055 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2056 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002057 if( ssl->in_msglen == 2 &&
2058 ssl->in_msgtype == SSL_MSG_ALERT &&
2059 ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2060 ssl->in_msg[1] == SSL_ALERT_MSG_NO_CERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002061 {
2062 SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2063
Paul Bakkercdf07e92011-01-30 17:05:13 +00002064 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002065 if( ssl->authmode == SSL_VERIFY_OPTIONAL )
2066 return( 0 );
2067 else
Paul Bakker40e46942009-01-03 21:51:57 +00002068 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002069 }
2070 }
2071
2072 if( ssl->endpoint == SSL_IS_SERVER &&
2073 ssl->minor_ver != SSL_MINOR_VERSION_0 )
2074 {
2075 if( ssl->in_hslen == 7 &&
2076 ssl->in_msgtype == SSL_MSG_HANDSHAKE &&
2077 ssl->in_msg[0] == SSL_HS_CERTIFICATE &&
2078 memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
2079 {
2080 SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2081
Paul Bakkercdf07e92011-01-30 17:05:13 +00002082 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002083 if( ssl->authmode == SSL_VERIFY_REQUIRED )
Paul Bakker40e46942009-01-03 21:51:57 +00002084 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002085 else
2086 return( 0 );
2087 }
2088 }
2089
2090 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2091 {
2092 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002093 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002094 }
2095
2096 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
2097 {
2098 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002099 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002100 }
2101
2102 /*
2103 * Same message structure as in ssl_write_certificate()
2104 */
2105 n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
2106
2107 if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
2108 {
2109 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002110 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002111 }
2112
Paul Bakker6e339b52013-07-03 13:37:05 +02002113 if( ( ssl->session_negotiate->peer_cert = (x509_cert *) polarssl_malloc(
Paul Bakker5121ce52009-01-03 21:22:43 +00002114 sizeof( x509_cert ) ) ) == NULL )
2115 {
2116 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
2117 sizeof( x509_cert ) ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002118 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002119 }
2120
Paul Bakker48916f92012-09-16 19:57:18 +00002121 memset( ssl->session_negotiate->peer_cert, 0, sizeof( x509_cert ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002122
2123 i = 7;
2124
2125 while( i < ssl->in_hslen )
2126 {
2127 if( ssl->in_msg[i] != 0 )
2128 {
2129 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002130 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002131 }
2132
2133 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2134 | (unsigned int) ssl->in_msg[i + 2];
2135 i += 3;
2136
2137 if( n < 128 || i + n > ssl->in_hslen )
2138 {
2139 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002140 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002141 }
2142
Paul Bakker89ecb2d2013-06-24 19:06:15 +02002143 ret = x509parse_crt_der( ssl->session_negotiate->peer_cert,
2144 ssl->in_msg + i, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002145 if( ret != 0 )
2146 {
2147 SSL_DEBUG_RET( 1, " x509parse_crt", ret );
2148 return( ret );
2149 }
2150
2151 i += n;
2152 }
2153
Paul Bakker48916f92012-09-16 19:57:18 +00002154 SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00002155
2156 if( ssl->authmode != SSL_VERIFY_NONE )
2157 {
2158 if( ssl->ca_chain == NULL )
2159 {
2160 SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002161 return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002162 }
2163
Paul Bakker48916f92012-09-16 19:57:18 +00002164 ret = x509parse_verify( ssl->session_negotiate->peer_cert,
2165 ssl->ca_chain, ssl->ca_crl,
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002166 ssl->peer_cn, &ssl->verify_result,
2167 ssl->f_vrfy, ssl->p_vrfy );
Paul Bakker5121ce52009-01-03 21:22:43 +00002168
2169 if( ret != 0 )
2170 SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2171
2172 if( ssl->authmode != SSL_VERIFY_REQUIRED )
2173 ret = 0;
2174 }
2175
2176 SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
2177
2178 return( ret );
2179}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002180#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2181 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2182 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002183
2184int ssl_write_change_cipher_spec( ssl_context *ssl )
2185{
2186 int ret;
2187
2188 SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
2189
2190 ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
2191 ssl->out_msglen = 1;
2192 ssl->out_msg[0] = 1;
2193
Paul Bakker5121ce52009-01-03 21:22:43 +00002194 ssl->state++;
2195
2196 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2197 {
2198 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2199 return( ret );
2200 }
2201
2202 SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
2203
2204 return( 0 );
2205}
2206
2207int ssl_parse_change_cipher_spec( ssl_context *ssl )
2208{
2209 int ret;
2210
2211 SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
2212
Paul Bakker5121ce52009-01-03 21:22:43 +00002213 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2214 {
2215 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2216 return( ret );
2217 }
2218
2219 if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
2220 {
2221 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002222 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002223 }
2224
2225 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
2226 {
2227 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002228 return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
Paul Bakker5121ce52009-01-03 21:22:43 +00002229 }
2230
2231 ssl->state++;
2232
2233 SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
2234
2235 return( 0 );
2236}
2237
Paul Bakker41c83d32013-03-20 14:39:14 +01002238void ssl_optimize_checksum( ssl_context *ssl,
2239 const ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00002240{
Paul Bakker9e36f042013-06-30 14:34:05 +02002241#if !defined(POLARSSL_SHA512_C)
Paul Bakker769075d2012-11-24 11:26:46 +01002242 ((void) ciphersuite);
2243#endif
2244
Paul Bakker380da532012-04-18 16:10:25 +00002245 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00002246 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker9e36f042013-06-30 14:34:05 +02002247#if defined(POLARSSL_SHA512_C)
Paul Bakkerb7149bc2013-03-20 15:30:09 +01002248 else if( ciphersuite_info->mac == POLARSSL_MD_SHA384 )
Paul Bakker380da532012-04-18 16:10:25 +00002249 {
Paul Bakker48916f92012-09-16 19:57:18 +00002250 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
Paul Bakker380da532012-04-18 16:10:25 +00002251 }
Paul Bakker769075d2012-11-24 11:26:46 +01002252#endif
Paul Bakker380da532012-04-18 16:10:25 +00002253 else
Paul Bakker48916f92012-09-16 19:57:18 +00002254 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakker380da532012-04-18 16:10:25 +00002255}
Paul Bakkerf7abd422013-04-16 13:15:56 +02002256
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002257static void ssl_update_checksum_start( ssl_context *ssl,
2258 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002259{
Paul Bakker48916f92012-09-16 19:57:18 +00002260 md5_update( &ssl->handshake->fin_md5 , buf, len );
2261 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker9e36f042013-06-30 14:34:05 +02002262 sha256_update( &ssl->handshake->fin_sha256, buf, len );
2263#if defined(POLARSSL_SHA512_C)
2264 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002265#endif
Paul Bakker380da532012-04-18 16:10:25 +00002266}
2267
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002268static void ssl_update_checksum_md5sha1( ssl_context *ssl,
2269 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002270{
Paul Bakker48916f92012-09-16 19:57:18 +00002271 md5_update( &ssl->handshake->fin_md5 , buf, len );
2272 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002273}
2274
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002275static void ssl_update_checksum_sha256( ssl_context *ssl,
2276 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002277{
Paul Bakker9e36f042013-06-30 14:34:05 +02002278 sha256_update( &ssl->handshake->fin_sha256, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002279}
2280
Paul Bakker9e36f042013-06-30 14:34:05 +02002281#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002282static void ssl_update_checksum_sha384( ssl_context *ssl,
2283 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002284{
Paul Bakker9e36f042013-06-30 14:34:05 +02002285 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002286}
Paul Bakker769075d2012-11-24 11:26:46 +01002287#endif
Paul Bakker380da532012-04-18 16:10:25 +00002288
Paul Bakker1ef83d62012-04-11 12:09:53 +00002289static void ssl_calc_finished_ssl(
2290 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002291{
Paul Bakker3c2122f2013-06-24 19:03:14 +02002292 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002293 md5_context md5;
2294 sha1_context sha1;
2295
Paul Bakker5121ce52009-01-03 21:22:43 +00002296 unsigned char padbuf[48];
2297 unsigned char md5sum[16];
2298 unsigned char sha1sum[20];
2299
Paul Bakker48916f92012-09-16 19:57:18 +00002300 ssl_session *session = ssl->session_negotiate;
2301 if( !session )
2302 session = ssl->session;
2303
Paul Bakker1ef83d62012-04-11 12:09:53 +00002304 SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
2305
Paul Bakker48916f92012-09-16 19:57:18 +00002306 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2307 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002308
2309 /*
2310 * SSLv3:
2311 * hash =
2312 * MD5( master + pad2 +
2313 * MD5( handshake + sender + master + pad1 ) )
2314 * + SHA1( master + pad2 +
2315 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002316 */
2317
Paul Bakker90995b52013-06-24 19:20:35 +02002318#if !defined(POLARSSL_MD5_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002319 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002320 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002321#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002322
Paul Bakker90995b52013-06-24 19:20:35 +02002323#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002324 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002325 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002326#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002327
Paul Bakker3c2122f2013-06-24 19:03:14 +02002328 sender = ( from == SSL_IS_CLIENT ) ? "CLNT"
2329 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00002330
Paul Bakker1ef83d62012-04-11 12:09:53 +00002331 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002332
Paul Bakker3c2122f2013-06-24 19:03:14 +02002333 md5_update( &md5, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002334 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002335 md5_update( &md5, padbuf, 48 );
2336 md5_finish( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002337
Paul Bakker3c2122f2013-06-24 19:03:14 +02002338 sha1_update( &sha1, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002339 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002340 sha1_update( &sha1, padbuf, 40 );
2341 sha1_finish( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002342
Paul Bakker1ef83d62012-04-11 12:09:53 +00002343 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002344
Paul Bakker1ef83d62012-04-11 12:09:53 +00002345 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +00002346 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002347 md5_update( &md5, padbuf, 48 );
2348 md5_update( &md5, md5sum, 16 );
2349 md5_finish( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00002350
Paul Bakker1ef83d62012-04-11 12:09:53 +00002351 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +00002352 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002353 sha1_update( &sha1, padbuf , 40 );
2354 sha1_update( &sha1, sha1sum, 20 );
2355 sha1_finish( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002356
Paul Bakker1ef83d62012-04-11 12:09:53 +00002357 SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002358
Paul Bakker1ef83d62012-04-11 12:09:53 +00002359 memset( &md5, 0, sizeof( md5_context ) );
2360 memset( &sha1, 0, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002361
2362 memset( padbuf, 0, sizeof( padbuf ) );
2363 memset( md5sum, 0, sizeof( md5sum ) );
2364 memset( sha1sum, 0, sizeof( sha1sum ) );
2365
2366 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2367}
2368
Paul Bakker1ef83d62012-04-11 12:09:53 +00002369static void ssl_calc_finished_tls(
2370 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002371{
Paul Bakker1ef83d62012-04-11 12:09:53 +00002372 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002373 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002374 md5_context md5;
Paul Bakker5121ce52009-01-03 21:22:43 +00002375 sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002376 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00002377
Paul Bakker48916f92012-09-16 19:57:18 +00002378 ssl_session *session = ssl->session_negotiate;
2379 if( !session )
2380 session = ssl->session;
2381
Paul Bakker1ef83d62012-04-11 12:09:53 +00002382 SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002383
Paul Bakker48916f92012-09-16 19:57:18 +00002384 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2385 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002386
Paul Bakker1ef83d62012-04-11 12:09:53 +00002387 /*
2388 * TLSv1:
2389 * hash = PRF( master, finished_label,
2390 * MD5( handshake ) + SHA1( handshake ) )[0..11]
2391 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002392
Paul Bakker90995b52013-06-24 19:20:35 +02002393#if !defined(POLARSSL_MD5_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002394 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
2395 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002396#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002397
Paul Bakker90995b52013-06-24 19:20:35 +02002398#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002399 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
2400 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002401#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002402
2403 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002404 ? "client finished"
2405 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002406
2407 md5_finish( &md5, padbuf );
2408 sha1_finish( &sha1, padbuf + 16 );
2409
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002410 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002411 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002412
2413 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2414
2415 memset( &md5, 0, sizeof( md5_context ) );
2416 memset( &sha1, 0, sizeof( sha1_context ) );
2417
2418 memset( padbuf, 0, sizeof( padbuf ) );
2419
2420 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2421}
2422
Paul Bakkerca4ab492012-04-18 14:23:57 +00002423static void ssl_calc_finished_tls_sha256(
Paul Bakker1ef83d62012-04-11 12:09:53 +00002424 ssl_context *ssl, unsigned char *buf, int from )
2425{
2426 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002427 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002428 sha256_context sha256;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002429 unsigned char padbuf[32];
2430
Paul Bakker48916f92012-09-16 19:57:18 +00002431 ssl_session *session = ssl->session_negotiate;
2432 if( !session )
2433 session = ssl->session;
2434
Paul Bakker380da532012-04-18 16:10:25 +00002435 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002436
Paul Bakker9e36f042013-06-30 14:34:05 +02002437 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002438
2439 /*
2440 * TLSv1.2:
2441 * hash = PRF( master, finished_label,
2442 * Hash( handshake ) )[0.11]
2443 */
2444
Paul Bakker9e36f042013-06-30 14:34:05 +02002445#if !defined(POLARSSL_SHA256_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002446 SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
Paul Bakker9e36f042013-06-30 14:34:05 +02002447 sha256.state, sizeof( sha256.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002448#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002449
2450 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002451 ? "client finished"
2452 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002453
Paul Bakker9e36f042013-06-30 14:34:05 +02002454 sha256_finish( &sha256, padbuf );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002455
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002456 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002457 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002458
2459 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2460
Paul Bakker9e36f042013-06-30 14:34:05 +02002461 memset( &sha256, 0, sizeof( sha256_context ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002462
2463 memset( padbuf, 0, sizeof( padbuf ) );
2464
2465 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2466}
2467
Paul Bakker9e36f042013-06-30 14:34:05 +02002468#if defined(POLARSSL_SHA512_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002469static void ssl_calc_finished_tls_sha384(
2470 ssl_context *ssl, unsigned char *buf, int from )
2471{
2472 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002473 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002474 sha512_context sha512;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002475 unsigned char padbuf[48];
2476
Paul Bakker48916f92012-09-16 19:57:18 +00002477 ssl_session *session = ssl->session_negotiate;
2478 if( !session )
2479 session = ssl->session;
2480
Paul Bakker380da532012-04-18 16:10:25 +00002481 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002482
Paul Bakker9e36f042013-06-30 14:34:05 +02002483 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002484
2485 /*
2486 * TLSv1.2:
2487 * hash = PRF( master, finished_label,
2488 * Hash( handshake ) )[0.11]
2489 */
2490
Paul Bakker9e36f042013-06-30 14:34:05 +02002491#if !defined(POLARSSL_SHA512_ALT)
2492 SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
2493 sha512.state, sizeof( sha512.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002494#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002495
2496 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002497 ? "client finished"
2498 : "server finished";
Paul Bakkerca4ab492012-04-18 14:23:57 +00002499
Paul Bakker9e36f042013-06-30 14:34:05 +02002500 sha512_finish( &sha512, padbuf );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002501
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002502 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002503 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002504
2505 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2506
Paul Bakker9e36f042013-06-30 14:34:05 +02002507 memset( &sha512, 0, sizeof( sha512_context ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002508
2509 memset( padbuf, 0, sizeof( padbuf ) );
2510
2511 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2512}
Paul Bakker769075d2012-11-24 11:26:46 +01002513#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002514
Paul Bakker48916f92012-09-16 19:57:18 +00002515void ssl_handshake_wrapup( ssl_context *ssl )
2516{
2517 SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
2518
2519 /*
2520 * Free our handshake params
2521 */
2522 ssl_handshake_free( ssl->handshake );
Paul Bakker6e339b52013-07-03 13:37:05 +02002523 polarssl_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00002524 ssl->handshake = NULL;
2525
2526 /*
2527 * Switch in our now active transform context
2528 */
2529 if( ssl->transform )
2530 {
2531 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002532 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002533 }
2534 ssl->transform = ssl->transform_negotiate;
2535 ssl->transform_negotiate = NULL;
2536
Paul Bakker0a597072012-09-25 21:55:46 +00002537 if( ssl->session )
2538 {
2539 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002540 polarssl_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00002541 }
2542 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00002543 ssl->session_negotiate = NULL;
2544
Paul Bakker0a597072012-09-25 21:55:46 +00002545 /*
2546 * Add cache entry
2547 */
2548 if( ssl->f_set_cache != NULL )
2549 if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 )
2550 SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
2551
Paul Bakker48916f92012-09-16 19:57:18 +00002552 ssl->state++;
2553
2554 SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
2555}
2556
Paul Bakker1ef83d62012-04-11 12:09:53 +00002557int ssl_write_finished( ssl_context *ssl )
2558{
2559 int ret, hash_len;
2560
2561 SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
2562
Paul Bakker92be97b2013-01-02 17:30:03 +01002563 /*
2564 * Set the out_msg pointer to the correct location based on IV length
2565 */
2566 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2567 {
2568 ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -
2569 ssl->transform_negotiate->fixed_ivlen;
2570 }
2571 else
2572 ssl->out_msg = ssl->out_iv;
2573
Paul Bakker48916f92012-09-16 19:57:18 +00002574 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002575
2576 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002577 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2578
Paul Bakker48916f92012-09-16 19:57:18 +00002579 ssl->verify_data_len = hash_len;
2580 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
2581
Paul Bakker5121ce52009-01-03 21:22:43 +00002582 ssl->out_msglen = 4 + hash_len;
2583 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2584 ssl->out_msg[0] = SSL_HS_FINISHED;
2585
2586 /*
2587 * In case of session resuming, invert the client and server
2588 * ChangeCipherSpec messages order.
2589 */
Paul Bakker0a597072012-09-25 21:55:46 +00002590 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002591 {
2592 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker48916f92012-09-16 19:57:18 +00002593 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002594 else
2595 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2596 }
2597 else
2598 ssl->state++;
2599
Paul Bakker48916f92012-09-16 19:57:18 +00002600 /*
2601 * Switch to our negotiated transform and session parameters for outbound data.
2602 */
2603 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
2604 ssl->transform_out = ssl->transform_negotiate;
2605 ssl->session_out = ssl->session_negotiate;
2606 memset( ssl->out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002607
Paul Bakker07eb38b2012-12-19 14:42:06 +01002608#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2609 if( ssl_hw_record_activate != NULL)
2610 {
2611 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
2612 {
2613 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2614 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2615 }
2616 }
2617#endif
2618
Paul Bakker5121ce52009-01-03 21:22:43 +00002619 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2620 {
2621 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2622 return( ret );
2623 }
2624
2625 SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
2626
2627 return( 0 );
2628}
2629
2630int ssl_parse_finished( ssl_context *ssl )
2631{
Paul Bakker23986e52011-04-24 08:57:21 +00002632 int ret;
2633 unsigned int hash_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002634 unsigned char buf[36];
2635
2636 SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
2637
Paul Bakker48916f92012-09-16 19:57:18 +00002638 ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002639
Paul Bakker48916f92012-09-16 19:57:18 +00002640 /*
2641 * Switch to our negotiated transform and session parameters for inbound data.
2642 */
2643 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
2644 ssl->transform_in = ssl->transform_negotiate;
2645 ssl->session_in = ssl->session_negotiate;
2646 memset( ssl->in_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002647
Paul Bakker92be97b2013-01-02 17:30:03 +01002648 /*
2649 * Set the in_msg pointer to the correct location based on IV length
2650 */
2651 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
2652 {
2653 ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -
2654 ssl->transform_negotiate->fixed_ivlen;
2655 }
2656 else
2657 ssl->in_msg = ssl->in_iv;
2658
Paul Bakker07eb38b2012-12-19 14:42:06 +01002659#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2660 if( ssl_hw_record_activate != NULL)
2661 {
2662 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_INBOUND ) ) != 0 )
2663 {
2664 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2665 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2666 }
2667 }
2668#endif
2669
Paul Bakker5121ce52009-01-03 21:22:43 +00002670 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2671 {
2672 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2673 return( ret );
2674 }
2675
2676 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2677 {
2678 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002679 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002680 }
2681
Paul Bakker1ef83d62012-04-11 12:09:53 +00002682 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002683 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2684
2685 if( ssl->in_msg[0] != SSL_HS_FINISHED ||
2686 ssl->in_hslen != 4 + hash_len )
2687 {
2688 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002689 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002690 }
2691
Paul Bakker5121ce52009-01-03 21:22:43 +00002692 if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
2693 {
2694 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002695 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002696 }
2697
Paul Bakker48916f92012-09-16 19:57:18 +00002698 ssl->verify_data_len = hash_len;
2699 memcpy( ssl->peer_verify_data, buf, hash_len );
2700
Paul Bakker0a597072012-09-25 21:55:46 +00002701 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002702 {
2703 if( ssl->endpoint == SSL_IS_CLIENT )
2704 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2705
2706 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker48916f92012-09-16 19:57:18 +00002707 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002708 }
2709 else
2710 ssl->state++;
2711
2712 SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
2713
2714 return( 0 );
2715}
2716
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002717static int ssl_handshake_init( ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00002718{
2719 if( ssl->transform_negotiate )
2720 ssl_transform_free( ssl->transform_negotiate );
2721 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002722 ssl->transform_negotiate = polarssl_malloc( sizeof(ssl_transform) );
Paul Bakker48916f92012-09-16 19:57:18 +00002723
2724 if( ssl->session_negotiate )
2725 ssl_session_free( ssl->session_negotiate );
2726 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002727 ssl->session_negotiate = polarssl_malloc( sizeof(ssl_session) );
Paul Bakker48916f92012-09-16 19:57:18 +00002728
2729 if( ssl->handshake )
2730 ssl_handshake_free( ssl->handshake );
2731 else
Paul Bakker6e339b52013-07-03 13:37:05 +02002732 ssl->handshake = polarssl_malloc( sizeof(ssl_handshake_params) );
Paul Bakker48916f92012-09-16 19:57:18 +00002733
2734 if( ssl->handshake == NULL ||
2735 ssl->transform_negotiate == NULL ||
2736 ssl->session_negotiate == NULL )
2737 {
2738 SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) );
2739 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2740 }
2741
2742 memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
2743 memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
2744 memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
2745
2746 md5_starts( &ssl->handshake->fin_md5 );
2747 sha1_starts( &ssl->handshake->fin_sha1 );
Paul Bakker9e36f042013-06-30 14:34:05 +02002748 sha256_starts( &ssl->handshake->fin_sha256, 0 );
2749#if defined(POLARSSL_SHA512_C)
2750 sha512_starts( &ssl->handshake->fin_sha512, 1 );
Paul Bakker769075d2012-11-24 11:26:46 +01002751#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002752
2753 ssl->handshake->update_checksum = ssl_update_checksum_start;
Paul Bakker23f36802012-09-28 14:15:14 +00002754 ssl->handshake->sig_alg = SSL_HASH_SHA1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002755
Paul Bakker61d113b2013-07-04 11:51:43 +02002756#if defined(POLARSSL_ECDH_C)
2757 ecdh_init( &ssl->handshake->ecdh_ctx );
2758#endif
2759
Paul Bakker48916f92012-09-16 19:57:18 +00002760 return( 0 );
2761}
2762
Paul Bakker5121ce52009-01-03 21:22:43 +00002763/*
2764 * Initialize an SSL context
2765 */
2766int ssl_init( ssl_context *ssl )
2767{
Paul Bakker48916f92012-09-16 19:57:18 +00002768 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002769 int len = SSL_BUFFER_LEN;
2770
2771 memset( ssl, 0, sizeof( ssl_context ) );
2772
Paul Bakker62f2dee2012-09-28 07:31:51 +00002773 /*
2774 * Sane defaults
2775 */
Paul Bakkered27a042013-04-18 22:46:23 +02002776#if defined(POLARSSL_RSA_C)
Paul Bakkereb2c6582012-09-27 19:15:01 +00002777 ssl->rsa_decrypt = ssl_rsa_decrypt;
2778 ssl->rsa_sign = ssl_rsa_sign;
2779 ssl->rsa_key_len = ssl_rsa_key_len;
Paul Bakkered27a042013-04-18 22:46:23 +02002780#endif
Paul Bakkereb2c6582012-09-27 19:15:01 +00002781
Paul Bakker1d29fb52012-09-28 13:28:45 +00002782 ssl->min_major_ver = SSL_MAJOR_VERSION_3;
2783 ssl->min_minor_ver = SSL_MINOR_VERSION_0;
Paul Bakker2fbefde2013-06-29 16:01:15 +02002784 ssl->max_major_ver = SSL_MAJOR_VERSION_3;
2785 ssl->max_minor_ver = SSL_MINOR_VERSION_3;
Paul Bakker1d29fb52012-09-28 13:28:45 +00002786
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002787 ssl_set_ciphersuites( ssl, ssl_list_ciphersuites() );
Paul Bakker645ce3a2012-10-31 12:32:41 +00002788
Paul Bakker62f2dee2012-09-28 07:31:51 +00002789#if defined(POLARSSL_DHM_C)
2790 if( ( ret = mpi_read_string( &ssl->dhm_P, 16,
2791 POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 ||
2792 ( ret = mpi_read_string( &ssl->dhm_G, 16,
2793 POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 )
2794 {
2795 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
2796 return( ret );
2797 }
2798#endif
2799
2800 /*
2801 * Prepare base structures
2802 */
Paul Bakker6e339b52013-07-03 13:37:05 +02002803 ssl->in_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00002804 ssl->in_hdr = ssl->in_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002805 ssl->in_iv = ssl->in_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002806 ssl->in_msg = ssl->in_ctr + 13;
2807
2808 if( ssl->in_ctr == NULL )
2809 {
2810 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002811 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002812 }
2813
Paul Bakker6e339b52013-07-03 13:37:05 +02002814 ssl->out_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00002815 ssl->out_hdr = ssl->out_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01002816 ssl->out_iv = ssl->out_ctr + 13;
Paul Bakker5bd42292012-12-19 14:40:42 +01002817 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002818
2819 if( ssl->out_ctr == NULL )
2820 {
2821 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker6e339b52013-07-03 13:37:05 +02002822 polarssl_free( ssl-> in_ctr );
Paul Bakker69e095c2011-12-10 21:55:01 +00002823 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002824 }
2825
2826 memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
2827 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2828
2829 ssl->hostname = NULL;
2830 ssl->hostname_len = 0;
2831
Paul Bakker48916f92012-09-16 19:57:18 +00002832 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2833 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002834
2835 return( 0 );
2836}
2837
2838/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00002839 * Reset an initialized and used SSL context for re-use while retaining
2840 * all application-set variables, function pointers and data.
2841 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00002842int ssl_session_reset( ssl_context *ssl )
Paul Bakker7eb013f2011-10-06 12:37:39 +00002843{
Paul Bakker48916f92012-09-16 19:57:18 +00002844 int ret;
2845
Paul Bakker7eb013f2011-10-06 12:37:39 +00002846 ssl->state = SSL_HELLO_REQUEST;
Paul Bakker48916f92012-09-16 19:57:18 +00002847 ssl->renegotiation = SSL_INITIAL_HANDSHAKE;
2848 ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION;
2849
2850 ssl->verify_data_len = 0;
2851 memset( ssl->own_verify_data, 0, 36 );
2852 memset( ssl->peer_verify_data, 0, 36 );
2853
Paul Bakker7eb013f2011-10-06 12:37:39 +00002854 ssl->in_offt = NULL;
2855
Paul Bakker92be97b2013-01-02 17:30:03 +01002856 ssl->in_msg = ssl->in_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002857 ssl->in_msgtype = 0;
2858 ssl->in_msglen = 0;
2859 ssl->in_left = 0;
2860
2861 ssl->in_hslen = 0;
2862 ssl->nb_zero = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002863 ssl->record_read = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002864
Paul Bakker92be97b2013-01-02 17:30:03 +01002865 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002866 ssl->out_msgtype = 0;
2867 ssl->out_msglen = 0;
2868 ssl->out_left = 0;
2869
Paul Bakker48916f92012-09-16 19:57:18 +00002870 ssl->transform_in = NULL;
2871 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00002872
2873 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2874 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker05ef8352012-05-08 09:17:57 +00002875
2876#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2877 if( ssl_hw_record_reset != NULL)
2878 {
2879 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) );
Paul Bakker07eb38b2012-12-19 14:42:06 +01002880 if( ( ret = ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002881 {
2882 SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret );
2883 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2884 }
Paul Bakker05ef8352012-05-08 09:17:57 +00002885 }
2886#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00002887
Paul Bakker48916f92012-09-16 19:57:18 +00002888 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002889 {
Paul Bakker48916f92012-09-16 19:57:18 +00002890 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02002891 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00002892 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00002893 }
Paul Bakker48916f92012-09-16 19:57:18 +00002894
Paul Bakkerc0463502013-02-14 11:19:38 +01002895 if( ssl->session )
2896 {
2897 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02002898 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01002899 ssl->session = NULL;
2900 }
2901
Paul Bakker48916f92012-09-16 19:57:18 +00002902 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
2903 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00002904
2905 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00002906}
2907
2908/*
Paul Bakker5121ce52009-01-03 21:22:43 +00002909 * SSL set accessors
2910 */
2911void ssl_set_endpoint( ssl_context *ssl, int endpoint )
2912{
2913 ssl->endpoint = endpoint;
2914}
2915
2916void ssl_set_authmode( ssl_context *ssl, int authmode )
2917{
2918 ssl->authmode = authmode;
2919}
2920
Paul Bakkered27a042013-04-18 22:46:23 +02002921#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002922void ssl_set_verify( ssl_context *ssl,
Paul Bakker915275b2012-09-28 07:10:55 +00002923 int (*f_vrfy)(void *, x509_cert *, int, int *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002924 void *p_vrfy )
2925{
2926 ssl->f_vrfy = f_vrfy;
2927 ssl->p_vrfy = p_vrfy;
2928}
Paul Bakkered27a042013-04-18 22:46:23 +02002929#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002930
Paul Bakker5121ce52009-01-03 21:22:43 +00002931void ssl_set_rng( ssl_context *ssl,
Paul Bakkera3d195c2011-11-27 21:07:34 +00002932 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00002933 void *p_rng )
2934{
2935 ssl->f_rng = f_rng;
2936 ssl->p_rng = p_rng;
2937}
2938
2939void ssl_set_dbg( ssl_context *ssl,
Paul Bakkerff60ee62010-03-16 21:09:09 +00002940 void (*f_dbg)(void *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00002941 void *p_dbg )
2942{
2943 ssl->f_dbg = f_dbg;
2944 ssl->p_dbg = p_dbg;
2945}
2946
2947void ssl_set_bio( ssl_context *ssl,
Paul Bakker23986e52011-04-24 08:57:21 +00002948 int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
Paul Bakker39bb4182011-06-21 07:36:43 +00002949 int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
Paul Bakker5121ce52009-01-03 21:22:43 +00002950{
2951 ssl->f_recv = f_recv;
2952 ssl->f_send = f_send;
2953 ssl->p_recv = p_recv;
2954 ssl->p_send = p_send;
2955}
2956
Paul Bakker0a597072012-09-25 21:55:46 +00002957void ssl_set_session_cache( ssl_context *ssl,
2958 int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
2959 int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00002960{
Paul Bakker0a597072012-09-25 21:55:46 +00002961 ssl->f_get_cache = f_get_cache;
2962 ssl->p_get_cache = p_get_cache;
2963 ssl->f_set_cache = f_set_cache;
2964 ssl->p_set_cache = p_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00002965}
2966
Paul Bakker0a597072012-09-25 21:55:46 +00002967void ssl_set_session( ssl_context *ssl, const ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00002968{
Paul Bakker0a597072012-09-25 21:55:46 +00002969 memcpy( ssl->session_negotiate, session, sizeof(ssl_session) );
2970 ssl->handshake->resume = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002971}
2972
Paul Bakkerb68cad62012-08-23 08:34:18 +00002973void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00002974{
Paul Bakker8f4ddae2013-04-15 15:09:54 +02002975 ssl->ciphersuite_list[SSL_MINOR_VERSION_0] = ciphersuites;
2976 ssl->ciphersuite_list[SSL_MINOR_VERSION_1] = ciphersuites;
2977 ssl->ciphersuite_list[SSL_MINOR_VERSION_2] = ciphersuites;
2978 ssl->ciphersuite_list[SSL_MINOR_VERSION_3] = ciphersuites;
2979}
2980
2981void ssl_set_ciphersuites_for_version( ssl_context *ssl, const int *ciphersuites,
2982 int major, int minor )
2983{
2984 if( major != SSL_MAJOR_VERSION_3 )
2985 return;
2986
2987 if( minor < SSL_MINOR_VERSION_0 || minor > SSL_MINOR_VERSION_3 )
2988 return;
2989
2990 ssl->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00002991}
2992
Paul Bakkered27a042013-04-18 22:46:23 +02002993#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00002994void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain,
Paul Bakker57b79142010-03-24 06:51:15 +00002995 x509_crl *ca_crl, const char *peer_cn )
Paul Bakker5121ce52009-01-03 21:22:43 +00002996{
2997 ssl->ca_chain = ca_chain;
Paul Bakker40ea7de2009-05-03 10:18:48 +00002998 ssl->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00002999 ssl->peer_cn = peer_cn;
3000}
3001
3002void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert,
3003 rsa_context *rsa_key )
3004{
3005 ssl->own_cert = own_cert;
3006 ssl->rsa_key = rsa_key;
3007}
3008
Paul Bakkereb2c6582012-09-27 19:15:01 +00003009void ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert,
3010 void *rsa_key,
3011 rsa_decrypt_func rsa_decrypt,
3012 rsa_sign_func rsa_sign,
3013 rsa_key_len_func rsa_key_len )
Paul Bakker43b7e352011-01-18 15:27:19 +00003014{
3015 ssl->own_cert = own_cert;
Paul Bakkereb2c6582012-09-27 19:15:01 +00003016 ssl->rsa_key = rsa_key;
3017 ssl->rsa_decrypt = rsa_decrypt;
3018 ssl->rsa_sign = rsa_sign;
3019 ssl->rsa_key_len = rsa_key_len;
Paul Bakker43b7e352011-01-18 15:27:19 +00003020}
Paul Bakkered27a042013-04-18 22:46:23 +02003021#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00003022
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003023#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
3024void ssl_set_psk( ssl_context *ssl, const unsigned char *psk, size_t psk_len,
3025 const unsigned char *psk_identity, size_t psk_identity_len )
3026{
3027 ssl->psk = psk;
3028 ssl->psk_len = psk_len;
3029 ssl->psk_identity = psk_identity;
3030 ssl->psk_identity_len = psk_identity_len;
3031}
3032#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00003033
Paul Bakker48916f92012-09-16 19:57:18 +00003034#if defined(POLARSSL_DHM_C)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003035int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00003036{
3037 int ret;
3038
Paul Bakker48916f92012-09-16 19:57:18 +00003039 if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003040 {
3041 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3042 return( ret );
3043 }
3044
Paul Bakker48916f92012-09-16 19:57:18 +00003045 if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003046 {
3047 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3048 return( ret );
3049 }
3050
3051 return( 0 );
3052}
3053
Paul Bakker1b57b062011-01-06 15:48:19 +00003054int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx )
3055{
3056 int ret;
3057
Paul Bakker48916f92012-09-16 19:57:18 +00003058 if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003059 {
3060 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3061 return( ret );
3062 }
3063
Paul Bakker48916f92012-09-16 19:57:18 +00003064 if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003065 {
3066 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3067 return( ret );
3068 }
3069
3070 return( 0 );
3071}
Paul Bakker48916f92012-09-16 19:57:18 +00003072#endif /* POLARSSL_DHM_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00003073
Paul Bakkerff60ee62010-03-16 21:09:09 +00003074int ssl_set_hostname( ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00003075{
3076 if( hostname == NULL )
Paul Bakker40e46942009-01-03 21:51:57 +00003077 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003078
3079 ssl->hostname_len = strlen( hostname );
Paul Bakker6e339b52013-07-03 13:37:05 +02003080 ssl->hostname = (unsigned char *) polarssl_malloc( ssl->hostname_len + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003081
Paul Bakkerb15b8512012-01-13 13:44:06 +00003082 if( ssl->hostname == NULL )
3083 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3084
Paul Bakker3c2122f2013-06-24 19:03:14 +02003085 memcpy( ssl->hostname, (const unsigned char *) hostname,
Paul Bakker5121ce52009-01-03 21:22:43 +00003086 ssl->hostname_len );
Paul Bakkerf7abd422013-04-16 13:15:56 +02003087
Paul Bakker40ea7de2009-05-03 10:18:48 +00003088 ssl->hostname[ssl->hostname_len] = '\0';
Paul Bakker5121ce52009-01-03 21:22:43 +00003089
3090 return( 0 );
3091}
3092
Paul Bakker5701cdc2012-09-27 21:49:42 +00003093void ssl_set_sni( ssl_context *ssl,
3094 int (*f_sni)(void *, ssl_context *,
3095 const unsigned char *, size_t),
3096 void *p_sni )
3097{
3098 ssl->f_sni = f_sni;
3099 ssl->p_sni = p_sni;
3100}
3101
Paul Bakker490ecc82011-10-06 13:04:09 +00003102void ssl_set_max_version( ssl_context *ssl, int major, int minor )
3103{
3104 ssl->max_major_ver = major;
3105 ssl->max_minor_ver = minor;
3106}
3107
Paul Bakker1d29fb52012-09-28 13:28:45 +00003108void ssl_set_min_version( ssl_context *ssl, int major, int minor )
3109{
3110 ssl->min_major_ver = major;
3111 ssl->min_minor_ver = minor;
3112}
3113
Paul Bakker48916f92012-09-16 19:57:18 +00003114void ssl_set_renegotiation( ssl_context *ssl, int renegotiation )
3115{
3116 ssl->disable_renegotiation = renegotiation;
3117}
3118
3119void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy )
3120{
3121 ssl->allow_legacy_renegotiation = allow_legacy;
3122}
3123
Paul Bakker5121ce52009-01-03 21:22:43 +00003124/*
3125 * SSL get accessors
3126 */
Paul Bakker23986e52011-04-24 08:57:21 +00003127size_t ssl_get_bytes_avail( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003128{
3129 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
3130}
3131
Paul Bakkerff60ee62010-03-16 21:09:09 +00003132int ssl_get_verify_result( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003133{
3134 return( ssl->verify_result );
3135}
3136
Paul Bakkere3166ce2011-01-27 17:40:50 +00003137const char *ssl_get_ciphersuite( const ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00003138{
Paul Bakker926c8e42013-03-06 10:23:34 +01003139 if( ssl == NULL || ssl->session == NULL )
3140 return NULL;
3141
Paul Bakkere3166ce2011-01-27 17:40:50 +00003142 return ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00003143}
3144
Paul Bakker43ca69c2011-01-15 17:35:19 +00003145const char *ssl_get_version( const ssl_context *ssl )
3146{
3147 switch( ssl->minor_ver )
3148 {
3149 case SSL_MINOR_VERSION_0:
3150 return( "SSLv3.0" );
3151
3152 case SSL_MINOR_VERSION_1:
3153 return( "TLSv1.0" );
3154
3155 case SSL_MINOR_VERSION_2:
3156 return( "TLSv1.1" );
3157
Paul Bakker1ef83d62012-04-11 12:09:53 +00003158 case SSL_MINOR_VERSION_3:
3159 return( "TLSv1.2" );
3160
Paul Bakker43ca69c2011-01-15 17:35:19 +00003161 default:
3162 break;
3163 }
3164 return( "unknown" );
3165}
3166
Paul Bakkered27a042013-04-18 22:46:23 +02003167#if defined(POLARSSL_X509_PARSE_C)
Paul Bakkerb0550d92012-10-30 07:51:03 +00003168const x509_cert *ssl_get_peer_cert( const ssl_context *ssl )
3169{
3170 if( ssl == NULL || ssl->session == NULL )
3171 return NULL;
3172
3173 return ssl->session->peer_cert;
3174}
Paul Bakkered27a042013-04-18 22:46:23 +02003175#endif /* POLARSSL_X509_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00003176
Paul Bakker5121ce52009-01-03 21:22:43 +00003177/*
Paul Bakker1961b702013-01-25 14:49:24 +01003178 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003179 */
Paul Bakker1961b702013-01-25 14:49:24 +01003180int ssl_handshake_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003181{
Paul Bakker40e46942009-01-03 21:51:57 +00003182 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003183
Paul Bakker40e46942009-01-03 21:51:57 +00003184#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003185 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker1961b702013-01-25 14:49:24 +01003186 ret = ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003187#endif
3188
Paul Bakker40e46942009-01-03 21:51:57 +00003189#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003190 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker1961b702013-01-25 14:49:24 +01003191 ret = ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003192#endif
3193
Paul Bakker1961b702013-01-25 14:49:24 +01003194 return( ret );
3195}
3196
3197/*
3198 * Perform the SSL handshake
3199 */
3200int ssl_handshake( ssl_context *ssl )
3201{
3202 int ret = 0;
3203
3204 SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
3205
3206 while( ssl->state != SSL_HANDSHAKE_OVER )
3207 {
3208 ret = ssl_handshake_step( ssl );
3209
3210 if( ret != 0 )
3211 break;
3212 }
3213
Paul Bakker5121ce52009-01-03 21:22:43 +00003214 SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
3215
3216 return( ret );
3217}
3218
3219/*
Paul Bakker48916f92012-09-16 19:57:18 +00003220 * Renegotiate current connection
3221 */
3222int ssl_renegotiate( ssl_context *ssl )
3223{
3224 int ret;
3225
3226 SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
3227
3228 if( ssl->state != SSL_HANDSHAKE_OVER )
3229 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3230
3231 ssl->state = SSL_HELLO_REQUEST;
3232 ssl->renegotiation = SSL_RENEGOTIATION;
3233
3234 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3235 return( ret );
3236
3237 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3238 {
3239 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3240 return( ret );
3241 }
3242
3243 SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
3244
3245 return( 0 );
3246}
3247
3248/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003249 * Receive application data decrypted from the SSL layer
3250 */
Paul Bakker23986e52011-04-24 08:57:21 +00003251int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003252{
Paul Bakker23986e52011-04-24 08:57:21 +00003253 int ret;
3254 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003255
3256 SSL_DEBUG_MSG( 2, ( "=> read" ) );
3257
3258 if( ssl->state != SSL_HANDSHAKE_OVER )
3259 {
3260 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3261 {
3262 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3263 return( ret );
3264 }
3265 }
3266
3267 if( ssl->in_offt == NULL )
3268 {
3269 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3270 {
Paul Bakker831a7552011-05-18 13:32:51 +00003271 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3272 return( 0 );
3273
Paul Bakker5121ce52009-01-03 21:22:43 +00003274 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3275 return( ret );
3276 }
3277
3278 if( ssl->in_msglen == 0 &&
3279 ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
3280 {
3281 /*
3282 * OpenSSL sends empty messages to randomize the IV
3283 */
3284 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3285 {
Paul Bakker831a7552011-05-18 13:32:51 +00003286 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3287 return( 0 );
3288
Paul Bakker5121ce52009-01-03 21:22:43 +00003289 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3290 return( ret );
3291 }
3292 }
3293
Paul Bakker48916f92012-09-16 19:57:18 +00003294 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
3295 {
3296 SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
3297
3298 if( ssl->endpoint == SSL_IS_CLIENT &&
3299 ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST ||
3300 ssl->in_hslen != 4 ) )
3301 {
3302 SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
3303 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
3304 }
3305
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003306 if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
3307 ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
3308 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) )
Paul Bakker48916f92012-09-16 19:57:18 +00003309 {
3310 SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
3311
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003312 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakker48916f92012-09-16 19:57:18 +00003313 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003314 /*
3315 * SSLv3 does not have a "no_renegotiation" alert
3316 */
3317 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
3318 return( ret );
3319 }
3320 else
3321 {
3322 if( ( ret = ssl_send_alert_message( ssl,
3323 SSL_ALERT_LEVEL_WARNING,
3324 SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
3325 {
3326 return( ret );
3327 }
Paul Bakker48916f92012-09-16 19:57:18 +00003328 }
3329 }
3330 else
3331 {
3332 if( ( ret = ssl_renegotiate( ssl ) ) != 0 )
3333 {
3334 SSL_DEBUG_RET( 1, "ssl_renegotiate", ret );
3335 return( ret );
3336 }
3337
3338 return( POLARSSL_ERR_NET_WANT_READ );
3339 }
3340 }
3341 else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003342 {
3343 SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003344 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003345 }
3346
3347 ssl->in_offt = ssl->in_msg;
3348 }
3349
3350 n = ( len < ssl->in_msglen )
3351 ? len : ssl->in_msglen;
3352
3353 memcpy( buf, ssl->in_offt, n );
3354 ssl->in_msglen -= n;
3355
3356 if( ssl->in_msglen == 0 )
3357 /* all bytes consumed */
3358 ssl->in_offt = NULL;
3359 else
3360 /* more data available */
3361 ssl->in_offt += n;
3362
3363 SSL_DEBUG_MSG( 2, ( "<= read" ) );
3364
Paul Bakker23986e52011-04-24 08:57:21 +00003365 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003366}
3367
3368/*
3369 * Send application data to be encrypted by the SSL layer
3370 */
Paul Bakker23986e52011-04-24 08:57:21 +00003371int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003372{
Paul Bakker23986e52011-04-24 08:57:21 +00003373 int ret;
3374 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003375
3376 SSL_DEBUG_MSG( 2, ( "=> write" ) );
3377
3378 if( ssl->state != SSL_HANDSHAKE_OVER )
3379 {
3380 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3381 {
3382 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3383 return( ret );
3384 }
3385 }
3386
Paul Bakker887bd502011-06-08 13:10:54 +00003387 n = ( len < SSL_MAX_CONTENT_LEN )
3388 ? len : SSL_MAX_CONTENT_LEN;
3389
Paul Bakker5121ce52009-01-03 21:22:43 +00003390 if( ssl->out_left != 0 )
3391 {
3392 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3393 {
3394 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3395 return( ret );
3396 }
3397 }
Paul Bakker887bd502011-06-08 13:10:54 +00003398 else
Paul Bakker1fd00bf2011-03-14 20:50:15 +00003399 {
Paul Bakker887bd502011-06-08 13:10:54 +00003400 ssl->out_msglen = n;
3401 ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
3402 memcpy( ssl->out_msg, buf, n );
3403
3404 if( ( ret = ssl_write_record( ssl ) ) != 0 )
3405 {
3406 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
3407 return( ret );
3408 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003409 }
3410
3411 SSL_DEBUG_MSG( 2, ( "<= write" ) );
3412
Paul Bakker23986e52011-04-24 08:57:21 +00003413 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003414}
3415
3416/*
3417 * Notify the peer that the connection is being closed
3418 */
3419int ssl_close_notify( ssl_context *ssl )
3420{
3421 int ret;
3422
3423 SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
3424
3425 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3426 {
3427 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3428 return( ret );
3429 }
3430
3431 if( ssl->state == SSL_HANDSHAKE_OVER )
3432 {
Paul Bakker48916f92012-09-16 19:57:18 +00003433 if( ( ret = ssl_send_alert_message( ssl,
3434 SSL_ALERT_LEVEL_WARNING,
3435 SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003436 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003437 return( ret );
3438 }
3439 }
3440
3441 SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
3442
3443 return( ret );
3444}
3445
Paul Bakker48916f92012-09-16 19:57:18 +00003446void ssl_transform_free( ssl_transform *transform )
3447{
3448#if defined(POLARSSL_ZLIB_SUPPORT)
3449 deflateEnd( &transform->ctx_deflate );
3450 inflateEnd( &transform->ctx_inflate );
3451#endif
3452
Paul Bakker61d113b2013-07-04 11:51:43 +02003453 md_free_ctx( &transform->md_ctx_enc );
3454 md_free_ctx( &transform->md_ctx_dec );
3455
Paul Bakker48916f92012-09-16 19:57:18 +00003456 memset( transform, 0, sizeof( ssl_transform ) );
3457}
3458
3459void ssl_handshake_free( ssl_handshake_params *handshake )
3460{
3461#if defined(POLARSSL_DHM_C)
3462 dhm_free( &handshake->dhm_ctx );
3463#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02003464#if defined(POLARSSL_ECDH_C)
3465 ecdh_free( &handshake->ecdh_ctx );
3466#endif
3467
Paul Bakker48916f92012-09-16 19:57:18 +00003468 memset( handshake, 0, sizeof( ssl_handshake_params ) );
3469}
3470
3471void ssl_session_free( ssl_session *session )
3472{
Paul Bakkered27a042013-04-18 22:46:23 +02003473#if defined(POLARSSL_X509_PARSE_C)
Paul Bakker0a597072012-09-25 21:55:46 +00003474 if( session->peer_cert != NULL )
Paul Bakker48916f92012-09-16 19:57:18 +00003475 {
Paul Bakker0a597072012-09-25 21:55:46 +00003476 x509_free( session->peer_cert );
Paul Bakker6e339b52013-07-03 13:37:05 +02003477 polarssl_free( session->peer_cert );
Paul Bakker48916f92012-09-16 19:57:18 +00003478 }
Paul Bakkered27a042013-04-18 22:46:23 +02003479#endif
Paul Bakker0a597072012-09-25 21:55:46 +00003480
3481 memset( session, 0, sizeof( ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003482}
3483
Paul Bakker5121ce52009-01-03 21:22:43 +00003484/*
3485 * Free an SSL context
3486 */
3487void ssl_free( ssl_context *ssl )
3488{
3489 SSL_DEBUG_MSG( 2, ( "=> free" ) );
3490
Paul Bakker5121ce52009-01-03 21:22:43 +00003491 if( ssl->out_ctr != NULL )
3492 {
3493 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02003494 polarssl_free( ssl->out_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00003495 }
3496
3497 if( ssl->in_ctr != NULL )
3498 {
3499 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02003500 polarssl_free( ssl->in_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00003501 }
3502
Paul Bakker40e46942009-01-03 21:51:57 +00003503#if defined(POLARSSL_DHM_C)
Paul Bakker48916f92012-09-16 19:57:18 +00003504 mpi_free( &ssl->dhm_P );
3505 mpi_free( &ssl->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00003506#endif
3507
Paul Bakker48916f92012-09-16 19:57:18 +00003508 if( ssl->transform )
3509 {
3510 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02003511 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003512 }
3513
3514 if( ssl->handshake )
3515 {
3516 ssl_handshake_free( ssl->handshake );
3517 ssl_transform_free( ssl->transform_negotiate );
3518 ssl_session_free( ssl->session_negotiate );
3519
Paul Bakker6e339b52013-07-03 13:37:05 +02003520 polarssl_free( ssl->handshake );
3521 polarssl_free( ssl->transform_negotiate );
3522 polarssl_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00003523 }
3524
Paul Bakkerc0463502013-02-14 11:19:38 +01003525 if( ssl->session )
3526 {
3527 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02003528 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01003529 }
3530
Paul Bakker5121ce52009-01-03 21:22:43 +00003531 if ( ssl->hostname != NULL)
3532 {
3533 memset( ssl->hostname, 0, ssl->hostname_len );
Paul Bakker6e339b52013-07-03 13:37:05 +02003534 polarssl_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00003535 ssl->hostname_len = 0;
3536 }
3537
Paul Bakker05ef8352012-05-08 09:17:57 +00003538#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3539 if( ssl_hw_record_finish != NULL )
3540 {
3541 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) );
3542 ssl_hw_record_finish( ssl );
3543 }
3544#endif
3545
Paul Bakker5121ce52009-01-03 21:22:43 +00003546 SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00003547
Paul Bakker86f04f42013-02-14 11:20:09 +01003548 /* Actually clear after last debug message */
Paul Bakker2da561c2009-02-05 18:00:28 +00003549 memset( ssl, 0, sizeof( ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003550}
3551
3552#endif