blob: 4d654795c6fd49e08e9da9004693f1c75e6ec230 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 shared functions
3 *
Paul Bakker68884e32013-01-07 18:20:04 +01004 * Copyright (C) 2006-2013, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25/*
26 * The SSL 3.0 specification was drafted by Netscape in 1996,
27 * and became an IETF standard in 1999.
28 *
29 * http://wp.netscape.com/eng/ssl3/
30 * http://www.ietf.org/rfc/rfc2246.txt
31 * http://www.ietf.org/rfc/rfc4346.txt
32 */
33
Paul Bakker40e46942009-01-03 21:51:57 +000034#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakker40e46942009-01-03 21:51:57 +000036#if defined(POLARSSL_SSL_TLS_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Paul Bakker0be444a2013-08-27 21:55:01 +020038#include "polarssl/debug.h"
39#include "polarssl/ssl.h"
40
Paul Bakker6e339b52013-07-03 13:37:05 +020041#if defined(POLARSSL_MEMORY_C)
42#include "polarssl/memory.h"
43#else
44#define polarssl_malloc malloc
45#define polarssl_free free
46#endif
47
Paul Bakker5121ce52009-01-03 21:22:43 +000048#include <stdlib.h>
Paul Bakker5121ce52009-01-03 21:22:43 +000049
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000050#if defined _MSC_VER && !defined strcasecmp
51#define strcasecmp _stricmp
52#endif
53
Paul Bakker05decb22013-08-15 13:33:48 +020054#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020055/*
56 * Convert max_fragment_length codes to length.
57 * RFC 6066 says:
58 * enum{
59 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
60 * } MaxFragmentLength;
61 * and we add 0 -> extension unused
62 */
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +020063static unsigned int mfl_code_to_length[SSL_MAX_FRAG_LEN_INVALID] =
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020064{
65 SSL_MAX_CONTENT_LEN, /* SSL_MAX_FRAG_LEN_NONE */
66 512, /* SSL_MAX_FRAG_LEN_512 */
67 1024, /* SSL_MAX_FRAG_LEN_1024 */
68 2048, /* SSL_MAX_FRAG_LEN_2048 */
69 4096, /* SSL_MAX_FRAG_LEN_4096 */
70};
Paul Bakker05decb22013-08-15 13:33:48 +020071#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +020072
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020073static int ssl_session_copy( ssl_session *dst, const ssl_session *src )
74{
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020075 ssl_session_free( dst );
76 memcpy( dst, src, sizeof( ssl_session ) );
77
Paul Bakker7c6b2c32013-09-16 13:49:26 +020078#if defined(POLARSSL_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020079 if( src->peer_cert != NULL )
80 {
Paul Bakker2292d1f2013-09-15 17:06:49 +020081 int ret;
82
Paul Bakkerb9cfaa02013-10-11 18:58:55 +020083 dst->peer_cert = (x509_crt *) polarssl_malloc( sizeof(x509_crt) );
84 if( dst->peer_cert == NULL )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020085 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
86
Paul Bakkerb6b09562013-09-18 14:17:41 +020087 x509_crt_init( dst->peer_cert );
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020088
Paul Bakkerddf26b42013-09-18 13:46:23 +020089 if( ( ret = x509_crt_parse( dst->peer_cert, src->peer_cert->raw.p,
90 src->peer_cert->raw.len ) != 0 ) )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020091 {
92 polarssl_free( dst->peer_cert );
93 dst->peer_cert = NULL;
94 return( ret );
95 }
96 }
Paul Bakker7c6b2c32013-09-16 13:49:26 +020097#endif /* POLARSSL_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +020098
Paul Bakkera503a632013-08-14 13:48:06 +020099#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200100 if( src->ticket != NULL )
101 {
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200102 dst->ticket = (unsigned char *) polarssl_malloc( src->ticket_len );
103 if( dst->ticket == NULL )
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200104 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
105
106 memcpy( dst->ticket, src->ticket, src->ticket_len );
107 }
Paul Bakkera503a632013-08-14 13:48:06 +0200108#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200109
110 return( 0 );
111}
112
Paul Bakker05ef8352012-05-08 09:17:57 +0000113#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
114int (*ssl_hw_record_init)(ssl_context *ssl,
115 const unsigned char *key_enc, const unsigned char *key_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100116 size_t keylen,
Paul Bakker05ef8352012-05-08 09:17:57 +0000117 const unsigned char *iv_enc, const unsigned char *iv_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100118 size_t ivlen,
119 const unsigned char *mac_enc, const unsigned char *mac_dec,
120 size_t maclen) = NULL;
121int (*ssl_hw_record_activate)(ssl_context *ssl, int direction) = NULL;
Paul Bakker05ef8352012-05-08 09:17:57 +0000122int (*ssl_hw_record_reset)(ssl_context *ssl) = NULL;
123int (*ssl_hw_record_write)(ssl_context *ssl) = NULL;
124int (*ssl_hw_record_read)(ssl_context *ssl) = NULL;
125int (*ssl_hw_record_finish)(ssl_context *ssl) = NULL;
126#endif
127
Paul Bakker5121ce52009-01-03 21:22:43 +0000128/*
129 * Key material generation
130 */
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200131#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200132static int ssl3_prf( const unsigned char *secret, size_t slen,
133 const char *label,
134 const unsigned char *random, size_t rlen,
Paul Bakker5f70b252012-09-13 14:23:06 +0000135 unsigned char *dstbuf, size_t dlen )
136{
137 size_t i;
138 md5_context md5;
139 sha1_context sha1;
140 unsigned char padding[16];
141 unsigned char sha1sum[20];
142 ((void)label);
143
144 /*
145 * SSLv3:
146 * block =
147 * MD5( secret + SHA1( 'A' + secret + random ) ) +
148 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
149 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
150 * ...
151 */
152 for( i = 0; i < dlen / 16; i++ )
153 {
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200154 memset( padding, (unsigned char) ('A' + i), 1 + i );
Paul Bakker5f70b252012-09-13 14:23:06 +0000155
156 sha1_starts( &sha1 );
157 sha1_update( &sha1, padding, 1 + i );
158 sha1_update( &sha1, secret, slen );
159 sha1_update( &sha1, random, rlen );
160 sha1_finish( &sha1, sha1sum );
161
162 md5_starts( &md5 );
163 md5_update( &md5, secret, slen );
164 md5_update( &md5, sha1sum, 20 );
165 md5_finish( &md5, dstbuf + i * 16 );
166 }
167
168 memset( &md5, 0, sizeof( md5 ) );
169 memset( &sha1, 0, sizeof( sha1 ) );
170
171 memset( padding, 0, sizeof( padding ) );
172 memset( sha1sum, 0, sizeof( sha1sum ) );
173
174 return( 0 );
175}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200176#endif /* POLARSSL_SSL_PROTO_SSL3 */
Paul Bakker5f70b252012-09-13 14:23:06 +0000177
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200178#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200179static int tls1_prf( const unsigned char *secret, size_t slen,
180 const char *label,
181 const unsigned char *random, size_t rlen,
Paul Bakker23986e52011-04-24 08:57:21 +0000182 unsigned char *dstbuf, size_t dlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000183{
Paul Bakker23986e52011-04-24 08:57:21 +0000184 size_t nb, hs;
185 size_t i, j, k;
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200186 const unsigned char *S1, *S2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000187 unsigned char tmp[128];
188 unsigned char h_i[20];
189
190 if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
Paul Bakker40e46942009-01-03 21:51:57 +0000191 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000192
193 hs = ( slen + 1 ) / 2;
194 S1 = secret;
195 S2 = secret + slen - hs;
196
197 nb = strlen( label );
198 memcpy( tmp + 20, label, nb );
199 memcpy( tmp + 20 + nb, random, rlen );
200 nb += rlen;
201
202 /*
203 * First compute P_md5(secret,label+random)[0..dlen]
204 */
205 md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
206
207 for( i = 0; i < dlen; i += 16 )
208 {
209 md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
210 md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp );
211
212 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
213
214 for( j = 0; j < k; j++ )
215 dstbuf[i + j] = h_i[j];
216 }
217
218 /*
219 * XOR out with P_sha1(secret,label+random)[0..dlen]
220 */
221 sha1_hmac( S2, hs, tmp + 20, nb, tmp );
222
223 for( i = 0; i < dlen; i += 20 )
224 {
225 sha1_hmac( S2, hs, tmp, 20 + nb, h_i );
226 sha1_hmac( S2, hs, tmp, 20, tmp );
227
228 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
229
230 for( j = 0; j < k; j++ )
231 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
232 }
233
234 memset( tmp, 0, sizeof( tmp ) );
235 memset( h_i, 0, sizeof( h_i ) );
236
237 return( 0 );
238}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200239#endif /* POLARSSL_SSL_PROTO_TLS1) || POLARSSL_SSL_PROTO_TLS1_1 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000240
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200241#if defined(POLARSSL_SSL_PROTO_TLS1_2)
242#if defined(POLARSSL_SHA256_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200243static int tls_prf_sha256( const unsigned char *secret, size_t slen,
244 const char *label,
245 const unsigned char *random, size_t rlen,
Paul Bakker1ef83d62012-04-11 12:09:53 +0000246 unsigned char *dstbuf, size_t dlen )
247{
248 size_t nb;
249 size_t i, j, k;
250 unsigned char tmp[128];
251 unsigned char h_i[32];
252
253 if( sizeof( tmp ) < 32 + strlen( label ) + rlen )
254 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
255
256 nb = strlen( label );
257 memcpy( tmp + 32, label, nb );
258 memcpy( tmp + 32 + nb, random, rlen );
259 nb += rlen;
260
261 /*
262 * Compute P_<hash>(secret, label + random)[0..dlen]
263 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200264 sha256_hmac( secret, slen, tmp + 32, nb, tmp, 0 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000265
266 for( i = 0; i < dlen; i += 32 )
267 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200268 sha256_hmac( secret, slen, tmp, 32 + nb, h_i, 0 );
269 sha256_hmac( secret, slen, tmp, 32, tmp, 0 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000270
271 k = ( i + 32 > dlen ) ? dlen % 32 : 32;
272
273 for( j = 0; j < k; j++ )
274 dstbuf[i + j] = h_i[j];
275 }
276
277 memset( tmp, 0, sizeof( tmp ) );
278 memset( h_i, 0, sizeof( h_i ) );
279
280 return( 0 );
281}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200282#endif /* POLARSSL_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000283
Paul Bakker9e36f042013-06-30 14:34:05 +0200284#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200285static int tls_prf_sha384( const unsigned char *secret, size_t slen,
286 const char *label,
287 const unsigned char *random, size_t rlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000288 unsigned char *dstbuf, size_t dlen )
289{
290 size_t nb;
291 size_t i, j, k;
292 unsigned char tmp[128];
293 unsigned char h_i[48];
294
295 if( sizeof( tmp ) < 48 + strlen( label ) + rlen )
296 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
297
298 nb = strlen( label );
299 memcpy( tmp + 48, label, nb );
300 memcpy( tmp + 48 + nb, random, rlen );
301 nb += rlen;
302
303 /*
304 * Compute P_<hash>(secret, label + random)[0..dlen]
305 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200306 sha512_hmac( secret, slen, tmp + 48, nb, tmp, 1 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000307
308 for( i = 0; i < dlen; i += 48 )
309 {
Paul Bakker9e36f042013-06-30 14:34:05 +0200310 sha512_hmac( secret, slen, tmp, 48 + nb, h_i, 1 );
311 sha512_hmac( secret, slen, tmp, 48, tmp, 1 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000312
313 k = ( i + 48 > dlen ) ? dlen % 48 : 48;
314
315 for( j = 0; j < k; j++ )
316 dstbuf[i + j] = h_i[j];
317 }
318
319 memset( tmp, 0, sizeof( tmp ) );
320 memset( h_i, 0, sizeof( h_i ) );
321
322 return( 0 );
323}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200324#endif /* POLARSSL_SHA512_C */
325#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +0000326
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200327static void ssl_update_checksum_start(ssl_context *, const unsigned char *, size_t);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200328
329#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
330 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200331static void ssl_update_checksum_md5sha1(ssl_context *, const unsigned char *, size_t);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200332#endif
Paul Bakker380da532012-04-18 16:10:25 +0000333
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200334#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker380da532012-04-18 16:10:25 +0000335static void ssl_calc_verify_ssl(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000336static void ssl_calc_finished_ssl(ssl_context *,unsigned char *,int);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200337#endif
338
339#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
340static void ssl_calc_verify_tls(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000341static void ssl_calc_finished_tls(ssl_context *,unsigned char *,int);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200342#endif
343
344#if defined(POLARSSL_SSL_PROTO_TLS1_2)
345#if defined(POLARSSL_SHA256_C)
346static void ssl_update_checksum_sha256(ssl_context *, const unsigned char *, size_t);
347static void ssl_calc_verify_tls_sha256(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000348static void ssl_calc_finished_tls_sha256(ssl_context *,unsigned char *,int);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200349#endif
Paul Bakker769075d2012-11-24 11:26:46 +0100350
Paul Bakker9e36f042013-06-30 14:34:05 +0200351#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200352static void ssl_update_checksum_sha384(ssl_context *, const unsigned char *, size_t);
Paul Bakker769075d2012-11-24 11:26:46 +0100353static void ssl_calc_verify_tls_sha384(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000354static void ssl_calc_finished_tls_sha384(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100355#endif
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200356#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000357
Paul Bakker5121ce52009-01-03 21:22:43 +0000358int ssl_derive_keys( ssl_context *ssl )
359{
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200360 int ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000361 unsigned char tmp[64];
Paul Bakker5121ce52009-01-03 21:22:43 +0000362 unsigned char keyblk[256];
363 unsigned char *key1;
364 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100365 unsigned char *mac_enc;
366 unsigned char *mac_dec;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200367 size_t iv_copy_len;
Paul Bakker68884e32013-01-07 18:20:04 +0100368 const cipher_info_t *cipher_info;
369 const md_info_t *md_info;
370
Paul Bakker48916f92012-09-16 19:57:18 +0000371 ssl_session *session = ssl->session_negotiate;
372 ssl_transform *transform = ssl->transform_negotiate;
373 ssl_handshake_params *handshake = ssl->handshake;
Paul Bakker5121ce52009-01-03 21:22:43 +0000374
375 SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
376
Paul Bakker68884e32013-01-07 18:20:04 +0100377 cipher_info = cipher_info_from_type( transform->ciphersuite_info->cipher );
378 if( cipher_info == NULL )
379 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200380 SSL_DEBUG_MSG( 1, ( "cipher info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100381 transform->ciphersuite_info->cipher ) );
382 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
383 }
384
385 md_info = md_info_from_type( transform->ciphersuite_info->mac );
386 if( md_info == NULL )
387 {
Paul Bakkerf7abd422013-04-16 13:15:56 +0200388 SSL_DEBUG_MSG( 1, ( "md info for %d not found",
Paul Bakker68884e32013-01-07 18:20:04 +0100389 transform->ciphersuite_info->mac ) );
390 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
391 }
392
Paul Bakker5121ce52009-01-03 21:22:43 +0000393 /*
Paul Bakkerca4ab492012-04-18 14:23:57 +0000394 * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
Paul Bakker1ef83d62012-04-11 12:09:53 +0000395 */
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200396#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker1ef83d62012-04-11 12:09:53 +0000397 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000398 {
Paul Bakker48916f92012-09-16 19:57:18 +0000399 handshake->tls_prf = ssl3_prf;
400 handshake->calc_verify = ssl_calc_verify_ssl;
401 handshake->calc_finished = ssl_calc_finished_ssl;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000402 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200403 else
404#endif
405#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
406 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000407 {
Paul Bakker48916f92012-09-16 19:57:18 +0000408 handshake->tls_prf = tls1_prf;
409 handshake->calc_verify = ssl_calc_verify_tls;
410 handshake->calc_finished = ssl_calc_finished_tls;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000411 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200412 else
413#endif
414#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker9e36f042013-06-30 14:34:05 +0200415#if defined(POLARSSL_SHA512_C)
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200416 if( ssl->minor_ver == SSL_MINOR_VERSION_3 &&
417 transform->ciphersuite_info->mac == POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000418 {
Paul Bakker48916f92012-09-16 19:57:18 +0000419 handshake->tls_prf = tls_prf_sha384;
420 handshake->calc_verify = ssl_calc_verify_tls_sha384;
421 handshake->calc_finished = ssl_calc_finished_tls_sha384;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000422 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000423 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200424#endif
425#if defined(POLARSSL_SHA256_C)
426 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000427 {
Paul Bakker48916f92012-09-16 19:57:18 +0000428 handshake->tls_prf = tls_prf_sha256;
429 handshake->calc_verify = ssl_calc_verify_tls_sha256;
430 handshake->calc_finished = ssl_calc_finished_tls_sha256;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000431 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200432 else
433#endif
434#endif
Paul Bakker577e0062013-08-28 11:57:20 +0200435 {
436 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200437 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +0200438 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000439
440 /*
Paul Bakker5121ce52009-01-03 21:22:43 +0000441 * SSLv3:
442 * master =
443 * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
444 * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
445 * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
Paul Bakkerf7abd422013-04-16 13:15:56 +0200446 *
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200447 * TLSv1+:
Paul Bakker5121ce52009-01-03 21:22:43 +0000448 * master = PRF( premaster, "master secret", randbytes )[0..47]
449 */
Paul Bakker0a597072012-09-25 21:55:46 +0000450 if( handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000451 {
Paul Bakker48916f92012-09-16 19:57:18 +0000452 SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
453 handshake->pmslen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000454
Paul Bakker48916f92012-09-16 19:57:18 +0000455 handshake->tls_prf( handshake->premaster, handshake->pmslen,
456 "master secret",
457 handshake->randbytes, 64, session->master, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000458
Paul Bakker48916f92012-09-16 19:57:18 +0000459 memset( handshake->premaster, 0, sizeof( handshake->premaster ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000460 }
461 else
462 SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
463
464 /*
465 * Swap the client and server random values.
466 */
Paul Bakker48916f92012-09-16 19:57:18 +0000467 memcpy( tmp, handshake->randbytes, 64 );
468 memcpy( handshake->randbytes, tmp + 32, 32 );
469 memcpy( handshake->randbytes + 32, tmp, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000470 memset( tmp, 0, sizeof( tmp ) );
471
472 /*
473 * SSLv3:
474 * key block =
475 * MD5( master + SHA1( 'A' + master + randbytes ) ) +
476 * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
477 * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
478 * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
479 * ...
480 *
481 * TLSv1:
482 * key block = PRF( master, "key expansion", randbytes )
483 */
Paul Bakker48916f92012-09-16 19:57:18 +0000484 handshake->tls_prf( session->master, 48, "key expansion",
485 handshake->randbytes, 64, keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000486
Paul Bakker48916f92012-09-16 19:57:18 +0000487 SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
488 ssl_get_ciphersuite_name( session->ciphersuite ) ) );
489 SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
490 SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000491 SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
492
Paul Bakker48916f92012-09-16 19:57:18 +0000493 memset( handshake->randbytes, 0, sizeof( handshake->randbytes ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000494
495 /*
496 * Determine the appropriate key, IV and MAC length.
497 */
Paul Bakker68884e32013-01-07 18:20:04 +0100498
499 if( cipher_info->mode == POLARSSL_MODE_GCM )
Paul Bakker5121ce52009-01-03 21:22:43 +0000500 {
Paul Bakker68884e32013-01-07 18:20:04 +0100501 transform->keylen = cipher_info->key_length;
502 transform->keylen /= 8;
503 transform->minlen = 1;
504 transform->ivlen = 12;
505 transform->fixed_ivlen = 4;
506 transform->maclen = 0;
507 }
508 else
509 {
510 if( md_info->type != POLARSSL_MD_NONE )
511 {
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200512 int ret;
513
Paul Bakker61d113b2013-07-04 11:51:43 +0200514 if( ( ret = md_init_ctx( &transform->md_ctx_enc, md_info ) ) != 0 )
515 {
516 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
517 return( ret );
518 }
519
520 if( ( ret = md_init_ctx( &transform->md_ctx_dec, md_info ) ) != 0 )
521 {
522 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
523 return( ret );
524 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000525
Paul Bakker68884e32013-01-07 18:20:04 +0100526 transform->maclen = md_get_size( md_info );
Manuel Pégourié-Gonnard277f7f22013-07-19 12:19:21 +0200527
Paul Bakker1f2bc622013-08-15 13:45:55 +0200528#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard277f7f22013-07-19 12:19:21 +0200529 /*
530 * If HMAC is to be truncated, we shall keep the leftmost bytes,
531 * (rfc 6066 page 13 or rfc 2104 section 4),
532 * so we only need to adjust the length here.
533 */
534 if( session->trunc_hmac == SSL_TRUNC_HMAC_ENABLED )
535 transform->maclen = SSL_TRUNCATED_HMAC_LEN;
Paul Bakker1f2bc622013-08-15 13:45:55 +0200536#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Paul Bakker68884e32013-01-07 18:20:04 +0100537 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000538
Paul Bakker68884e32013-01-07 18:20:04 +0100539 transform->keylen = cipher_info->key_length;
540 transform->keylen /= 8;
541 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +0000542
Paul Bakker68884e32013-01-07 18:20:04 +0100543 transform->minlen = transform->keylen;
544 if( transform->minlen < transform->maclen )
545 {
546 if( cipher_info->mode == POLARSSL_MODE_STREAM )
547 transform->minlen = transform->maclen;
548 else
549 transform->minlen += transform->keylen;
550 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000551 }
552
553 SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000554 transform->keylen, transform->minlen, transform->ivlen,
555 transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000556
557 /*
558 * Finally setup the cipher contexts, IVs and MAC secrets.
559 */
560 if( ssl->endpoint == SSL_IS_CLIENT )
561 {
Paul Bakker48916f92012-09-16 19:57:18 +0000562 key1 = keyblk + transform->maclen * 2;
563 key2 = keyblk + transform->maclen * 2 + transform->keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000564
Paul Bakker68884e32013-01-07 18:20:04 +0100565 mac_enc = keyblk;
566 mac_dec = keyblk + transform->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000567
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000568 /*
569 * This is not used in TLS v1.1.
570 */
Paul Bakker48916f92012-09-16 19:57:18 +0000571 iv_copy_len = ( transform->fixed_ivlen ) ?
572 transform->fixed_ivlen : transform->ivlen;
573 memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len );
574 memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000575 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000576 }
577 else
578 {
Paul Bakker48916f92012-09-16 19:57:18 +0000579 key1 = keyblk + transform->maclen * 2 + transform->keylen;
580 key2 = keyblk + transform->maclen * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000581
Paul Bakker68884e32013-01-07 18:20:04 +0100582 mac_enc = keyblk + transform->maclen;
583 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +0000584
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000585 /*
586 * This is not used in TLS v1.1.
587 */
Paul Bakker48916f92012-09-16 19:57:18 +0000588 iv_copy_len = ( transform->fixed_ivlen ) ?
589 transform->fixed_ivlen : transform->ivlen;
590 memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len );
591 memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000592 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000593 }
594
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200595#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker68884e32013-01-07 18:20:04 +0100596 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
597 {
598 memcpy( transform->mac_enc, mac_enc, transform->maclen );
599 memcpy( transform->mac_dec, mac_dec, transform->maclen );
600 }
601 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200602#endif
603#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
604 defined(POLARSSL_SSL_PROTO_TLS1_2)
605 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 )
Paul Bakker68884e32013-01-07 18:20:04 +0100606 {
607 md_hmac_starts( &transform->md_ctx_enc, mac_enc, transform->maclen );
608 md_hmac_starts( &transform->md_ctx_dec, mac_dec, transform->maclen );
609 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200610 else
611#endif
Paul Bakker577e0062013-08-28 11:57:20 +0200612 {
613 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200614 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +0200615 }
Paul Bakker68884e32013-01-07 18:20:04 +0100616
Paul Bakker05ef8352012-05-08 09:17:57 +0000617#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
618 if( ssl_hw_record_init != NULL)
619 {
620 int ret = 0;
621
622 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) );
623
Paul Bakker07eb38b2012-12-19 14:42:06 +0100624 if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->keylen,
625 transform->iv_enc, transform->iv_dec,
626 iv_copy_len,
Paul Bakker68884e32013-01-07 18:20:04 +0100627 mac_enc, mac_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +0100628 transform->maclen ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +0000629 {
630 SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret );
631 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
632 }
633 }
634#endif
635
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200636 if( ( ret = cipher_init_ctx( &transform->cipher_ctx_enc,
637 cipher_info ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000638 {
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200639 SSL_DEBUG_RET( 1, "cipher_init_ctx", ret );
640 return( ret );
641 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200642
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200643 if( ( ret = cipher_init_ctx( &transform->cipher_ctx_dec,
644 cipher_info ) ) != 0 )
645 {
646 SSL_DEBUG_RET( 1, "cipher_init_ctx", ret );
647 return( ret );
648 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200649
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200650 if( ( ret = cipher_setkey( &transform->cipher_ctx_enc, key1,
651 cipher_info->key_length,
652 POLARSSL_ENCRYPT ) ) != 0 )
653 {
654 SSL_DEBUG_RET( 1, "cipher_setkey", ret );
655 return( ret );
656 }
Paul Bakkerea6ad3f2013-09-02 14:57:01 +0200657
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200658 if( ( ret = cipher_setkey( &transform->cipher_ctx_dec, key2,
659 cipher_info->key_length,
660 POLARSSL_DECRYPT ) ) != 0 )
661 {
662 SSL_DEBUG_RET( 1, "cipher_setkey", ret );
663 return( ret );
664 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200665
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +0200666#if defined(POLARSSL_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200667 if( cipher_info->mode == POLARSSL_MODE_CBC )
668 {
669 if( ( ret = cipher_set_padding_mode( &transform->cipher_ctx_enc,
670 POLARSSL_PADDING_NONE ) ) != 0 )
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +0200671 {
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200672 SSL_DEBUG_RET( 1, "cipher_set_padding_mode", ret );
673 return( ret );
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +0200674 }
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200675
676 if( ( ret = cipher_set_padding_mode( &transform->cipher_ctx_dec,
677 POLARSSL_PADDING_NONE ) ) != 0 )
678 {
679 SSL_DEBUG_RET( 1, "cipher_set_padding_mode", ret );
680 return( ret );
681 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000682 }
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +0200683#endif /* POLARSSL_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +0000684
685 memset( keyblk, 0, sizeof( keyblk ) );
686
Paul Bakker2770fbd2012-07-03 13:30:23 +0000687#if defined(POLARSSL_ZLIB_SUPPORT)
688 // Initialize compression
689 //
Paul Bakker48916f92012-09-16 19:57:18 +0000690 if( session->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000691 {
Paul Bakker16770332013-10-11 09:59:44 +0200692 if( ssl->compress_buf == NULL )
693 {
694 SSL_DEBUG_MSG( 3, ( "Allocating compression buffer" ) );
695 ssl->compress_buf = polarssl_malloc( SSL_BUFFER_LEN );
696 if( ssl->compress_buf == NULL )
697 {
698 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
699 SSL_BUFFER_LEN ) );
700 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
701 }
702 }
703
Paul Bakker2770fbd2012-07-03 13:30:23 +0000704 SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
705
Paul Bakker48916f92012-09-16 19:57:18 +0000706 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
707 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000708
Paul Bakker48916f92012-09-16 19:57:18 +0000709 if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK ||
710 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000711 {
712 SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
713 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
714 }
715 }
716#endif /* POLARSSL_ZLIB_SUPPORT */
717
Paul Bakker5121ce52009-01-03 21:22:43 +0000718 SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
719
720 return( 0 );
721}
722
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200723#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker380da532012-04-18 16:10:25 +0000724void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000725{
726 md5_context md5;
727 sha1_context sha1;
728 unsigned char pad_1[48];
729 unsigned char pad_2[48];
730
Paul Bakker380da532012-04-18 16:10:25 +0000731 SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000732
Paul Bakker48916f92012-09-16 19:57:18 +0000733 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
734 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000735
Paul Bakker380da532012-04-18 16:10:25 +0000736 memset( pad_1, 0x36, 48 );
737 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000738
Paul Bakker48916f92012-09-16 19:57:18 +0000739 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000740 md5_update( &md5, pad_1, 48 );
741 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000742
Paul Bakker380da532012-04-18 16:10:25 +0000743 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +0000744 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000745 md5_update( &md5, pad_2, 48 );
746 md5_update( &md5, hash, 16 );
747 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000748
Paul Bakker48916f92012-09-16 19:57:18 +0000749 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000750 sha1_update( &sha1, pad_1, 40 );
751 sha1_finish( &sha1, hash + 16 );
752
753 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +0000754 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000755 sha1_update( &sha1, pad_2, 40 );
756 sha1_update( &sha1, hash + 16, 20 );
757 sha1_finish( &sha1, hash + 16 );
758
759 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
760 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
761
762 return;
763}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200764#endif
Paul Bakker380da532012-04-18 16:10:25 +0000765
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200766#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker380da532012-04-18 16:10:25 +0000767void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] )
768{
769 md5_context md5;
770 sha1_context sha1;
771
772 SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
773
Paul Bakker48916f92012-09-16 19:57:18 +0000774 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
775 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000776
Paul Bakker48916f92012-09-16 19:57:18 +0000777 md5_finish( &md5, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000778 sha1_finish( &sha1, hash + 16 );
779
780 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
781 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
782
783 return;
784}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200785#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 */
Paul Bakker380da532012-04-18 16:10:25 +0000786
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200787#if defined(POLARSSL_SSL_PROTO_TLS1_2)
788#if defined(POLARSSL_SHA256_C)
Paul Bakker380da532012-04-18 16:10:25 +0000789void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] )
790{
Paul Bakker9e36f042013-06-30 14:34:05 +0200791 sha256_context sha256;
Paul Bakker380da532012-04-18 16:10:25 +0000792
793 SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
794
Paul Bakker9e36f042013-06-30 14:34:05 +0200795 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
796 sha256_finish( &sha256, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000797
798 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
799 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
800
801 return;
802}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200803#endif /* POLARSSL_SHA256_C */
Paul Bakker380da532012-04-18 16:10:25 +0000804
Paul Bakker9e36f042013-06-30 14:34:05 +0200805#if defined(POLARSSL_SHA512_C)
Paul Bakker380da532012-04-18 16:10:25 +0000806void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] )
807{
Paul Bakker9e36f042013-06-30 14:34:05 +0200808 sha512_context sha512;
Paul Bakker380da532012-04-18 16:10:25 +0000809
810 SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
811
Paul Bakker9e36f042013-06-30 14:34:05 +0200812 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
813 sha512_finish( &sha512, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000814
Paul Bakkerca4ab492012-04-18 14:23:57 +0000815 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000816 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
817
818 return;
819}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200820#endif /* POLARSSL_SHA512_C */
821#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000822
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +0200823#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +0200824int ssl_psk_derive_premaster( ssl_context *ssl, key_exchange_type_t key_ex )
825{
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +0200826 unsigned char *p = ssl->handshake->premaster;
827 unsigned char *end = p + sizeof( ssl->handshake->premaster );
828
829 /*
830 * PMS = struct {
831 * opaque other_secret<0..2^16-1>;
832 * opaque psk<0..2^16-1>;
833 * };
834 * with "other_secret" depending on the particular key exchange
835 */
836#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
837 if( key_ex == POLARSSL_KEY_EXCHANGE_PSK )
838 {
839 if( end - p < 2 + (int) ssl->psk_len )
840 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
841
842 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
843 *(p++) = (unsigned char)( ssl->psk_len );
844 p += ssl->psk_len;
845 }
846 else
847#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +0200848#if defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
849 if( key_ex == POLARSSL_KEY_EXCHANGE_RSA_PSK )
850 {
851 /*
852 * other_secret already set by the ClientKeyExchange message,
853 * and is 48 bytes long
854 */
855 *p++ = 0;
856 *p++ = 48;
857 p += 48;
858 }
859 else
860#endif /* POLARSSL_KEY_EXCHANGE_RSA_PKS_ENABLED */
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +0200861#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
862 if( key_ex == POLARSSL_KEY_EXCHANGE_DHE_PSK )
863 {
Manuel Pégourié-Gonnard1b62c7f2013-10-14 14:02:19 +0200864 int ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +0200865 size_t len = ssl->handshake->dhm_ctx.len;
866
867 if( end - p < 2 + (int) len )
868 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
869
870 *(p++) = (unsigned char)( len >> 8 );
871 *(p++) = (unsigned char)( len );
872 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
873 p, &len, ssl->f_rng, ssl->p_rng ) ) != 0 )
874 {
875 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
876 return( ret );
877 }
878 p += len;
879
880 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
881 }
882 else
883#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
884#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
885 if( key_ex == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
886 {
Manuel Pégourié-Gonnard1b62c7f2013-10-14 14:02:19 +0200887 int ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +0200888 size_t zlen;
889
890 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen,
891 p + 2, end - (p + 2),
892 ssl->f_rng, ssl->p_rng ) ) != 0 )
893 {
894 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
895 return( ret );
896 }
897
898 *(p++) = (unsigned char)( zlen >> 8 );
899 *(p++) = (unsigned char)( zlen );
900 p += zlen;
901
902 SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
903 }
904 else
905#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
906 {
907 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
908 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
909 }
910
911 /* opaque psk<0..2^16-1>; */
912 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
913 *(p++) = (unsigned char)( ssl->psk_len );
914 memcpy( p, ssl->psk, ssl->psk_len );
915 p += ssl->psk_len;
916
917 ssl->handshake->pmslen = p - ssl->handshake->premaster;
918
919 return( 0 );
920}
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +0200921#endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +0200922
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200923#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +0000924/*
925 * SSLv3.0 MAC functions
926 */
Paul Bakker68884e32013-01-07 18:20:04 +0100927static void ssl_mac( md_context_t *md_ctx, unsigned char *secret,
928 unsigned char *buf, size_t len,
929 unsigned char *ctr, int type )
Paul Bakker5121ce52009-01-03 21:22:43 +0000930{
931 unsigned char header[11];
932 unsigned char padding[48];
Paul Bakker68884e32013-01-07 18:20:04 +0100933 int padlen = 0;
934 int md_size = md_get_size( md_ctx->md_info );
935 int md_type = md_get_type( md_ctx->md_info );
936
937 if( md_type == POLARSSL_MD_MD5 )
938 padlen = 48;
939 else if( md_type == POLARSSL_MD_SHA1 )
940 padlen = 40;
941 else if( md_type == POLARSSL_MD_SHA256 )
942 padlen = 32;
Paul Bakker5121ce52009-01-03 21:22:43 +0000943
944 memcpy( header, ctr, 8 );
945 header[ 8] = (unsigned char) type;
946 header[ 9] = (unsigned char)( len >> 8 );
947 header[10] = (unsigned char)( len );
948
Paul Bakker68884e32013-01-07 18:20:04 +0100949 memset( padding, 0x36, padlen );
950 md_starts( md_ctx );
951 md_update( md_ctx, secret, md_size );
952 md_update( md_ctx, padding, padlen );
953 md_update( md_ctx, header, 11 );
954 md_update( md_ctx, buf, len );
955 md_finish( md_ctx, buf + len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000956
Paul Bakker68884e32013-01-07 18:20:04 +0100957 memset( padding, 0x5C, padlen );
958 md_starts( md_ctx );
959 md_update( md_ctx, secret, md_size );
960 md_update( md_ctx, padding, padlen );
961 md_update( md_ctx, buf + len, md_size );
962 md_finish( md_ctx, buf + len );
Paul Bakker5f70b252012-09-13 14:23:06 +0000963}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200964#endif /* POLARSSL_SSL_PROTO_SSL3 */
Paul Bakker5f70b252012-09-13 14:23:06 +0000965
Paul Bakker5121ce52009-01-03 21:22:43 +0000966/*
967 * Encryption/decryption functions
Paul Bakkerf7abd422013-04-16 13:15:56 +0200968 */
Paul Bakker5121ce52009-01-03 21:22:43 +0000969static int ssl_encrypt_buf( ssl_context *ssl )
970{
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +0200971 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000972
973 SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
974
975 /*
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +0200976 * Add MAC before encrypt, except for GCM
Paul Bakker5121ce52009-01-03 21:22:43 +0000977 */
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +0200978#if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER) || \
979 ( defined(POLARSSL_CIPHER_MODE_CBC) && \
980 ( defined(POLARSSL_AES_C) || defined(POLARSSL_CAMELLIA_C) ) )
981 if( ssl->transform_out->cipher_ctx_enc.cipher_info->mode !=
982 POLARSSL_MODE_GCM )
Paul Bakker5121ce52009-01-03 21:22:43 +0000983 {
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +0200984#if defined(POLARSSL_SSL_PROTO_SSL3)
985 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
986 {
987 ssl_mac( &ssl->transform_out->md_ctx_enc,
988 ssl->transform_out->mac_enc,
989 ssl->out_msg, ssl->out_msglen,
990 ssl->out_ctr, ssl->out_msgtype );
991 }
992 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200993#endif
994#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +0200995 defined(POLARSSL_SSL_PROTO_TLS1_2)
996 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 )
997 {
998 md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 13 );
999 md_hmac_update( &ssl->transform_out->md_ctx_enc,
1000 ssl->out_msg, ssl->out_msglen );
1001 md_hmac_finish( &ssl->transform_out->md_ctx_enc,
1002 ssl->out_msg + ssl->out_msglen );
1003 md_hmac_reset( &ssl->transform_out->md_ctx_enc );
1004 }
1005 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001006#endif
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001007 {
1008 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1009 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1010 }
1011
1012 SSL_DEBUG_BUF( 4, "computed mac",
1013 ssl->out_msg + ssl->out_msglen,
1014 ssl->transform_out->maclen );
1015
1016 ssl->out_msglen += ssl->transform_out->maclen;
Paul Bakker577e0062013-08-28 11:57:20 +02001017 }
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001018#endif /* GCM not the only option */
Paul Bakker5121ce52009-01-03 21:22:43 +00001019
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001020 /*
1021 * Encrypt
1022 */
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001023#if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER)
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001024 if( ssl->transform_out->cipher_ctx_enc.cipher_info->mode ==
1025 POLARSSL_MODE_STREAM )
Paul Bakker5121ce52009-01-03 21:22:43 +00001026 {
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001027 int ret;
1028 size_t olen = 0;
1029
Paul Bakker5121ce52009-01-03 21:22:43 +00001030 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
1031 "including %d bytes of padding",
1032 ssl->out_msglen, 0 ) );
1033
1034 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
1035 ssl->out_msg, ssl->out_msglen );
1036
Paul Bakker45125bc2013-09-04 16:47:11 +02001037 if( ( ret = cipher_reset( &ssl->transform_out->cipher_ctx_enc ) ) != 0 )
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001038 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001039 SSL_DEBUG_RET( 1, "cipher_reset", ret );
1040 return( ret );
1041 }
1042
1043 if( ( ret = cipher_set_iv( &ssl->transform_out->cipher_ctx_enc,
1044 ssl->transform_out->iv_enc,
1045 ssl->transform_out->ivlen ) ) != 0 )
1046 {
1047 SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001048 return( ret );
1049 }
1050
1051 if( ( ret = cipher_update( &ssl->transform_out->cipher_ctx_enc,
1052 ssl->out_msg, ssl->out_msglen, ssl->out_msg,
1053 &olen ) ) != 0 )
1054 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001055 SSL_DEBUG_RET( 1, "cipher_update", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001056 return( ret );
1057 }
1058
1059 if( ssl->out_msglen != olen )
1060 {
1061 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect %d %d",
1062 ssl->out_msglen, olen ) );
Manuel Pégourié-Gonnarda8a25ae2013-10-27 13:48:15 +01001063 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001064 }
1065
1066 if( ( ret = cipher_finish( &ssl->transform_out->cipher_ctx_enc,
Paul Bakker45125bc2013-09-04 16:47:11 +02001067 ssl->out_msg + olen, &olen ) ) != 0 )
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001068 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001069 SSL_DEBUG_RET( 1, "cipher_finish", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001070 return( ret );
1071 }
1072
1073 if( 0 != olen )
1074 {
1075 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect %d %d",
1076 0, olen ) );
Manuel Pégourié-Gonnarda8a25ae2013-10-27 13:48:15 +01001077 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001078 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001079 }
Paul Bakker68884e32013-01-07 18:20:04 +01001080 else
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001081#endif /* POLARSSL_ARC4_C || POLARSSL_CIPHER_NULL_CIPHER */
Paul Bakker68884e32013-01-07 18:20:04 +01001082#if defined(POLARSSL_GCM_C)
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001083 if( ssl->transform_out->cipher_ctx_enc.cipher_info->mode ==
1084 POLARSSL_MODE_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001085 {
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001086 size_t enc_msglen, olen, totlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001087 unsigned char *enc_msg;
1088 unsigned char add_data[13];
1089 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1090
Paul Bakkerca4ab492012-04-18 14:23:57 +00001091 enc_msglen = ssl->out_msglen;
1092
1093 memcpy( add_data, ssl->out_ctr, 8 );
1094 add_data[8] = ssl->out_msgtype;
1095 add_data[9] = ssl->major_ver;
1096 add_data[10] = ssl->minor_ver;
1097 add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
1098 add_data[12] = ssl->out_msglen & 0xFF;
1099
1100 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1101 add_data, 13 );
1102
Paul Bakker68884e32013-01-07 18:20:04 +01001103 /*
1104 * Generate IV
1105 */
1106 ret = ssl->f_rng( ssl->p_rng,
Paul Bakker48916f92012-09-16 19:57:18 +00001107 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
Paul Bakker68884e32013-01-07 18:20:04 +01001108 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
1109 if( ret != 0 )
1110 return( ret );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001111
Paul Bakker68884e32013-01-07 18:20:04 +01001112 memcpy( ssl->out_iv,
1113 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
1114 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001115
Manuel Pégourié-Gonnard226d5da2013-09-05 13:19:22 +02001116 SSL_DEBUG_BUF( 4, "IV used", ssl->out_iv,
1117 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
1118
Paul Bakker68884e32013-01-07 18:20:04 +01001119 /*
1120 * Fix pointer positions and message length with added IV
1121 */
1122 enc_msg = ssl->out_msg;
1123 enc_msglen = ssl->out_msglen;
1124 ssl->out_msglen += ssl->transform_out->ivlen -
1125 ssl->transform_out->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001126
Paul Bakker68884e32013-01-07 18:20:04 +01001127 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
1128 "including %d bytes of padding",
1129 ssl->out_msglen, 0 ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001130
Paul Bakker68884e32013-01-07 18:20:04 +01001131 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
1132 ssl->out_msg, ssl->out_msglen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001133
Paul Bakker68884e32013-01-07 18:20:04 +01001134 /*
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001135 * Encrypt
1136 */
1137 if( ( ret = cipher_set_iv( &ssl->transform_out->cipher_ctx_enc,
1138 ssl->transform_out->iv_enc,
1139 ssl->transform_out->ivlen ) ) != 0 ||
1140 ( ret = cipher_reset( &ssl->transform_out->cipher_ctx_enc ) ) != 0 )
1141 {
1142 return( ret );
1143 }
1144
1145 if( ( ret = cipher_update_ad( &ssl->transform_out->cipher_ctx_enc,
1146 add_data, 13 ) ) != 0 )
1147 {
1148 return( ret );
1149 }
1150
1151 if( ( ret = cipher_update( &ssl->transform_out->cipher_ctx_enc,
1152 enc_msg, enc_msglen,
1153 enc_msg, &olen ) ) != 0 )
1154 {
1155 return( ret );
1156 }
1157 totlen = olen;
1158
1159 if( ( ret = cipher_finish( &ssl->transform_out->cipher_ctx_enc,
1160 enc_msg + olen, &olen ) ) != 0 )
1161 {
1162 return( ret );
1163 }
1164 totlen += olen;
1165
1166 if( totlen != enc_msglen )
1167 {
1168 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1169 return( -1 );
1170 }
1171
1172 /*
1173 * Authenticate
Paul Bakker68884e32013-01-07 18:20:04 +01001174 */
1175 ssl->out_msglen += 16;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001176
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001177 if( ( ret = cipher_write_tag( &ssl->transform_out->cipher_ctx_enc,
1178 enc_msg + enc_msglen, 16 ) ) != 0 )
1179 {
1180 return( ret );
1181 }
Paul Bakker68884e32013-01-07 18:20:04 +01001182
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001183 SSL_DEBUG_BUF( 4, "after encrypt: tag", enc_msg + enc_msglen, 16 );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001184 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001185 else
Paul Bakker68884e32013-01-07 18:20:04 +01001186#endif /* POLARSSL_GCM_C */
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001187#if defined(POLARSSL_CIPHER_MODE_CBC) && \
1188 ( defined(POLARSSL_AES_C) || defined(POLARSSL_CAMELLIA_C) )
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02001189 if( ssl->transform_out->cipher_ctx_enc.cipher_info->mode ==
1190 POLARSSL_MODE_CBC )
Paul Bakker5121ce52009-01-03 21:22:43 +00001191 {
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001192 int ret;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001193 unsigned char *enc_msg;
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02001194 size_t enc_msglen, padlen, olen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001195
Paul Bakker48916f92012-09-16 19:57:18 +00001196 padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
1197 ssl->transform_out->ivlen;
1198 if( padlen == ssl->transform_out->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001199 padlen = 0;
1200
1201 for( i = 0; i <= padlen; i++ )
1202 ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
1203
1204 ssl->out_msglen += padlen + 1;
1205
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001206 enc_msglen = ssl->out_msglen;
1207 enc_msg = ssl->out_msg;
1208
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001209#if defined(POLARSSL_SSL_PROTO_TLS1_1) || defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001210 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001211 * Prepend per-record IV for block cipher in TLS v1.1 and up as per
1212 * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001213 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001214 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001215 {
1216 /*
1217 * Generate IV
1218 */
Paul Bakker48916f92012-09-16 19:57:18 +00001219 int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc,
1220 ssl->transform_out->ivlen );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001221 if( ret != 0 )
1222 return( ret );
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001223
Paul Bakker92be97b2013-01-02 17:30:03 +01001224 memcpy( ssl->out_iv, ssl->transform_out->iv_enc,
Paul Bakker48916f92012-09-16 19:57:18 +00001225 ssl->transform_out->ivlen );
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001226
1227 /*
1228 * Fix pointer positions and message length with added IV
1229 */
Paul Bakker92be97b2013-01-02 17:30:03 +01001230 enc_msg = ssl->out_msg;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001231 enc_msglen = ssl->out_msglen;
Paul Bakker48916f92012-09-16 19:57:18 +00001232 ssl->out_msglen += ssl->transform_out->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001233 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001234#endif /* POLARSSL_SSL_PROTO_TLS1_1 || POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001235
Paul Bakker5121ce52009-01-03 21:22:43 +00001236 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001237 "including %d bytes of IV and %d bytes of padding",
Paul Bakker48916f92012-09-16 19:57:18 +00001238 ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001239
1240 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
Paul Bakker92be97b2013-01-02 17:30:03 +01001241 ssl->out_iv, ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001242
Paul Bakker45125bc2013-09-04 16:47:11 +02001243 if( ( ret = cipher_reset( &ssl->transform_out->cipher_ctx_enc ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001244 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001245 SSL_DEBUG_RET( 1, "cipher_reset", ret );
1246 return( ret );
1247 }
1248
1249 if( ( ret = cipher_set_iv( &ssl->transform_out->cipher_ctx_enc,
1250 ssl->transform_out->iv_enc,
1251 ssl->transform_out->ivlen ) ) != 0 )
1252 {
1253 SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001254 return( ret );
1255 }
Paul Bakker68884e32013-01-07 18:20:04 +01001256
Paul Bakkercca5b812013-08-31 17:40:26 +02001257 if( ( ret = cipher_update( &ssl->transform_out->cipher_ctx_enc,
1258 enc_msg, enc_msglen, enc_msg,
1259 &olen ) ) != 0 )
1260 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001261 SSL_DEBUG_RET( 1, "cipher_update", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001262 return( ret );
1263 }
Paul Bakker68884e32013-01-07 18:20:04 +01001264
Paul Bakkercca5b812013-08-31 17:40:26 +02001265 enc_msglen -= olen;
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001266
Paul Bakkercca5b812013-08-31 17:40:26 +02001267 if( ( ret = cipher_finish( &ssl->transform_out->cipher_ctx_enc,
Paul Bakker45125bc2013-09-04 16:47:11 +02001268 enc_msg + olen, &olen ) ) != 0 )
Paul Bakkercca5b812013-08-31 17:40:26 +02001269 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001270 SSL_DEBUG_RET( 1, "cipher_finish", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001271 return( ret );
1272 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001273
Paul Bakkercca5b812013-08-31 17:40:26 +02001274 if( enc_msglen != olen )
1275 {
1276 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect %d %d",
1277 enc_msglen, olen ) );
Manuel Pégourié-Gonnarda8a25ae2013-10-27 13:48:15 +01001278 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakkercca5b812013-08-31 17:40:26 +02001279 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001280
1281#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1)
Paul Bakkercca5b812013-08-31 17:40:26 +02001282 if( ssl->minor_ver < SSL_MINOR_VERSION_2 )
1283 {
1284 /*
1285 * Save IV in SSL3 and TLS1
1286 */
1287 memcpy( ssl->transform_out->iv_enc,
1288 ssl->transform_out->cipher_ctx_enc.iv,
1289 ssl->transform_out->ivlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001290 }
Paul Bakkercca5b812013-08-31 17:40:26 +02001291#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001292 }
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02001293 else
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001294#endif /* POLARSSL_CIPHER_MODE_CBC &&
1295 ( POLARSSL_AES_C || POLARSSL_CAMELLIA_C ) */
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02001296 {
1297 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1298 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1299 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001300
Paul Bakkerca4ab492012-04-18 14:23:57 +00001301 for( i = 8; i > 0; i-- )
1302 if( ++ssl->out_ctr[i - 1] != 0 )
1303 break;
1304
Paul Bakker5121ce52009-01-03 21:22:43 +00001305 SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
1306
1307 return( 0 );
1308}
1309
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001310#define POLARSSL_SSL_MAX_MAC_SIZE 48
Paul Bakkerfab5c822012-02-06 16:45:10 +00001311
Paul Bakker5121ce52009-01-03 21:22:43 +00001312static int ssl_decrypt_buf( ssl_context *ssl )
1313{
Paul Bakker45829992013-01-03 14:52:21 +01001314 size_t i, padlen = 0, correct = 1;
Paul Bakkerfab5c822012-02-06 16:45:10 +00001315 unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
Paul Bakker5121ce52009-01-03 21:22:43 +00001316
1317 SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
1318
Paul Bakker48916f92012-09-16 19:57:18 +00001319 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001320 {
1321 SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
Paul Bakker48916f92012-09-16 19:57:18 +00001322 ssl->in_msglen, ssl->transform_in->minlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001323 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001324 }
1325
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001326#if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER)
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001327 if( ssl->transform_in->cipher_ctx_dec.cipher_info->mode ==
1328 POLARSSL_MODE_STREAM )
Paul Bakker68884e32013-01-07 18:20:04 +01001329 {
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001330 int ret;
1331 size_t olen = 0;
1332
Paul Bakker68884e32013-01-07 18:20:04 +01001333 padlen = 0;
1334
Paul Bakker45125bc2013-09-04 16:47:11 +02001335 if( ( ret = cipher_reset( &ssl->transform_in->cipher_ctx_dec ) ) != 0 )
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001336 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001337 SSL_DEBUG_RET( 1, "cipher_reset", ret );
1338 return( ret );
1339 }
1340
1341 if( ( ret = cipher_set_iv( &ssl->transform_in->cipher_ctx_dec,
1342 ssl->transform_in->iv_dec,
1343 ssl->transform_in->ivlen ) ) != 0 )
1344 {
1345 SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001346 return( ret );
1347 }
1348
1349 if( ( ret = cipher_update( &ssl->transform_in->cipher_ctx_dec,
1350 ssl->in_msg, ssl->in_msglen, ssl->in_msg,
1351 &olen ) ) != 0 )
1352 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001353 SSL_DEBUG_RET( 1, "cipher_update", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001354 return( ret );
1355 }
1356
1357 if( ssl->in_msglen != olen )
1358 {
1359 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect" ) );
Manuel Pégourié-Gonnarda8a25ae2013-10-27 13:48:15 +01001360 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001361 }
1362
1363 if( ( ret = cipher_finish( &ssl->transform_in->cipher_ctx_dec,
Paul Bakker45125bc2013-09-04 16:47:11 +02001364 ssl->in_msg + olen, &olen ) ) != 0 )
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001365 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001366 SSL_DEBUG_RET( 1, "cipher_finish", ret );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001367 return( ret );
1368 }
1369
1370 if( 0 != olen )
1371 {
1372 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect" ) );
Manuel Pégourié-Gonnarda8a25ae2013-10-27 13:48:15 +01001373 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakkerea6ad3f2013-09-02 14:57:01 +02001374 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001375 }
Paul Bakker68884e32013-01-07 18:20:04 +01001376 else
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001377#endif /* POLARSSL_ARC4_C || POLARSSL_CIPHER_NULL_CIPHER */
Paul Bakker68884e32013-01-07 18:20:04 +01001378#if defined(POLARSSL_GCM_C)
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001379 if( ssl->transform_in->cipher_ctx_dec.cipher_info->mode ==
1380 POLARSSL_MODE_GCM )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001381 {
1382 unsigned char *dec_msg;
1383 unsigned char *dec_msg_result;
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001384 size_t dec_msglen, olen, totlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001385 unsigned char add_data[13];
1386 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1387
Paul Bakker68884e32013-01-07 18:20:04 +01001388 padlen = 0;
1389
1390 dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
1391 ssl->transform_in->fixed_ivlen );
1392 dec_msglen -= 16;
1393 dec_msg = ssl->in_msg;
1394 dec_msg_result = ssl->in_msg;
1395 ssl->in_msglen = dec_msglen;
1396
1397 memcpy( add_data, ssl->in_ctr, 8 );
1398 add_data[8] = ssl->in_msgtype;
1399 add_data[9] = ssl->major_ver;
1400 add_data[10] = ssl->minor_ver;
1401 add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
1402 add_data[12] = ssl->in_msglen & 0xFF;
1403
1404 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1405 add_data, 13 );
1406
1407 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
1408 ssl->in_iv,
1409 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
1410
1411 SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
1412 ssl->transform_in->ivlen );
1413 SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
1414
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001415 /*
1416 * Decrypt
1417 */
1418 if( ( ret = cipher_set_iv( &ssl->transform_in->cipher_ctx_dec,
1419 ssl->transform_in->iv_dec,
1420 ssl->transform_in->ivlen ) ) != 0 ||
1421 ( ret = cipher_reset( &ssl->transform_in->cipher_ctx_dec ) ) != 0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001422 {
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001423 return( ret );
1424 }
Paul Bakkerca4ab492012-04-18 14:23:57 +00001425
Manuel Pégourié-Gonnardd13a4092013-09-05 16:10:41 +02001426 if( ( ret = cipher_update_ad( &ssl->transform_in->cipher_ctx_dec,
1427 add_data, 13 ) ) != 0 )
1428 {
1429 return( ret );
1430 }
1431
1432 if( ( ret = cipher_update( &ssl->transform_in->cipher_ctx_dec,
1433 dec_msg, dec_msglen,
1434 dec_msg_result, &olen ) ) != 0 )
1435 {
1436 return( ret );
1437 }
1438 totlen = olen;
1439
1440 if( ( ret = cipher_finish( &ssl->transform_in->cipher_ctx_dec,
1441 dec_msg_result + olen, &olen ) ) != 0 )
1442 {
1443 return( ret );
1444 }
1445 totlen += olen;
1446
1447 if( totlen != dec_msglen )
1448 {
1449 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1450 return( -1 );
1451 }
1452
1453 /*
1454 * Authenticate
1455 */
1456 if( ( ret = cipher_check_tag( &ssl->transform_in->cipher_ctx_dec,
1457 dec_msg + dec_msglen, 16 ) ) != 0 )
1458 {
1459 SSL_DEBUG_RET( 1, "cipher_check_tag", ret );
Paul Bakker68884e32013-01-07 18:20:04 +01001460 return( POLARSSL_ERR_SSL_INVALID_MAC );
1461 }
Manuel Pégourié-Gonnard226d5da2013-09-05 13:19:22 +02001462
Paul Bakkerca4ab492012-04-18 14:23:57 +00001463 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001464 else
Paul Bakker68884e32013-01-07 18:20:04 +01001465#endif /* POLARSSL_GCM_C */
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001466#if defined(POLARSSL_CIPHER_MODE_CBC) && \
1467 ( defined(POLARSSL_AES_C) || defined(POLARSSL_CAMELLIA_C) )
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02001468 if( ssl->transform_in->cipher_ctx_dec.cipher_info->mode ==
1469 POLARSSL_MODE_CBC )
Paul Bakker5121ce52009-01-03 21:22:43 +00001470 {
Paul Bakker45829992013-01-03 14:52:21 +01001471 /*
1472 * Decrypt and check the padding
1473 */
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001474 int ret;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001475 unsigned char *dec_msg;
1476 unsigned char *dec_msg_result;
Paul Bakker23986e52011-04-24 08:57:21 +00001477 size_t dec_msglen;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001478 size_t minlen = 0;
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001479 size_t olen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001480
Paul Bakker5121ce52009-01-03 21:22:43 +00001481 /*
Paul Bakker45829992013-01-03 14:52:21 +01001482 * Check immediate ciphertext sanity
Paul Bakker5121ce52009-01-03 21:22:43 +00001483 */
Paul Bakker48916f92012-09-16 19:57:18 +00001484 if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001485 {
1486 SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
Paul Bakker48916f92012-09-16 19:57:18 +00001487 ssl->in_msglen, ssl->transform_in->ivlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001488 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001489 }
1490
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001491#if defined(POLARSSL_SSL_PROTO_TLS1_1) || defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker45829992013-01-03 14:52:21 +01001492 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
1493 minlen += ssl->transform_in->ivlen;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001494#endif
Paul Bakker45829992013-01-03 14:52:21 +01001495
1496 if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
1497 ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
1498 {
1499 SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
1500 ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) );
1501 return( POLARSSL_ERR_SSL_INVALID_MAC );
1502 }
1503
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001504 dec_msglen = ssl->in_msglen;
1505 dec_msg = ssl->in_msg;
1506 dec_msg_result = ssl->in_msg;
1507
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001508#if defined(POLARSSL_SSL_PROTO_TLS1_1) || defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001509 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001510 * Initialize for prepended IV for block cipher in TLS v1.1 and up
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001511 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001512 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001513 {
Paul Bakker48916f92012-09-16 19:57:18 +00001514 dec_msglen -= ssl->transform_in->ivlen;
1515 ssl->in_msglen -= ssl->transform_in->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001516
Paul Bakker48916f92012-09-16 19:57:18 +00001517 for( i = 0; i < ssl->transform_in->ivlen; i++ )
Paul Bakker92be97b2013-01-02 17:30:03 +01001518 ssl->transform_in->iv_dec[i] = ssl->in_iv[i];
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001519 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001520#endif /* POLARSSL_SSL_PROTO_TLS1_1 || POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001521
Paul Bakker45125bc2013-09-04 16:47:11 +02001522 if( ( ret = cipher_reset( &ssl->transform_in->cipher_ctx_dec ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001523 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001524 SSL_DEBUG_RET( 1, "cipher_reset", ret );
1525 return( ret );
1526 }
1527
1528 if( ( ret = cipher_set_iv( &ssl->transform_in->cipher_ctx_dec,
1529 ssl->transform_in->iv_dec,
1530 ssl->transform_in->ivlen ) ) != 0 )
1531 {
1532 SSL_DEBUG_RET( 1, "cipher_set_iv", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001533 return( ret );
1534 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001535
Paul Bakkercca5b812013-08-31 17:40:26 +02001536 if( ( ret = cipher_update( &ssl->transform_in->cipher_ctx_dec,
1537 dec_msg, dec_msglen, dec_msg_result,
1538 &olen ) ) != 0 )
1539 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001540 SSL_DEBUG_RET( 1, "cipher_update", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001541 return( ret );
1542 }
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001543
Paul Bakkercca5b812013-08-31 17:40:26 +02001544 dec_msglen -= olen;
1545 if( ( ret = cipher_finish( &ssl->transform_in->cipher_ctx_dec,
Paul Bakker45125bc2013-09-04 16:47:11 +02001546 dec_msg_result + olen, &olen ) ) != 0 )
Paul Bakkercca5b812013-08-31 17:40:26 +02001547 {
Paul Bakker45125bc2013-09-04 16:47:11 +02001548 SSL_DEBUG_RET( 1, "cipher_finish", ret );
Paul Bakkercca5b812013-08-31 17:40:26 +02001549 return( ret );
1550 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001551
Paul Bakkercca5b812013-08-31 17:40:26 +02001552 if( dec_msglen != olen )
1553 {
1554 SSL_DEBUG_MSG( 1, ( "total encrypted length incorrect" ) );
Manuel Pégourié-Gonnarda8a25ae2013-10-27 13:48:15 +01001555 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakkercca5b812013-08-31 17:40:26 +02001556 }
Paul Bakkerda02a7f2013-08-31 17:25:14 +02001557
1558#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1)
Paul Bakkercca5b812013-08-31 17:40:26 +02001559 if( ssl->minor_ver < SSL_MINOR_VERSION_2 )
1560 {
1561 /*
1562 * Save IV in SSL3 and TLS1
1563 */
1564 memcpy( ssl->transform_in->iv_dec,
1565 ssl->transform_in->cipher_ctx_dec.iv,
1566 ssl->transform_in->ivlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001567 }
Paul Bakkercca5b812013-08-31 17:40:26 +02001568#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001569
1570 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
Paul Bakker45829992013-01-03 14:52:21 +01001571
1572 if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
1573 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001574#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001575 SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
1576 ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001577#endif
Paul Bakker45829992013-01-03 14:52:21 +01001578 padlen = 0;
Paul Bakker45829992013-01-03 14:52:21 +01001579 correct = 0;
1580 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001581
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001582#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00001583 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1584 {
Paul Bakker48916f92012-09-16 19:57:18 +00001585 if( padlen > ssl->transform_in->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001586 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001587#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001588 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
1589 "should be no more than %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001590 padlen, ssl->transform_in->ivlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001591#endif
Paul Bakker45829992013-01-03 14:52:21 +01001592 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001593 }
1594 }
1595 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001596#endif
1597#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
1598 defined(POLARSSL_SSL_PROTO_TLS1_2)
1599 if( ssl->minor_ver > SSL_MINOR_VERSION_0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001600 {
1601 /*
Paul Bakker45829992013-01-03 14:52:21 +01001602 * TLSv1+: always check the padding up to the first failure
1603 * and fake check up to 256 bytes of padding
Paul Bakker5121ce52009-01-03 21:22:43 +00001604 */
Paul Bakkerca9c87e2013-09-25 18:52:37 +02001605 size_t pad_count = 0, real_count = 1;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001606 size_t padding_idx = ssl->in_msglen - padlen - 1;
1607
Paul Bakkerca9c87e2013-09-25 18:52:37 +02001608 for( i = 1; i <= 256; i++ )
1609 {
1610 real_count &= ( i <= padlen );
1611 pad_count += real_count *
1612 ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1613 }
Paul Bakkere47b34b2013-02-27 14:48:00 +01001614
1615 correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001616
Paul Bakkerd66f0702013-01-31 16:57:45 +01001617#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001618 if( padlen > 0 && correct == 0)
1619 SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001620#endif
Paul Bakkere47b34b2013-02-27 14:48:00 +01001621 padlen &= correct * 0x1FF;
Paul Bakker5121ce52009-01-03 21:22:43 +00001622 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001623 else
1624#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
1625 POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02001626 {
1627 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001628 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +02001629 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001630 }
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02001631 else
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001632#endif /* POLARSSL_CIPHER_MODE_CBC &&
1633 ( POLARSSL_AES_C || POLARSSL_CAMELLIA_C ) */
Manuel Pégourié-Gonnardf7dc3782013-09-13 14:10:44 +02001634 {
1635 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1636 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1637 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001638
1639 SSL_DEBUG_BUF( 4, "raw buffer after decryption",
1640 ssl->in_msg, ssl->in_msglen );
1641
1642 /*
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001643 * Always compute the MAC (RFC4346, CBCTIME), except for GCM of course
Paul Bakker5121ce52009-01-03 21:22:43 +00001644 */
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001645#if defined(POLARSSL_ARC4_C) || defined(POLARSSL_CIPHER_NULL_CIPHER) || \
1646 ( defined(POLARSSL_CIPHER_MODE_CBC) && \
1647 ( defined(POLARSSL_AES_C) || defined(POLARSSL_CAMELLIA_C) ) )
1648 if( ssl->transform_in->cipher_ctx_dec.cipher_info->mode !=
1649 POLARSSL_MODE_GCM )
1650 {
1651 ssl->in_msglen -= ( ssl->transform_in->maclen + padlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001652
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001653 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1654 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001655
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001656 memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001657
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001658#if defined(POLARSSL_SSL_PROTO_SSL3)
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001659 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1660 {
1661 ssl_mac( &ssl->transform_in->md_ctx_dec,
1662 ssl->transform_in->mac_dec,
1663 ssl->in_msg, ssl->in_msglen,
1664 ssl->in_ctr, ssl->in_msgtype );
1665 }
1666 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001667#endif /* POLARSSL_SSL_PROTO_SSL3 */
1668#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001669 defined(POLARSSL_SSL_PROTO_TLS1_2)
1670 if( ssl->minor_ver > SSL_MINOR_VERSION_0 )
1671 {
1672 /*
1673 * Process MAC and always update for padlen afterwards to make
1674 * total time independent of padlen
1675 *
1676 * extra_run compensates MAC check for padlen
1677 *
1678 * Known timing attacks:
1679 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
1680 *
1681 * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
1682 * correctly. (We round down instead of up, so -56 is the correct
1683 * value for our calculations instead of -55)
1684 */
1685 size_t j, extra_run = 0;
1686 extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
1687 ( 13 + ssl->in_msglen + 8 ) / 64;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001688
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001689 extra_run &= correct * 0xFF;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001690
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001691 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 13 );
1692 md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,
1693 ssl->in_msglen );
1694 md_hmac_finish( &ssl->transform_in->md_ctx_dec,
1695 ssl->in_msg + ssl->in_msglen );
1696 for( j = 0; j < extra_run; j++ )
1697 md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001698
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001699 md_hmac_reset( &ssl->transform_in->md_ctx_dec );
1700 }
1701 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001702#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001703 POLARSSL_SSL_PROTO_TLS1_2 */
1704 {
1705 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1706 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1707 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001708
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001709 SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen );
1710 SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
1711 ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001712
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001713 if( memcmp( tmp, ssl->in_msg + ssl->in_msglen,
1714 ssl->transform_in->maclen ) != 0 )
1715 {
Paul Bakkere47b34b2013-02-27 14:48:00 +01001716#if defined(POLARSSL_SSL_DEBUG_ALL)
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001717 SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001718#endif
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001719 correct = 0;
1720 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001721
Manuel Pégourié-Gonnard71096242013-10-25 19:31:25 +02001722 /*
1723 * Finally check the correct flag
1724 */
1725 if( correct == 0 )
1726 return( POLARSSL_ERR_SSL_INVALID_MAC );
1727 }
1728#endif /* GCM not the only option */
Paul Bakker5121ce52009-01-03 21:22:43 +00001729
1730 if( ssl->in_msglen == 0 )
1731 {
1732 ssl->nb_zero++;
1733
1734 /*
1735 * Three or more empty messages may be a DoS attack
1736 * (excessive CPU consumption).
1737 */
1738 if( ssl->nb_zero > 3 )
1739 {
1740 SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
1741 "messages, possible DoS attack" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001742 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001743 }
1744 }
1745 else
1746 ssl->nb_zero = 0;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001747
Paul Bakker23986e52011-04-24 08:57:21 +00001748 for( i = 8; i > 0; i-- )
1749 if( ++ssl->in_ctr[i - 1] != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001750 break;
1751
1752 SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
1753
1754 return( 0 );
1755}
1756
Paul Bakker2770fbd2012-07-03 13:30:23 +00001757#if defined(POLARSSL_ZLIB_SUPPORT)
1758/*
1759 * Compression/decompression functions
1760 */
1761static int ssl_compress_buf( ssl_context *ssl )
1762{
1763 int ret;
1764 unsigned char *msg_post = ssl->out_msg;
1765 size_t len_pre = ssl->out_msglen;
Paul Bakker16770332013-10-11 09:59:44 +02001766 unsigned char *msg_pre = ssl->compress_buf;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001767
1768 SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
1769
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001770 if( len_pre == 0 )
1771 return( 0 );
1772
Paul Bakker2770fbd2012-07-03 13:30:23 +00001773 memcpy( msg_pre, ssl->out_msg, len_pre );
1774
1775 SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
1776 ssl->out_msglen ) );
1777
1778 SSL_DEBUG_BUF( 4, "before compression: output payload",
1779 ssl->out_msg, ssl->out_msglen );
1780
Paul Bakker48916f92012-09-16 19:57:18 +00001781 ssl->transform_out->ctx_deflate.next_in = msg_pre;
1782 ssl->transform_out->ctx_deflate.avail_in = len_pre;
1783 ssl->transform_out->ctx_deflate.next_out = msg_post;
1784 ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001785
Paul Bakker48916f92012-09-16 19:57:18 +00001786 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001787 if( ret != Z_OK )
1788 {
1789 SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
1790 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1791 }
1792
Paul Bakker48916f92012-09-16 19:57:18 +00001793 ssl->out_msglen = SSL_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001794
Paul Bakker2770fbd2012-07-03 13:30:23 +00001795 SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
1796 ssl->out_msglen ) );
1797
1798 SSL_DEBUG_BUF( 4, "after compression: output payload",
1799 ssl->out_msg, ssl->out_msglen );
1800
1801 SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
1802
1803 return( 0 );
1804}
1805
1806static int ssl_decompress_buf( ssl_context *ssl )
1807{
1808 int ret;
1809 unsigned char *msg_post = ssl->in_msg;
1810 size_t len_pre = ssl->in_msglen;
Paul Bakker16770332013-10-11 09:59:44 +02001811 unsigned char *msg_pre = ssl->compress_buf;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001812
1813 SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
1814
Paul Bakkerabf2f8f2013-06-30 14:57:46 +02001815 if( len_pre == 0 )
1816 return( 0 );
1817
Paul Bakker2770fbd2012-07-03 13:30:23 +00001818 memcpy( msg_pre, ssl->in_msg, len_pre );
1819
1820 SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
1821 ssl->in_msglen ) );
1822
1823 SSL_DEBUG_BUF( 4, "before decompression: input payload",
1824 ssl->in_msg, ssl->in_msglen );
1825
Paul Bakker48916f92012-09-16 19:57:18 +00001826 ssl->transform_in->ctx_inflate.next_in = msg_pre;
1827 ssl->transform_in->ctx_inflate.avail_in = len_pre;
1828 ssl->transform_in->ctx_inflate.next_out = msg_post;
1829 ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001830
Paul Bakker48916f92012-09-16 19:57:18 +00001831 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001832 if( ret != Z_OK )
1833 {
1834 SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
1835 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1836 }
1837
Paul Bakker48916f92012-09-16 19:57:18 +00001838 ssl->in_msglen = SSL_MAX_CONTENT_LEN - ssl->transform_in->ctx_inflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001839
Paul Bakker2770fbd2012-07-03 13:30:23 +00001840 SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
1841 ssl->in_msglen ) );
1842
1843 SSL_DEBUG_BUF( 4, "after decompression: input payload",
1844 ssl->in_msg, ssl->in_msglen );
1845
1846 SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
1847
1848 return( 0 );
1849}
1850#endif /* POLARSSL_ZLIB_SUPPORT */
1851
Paul Bakker5121ce52009-01-03 21:22:43 +00001852/*
1853 * Fill the input message buffer
1854 */
Paul Bakker23986e52011-04-24 08:57:21 +00001855int ssl_fetch_input( ssl_context *ssl, size_t nb_want )
Paul Bakker5121ce52009-01-03 21:22:43 +00001856{
Paul Bakker23986e52011-04-24 08:57:21 +00001857 int ret;
1858 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001859
1860 SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
1861
1862 while( ssl->in_left < nb_want )
1863 {
1864 len = nb_want - ssl->in_left;
1865 ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
1866
1867 SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
1868 ssl->in_left, nb_want ) );
1869 SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
1870
Paul Bakker831a7552011-05-18 13:32:51 +00001871 if( ret == 0 )
1872 return( POLARSSL_ERR_SSL_CONN_EOF );
1873
Paul Bakker5121ce52009-01-03 21:22:43 +00001874 if( ret < 0 )
1875 return( ret );
1876
1877 ssl->in_left += ret;
1878 }
1879
1880 SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
1881
1882 return( 0 );
1883}
1884
1885/*
1886 * Flush any data not yet written
1887 */
1888int ssl_flush_output( ssl_context *ssl )
1889{
1890 int ret;
1891 unsigned char *buf;
1892
1893 SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
1894
1895 while( ssl->out_left > 0 )
1896 {
1897 SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
1898 5 + ssl->out_msglen, ssl->out_left ) );
1899
Paul Bakker5bd42292012-12-19 14:40:42 +01001900 buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
Paul Bakker5121ce52009-01-03 21:22:43 +00001901 ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
Paul Bakker186751d2012-05-08 13:16:14 +00001902
Paul Bakker5121ce52009-01-03 21:22:43 +00001903 SSL_DEBUG_RET( 2, "ssl->f_send", ret );
1904
1905 if( ret <= 0 )
1906 return( ret );
1907
1908 ssl->out_left -= ret;
1909 }
1910
1911 SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
1912
1913 return( 0 );
1914}
1915
1916/*
1917 * Record layer functions
1918 */
1919int ssl_write_record( ssl_context *ssl )
1920{
Paul Bakker05ef8352012-05-08 09:17:57 +00001921 int ret, done = 0;
Paul Bakker23986e52011-04-24 08:57:21 +00001922 size_t len = ssl->out_msglen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001923
1924 SSL_DEBUG_MSG( 2, ( "=> write record" ) );
1925
Paul Bakker5121ce52009-01-03 21:22:43 +00001926 if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
1927 {
1928 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
1929 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
1930 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
1931
Paul Bakker48916f92012-09-16 19:57:18 +00001932 ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001933 }
1934
Paul Bakker2770fbd2012-07-03 13:30:23 +00001935#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001936 if( ssl->transform_out != NULL &&
1937 ssl->session_out->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001938 {
1939 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
1940 {
1941 SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
1942 return( ret );
1943 }
1944
1945 len = ssl->out_msglen;
1946 }
1947#endif /*POLARSSL_ZLIB_SUPPORT */
1948
Paul Bakker05ef8352012-05-08 09:17:57 +00001949#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1950 if( ssl_hw_record_write != NULL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001951 {
Paul Bakker05ef8352012-05-08 09:17:57 +00001952 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001953
Paul Bakker05ef8352012-05-08 09:17:57 +00001954 ret = ssl_hw_record_write( ssl );
1955 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1956 {
1957 SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret );
1958 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1959 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001960
1961 if( ret == 0 )
1962 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001963 }
1964#endif
1965 if( !done )
1966 {
1967 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
1968 ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
1969 ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00001970 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1971 ssl->out_hdr[4] = (unsigned char)( len );
Paul Bakker05ef8352012-05-08 09:17:57 +00001972
Paul Bakker48916f92012-09-16 19:57:18 +00001973 if( ssl->transform_out != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001974 {
1975 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
1976 {
1977 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
1978 return( ret );
1979 }
1980
1981 len = ssl->out_msglen;
1982 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1983 ssl->out_hdr[4] = (unsigned char)( len );
1984 }
1985
1986 ssl->out_left = 5 + ssl->out_msglen;
1987
1988 SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
1989 "version = [%d:%d], msglen = %d",
1990 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
1991 ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
1992
1993 SSL_DEBUG_BUF( 4, "output record sent to network",
Paul Bakker5bd42292012-12-19 14:40:42 +01001994 ssl->out_hdr, 5 + ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001995 }
1996
Paul Bakker5121ce52009-01-03 21:22:43 +00001997 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1998 {
1999 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
2000 return( ret );
2001 }
2002
2003 SSL_DEBUG_MSG( 2, ( "<= write record" ) );
2004
2005 return( 0 );
2006}
2007
2008int ssl_read_record( ssl_context *ssl )
2009{
Paul Bakker05ef8352012-05-08 09:17:57 +00002010 int ret, done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002011
2012 SSL_DEBUG_MSG( 2, ( "=> read record" ) );
2013
Paul Bakker68884e32013-01-07 18:20:04 +01002014 SSL_DEBUG_BUF( 4, "input record from network",
2015 ssl->in_hdr, 5 + ssl->in_msglen );
2016
Paul Bakker5121ce52009-01-03 21:22:43 +00002017 if( ssl->in_hslen != 0 &&
2018 ssl->in_hslen < ssl->in_msglen )
2019 {
2020 /*
2021 * Get next Handshake message in the current record
2022 */
2023 ssl->in_msglen -= ssl->in_hslen;
2024
Paul Bakker8934a982011-08-05 11:11:53 +00002025 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
Paul Bakker48916f92012-09-16 19:57:18 +00002026 ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00002027
2028 ssl->in_hslen = 4;
2029 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
2030
2031 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
2032 " %d, type = %d, hslen = %d",
2033 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
2034
2035 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
2036 {
2037 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002038 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002039 }
2040
2041 if( ssl->in_msglen < ssl->in_hslen )
2042 {
2043 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002044 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002045 }
2046
Paul Bakker48916f92012-09-16 19:57:18 +00002047 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00002048
2049 return( 0 );
2050 }
2051
2052 ssl->in_hslen = 0;
2053
2054 /*
2055 * Read the record header and validate it
2056 */
2057 if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
2058 {
2059 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
2060 return( ret );
2061 }
2062
2063 ssl->in_msgtype = ssl->in_hdr[0];
2064 ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
2065
2066 SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
2067 "version = [%d:%d], msglen = %d",
2068 ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
2069 ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
2070
2071 if( ssl->in_hdr[1] != ssl->major_ver )
2072 {
2073 SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002074 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002075 }
2076
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002077 if( ssl->in_hdr[2] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00002078 {
2079 SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002080 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002081 }
2082
2083 /*
2084 * Make sure the message length is acceptable
2085 */
Paul Bakker48916f92012-09-16 19:57:18 +00002086 if( ssl->transform_in == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002087 {
2088 if( ssl->in_msglen < 1 ||
2089 ssl->in_msglen > SSL_MAX_CONTENT_LEN )
2090 {
2091 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002092 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002093 }
2094 }
2095 else
2096 {
Paul Bakker48916f92012-09-16 19:57:18 +00002097 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00002098 {
2099 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002100 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002101 }
2102
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002103#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00002104 if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
Paul Bakker48916f92012-09-16 19:57:18 +00002105 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN )
Paul Bakker5121ce52009-01-03 21:22:43 +00002106 {
2107 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002108 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002109 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002110#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002111
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002112#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
2113 defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker5121ce52009-01-03 21:22:43 +00002114 /*
2115 * TLS encrypted messages can have up to 256 bytes of padding
2116 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00002117 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 &&
Paul Bakker48916f92012-09-16 19:57:18 +00002118 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN + 256 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002119 {
2120 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002121 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002122 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002123#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002124 }
2125
2126 /*
2127 * Read and optionally decrypt the message contents
2128 */
2129 if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 )
2130 {
2131 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
2132 return( ret );
2133 }
2134
2135 SSL_DEBUG_BUF( 4, "input record from network",
2136 ssl->in_hdr, 5 + ssl->in_msglen );
2137
Paul Bakker05ef8352012-05-08 09:17:57 +00002138#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2139 if( ssl_hw_record_read != NULL)
2140 {
2141 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) );
2142
2143 ret = ssl_hw_record_read( ssl );
2144 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
2145 {
2146 SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret );
2147 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
2148 }
Paul Bakkerc7878112012-12-19 14:41:14 +01002149
2150 if( ret == 0 )
2151 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00002152 }
2153#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002154 if( !done && ssl->transform_in != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002155 {
2156 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
2157 {
Paul Bakker40865c82013-01-31 17:13:13 +01002158#if defined(POLARSSL_SSL_ALERT_MESSAGES)
2159 if( ret == POLARSSL_ERR_SSL_INVALID_MAC )
2160 {
2161 ssl_send_alert_message( ssl,
2162 SSL_ALERT_LEVEL_FATAL,
2163 SSL_ALERT_MSG_BAD_RECORD_MAC );
2164 }
2165#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002166 SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
2167 return( ret );
2168 }
2169
2170 SSL_DEBUG_BUF( 4, "input payload after decrypt",
2171 ssl->in_msg, ssl->in_msglen );
2172
2173 if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
2174 {
2175 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002176 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002177 }
2178 }
2179
Paul Bakker2770fbd2012-07-03 13:30:23 +00002180#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00002181 if( ssl->transform_in != NULL &&
2182 ssl->session_in->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002183 {
2184 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
2185 {
2186 SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
2187 return( ret );
2188 }
2189
2190 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
2191 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
2192 }
2193#endif /* POLARSSL_ZLIB_SUPPORT */
2194
Paul Bakker0a925182012-04-16 06:46:41 +00002195 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE &&
2196 ssl->in_msgtype != SSL_MSG_ALERT &&
2197 ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC &&
2198 ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
2199 {
2200 SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
2201
Paul Bakker48916f92012-09-16 19:57:18 +00002202 if( ( ret = ssl_send_alert_message( ssl,
2203 SSL_ALERT_LEVEL_FATAL,
2204 SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
Paul Bakker0a925182012-04-16 06:46:41 +00002205 {
2206 return( ret );
2207 }
2208
2209 return( POLARSSL_ERR_SSL_INVALID_RECORD );
2210 }
2211
Paul Bakker5121ce52009-01-03 21:22:43 +00002212 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
2213 {
2214 ssl->in_hslen = 4;
2215 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
2216
2217 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
2218 " %d, type = %d, hslen = %d",
2219 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
2220
2221 /*
2222 * Additional checks to validate the handshake header
2223 */
2224 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
2225 {
2226 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002227 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002228 }
2229
2230 if( ssl->in_msglen < ssl->in_hslen )
2231 {
2232 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002233 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002234 }
2235
Paul Bakker48916f92012-09-16 19:57:18 +00002236 if( ssl->state != SSL_HANDSHAKE_OVER )
2237 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00002238 }
2239
2240 if( ssl->in_msgtype == SSL_MSG_ALERT )
2241 {
2242 SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
2243 ssl->in_msg[0], ssl->in_msg[1] ) );
2244
2245 /*
2246 * Ignore non-fatal alerts, except close_notify
2247 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002248 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002249 {
Paul Bakker2770fbd2012-07-03 13:30:23 +00002250 SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
2251 ssl->in_msg[1] ) );
Paul Bakker9d781402011-05-09 16:17:09 +00002252 /**
2253 * Subtract from error code as ssl->in_msg[1] is 7-bit positive
2254 * error identifier.
2255 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00002256 return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002257 }
2258
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002259 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2260 ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00002261 {
2262 SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002263 return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00002264 }
2265 }
2266
2267 ssl->in_left = 0;
2268
2269 SSL_DEBUG_MSG( 2, ( "<= read record" ) );
2270
2271 return( 0 );
2272}
2273
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002274int ssl_send_fatal_handshake_failure( ssl_context *ssl )
2275{
2276 int ret;
2277
2278 if( ( ret = ssl_send_alert_message( ssl,
2279 SSL_ALERT_LEVEL_FATAL,
2280 SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
2281 {
2282 return( ret );
2283 }
2284
2285 return( 0 );
2286}
2287
Paul Bakker0a925182012-04-16 06:46:41 +00002288int ssl_send_alert_message( ssl_context *ssl,
2289 unsigned char level,
2290 unsigned char message )
2291{
2292 int ret;
2293
2294 SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
2295
2296 ssl->out_msgtype = SSL_MSG_ALERT;
2297 ssl->out_msglen = 2;
2298 ssl->out_msg[0] = level;
2299 ssl->out_msg[1] = message;
2300
2301 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2302 {
2303 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2304 return( ret );
2305 }
2306
2307 SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
2308
2309 return( 0 );
2310}
2311
Paul Bakker5121ce52009-01-03 21:22:43 +00002312/*
2313 * Handshake functions
2314 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002315#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
2316 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002317 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
2318 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00002319int ssl_write_certificate( ssl_context *ssl )
2320{
Paul Bakkered27a042013-04-18 22:46:23 +02002321 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002322 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002323
2324 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
2325
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002326 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02002327 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
2328 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002329 {
2330 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2331 ssl->state++;
2332 return( 0 );
2333 }
2334
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002335 SSL_DEBUG_MSG( 1, ( "should not happen" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002336 return( ret );
2337}
2338
2339int ssl_parse_certificate( ssl_context *ssl )
2340{
2341 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
2342 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
2343
2344 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2345
2346 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02002347 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
2348 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002349 {
2350 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2351 ssl->state++;
2352 return( 0 );
2353 }
2354
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002355 SSL_DEBUG_MSG( 1, ( "should not happen" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002356 return( ret );
2357}
2358#else
2359int ssl_write_certificate( ssl_context *ssl )
2360{
2361 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
2362 size_t i, n;
Paul Bakkerc559c7a2013-09-18 14:13:26 +02002363 const x509_crt *crt;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002364 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
2365
2366 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
2367
2368 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02002369 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
2370 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002371 {
2372 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2373 ssl->state++;
2374 return( 0 );
2375 }
2376
Paul Bakker5121ce52009-01-03 21:22:43 +00002377 if( ssl->endpoint == SSL_IS_CLIENT )
2378 {
2379 if( ssl->client_auth == 0 )
2380 {
2381 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2382 ssl->state++;
2383 return( 0 );
2384 }
2385
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002386#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00002387 /*
2388 * If using SSLv3 and got no cert, send an Alert message
2389 * (otherwise an empty Certificate message will be sent).
2390 */
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002391 if( ssl_own_cert( ssl ) == NULL &&
Paul Bakker5121ce52009-01-03 21:22:43 +00002392 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2393 {
2394 ssl->out_msglen = 2;
2395 ssl->out_msgtype = SSL_MSG_ALERT;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002396 ssl->out_msg[0] = SSL_ALERT_LEVEL_WARNING;
2397 ssl->out_msg[1] = SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00002398
2399 SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
2400 goto write_msg;
2401 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002402#endif /* POLARSSL_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002403 }
2404 else /* SSL_IS_SERVER */
2405 {
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002406 if( ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002407 {
2408 SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002409 return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002410 }
2411 }
2412
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002413 SSL_DEBUG_CRT( 3, "own certificate", ssl_own_cert( ssl ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002414
2415 /*
2416 * 0 . 0 handshake type
2417 * 1 . 3 handshake length
2418 * 4 . 6 length of all certs
2419 * 7 . 9 length of cert. 1
2420 * 10 . n-1 peer certificate
2421 * n . n+2 length of cert. 2
2422 * n+3 . ... upper level cert, etc.
2423 */
2424 i = 7;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002425 crt = ssl_own_cert( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00002426
Paul Bakker29087132010-03-21 21:03:34 +00002427 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002428 {
2429 n = crt->raw.len;
2430 if( i + 3 + n > SSL_MAX_CONTENT_LEN )
2431 {
2432 SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
2433 i + 3 + n, SSL_MAX_CONTENT_LEN ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002434 return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002435 }
2436
2437 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
2438 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
2439 ssl->out_msg[i + 2] = (unsigned char)( n );
2440
2441 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
2442 i += n; crt = crt->next;
2443 }
2444
2445 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
2446 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
2447 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
2448
2449 ssl->out_msglen = i;
2450 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2451 ssl->out_msg[0] = SSL_HS_CERTIFICATE;
2452
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002453#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00002454write_msg:
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002455#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002456
2457 ssl->state++;
2458
2459 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2460 {
2461 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2462 return( ret );
2463 }
2464
2465 SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
2466
Paul Bakkered27a042013-04-18 22:46:23 +02002467 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002468}
2469
2470int ssl_parse_certificate( ssl_context *ssl )
2471{
Paul Bakkered27a042013-04-18 22:46:23 +02002472 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker23986e52011-04-24 08:57:21 +00002473 size_t i, n;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002474 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002475
2476 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2477
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002478 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02002479 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
2480 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002481 {
2482 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2483 ssl->state++;
2484 return( 0 );
2485 }
2486
Paul Bakker5121ce52009-01-03 21:22:43 +00002487 if( ssl->endpoint == SSL_IS_SERVER &&
2488 ssl->authmode == SSL_VERIFY_NONE )
2489 {
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002490 ssl->session_negotiate->verify_result = BADCERT_SKIP_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00002491 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2492 ssl->state++;
2493 return( 0 );
2494 }
2495
2496 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2497 {
2498 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2499 return( ret );
2500 }
2501
2502 ssl->state++;
2503
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002504#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker5121ce52009-01-03 21:22:43 +00002505 /*
2506 * Check if the client sent an empty certificate
2507 */
2508 if( ssl->endpoint == SSL_IS_SERVER &&
2509 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2510 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002511 if( ssl->in_msglen == 2 &&
2512 ssl->in_msgtype == SSL_MSG_ALERT &&
2513 ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2514 ssl->in_msg[1] == SSL_ALERT_MSG_NO_CERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002515 {
2516 SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2517
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002518 ssl->session_negotiate->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002519 if( ssl->authmode == SSL_VERIFY_OPTIONAL )
2520 return( 0 );
2521 else
Paul Bakker40e46942009-01-03 21:51:57 +00002522 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002523 }
2524 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002525#endif /* POLARSSL_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002526
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002527#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
2528 defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker5121ce52009-01-03 21:22:43 +00002529 if( ssl->endpoint == SSL_IS_SERVER &&
2530 ssl->minor_ver != SSL_MINOR_VERSION_0 )
2531 {
2532 if( ssl->in_hslen == 7 &&
2533 ssl->in_msgtype == SSL_MSG_HANDSHAKE &&
2534 ssl->in_msg[0] == SSL_HS_CERTIFICATE &&
2535 memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
2536 {
2537 SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2538
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02002539 ssl->session_negotiate->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002540 if( ssl->authmode == SSL_VERIFY_REQUIRED )
Paul Bakker40e46942009-01-03 21:51:57 +00002541 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002542 else
2543 return( 0 );
2544 }
2545 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002546#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
2547 POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002548
2549 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2550 {
2551 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002552 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002553 }
2554
2555 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
2556 {
2557 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002558 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002559 }
2560
2561 /*
2562 * Same message structure as in ssl_write_certificate()
2563 */
2564 n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
2565
2566 if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
2567 {
2568 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002569 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002570 }
2571
Manuel Pégourié-Gonnardbfb355c2013-09-07 17:27:43 +02002572 /* In case we tried to reuse a session but it failed */
2573 if( ssl->session_negotiate->peer_cert != NULL )
2574 {
Paul Bakker7c6b2c32013-09-16 13:49:26 +02002575 x509_crt_free( ssl->session_negotiate->peer_cert );
Manuel Pégourié-Gonnardbfb355c2013-09-07 17:27:43 +02002576 polarssl_free( ssl->session_negotiate->peer_cert );
2577 }
2578
Paul Bakkerc559c7a2013-09-18 14:13:26 +02002579 if( ( ssl->session_negotiate->peer_cert = (x509_crt *) polarssl_malloc(
2580 sizeof( x509_crt ) ) ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002581 {
2582 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
Paul Bakkerc559c7a2013-09-18 14:13:26 +02002583 sizeof( x509_crt ) ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002584 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002585 }
2586
Paul Bakkerb6b09562013-09-18 14:17:41 +02002587 x509_crt_init( ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00002588
2589 i = 7;
2590
2591 while( i < ssl->in_hslen )
2592 {
2593 if( ssl->in_msg[i] != 0 )
2594 {
2595 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002596 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002597 }
2598
2599 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2600 | (unsigned int) ssl->in_msg[i + 2];
2601 i += 3;
2602
2603 if( n < 128 || i + n > ssl->in_hslen )
2604 {
2605 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002606 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002607 }
2608
Paul Bakkerddf26b42013-09-18 13:46:23 +02002609 ret = x509_crt_parse_der( ssl->session_negotiate->peer_cert,
2610 ssl->in_msg + i, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002611 if( ret != 0 )
2612 {
Paul Bakkerddf26b42013-09-18 13:46:23 +02002613 SSL_DEBUG_RET( 1, " x509_crt_parse_der", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002614 return( ret );
2615 }
2616
2617 i += n;
2618 }
2619
Paul Bakker48916f92012-09-16 19:57:18 +00002620 SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00002621
2622 if( ssl->authmode != SSL_VERIFY_NONE )
2623 {
2624 if( ssl->ca_chain == NULL )
2625 {
2626 SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002627 return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002628 }
2629
Paul Bakkerddf26b42013-09-18 13:46:23 +02002630 ret = x509_crt_verify( ssl->session_negotiate->peer_cert,
2631 ssl->ca_chain, ssl->ca_crl, ssl->peer_cn,
2632 &ssl->session_negotiate->verify_result,
2633 ssl->f_vrfy, ssl->p_vrfy );
Paul Bakker5121ce52009-01-03 21:22:43 +00002634
2635 if( ret != 0 )
2636 SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2637
2638 if( ssl->authmode != SSL_VERIFY_REQUIRED )
2639 ret = 0;
2640 }
2641
2642 SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
2643
2644 return( ret );
2645}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002646#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2647 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2648 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002649
2650int ssl_write_change_cipher_spec( ssl_context *ssl )
2651{
2652 int ret;
2653
2654 SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
2655
2656 ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
2657 ssl->out_msglen = 1;
2658 ssl->out_msg[0] = 1;
2659
Paul Bakker5121ce52009-01-03 21:22:43 +00002660 ssl->state++;
2661
2662 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2663 {
2664 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2665 return( ret );
2666 }
2667
2668 SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
2669
2670 return( 0 );
2671}
2672
2673int ssl_parse_change_cipher_spec( ssl_context *ssl )
2674{
2675 int ret;
2676
2677 SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
2678
Paul Bakker5121ce52009-01-03 21:22:43 +00002679 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2680 {
2681 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2682 return( ret );
2683 }
2684
2685 if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
2686 {
2687 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002688 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002689 }
2690
2691 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
2692 {
2693 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002694 return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
Paul Bakker5121ce52009-01-03 21:22:43 +00002695 }
2696
2697 ssl->state++;
2698
2699 SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
2700
2701 return( 0 );
2702}
2703
Paul Bakker41c83d32013-03-20 14:39:14 +01002704void ssl_optimize_checksum( ssl_context *ssl,
2705 const ssl_ciphersuite_t *ciphersuite_info )
Paul Bakker380da532012-04-18 16:10:25 +00002706{
Paul Bakkerfb08fd22013-08-27 15:06:26 +02002707 ((void) ciphersuite_info);
Paul Bakker769075d2012-11-24 11:26:46 +01002708
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002709#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
2710 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker380da532012-04-18 16:10:25 +00002711 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00002712 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker380da532012-04-18 16:10:25 +00002713 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002714#endif
2715#if defined(POLARSSL_SSL_PROTO_TLS1_2)
2716#if defined(POLARSSL_SHA512_C)
2717 if( ciphersuite_info->mac == POLARSSL_MD_SHA384 )
2718 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
2719 else
2720#endif
2721#if defined(POLARSSL_SHA256_C)
2722 if( ciphersuite_info->mac != POLARSSL_MD_SHA384 )
Paul Bakker48916f92012-09-16 19:57:18 +00002723 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002724 else
2725#endif
2726#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
2727 /* Should never happen */
2728 return;
Paul Bakker380da532012-04-18 16:10:25 +00002729}
Paul Bakkerf7abd422013-04-16 13:15:56 +02002730
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002731static void ssl_update_checksum_start( ssl_context *ssl,
2732 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002733{
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002734#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
2735 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker48916f92012-09-16 19:57:18 +00002736 md5_update( &ssl->handshake->fin_md5 , buf, len );
2737 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002738#endif
2739#if defined(POLARSSL_SSL_PROTO_TLS1_2)
2740#if defined(POLARSSL_SHA256_C)
Paul Bakker9e36f042013-06-30 14:34:05 +02002741 sha256_update( &ssl->handshake->fin_sha256, buf, len );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002742#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02002743#if defined(POLARSSL_SHA512_C)
2744 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002745#endif
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002746#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00002747}
2748
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002749#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
2750 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002751static void ssl_update_checksum_md5sha1( ssl_context *ssl,
2752 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002753{
Paul Bakker48916f92012-09-16 19:57:18 +00002754 md5_update( &ssl->handshake->fin_md5 , buf, len );
2755 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002756}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002757#endif
Paul Bakker380da532012-04-18 16:10:25 +00002758
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002759#if defined(POLARSSL_SSL_PROTO_TLS1_2)
2760#if defined(POLARSSL_SHA256_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002761static void ssl_update_checksum_sha256( ssl_context *ssl,
2762 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002763{
Paul Bakker9e36f042013-06-30 14:34:05 +02002764 sha256_update( &ssl->handshake->fin_sha256, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002765}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002766#endif
Paul Bakker380da532012-04-18 16:10:25 +00002767
Paul Bakker9e36f042013-06-30 14:34:05 +02002768#if defined(POLARSSL_SHA512_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002769static void ssl_update_checksum_sha384( ssl_context *ssl,
2770 const unsigned char *buf, size_t len )
Paul Bakker380da532012-04-18 16:10:25 +00002771{
Paul Bakker9e36f042013-06-30 14:34:05 +02002772 sha512_update( &ssl->handshake->fin_sha512, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002773}
Paul Bakker769075d2012-11-24 11:26:46 +01002774#endif
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002775#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00002776
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002777#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002778static void ssl_calc_finished_ssl(
2779 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002780{
Paul Bakker3c2122f2013-06-24 19:03:14 +02002781 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002782 md5_context md5;
2783 sha1_context sha1;
2784
Paul Bakker5121ce52009-01-03 21:22:43 +00002785 unsigned char padbuf[48];
2786 unsigned char md5sum[16];
2787 unsigned char sha1sum[20];
2788
Paul Bakker48916f92012-09-16 19:57:18 +00002789 ssl_session *session = ssl->session_negotiate;
2790 if( !session )
2791 session = ssl->session;
2792
Paul Bakker1ef83d62012-04-11 12:09:53 +00002793 SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
2794
Paul Bakker48916f92012-09-16 19:57:18 +00002795 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2796 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002797
2798 /*
2799 * SSLv3:
2800 * hash =
2801 * MD5( master + pad2 +
2802 * MD5( handshake + sender + master + pad1 ) )
2803 * + SHA1( master + pad2 +
2804 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002805 */
2806
Paul Bakker90995b52013-06-24 19:20:35 +02002807#if !defined(POLARSSL_MD5_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002808 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002809 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002810#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002811
Paul Bakker90995b52013-06-24 19:20:35 +02002812#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker5121ce52009-01-03 21:22:43 +00002813 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002814 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002815#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002816
Paul Bakker3c2122f2013-06-24 19:03:14 +02002817 sender = ( from == SSL_IS_CLIENT ) ? "CLNT"
2818 : "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00002819
Paul Bakker1ef83d62012-04-11 12:09:53 +00002820 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002821
Paul Bakker3c2122f2013-06-24 19:03:14 +02002822 md5_update( &md5, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002823 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002824 md5_update( &md5, padbuf, 48 );
2825 md5_finish( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002826
Paul Bakker3c2122f2013-06-24 19:03:14 +02002827 sha1_update( &sha1, (const unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002828 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002829 sha1_update( &sha1, padbuf, 40 );
2830 sha1_finish( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002831
Paul Bakker1ef83d62012-04-11 12:09:53 +00002832 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002833
Paul Bakker1ef83d62012-04-11 12:09:53 +00002834 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +00002835 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002836 md5_update( &md5, padbuf, 48 );
2837 md5_update( &md5, md5sum, 16 );
2838 md5_finish( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00002839
Paul Bakker1ef83d62012-04-11 12:09:53 +00002840 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +00002841 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002842 sha1_update( &sha1, padbuf , 40 );
2843 sha1_update( &sha1, sha1sum, 20 );
2844 sha1_finish( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002845
Paul Bakker1ef83d62012-04-11 12:09:53 +00002846 SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002847
Paul Bakker1ef83d62012-04-11 12:09:53 +00002848 memset( &md5, 0, sizeof( md5_context ) );
2849 memset( &sha1, 0, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002850
2851 memset( padbuf, 0, sizeof( padbuf ) );
2852 memset( md5sum, 0, sizeof( md5sum ) );
2853 memset( sha1sum, 0, sizeof( sha1sum ) );
2854
2855 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2856}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002857#endif /* POLARSSL_SSL_PROTO_SSL3 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002858
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002859#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002860static void ssl_calc_finished_tls(
2861 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002862{
Paul Bakker1ef83d62012-04-11 12:09:53 +00002863 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002864 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002865 md5_context md5;
Paul Bakker5121ce52009-01-03 21:22:43 +00002866 sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002867 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00002868
Paul Bakker48916f92012-09-16 19:57:18 +00002869 ssl_session *session = ssl->session_negotiate;
2870 if( !session )
2871 session = ssl->session;
2872
Paul Bakker1ef83d62012-04-11 12:09:53 +00002873 SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002874
Paul Bakker48916f92012-09-16 19:57:18 +00002875 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2876 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002877
Paul Bakker1ef83d62012-04-11 12:09:53 +00002878 /*
2879 * TLSv1:
2880 * hash = PRF( master, finished_label,
2881 * MD5( handshake ) + SHA1( handshake ) )[0..11]
2882 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002883
Paul Bakker90995b52013-06-24 19:20:35 +02002884#if !defined(POLARSSL_MD5_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002885 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
2886 md5.state, sizeof( md5.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002887#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002888
Paul Bakker90995b52013-06-24 19:20:35 +02002889#if !defined(POLARSSL_SHA1_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002890 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
2891 sha1.state, sizeof( sha1.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002892#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002893
2894 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002895 ? "client finished"
2896 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002897
2898 md5_finish( &md5, padbuf );
2899 sha1_finish( &sha1, padbuf + 16 );
2900
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002901 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002902 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002903
2904 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2905
2906 memset( &md5, 0, sizeof( md5_context ) );
2907 memset( &sha1, 0, sizeof( sha1_context ) );
2908
2909 memset( padbuf, 0, sizeof( padbuf ) );
2910
2911 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2912}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002913#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00002914
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002915#if defined(POLARSSL_SSL_PROTO_TLS1_2)
2916#if defined(POLARSSL_SHA256_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002917static void ssl_calc_finished_tls_sha256(
Paul Bakker1ef83d62012-04-11 12:09:53 +00002918 ssl_context *ssl, unsigned char *buf, int from )
2919{
2920 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002921 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002922 sha256_context sha256;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002923 unsigned char padbuf[32];
2924
Paul Bakker48916f92012-09-16 19:57:18 +00002925 ssl_session *session = ssl->session_negotiate;
2926 if( !session )
2927 session = ssl->session;
2928
Paul Bakker380da532012-04-18 16:10:25 +00002929 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002930
Paul Bakker9e36f042013-06-30 14:34:05 +02002931 memcpy( &sha256, &ssl->handshake->fin_sha256, sizeof(sha256_context) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002932
2933 /*
2934 * TLSv1.2:
2935 * hash = PRF( master, finished_label,
2936 * Hash( handshake ) )[0.11]
2937 */
2938
Paul Bakker9e36f042013-06-30 14:34:05 +02002939#if !defined(POLARSSL_SHA256_ALT)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002940 SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
Paul Bakker9e36f042013-06-30 14:34:05 +02002941 sha256.state, sizeof( sha256.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002942#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002943
2944 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002945 ? "client finished"
2946 : "server finished";
Paul Bakker1ef83d62012-04-11 12:09:53 +00002947
Paul Bakker9e36f042013-06-30 14:34:05 +02002948 sha256_finish( &sha256, padbuf );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002949
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002950 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002951 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002952
2953 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2954
Paul Bakker9e36f042013-06-30 14:34:05 +02002955 memset( &sha256, 0, sizeof( sha256_context ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002956
2957 memset( padbuf, 0, sizeof( padbuf ) );
2958
2959 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2960}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002961#endif /* POLARSSL_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +00002962
Paul Bakker9e36f042013-06-30 14:34:05 +02002963#if defined(POLARSSL_SHA512_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002964static void ssl_calc_finished_tls_sha384(
2965 ssl_context *ssl, unsigned char *buf, int from )
2966{
2967 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002968 const char *sender;
Paul Bakker9e36f042013-06-30 14:34:05 +02002969 sha512_context sha512;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002970 unsigned char padbuf[48];
2971
Paul Bakker48916f92012-09-16 19:57:18 +00002972 ssl_session *session = ssl->session_negotiate;
2973 if( !session )
2974 session = ssl->session;
2975
Paul Bakker380da532012-04-18 16:10:25 +00002976 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002977
Paul Bakker9e36f042013-06-30 14:34:05 +02002978 memcpy( &sha512, &ssl->handshake->fin_sha512, sizeof(sha512_context) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002979
2980 /*
2981 * TLSv1.2:
2982 * hash = PRF( master, finished_label,
2983 * Hash( handshake ) )[0.11]
2984 */
2985
Paul Bakker9e36f042013-06-30 14:34:05 +02002986#if !defined(POLARSSL_SHA512_ALT)
2987 SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *)
2988 sha512.state, sizeof( sha512.state ) );
Paul Bakker90995b52013-06-24 19:20:35 +02002989#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002990
2991 sender = ( from == SSL_IS_CLIENT )
Paul Bakker3c2122f2013-06-24 19:03:14 +02002992 ? "client finished"
2993 : "server finished";
Paul Bakkerca4ab492012-04-18 14:23:57 +00002994
Paul Bakker9e36f042013-06-30 14:34:05 +02002995 sha512_finish( &sha512, padbuf );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002996
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02002997 ssl->handshake->tls_prf( session->master, 48, sender,
Paul Bakker48916f92012-09-16 19:57:18 +00002998 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002999
3000 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
3001
Paul Bakker9e36f042013-06-30 14:34:05 +02003002 memset( &sha512, 0, sizeof( sha512_context ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003003
3004 memset( padbuf, 0, sizeof( padbuf ) );
3005
3006 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
3007}
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003008#endif /* POLARSSL_SHA512_C */
3009#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +00003010
Paul Bakker48916f92012-09-16 19:57:18 +00003011void ssl_handshake_wrapup( ssl_context *ssl )
3012{
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02003013 int resume = ssl->handshake->resume;
3014
Paul Bakker48916f92012-09-16 19:57:18 +00003015 SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
3016
3017 /*
3018 * Free our handshake params
3019 */
3020 ssl_handshake_free( ssl->handshake );
Paul Bakker6e339b52013-07-03 13:37:05 +02003021 polarssl_free( ssl->handshake );
Paul Bakker48916f92012-09-16 19:57:18 +00003022 ssl->handshake = NULL;
3023
3024 /*
3025 * Switch in our now active transform context
3026 */
3027 if( ssl->transform )
3028 {
3029 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02003030 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003031 }
3032 ssl->transform = ssl->transform_negotiate;
3033 ssl->transform_negotiate = NULL;
3034
Paul Bakker0a597072012-09-25 21:55:46 +00003035 if( ssl->session )
3036 {
3037 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02003038 polarssl_free( ssl->session );
Paul Bakker0a597072012-09-25 21:55:46 +00003039 }
3040 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00003041 ssl->session_negotiate = NULL;
3042
Paul Bakker0a597072012-09-25 21:55:46 +00003043 /*
3044 * Add cache entry
3045 */
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02003046 if( ssl->f_set_cache != NULL &&
3047 ssl->session->length != 0 &&
3048 resume == 0 )
3049 {
Paul Bakker0a597072012-09-25 21:55:46 +00003050 if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 )
3051 SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02003052 }
Paul Bakker0a597072012-09-25 21:55:46 +00003053
Paul Bakker48916f92012-09-16 19:57:18 +00003054 ssl->state++;
3055
3056 SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
3057}
3058
Paul Bakker1ef83d62012-04-11 12:09:53 +00003059int ssl_write_finished( ssl_context *ssl )
3060{
3061 int ret, hash_len;
3062
3063 SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
3064
Paul Bakker92be97b2013-01-02 17:30:03 +01003065 /*
3066 * Set the out_msg pointer to the correct location based on IV length
3067 */
3068 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
3069 {
3070 ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -
3071 ssl->transform_negotiate->fixed_ivlen;
3072 }
3073 else
3074 ssl->out_msg = ssl->out_iv;
3075
Paul Bakker48916f92012-09-16 19:57:18 +00003076 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00003077
3078 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00003079 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
3080
Paul Bakker48916f92012-09-16 19:57:18 +00003081 ssl->verify_data_len = hash_len;
3082 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
3083
Paul Bakker5121ce52009-01-03 21:22:43 +00003084 ssl->out_msglen = 4 + hash_len;
3085 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
3086 ssl->out_msg[0] = SSL_HS_FINISHED;
3087
3088 /*
3089 * In case of session resuming, invert the client and server
3090 * ChangeCipherSpec messages order.
3091 */
Paul Bakker0a597072012-09-25 21:55:46 +00003092 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003093 {
3094 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker48916f92012-09-16 19:57:18 +00003095 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00003096 else
3097 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
3098 }
3099 else
3100 ssl->state++;
3101
Paul Bakker48916f92012-09-16 19:57:18 +00003102 /*
3103 * Switch to our negotiated transform and session parameters for outbound data.
3104 */
3105 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
3106 ssl->transform_out = ssl->transform_negotiate;
3107 ssl->session_out = ssl->session_negotiate;
3108 memset( ssl->out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003109
Paul Bakker07eb38b2012-12-19 14:42:06 +01003110#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3111 if( ssl_hw_record_activate != NULL)
3112 {
3113 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
3114 {
3115 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
3116 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
3117 }
3118 }
3119#endif
3120
Paul Bakker5121ce52009-01-03 21:22:43 +00003121 if( ( ret = ssl_write_record( ssl ) ) != 0 )
3122 {
3123 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
3124 return( ret );
3125 }
3126
3127 SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
3128
3129 return( 0 );
3130}
3131
3132int ssl_parse_finished( ssl_context *ssl )
3133{
Paul Bakker23986e52011-04-24 08:57:21 +00003134 int ret;
3135 unsigned int hash_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00003136 unsigned char buf[36];
3137
3138 SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
3139
Paul Bakker48916f92012-09-16 19:57:18 +00003140 ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003141
Paul Bakker48916f92012-09-16 19:57:18 +00003142 /*
3143 * Switch to our negotiated transform and session parameters for inbound data.
3144 */
3145 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
3146 ssl->transform_in = ssl->transform_negotiate;
3147 ssl->session_in = ssl->session_negotiate;
3148 memset( ssl->in_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003149
Paul Bakker92be97b2013-01-02 17:30:03 +01003150 /*
3151 * Set the in_msg pointer to the correct location based on IV length
3152 */
3153 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
3154 {
3155 ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -
3156 ssl->transform_negotiate->fixed_ivlen;
3157 }
3158 else
3159 ssl->in_msg = ssl->in_iv;
3160
Paul Bakker07eb38b2012-12-19 14:42:06 +01003161#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3162 if( ssl_hw_record_activate != NULL)
3163 {
3164 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_INBOUND ) ) != 0 )
3165 {
3166 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
3167 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
3168 }
3169 }
3170#endif
3171
Paul Bakker5121ce52009-01-03 21:22:43 +00003172 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3173 {
3174 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3175 return( ret );
3176 }
3177
3178 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
3179 {
3180 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003181 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003182 }
3183
Paul Bakker1ef83d62012-04-11 12:09:53 +00003184 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00003185 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
3186
3187 if( ssl->in_msg[0] != SSL_HS_FINISHED ||
3188 ssl->in_hslen != 4 + hash_len )
3189 {
3190 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003191 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003192 }
3193
Paul Bakker5121ce52009-01-03 21:22:43 +00003194 if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
3195 {
3196 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003197 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003198 }
3199
Paul Bakker48916f92012-09-16 19:57:18 +00003200 ssl->verify_data_len = hash_len;
3201 memcpy( ssl->peer_verify_data, buf, hash_len );
3202
Paul Bakker0a597072012-09-25 21:55:46 +00003203 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003204 {
3205 if( ssl->endpoint == SSL_IS_CLIENT )
3206 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
3207
3208 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker48916f92012-09-16 19:57:18 +00003209 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00003210 }
3211 else
3212 ssl->state++;
3213
3214 SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
3215
3216 return( 0 );
3217}
3218
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +02003219static int ssl_handshake_init( ssl_context *ssl )
Paul Bakker48916f92012-09-16 19:57:18 +00003220{
3221 if( ssl->transform_negotiate )
3222 ssl_transform_free( ssl->transform_negotiate );
3223 else
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003224 {
3225 ssl->transform_negotiate =
3226 (ssl_transform *) polarssl_malloc( sizeof(ssl_transform) );
3227 }
Paul Bakker48916f92012-09-16 19:57:18 +00003228
3229 if( ssl->session_negotiate )
3230 ssl_session_free( ssl->session_negotiate );
3231 else
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003232 {
3233 ssl->session_negotiate =
3234 (ssl_session *) polarssl_malloc( sizeof(ssl_session) );
3235 }
Paul Bakker48916f92012-09-16 19:57:18 +00003236
3237 if( ssl->handshake )
3238 ssl_handshake_free( ssl->handshake );
3239 else
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003240 {
3241 ssl->handshake = (ssl_handshake_params *)
3242 polarssl_malloc( sizeof(ssl_handshake_params) );
3243 }
Paul Bakker48916f92012-09-16 19:57:18 +00003244
3245 if( ssl->handshake == NULL ||
3246 ssl->transform_negotiate == NULL ||
3247 ssl->session_negotiate == NULL )
3248 {
3249 SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) );
3250 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3251 }
3252
3253 memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
3254 memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
3255 memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
3256
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003257#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
3258 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker48916f92012-09-16 19:57:18 +00003259 md5_starts( &ssl->handshake->fin_md5 );
3260 sha1_starts( &ssl->handshake->fin_sha1 );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003261#endif
3262#if defined(POLARSSL_SSL_PROTO_TLS1_2)
3263#if defined(POLARSSL_SHA256_C)
Paul Bakker9e36f042013-06-30 14:34:05 +02003264 sha256_starts( &ssl->handshake->fin_sha256, 0 );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003265#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02003266#if defined(POLARSSL_SHA512_C)
3267 sha512_starts( &ssl->handshake->fin_sha512, 1 );
Paul Bakker769075d2012-11-24 11:26:46 +01003268#endif
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003269#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker48916f92012-09-16 19:57:18 +00003270
3271 ssl->handshake->update_checksum = ssl_update_checksum_start;
Paul Bakker23f36802012-09-28 14:15:14 +00003272 ssl->handshake->sig_alg = SSL_HASH_SHA1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02003273
Paul Bakker61d113b2013-07-04 11:51:43 +02003274#if defined(POLARSSL_ECDH_C)
3275 ecdh_init( &ssl->handshake->ecdh_ctx );
3276#endif
3277
Paul Bakker48916f92012-09-16 19:57:18 +00003278 return( 0 );
3279}
3280
Paul Bakker5121ce52009-01-03 21:22:43 +00003281/*
3282 * Initialize an SSL context
3283 */
3284int ssl_init( ssl_context *ssl )
3285{
Paul Bakker48916f92012-09-16 19:57:18 +00003286 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003287 int len = SSL_BUFFER_LEN;
3288
3289 memset( ssl, 0, sizeof( ssl_context ) );
3290
Paul Bakker62f2dee2012-09-28 07:31:51 +00003291 /*
3292 * Sane defaults
3293 */
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003294 ssl->min_major_ver = SSL_MIN_MAJOR_VERSION;
3295 ssl->min_minor_ver = SSL_MIN_MINOR_VERSION;
3296 ssl->max_major_ver = SSL_MAX_MAJOR_VERSION;
3297 ssl->max_minor_ver = SSL_MAX_MINOR_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00003298
Paul Bakker8f4ddae2013-04-15 15:09:54 +02003299 ssl_set_ciphersuites( ssl, ssl_list_ciphersuites() );
Paul Bakker645ce3a2012-10-31 12:32:41 +00003300
Paul Bakker62f2dee2012-09-28 07:31:51 +00003301#if defined(POLARSSL_DHM_C)
3302 if( ( ret = mpi_read_string( &ssl->dhm_P, 16,
3303 POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 ||
3304 ( ret = mpi_read_string( &ssl->dhm_G, 16,
3305 POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 )
3306 {
3307 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3308 return( ret );
3309 }
3310#endif
3311
3312 /*
3313 * Prepare base structures
3314 */
Paul Bakker6e339b52013-07-03 13:37:05 +02003315 ssl->in_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00003316 ssl->in_hdr = ssl->in_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01003317 ssl->in_iv = ssl->in_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00003318 ssl->in_msg = ssl->in_ctr + 13;
3319
3320 if( ssl->in_ctr == NULL )
3321 {
3322 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00003323 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003324 }
3325
Paul Bakker6e339b52013-07-03 13:37:05 +02003326 ssl->out_ctr = (unsigned char *) polarssl_malloc( len );
Paul Bakker5121ce52009-01-03 21:22:43 +00003327 ssl->out_hdr = ssl->out_ctr + 8;
Paul Bakker92be97b2013-01-02 17:30:03 +01003328 ssl->out_iv = ssl->out_ctr + 13;
Paul Bakker5bd42292012-12-19 14:40:42 +01003329 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00003330
3331 if( ssl->out_ctr == NULL )
3332 {
3333 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker6e339b52013-07-03 13:37:05 +02003334 polarssl_free( ssl-> in_ctr );
Paul Bakker69e095c2011-12-10 21:55:01 +00003335 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00003336 }
3337
3338 memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
3339 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
3340
Paul Bakker606b4ba2013-08-14 16:52:14 +02003341#if defined(POLARSSL_SSL_SESSION_TICKETS)
3342 ssl->ticket_lifetime = SSL_DEFAULT_TICKET_LIFETIME;
3343#endif
3344
Paul Bakker48916f92012-09-16 19:57:18 +00003345 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3346 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003347
3348 return( 0 );
3349}
3350
3351/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00003352 * Reset an initialized and used SSL context for re-use while retaining
3353 * all application-set variables, function pointers and data.
3354 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00003355int ssl_session_reset( ssl_context *ssl )
Paul Bakker7eb013f2011-10-06 12:37:39 +00003356{
Paul Bakker48916f92012-09-16 19:57:18 +00003357 int ret;
3358
Paul Bakker7eb013f2011-10-06 12:37:39 +00003359 ssl->state = SSL_HELLO_REQUEST;
Paul Bakker48916f92012-09-16 19:57:18 +00003360 ssl->renegotiation = SSL_INITIAL_HANDSHAKE;
3361 ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION;
3362
3363 ssl->verify_data_len = 0;
3364 memset( ssl->own_verify_data, 0, 36 );
3365 memset( ssl->peer_verify_data, 0, 36 );
3366
Paul Bakker7eb013f2011-10-06 12:37:39 +00003367 ssl->in_offt = NULL;
3368
Paul Bakker92be97b2013-01-02 17:30:03 +01003369 ssl->in_msg = ssl->in_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003370 ssl->in_msgtype = 0;
3371 ssl->in_msglen = 0;
3372 ssl->in_left = 0;
3373
3374 ssl->in_hslen = 0;
3375 ssl->nb_zero = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003376 ssl->record_read = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003377
Paul Bakker92be97b2013-01-02 17:30:03 +01003378 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003379 ssl->out_msgtype = 0;
3380 ssl->out_msglen = 0;
3381 ssl->out_left = 0;
3382
Paul Bakker48916f92012-09-16 19:57:18 +00003383 ssl->transform_in = NULL;
3384 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003385
3386 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
3387 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker05ef8352012-05-08 09:17:57 +00003388
3389#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3390 if( ssl_hw_record_reset != NULL)
3391 {
3392 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) );
Paul Bakker07eb38b2012-12-19 14:42:06 +01003393 if( ( ret = ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00003394 {
3395 SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret );
3396 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
3397 }
Paul Bakker05ef8352012-05-08 09:17:57 +00003398 }
3399#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00003400
Paul Bakker48916f92012-09-16 19:57:18 +00003401 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00003402 {
Paul Bakker48916f92012-09-16 19:57:18 +00003403 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02003404 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00003405 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00003406 }
Paul Bakker48916f92012-09-16 19:57:18 +00003407
Paul Bakkerc0463502013-02-14 11:19:38 +01003408 if( ssl->session )
3409 {
3410 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02003411 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01003412 ssl->session = NULL;
3413 }
3414
Paul Bakker48916f92012-09-16 19:57:18 +00003415 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3416 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00003417
3418 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00003419}
3420
Paul Bakkera503a632013-08-14 13:48:06 +02003421#if defined(POLARSSL_SSL_SESSION_TICKETS)
Paul Bakker7eb013f2011-10-06 12:37:39 +00003422/*
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003423 * Allocate and initialize ticket keys
3424 */
3425static int ssl_ticket_keys_init( ssl_context *ssl )
3426{
3427 int ret;
3428 ssl_ticket_keys *tkeys;
Manuel Pégourié-Gonnard56dc9e82013-08-03 17:16:31 +02003429 unsigned char buf[16];
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003430
3431 if( ssl->ticket_keys != NULL )
3432 return( 0 );
3433
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003434 tkeys = (ssl_ticket_keys *) polarssl_malloc( sizeof(ssl_ticket_keys) );
3435 if( tkeys == NULL )
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003436 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3437
3438 if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->key_name, 16 ) ) != 0 )
3439 return( ret );
3440
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02003441 if( ( ret = ssl->f_rng( ssl->p_rng, buf, 16 ) ) != 0 ||
3442 ( ret = aes_setkey_enc( &tkeys->enc, buf, 128 ) ) != 0 ||
3443 ( ret = aes_setkey_dec( &tkeys->dec, buf, 128 ) ) != 0 )
3444 {
3445 return( ret );
3446 }
3447
Manuel Pégourié-Gonnard56dc9e82013-08-03 17:16:31 +02003448 if( ( ret = ssl->f_rng( ssl->p_rng, tkeys->mac_key, 16 ) ) != 0 )
3449 return( ret );
3450
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003451 ssl->ticket_keys = tkeys;
3452
3453 return( 0 );
3454}
Paul Bakkera503a632013-08-14 13:48:06 +02003455#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003456
3457/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003458 * SSL set accessors
3459 */
3460void ssl_set_endpoint( ssl_context *ssl, int endpoint )
3461{
3462 ssl->endpoint = endpoint;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003463
Paul Bakker606b4ba2013-08-14 16:52:14 +02003464#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003465 if( endpoint == SSL_IS_CLIENT )
3466 ssl->session_tickets = SSL_SESSION_TICKETS_ENABLED;
Paul Bakker606b4ba2013-08-14 16:52:14 +02003467#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00003468}
3469
3470void ssl_set_authmode( ssl_context *ssl, int authmode )
3471{
3472 ssl->authmode = authmode;
3473}
3474
Paul Bakker7c6b2c32013-09-16 13:49:26 +02003475#if defined(POLARSSL_X509_CRT_PARSE_C)
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003476void ssl_set_verify( ssl_context *ssl,
Paul Bakkerc559c7a2013-09-18 14:13:26 +02003477 int (*f_vrfy)(void *, x509_crt *, int, int *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003478 void *p_vrfy )
3479{
3480 ssl->f_vrfy = f_vrfy;
3481 ssl->p_vrfy = p_vrfy;
3482}
Paul Bakker7c6b2c32013-09-16 13:49:26 +02003483#endif /* POLARSSL_X509_CRT_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003484
Paul Bakker5121ce52009-01-03 21:22:43 +00003485void ssl_set_rng( ssl_context *ssl,
Paul Bakkera3d195c2011-11-27 21:07:34 +00003486 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00003487 void *p_rng )
3488{
3489 ssl->f_rng = f_rng;
3490 ssl->p_rng = p_rng;
3491}
3492
3493void ssl_set_dbg( ssl_context *ssl,
Paul Bakkerff60ee62010-03-16 21:09:09 +00003494 void (*f_dbg)(void *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00003495 void *p_dbg )
3496{
3497 ssl->f_dbg = f_dbg;
3498 ssl->p_dbg = p_dbg;
3499}
3500
3501void ssl_set_bio( ssl_context *ssl,
Paul Bakker23986e52011-04-24 08:57:21 +00003502 int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
Paul Bakker39bb4182011-06-21 07:36:43 +00003503 int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
Paul Bakker5121ce52009-01-03 21:22:43 +00003504{
3505 ssl->f_recv = f_recv;
3506 ssl->f_send = f_send;
3507 ssl->p_recv = p_recv;
3508 ssl->p_send = p_send;
3509}
3510
Paul Bakker0a597072012-09-25 21:55:46 +00003511void ssl_set_session_cache( ssl_context *ssl,
3512 int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
3513 int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00003514{
Paul Bakker0a597072012-09-25 21:55:46 +00003515 ssl->f_get_cache = f_get_cache;
3516 ssl->p_get_cache = p_get_cache;
3517 ssl->f_set_cache = f_set_cache;
3518 ssl->p_set_cache = p_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00003519}
3520
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003521int ssl_set_session( ssl_context *ssl, const ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00003522{
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003523 int ret;
3524
3525 if( ssl == NULL ||
3526 session == NULL ||
3527 ssl->session_negotiate == NULL ||
3528 ssl->endpoint != SSL_IS_CLIENT )
3529 {
3530 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3531 }
3532
3533 if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 )
3534 return( ret );
3535
Paul Bakker0a597072012-09-25 21:55:46 +00003536 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003537
3538 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003539}
3540
Paul Bakkerb68cad62012-08-23 08:34:18 +00003541void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00003542{
Paul Bakker8f4ddae2013-04-15 15:09:54 +02003543 ssl->ciphersuite_list[SSL_MINOR_VERSION_0] = ciphersuites;
3544 ssl->ciphersuite_list[SSL_MINOR_VERSION_1] = ciphersuites;
3545 ssl->ciphersuite_list[SSL_MINOR_VERSION_2] = ciphersuites;
3546 ssl->ciphersuite_list[SSL_MINOR_VERSION_3] = ciphersuites;
3547}
3548
3549void ssl_set_ciphersuites_for_version( ssl_context *ssl, const int *ciphersuites,
3550 int major, int minor )
3551{
3552 if( major != SSL_MAJOR_VERSION_3 )
3553 return;
3554
3555 if( minor < SSL_MINOR_VERSION_0 || minor > SSL_MINOR_VERSION_3 )
3556 return;
3557
3558 ssl->ciphersuite_list[minor] = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00003559}
3560
Paul Bakker7c6b2c32013-09-16 13:49:26 +02003561#if defined(POLARSSL_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003562/* Add a new (empty) key_cert entry an return a pointer to it */
3563static ssl_key_cert *ssl_add_key_cert( ssl_context *ssl )
3564{
3565 ssl_key_cert *key_cert, *last;
3566
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003567 key_cert = (ssl_key_cert *) polarssl_malloc( sizeof(ssl_key_cert) );
3568 if( key_cert == NULL )
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003569 return( NULL );
3570
3571 memset( key_cert, 0, sizeof( ssl_key_cert ) );
3572
3573 /* Append the new key_cert to the (possibly empty) current list */
3574 if( ssl->key_cert == NULL )
3575 ssl->key_cert = key_cert;
3576 else
3577 {
3578 last = ssl->key_cert;
3579 while( last->next != NULL )
3580 last = last->next;
3581 last->next = key_cert;
3582 }
3583
3584 return key_cert;
3585}
3586
Paul Bakkerc559c7a2013-09-18 14:13:26 +02003587void ssl_set_ca_chain( ssl_context *ssl, x509_crt *ca_chain,
Paul Bakker57b79142010-03-24 06:51:15 +00003588 x509_crl *ca_crl, const char *peer_cn )
Paul Bakker5121ce52009-01-03 21:22:43 +00003589{
3590 ssl->ca_chain = ca_chain;
Paul Bakker40ea7de2009-05-03 10:18:48 +00003591 ssl->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00003592 ssl->peer_cn = peer_cn;
3593}
3594
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003595int ssl_set_own_cert( ssl_context *ssl, x509_crt *own_cert,
Manuel Pégourié-Gonnardac755232013-08-19 14:10:16 +02003596 pk_context *pk_key )
Paul Bakker5121ce52009-01-03 21:22:43 +00003597{
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003598 ssl_key_cert *key_cert = ssl_add_key_cert( ssl );
3599
3600 if( key_cert == NULL )
3601 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3602
3603 key_cert->cert = own_cert;
3604 key_cert->key = pk_key;
3605
3606 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003607}
3608
Manuel Pégourié-Gonnardac755232013-08-19 14:10:16 +02003609#if defined(POLARSSL_RSA_C)
Paul Bakkerc559c7a2013-09-18 14:13:26 +02003610int ssl_set_own_cert_rsa( ssl_context *ssl, x509_crt *own_cert,
Manuel Pégourié-Gonnardac755232013-08-19 14:10:16 +02003611 rsa_context *rsa_key )
Paul Bakker43b7e352011-01-18 15:27:19 +00003612{
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003613 int ret;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003614 ssl_key_cert *key_cert = ssl_add_key_cert( ssl );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003615
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003616 if( key_cert == NULL )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003617 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3618
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003619 key_cert->key = (pk_context *) polarssl_malloc( sizeof(pk_context) );
3620 if( key_cert->key == NULL )
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003621 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003622
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003623 pk_init( key_cert->key );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003624
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003625 ret = pk_init_ctx( key_cert->key, pk_info_from_type( POLARSSL_PK_RSA ) );
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003626 if( ret != 0 )
3627 return( ret );
3628
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003629 if( ( ret = rsa_copy( pk_rsa( *key_cert->key ), rsa_key ) ) != 0 )
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003630 return( ret );
3631
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003632 key_cert->cert = own_cert;
3633 key_cert->key_own_alloc = 1;
3634
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02003635 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003636}
Manuel Pégourié-Gonnardac755232013-08-19 14:10:16 +02003637#endif /* POLARSSL_RSA_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00003638
Paul Bakkerc559c7a2013-09-18 14:13:26 +02003639int ssl_set_own_cert_alt( ssl_context *ssl, x509_crt *own_cert,
Manuel Pégourié-Gonnard2fb15f62013-08-22 17:54:20 +02003640 void *rsa_key,
3641 rsa_decrypt_func rsa_decrypt,
3642 rsa_sign_func rsa_sign,
3643 rsa_key_len_func rsa_key_len )
Paul Bakker43b7e352011-01-18 15:27:19 +00003644{
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003645 int ret;
3646 ssl_key_cert *key_cert = ssl_add_key_cert( ssl );
Manuel Pégourié-Gonnard070cc7f2013-08-21 15:09:31 +02003647
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003648 if( key_cert == NULL )
Manuel Pégourié-Gonnard070cc7f2013-08-21 15:09:31 +02003649 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3650
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003651 key_cert->key = (pk_context *) polarssl_malloc( sizeof(pk_context) );
3652 if( key_cert->key == NULL )
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003653 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Manuel Pégourié-Gonnard070cc7f2013-08-21 15:09:31 +02003654
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003655 pk_init( key_cert->key );
Manuel Pégourié-Gonnard070cc7f2013-08-21 15:09:31 +02003656
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003657 if( ( ret = pk_init_ctx_rsa_alt( key_cert->key, rsa_key,
3658 rsa_decrypt, rsa_sign, rsa_key_len ) ) != 0 )
3659 return( ret );
3660
3661 key_cert->cert = own_cert;
3662 key_cert->key_own_alloc = 1;
3663
3664 return( 0 );
Paul Bakker43b7e352011-01-18 15:27:19 +00003665}
Paul Bakker7c6b2c32013-09-16 13:49:26 +02003666#endif /* POLARSSL_X509_CRT_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00003667
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02003668#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
Paul Bakker6db455e2013-09-18 17:29:31 +02003669int ssl_set_psk( ssl_context *ssl, const unsigned char *psk, size_t psk_len,
3670 const unsigned char *psk_identity, size_t psk_identity_len )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003671{
Paul Bakker6db455e2013-09-18 17:29:31 +02003672 if( psk == NULL || psk_identity == NULL )
3673 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3674
3675 if( ssl->psk != NULL )
3676 {
3677 polarssl_free( ssl->psk );
3678 polarssl_free( ssl->psk_identity );
3679 }
3680
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003681 ssl->psk_len = psk_len;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003682 ssl->psk_identity_len = psk_identity_len;
Paul Bakker6db455e2013-09-18 17:29:31 +02003683
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02003684 ssl->psk = (unsigned char *) polarssl_malloc( ssl->psk_len );
3685 ssl->psk_identity = (unsigned char *) polarssl_malloc( ssl->psk_identity_len );
Paul Bakker6db455e2013-09-18 17:29:31 +02003686
3687 if( ssl->psk == NULL || ssl->psk_identity == NULL )
3688 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3689
3690 memcpy( ssl->psk, psk, ssl->psk_len );
3691 memcpy( ssl->psk_identity, psk_identity, ssl->psk_identity_len );
Paul Bakker5ad403f2013-09-18 21:21:30 +02003692
3693 return( 0 );
Paul Bakker6db455e2013-09-18 17:29:31 +02003694}
3695
3696void ssl_set_psk_cb( ssl_context *ssl,
3697 int (*f_psk)(void *, ssl_context *, const unsigned char *,
3698 size_t),
3699 void *p_psk )
3700{
3701 ssl->f_psk = f_psk;
3702 ssl->p_psk = p_psk;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003703}
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02003704#endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00003705
Paul Bakker48916f92012-09-16 19:57:18 +00003706#if defined(POLARSSL_DHM_C)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003707int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00003708{
3709 int ret;
3710
Paul Bakker48916f92012-09-16 19:57:18 +00003711 if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003712 {
3713 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3714 return( ret );
3715 }
3716
Paul Bakker48916f92012-09-16 19:57:18 +00003717 if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003718 {
3719 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3720 return( ret );
3721 }
3722
3723 return( 0 );
3724}
3725
Paul Bakker1b57b062011-01-06 15:48:19 +00003726int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx )
3727{
3728 int ret;
3729
Paul Bakker48916f92012-09-16 19:57:18 +00003730 if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003731 {
3732 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3733 return( ret );
3734 }
3735
Paul Bakker48916f92012-09-16 19:57:18 +00003736 if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003737 {
3738 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3739 return( ret );
3740 }
3741
3742 return( 0 );
3743}
Paul Bakker48916f92012-09-16 19:57:18 +00003744#endif /* POLARSSL_DHM_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00003745
Paul Bakker0be444a2013-08-27 21:55:01 +02003746#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003747int ssl_set_hostname( ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00003748{
3749 if( hostname == NULL )
Paul Bakker40e46942009-01-03 21:51:57 +00003750 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003751
3752 ssl->hostname_len = strlen( hostname );
Paul Bakker75c1a6f2013-08-19 14:25:29 +02003753
3754 if( ssl->hostname_len + 1 == 0 )
3755 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3756
Paul Bakker6e339b52013-07-03 13:37:05 +02003757 ssl->hostname = (unsigned char *) polarssl_malloc( ssl->hostname_len + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003758
Paul Bakkerb15b8512012-01-13 13:44:06 +00003759 if( ssl->hostname == NULL )
3760 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3761
Paul Bakker3c2122f2013-06-24 19:03:14 +02003762 memcpy( ssl->hostname, (const unsigned char *) hostname,
Paul Bakker5121ce52009-01-03 21:22:43 +00003763 ssl->hostname_len );
Paul Bakkerf7abd422013-04-16 13:15:56 +02003764
Paul Bakker40ea7de2009-05-03 10:18:48 +00003765 ssl->hostname[ssl->hostname_len] = '\0';
Paul Bakker5121ce52009-01-03 21:22:43 +00003766
3767 return( 0 );
3768}
3769
Paul Bakker5701cdc2012-09-27 21:49:42 +00003770void ssl_set_sni( ssl_context *ssl,
3771 int (*f_sni)(void *, ssl_context *,
3772 const unsigned char *, size_t),
3773 void *p_sni )
3774{
3775 ssl->f_sni = f_sni;
3776 ssl->p_sni = p_sni;
3777}
Paul Bakker0be444a2013-08-27 21:55:01 +02003778#endif /* POLARSSL_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00003779
Paul Bakker490ecc82011-10-06 13:04:09 +00003780void ssl_set_max_version( ssl_context *ssl, int major, int minor )
3781{
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003782 if( major >= SSL_MIN_MAJOR_VERSION && major <= SSL_MAX_MAJOR_VERSION &&
3783 minor >= SSL_MIN_MINOR_VERSION && minor <= SSL_MAX_MINOR_VERSION )
3784 {
3785 ssl->max_major_ver = major;
3786 ssl->max_minor_ver = minor;
3787 }
Paul Bakker490ecc82011-10-06 13:04:09 +00003788}
3789
Paul Bakker1d29fb52012-09-28 13:28:45 +00003790void ssl_set_min_version( ssl_context *ssl, int major, int minor )
3791{
Paul Bakkerd2f068e2013-08-27 21:19:20 +02003792 if( major >= SSL_MIN_MAJOR_VERSION && major <= SSL_MAX_MAJOR_VERSION &&
3793 minor >= SSL_MIN_MINOR_VERSION && minor <= SSL_MAX_MINOR_VERSION )
3794 {
3795 ssl->min_major_ver = major;
3796 ssl->min_minor_ver = minor;
3797 }
Paul Bakker1d29fb52012-09-28 13:28:45 +00003798}
3799
Paul Bakker05decb22013-08-15 13:33:48 +02003800#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003801int ssl_set_max_frag_len( ssl_context *ssl, unsigned char mfl_code )
3802{
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003803 if( mfl_code >= sizeof( mfl_code_to_length ) ||
3804 mfl_code_to_length[mfl_code] > SSL_MAX_CONTENT_LEN )
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003805 {
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02003806 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003807 }
3808
3809 ssl->mfl_code = mfl_code;
3810
3811 return( 0 );
3812}
Paul Bakker05decb22013-08-15 13:33:48 +02003813#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003814
Paul Bakker1f2bc622013-08-15 13:45:55 +02003815#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Paul Bakker8c1ede62013-07-19 14:14:37 +02003816int ssl_set_truncated_hmac( ssl_context *ssl, int truncate )
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003817{
3818 if( ssl->endpoint != SSL_IS_CLIENT )
3819 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3820
Paul Bakker8c1ede62013-07-19 14:14:37 +02003821 ssl->trunc_hmac = truncate;
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003822
3823 return( 0 );
3824}
Paul Bakker1f2bc622013-08-15 13:45:55 +02003825#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnarde980a992013-07-19 11:08:52 +02003826
Paul Bakker48916f92012-09-16 19:57:18 +00003827void ssl_set_renegotiation( ssl_context *ssl, int renegotiation )
3828{
3829 ssl->disable_renegotiation = renegotiation;
3830}
3831
3832void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy )
3833{
3834 ssl->allow_legacy_renegotiation = allow_legacy;
3835}
3836
Paul Bakkera503a632013-08-14 13:48:06 +02003837#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003838int ssl_set_session_tickets( ssl_context *ssl, int use_tickets )
3839{
3840 ssl->session_tickets = use_tickets;
3841
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003842 if( ssl->endpoint == SSL_IS_CLIENT )
3843 return( 0 );
3844
3845 if( ssl->f_rng == NULL )
3846 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3847
3848 return( ssl_ticket_keys_init( ssl ) );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003849}
Paul Bakker606b4ba2013-08-14 16:52:14 +02003850
3851void ssl_set_session_ticket_lifetime( ssl_context *ssl, int lifetime )
3852{
3853 ssl->ticket_lifetime = lifetime;
3854}
Paul Bakkera503a632013-08-14 13:48:06 +02003855#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003856
Paul Bakker5121ce52009-01-03 21:22:43 +00003857/*
3858 * SSL get accessors
3859 */
Paul Bakker23986e52011-04-24 08:57:21 +00003860size_t ssl_get_bytes_avail( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003861{
3862 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
3863}
3864
Paul Bakkerff60ee62010-03-16 21:09:09 +00003865int ssl_get_verify_result( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003866{
Manuel Pégourié-Gonnard38d1eba2013-08-23 10:44:29 +02003867 return( ssl->session->verify_result );
Paul Bakker5121ce52009-01-03 21:22:43 +00003868}
3869
Paul Bakkere3166ce2011-01-27 17:40:50 +00003870const char *ssl_get_ciphersuite( const ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00003871{
Paul Bakker926c8e42013-03-06 10:23:34 +01003872 if( ssl == NULL || ssl->session == NULL )
3873 return NULL;
3874
Paul Bakkere3166ce2011-01-27 17:40:50 +00003875 return ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00003876}
3877
Paul Bakker43ca69c2011-01-15 17:35:19 +00003878const char *ssl_get_version( const ssl_context *ssl )
3879{
3880 switch( ssl->minor_ver )
3881 {
3882 case SSL_MINOR_VERSION_0:
3883 return( "SSLv3.0" );
3884
3885 case SSL_MINOR_VERSION_1:
3886 return( "TLSv1.0" );
3887
3888 case SSL_MINOR_VERSION_2:
3889 return( "TLSv1.1" );
3890
Paul Bakker1ef83d62012-04-11 12:09:53 +00003891 case SSL_MINOR_VERSION_3:
3892 return( "TLSv1.2" );
3893
Paul Bakker43ca69c2011-01-15 17:35:19 +00003894 default:
3895 break;
3896 }
3897 return( "unknown" );
3898}
3899
Paul Bakker7c6b2c32013-09-16 13:49:26 +02003900#if defined(POLARSSL_X509_CRT_PARSE_C)
Paul Bakkerc559c7a2013-09-18 14:13:26 +02003901const x509_crt *ssl_get_peer_cert( const ssl_context *ssl )
Paul Bakkerb0550d92012-10-30 07:51:03 +00003902{
3903 if( ssl == NULL || ssl->session == NULL )
3904 return NULL;
3905
3906 return ssl->session->peer_cert;
3907}
Paul Bakker7c6b2c32013-09-16 13:49:26 +02003908#endif /* POLARSSL_X509_CRT_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00003909
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003910int ssl_get_session( const ssl_context *ssl, ssl_session *dst )
3911{
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003912 if( ssl == NULL ||
3913 dst == NULL ||
3914 ssl->session == NULL ||
3915 ssl->endpoint != SSL_IS_CLIENT )
3916 {
3917 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3918 }
3919
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003920 return( ssl_session_copy( dst, ssl->session ) );
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02003921}
3922
Paul Bakker5121ce52009-01-03 21:22:43 +00003923/*
Paul Bakker1961b702013-01-25 14:49:24 +01003924 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003925 */
Paul Bakker1961b702013-01-25 14:49:24 +01003926int ssl_handshake_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003927{
Paul Bakker40e46942009-01-03 21:51:57 +00003928 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003929
Paul Bakker40e46942009-01-03 21:51:57 +00003930#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003931 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker1961b702013-01-25 14:49:24 +01003932 ret = ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003933#endif
3934
Paul Bakker40e46942009-01-03 21:51:57 +00003935#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003936 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker1961b702013-01-25 14:49:24 +01003937 ret = ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003938#endif
3939
Paul Bakker1961b702013-01-25 14:49:24 +01003940 return( ret );
3941}
3942
3943/*
3944 * Perform the SSL handshake
3945 */
3946int ssl_handshake( ssl_context *ssl )
3947{
3948 int ret = 0;
3949
3950 SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
3951
Manuel Pégourié-Gonnard3ebb2cd2013-09-23 17:00:18 +02003952#if defined(POLARSSL_X509_CRT_PARSE_C)
3953 ssl->handshake->key_cert = ssl->key_cert;
3954#endif
3955
Paul Bakker1961b702013-01-25 14:49:24 +01003956 while( ssl->state != SSL_HANDSHAKE_OVER )
3957 {
3958 ret = ssl_handshake_step( ssl );
3959
3960 if( ret != 0 )
3961 break;
3962 }
3963
Paul Bakker5121ce52009-01-03 21:22:43 +00003964 SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
3965
3966 return( ret );
3967}
3968
3969/*
Paul Bakker48916f92012-09-16 19:57:18 +00003970 * Renegotiate current connection
3971 */
3972int ssl_renegotiate( ssl_context *ssl )
3973{
3974 int ret;
3975
3976 SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
3977
3978 if( ssl->state != SSL_HANDSHAKE_OVER )
3979 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3980
3981 ssl->state = SSL_HELLO_REQUEST;
3982 ssl->renegotiation = SSL_RENEGOTIATION;
3983
3984 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3985 return( ret );
3986
3987 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3988 {
3989 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3990 return( ret );
3991 }
3992
3993 SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
3994
3995 return( 0 );
3996}
3997
3998/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003999 * Receive application data decrypted from the SSL layer
4000 */
Paul Bakker23986e52011-04-24 08:57:21 +00004001int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00004002{
Paul Bakker23986e52011-04-24 08:57:21 +00004003 int ret;
4004 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00004005
4006 SSL_DEBUG_MSG( 2, ( "=> read" ) );
4007
4008 if( ssl->state != SSL_HANDSHAKE_OVER )
4009 {
4010 if( ( ret = ssl_handshake( ssl ) ) != 0 )
4011 {
4012 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
4013 return( ret );
4014 }
4015 }
4016
4017 if( ssl->in_offt == NULL )
4018 {
4019 if( ( ret = ssl_read_record( ssl ) ) != 0 )
4020 {
Paul Bakker831a7552011-05-18 13:32:51 +00004021 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
4022 return( 0 );
4023
Paul Bakker5121ce52009-01-03 21:22:43 +00004024 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
4025 return( ret );
4026 }
4027
4028 if( ssl->in_msglen == 0 &&
4029 ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
4030 {
4031 /*
4032 * OpenSSL sends empty messages to randomize the IV
4033 */
4034 if( ( ret = ssl_read_record( ssl ) ) != 0 )
4035 {
Paul Bakker831a7552011-05-18 13:32:51 +00004036 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
4037 return( 0 );
4038
Paul Bakker5121ce52009-01-03 21:22:43 +00004039 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
4040 return( ret );
4041 }
4042 }
4043
Paul Bakker48916f92012-09-16 19:57:18 +00004044 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
4045 {
4046 SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
4047
4048 if( ssl->endpoint == SSL_IS_CLIENT &&
4049 ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST ||
4050 ssl->in_hslen != 4 ) )
4051 {
4052 SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
4053 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
4054 }
4055
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00004056 if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
4057 ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
4058 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) )
Paul Bakker48916f92012-09-16 19:57:18 +00004059 {
4060 SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
4061
Paul Bakkerd2f068e2013-08-27 21:19:20 +02004062#if defined(POLARSSL_SSL_PROTO_SSL3)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00004063 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakker48916f92012-09-16 19:57:18 +00004064 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00004065 /*
4066 * SSLv3 does not have a "no_renegotiation" alert
4067 */
4068 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
4069 return( ret );
4070 }
4071 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02004072#endif
4073#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
4074 defined(POLARSSL_SSL_PROTO_TLS1_2)
4075 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 )
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00004076 {
4077 if( ( ret = ssl_send_alert_message( ssl,
4078 SSL_ALERT_LEVEL_WARNING,
4079 SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
4080 {
4081 return( ret );
4082 }
Paul Bakker48916f92012-09-16 19:57:18 +00004083 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02004084 else
4085#endif
Paul Bakker577e0062013-08-28 11:57:20 +02004086 {
4087 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02004088 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +02004089 }
Paul Bakker48916f92012-09-16 19:57:18 +00004090 }
4091 else
4092 {
4093 if( ( ret = ssl_renegotiate( ssl ) ) != 0 )
4094 {
4095 SSL_DEBUG_RET( 1, "ssl_renegotiate", ret );
4096 return( ret );
4097 }
4098
4099 return( POLARSSL_ERR_NET_WANT_READ );
4100 }
4101 }
4102 else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00004103 {
4104 SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00004105 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00004106 }
4107
4108 ssl->in_offt = ssl->in_msg;
4109 }
4110
4111 n = ( len < ssl->in_msglen )
4112 ? len : ssl->in_msglen;
4113
4114 memcpy( buf, ssl->in_offt, n );
4115 ssl->in_msglen -= n;
4116
4117 if( ssl->in_msglen == 0 )
4118 /* all bytes consumed */
4119 ssl->in_offt = NULL;
4120 else
4121 /* more data available */
4122 ssl->in_offt += n;
4123
4124 SSL_DEBUG_MSG( 2, ( "<= read" ) );
4125
Paul Bakker23986e52011-04-24 08:57:21 +00004126 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00004127}
4128
4129/*
4130 * Send application data to be encrypted by the SSL layer
4131 */
Paul Bakker23986e52011-04-24 08:57:21 +00004132int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00004133{
Paul Bakker23986e52011-04-24 08:57:21 +00004134 int ret;
4135 size_t n;
Paul Bakker05decb22013-08-15 13:33:48 +02004136 unsigned int max_len = SSL_MAX_CONTENT_LEN;
Paul Bakker5121ce52009-01-03 21:22:43 +00004137
4138 SSL_DEBUG_MSG( 2, ( "=> write" ) );
4139
4140 if( ssl->state != SSL_HANDSHAKE_OVER )
4141 {
4142 if( ( ret = ssl_handshake( ssl ) ) != 0 )
4143 {
4144 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
4145 return( ret );
4146 }
4147 }
4148
Paul Bakker05decb22013-08-15 13:33:48 +02004149#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02004150 /*
4151 * Assume mfl_code is correct since it was checked when set
4152 */
4153 max_len = mfl_code_to_length[ssl->mfl_code];
4154
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02004155 /*
Paul Bakker05decb22013-08-15 13:33:48 +02004156 * Check if a smaller max length was negotiated
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02004157 */
4158 if( ssl->session_out != NULL &&
4159 mfl_code_to_length[ssl->session_out->mfl_code] < max_len )
4160 {
4161 max_len = mfl_code_to_length[ssl->session_out->mfl_code];
4162 }
Paul Bakker05decb22013-08-15 13:33:48 +02004163#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02004164
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +02004165 n = ( len < max_len) ? len : max_len;
Paul Bakker887bd502011-06-08 13:10:54 +00004166
Paul Bakker5121ce52009-01-03 21:22:43 +00004167 if( ssl->out_left != 0 )
4168 {
4169 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
4170 {
4171 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
4172 return( ret );
4173 }
4174 }
Paul Bakker887bd502011-06-08 13:10:54 +00004175 else
Paul Bakker1fd00bf2011-03-14 20:50:15 +00004176 {
Paul Bakker887bd502011-06-08 13:10:54 +00004177 ssl->out_msglen = n;
4178 ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
4179 memcpy( ssl->out_msg, buf, n );
4180
4181 if( ( ret = ssl_write_record( ssl ) ) != 0 )
4182 {
4183 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
4184 return( ret );
4185 }
Paul Bakker5121ce52009-01-03 21:22:43 +00004186 }
4187
4188 SSL_DEBUG_MSG( 2, ( "<= write" ) );
4189
Paul Bakker23986e52011-04-24 08:57:21 +00004190 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00004191}
4192
4193/*
4194 * Notify the peer that the connection is being closed
4195 */
4196int ssl_close_notify( ssl_context *ssl )
4197{
4198 int ret;
4199
4200 SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
4201
4202 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
4203 {
4204 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
4205 return( ret );
4206 }
4207
4208 if( ssl->state == SSL_HANDSHAKE_OVER )
4209 {
Paul Bakker48916f92012-09-16 19:57:18 +00004210 if( ( ret = ssl_send_alert_message( ssl,
4211 SSL_ALERT_LEVEL_WARNING,
4212 SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00004213 {
Paul Bakker5121ce52009-01-03 21:22:43 +00004214 return( ret );
4215 }
4216 }
4217
4218 SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
4219
4220 return( ret );
4221}
4222
Paul Bakker48916f92012-09-16 19:57:18 +00004223void ssl_transform_free( ssl_transform *transform )
4224{
4225#if defined(POLARSSL_ZLIB_SUPPORT)
4226 deflateEnd( &transform->ctx_deflate );
4227 inflateEnd( &transform->ctx_inflate );
4228#endif
4229
Manuel Pégourié-Gonnardf71e5872013-09-23 17:12:43 +02004230 cipher_free_ctx( &transform->cipher_ctx_enc );
4231 cipher_free_ctx( &transform->cipher_ctx_dec );
4232
Paul Bakker61d113b2013-07-04 11:51:43 +02004233 md_free_ctx( &transform->md_ctx_enc );
4234 md_free_ctx( &transform->md_ctx_dec );
4235
Paul Bakker48916f92012-09-16 19:57:18 +00004236 memset( transform, 0, sizeof( ssl_transform ) );
4237}
4238
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02004239#if defined(POLARSSL_X509_CRT_PARSE_C)
4240static void ssl_key_cert_free( ssl_key_cert *key_cert )
4241{
4242 ssl_key_cert *cur = key_cert, *next;
4243
4244 while( cur != NULL )
4245 {
4246 next = cur->next;
4247
4248 if( cur->key_own_alloc )
4249 {
4250 pk_free( cur->key );
4251 polarssl_free( cur->key );
4252 }
4253 polarssl_free( cur );
4254
4255 cur = next;
4256 }
4257}
4258#endif /* POLARSSL_X509_CRT_PARSE_C */
4259
Paul Bakker48916f92012-09-16 19:57:18 +00004260void ssl_handshake_free( ssl_handshake_params *handshake )
4261{
4262#if defined(POLARSSL_DHM_C)
4263 dhm_free( &handshake->dhm_ctx );
4264#endif
Paul Bakker61d113b2013-07-04 11:51:43 +02004265#if defined(POLARSSL_ECDH_C)
4266 ecdh_free( &handshake->ecdh_ctx );
4267#endif
4268
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +02004269#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Paul Bakkerbeccd9f2013-10-11 15:20:27 +02004270 /* explicit void pointer cast for buggy MS compiler */
4271 polarssl_free( (void *) handshake->curves );
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +02004272#endif
4273
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02004274#if defined(POLARSSL_X509_CRT_PARSE_C) && \
4275 defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
4276 /*
4277 * Free only the linked list wrapper, not the keys themselves
4278 * since the belong to the SNI callback
4279 */
4280 if( handshake->sni_key_cert != NULL )
4281 {
4282 ssl_key_cert *cur = handshake->sni_key_cert, *next;
4283
4284 while( cur != NULL )
4285 {
4286 next = cur->next;
4287 polarssl_free( cur );
4288 cur = next;
4289 }
4290 }
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02004291#endif
4292
Paul Bakker48916f92012-09-16 19:57:18 +00004293 memset( handshake, 0, sizeof( ssl_handshake_params ) );
4294}
4295
4296void ssl_session_free( ssl_session *session )
4297{
Paul Bakker7c6b2c32013-09-16 13:49:26 +02004298#if defined(POLARSSL_X509_CRT_PARSE_C)
Paul Bakker0a597072012-09-25 21:55:46 +00004299 if( session->peer_cert != NULL )
Paul Bakker48916f92012-09-16 19:57:18 +00004300 {
Paul Bakker7c6b2c32013-09-16 13:49:26 +02004301 x509_crt_free( session->peer_cert );
Paul Bakker6e339b52013-07-03 13:37:05 +02004302 polarssl_free( session->peer_cert );
Paul Bakker48916f92012-09-16 19:57:18 +00004303 }
Paul Bakkered27a042013-04-18 22:46:23 +02004304#endif
Paul Bakker0a597072012-09-25 21:55:46 +00004305
Paul Bakkera503a632013-08-14 13:48:06 +02004306#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02004307 polarssl_free( session->ticket );
Paul Bakkera503a632013-08-14 13:48:06 +02004308#endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02004309
Paul Bakker0a597072012-09-25 21:55:46 +00004310 memset( session, 0, sizeof( ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00004311}
4312
Paul Bakker5121ce52009-01-03 21:22:43 +00004313/*
4314 * Free an SSL context
4315 */
4316void ssl_free( ssl_context *ssl )
4317{
4318 SSL_DEBUG_MSG( 2, ( "=> free" ) );
4319
Paul Bakker5121ce52009-01-03 21:22:43 +00004320 if( ssl->out_ctr != NULL )
4321 {
4322 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02004323 polarssl_free( ssl->out_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00004324 }
4325
4326 if( ssl->in_ctr != NULL )
4327 {
4328 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker6e339b52013-07-03 13:37:05 +02004329 polarssl_free( ssl->in_ctr );
Paul Bakker5121ce52009-01-03 21:22:43 +00004330 }
4331
Paul Bakker16770332013-10-11 09:59:44 +02004332#if defined(POLARSSL_ZLIB_SUPPORT)
4333 if( ssl->compress_buf != NULL )
4334 {
4335 memset( ssl->compress_buf, 0, SSL_BUFFER_LEN );
4336 polarssl_free( ssl->compress_buf );
4337 }
4338#endif
4339
Paul Bakker40e46942009-01-03 21:51:57 +00004340#if defined(POLARSSL_DHM_C)
Paul Bakker48916f92012-09-16 19:57:18 +00004341 mpi_free( &ssl->dhm_P );
4342 mpi_free( &ssl->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00004343#endif
4344
Paul Bakker48916f92012-09-16 19:57:18 +00004345 if( ssl->transform )
4346 {
4347 ssl_transform_free( ssl->transform );
Paul Bakker6e339b52013-07-03 13:37:05 +02004348 polarssl_free( ssl->transform );
Paul Bakker48916f92012-09-16 19:57:18 +00004349 }
4350
4351 if( ssl->handshake )
4352 {
4353 ssl_handshake_free( ssl->handshake );
4354 ssl_transform_free( ssl->transform_negotiate );
4355 ssl_session_free( ssl->session_negotiate );
4356
Paul Bakker6e339b52013-07-03 13:37:05 +02004357 polarssl_free( ssl->handshake );
4358 polarssl_free( ssl->transform_negotiate );
4359 polarssl_free( ssl->session_negotiate );
Paul Bakker48916f92012-09-16 19:57:18 +00004360 }
4361
Paul Bakkerc0463502013-02-14 11:19:38 +01004362 if( ssl->session )
4363 {
4364 ssl_session_free( ssl->session );
Paul Bakker6e339b52013-07-03 13:37:05 +02004365 polarssl_free( ssl->session );
Paul Bakkerc0463502013-02-14 11:19:38 +01004366 }
4367
Paul Bakkera503a632013-08-14 13:48:06 +02004368#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02004369 polarssl_free( ssl->ticket_keys );
Paul Bakkera503a632013-08-14 13:48:06 +02004370#endif
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02004371
Paul Bakker0be444a2013-08-27 21:55:01 +02004372#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
Paul Bakker6db455e2013-09-18 17:29:31 +02004373 if ( ssl->hostname != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00004374 {
4375 memset( ssl->hostname, 0, ssl->hostname_len );
Paul Bakker6e339b52013-07-03 13:37:05 +02004376 polarssl_free( ssl->hostname );
Paul Bakker5121ce52009-01-03 21:22:43 +00004377 ssl->hostname_len = 0;
4378 }
Paul Bakker0be444a2013-08-27 21:55:01 +02004379#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00004380
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02004381#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
Paul Bakker6db455e2013-09-18 17:29:31 +02004382 if( ssl->psk != NULL )
4383 {
4384 memset( ssl->psk, 0, ssl->psk_len );
4385 memset( ssl->psk_identity, 0, ssl->psk_identity_len );
4386 polarssl_free( ssl->psk );
4387 polarssl_free( ssl->psk_identity );
4388 ssl->psk_len = 0;
4389 ssl->psk_identity_len = 0;
4390 }
4391#endif
4392
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02004393#if defined(POLARSSL_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02004394 ssl_key_cert_free( ssl->key_cert );
4395#endif
Manuel Pégourié-Gonnard070cc7f2013-08-21 15:09:31 +02004396
Paul Bakker05ef8352012-05-08 09:17:57 +00004397#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
4398 if( ssl_hw_record_finish != NULL )
4399 {
4400 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) );
4401 ssl_hw_record_finish( ssl );
4402 }
4403#endif
4404
Paul Bakker5121ce52009-01-03 21:22:43 +00004405 SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00004406
Paul Bakker86f04f42013-02-14 11:20:09 +01004407 /* Actually clear after last debug message */
Paul Bakker2da561c2009-02-05 18:00:28 +00004408 memset( ssl, 0, sizeof( ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00004409}
4410
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02004411#if defined(POLARSSL_PK_C)
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02004412/*
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02004413 * Convert between POLARSSL_PK_XXX and SSL_SIG_XXX
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02004414 */
4415unsigned char ssl_sig_from_pk( pk_context *pk )
4416{
4417#if defined(POLARSSL_RSA_C)
4418 if( pk_can_do( pk, POLARSSL_PK_RSA ) )
4419 return( SSL_SIG_RSA );
4420#endif
4421#if defined(POLARSSL_ECDSA_C)
4422 if( pk_can_do( pk, POLARSSL_PK_ECDSA ) )
4423 return( SSL_SIG_ECDSA );
4424#endif
4425 return( SSL_SIG_ANON );
4426}
4427
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004428pk_type_t ssl_pk_alg_from_sig( unsigned char sig )
4429{
4430 switch( sig )
4431 {
4432#if defined(POLARSSL_RSA_C)
4433 case SSL_SIG_RSA:
4434 return( POLARSSL_PK_RSA );
4435#endif
4436#if defined(POLARSSL_ECDSA_C)
4437 case SSL_SIG_ECDSA:
4438 return( POLARSSL_PK_ECDSA );
4439#endif
4440 default:
4441 return( POLARSSL_PK_NONE );
4442 }
4443}
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02004444#endif
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004445
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02004446/*
4447 * Convert between SSL_HASH_XXX and POLARSSL_MD_XXX
4448 */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02004449md_type_t ssl_md_alg_from_hash( unsigned char hash )
4450{
4451 switch( hash )
4452 {
4453#if defined(POLARSSL_MD5_C)
4454 case SSL_HASH_MD5:
4455 return( POLARSSL_MD_MD5 );
4456#endif
4457#if defined(POLARSSL_SHA1_C)
4458 case SSL_HASH_SHA1:
4459 return( POLARSSL_MD_SHA1 );
4460#endif
4461#if defined(POLARSSL_SHA256_C)
4462 case SSL_HASH_SHA224:
4463 return( POLARSSL_MD_SHA224 );
4464 case SSL_HASH_SHA256:
4465 return( POLARSSL_MD_SHA256 );
4466#endif
4467#if defined(POLARSSL_SHA512_C)
4468 case SSL_HASH_SHA384:
4469 return( POLARSSL_MD_SHA384 );
4470 case SSL_HASH_SHA512:
4471 return( POLARSSL_MD_SHA512 );
4472#endif
4473 default:
4474 return( POLARSSL_MD_NONE );
4475 }
4476}
4477
Paul Bakker5121ce52009-01-03 21:22:43 +00004478#endif