blob: 94eb649adf2340cb16ec52a227abe07e7377d5b3 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 shared functions
3 *
Paul Bakkerfab5c822012-02-06 16:45:10 +00004 * Copyright (C) 2006-2012, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25/*
26 * The SSL 3.0 specification was drafted by Netscape in 1996,
27 * and became an IETF standard in 1999.
28 *
29 * http://wp.netscape.com/eng/ssl3/
30 * http://www.ietf.org/rfc/rfc2246.txt
31 * http://www.ietf.org/rfc/rfc4346.txt
32 */
33
Paul Bakker40e46942009-01-03 21:51:57 +000034#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakker40e46942009-01-03 21:51:57 +000036#if defined(POLARSSL_SSL_TLS_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Paul Bakker40e46942009-01-03 21:51:57 +000038#include "polarssl/aes.h"
39#include "polarssl/arc4.h"
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000040#include "polarssl/camellia.h"
Paul Bakker40e46942009-01-03 21:51:57 +000041#include "polarssl/des.h"
42#include "polarssl/debug.h"
43#include "polarssl/ssl.h"
Paul Bakkerfab5c822012-02-06 16:45:10 +000044#include "polarssl/sha2.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000045
Paul Bakkerca4ab492012-04-18 14:23:57 +000046#if defined(POLARSSL_GCM_C)
47#include "polarssl/gcm.h"
48#endif
49
Paul Bakker5121ce52009-01-03 21:22:43 +000050#include <stdlib.h>
51#include <time.h>
52
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000053#if defined _MSC_VER && !defined strcasecmp
54#define strcasecmp _stricmp
55#endif
56
Paul Bakker05ef8352012-05-08 09:17:57 +000057#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
58int (*ssl_hw_record_init)(ssl_context *ssl,
59 const unsigned char *key_enc, const unsigned char *key_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +010060 size_t keylen,
Paul Bakker05ef8352012-05-08 09:17:57 +000061 const unsigned char *iv_enc, const unsigned char *iv_dec,
Paul Bakker07eb38b2012-12-19 14:42:06 +010062 size_t ivlen,
63 const unsigned char *mac_enc, const unsigned char *mac_dec,
64 size_t maclen) = NULL;
65int (*ssl_hw_record_activate)(ssl_context *ssl, int direction) = NULL;
Paul Bakker05ef8352012-05-08 09:17:57 +000066int (*ssl_hw_record_reset)(ssl_context *ssl) = NULL;
67int (*ssl_hw_record_write)(ssl_context *ssl) = NULL;
68int (*ssl_hw_record_read)(ssl_context *ssl) = NULL;
69int (*ssl_hw_record_finish)(ssl_context *ssl) = NULL;
70#endif
71
Paul Bakkereb2c6582012-09-27 19:15:01 +000072static int ssl_rsa_decrypt( void *ctx, int mode, size_t *olen,
73 const unsigned char *input, unsigned char *output,
74 size_t output_max_len )
75{
76 return rsa_pkcs1_decrypt( (rsa_context *) ctx, mode, olen, input, output,
77 output_max_len );
78}
79
80static int ssl_rsa_sign( void *ctx,
81 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
82 int mode, int hash_id, unsigned int hashlen,
83 const unsigned char *hash, unsigned char *sig )
84{
85 return rsa_pkcs1_sign( (rsa_context *) ctx, f_rng, p_rng, mode, hash_id,
86 hashlen, hash, sig );
87}
88
89static size_t ssl_rsa_key_len( void *ctx )
90{
91 return ( (rsa_context *) ctx )->len;
92}
93
Paul Bakker5121ce52009-01-03 21:22:43 +000094/*
95 * Key material generation
96 */
Paul Bakker5f70b252012-09-13 14:23:06 +000097static int ssl3_prf( unsigned char *secret, size_t slen, char *label,
98 unsigned char *random, size_t rlen,
99 unsigned char *dstbuf, size_t dlen )
100{
101 size_t i;
102 md5_context md5;
103 sha1_context sha1;
104 unsigned char padding[16];
105 unsigned char sha1sum[20];
106 ((void)label);
107
108 /*
109 * SSLv3:
110 * block =
111 * MD5( secret + SHA1( 'A' + secret + random ) ) +
112 * MD5( secret + SHA1( 'BB' + secret + random ) ) +
113 * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
114 * ...
115 */
116 for( i = 0; i < dlen / 16; i++ )
117 {
118 memset( padding, 'A' + i, 1 + i );
119
120 sha1_starts( &sha1 );
121 sha1_update( &sha1, padding, 1 + i );
122 sha1_update( &sha1, secret, slen );
123 sha1_update( &sha1, random, rlen );
124 sha1_finish( &sha1, sha1sum );
125
126 md5_starts( &md5 );
127 md5_update( &md5, secret, slen );
128 md5_update( &md5, sha1sum, 20 );
129 md5_finish( &md5, dstbuf + i * 16 );
130 }
131
132 memset( &md5, 0, sizeof( md5 ) );
133 memset( &sha1, 0, sizeof( sha1 ) );
134
135 memset( padding, 0, sizeof( padding ) );
136 memset( sha1sum, 0, sizeof( sha1sum ) );
137
138 return( 0 );
139}
140
Paul Bakker23986e52011-04-24 08:57:21 +0000141static int tls1_prf( unsigned char *secret, size_t slen, char *label,
142 unsigned char *random, size_t rlen,
143 unsigned char *dstbuf, size_t dlen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000144{
Paul Bakker23986e52011-04-24 08:57:21 +0000145 size_t nb, hs;
146 size_t i, j, k;
Paul Bakker5121ce52009-01-03 21:22:43 +0000147 unsigned char *S1, *S2;
148 unsigned char tmp[128];
149 unsigned char h_i[20];
150
151 if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
Paul Bakker40e46942009-01-03 21:51:57 +0000152 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +0000153
154 hs = ( slen + 1 ) / 2;
155 S1 = secret;
156 S2 = secret + slen - hs;
157
158 nb = strlen( label );
159 memcpy( tmp + 20, label, nb );
160 memcpy( tmp + 20 + nb, random, rlen );
161 nb += rlen;
162
163 /*
164 * First compute P_md5(secret,label+random)[0..dlen]
165 */
166 md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
167
168 for( i = 0; i < dlen; i += 16 )
169 {
170 md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
171 md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp );
172
173 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
174
175 for( j = 0; j < k; j++ )
176 dstbuf[i + j] = h_i[j];
177 }
178
179 /*
180 * XOR out with P_sha1(secret,label+random)[0..dlen]
181 */
182 sha1_hmac( S2, hs, tmp + 20, nb, tmp );
183
184 for( i = 0; i < dlen; i += 20 )
185 {
186 sha1_hmac( S2, hs, tmp, 20 + nb, h_i );
187 sha1_hmac( S2, hs, tmp, 20, tmp );
188
189 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
190
191 for( j = 0; j < k; j++ )
192 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
193 }
194
195 memset( tmp, 0, sizeof( tmp ) );
196 memset( h_i, 0, sizeof( h_i ) );
197
198 return( 0 );
199}
200
Paul Bakker1ef83d62012-04-11 12:09:53 +0000201static int tls_prf_sha256( unsigned char *secret, size_t slen, char *label,
202 unsigned char *random, size_t rlen,
203 unsigned char *dstbuf, size_t dlen )
204{
205 size_t nb;
206 size_t i, j, k;
207 unsigned char tmp[128];
208 unsigned char h_i[32];
209
210 if( sizeof( tmp ) < 32 + strlen( label ) + rlen )
211 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
212
213 nb = strlen( label );
214 memcpy( tmp + 32, label, nb );
215 memcpy( tmp + 32 + nb, random, rlen );
216 nb += rlen;
217
218 /*
219 * Compute P_<hash>(secret, label + random)[0..dlen]
220 */
221 sha2_hmac( secret, slen, tmp + 32, nb, tmp, 0 );
222
223 for( i = 0; i < dlen; i += 32 )
224 {
225 sha2_hmac( secret, slen, tmp, 32 + nb, h_i, 0 );
226 sha2_hmac( secret, slen, tmp, 32, tmp, 0 );
227
228 k = ( i + 32 > dlen ) ? dlen % 32 : 32;
229
230 for( j = 0; j < k; j++ )
231 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}
239
Paul Bakker769075d2012-11-24 11:26:46 +0100240#if defined(POLARSSL_SHA4_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +0000241static int tls_prf_sha384( unsigned char *secret, size_t slen, char *label,
242 unsigned char *random, size_t rlen,
243 unsigned char *dstbuf, size_t dlen )
244{
245 size_t nb;
246 size_t i, j, k;
247 unsigned char tmp[128];
248 unsigned char h_i[48];
249
250 if( sizeof( tmp ) < 48 + strlen( label ) + rlen )
251 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
252
253 nb = strlen( label );
254 memcpy( tmp + 48, label, nb );
255 memcpy( tmp + 48 + nb, random, rlen );
256 nb += rlen;
257
258 /*
259 * Compute P_<hash>(secret, label + random)[0..dlen]
260 */
261 sha4_hmac( secret, slen, tmp + 48, nb, tmp, 1 );
262
263 for( i = 0; i < dlen; i += 48 )
264 {
265 sha4_hmac( secret, slen, tmp, 48 + nb, h_i, 1 );
266 sha4_hmac( secret, slen, tmp, 48, tmp, 1 );
267
268 k = ( i + 48 > dlen ) ? dlen % 48 : 48;
269
270 for( j = 0; j < k; j++ )
271 dstbuf[i + j] = h_i[j];
272 }
273
274 memset( tmp, 0, sizeof( tmp ) );
275 memset( h_i, 0, sizeof( h_i ) );
276
277 return( 0 );
278}
Paul Bakker769075d2012-11-24 11:26:46 +0100279#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +0000280
Paul Bakker380da532012-04-18 16:10:25 +0000281static void ssl_update_checksum_start(ssl_context *, unsigned char *, size_t);
282static void ssl_update_checksum_md5sha1(ssl_context *, unsigned char *, size_t);
283static void ssl_update_checksum_sha256(ssl_context *, unsigned char *, size_t);
Paul Bakker380da532012-04-18 16:10:25 +0000284
285static void ssl_calc_verify_ssl(ssl_context *,unsigned char *);
286static void ssl_calc_verify_tls(ssl_context *,unsigned char *);
287static void ssl_calc_verify_tls_sha256(ssl_context *,unsigned char *);
Paul Bakker380da532012-04-18 16:10:25 +0000288
Paul Bakkerca4ab492012-04-18 14:23:57 +0000289static void ssl_calc_finished_ssl(ssl_context *,unsigned char *,int);
290static void ssl_calc_finished_tls(ssl_context *,unsigned char *,int);
291static void ssl_calc_finished_tls_sha256(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100292
293#if defined(POLARSSL_SHA4_C)
294static void ssl_update_checksum_sha384(ssl_context *, unsigned char *, size_t);
295static void ssl_calc_verify_tls_sha384(ssl_context *,unsigned char *);
Paul Bakkerca4ab492012-04-18 14:23:57 +0000296static void ssl_calc_finished_tls_sha384(ssl_context *,unsigned char *,int);
Paul Bakker769075d2012-11-24 11:26:46 +0100297#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000298
Paul Bakker5121ce52009-01-03 21:22:43 +0000299int ssl_derive_keys( ssl_context *ssl )
300{
Paul Bakker5121ce52009-01-03 21:22:43 +0000301 unsigned char tmp[64];
Paul Bakker5121ce52009-01-03 21:22:43 +0000302 unsigned char keyblk[256];
303 unsigned char *key1;
304 unsigned char *key2;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000305 unsigned int iv_copy_len;
Paul Bakker48916f92012-09-16 19:57:18 +0000306 ssl_session *session = ssl->session_negotiate;
307 ssl_transform *transform = ssl->transform_negotiate;
308 ssl_handshake_params *handshake = ssl->handshake;
Paul Bakker5121ce52009-01-03 21:22:43 +0000309
310 SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
311
312 /*
Paul Bakkerca4ab492012-04-18 14:23:57 +0000313 * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
Paul Bakker1ef83d62012-04-11 12:09:53 +0000314 */
315 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000316 {
Paul Bakker48916f92012-09-16 19:57:18 +0000317 handshake->tls_prf = ssl3_prf;
318 handshake->calc_verify = ssl_calc_verify_ssl;
319 handshake->calc_finished = ssl_calc_finished_ssl;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000320 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000321 else if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000322 {
Paul Bakker48916f92012-09-16 19:57:18 +0000323 handshake->tls_prf = tls1_prf;
324 handshake->calc_verify = ssl_calc_verify_tls;
325 handshake->calc_finished = ssl_calc_finished_tls;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000326 }
Paul Bakker769075d2012-11-24 11:26:46 +0100327#if defined(POLARSSL_SHA4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000328 else if( session->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 ||
329 session->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000330 {
Paul Bakker48916f92012-09-16 19:57:18 +0000331 handshake->tls_prf = tls_prf_sha384;
332 handshake->calc_verify = ssl_calc_verify_tls_sha384;
333 handshake->calc_finished = ssl_calc_finished_tls_sha384;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000334 }
Paul Bakker769075d2012-11-24 11:26:46 +0100335#endif
Paul Bakker1ef83d62012-04-11 12:09:53 +0000336 else
Paul Bakkerca4ab492012-04-18 14:23:57 +0000337 {
Paul Bakker48916f92012-09-16 19:57:18 +0000338 handshake->tls_prf = tls_prf_sha256;
339 handshake->calc_verify = ssl_calc_verify_tls_sha256;
340 handshake->calc_finished = ssl_calc_finished_tls_sha256;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000341 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000342
343 /*
Paul Bakker5121ce52009-01-03 21:22:43 +0000344 * SSLv3:
345 * master =
346 * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
347 * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
348 * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
Paul Bakker5f70b252012-09-13 14:23:06 +0000349 *
Paul Bakker5121ce52009-01-03 21:22:43 +0000350 * TLSv1:
351 * master = PRF( premaster, "master secret", randbytes )[0..47]
352 */
Paul Bakker0a597072012-09-25 21:55:46 +0000353 if( handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000354 {
Paul Bakker48916f92012-09-16 19:57:18 +0000355 SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
356 handshake->pmslen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000357
Paul Bakker48916f92012-09-16 19:57:18 +0000358 handshake->tls_prf( handshake->premaster, handshake->pmslen,
359 "master secret",
360 handshake->randbytes, 64, session->master, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000361
Paul Bakker48916f92012-09-16 19:57:18 +0000362 memset( handshake->premaster, 0, sizeof( handshake->premaster ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000363 }
364 else
365 SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
366
367 /*
368 * Swap the client and server random values.
369 */
Paul Bakker48916f92012-09-16 19:57:18 +0000370 memcpy( tmp, handshake->randbytes, 64 );
371 memcpy( handshake->randbytes, tmp + 32, 32 );
372 memcpy( handshake->randbytes + 32, tmp, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000373 memset( tmp, 0, sizeof( tmp ) );
374
375 /*
376 * SSLv3:
377 * key block =
378 * MD5( master + SHA1( 'A' + master + randbytes ) ) +
379 * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
380 * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
381 * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
382 * ...
383 *
384 * TLSv1:
385 * key block = PRF( master, "key expansion", randbytes )
386 */
Paul Bakker48916f92012-09-16 19:57:18 +0000387 handshake->tls_prf( session->master, 48, "key expansion",
388 handshake->randbytes, 64, keyblk, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000389
Paul Bakker48916f92012-09-16 19:57:18 +0000390 SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
391 ssl_get_ciphersuite_name( session->ciphersuite ) ) );
392 SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
393 SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000394 SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
395
Paul Bakker48916f92012-09-16 19:57:18 +0000396 memset( handshake->randbytes, 0, sizeof( handshake->randbytes ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000397
398 /*
399 * Determine the appropriate key, IV and MAC length.
400 */
Paul Bakker48916f92012-09-16 19:57:18 +0000401 switch( session->ciphersuite )
Paul Bakker5121ce52009-01-03 21:22:43 +0000402 {
Paul Bakker40e46942009-01-03 21:51:57 +0000403#if defined(POLARSSL_ARC4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000404 case TLS_RSA_WITH_RC4_128_MD5:
Paul Bakker48916f92012-09-16 19:57:18 +0000405 transform->keylen = 16; transform->minlen = 16;
406 transform->ivlen = 0; transform->maclen = 16;
Paul Bakker5121ce52009-01-03 21:22:43 +0000407 break;
408
Paul Bakker645ce3a2012-10-31 12:32:41 +0000409 case TLS_RSA_WITH_RC4_128_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000410 transform->keylen = 16; transform->minlen = 20;
411 transform->ivlen = 0; transform->maclen = 20;
Paul Bakker5121ce52009-01-03 21:22:43 +0000412 break;
413#endif
414
Paul Bakker40e46942009-01-03 21:51:57 +0000415#if defined(POLARSSL_DES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000416 case TLS_RSA_WITH_3DES_EDE_CBC_SHA:
417 case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000418 transform->keylen = 24; transform->minlen = 24;
419 transform->ivlen = 8; transform->maclen = 20;
Paul Bakker5121ce52009-01-03 21:22:43 +0000420 break;
421#endif
422
Paul Bakker40e46942009-01-03 21:51:57 +0000423#if defined(POLARSSL_AES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000424 case TLS_RSA_WITH_AES_128_CBC_SHA:
425 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000426 transform->keylen = 16; transform->minlen = 32;
427 transform->ivlen = 16; transform->maclen = 20;
Paul Bakker5121ce52009-01-03 21:22:43 +0000428 break;
429
Paul Bakker645ce3a2012-10-31 12:32:41 +0000430 case TLS_RSA_WITH_AES_256_CBC_SHA:
431 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000432 transform->keylen = 32; transform->minlen = 32;
433 transform->ivlen = 16; transform->maclen = 20;
Paul Bakker5121ce52009-01-03 21:22:43 +0000434 break;
Paul Bakker10cd2252012-04-12 21:26:34 +0000435
436#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000437 case TLS_RSA_WITH_AES_128_CBC_SHA256:
438 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000439 transform->keylen = 16; transform->minlen = 32;
440 transform->ivlen = 16; transform->maclen = 32;
Paul Bakker10cd2252012-04-12 21:26:34 +0000441 break;
442
Paul Bakker645ce3a2012-10-31 12:32:41 +0000443 case TLS_RSA_WITH_AES_256_CBC_SHA256:
444 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000445 transform->keylen = 32; transform->minlen = 32;
446 transform->ivlen = 16; transform->maclen = 32;
Paul Bakker10cd2252012-04-12 21:26:34 +0000447 break;
448#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +0000449#if defined(POLARSSL_GCM_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000450 case TLS_RSA_WITH_AES_128_GCM_SHA256:
451 case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000452 transform->keylen = 16; transform->minlen = 1;
453 transform->ivlen = 12; transform->maclen = 0;
454 transform->fixed_ivlen = 4;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000455 break;
456
Paul Bakker645ce3a2012-10-31 12:32:41 +0000457 case TLS_RSA_WITH_AES_256_GCM_SHA384:
458 case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
Paul Bakker48916f92012-09-16 19:57:18 +0000459 transform->keylen = 32; transform->minlen = 1;
460 transform->ivlen = 12; transform->maclen = 0;
461 transform->fixed_ivlen = 4;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000462 break;
463#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000464#endif
465
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000466#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000467 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
468 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000469 transform->keylen = 16; transform->minlen = 32;
470 transform->ivlen = 16; transform->maclen = 20;
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000471 break;
472
Paul Bakker645ce3a2012-10-31 12:32:41 +0000473 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
474 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000475 transform->keylen = 32; transform->minlen = 32;
476 transform->ivlen = 16; transform->maclen = 20;
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000477 break;
Paul Bakker10cd2252012-04-12 21:26:34 +0000478
479#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000480 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
481 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000482 transform->keylen = 16; transform->minlen = 32;
483 transform->ivlen = 16; transform->maclen = 32;
Paul Bakker10cd2252012-04-12 21:26:34 +0000484 break;
485
Paul Bakker645ce3a2012-10-31 12:32:41 +0000486 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
487 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000488 transform->keylen = 32; transform->minlen = 32;
489 transform->ivlen = 16; transform->maclen = 32;
Paul Bakker10cd2252012-04-12 21:26:34 +0000490 break;
491#endif
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000492#endif
493
Paul Bakkerfab5c822012-02-06 16:45:10 +0000494#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
495#if defined(POLARSSL_CIPHER_NULL_CIPHER)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000496 case TLS_RSA_WITH_NULL_MD5:
Paul Bakker48916f92012-09-16 19:57:18 +0000497 transform->keylen = 0; transform->minlen = 0;
498 transform->ivlen = 0; transform->maclen = 16;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000499 break;
500
Paul Bakker645ce3a2012-10-31 12:32:41 +0000501 case TLS_RSA_WITH_NULL_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000502 transform->keylen = 0; transform->minlen = 0;
503 transform->ivlen = 0; transform->maclen = 20;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000504 break;
505
Paul Bakker645ce3a2012-10-31 12:32:41 +0000506 case TLS_RSA_WITH_NULL_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000507 transform->keylen = 0; transform->minlen = 0;
508 transform->ivlen = 0; transform->maclen = 32;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000509 break;
510#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
511
512#if defined(POLARSSL_DES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000513 case TLS_RSA_WITH_DES_CBC_SHA:
514 case TLS_DHE_RSA_WITH_DES_CBC_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000515 transform->keylen = 8; transform->minlen = 8;
516 transform->ivlen = 8; transform->maclen = 20;
Paul Bakkerfab5c822012-02-06 16:45:10 +0000517 break;
518#endif
519#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */
520
Paul Bakker5121ce52009-01-03 21:22:43 +0000521 default:
Paul Bakkere3166ce2011-01-27 17:40:50 +0000522 SSL_DEBUG_MSG( 1, ( "ciphersuite %s is not available",
Paul Bakker48916f92012-09-16 19:57:18 +0000523 ssl_get_ciphersuite_name( session->ciphersuite ) ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000524 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000525 }
526
527 SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000528 transform->keylen, transform->minlen, transform->ivlen,
529 transform->maclen ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000530
531 /*
532 * Finally setup the cipher contexts, IVs and MAC secrets.
533 */
534 if( ssl->endpoint == SSL_IS_CLIENT )
535 {
Paul Bakker48916f92012-09-16 19:57:18 +0000536 key1 = keyblk + transform->maclen * 2;
537 key2 = keyblk + transform->maclen * 2 + transform->keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000538
Paul Bakker48916f92012-09-16 19:57:18 +0000539 memcpy( transform->mac_enc, keyblk, transform->maclen );
540 memcpy( transform->mac_dec, keyblk + transform->maclen,
541 transform->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000542
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000543 /*
544 * This is not used in TLS v1.1.
545 */
Paul Bakker48916f92012-09-16 19:57:18 +0000546 iv_copy_len = ( transform->fixed_ivlen ) ?
547 transform->fixed_ivlen : transform->ivlen;
548 memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len );
549 memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000550 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000551 }
552 else
553 {
Paul Bakker48916f92012-09-16 19:57:18 +0000554 key1 = keyblk + transform->maclen * 2 + transform->keylen;
555 key2 = keyblk + transform->maclen * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000556
Paul Bakker48916f92012-09-16 19:57:18 +0000557 memcpy( transform->mac_dec, keyblk, transform->maclen );
558 memcpy( transform->mac_enc, keyblk + transform->maclen,
559 transform->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000560
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000561 /*
562 * This is not used in TLS v1.1.
563 */
Paul Bakker48916f92012-09-16 19:57:18 +0000564 iv_copy_len = ( transform->fixed_ivlen ) ?
565 transform->fixed_ivlen : transform->ivlen;
566 memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len );
567 memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
Paul Bakkerca4ab492012-04-18 14:23:57 +0000568 iv_copy_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000569 }
570
Paul Bakker05ef8352012-05-08 09:17:57 +0000571#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
572 if( ssl_hw_record_init != NULL)
573 {
574 int ret = 0;
575
576 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) );
577
Paul Bakker07eb38b2012-12-19 14:42:06 +0100578 if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->keylen,
579 transform->iv_enc, transform->iv_dec,
580 iv_copy_len,
581 transform->mac_enc, transform->mac_dec,
582 transform->maclen ) ) != 0 )
Paul Bakker05ef8352012-05-08 09:17:57 +0000583 {
584 SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret );
585 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
586 }
587 }
588#endif
589
Paul Bakker48916f92012-09-16 19:57:18 +0000590 switch( session->ciphersuite )
Paul Bakker5121ce52009-01-03 21:22:43 +0000591 {
Paul Bakker40e46942009-01-03 21:51:57 +0000592#if defined(POLARSSL_ARC4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000593 case TLS_RSA_WITH_RC4_128_MD5:
594 case TLS_RSA_WITH_RC4_128_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000595 arc4_setup( (arc4_context *) transform->ctx_enc, key1,
596 transform->keylen );
597 arc4_setup( (arc4_context *) transform->ctx_dec, key2,
598 transform->keylen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000599 break;
600#endif
601
Paul Bakker40e46942009-01-03 21:51:57 +0000602#if defined(POLARSSL_DES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000603 case TLS_RSA_WITH_3DES_EDE_CBC_SHA:
604 case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000605 des3_set3key_enc( (des3_context *) transform->ctx_enc, key1 );
606 des3_set3key_dec( (des3_context *) transform->ctx_dec, key2 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000607 break;
608#endif
609
Paul Bakker40e46942009-01-03 21:51:57 +0000610#if defined(POLARSSL_AES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000611 case TLS_RSA_WITH_AES_128_CBC_SHA:
612 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
613 case TLS_RSA_WITH_AES_128_CBC_SHA256:
614 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000615 aes_setkey_enc( (aes_context *) transform->ctx_enc, key1, 128 );
616 aes_setkey_dec( (aes_context *) transform->ctx_dec, key2, 128 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000617 break;
618
Paul Bakker645ce3a2012-10-31 12:32:41 +0000619 case TLS_RSA_WITH_AES_256_CBC_SHA:
620 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
621 case TLS_RSA_WITH_AES_256_CBC_SHA256:
622 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000623 aes_setkey_enc( (aes_context *) transform->ctx_enc, key1, 256 );
624 aes_setkey_dec( (aes_context *) transform->ctx_dec, key2, 256 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000625 break;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000626
627#if defined(POLARSSL_GCM_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000628 case TLS_RSA_WITH_AES_128_GCM_SHA256:
629 case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000630 gcm_init( (gcm_context *) transform->ctx_enc, key1, 128 );
631 gcm_init( (gcm_context *) transform->ctx_dec, key2, 128 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000632 break;
633
Paul Bakker645ce3a2012-10-31 12:32:41 +0000634 case TLS_RSA_WITH_AES_256_GCM_SHA384:
635 case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
Paul Bakker48916f92012-09-16 19:57:18 +0000636 gcm_init( (gcm_context *) transform->ctx_enc, key1, 256 );
637 gcm_init( (gcm_context *) transform->ctx_dec, key2, 256 );
Paul Bakkerca4ab492012-04-18 14:23:57 +0000638 break;
639#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000640#endif
641
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000642#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000643 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
644 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
645 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
646 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000647 camellia_setkey_enc( (camellia_context *) transform->ctx_enc, key1, 128 );
648 camellia_setkey_dec( (camellia_context *) transform->ctx_dec, key2, 128 );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000649 break;
650
Paul Bakker645ce3a2012-10-31 12:32:41 +0000651 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
652 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
653 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
654 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
Paul Bakker48916f92012-09-16 19:57:18 +0000655 camellia_setkey_enc( (camellia_context *) transform->ctx_enc, key1, 256 );
656 camellia_setkey_dec( (camellia_context *) transform->ctx_dec, key2, 256 );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000657 break;
658#endif
659
Paul Bakkerfab5c822012-02-06 16:45:10 +0000660#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
661#if defined(POLARSSL_CIPHER_NULL_CIPHER)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000662 case TLS_RSA_WITH_NULL_MD5:
663 case TLS_RSA_WITH_NULL_SHA:
664 case TLS_RSA_WITH_NULL_SHA256:
Paul Bakkerfab5c822012-02-06 16:45:10 +0000665 break;
666#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
667
668#if defined(POLARSSL_DES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000669 case TLS_RSA_WITH_DES_CBC_SHA:
670 case TLS_DHE_RSA_WITH_DES_CBC_SHA:
Paul Bakker48916f92012-09-16 19:57:18 +0000671 des_setkey_enc( (des_context *) transform->ctx_enc, key1 );
672 des_setkey_dec( (des_context *) transform->ctx_dec, key2 );
Paul Bakkerfab5c822012-02-06 16:45:10 +0000673 break;
674#endif
675#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */
676
Paul Bakker5121ce52009-01-03 21:22:43 +0000677 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000678 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000679 }
680
681 memset( keyblk, 0, sizeof( keyblk ) );
682
Paul Bakker2770fbd2012-07-03 13:30:23 +0000683#if defined(POLARSSL_ZLIB_SUPPORT)
684 // Initialize compression
685 //
Paul Bakker48916f92012-09-16 19:57:18 +0000686 if( session->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000687 {
688 SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
689
Paul Bakker48916f92012-09-16 19:57:18 +0000690 memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
691 memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000692
Paul Bakker48916f92012-09-16 19:57:18 +0000693 if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK ||
694 inflateInit( &transform->ctx_inflate ) != Z_OK )
Paul Bakker2770fbd2012-07-03 13:30:23 +0000695 {
696 SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
697 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
698 }
699 }
700#endif /* POLARSSL_ZLIB_SUPPORT */
701
Paul Bakker5121ce52009-01-03 21:22:43 +0000702 SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
703
704 return( 0 );
705}
706
Paul Bakker380da532012-04-18 16:10:25 +0000707void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000708{
709 md5_context md5;
710 sha1_context sha1;
711 unsigned char pad_1[48];
712 unsigned char pad_2[48];
713
Paul Bakker380da532012-04-18 16:10:25 +0000714 SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000715
Paul Bakker48916f92012-09-16 19:57:18 +0000716 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
717 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000718
Paul Bakker380da532012-04-18 16:10:25 +0000719 memset( pad_1, 0x36, 48 );
720 memset( pad_2, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000721
Paul Bakker48916f92012-09-16 19:57:18 +0000722 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000723 md5_update( &md5, pad_1, 48 );
724 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000725
Paul Bakker380da532012-04-18 16:10:25 +0000726 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +0000727 md5_update( &md5, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000728 md5_update( &md5, pad_2, 48 );
729 md5_update( &md5, hash, 16 );
730 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000731
Paul Bakker48916f92012-09-16 19:57:18 +0000732 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000733 sha1_update( &sha1, pad_1, 40 );
734 sha1_finish( &sha1, hash + 16 );
735
736 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +0000737 sha1_update( &sha1, ssl->session_negotiate->master, 48 );
Paul Bakker380da532012-04-18 16:10:25 +0000738 sha1_update( &sha1, pad_2, 40 );
739 sha1_update( &sha1, hash + 16, 20 );
740 sha1_finish( &sha1, hash + 16 );
741
742 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
743 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
744
745 return;
746}
747
748void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] )
749{
750 md5_context md5;
751 sha1_context sha1;
752
753 SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
754
Paul Bakker48916f92012-09-16 19:57:18 +0000755 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
756 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000757
Paul Bakker48916f92012-09-16 19:57:18 +0000758 md5_finish( &md5, hash );
Paul Bakker380da532012-04-18 16:10:25 +0000759 sha1_finish( &sha1, hash + 16 );
760
761 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
762 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
763
764 return;
765}
766
767void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] )
768{
769 sha2_context sha2;
770
771 SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
772
Paul Bakker48916f92012-09-16 19:57:18 +0000773 memcpy( &sha2, &ssl->handshake->fin_sha2, sizeof(sha2_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000774 sha2_finish( &sha2, hash );
775
776 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
777 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
778
779 return;
780}
781
Paul Bakker769075d2012-11-24 11:26:46 +0100782#if defined(POLARSSL_SHA4_C)
Paul Bakker380da532012-04-18 16:10:25 +0000783void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] )
784{
785 sha4_context sha4;
786
787 SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
788
Paul Bakker48916f92012-09-16 19:57:18 +0000789 memcpy( &sha4, &ssl->handshake->fin_sha4, sizeof(sha4_context) );
Paul Bakker380da532012-04-18 16:10:25 +0000790 sha4_finish( &sha4, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000791
Paul Bakkerca4ab492012-04-18 14:23:57 +0000792 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000793 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
794
795 return;
796}
Paul Bakker769075d2012-11-24 11:26:46 +0100797#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000798
799/*
800 * SSLv3.0 MAC functions
801 */
802static void ssl_mac_md5( unsigned char *secret,
Paul Bakker23986e52011-04-24 08:57:21 +0000803 unsigned char *buf, size_t len,
Paul Bakker5121ce52009-01-03 21:22:43 +0000804 unsigned char *ctr, int type )
805{
806 unsigned char header[11];
807 unsigned char padding[48];
808 md5_context md5;
809
810 memcpy( header, ctr, 8 );
811 header[ 8] = (unsigned char) type;
812 header[ 9] = (unsigned char)( len >> 8 );
813 header[10] = (unsigned char)( len );
814
815 memset( padding, 0x36, 48 );
816 md5_starts( &md5 );
817 md5_update( &md5, secret, 16 );
818 md5_update( &md5, padding, 48 );
819 md5_update( &md5, header, 11 );
820 md5_update( &md5, buf, len );
821 md5_finish( &md5, buf + len );
822
823 memset( padding, 0x5C, 48 );
824 md5_starts( &md5 );
825 md5_update( &md5, secret, 16 );
826 md5_update( &md5, padding, 48 );
827 md5_update( &md5, buf + len, 16 );
828 md5_finish( &md5, buf + len );
829}
830
831static void ssl_mac_sha1( unsigned char *secret,
Paul Bakker23986e52011-04-24 08:57:21 +0000832 unsigned char *buf, size_t len,
Paul Bakker5121ce52009-01-03 21:22:43 +0000833 unsigned char *ctr, int type )
834{
835 unsigned char header[11];
836 unsigned char padding[40];
837 sha1_context sha1;
838
839 memcpy( header, ctr, 8 );
840 header[ 8] = (unsigned char) type;
841 header[ 9] = (unsigned char)( len >> 8 );
842 header[10] = (unsigned char)( len );
843
844 memset( padding, 0x36, 40 );
845 sha1_starts( &sha1 );
846 sha1_update( &sha1, secret, 20 );
847 sha1_update( &sha1, padding, 40 );
848 sha1_update( &sha1, header, 11 );
849 sha1_update( &sha1, buf, len );
850 sha1_finish( &sha1, buf + len );
851
852 memset( padding, 0x5C, 40 );
853 sha1_starts( &sha1 );
854 sha1_update( &sha1, secret, 20 );
855 sha1_update( &sha1, padding, 40 );
856 sha1_update( &sha1, buf + len, 20 );
857 sha1_finish( &sha1, buf + len );
858}
859
Paul Bakker5f70b252012-09-13 14:23:06 +0000860static void ssl_mac_sha2( unsigned char *secret,
861 unsigned char *buf, size_t len,
862 unsigned char *ctr, int type )
863{
864 unsigned char header[11];
865 unsigned char padding[32];
866 sha2_context sha2;
867
868 memcpy( header, ctr, 8 );
869 header[ 8] = (unsigned char) type;
870 header[ 9] = (unsigned char)( len >> 8 );
871 header[10] = (unsigned char)( len );
872
873 memset( padding, 0x36, 32 );
874 sha2_starts( &sha2, 0 );
875 sha2_update( &sha2, secret, 32 );
876 sha2_update( &sha2, padding, 32 );
877 sha2_update( &sha2, header, 11 );
878 sha2_update( &sha2, buf, len );
879 sha2_finish( &sha2, buf + len );
880
881 memset( padding, 0x5C, 32 );
882 sha2_starts( &sha2, 0 );
883 sha2_update( &sha2, secret, 32 );
884 sha2_update( &sha2, padding, 32 );
885 sha2_update( &sha2, buf + len, 32 );
886 sha2_finish( &sha2, buf + len );
887}
888
Paul Bakker5121ce52009-01-03 21:22:43 +0000889/*
890 * Encryption/decryption functions
891 */
892static int ssl_encrypt_buf( ssl_context *ssl )
893{
Paul Bakker23986e52011-04-24 08:57:21 +0000894 size_t i, padlen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000895
896 SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
897
898 /*
899 * Add MAC then encrypt
900 */
901 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
902 {
Paul Bakker48916f92012-09-16 19:57:18 +0000903 if( ssl->transform_out->maclen == 16 )
904 ssl_mac_md5( ssl->transform_out->mac_enc,
Paul Bakker5121ce52009-01-03 21:22:43 +0000905 ssl->out_msg, ssl->out_msglen,
906 ssl->out_ctr, ssl->out_msgtype );
Paul Bakker48916f92012-09-16 19:57:18 +0000907 else if( ssl->transform_out->maclen == 20 )
908 ssl_mac_sha1( ssl->transform_out->mac_enc,
Paul Bakker5121ce52009-01-03 21:22:43 +0000909 ssl->out_msg, ssl->out_msglen,
910 ssl->out_ctr, ssl->out_msgtype );
Paul Bakker48916f92012-09-16 19:57:18 +0000911 else if( ssl->transform_out->maclen == 32 )
912 ssl_mac_sha2( ssl->transform_out->mac_enc,
Paul Bakker5f70b252012-09-13 14:23:06 +0000913 ssl->out_msg, ssl->out_msglen,
914 ssl->out_ctr, ssl->out_msgtype );
Paul Bakker48916f92012-09-16 19:57:18 +0000915 else if( ssl->transform_out->maclen != 0 )
Paul Bakker5f70b252012-09-13 14:23:06 +0000916 {
Paul Bakker48916f92012-09-16 19:57:18 +0000917 SSL_DEBUG_MSG( 1, ( "invalid MAC len: %d",
918 ssl->transform_out->maclen ) );
Paul Bakker5f70b252012-09-13 14:23:06 +0000919 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
920 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000921 }
922 else
923 {
Paul Bakker48916f92012-09-16 19:57:18 +0000924 if( ssl->transform_out->maclen == 16 )
Paul Bakker186751d2012-05-08 13:16:14 +0000925 {
Paul Bakker5bd42292012-12-19 14:40:42 +0100926 md5_hmac( ssl->transform_out->mac_enc, 16,
927 ssl->out_ctr, ssl->out_msglen + 13,
928 ssl->out_msg + ssl->out_msglen );
Paul Bakker186751d2012-05-08 13:16:14 +0000929 }
Paul Bakker48916f92012-09-16 19:57:18 +0000930 else if( ssl->transform_out->maclen == 20 )
Paul Bakker186751d2012-05-08 13:16:14 +0000931 {
Paul Bakker5bd42292012-12-19 14:40:42 +0100932 sha1_hmac( ssl->transform_out->mac_enc, 20,
933 ssl->out_ctr, ssl->out_msglen + 13,
934 ssl->out_msg + ssl->out_msglen );
Paul Bakker186751d2012-05-08 13:16:14 +0000935 }
Paul Bakker48916f92012-09-16 19:57:18 +0000936 else if( ssl->transform_out->maclen == 32 )
Paul Bakker186751d2012-05-08 13:16:14 +0000937 {
Paul Bakker5bd42292012-12-19 14:40:42 +0100938 sha2_hmac( ssl->transform_out->mac_enc, 32,
939 ssl->out_ctr, ssl->out_msglen + 13,
940 ssl->out_msg + ssl->out_msglen, 0 );
Paul Bakker186751d2012-05-08 13:16:14 +0000941 }
Paul Bakker48916f92012-09-16 19:57:18 +0000942 else if( ssl->transform_out->maclen != 0 )
Paul Bakker5f70b252012-09-13 14:23:06 +0000943 {
Paul Bakker48916f92012-09-16 19:57:18 +0000944 SSL_DEBUG_MSG( 1, ( "invalid MAC len: %d",
945 ssl->transform_out->maclen ) );
Paul Bakker5f70b252012-09-13 14:23:06 +0000946 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
947 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000948 }
949
950 SSL_DEBUG_BUF( 4, "computed mac",
Paul Bakker48916f92012-09-16 19:57:18 +0000951 ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000952
Paul Bakker48916f92012-09-16 19:57:18 +0000953 ssl->out_msglen += ssl->transform_out->maclen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000954
Paul Bakker48916f92012-09-16 19:57:18 +0000955 if( ssl->transform_out->ivlen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000956 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000957 padlen = 0;
958
959 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
960 "including %d bytes of padding",
961 ssl->out_msglen, 0 ) );
962
963 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
964 ssl->out_msg, ssl->out_msglen );
965
Paul Bakkerfab5c822012-02-06 16:45:10 +0000966#if defined(POLARSSL_ARC4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000967 if( ssl->session_out->ciphersuite == TLS_RSA_WITH_RC4_128_MD5 ||
968 ssl->session_out->ciphersuite == TLS_RSA_WITH_RC4_128_SHA )
Paul Bakkerfab5c822012-02-06 16:45:10 +0000969 {
Paul Bakker48916f92012-09-16 19:57:18 +0000970 arc4_crypt( (arc4_context *) ssl->transform_out->ctx_enc,
Paul Bakkerfab5c822012-02-06 16:45:10 +0000971 ssl->out_msglen, ssl->out_msg,
972 ssl->out_msg );
973 } else
Paul Bakker5121ce52009-01-03 21:22:43 +0000974#endif
Paul Bakkerfab5c822012-02-06 16:45:10 +0000975#if defined(POLARSSL_CIPHER_NULL_CIPHER)
Paul Bakker645ce3a2012-10-31 12:32:41 +0000976 if( ssl->session_out->ciphersuite == TLS_RSA_WITH_NULL_MD5 ||
977 ssl->session_out->ciphersuite == TLS_RSA_WITH_NULL_SHA ||
978 ssl->session_out->ciphersuite == TLS_RSA_WITH_NULL_SHA256 )
Paul Bakkerfab5c822012-02-06 16:45:10 +0000979 {
980 } else
981#endif
982 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000983 }
Paul Bakker48916f92012-09-16 19:57:18 +0000984 else if( ssl->transform_out->ivlen == 12 )
Paul Bakkerca4ab492012-04-18 14:23:57 +0000985 {
986 size_t enc_msglen;
987 unsigned char *enc_msg;
988 unsigned char add_data[13];
989 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
990
991 padlen = 0;
992 enc_msglen = ssl->out_msglen;
993
994 memcpy( add_data, ssl->out_ctr, 8 );
995 add_data[8] = ssl->out_msgtype;
996 add_data[9] = ssl->major_ver;
997 add_data[10] = ssl->minor_ver;
998 add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
999 add_data[12] = ssl->out_msglen & 0xFF;
1000
1001 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1002 add_data, 13 );
1003
1004#if defined(POLARSSL_AES_C) && defined(POLARSSL_GCM_C)
1005
Paul Bakker645ce3a2012-10-31 12:32:41 +00001006 if( ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_128_GCM_SHA256 ||
1007 ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 ||
1008 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ||
1009 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001010 {
1011 /*
1012 * Generate IV
1013 */
Paul Bakker48916f92012-09-16 19:57:18 +00001014 ret = ssl->f_rng( ssl->p_rng,
1015 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
1016 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001017 if( ret != 0 )
1018 return( ret );
1019
1020 /*
1021 * Shift message for ivlen bytes and prepend IV
1022 */
Paul Bakker48916f92012-09-16 19:57:18 +00001023 memmove( ssl->out_msg + ssl->transform_out->ivlen -
1024 ssl->transform_out->fixed_ivlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001025 ssl->out_msg, ssl->out_msglen );
Paul Bakker48916f92012-09-16 19:57:18 +00001026 memcpy( ssl->out_msg,
1027 ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
1028 ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001029
1030 /*
1031 * Fix pointer positions and message length with added IV
1032 */
Paul Bakker48916f92012-09-16 19:57:18 +00001033 enc_msg = ssl->out_msg + ssl->transform_out->ivlen -
1034 ssl->transform_out->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001035 enc_msglen = ssl->out_msglen;
Paul Bakker48916f92012-09-16 19:57:18 +00001036 ssl->out_msglen += ssl->transform_out->ivlen -
1037 ssl->transform_out->fixed_ivlen;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001038
1039 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
1040 "including %d bytes of padding",
1041 ssl->out_msglen, 0 ) );
1042
1043 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
1044 ssl->out_msg, ssl->out_msglen );
1045
1046 /*
1047 * Adjust for tag
1048 */
1049 ssl->out_msglen += 16;
1050
Paul Bakker48916f92012-09-16 19:57:18 +00001051 gcm_crypt_and_tag( (gcm_context *) ssl->transform_out->ctx_enc,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001052 GCM_ENCRYPT, enc_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001053 ssl->transform_out->iv_enc, ssl->transform_out->ivlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001054 add_data, 13,
1055 enc_msg, enc_msg,
1056 16, enc_msg + enc_msglen );
1057
1058 SSL_DEBUG_BUF( 4, "after encrypt: tag",
1059 enc_msg + enc_msglen, 16 );
1060
1061 } else
1062#endif
1063 return( ret );
1064 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001065 else
1066 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001067 unsigned char *enc_msg;
Paul Bakker23986e52011-04-24 08:57:21 +00001068 size_t enc_msglen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001069
Paul Bakker48916f92012-09-16 19:57:18 +00001070 padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
1071 ssl->transform_out->ivlen;
1072 if( padlen == ssl->transform_out->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001073 padlen = 0;
1074
1075 for( i = 0; i <= padlen; i++ )
1076 ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
1077
1078 ssl->out_msglen += padlen + 1;
1079
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001080 enc_msglen = ssl->out_msglen;
1081 enc_msg = ssl->out_msg;
1082
1083 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001084 * Prepend per-record IV for block cipher in TLS v1.1 and up as per
1085 * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001086 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001087 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001088 {
1089 /*
1090 * Generate IV
1091 */
Paul Bakker48916f92012-09-16 19:57:18 +00001092 int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc,
1093 ssl->transform_out->ivlen );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001094 if( ret != 0 )
1095 return( ret );
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001096
1097 /*
1098 * Shift message for ivlen bytes and prepend IV
1099 */
Paul Bakker48916f92012-09-16 19:57:18 +00001100 memmove( ssl->out_msg + ssl->transform_out->ivlen, ssl->out_msg,
1101 ssl->out_msglen );
1102 memcpy( ssl->out_msg, ssl->transform_out->iv_enc,
1103 ssl->transform_out->ivlen );
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001104
1105 /*
1106 * Fix pointer positions and message length with added IV
1107 */
Paul Bakker48916f92012-09-16 19:57:18 +00001108 enc_msg = ssl->out_msg + ssl->transform_out->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001109 enc_msglen = ssl->out_msglen;
Paul Bakker48916f92012-09-16 19:57:18 +00001110 ssl->out_msglen += ssl->transform_out->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001111 }
1112
Paul Bakker5121ce52009-01-03 21:22:43 +00001113 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001114 "including %d bytes of IV and %d bytes of padding",
Paul Bakker48916f92012-09-16 19:57:18 +00001115 ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001116
1117 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
1118 ssl->out_msg, ssl->out_msglen );
1119
Paul Bakker48916f92012-09-16 19:57:18 +00001120 switch( ssl->transform_out->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001121 {
Paul Bakker40e46942009-01-03 21:51:57 +00001122#if defined(POLARSSL_DES_C)
Paul Bakkerfab5c822012-02-06 16:45:10 +00001123 case 8:
1124#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
Paul Bakker645ce3a2012-10-31 12:32:41 +00001125 if( ssl->session_out->ciphersuite == TLS_RSA_WITH_DES_CBC_SHA ||
1126 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_DES_CBC_SHA )
Paul Bakkerfab5c822012-02-06 16:45:10 +00001127 {
Paul Bakker48916f92012-09-16 19:57:18 +00001128 des_crypt_cbc( (des_context *) ssl->transform_out->ctx_enc,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001129 DES_ENCRYPT, enc_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001130 ssl->transform_out->iv_enc, enc_msg, enc_msg );
Paul Bakkerfab5c822012-02-06 16:45:10 +00001131 }
1132 else
1133#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001134 des3_crypt_cbc( (des3_context *) ssl->transform_out->ctx_enc,
1135 DES_ENCRYPT, enc_msglen,
1136 ssl->transform_out->iv_enc, enc_msg, enc_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +00001137 break;
1138#endif
1139
1140 case 16:
Paul Bakker40e46942009-01-03 21:51:57 +00001141#if defined(POLARSSL_AES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00001142 if ( ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA ||
1143 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA ||
1144 ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA ||
1145 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA ||
1146 ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA256 ||
1147 ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA256 ||
1148 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 ||
1149 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 )
Paul Bakker23986e52011-04-24 08:57:21 +00001150 {
Paul Bakker48916f92012-09-16 19:57:18 +00001151 aes_crypt_cbc( (aes_context *) ssl->transform_out->ctx_enc,
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001152 AES_ENCRYPT, enc_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001153 ssl->transform_out->iv_enc, enc_msg, enc_msg);
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001154 break;
Paul Bakker23986e52011-04-24 08:57:21 +00001155 }
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001156#endif
1157
1158#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00001159 if ( ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA ||
1160 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA ||
1161 ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA ||
1162 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA ||
1163 ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 ||
1164 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 ||
1165 ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 ||
1166 ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 )
Paul Bakker23986e52011-04-24 08:57:21 +00001167 {
Paul Bakker48916f92012-09-16 19:57:18 +00001168 camellia_crypt_cbc( (camellia_context *) ssl->transform_out->ctx_enc,
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001169 CAMELLIA_ENCRYPT, enc_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001170 ssl->transform_out->iv_enc, enc_msg, enc_msg );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001171 break;
Paul Bakker23986e52011-04-24 08:57:21 +00001172 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001173#endif
1174
1175 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001176 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001177 }
1178 }
1179
Paul Bakkerca4ab492012-04-18 14:23:57 +00001180 for( i = 8; i > 0; i-- )
1181 if( ++ssl->out_ctr[i - 1] != 0 )
1182 break;
1183
Paul Bakker5121ce52009-01-03 21:22:43 +00001184 SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
1185
1186 return( 0 );
1187}
1188
Paul Bakkerfab5c822012-02-06 16:45:10 +00001189/*
1190 * TODO: Use digest version when integrated!
1191 */
1192#define POLARSSL_SSL_MAX_MAC_SIZE 32
1193
Paul Bakker5121ce52009-01-03 21:22:43 +00001194static int ssl_decrypt_buf( ssl_context *ssl )
1195{
Paul Bakker45829992013-01-03 14:52:21 +01001196 size_t i, padlen = 0, correct = 1;
Paul Bakkerfab5c822012-02-06 16:45:10 +00001197 unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
Paul Bakker5121ce52009-01-03 21:22:43 +00001198
1199 SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
1200
Paul Bakker48916f92012-09-16 19:57:18 +00001201 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001202 {
1203 SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
Paul Bakker48916f92012-09-16 19:57:18 +00001204 ssl->in_msglen, ssl->transform_in->minlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001205 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001206 }
1207
Paul Bakker48916f92012-09-16 19:57:18 +00001208 if( ssl->transform_in->ivlen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001209 {
Paul Bakker40e46942009-01-03 21:51:57 +00001210#if defined(POLARSSL_ARC4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00001211 if( ssl->session_in->ciphersuite == TLS_RSA_WITH_RC4_128_MD5 ||
1212 ssl->session_in->ciphersuite == TLS_RSA_WITH_RC4_128_SHA )
Paul Bakkerfab5c822012-02-06 16:45:10 +00001213 {
Paul Bakker48916f92012-09-16 19:57:18 +00001214 arc4_crypt( (arc4_context *) ssl->transform_in->ctx_dec,
Paul Bakkerbaad6502010-03-21 15:42:15 +00001215 ssl->in_msglen, ssl->in_msg,
1216 ssl->in_msg );
Paul Bakkerfab5c822012-02-06 16:45:10 +00001217 } else
Paul Bakker5121ce52009-01-03 21:22:43 +00001218#endif
Paul Bakkerfab5c822012-02-06 16:45:10 +00001219#if defined(POLARSSL_CIPHER_NULL_CIPHER)
Paul Bakker645ce3a2012-10-31 12:32:41 +00001220 if( ssl->session_in->ciphersuite == TLS_RSA_WITH_NULL_MD5 ||
1221 ssl->session_in->ciphersuite == TLS_RSA_WITH_NULL_SHA ||
1222 ssl->session_in->ciphersuite == TLS_RSA_WITH_NULL_SHA256 )
Paul Bakkerfab5c822012-02-06 16:45:10 +00001223 {
1224 } else
1225#endif
1226 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001227 }
Paul Bakker48916f92012-09-16 19:57:18 +00001228 else if( ssl->transform_in->ivlen == 12 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001229 {
1230 unsigned char *dec_msg;
1231 unsigned char *dec_msg_result;
1232 size_t dec_msglen;
1233 unsigned char add_data[13];
1234 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1235
Paul Bakkerca4ab492012-04-18 14:23:57 +00001236#if defined(POLARSSL_AES_C) && defined(POLARSSL_GCM_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00001237 if( ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_128_GCM_SHA256 ||
1238 ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 ||
1239 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ||
1240 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001241 {
Paul Bakker48916f92012-09-16 19:57:18 +00001242 dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
1243 ssl->transform_in->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001244 dec_msglen -= 16;
Paul Bakker48916f92012-09-16 19:57:18 +00001245 dec_msg = ssl->in_msg + ( ssl->transform_in->ivlen -
1246 ssl->transform_in->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001247 dec_msg_result = ssl->in_msg;
1248 ssl->in_msglen = dec_msglen;
1249
1250 memcpy( add_data, ssl->in_ctr, 8 );
1251 add_data[8] = ssl->in_msgtype;
1252 add_data[9] = ssl->major_ver;
1253 add_data[10] = ssl->minor_ver;
1254 add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
1255 add_data[12] = ssl->in_msglen & 0xFF;
1256
1257 SSL_DEBUG_BUF( 4, "additional data used for AEAD",
1258 add_data, 13 );
1259
Paul Bakker48916f92012-09-16 19:57:18 +00001260 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
1261 ssl->in_msg,
1262 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001263
Paul Bakker48916f92012-09-16 19:57:18 +00001264 SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
1265 ssl->transform_in->ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001266 SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
1267
Paul Bakker48916f92012-09-16 19:57:18 +00001268 memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
1269 ssl->in_msg,
1270 ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
Paul Bakkerca4ab492012-04-18 14:23:57 +00001271
Paul Bakker48916f92012-09-16 19:57:18 +00001272 ret = gcm_auth_decrypt( (gcm_context *) ssl->transform_in->ctx_dec,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001273 dec_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001274 ssl->transform_in->iv_dec,
1275 ssl->transform_in->ivlen,
Paul Bakkerca4ab492012-04-18 14:23:57 +00001276 add_data, 13,
1277 dec_msg + dec_msglen, 16,
1278 dec_msg, dec_msg_result );
1279
1280 if( ret != 0 )
1281 {
1282 SSL_DEBUG_MSG( 1, ( "AEAD decrypt failed on validation (ret = -0x%02x)",
1283 -ret ) );
1284
1285 return( POLARSSL_ERR_SSL_INVALID_MAC );
1286 }
1287 } else
1288#endif
1289 return( ret );
1290 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001291 else
1292 {
Paul Bakker45829992013-01-03 14:52:21 +01001293 /*
1294 * Decrypt and check the padding
1295 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001296 unsigned char *dec_msg;
1297 unsigned char *dec_msg_result;
Paul Bakker23986e52011-04-24 08:57:21 +00001298 size_t dec_msglen;
Paul Bakkere47b34b2013-02-27 14:48:00 +01001299 size_t minlen = 0;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001300
Paul Bakker5121ce52009-01-03 21:22:43 +00001301 /*
Paul Bakker45829992013-01-03 14:52:21 +01001302 * Check immediate ciphertext sanity
Paul Bakker5121ce52009-01-03 21:22:43 +00001303 */
Paul Bakker48916f92012-09-16 19:57:18 +00001304 if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001305 {
1306 SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
Paul Bakker48916f92012-09-16 19:57:18 +00001307 ssl->in_msglen, ssl->transform_in->ivlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001308 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001309 }
1310
Paul Bakker45829992013-01-03 14:52:21 +01001311 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
1312 minlen += ssl->transform_in->ivlen;
1313
1314 if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
1315 ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
1316 {
1317 SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
1318 ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) );
1319 return( POLARSSL_ERR_SSL_INVALID_MAC );
1320 }
1321
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001322 dec_msglen = ssl->in_msglen;
1323 dec_msg = ssl->in_msg;
1324 dec_msg_result = ssl->in_msg;
1325
1326 /*
Paul Bakker1ef83d62012-04-11 12:09:53 +00001327 * Initialize for prepended IV for block cipher in TLS v1.1 and up
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001328 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001329 if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001330 {
Paul Bakker48916f92012-09-16 19:57:18 +00001331 dec_msg += ssl->transform_in->ivlen;
1332 dec_msglen -= ssl->transform_in->ivlen;
1333 ssl->in_msglen -= ssl->transform_in->ivlen;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001334
Paul Bakker48916f92012-09-16 19:57:18 +00001335 for( i = 0; i < ssl->transform_in->ivlen; i++ )
1336 ssl->transform_in->iv_dec[i] = ssl->in_msg[i];
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001337 }
1338
Paul Bakker48916f92012-09-16 19:57:18 +00001339 switch( ssl->transform_in->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001340 {
Paul Bakker40e46942009-01-03 21:51:57 +00001341#if defined(POLARSSL_DES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001342 case 8:
Paul Bakkerfab5c822012-02-06 16:45:10 +00001343#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
Paul Bakker645ce3a2012-10-31 12:32:41 +00001344 if( ssl->session_in->ciphersuite == TLS_RSA_WITH_DES_CBC_SHA ||
1345 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_DES_CBC_SHA )
Paul Bakkerfab5c822012-02-06 16:45:10 +00001346 {
Paul Bakker48916f92012-09-16 19:57:18 +00001347 des_crypt_cbc( (des_context *) ssl->transform_in->ctx_dec,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001348 DES_DECRYPT, dec_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001349 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
Paul Bakkerfab5c822012-02-06 16:45:10 +00001350 }
1351 else
1352#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001353 des3_crypt_cbc( (des3_context *) ssl->transform_in->ctx_dec,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001354 DES_DECRYPT, dec_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001355 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
Paul Bakker5121ce52009-01-03 21:22:43 +00001356 break;
1357#endif
1358
Paul Bakker5121ce52009-01-03 21:22:43 +00001359 case 16:
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001360#if defined(POLARSSL_AES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00001361 if ( ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA ||
1362 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA ||
1363 ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA ||
1364 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA ||
1365 ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA256 ||
1366 ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA256 ||
1367 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 ||
1368 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 )
Paul Bakker23986e52011-04-24 08:57:21 +00001369 {
Paul Bakker48916f92012-09-16 19:57:18 +00001370 aes_crypt_cbc( (aes_context *) ssl->transform_in->ctx_dec,
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001371 AES_DECRYPT, dec_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001372 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001373 break;
Paul Bakker23986e52011-04-24 08:57:21 +00001374 }
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001375#endif
1376
1377#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00001378 if ( ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA ||
1379 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA ||
1380 ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA ||
1381 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA ||
1382 ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 ||
1383 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 ||
1384 ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 ||
1385 ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 )
Paul Bakker23986e52011-04-24 08:57:21 +00001386 {
Paul Bakker48916f92012-09-16 19:57:18 +00001387 camellia_crypt_cbc( (camellia_context *) ssl->transform_in->ctx_dec,
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001388 CAMELLIA_DECRYPT, dec_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001389 ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001390 break;
Paul Bakker23986e52011-04-24 08:57:21 +00001391 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001392#endif
1393
1394 default:
Paul Bakker40e46942009-01-03 21:51:57 +00001395 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001396 }
1397
1398 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
Paul Bakker45829992013-01-03 14:52:21 +01001399
1400 if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
1401 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001402#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001403 SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
1404 ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001405#endif
Paul Bakker45829992013-01-03 14:52:21 +01001406 padlen = 0;
Paul Bakker45829992013-01-03 14:52:21 +01001407 correct = 0;
1408 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001409
1410 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1411 {
Paul Bakker48916f92012-09-16 19:57:18 +00001412 if( padlen > ssl->transform_in->ivlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001413 {
Paul Bakkerd66f0702013-01-31 16:57:45 +01001414#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001415 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
1416 "should be no more than %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001417 padlen, ssl->transform_in->ivlen ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001418#endif
Paul Bakker45829992013-01-03 14:52:21 +01001419 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001420 }
1421 }
1422 else
1423 {
1424 /*
Paul Bakker45829992013-01-03 14:52:21 +01001425 * TLSv1+: always check the padding up to the first failure
1426 * and fake check up to 256 bytes of padding
Paul Bakker5121ce52009-01-03 21:22:43 +00001427 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001428 size_t pad_count = 0, fake_pad_count = 0;
1429 size_t padding_idx = ssl->in_msglen - padlen - 1;
1430
Paul Bakker5121ce52009-01-03 21:22:43 +00001431 for( i = 1; i <= padlen; i++ )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001432 pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1433
1434 for( ; i <= 256; i++ )
1435 fake_pad_count += ( ssl->in_msg[padding_idx + i] == padlen - 1 );
1436
1437 correct &= ( pad_count == padlen ); /* Only 1 on correct padding */
1438 correct &= ( pad_count + fake_pad_count < 512 ); /* Always 1 */
1439
Paul Bakkerd66f0702013-01-31 16:57:45 +01001440#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker45829992013-01-03 14:52:21 +01001441 if( padlen > 0 && correct == 0)
1442 SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) );
Paul Bakkerd66f0702013-01-31 16:57:45 +01001443#endif
Paul Bakkere47b34b2013-02-27 14:48:00 +01001444 padlen &= correct * 0x1FF;
Paul Bakker5121ce52009-01-03 21:22:43 +00001445 }
1446 }
1447
1448 SSL_DEBUG_BUF( 4, "raw buffer after decryption",
1449 ssl->in_msg, ssl->in_msglen );
1450
1451 /*
1452 * Always compute the MAC (RFC4346, CBCTIME).
1453 */
Paul Bakker48916f92012-09-16 19:57:18 +00001454 ssl->in_msglen -= ( ssl->transform_in->maclen + padlen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001455
1456 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
1457 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
1458
Paul Bakker45829992013-01-03 14:52:21 +01001459 memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001460
1461 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1462 {
Paul Bakker48916f92012-09-16 19:57:18 +00001463 if( ssl->transform_in->maclen == 16 )
1464 ssl_mac_md5( ssl->transform_in->mac_dec,
Paul Bakker5121ce52009-01-03 21:22:43 +00001465 ssl->in_msg, ssl->in_msglen,
1466 ssl->in_ctr, ssl->in_msgtype );
Paul Bakker48916f92012-09-16 19:57:18 +00001467 else if( ssl->transform_in->maclen == 20 )
1468 ssl_mac_sha1( ssl->transform_in->mac_dec,
Paul Bakker5121ce52009-01-03 21:22:43 +00001469 ssl->in_msg, ssl->in_msglen,
1470 ssl->in_ctr, ssl->in_msgtype );
Paul Bakker48916f92012-09-16 19:57:18 +00001471 else if( ssl->transform_in->maclen == 32 )
1472 ssl_mac_sha2( ssl->transform_in->mac_dec,
1473 ssl->in_msg, ssl->in_msglen,
1474 ssl->in_ctr, ssl->in_msgtype );
1475 else if( ssl->transform_in->maclen != 0 )
1476 {
1477 SSL_DEBUG_MSG( 1, ( "invalid MAC len: %d",
1478 ssl->transform_in->maclen ) );
1479 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1480 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001481 }
1482 else
1483 {
Paul Bakker45829992013-01-03 14:52:21 +01001484 /*
1485 * Process MAC and always update for padlen afterwards to make
1486 * total time independent of padlen
Paul Bakkere47b34b2013-02-27 14:48:00 +01001487 *
1488 * extra_run compensates MAC check for padlen
1489 *
1490 * Known timing attacks:
1491 * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)
1492 *
1493 * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values
1494 * correctly. (We round down instead of up, so -56 is the correct
1495 * value for our calculations instead of -55)
Paul Bakker45829992013-01-03 14:52:21 +01001496 */
Paul Bakkere47b34b2013-02-27 14:48:00 +01001497 int j, extra_run = 0;
1498 extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -
1499 ( 13 + ssl->in_msglen + 8 ) / 64;
1500
1501 extra_run &= correct * 0xFF;
1502
Paul Bakker48916f92012-09-16 19:57:18 +00001503 if( ssl->transform_in->maclen == 16 )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001504 {
1505 md5_context ctx;
1506 md5_hmac_starts( &ctx, ssl->transform_in->mac_dec, 16 );
1507 md5_hmac_update( &ctx, ssl->in_ctr, ssl->in_msglen + 13 );
1508 md5_hmac_finish( &ctx, ssl->in_msg + ssl->in_msglen );
1509
1510 for( j = 0; j < extra_run; j++ )
1511 md5_process( &ctx, ssl->in_msg );
1512 }
Paul Bakker48916f92012-09-16 19:57:18 +00001513 else if( ssl->transform_in->maclen == 20 )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001514 {
1515 sha1_context ctx;
1516 sha1_hmac_starts( &ctx, ssl->transform_in->mac_dec, 20 );
1517 sha1_hmac_update( &ctx, ssl->in_ctr, ssl->in_msglen + 13 );
1518 sha1_hmac_finish( &ctx, ssl->in_msg + ssl->in_msglen );
1519
1520 for( j = 0; j < extra_run; j++ )
1521 sha1_process( &ctx, ssl->in_msg );
1522 }
Paul Bakker48916f92012-09-16 19:57:18 +00001523 else if( ssl->transform_in->maclen == 32 )
Paul Bakkere47b34b2013-02-27 14:48:00 +01001524 {
1525 sha2_context ctx;
1526 sha2_hmac_starts( &ctx, ssl->transform_in->mac_dec, 32, 0 );
1527 sha2_hmac_update( &ctx, ssl->in_ctr, ssl->in_msglen + 13 );
1528 sha2_hmac_finish( &ctx, ssl->in_msg + ssl->in_msglen );
1529
1530 for( j = 0; j < extra_run; j++ )
1531 sha2_process( &ctx, ssl->in_msg );
1532 }
Paul Bakker48916f92012-09-16 19:57:18 +00001533 else if( ssl->transform_in->maclen != 0 )
1534 {
1535 SSL_DEBUG_MSG( 1, ( "invalid MAC len: %d",
1536 ssl->transform_in->maclen ) );
1537 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1538 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001539 }
1540
Paul Bakker48916f92012-09-16 19:57:18 +00001541 SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001542 SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001543 ssl->transform_in->maclen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001544
1545 if( memcmp( tmp, ssl->in_msg + ssl->in_msglen,
Paul Bakker48916f92012-09-16 19:57:18 +00001546 ssl->transform_in->maclen ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001547 {
Paul Bakkere47b34b2013-02-27 14:48:00 +01001548#if defined(POLARSSL_SSL_DEBUG_ALL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001549 SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakkere47b34b2013-02-27 14:48:00 +01001550#endif
Paul Bakker45829992013-01-03 14:52:21 +01001551 correct = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001552 }
1553
1554 /*
Paul Bakker45829992013-01-03 14:52:21 +01001555 * Finally check the correct flag
Paul Bakker5121ce52009-01-03 21:22:43 +00001556 */
Paul Bakker45829992013-01-03 14:52:21 +01001557 if( correct == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +00001558 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001559
1560 if( ssl->in_msglen == 0 )
1561 {
1562 ssl->nb_zero++;
1563
1564 /*
1565 * Three or more empty messages may be a DoS attack
1566 * (excessive CPU consumption).
1567 */
1568 if( ssl->nb_zero > 3 )
1569 {
1570 SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
1571 "messages, possible DoS attack" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001572 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001573 }
1574 }
1575 else
1576 ssl->nb_zero = 0;
1577
Paul Bakker23986e52011-04-24 08:57:21 +00001578 for( i = 8; i > 0; i-- )
1579 if( ++ssl->in_ctr[i - 1] != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001580 break;
1581
1582 SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
1583
1584 return( 0 );
1585}
1586
Paul Bakker2770fbd2012-07-03 13:30:23 +00001587#if defined(POLARSSL_ZLIB_SUPPORT)
1588/*
1589 * Compression/decompression functions
1590 */
1591static int ssl_compress_buf( ssl_context *ssl )
1592{
1593 int ret;
1594 unsigned char *msg_post = ssl->out_msg;
1595 size_t len_pre = ssl->out_msglen;
1596 unsigned char *msg_pre;
1597
1598 SSL_DEBUG_MSG( 2, ( "=> compress buf" ) );
1599
1600 msg_pre = (unsigned char*) malloc( len_pre );
1601 if( msg_pre == NULL )
1602 {
1603 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1604 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1605 }
1606
1607 memcpy( msg_pre, ssl->out_msg, len_pre );
1608
1609 SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ",
1610 ssl->out_msglen ) );
1611
1612 SSL_DEBUG_BUF( 4, "before compression: output payload",
1613 ssl->out_msg, ssl->out_msglen );
1614
Paul Bakker48916f92012-09-16 19:57:18 +00001615 ssl->transform_out->ctx_deflate.next_in = msg_pre;
1616 ssl->transform_out->ctx_deflate.avail_in = len_pre;
1617 ssl->transform_out->ctx_deflate.next_out = msg_post;
1618 ssl->transform_out->ctx_deflate.avail_out = SSL_BUFFER_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001619
Paul Bakker48916f92012-09-16 19:57:18 +00001620 ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001621 if( ret != Z_OK )
1622 {
1623 SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) );
1624 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1625 }
1626
Paul Bakker48916f92012-09-16 19:57:18 +00001627 ssl->out_msglen = SSL_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001628
1629 free( msg_pre );
1630
1631 SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ",
1632 ssl->out_msglen ) );
1633
1634 SSL_DEBUG_BUF( 4, "after compression: output payload",
1635 ssl->out_msg, ssl->out_msglen );
1636
1637 SSL_DEBUG_MSG( 2, ( "<= compress buf" ) );
1638
1639 return( 0 );
1640}
1641
1642static int ssl_decompress_buf( ssl_context *ssl )
1643{
1644 int ret;
1645 unsigned char *msg_post = ssl->in_msg;
1646 size_t len_pre = ssl->in_msglen;
1647 unsigned char *msg_pre;
1648
1649 SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) );
1650
1651 msg_pre = (unsigned char*) malloc( len_pre );
1652 if( msg_pre == NULL )
1653 {
1654 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len_pre ) );
1655 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1656 }
1657
1658 memcpy( msg_pre, ssl->in_msg, len_pre );
1659
1660 SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ",
1661 ssl->in_msglen ) );
1662
1663 SSL_DEBUG_BUF( 4, "before decompression: input payload",
1664 ssl->in_msg, ssl->in_msglen );
1665
Paul Bakker48916f92012-09-16 19:57:18 +00001666 ssl->transform_in->ctx_inflate.next_in = msg_pre;
1667 ssl->transform_in->ctx_inflate.avail_in = len_pre;
1668 ssl->transform_in->ctx_inflate.next_out = msg_post;
1669 ssl->transform_in->ctx_inflate.avail_out = SSL_MAX_CONTENT_LEN;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001670
Paul Bakker48916f92012-09-16 19:57:18 +00001671 ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001672 if( ret != Z_OK )
1673 {
1674 SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) );
1675 return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
1676 }
1677
Paul Bakker48916f92012-09-16 19:57:18 +00001678 ssl->in_msglen = SSL_MAX_CONTENT_LEN - ssl->transform_in->ctx_inflate.avail_out;
Paul Bakker2770fbd2012-07-03 13:30:23 +00001679
1680 free( msg_pre );
1681
1682 SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ",
1683 ssl->in_msglen ) );
1684
1685 SSL_DEBUG_BUF( 4, "after decompression: input payload",
1686 ssl->in_msg, ssl->in_msglen );
1687
1688 SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) );
1689
1690 return( 0 );
1691}
1692#endif /* POLARSSL_ZLIB_SUPPORT */
1693
Paul Bakker5121ce52009-01-03 21:22:43 +00001694/*
1695 * Fill the input message buffer
1696 */
Paul Bakker23986e52011-04-24 08:57:21 +00001697int ssl_fetch_input( ssl_context *ssl, size_t nb_want )
Paul Bakker5121ce52009-01-03 21:22:43 +00001698{
Paul Bakker23986e52011-04-24 08:57:21 +00001699 int ret;
1700 size_t len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001701
1702 SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
1703
1704 while( ssl->in_left < nb_want )
1705 {
1706 len = nb_want - ssl->in_left;
1707 ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
1708
1709 SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
1710 ssl->in_left, nb_want ) );
1711 SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
1712
Paul Bakker831a7552011-05-18 13:32:51 +00001713 if( ret == 0 )
1714 return( POLARSSL_ERR_SSL_CONN_EOF );
1715
Paul Bakker5121ce52009-01-03 21:22:43 +00001716 if( ret < 0 )
1717 return( ret );
1718
1719 ssl->in_left += ret;
1720 }
1721
1722 SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
1723
1724 return( 0 );
1725}
1726
1727/*
1728 * Flush any data not yet written
1729 */
1730int ssl_flush_output( ssl_context *ssl )
1731{
1732 int ret;
1733 unsigned char *buf;
1734
1735 SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
1736
1737 while( ssl->out_left > 0 )
1738 {
1739 SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
1740 5 + ssl->out_msglen, ssl->out_left ) );
1741
Paul Bakker5bd42292012-12-19 14:40:42 +01001742 buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
Paul Bakker5121ce52009-01-03 21:22:43 +00001743 ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
Paul Bakker186751d2012-05-08 13:16:14 +00001744
Paul Bakker5121ce52009-01-03 21:22:43 +00001745 SSL_DEBUG_RET( 2, "ssl->f_send", ret );
1746
1747 if( ret <= 0 )
1748 return( ret );
1749
1750 ssl->out_left -= ret;
1751 }
1752
1753 SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
1754
1755 return( 0 );
1756}
1757
1758/*
1759 * Record layer functions
1760 */
1761int ssl_write_record( ssl_context *ssl )
1762{
Paul Bakker05ef8352012-05-08 09:17:57 +00001763 int ret, done = 0;
Paul Bakker23986e52011-04-24 08:57:21 +00001764 size_t len = ssl->out_msglen;
Paul Bakker5121ce52009-01-03 21:22:43 +00001765
1766 SSL_DEBUG_MSG( 2, ( "=> write record" ) );
1767
Paul Bakker5121ce52009-01-03 21:22:43 +00001768 if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
1769 {
1770 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
1771 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
1772 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
1773
Paul Bakker48916f92012-09-16 19:57:18 +00001774 ssl->handshake->update_checksum( ssl, ssl->out_msg, len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001775 }
1776
Paul Bakker2770fbd2012-07-03 13:30:23 +00001777#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00001778 if( ssl->transform_out != NULL &&
1779 ssl->session_out->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00001780 {
1781 if( ( ret = ssl_compress_buf( ssl ) ) != 0 )
1782 {
1783 SSL_DEBUG_RET( 1, "ssl_compress_buf", ret );
1784 return( ret );
1785 }
1786
1787 len = ssl->out_msglen;
1788 }
1789#endif /*POLARSSL_ZLIB_SUPPORT */
1790
Paul Bakker05ef8352012-05-08 09:17:57 +00001791#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1792 if( ssl_hw_record_write != NULL)
Paul Bakker5121ce52009-01-03 21:22:43 +00001793 {
Paul Bakker05ef8352012-05-08 09:17:57 +00001794 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_write()" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001795
Paul Bakker05ef8352012-05-08 09:17:57 +00001796 ret = ssl_hw_record_write( ssl );
1797 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1798 {
1799 SSL_DEBUG_RET( 1, "ssl_hw_record_write", ret );
1800 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1801 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001802
1803 if( ret == 0 )
1804 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001805 }
1806#endif
1807 if( !done )
1808 {
1809 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
1810 ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
1811 ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
Paul Bakker5121ce52009-01-03 21:22:43 +00001812 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1813 ssl->out_hdr[4] = (unsigned char)( len );
Paul Bakker05ef8352012-05-08 09:17:57 +00001814
Paul Bakker48916f92012-09-16 19:57:18 +00001815 if( ssl->transform_out != NULL )
Paul Bakker05ef8352012-05-08 09:17:57 +00001816 {
1817 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
1818 {
1819 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
1820 return( ret );
1821 }
1822
1823 len = ssl->out_msglen;
1824 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
1825 ssl->out_hdr[4] = (unsigned char)( len );
1826 }
1827
1828 ssl->out_left = 5 + ssl->out_msglen;
1829
1830 SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
1831 "version = [%d:%d], msglen = %d",
1832 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
1833 ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
1834
1835 SSL_DEBUG_BUF( 4, "output record sent to network",
Paul Bakker5bd42292012-12-19 14:40:42 +01001836 ssl->out_hdr, 5 + ssl->out_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001837 }
1838
Paul Bakker5121ce52009-01-03 21:22:43 +00001839 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1840 {
1841 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
1842 return( ret );
1843 }
1844
1845 SSL_DEBUG_MSG( 2, ( "<= write record" ) );
1846
1847 return( 0 );
1848}
1849
1850int ssl_read_record( ssl_context *ssl )
1851{
Paul Bakker05ef8352012-05-08 09:17:57 +00001852 int ret, done = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001853
1854 SSL_DEBUG_MSG( 2, ( "=> read record" ) );
1855
1856 if( ssl->in_hslen != 0 &&
1857 ssl->in_hslen < ssl->in_msglen )
1858 {
1859 /*
1860 * Get next Handshake message in the current record
1861 */
1862 ssl->in_msglen -= ssl->in_hslen;
1863
Paul Bakker8934a982011-08-05 11:11:53 +00001864 memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
Paul Bakker48916f92012-09-16 19:57:18 +00001865 ssl->in_msglen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001866
1867 ssl->in_hslen = 4;
1868 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1869
1870 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1871 " %d, type = %d, hslen = %d",
1872 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1873
1874 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1875 {
1876 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001877 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001878 }
1879
1880 if( ssl->in_msglen < ssl->in_hslen )
1881 {
1882 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001883 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001884 }
1885
Paul Bakker48916f92012-09-16 19:57:18 +00001886 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00001887
1888 return( 0 );
1889 }
1890
1891 ssl->in_hslen = 0;
1892
1893 /*
1894 * Read the record header and validate it
1895 */
1896 if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
1897 {
1898 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1899 return( ret );
1900 }
1901
1902 ssl->in_msgtype = ssl->in_hdr[0];
1903 ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
1904
1905 SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
1906 "version = [%d:%d], msglen = %d",
1907 ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
1908 ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
1909
1910 if( ssl->in_hdr[1] != ssl->major_ver )
1911 {
1912 SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001913 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001914 }
1915
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001916 if( ssl->in_hdr[2] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00001917 {
1918 SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001919 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001920 }
1921
1922 /*
1923 * Make sure the message length is acceptable
1924 */
Paul Bakker48916f92012-09-16 19:57:18 +00001925 if( ssl->transform_in == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001926 {
1927 if( ssl->in_msglen < 1 ||
1928 ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1929 {
1930 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001931 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001932 }
1933 }
1934 else
1935 {
Paul Bakker48916f92012-09-16 19:57:18 +00001936 if( ssl->in_msglen < ssl->transform_in->minlen )
Paul Bakker5121ce52009-01-03 21:22:43 +00001937 {
1938 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001939 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001940 }
1941
1942 if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001943 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN )
Paul Bakker5121ce52009-01-03 21:22:43 +00001944 {
1945 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001946 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001947 }
1948
1949 /*
1950 * TLS encrypted messages can have up to 256 bytes of padding
1951 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001952 if( ssl->minor_ver >= SSL_MINOR_VERSION_1 &&
Paul Bakker48916f92012-09-16 19:57:18 +00001953 ssl->in_msglen > ssl->transform_in->minlen + SSL_MAX_CONTENT_LEN + 256 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001954 {
1955 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001956 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001957 }
1958 }
1959
1960 /*
1961 * Read and optionally decrypt the message contents
1962 */
1963 if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 )
1964 {
1965 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1966 return( ret );
1967 }
1968
1969 SSL_DEBUG_BUF( 4, "input record from network",
1970 ssl->in_hdr, 5 + ssl->in_msglen );
1971
Paul Bakker05ef8352012-05-08 09:17:57 +00001972#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
1973 if( ssl_hw_record_read != NULL)
1974 {
1975 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_read()" ) );
1976
1977 ret = ssl_hw_record_read( ssl );
1978 if( ret != 0 && ret != POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH )
1979 {
1980 SSL_DEBUG_RET( 1, "ssl_hw_record_read", ret );
1981 return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
1982 }
Paul Bakkerc7878112012-12-19 14:41:14 +01001983
1984 if( ret == 0 )
1985 done = 1;
Paul Bakker05ef8352012-05-08 09:17:57 +00001986 }
1987#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001988 if( !done && ssl->transform_in != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001989 {
1990 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
1991 {
Paul Bakker40865c82013-01-31 17:13:13 +01001992#if defined(POLARSSL_SSL_ALERT_MESSAGES)
1993 if( ret == POLARSSL_ERR_SSL_INVALID_MAC )
1994 {
1995 ssl_send_alert_message( ssl,
1996 SSL_ALERT_LEVEL_FATAL,
1997 SSL_ALERT_MSG_BAD_RECORD_MAC );
1998 }
1999#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002000 SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
2001 return( ret );
2002 }
2003
2004 SSL_DEBUG_BUF( 4, "input payload after decrypt",
2005 ssl->in_msg, ssl->in_msglen );
2006
2007 if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
2008 {
2009 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002010 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002011 }
2012 }
2013
Paul Bakker2770fbd2012-07-03 13:30:23 +00002014#if defined(POLARSSL_ZLIB_SUPPORT)
Paul Bakker48916f92012-09-16 19:57:18 +00002015 if( ssl->transform_in != NULL &&
2016 ssl->session_in->compression == SSL_COMPRESS_DEFLATE )
Paul Bakker2770fbd2012-07-03 13:30:23 +00002017 {
2018 if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )
2019 {
2020 SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret );
2021 return( ret );
2022 }
2023
2024 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
2025 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
2026 }
2027#endif /* POLARSSL_ZLIB_SUPPORT */
2028
Paul Bakker0a925182012-04-16 06:46:41 +00002029 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE &&
2030 ssl->in_msgtype != SSL_MSG_ALERT &&
2031 ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC &&
2032 ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
2033 {
2034 SSL_DEBUG_MSG( 1, ( "unknown record type" ) );
2035
Paul Bakker48916f92012-09-16 19:57:18 +00002036 if( ( ret = ssl_send_alert_message( ssl,
2037 SSL_ALERT_LEVEL_FATAL,
2038 SSL_ALERT_MSG_UNEXPECTED_MESSAGE ) ) != 0 )
Paul Bakker0a925182012-04-16 06:46:41 +00002039 {
2040 return( ret );
2041 }
2042
2043 return( POLARSSL_ERR_SSL_INVALID_RECORD );
2044 }
2045
Paul Bakker5121ce52009-01-03 21:22:43 +00002046 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
2047 {
2048 ssl->in_hslen = 4;
2049 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
2050
2051 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
2052 " %d, type = %d, hslen = %d",
2053 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
2054
2055 /*
2056 * Additional checks to validate the handshake header
2057 */
2058 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
2059 {
2060 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002061 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002062 }
2063
2064 if( ssl->in_msglen < ssl->in_hslen )
2065 {
2066 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002067 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00002068 }
2069
Paul Bakker48916f92012-09-16 19:57:18 +00002070 if( ssl->state != SSL_HANDSHAKE_OVER )
2071 ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );
Paul Bakker5121ce52009-01-03 21:22:43 +00002072 }
2073
2074 if( ssl->in_msgtype == SSL_MSG_ALERT )
2075 {
2076 SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
2077 ssl->in_msg[0], ssl->in_msg[1] ) );
2078
2079 /*
2080 * Ignore non-fatal alerts, except close_notify
2081 */
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002082 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_FATAL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002083 {
Paul Bakker2770fbd2012-07-03 13:30:23 +00002084 SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)",
2085 ssl->in_msg[1] ) );
Paul Bakker9d781402011-05-09 16:17:09 +00002086 /**
2087 * Subtract from error code as ssl->in_msg[1] is 7-bit positive
2088 * error identifier.
2089 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00002090 return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002091 }
2092
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002093 if( ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2094 ssl->in_msg[1] == SSL_ALERT_MSG_CLOSE_NOTIFY )
Paul Bakker5121ce52009-01-03 21:22:43 +00002095 {
2096 SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002097 return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00002098 }
2099 }
2100
2101 ssl->in_left = 0;
2102
2103 SSL_DEBUG_MSG( 2, ( "<= read record" ) );
2104
2105 return( 0 );
2106}
2107
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00002108int ssl_send_fatal_handshake_failure( ssl_context *ssl )
2109{
2110 int ret;
2111
2112 if( ( ret = ssl_send_alert_message( ssl,
2113 SSL_ALERT_LEVEL_FATAL,
2114 SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )
2115 {
2116 return( ret );
2117 }
2118
2119 return( 0 );
2120}
2121
Paul Bakker0a925182012-04-16 06:46:41 +00002122int ssl_send_alert_message( ssl_context *ssl,
2123 unsigned char level,
2124 unsigned char message )
2125{
2126 int ret;
2127
2128 SSL_DEBUG_MSG( 2, ( "=> send alert message" ) );
2129
2130 ssl->out_msgtype = SSL_MSG_ALERT;
2131 ssl->out_msglen = 2;
2132 ssl->out_msg[0] = level;
2133 ssl->out_msg[1] = message;
2134
2135 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2136 {
2137 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2138 return( ret );
2139 }
2140
2141 SSL_DEBUG_MSG( 2, ( "<= send alert message" ) );
2142
2143 return( 0 );
2144}
2145
Paul Bakker5121ce52009-01-03 21:22:43 +00002146/*
2147 * Handshake functions
2148 */
2149int ssl_write_certificate( ssl_context *ssl )
2150{
Paul Bakker23986e52011-04-24 08:57:21 +00002151 int ret;
2152 size_t i, n;
Paul Bakkerff60ee62010-03-16 21:09:09 +00002153 const x509_cert *crt;
Paul Bakker5121ce52009-01-03 21:22:43 +00002154
2155 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
2156
2157 if( ssl->endpoint == SSL_IS_CLIENT )
2158 {
2159 if( ssl->client_auth == 0 )
2160 {
2161 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
2162 ssl->state++;
2163 return( 0 );
2164 }
2165
2166 /*
2167 * If using SSLv3 and got no cert, send an Alert message
2168 * (otherwise an empty Certificate message will be sent).
2169 */
2170 if( ssl->own_cert == NULL &&
2171 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2172 {
2173 ssl->out_msglen = 2;
2174 ssl->out_msgtype = SSL_MSG_ALERT;
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002175 ssl->out_msg[0] = SSL_ALERT_LEVEL_WARNING;
2176 ssl->out_msg[1] = SSL_ALERT_MSG_NO_CERT;
Paul Bakker5121ce52009-01-03 21:22:43 +00002177
2178 SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
2179 goto write_msg;
2180 }
2181 }
2182 else /* SSL_IS_SERVER */
2183 {
2184 if( ssl->own_cert == NULL )
2185 {
2186 SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002187 return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002188 }
2189 }
2190
2191 SSL_DEBUG_CRT( 3, "own certificate", ssl->own_cert );
2192
2193 /*
2194 * 0 . 0 handshake type
2195 * 1 . 3 handshake length
2196 * 4 . 6 length of all certs
2197 * 7 . 9 length of cert. 1
2198 * 10 . n-1 peer certificate
2199 * n . n+2 length of cert. 2
2200 * n+3 . ... upper level cert, etc.
2201 */
2202 i = 7;
2203 crt = ssl->own_cert;
2204
Paul Bakker29087132010-03-21 21:03:34 +00002205 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002206 {
2207 n = crt->raw.len;
2208 if( i + 3 + n > SSL_MAX_CONTENT_LEN )
2209 {
2210 SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
2211 i + 3 + n, SSL_MAX_CONTENT_LEN ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002212 return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002213 }
2214
2215 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
2216 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
2217 ssl->out_msg[i + 2] = (unsigned char)( n );
2218
2219 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
2220 i += n; crt = crt->next;
2221 }
2222
2223 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
2224 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
2225 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
2226
2227 ssl->out_msglen = i;
2228 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2229 ssl->out_msg[0] = SSL_HS_CERTIFICATE;
2230
2231write_msg:
2232
2233 ssl->state++;
2234
2235 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2236 {
2237 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2238 return( ret );
2239 }
2240
2241 SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
2242
2243 return( 0 );
2244}
2245
2246int ssl_parse_certificate( ssl_context *ssl )
2247{
Paul Bakker23986e52011-04-24 08:57:21 +00002248 int ret;
2249 size_t i, n;
Paul Bakker5121ce52009-01-03 21:22:43 +00002250
2251 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
2252
2253 if( ssl->endpoint == SSL_IS_SERVER &&
2254 ssl->authmode == SSL_VERIFY_NONE )
2255 {
Paul Bakkercdf07e92011-01-30 17:05:13 +00002256 ssl->verify_result = BADCERT_SKIP_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00002257 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
2258 ssl->state++;
2259 return( 0 );
2260 }
2261
2262 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2263 {
2264 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2265 return( ret );
2266 }
2267
2268 ssl->state++;
2269
2270 /*
2271 * Check if the client sent an empty certificate
2272 */
2273 if( ssl->endpoint == SSL_IS_SERVER &&
2274 ssl->minor_ver == SSL_MINOR_VERSION_0 )
2275 {
Paul Bakker2e11f7d2010-07-25 14:24:53 +00002276 if( ssl->in_msglen == 2 &&
2277 ssl->in_msgtype == SSL_MSG_ALERT &&
2278 ssl->in_msg[0] == SSL_ALERT_LEVEL_WARNING &&
2279 ssl->in_msg[1] == SSL_ALERT_MSG_NO_CERT )
Paul Bakker5121ce52009-01-03 21:22:43 +00002280 {
2281 SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
2282
Paul Bakkercdf07e92011-01-30 17:05:13 +00002283 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002284 if( ssl->authmode == SSL_VERIFY_OPTIONAL )
2285 return( 0 );
2286 else
Paul Bakker40e46942009-01-03 21:51:57 +00002287 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002288 }
2289 }
2290
2291 if( ssl->endpoint == SSL_IS_SERVER &&
2292 ssl->minor_ver != SSL_MINOR_VERSION_0 )
2293 {
2294 if( ssl->in_hslen == 7 &&
2295 ssl->in_msgtype == SSL_MSG_HANDSHAKE &&
2296 ssl->in_msg[0] == SSL_HS_CERTIFICATE &&
2297 memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
2298 {
2299 SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
2300
Paul Bakkercdf07e92011-01-30 17:05:13 +00002301 ssl->verify_result = BADCERT_MISSING;
Paul Bakker5121ce52009-01-03 21:22:43 +00002302 if( ssl->authmode == SSL_VERIFY_REQUIRED )
Paul Bakker40e46942009-01-03 21:51:57 +00002303 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002304 else
2305 return( 0 );
2306 }
2307 }
2308
2309 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2310 {
2311 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002312 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002313 }
2314
2315 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
2316 {
2317 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002318 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002319 }
2320
2321 /*
2322 * Same message structure as in ssl_write_certificate()
2323 */
2324 n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
2325
2326 if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
2327 {
2328 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002329 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002330 }
2331
Paul Bakker48916f92012-09-16 19:57:18 +00002332 if( ( ssl->session_negotiate->peer_cert = (x509_cert *) malloc(
Paul Bakker5121ce52009-01-03 21:22:43 +00002333 sizeof( x509_cert ) ) ) == NULL )
2334 {
2335 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
2336 sizeof( x509_cert ) ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002337 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002338 }
2339
Paul Bakker48916f92012-09-16 19:57:18 +00002340 memset( ssl->session_negotiate->peer_cert, 0, sizeof( x509_cert ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002341
2342 i = 7;
2343
2344 while( i < ssl->in_hslen )
2345 {
2346 if( ssl->in_msg[i] != 0 )
2347 {
2348 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002349 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002350 }
2351
2352 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
2353 | (unsigned int) ssl->in_msg[i + 2];
2354 i += 3;
2355
2356 if( n < 128 || i + n > ssl->in_hslen )
2357 {
2358 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002359 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002360 }
2361
Paul Bakker48916f92012-09-16 19:57:18 +00002362 ret = x509parse_crt( ssl->session_negotiate->peer_cert, ssl->in_msg + i,
2363 n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002364 if( ret != 0 )
2365 {
2366 SSL_DEBUG_RET( 1, " x509parse_crt", ret );
2367 return( ret );
2368 }
2369
2370 i += n;
2371 }
2372
Paul Bakker48916f92012-09-16 19:57:18 +00002373 SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert );
Paul Bakker5121ce52009-01-03 21:22:43 +00002374
2375 if( ssl->authmode != SSL_VERIFY_NONE )
2376 {
2377 if( ssl->ca_chain == NULL )
2378 {
2379 SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002380 return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002381 }
2382
Paul Bakker48916f92012-09-16 19:57:18 +00002383 ret = x509parse_verify( ssl->session_negotiate->peer_cert,
2384 ssl->ca_chain, ssl->ca_crl,
Paul Bakkerb63b0af2011-01-13 17:54:59 +00002385 ssl->peer_cn, &ssl->verify_result,
2386 ssl->f_vrfy, ssl->p_vrfy );
Paul Bakker5121ce52009-01-03 21:22:43 +00002387
2388 if( ret != 0 )
2389 SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
2390
2391 if( ssl->authmode != SSL_VERIFY_REQUIRED )
2392 ret = 0;
2393 }
2394
2395 SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
2396
2397 return( ret );
2398}
2399
2400int ssl_write_change_cipher_spec( ssl_context *ssl )
2401{
2402 int ret;
2403
2404 SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
2405
2406 ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
2407 ssl->out_msglen = 1;
2408 ssl->out_msg[0] = 1;
2409
Paul Bakker5121ce52009-01-03 21:22:43 +00002410 ssl->state++;
2411
2412 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2413 {
2414 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2415 return( ret );
2416 }
2417
2418 SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
2419
2420 return( 0 );
2421}
2422
2423int ssl_parse_change_cipher_spec( ssl_context *ssl )
2424{
2425 int ret;
2426
2427 SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
2428
Paul Bakker5121ce52009-01-03 21:22:43 +00002429 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2430 {
2431 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2432 return( ret );
2433 }
2434
2435 if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
2436 {
2437 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002438 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002439 }
2440
2441 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
2442 {
2443 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002444 return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
Paul Bakker5121ce52009-01-03 21:22:43 +00002445 }
2446
2447 ssl->state++;
2448
2449 SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
2450
2451 return( 0 );
2452}
2453
Paul Bakker48916f92012-09-16 19:57:18 +00002454void ssl_optimize_checksum( ssl_context *ssl, int ciphersuite )
Paul Bakker380da532012-04-18 16:10:25 +00002455{
Paul Bakker769075d2012-11-24 11:26:46 +01002456#if !defined(POLARSSL_SHA4_C)
2457 ((void) ciphersuite);
2458#endif
2459
Paul Bakker380da532012-04-18 16:10:25 +00002460 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Paul Bakker48916f92012-09-16 19:57:18 +00002461 ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;
Paul Bakker769075d2012-11-24 11:26:46 +01002462#if defined(POLARSSL_SHA4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00002463 else if ( ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 ||
2464 ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 )
Paul Bakker380da532012-04-18 16:10:25 +00002465 {
Paul Bakker48916f92012-09-16 19:57:18 +00002466 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
Paul Bakker380da532012-04-18 16:10:25 +00002467 }
Paul Bakker769075d2012-11-24 11:26:46 +01002468#endif
Paul Bakker380da532012-04-18 16:10:25 +00002469 else
Paul Bakker48916f92012-09-16 19:57:18 +00002470 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakker380da532012-04-18 16:10:25 +00002471}
2472
2473static void ssl_update_checksum_start( ssl_context *ssl, unsigned char *buf,
2474 size_t len )
2475{
Paul Bakker48916f92012-09-16 19:57:18 +00002476 md5_update( &ssl->handshake->fin_md5 , buf, len );
2477 sha1_update( &ssl->handshake->fin_sha1, buf, len );
2478 sha2_update( &ssl->handshake->fin_sha2, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002479#if defined(POLARSSL_SHA4_C)
Paul Bakker48916f92012-09-16 19:57:18 +00002480 sha4_update( &ssl->handshake->fin_sha4, buf, len );
Paul Bakker769075d2012-11-24 11:26:46 +01002481#endif
Paul Bakker380da532012-04-18 16:10:25 +00002482}
2483
2484static void ssl_update_checksum_md5sha1( ssl_context *ssl, unsigned char *buf,
2485 size_t len )
2486{
Paul Bakker48916f92012-09-16 19:57:18 +00002487 md5_update( &ssl->handshake->fin_md5 , buf, len );
2488 sha1_update( &ssl->handshake->fin_sha1, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002489}
2490
2491static void ssl_update_checksum_sha256( ssl_context *ssl, unsigned char *buf,
2492 size_t len )
2493{
Paul Bakker48916f92012-09-16 19:57:18 +00002494 sha2_update( &ssl->handshake->fin_sha2, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002495}
2496
Paul Bakker769075d2012-11-24 11:26:46 +01002497#if defined(POLARSSL_SHA4_C)
Paul Bakker380da532012-04-18 16:10:25 +00002498static void ssl_update_checksum_sha384( ssl_context *ssl, unsigned char *buf,
2499 size_t len )
2500{
Paul Bakker48916f92012-09-16 19:57:18 +00002501 sha4_update( &ssl->handshake->fin_sha4, buf, len );
Paul Bakker380da532012-04-18 16:10:25 +00002502}
Paul Bakker769075d2012-11-24 11:26:46 +01002503#endif
Paul Bakker380da532012-04-18 16:10:25 +00002504
Paul Bakker1ef83d62012-04-11 12:09:53 +00002505static void ssl_calc_finished_ssl(
2506 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002507{
Paul Bakker5121ce52009-01-03 21:22:43 +00002508 char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002509 md5_context md5;
2510 sha1_context sha1;
2511
Paul Bakker5121ce52009-01-03 21:22:43 +00002512 unsigned char padbuf[48];
2513 unsigned char md5sum[16];
2514 unsigned char sha1sum[20];
2515
Paul Bakker48916f92012-09-16 19:57:18 +00002516 ssl_session *session = ssl->session_negotiate;
2517 if( !session )
2518 session = ssl->session;
2519
Paul Bakker1ef83d62012-04-11 12:09:53 +00002520 SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) );
2521
Paul Bakker48916f92012-09-16 19:57:18 +00002522 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2523 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002524
2525 /*
2526 * SSLv3:
2527 * hash =
2528 * MD5( master + pad2 +
2529 * MD5( handshake + sender + master + pad1 ) )
2530 * + SHA1( master + pad2 +
2531 * SHA1( handshake + sender + master + pad1 ) )
Paul Bakker5121ce52009-01-03 21:22:43 +00002532 */
2533
2534 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002535 md5.state, sizeof( md5.state ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002536
2537 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002538 sha1.state, sizeof( sha1.state ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002539
Paul Bakker1ef83d62012-04-11 12:09:53 +00002540 sender = ( from == SSL_IS_CLIENT ) ? (char *) "CLNT"
2541 : (char *) "SRVR";
Paul Bakker5121ce52009-01-03 21:22:43 +00002542
Paul Bakker1ef83d62012-04-11 12:09:53 +00002543 memset( padbuf, 0x36, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002544
Paul Bakker1ef83d62012-04-11 12:09:53 +00002545 md5_update( &md5, (unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002546 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002547 md5_update( &md5, padbuf, 48 );
2548 md5_finish( &md5, md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002549
Paul Bakker1ef83d62012-04-11 12:09:53 +00002550 sha1_update( &sha1, (unsigned char *) sender, 4 );
Paul Bakker48916f92012-09-16 19:57:18 +00002551 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002552 sha1_update( &sha1, padbuf, 40 );
2553 sha1_finish( &sha1, sha1sum );
Paul Bakker5121ce52009-01-03 21:22:43 +00002554
Paul Bakker1ef83d62012-04-11 12:09:53 +00002555 memset( padbuf, 0x5C, 48 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002556
Paul Bakker1ef83d62012-04-11 12:09:53 +00002557 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +00002558 md5_update( &md5, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002559 md5_update( &md5, padbuf, 48 );
2560 md5_update( &md5, md5sum, 16 );
2561 md5_finish( &md5, buf );
Paul Bakker5121ce52009-01-03 21:22:43 +00002562
Paul Bakker1ef83d62012-04-11 12:09:53 +00002563 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +00002564 sha1_update( &sha1, session->master, 48 );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002565 sha1_update( &sha1, padbuf , 40 );
2566 sha1_update( &sha1, sha1sum, 20 );
2567 sha1_finish( &sha1, buf + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002568
Paul Bakker1ef83d62012-04-11 12:09:53 +00002569 SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002570
Paul Bakker1ef83d62012-04-11 12:09:53 +00002571 memset( &md5, 0, sizeof( md5_context ) );
2572 memset( &sha1, 0, sizeof( sha1_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002573
2574 memset( padbuf, 0, sizeof( padbuf ) );
2575 memset( md5sum, 0, sizeof( md5sum ) );
2576 memset( sha1sum, 0, sizeof( sha1sum ) );
2577
2578 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2579}
2580
Paul Bakker1ef83d62012-04-11 12:09:53 +00002581static void ssl_calc_finished_tls(
2582 ssl_context *ssl, unsigned char *buf, int from )
Paul Bakker5121ce52009-01-03 21:22:43 +00002583{
Paul Bakker1ef83d62012-04-11 12:09:53 +00002584 int len = 12;
2585 char *sender;
2586 md5_context md5;
Paul Bakker5121ce52009-01-03 21:22:43 +00002587 sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002588 unsigned char padbuf[36];
Paul Bakker5121ce52009-01-03 21:22:43 +00002589
Paul Bakker48916f92012-09-16 19:57:18 +00002590 ssl_session *session = ssl->session_negotiate;
2591 if( !session )
2592 session = ssl->session;
2593
Paul Bakker1ef83d62012-04-11 12:09:53 +00002594 SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002595
Paul Bakker48916f92012-09-16 19:57:18 +00002596 memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
2597 memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002598
Paul Bakker1ef83d62012-04-11 12:09:53 +00002599 /*
2600 * TLSv1:
2601 * hash = PRF( master, finished_label,
2602 * MD5( handshake ) + SHA1( handshake ) )[0..11]
2603 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002604
Paul Bakker1ef83d62012-04-11 12:09:53 +00002605 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
2606 md5.state, sizeof( md5.state ) );
2607
2608 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
2609 sha1.state, sizeof( sha1.state ) );
2610
2611 sender = ( from == SSL_IS_CLIENT )
2612 ? (char *) "client finished"
2613 : (char *) "server finished";
2614
2615 md5_finish( &md5, padbuf );
2616 sha1_finish( &sha1, padbuf + 16 );
2617
Paul Bakker48916f92012-09-16 19:57:18 +00002618 ssl->handshake->tls_prf( session->master, 48, sender,
2619 padbuf, 36, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002620
2621 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2622
2623 memset( &md5, 0, sizeof( md5_context ) );
2624 memset( &sha1, 0, sizeof( sha1_context ) );
2625
2626 memset( padbuf, 0, sizeof( padbuf ) );
2627
2628 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2629}
2630
Paul Bakkerca4ab492012-04-18 14:23:57 +00002631static void ssl_calc_finished_tls_sha256(
Paul Bakker1ef83d62012-04-11 12:09:53 +00002632 ssl_context *ssl, unsigned char *buf, int from )
2633{
2634 int len = 12;
2635 char *sender;
2636 sha2_context sha2;
2637 unsigned char padbuf[32];
2638
Paul Bakker48916f92012-09-16 19:57:18 +00002639 ssl_session *session = ssl->session_negotiate;
2640 if( !session )
2641 session = ssl->session;
2642
Paul Bakker380da532012-04-18 16:10:25 +00002643 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002644
Paul Bakker48916f92012-09-16 19:57:18 +00002645 memcpy( &sha2, &ssl->handshake->fin_sha2, sizeof(sha2_context) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002646
2647 /*
2648 * TLSv1.2:
2649 * hash = PRF( master, finished_label,
2650 * Hash( handshake ) )[0.11]
2651 */
2652
2653 SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *)
2654 sha2.state, sizeof( sha2.state ) );
2655
2656 sender = ( from == SSL_IS_CLIENT )
2657 ? (char *) "client finished"
2658 : (char *) "server finished";
2659
2660 sha2_finish( &sha2, padbuf );
2661
Paul Bakker48916f92012-09-16 19:57:18 +00002662 ssl->handshake->tls_prf( session->master, 48, sender,
2663 padbuf, 32, buf, len );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002664
2665 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2666
2667 memset( &sha2, 0, sizeof( sha2_context ) );
2668
2669 memset( padbuf, 0, sizeof( padbuf ) );
2670
2671 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2672}
2673
Paul Bakker769075d2012-11-24 11:26:46 +01002674#if defined(POLARSSL_SHA4_C)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002675static void ssl_calc_finished_tls_sha384(
2676 ssl_context *ssl, unsigned char *buf, int from )
2677{
2678 int len = 12;
2679 char *sender;
2680 sha4_context sha4;
2681 unsigned char padbuf[48];
2682
Paul Bakker48916f92012-09-16 19:57:18 +00002683 ssl_session *session = ssl->session_negotiate;
2684 if( !session )
2685 session = ssl->session;
2686
Paul Bakker380da532012-04-18 16:10:25 +00002687 SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002688
Paul Bakker48916f92012-09-16 19:57:18 +00002689 memcpy( &sha4, &ssl->handshake->fin_sha4, sizeof(sha4_context) );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002690
2691 /*
2692 * TLSv1.2:
2693 * hash = PRF( master, finished_label,
2694 * Hash( handshake ) )[0.11]
2695 */
2696
2697 SSL_DEBUG_BUF( 4, "finished sha4 state", (unsigned char *)
2698 sha4.state, sizeof( sha4.state ) );
2699
2700 sender = ( from == SSL_IS_CLIENT )
2701 ? (char *) "client finished"
2702 : (char *) "server finished";
2703
2704 sha4_finish( &sha4, padbuf );
2705
Paul Bakker48916f92012-09-16 19:57:18 +00002706 ssl->handshake->tls_prf( session->master, 48, sender,
2707 padbuf, 48, buf, len );
Paul Bakkerca4ab492012-04-18 14:23:57 +00002708
2709 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
2710
2711 memset( &sha4, 0, sizeof( sha4_context ) );
2712
2713 memset( padbuf, 0, sizeof( padbuf ) );
2714
2715 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
2716}
Paul Bakker769075d2012-11-24 11:26:46 +01002717#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002718
Paul Bakker48916f92012-09-16 19:57:18 +00002719void ssl_handshake_wrapup( ssl_context *ssl )
2720{
2721 SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) );
2722
2723 /*
2724 * Free our handshake params
2725 */
2726 ssl_handshake_free( ssl->handshake );
2727 free( ssl->handshake );
2728 ssl->handshake = NULL;
2729
2730 /*
2731 * Switch in our now active transform context
2732 */
2733 if( ssl->transform )
2734 {
2735 ssl_transform_free( ssl->transform );
2736 free( ssl->transform );
2737 }
2738 ssl->transform = ssl->transform_negotiate;
2739 ssl->transform_negotiate = NULL;
2740
Paul Bakker0a597072012-09-25 21:55:46 +00002741 if( ssl->session )
2742 {
2743 ssl_session_free( ssl->session );
2744 free( ssl->session );
2745 }
2746 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00002747 ssl->session_negotiate = NULL;
2748
Paul Bakker0a597072012-09-25 21:55:46 +00002749 /*
2750 * Add cache entry
2751 */
2752 if( ssl->f_set_cache != NULL )
2753 if( ssl->f_set_cache( ssl->p_set_cache, ssl->session ) != 0 )
2754 SSL_DEBUG_MSG( 1, ( "cache did not store session" ) );
2755
Paul Bakker48916f92012-09-16 19:57:18 +00002756 ssl->state++;
2757
2758 SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) );
2759}
2760
Paul Bakker1ef83d62012-04-11 12:09:53 +00002761int ssl_write_finished( ssl_context *ssl )
2762{
2763 int ret, hash_len;
2764
2765 SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
2766
Paul Bakker48916f92012-09-16 19:57:18 +00002767 ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->endpoint );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002768
2769 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002770 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2771
Paul Bakker48916f92012-09-16 19:57:18 +00002772 ssl->verify_data_len = hash_len;
2773 memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );
2774
Paul Bakker5121ce52009-01-03 21:22:43 +00002775 ssl->out_msglen = 4 + hash_len;
2776 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2777 ssl->out_msg[0] = SSL_HS_FINISHED;
2778
2779 /*
2780 * In case of session resuming, invert the client and server
2781 * ChangeCipherSpec messages order.
2782 */
Paul Bakker0a597072012-09-25 21:55:46 +00002783 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002784 {
2785 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker48916f92012-09-16 19:57:18 +00002786 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002787 else
2788 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2789 }
2790 else
2791 ssl->state++;
2792
Paul Bakker48916f92012-09-16 19:57:18 +00002793 /*
2794 * Switch to our negotiated transform and session parameters for outbound data.
2795 */
2796 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) );
2797 ssl->transform_out = ssl->transform_negotiate;
2798 ssl->session_out = ssl->session_negotiate;
2799 memset( ssl->out_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002800
Paul Bakker07eb38b2012-12-19 14:42:06 +01002801#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2802 if( ssl_hw_record_activate != NULL)
2803 {
2804 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_OUTBOUND ) ) != 0 )
2805 {
2806 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2807 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2808 }
2809 }
2810#endif
2811
Paul Bakker5121ce52009-01-03 21:22:43 +00002812 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2813 {
2814 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2815 return( ret );
2816 }
2817
2818 SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
2819
2820 return( 0 );
2821}
2822
2823int ssl_parse_finished( ssl_context *ssl )
2824{
Paul Bakker23986e52011-04-24 08:57:21 +00002825 int ret;
2826 unsigned int hash_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002827 unsigned char buf[36];
2828
2829 SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
2830
Paul Bakker48916f92012-09-16 19:57:18 +00002831 ssl->handshake->calc_finished( ssl, buf, ssl->endpoint ^ 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002832
Paul Bakker48916f92012-09-16 19:57:18 +00002833 /*
2834 * Switch to our negotiated transform and session parameters for inbound data.
2835 */
2836 SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) );
2837 ssl->transform_in = ssl->transform_negotiate;
2838 ssl->session_in = ssl->session_negotiate;
2839 memset( ssl->in_ctr, 0, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002840
Paul Bakker07eb38b2012-12-19 14:42:06 +01002841#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
2842 if( ssl_hw_record_activate != NULL)
2843 {
2844 if( ( ret = ssl_hw_record_activate( ssl, SSL_CHANNEL_INBOUND ) ) != 0 )
2845 {
2846 SSL_DEBUG_RET( 1, "ssl_hw_record_activate", ret );
2847 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
2848 }
2849 }
2850#endif
2851
Paul Bakker5121ce52009-01-03 21:22:43 +00002852 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2853 {
2854 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2855 return( ret );
2856 }
2857
2858 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2859 {
2860 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002861 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002862 }
2863
Paul Bakker1ef83d62012-04-11 12:09:53 +00002864 // TODO TLS/1.2 Hash length is determined by cipher suite (Page 63)
Paul Bakker5121ce52009-01-03 21:22:43 +00002865 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
2866
2867 if( ssl->in_msg[0] != SSL_HS_FINISHED ||
2868 ssl->in_hslen != 4 + hash_len )
2869 {
2870 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002871 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002872 }
2873
Paul Bakker5121ce52009-01-03 21:22:43 +00002874 if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
2875 {
2876 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002877 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002878 }
2879
Paul Bakker48916f92012-09-16 19:57:18 +00002880 ssl->verify_data_len = hash_len;
2881 memcpy( ssl->peer_verify_data, buf, hash_len );
2882
Paul Bakker0a597072012-09-25 21:55:46 +00002883 if( ssl->handshake->resume != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002884 {
2885 if( ssl->endpoint == SSL_IS_CLIENT )
2886 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
2887
2888 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker48916f92012-09-16 19:57:18 +00002889 ssl->state = SSL_HANDSHAKE_WRAPUP;
Paul Bakker5121ce52009-01-03 21:22:43 +00002890 }
2891 else
2892 ssl->state++;
2893
2894 SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
2895
2896 return( 0 );
2897}
2898
Paul Bakker48916f92012-09-16 19:57:18 +00002899int ssl_handshake_init( ssl_context *ssl )
2900{
2901 if( ssl->transform_negotiate )
2902 ssl_transform_free( ssl->transform_negotiate );
2903 else
2904 ssl->transform_negotiate = malloc( sizeof(ssl_transform) );
2905
2906 if( ssl->session_negotiate )
2907 ssl_session_free( ssl->session_negotiate );
2908 else
2909 ssl->session_negotiate = malloc( sizeof(ssl_session) );
2910
2911 if( ssl->handshake )
2912 ssl_handshake_free( ssl->handshake );
2913 else
2914 ssl->handshake = malloc( sizeof(ssl_handshake_params) );
2915
2916 if( ssl->handshake == NULL ||
2917 ssl->transform_negotiate == NULL ||
2918 ssl->session_negotiate == NULL )
2919 {
2920 SSL_DEBUG_MSG( 1, ( "malloc() of ssl sub-contexts failed" ) );
2921 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2922 }
2923
2924 memset( ssl->handshake, 0, sizeof(ssl_handshake_params) );
2925 memset( ssl->transform_negotiate, 0, sizeof(ssl_transform) );
2926 memset( ssl->session_negotiate, 0, sizeof(ssl_session) );
2927
2928 md5_starts( &ssl->handshake->fin_md5 );
2929 sha1_starts( &ssl->handshake->fin_sha1 );
2930 sha2_starts( &ssl->handshake->fin_sha2, 0 );
Paul Bakker769075d2012-11-24 11:26:46 +01002931#if defined(POLARSSL_SHA4_C)
Paul Bakker48916f92012-09-16 19:57:18 +00002932 sha4_starts( &ssl->handshake->fin_sha4, 1 );
Paul Bakker769075d2012-11-24 11:26:46 +01002933#endif
Paul Bakker48916f92012-09-16 19:57:18 +00002934
2935 ssl->handshake->update_checksum = ssl_update_checksum_start;
Paul Bakker23f36802012-09-28 14:15:14 +00002936 ssl->handshake->sig_alg = SSL_HASH_SHA1;
2937
Paul Bakker48916f92012-09-16 19:57:18 +00002938 return( 0 );
2939}
2940
Paul Bakker5121ce52009-01-03 21:22:43 +00002941/*
2942 * Initialize an SSL context
2943 */
2944int ssl_init( ssl_context *ssl )
2945{
Paul Bakker48916f92012-09-16 19:57:18 +00002946 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002947 int len = SSL_BUFFER_LEN;
2948
2949 memset( ssl, 0, sizeof( ssl_context ) );
2950
Paul Bakker62f2dee2012-09-28 07:31:51 +00002951 /*
2952 * Sane defaults
2953 */
Paul Bakkereb2c6582012-09-27 19:15:01 +00002954 ssl->rsa_decrypt = ssl_rsa_decrypt;
2955 ssl->rsa_sign = ssl_rsa_sign;
2956 ssl->rsa_key_len = ssl_rsa_key_len;
2957
Paul Bakker1d29fb52012-09-28 13:28:45 +00002958 ssl->min_major_ver = SSL_MAJOR_VERSION_3;
2959 ssl->min_minor_ver = SSL_MINOR_VERSION_0;
2960
Paul Bakker645ce3a2012-10-31 12:32:41 +00002961 ssl->ciphersuites = ssl_default_ciphersuites;
2962
Paul Bakker62f2dee2012-09-28 07:31:51 +00002963#if defined(POLARSSL_DHM_C)
2964 if( ( ret = mpi_read_string( &ssl->dhm_P, 16,
2965 POLARSSL_DHM_RFC5114_MODP_1024_P) ) != 0 ||
2966 ( ret = mpi_read_string( &ssl->dhm_G, 16,
2967 POLARSSL_DHM_RFC5114_MODP_1024_G) ) != 0 )
2968 {
2969 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
2970 return( ret );
2971 }
2972#endif
2973
2974 /*
2975 * Prepare base structures
2976 */
Paul Bakker5121ce52009-01-03 21:22:43 +00002977 ssl->in_ctr = (unsigned char *) malloc( len );
2978 ssl->in_hdr = ssl->in_ctr + 8;
2979 ssl->in_msg = ssl->in_ctr + 13;
2980
2981 if( ssl->in_ctr == NULL )
2982 {
2983 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
Paul Bakker69e095c2011-12-10 21:55:01 +00002984 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002985 }
2986
2987 ssl->out_ctr = (unsigned char *) malloc( len );
2988 ssl->out_hdr = ssl->out_ctr + 8;
Paul Bakker5bd42292012-12-19 14:40:42 +01002989 ssl->out_msg = ssl->out_ctr + 13;
Paul Bakker5121ce52009-01-03 21:22:43 +00002990
2991 if( ssl->out_ctr == NULL )
2992 {
2993 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
2994 free( ssl-> in_ctr );
Paul Bakker69e095c2011-12-10 21:55:01 +00002995 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002996 }
2997
2998 memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
2999 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
3000
3001 ssl->hostname = NULL;
3002 ssl->hostname_len = 0;
3003
Paul Bakker48916f92012-09-16 19:57:18 +00003004 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3005 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00003006
3007 return( 0 );
3008}
3009
3010/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00003011 * Reset an initialized and used SSL context for re-use while retaining
3012 * all application-set variables, function pointers and data.
3013 */
Paul Bakker2770fbd2012-07-03 13:30:23 +00003014int ssl_session_reset( ssl_context *ssl )
Paul Bakker7eb013f2011-10-06 12:37:39 +00003015{
Paul Bakker48916f92012-09-16 19:57:18 +00003016 int ret;
3017
Paul Bakker7eb013f2011-10-06 12:37:39 +00003018 ssl->state = SSL_HELLO_REQUEST;
Paul Bakker48916f92012-09-16 19:57:18 +00003019 ssl->renegotiation = SSL_INITIAL_HANDSHAKE;
3020 ssl->secure_renegotiation = SSL_LEGACY_RENEGOTIATION;
3021
3022 ssl->verify_data_len = 0;
3023 memset( ssl->own_verify_data, 0, 36 );
3024 memset( ssl->peer_verify_data, 0, 36 );
3025
Paul Bakker7eb013f2011-10-06 12:37:39 +00003026 ssl->in_offt = NULL;
3027
3028 ssl->in_msgtype = 0;
3029 ssl->in_msglen = 0;
3030 ssl->in_left = 0;
3031
3032 ssl->in_hslen = 0;
3033 ssl->nb_zero = 0;
3034
3035 ssl->out_msgtype = 0;
3036 ssl->out_msglen = 0;
3037 ssl->out_left = 0;
3038
Paul Bakker48916f92012-09-16 19:57:18 +00003039 ssl->transform_in = NULL;
3040 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003041
3042 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
3043 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
Paul Bakker05ef8352012-05-08 09:17:57 +00003044
3045#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3046 if( ssl_hw_record_reset != NULL)
3047 {
3048 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_reset()" ) );
Paul Bakker07eb38b2012-12-19 14:42:06 +01003049 if( ( ret = ssl_hw_record_reset( ssl ) ) != 0 )
Paul Bakker2770fbd2012-07-03 13:30:23 +00003050 {
3051 SSL_DEBUG_RET( 1, "ssl_hw_record_reset", ret );
3052 return( POLARSSL_ERR_SSL_HW_ACCEL_FAILED );
3053 }
Paul Bakker05ef8352012-05-08 09:17:57 +00003054 }
3055#endif
Paul Bakker2770fbd2012-07-03 13:30:23 +00003056
Paul Bakker48916f92012-09-16 19:57:18 +00003057 if( ssl->transform )
Paul Bakker2770fbd2012-07-03 13:30:23 +00003058 {
Paul Bakker48916f92012-09-16 19:57:18 +00003059 ssl_transform_free( ssl->transform );
3060 free( ssl->transform );
3061 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00003062 }
Paul Bakker48916f92012-09-16 19:57:18 +00003063
Paul Bakkerc0463502013-02-14 11:19:38 +01003064 if( ssl->session )
3065 {
3066 ssl_session_free( ssl->session );
3067 free( ssl->session );
3068 ssl->session = NULL;
3069 }
3070
Paul Bakker48916f92012-09-16 19:57:18 +00003071 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3072 return( ret );
Paul Bakker2770fbd2012-07-03 13:30:23 +00003073
3074 return( 0 );
Paul Bakker7eb013f2011-10-06 12:37:39 +00003075}
3076
3077/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003078 * SSL set accessors
3079 */
3080void ssl_set_endpoint( ssl_context *ssl, int endpoint )
3081{
3082 ssl->endpoint = endpoint;
3083}
3084
3085void ssl_set_authmode( ssl_context *ssl, int authmode )
3086{
3087 ssl->authmode = authmode;
3088}
3089
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003090void ssl_set_verify( ssl_context *ssl,
Paul Bakker915275b2012-09-28 07:10:55 +00003091 int (*f_vrfy)(void *, x509_cert *, int, int *),
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003092 void *p_vrfy )
3093{
3094 ssl->f_vrfy = f_vrfy;
3095 ssl->p_vrfy = p_vrfy;
3096}
3097
Paul Bakker5121ce52009-01-03 21:22:43 +00003098void ssl_set_rng( ssl_context *ssl,
Paul Bakkera3d195c2011-11-27 21:07:34 +00003099 int (*f_rng)(void *, unsigned char *, size_t),
Paul Bakker5121ce52009-01-03 21:22:43 +00003100 void *p_rng )
3101{
3102 ssl->f_rng = f_rng;
3103 ssl->p_rng = p_rng;
3104}
3105
3106void ssl_set_dbg( ssl_context *ssl,
Paul Bakkerff60ee62010-03-16 21:09:09 +00003107 void (*f_dbg)(void *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00003108 void *p_dbg )
3109{
3110 ssl->f_dbg = f_dbg;
3111 ssl->p_dbg = p_dbg;
3112}
3113
3114void ssl_set_bio( ssl_context *ssl,
Paul Bakker23986e52011-04-24 08:57:21 +00003115 int (*f_recv)(void *, unsigned char *, size_t), void *p_recv,
Paul Bakker39bb4182011-06-21 07:36:43 +00003116 int (*f_send)(void *, const unsigned char *, size_t), void *p_send )
Paul Bakker5121ce52009-01-03 21:22:43 +00003117{
3118 ssl->f_recv = f_recv;
3119 ssl->f_send = f_send;
3120 ssl->p_recv = p_recv;
3121 ssl->p_send = p_send;
3122}
3123
Paul Bakker0a597072012-09-25 21:55:46 +00003124void ssl_set_session_cache( ssl_context *ssl,
3125 int (*f_get_cache)(void *, ssl_session *), void *p_get_cache,
3126 int (*f_set_cache)(void *, const ssl_session *), void *p_set_cache )
Paul Bakker5121ce52009-01-03 21:22:43 +00003127{
Paul Bakker0a597072012-09-25 21:55:46 +00003128 ssl->f_get_cache = f_get_cache;
3129 ssl->p_get_cache = p_get_cache;
3130 ssl->f_set_cache = f_set_cache;
3131 ssl->p_set_cache = p_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00003132}
3133
Paul Bakker0a597072012-09-25 21:55:46 +00003134void ssl_set_session( ssl_context *ssl, const ssl_session *session )
Paul Bakker5121ce52009-01-03 21:22:43 +00003135{
Paul Bakker0a597072012-09-25 21:55:46 +00003136 memcpy( ssl->session_negotiate, session, sizeof(ssl_session) );
3137 ssl->handshake->resume = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00003138}
3139
Paul Bakkerb68cad62012-08-23 08:34:18 +00003140void ssl_set_ciphersuites( ssl_context *ssl, const int *ciphersuites )
Paul Bakker5121ce52009-01-03 21:22:43 +00003141{
Paul Bakkere3166ce2011-01-27 17:40:50 +00003142 ssl->ciphersuites = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00003143}
3144
3145void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain,
Paul Bakker57b79142010-03-24 06:51:15 +00003146 x509_crl *ca_crl, const char *peer_cn )
Paul Bakker5121ce52009-01-03 21:22:43 +00003147{
3148 ssl->ca_chain = ca_chain;
Paul Bakker40ea7de2009-05-03 10:18:48 +00003149 ssl->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00003150 ssl->peer_cn = peer_cn;
3151}
3152
3153void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert,
3154 rsa_context *rsa_key )
3155{
3156 ssl->own_cert = own_cert;
3157 ssl->rsa_key = rsa_key;
3158}
3159
Paul Bakkereb2c6582012-09-27 19:15:01 +00003160void ssl_set_own_cert_alt( ssl_context *ssl, x509_cert *own_cert,
3161 void *rsa_key,
3162 rsa_decrypt_func rsa_decrypt,
3163 rsa_sign_func rsa_sign,
3164 rsa_key_len_func rsa_key_len )
Paul Bakker43b7e352011-01-18 15:27:19 +00003165{
3166 ssl->own_cert = own_cert;
Paul Bakkereb2c6582012-09-27 19:15:01 +00003167 ssl->rsa_key = rsa_key;
3168 ssl->rsa_decrypt = rsa_decrypt;
3169 ssl->rsa_sign = rsa_sign;
3170 ssl->rsa_key_len = rsa_key_len;
Paul Bakker43b7e352011-01-18 15:27:19 +00003171}
Paul Bakkereb2c6582012-09-27 19:15:01 +00003172
Paul Bakker43b7e352011-01-18 15:27:19 +00003173
Paul Bakker48916f92012-09-16 19:57:18 +00003174#if defined(POLARSSL_DHM_C)
Paul Bakkerff60ee62010-03-16 21:09:09 +00003175int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00003176{
3177 int ret;
3178
Paul Bakker48916f92012-09-16 19:57:18 +00003179 if( ( ret = mpi_read_string( &ssl->dhm_P, 16, dhm_P ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003180 {
3181 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3182 return( ret );
3183 }
3184
Paul Bakker48916f92012-09-16 19:57:18 +00003185 if( ( ret = mpi_read_string( &ssl->dhm_G, 16, dhm_G ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003186 {
3187 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
3188 return( ret );
3189 }
3190
3191 return( 0 );
3192}
3193
Paul Bakker1b57b062011-01-06 15:48:19 +00003194int ssl_set_dh_param_ctx( ssl_context *ssl, dhm_context *dhm_ctx )
3195{
3196 int ret;
3197
Paul Bakker48916f92012-09-16 19:57:18 +00003198 if( ( ret = mpi_copy(&ssl->dhm_P, &dhm_ctx->P) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003199 {
3200 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3201 return( ret );
3202 }
3203
Paul Bakker48916f92012-09-16 19:57:18 +00003204 if( ( ret = mpi_copy(&ssl->dhm_G, &dhm_ctx->G) ) != 0 )
Paul Bakker1b57b062011-01-06 15:48:19 +00003205 {
3206 SSL_DEBUG_RET( 1, "mpi_copy", ret );
3207 return( ret );
3208 }
3209
3210 return( 0 );
3211}
Paul Bakker48916f92012-09-16 19:57:18 +00003212#endif /* POLARSSL_DHM_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00003213
Paul Bakkerff60ee62010-03-16 21:09:09 +00003214int ssl_set_hostname( ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00003215{
3216 if( hostname == NULL )
Paul Bakker40e46942009-01-03 21:51:57 +00003217 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00003218
3219 ssl->hostname_len = strlen( hostname );
Paul Bakker40ea7de2009-05-03 10:18:48 +00003220 ssl->hostname = (unsigned char *) malloc( ssl->hostname_len + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00003221
Paul Bakkerb15b8512012-01-13 13:44:06 +00003222 if( ssl->hostname == NULL )
3223 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
3224
Paul Bakker5121ce52009-01-03 21:22:43 +00003225 memcpy( ssl->hostname, (unsigned char *) hostname,
3226 ssl->hostname_len );
Paul Bakker40ea7de2009-05-03 10:18:48 +00003227
3228 ssl->hostname[ssl->hostname_len] = '\0';
Paul Bakker5121ce52009-01-03 21:22:43 +00003229
3230 return( 0 );
3231}
3232
Paul Bakker5701cdc2012-09-27 21:49:42 +00003233void ssl_set_sni( ssl_context *ssl,
3234 int (*f_sni)(void *, ssl_context *,
3235 const unsigned char *, size_t),
3236 void *p_sni )
3237{
3238 ssl->f_sni = f_sni;
3239 ssl->p_sni = p_sni;
3240}
3241
Paul Bakker490ecc82011-10-06 13:04:09 +00003242void ssl_set_max_version( ssl_context *ssl, int major, int minor )
3243{
3244 ssl->max_major_ver = major;
3245 ssl->max_minor_ver = minor;
3246}
3247
Paul Bakker1d29fb52012-09-28 13:28:45 +00003248void ssl_set_min_version( ssl_context *ssl, int major, int minor )
3249{
3250 ssl->min_major_ver = major;
3251 ssl->min_minor_ver = minor;
3252}
3253
Paul Bakker48916f92012-09-16 19:57:18 +00003254void ssl_set_renegotiation( ssl_context *ssl, int renegotiation )
3255{
3256 ssl->disable_renegotiation = renegotiation;
3257}
3258
3259void ssl_legacy_renegotiation( ssl_context *ssl, int allow_legacy )
3260{
3261 ssl->allow_legacy_renegotiation = allow_legacy;
3262}
3263
Paul Bakker5121ce52009-01-03 21:22:43 +00003264/*
3265 * SSL get accessors
3266 */
Paul Bakker23986e52011-04-24 08:57:21 +00003267size_t ssl_get_bytes_avail( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003268{
3269 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
3270}
3271
Paul Bakkerff60ee62010-03-16 21:09:09 +00003272int ssl_get_verify_result( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003273{
3274 return( ssl->verify_result );
3275}
3276
Paul Bakkere3166ce2011-01-27 17:40:50 +00003277const char *ssl_get_ciphersuite_name( const int ciphersuite_id )
Paul Bakker5121ce52009-01-03 21:22:43 +00003278{
Paul Bakkere3166ce2011-01-27 17:40:50 +00003279 switch( ciphersuite_id )
Paul Bakker5121ce52009-01-03 21:22:43 +00003280 {
Paul Bakker40e46942009-01-03 21:51:57 +00003281#if defined(POLARSSL_ARC4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003282 case TLS_RSA_WITH_RC4_128_MD5:
3283 return( "TLS-RSA-WITH-RC4-128-MD5" );
Paul Bakker5121ce52009-01-03 21:22:43 +00003284
Paul Bakker645ce3a2012-10-31 12:32:41 +00003285 case TLS_RSA_WITH_RC4_128_SHA:
3286 return( "TLS-RSA-WITH-RC4-128-SHA" );
Paul Bakker5121ce52009-01-03 21:22:43 +00003287#endif
3288
Paul Bakker40e46942009-01-03 21:51:57 +00003289#if defined(POLARSSL_DES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003290 case TLS_RSA_WITH_3DES_EDE_CBC_SHA:
3291 return( "TLS-RSA-WITH-3DES-EDE-CBC-SHA" );
Paul Bakker5121ce52009-01-03 21:22:43 +00003292
Paul Bakker645ce3a2012-10-31 12:32:41 +00003293 case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
3294 return( "TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA" );
Paul Bakker5121ce52009-01-03 21:22:43 +00003295#endif
3296
Paul Bakker40e46942009-01-03 21:51:57 +00003297#if defined(POLARSSL_AES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003298 case TLS_RSA_WITH_AES_128_CBC_SHA:
3299 return( "TLS-RSA-WITH-AES-128-CBC-SHA" );
Paul Bakker5121ce52009-01-03 21:22:43 +00003300
Paul Bakker645ce3a2012-10-31 12:32:41 +00003301 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
3302 return( "TLS-DHE-RSA-WITH-AES-128-CBC-SHA" );
Paul Bakker77a43582010-06-15 21:32:46 +00003303
Paul Bakker645ce3a2012-10-31 12:32:41 +00003304 case TLS_RSA_WITH_AES_256_CBC_SHA:
3305 return( "TLS-RSA-WITH-AES-256-CBC-SHA" );
Paul Bakker5121ce52009-01-03 21:22:43 +00003306
Paul Bakker645ce3a2012-10-31 12:32:41 +00003307 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
3308 return( "TLS-DHE-RSA-WITH-AES-256-CBC-SHA" );
Paul Bakker10cd2252012-04-12 21:26:34 +00003309
3310#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003311 case TLS_RSA_WITH_AES_128_CBC_SHA256:
3312 return( "TLS-RSA-WITH-AES-128-CBC-SHA256" );
Paul Bakker10cd2252012-04-12 21:26:34 +00003313
Paul Bakker645ce3a2012-10-31 12:32:41 +00003314 case TLS_RSA_WITH_AES_256_CBC_SHA256:
3315 return( "TLS-RSA-WITH-AES-256-CBC-SHA256" );
Paul Bakker10cd2252012-04-12 21:26:34 +00003316
Paul Bakker645ce3a2012-10-31 12:32:41 +00003317 case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
3318 return( "TLS-DHE-RSA-WITH-AES-128-CBC-SHA256" );
Paul Bakker10cd2252012-04-12 21:26:34 +00003319
Paul Bakker645ce3a2012-10-31 12:32:41 +00003320 case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
3321 return( "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256" );
Paul Bakker10cd2252012-04-12 21:26:34 +00003322#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00003323
3324#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003325 case TLS_RSA_WITH_AES_128_GCM_SHA256:
3326 return( "TLS-RSA-WITH-AES-128-GCM-SHA256" );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003327
Paul Bakker645ce3a2012-10-31 12:32:41 +00003328 case TLS_RSA_WITH_AES_256_GCM_SHA384:
3329 return( "TLS-RSA-WITH-AES-256-GCM-SHA384" );
Paul Bakker5121ce52009-01-03 21:22:43 +00003330#endif
3331
Paul Bakkerca4ab492012-04-18 14:23:57 +00003332#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003333 case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
3334 return( "TLS-DHE-RSA-WITH-AES-128-GCM-SHA256" );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003335
Paul Bakker645ce3a2012-10-31 12:32:41 +00003336 case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
3337 return( "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384" );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003338#endif
3339#endif /* POLARSSL_AES_C */
3340
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00003341#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003342 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
3343 return( "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA" );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00003344
Paul Bakker645ce3a2012-10-31 12:32:41 +00003345 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
3346 return( "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA" );
Paul Bakker77a43582010-06-15 21:32:46 +00003347
Paul Bakker645ce3a2012-10-31 12:32:41 +00003348 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
3349 return( "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA" );
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00003350
Paul Bakker645ce3a2012-10-31 12:32:41 +00003351 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
3352 return( "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA" );
Paul Bakker10cd2252012-04-12 21:26:34 +00003353
3354#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003355 case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
3356 return( "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256" );
Paul Bakker10cd2252012-04-12 21:26:34 +00003357
Paul Bakker645ce3a2012-10-31 12:32:41 +00003358 case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
3359 return( "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256" );
Paul Bakker10cd2252012-04-12 21:26:34 +00003360
Paul Bakker645ce3a2012-10-31 12:32:41 +00003361 case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
3362 return( "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256" );
Paul Bakker10cd2252012-04-12 21:26:34 +00003363
Paul Bakker645ce3a2012-10-31 12:32:41 +00003364 case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
3365 return( "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256" );
Paul Bakker10cd2252012-04-12 21:26:34 +00003366#endif
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00003367#endif
3368
Paul Bakkerfab5c822012-02-06 16:45:10 +00003369#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
3370#if defined(POLARSSL_CIPHER_NULL_CIPHER)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003371 case TLS_RSA_WITH_NULL_MD5:
3372 return( "TLS-RSA-WITH-NULL-MD5" );
3373 case TLS_RSA_WITH_NULL_SHA:
3374 return( "TLS-RSA-WITH-NULL-SHA" );
3375 case TLS_RSA_WITH_NULL_SHA256:
3376 return( "TLS-RSA-WITH-NULL-SHA256" );
Paul Bakkerfab5c822012-02-06 16:45:10 +00003377#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
3378
3379#if defined(POLARSSL_DES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003380 case TLS_RSA_WITH_DES_CBC_SHA:
3381 return( "TLS-RSA-WITH-DES-CBC-SHA" );
3382 case TLS_DHE_RSA_WITH_DES_CBC_SHA:
3383 return( "TLS-DHE-RSA-WITH-DES-CBC-SHA" );
Paul Bakkerfab5c822012-02-06 16:45:10 +00003384#endif
3385#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */
3386
Paul Bakker5121ce52009-01-03 21:22:43 +00003387 default:
3388 break;
3389 }
3390
3391 return( "unknown" );
3392}
3393
Paul Bakkere3166ce2011-01-27 17:40:50 +00003394int ssl_get_ciphersuite_id( const char *ciphersuite_name )
Paul Bakker72f62662011-01-16 21:27:44 +00003395{
3396#if defined(POLARSSL_ARC4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003397 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-RC4-128-MD5"))
3398 return( TLS_RSA_WITH_RC4_128_MD5 );
3399 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-RC4-128-SHA"))
3400 return( TLS_RSA_WITH_RC4_128_SHA );
Paul Bakker72f62662011-01-16 21:27:44 +00003401#endif
3402
3403#if defined(POLARSSL_DES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003404 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-3DES-EDE-CBC-SHA"))
3405 return( TLS_RSA_WITH_3DES_EDE_CBC_SHA );
3406 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA"))
3407 return( TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA );
Paul Bakker72f62662011-01-16 21:27:44 +00003408#endif
3409
3410#if defined(POLARSSL_AES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003411 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-128-CBC-SHA"))
3412 return( TLS_RSA_WITH_AES_128_CBC_SHA );
3413 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA"))
3414 return( TLS_DHE_RSA_WITH_AES_128_CBC_SHA );
3415 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-256-CBC-SHA"))
3416 return( TLS_RSA_WITH_AES_256_CBC_SHA );
3417 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA"))
3418 return( TLS_DHE_RSA_WITH_AES_256_CBC_SHA );
Paul Bakker10cd2252012-04-12 21:26:34 +00003419
3420#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003421 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-128-CBC-SHA256"))
3422 return( TLS_RSA_WITH_AES_128_CBC_SHA256 );
3423 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-256-CBC-SHA256"))
3424 return( TLS_RSA_WITH_AES_256_CBC_SHA256 );
3425 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA256"))
3426 return( TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 );
3427 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256"))
3428 return( TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 );
Paul Bakker10cd2252012-04-12 21:26:34 +00003429#endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00003430
3431#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003432 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-128-GCM-SHA256"))
3433 return( TLS_RSA_WITH_AES_128_GCM_SHA256 );
3434 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-AES-256-GCM-SHA384"))
3435 return( TLS_RSA_WITH_AES_256_GCM_SHA384 );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003436#endif
3437
3438#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003439 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-128-GCM-SHA256"))
3440 return( TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 );
3441 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384"))
3442 return( TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 );
Paul Bakkerca4ab492012-04-18 14:23:57 +00003443#endif
Paul Bakker72f62662011-01-16 21:27:44 +00003444#endif
3445
3446#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003447 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA"))
3448 return( TLS_RSA_WITH_CAMELLIA_128_CBC_SHA );
3449 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA"))
3450 return( TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA );
3451 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA"))
3452 return( TLS_RSA_WITH_CAMELLIA_256_CBC_SHA );
3453 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA"))
3454 return( TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA );
Paul Bakker10cd2252012-04-12 21:26:34 +00003455
3456#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003457 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256"))
3458 return( TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 );
3459 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256"))
3460 return( TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 );
3461 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256"))
3462 return( TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 );
3463 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256"))
3464 return( TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 );
Paul Bakker10cd2252012-04-12 21:26:34 +00003465#endif
Paul Bakker72f62662011-01-16 21:27:44 +00003466#endif
3467
Paul Bakkerfab5c822012-02-06 16:45:10 +00003468#if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
3469#if defined(POLARSSL_CIPHER_NULL_CIPHER)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003470 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-NULL-MD5"))
3471 return( TLS_RSA_WITH_NULL_MD5 );
3472 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-NULL-SHA"))
3473 return( TLS_RSA_WITH_NULL_SHA );
3474 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-NULL-SHA256"))
3475 return( TLS_RSA_WITH_NULL_SHA256 );
Paul Bakkerfab5c822012-02-06 16:45:10 +00003476#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
3477
3478#if defined(POLARSSL_DES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003479 if (0 == strcasecmp(ciphersuite_name, "TLS-RSA-WITH-DES-CBC-SHA"))
3480 return( TLS_RSA_WITH_DES_CBC_SHA );
3481 if (0 == strcasecmp(ciphersuite_name, "TLS-DHE-RSA-WITH-DES-CBC-SHA"))
3482 return( TLS_DHE_RSA_WITH_DES_CBC_SHA );
Paul Bakkerfab5c822012-02-06 16:45:10 +00003483#endif
3484#endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */
3485
Paul Bakker72f62662011-01-16 21:27:44 +00003486 return( 0 );
3487}
3488
Paul Bakkere3166ce2011-01-27 17:40:50 +00003489const char *ssl_get_ciphersuite( const ssl_context *ssl )
Paul Bakker72f62662011-01-16 21:27:44 +00003490{
Paul Bakker926c8e42013-03-06 10:23:34 +01003491 if( ssl == NULL || ssl->session == NULL )
3492 return NULL;
3493
Paul Bakkere3166ce2011-01-27 17:40:50 +00003494 return ssl_get_ciphersuite_name( ssl->session->ciphersuite );
Paul Bakker72f62662011-01-16 21:27:44 +00003495}
3496
Paul Bakker43ca69c2011-01-15 17:35:19 +00003497const char *ssl_get_version( const ssl_context *ssl )
3498{
3499 switch( ssl->minor_ver )
3500 {
3501 case SSL_MINOR_VERSION_0:
3502 return( "SSLv3.0" );
3503
3504 case SSL_MINOR_VERSION_1:
3505 return( "TLSv1.0" );
3506
3507 case SSL_MINOR_VERSION_2:
3508 return( "TLSv1.1" );
3509
Paul Bakker1ef83d62012-04-11 12:09:53 +00003510 case SSL_MINOR_VERSION_3:
3511 return( "TLSv1.2" );
3512
Paul Bakker43ca69c2011-01-15 17:35:19 +00003513 default:
3514 break;
3515 }
3516 return( "unknown" );
3517}
3518
Paul Bakkerb0550d92012-10-30 07:51:03 +00003519const x509_cert *ssl_get_peer_cert( const ssl_context *ssl )
3520{
3521 if( ssl == NULL || ssl->session == NULL )
3522 return NULL;
3523
3524 return ssl->session->peer_cert;
3525}
3526
Paul Bakkerb68cad62012-08-23 08:34:18 +00003527const int ssl_default_ciphersuites[] =
Paul Bakker5121ce52009-01-03 21:22:43 +00003528{
Paul Bakker40e46942009-01-03 21:51:57 +00003529#if defined(POLARSSL_DHM_C)
3530#if defined(POLARSSL_AES_C)
Paul Bakker10cd2252012-04-12 21:26:34 +00003531#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003532 TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
Paul Bakker10cd2252012-04-12 21:26:34 +00003533#endif /* POLARSSL_SHA2_C */
Paul Bakkerca4ab492012-04-18 14:23:57 +00003534#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003535 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
Paul Bakkerca4ab492012-04-18 14:23:57 +00003536#endif
Paul Bakker645ce3a2012-10-31 12:32:41 +00003537 TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
Paul Bakkerca4ab492012-04-18 14:23:57 +00003538#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003539 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
Paul Bakkerca4ab492012-04-18 14:23:57 +00003540#endif
3541#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003542 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
Paul Bakkerca4ab492012-04-18 14:23:57 +00003543#endif
Paul Bakker645ce3a2012-10-31 12:32:41 +00003544 TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
Paul Bakker5121ce52009-01-03 21:22:43 +00003545#endif
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00003546#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker10cd2252012-04-12 21:26:34 +00003547#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003548 TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,
Paul Bakker10cd2252012-04-12 21:26:34 +00003549#endif /* POLARSSL_SHA2_C */
Paul Bakker645ce3a2012-10-31 12:32:41 +00003550 TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,
Paul Bakkerca4ab492012-04-18 14:23:57 +00003551#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003552 TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
Paul Bakkerca4ab492012-04-18 14:23:57 +00003553#endif /* POLARSSL_SHA2_C */
Paul Bakker645ce3a2012-10-31 12:32:41 +00003554 TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00003555#endif
Paul Bakker40e46942009-01-03 21:51:57 +00003556#if defined(POLARSSL_DES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003557 TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
Paul Bakker5121ce52009-01-03 21:22:43 +00003558#endif
3559#endif
3560
Paul Bakker40e46942009-01-03 21:51:57 +00003561#if defined(POLARSSL_AES_C)
Paul Bakker10cd2252012-04-12 21:26:34 +00003562#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003563 TLS_RSA_WITH_AES_256_CBC_SHA256,
Paul Bakker10cd2252012-04-12 21:26:34 +00003564#endif /* POLARSSL_SHA2_C */
Paul Bakkerca4ab492012-04-18 14:23:57 +00003565#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003566 TLS_RSA_WITH_AES_256_GCM_SHA384,
Paul Bakkerca4ab492012-04-18 14:23:57 +00003567#endif /* POLARSSL_SHA2_C */
Paul Bakker645ce3a2012-10-31 12:32:41 +00003568 TLS_RSA_WITH_AES_256_CBC_SHA,
Paul Bakker5121ce52009-01-03 21:22:43 +00003569#endif
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00003570#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker10cd2252012-04-12 21:26:34 +00003571#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003572 TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,
Paul Bakker10cd2252012-04-12 21:26:34 +00003573#endif /* POLARSSL_SHA2_C */
Paul Bakker645ce3a2012-10-31 12:32:41 +00003574 TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00003575#endif
Paul Bakkeref75f252009-03-28 18:43:23 +00003576#if defined(POLARSSL_AES_C)
Paul Bakker10cd2252012-04-12 21:26:34 +00003577#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003578 TLS_RSA_WITH_AES_128_CBC_SHA256,
Paul Bakker10cd2252012-04-12 21:26:34 +00003579#endif /* POLARSSL_SHA2_C */
Paul Bakkerca4ab492012-04-18 14:23:57 +00003580#if defined(POLARSSL_GCM_C) && defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003581 TLS_RSA_WITH_AES_128_GCM_SHA256,
Paul Bakkerca4ab492012-04-18 14:23:57 +00003582#endif /* POLARSSL_SHA2_C */
Paul Bakker645ce3a2012-10-31 12:32:41 +00003583 TLS_RSA_WITH_AES_128_CBC_SHA,
Paul Bakkeref75f252009-03-28 18:43:23 +00003584#endif
3585#if defined(POLARSSL_CAMELLIA_C)
Paul Bakker10cd2252012-04-12 21:26:34 +00003586#if defined(POLARSSL_SHA2_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003587 TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,
Paul Bakker10cd2252012-04-12 21:26:34 +00003588#endif /* POLARSSL_SHA2_C */
Paul Bakker645ce3a2012-10-31 12:32:41 +00003589 TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,
Paul Bakkeref75f252009-03-28 18:43:23 +00003590#endif
Paul Bakker40e46942009-01-03 21:51:57 +00003591#if defined(POLARSSL_DES_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003592 TLS_RSA_WITH_3DES_EDE_CBC_SHA,
Paul Bakker5121ce52009-01-03 21:22:43 +00003593#endif
Paul Bakker40e46942009-01-03 21:51:57 +00003594#if defined(POLARSSL_ARC4_C)
Paul Bakker645ce3a2012-10-31 12:32:41 +00003595 TLS_RSA_WITH_RC4_128_SHA,
3596 TLS_RSA_WITH_RC4_128_MD5,
Paul Bakker5121ce52009-01-03 21:22:43 +00003597#endif
3598 0
3599};
3600
3601/*
Paul Bakker1961b702013-01-25 14:49:24 +01003602 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00003603 */
Paul Bakker1961b702013-01-25 14:49:24 +01003604int ssl_handshake_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00003605{
Paul Bakker40e46942009-01-03 21:51:57 +00003606 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003607
Paul Bakker40e46942009-01-03 21:51:57 +00003608#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003609 if( ssl->endpoint == SSL_IS_CLIENT )
Paul Bakker1961b702013-01-25 14:49:24 +01003610 ret = ssl_handshake_client_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003611#endif
3612
Paul Bakker40e46942009-01-03 21:51:57 +00003613#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00003614 if( ssl->endpoint == SSL_IS_SERVER )
Paul Bakker1961b702013-01-25 14:49:24 +01003615 ret = ssl_handshake_server_step( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00003616#endif
3617
Paul Bakker1961b702013-01-25 14:49:24 +01003618 return( ret );
3619}
3620
3621/*
3622 * Perform the SSL handshake
3623 */
3624int ssl_handshake( ssl_context *ssl )
3625{
3626 int ret = 0;
3627
3628 SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
3629
3630 while( ssl->state != SSL_HANDSHAKE_OVER )
3631 {
3632 ret = ssl_handshake_step( ssl );
3633
3634 if( ret != 0 )
3635 break;
3636 }
3637
Paul Bakker5121ce52009-01-03 21:22:43 +00003638 SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
3639
3640 return( ret );
3641}
3642
3643/*
Paul Bakker48916f92012-09-16 19:57:18 +00003644 * Renegotiate current connection
3645 */
3646int ssl_renegotiate( ssl_context *ssl )
3647{
3648 int ret;
3649
3650 SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) );
3651
3652 if( ssl->state != SSL_HANDSHAKE_OVER )
3653 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
3654
3655 ssl->state = SSL_HELLO_REQUEST;
3656 ssl->renegotiation = SSL_RENEGOTIATION;
3657
3658 if( ( ret = ssl_handshake_init( ssl ) ) != 0 )
3659 return( ret );
3660
3661 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3662 {
3663 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3664 return( ret );
3665 }
3666
3667 SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) );
3668
3669 return( 0 );
3670}
3671
3672/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003673 * Receive application data decrypted from the SSL layer
3674 */
Paul Bakker23986e52011-04-24 08:57:21 +00003675int ssl_read( ssl_context *ssl, unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003676{
Paul Bakker23986e52011-04-24 08:57:21 +00003677 int ret;
3678 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003679
3680 SSL_DEBUG_MSG( 2, ( "=> read" ) );
3681
3682 if( ssl->state != SSL_HANDSHAKE_OVER )
3683 {
3684 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3685 {
3686 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3687 return( ret );
3688 }
3689 }
3690
3691 if( ssl->in_offt == NULL )
3692 {
3693 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3694 {
Paul Bakker831a7552011-05-18 13:32:51 +00003695 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3696 return( 0 );
3697
Paul Bakker5121ce52009-01-03 21:22:43 +00003698 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3699 return( ret );
3700 }
3701
3702 if( ssl->in_msglen == 0 &&
3703 ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
3704 {
3705 /*
3706 * OpenSSL sends empty messages to randomize the IV
3707 */
3708 if( ( ret = ssl_read_record( ssl ) ) != 0 )
3709 {
Paul Bakker831a7552011-05-18 13:32:51 +00003710 if( ret == POLARSSL_ERR_SSL_CONN_EOF )
3711 return( 0 );
3712
Paul Bakker5121ce52009-01-03 21:22:43 +00003713 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
3714 return( ret );
3715 }
3716 }
3717
Paul Bakker48916f92012-09-16 19:57:18 +00003718 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
3719 {
3720 SSL_DEBUG_MSG( 1, ( "received handshake message" ) );
3721
3722 if( ssl->endpoint == SSL_IS_CLIENT &&
3723 ( ssl->in_msg[0] != SSL_HS_HELLO_REQUEST ||
3724 ssl->in_hslen != 4 ) )
3725 {
3726 SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) );
3727 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
3728 }
3729
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003730 if( ssl->disable_renegotiation == SSL_RENEGOTIATION_DISABLED ||
3731 ( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
3732 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION ) )
Paul Bakker48916f92012-09-16 19:57:18 +00003733 {
3734 SSL_DEBUG_MSG( 3, ( "ignoring renegotiation, sending alert" ) );
3735
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003736 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
Paul Bakker48916f92012-09-16 19:57:18 +00003737 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00003738 /*
3739 * SSLv3 does not have a "no_renegotiation" alert
3740 */
3741 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
3742 return( ret );
3743 }
3744 else
3745 {
3746 if( ( ret = ssl_send_alert_message( ssl,
3747 SSL_ALERT_LEVEL_WARNING,
3748 SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )
3749 {
3750 return( ret );
3751 }
Paul Bakker48916f92012-09-16 19:57:18 +00003752 }
3753 }
3754 else
3755 {
3756 if( ( ret = ssl_renegotiate( ssl ) ) != 0 )
3757 {
3758 SSL_DEBUG_RET( 1, "ssl_renegotiate", ret );
3759 return( ret );
3760 }
3761
3762 return( POLARSSL_ERR_NET_WANT_READ );
3763 }
3764 }
3765 else if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
Paul Bakker5121ce52009-01-03 21:22:43 +00003766 {
3767 SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00003768 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00003769 }
3770
3771 ssl->in_offt = ssl->in_msg;
3772 }
3773
3774 n = ( len < ssl->in_msglen )
3775 ? len : ssl->in_msglen;
3776
3777 memcpy( buf, ssl->in_offt, n );
3778 ssl->in_msglen -= n;
3779
3780 if( ssl->in_msglen == 0 )
3781 /* all bytes consumed */
3782 ssl->in_offt = NULL;
3783 else
3784 /* more data available */
3785 ssl->in_offt += n;
3786
3787 SSL_DEBUG_MSG( 2, ( "<= read" ) );
3788
Paul Bakker23986e52011-04-24 08:57:21 +00003789 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003790}
3791
3792/*
3793 * Send application data to be encrypted by the SSL layer
3794 */
Paul Bakker23986e52011-04-24 08:57:21 +00003795int ssl_write( ssl_context *ssl, const unsigned char *buf, size_t len )
Paul Bakker5121ce52009-01-03 21:22:43 +00003796{
Paul Bakker23986e52011-04-24 08:57:21 +00003797 int ret;
3798 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +00003799
3800 SSL_DEBUG_MSG( 2, ( "=> write" ) );
3801
3802 if( ssl->state != SSL_HANDSHAKE_OVER )
3803 {
3804 if( ( ret = ssl_handshake( ssl ) ) != 0 )
3805 {
3806 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
3807 return( ret );
3808 }
3809 }
3810
Paul Bakker887bd502011-06-08 13:10:54 +00003811 n = ( len < SSL_MAX_CONTENT_LEN )
3812 ? len : SSL_MAX_CONTENT_LEN;
3813
Paul Bakker5121ce52009-01-03 21:22:43 +00003814 if( ssl->out_left != 0 )
3815 {
3816 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3817 {
3818 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3819 return( ret );
3820 }
3821 }
Paul Bakker887bd502011-06-08 13:10:54 +00003822 else
Paul Bakker1fd00bf2011-03-14 20:50:15 +00003823 {
Paul Bakker887bd502011-06-08 13:10:54 +00003824 ssl->out_msglen = n;
3825 ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
3826 memcpy( ssl->out_msg, buf, n );
3827
3828 if( ( ret = ssl_write_record( ssl ) ) != 0 )
3829 {
3830 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
3831 return( ret );
3832 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003833 }
3834
3835 SSL_DEBUG_MSG( 2, ( "<= write" ) );
3836
Paul Bakker23986e52011-04-24 08:57:21 +00003837 return( (int) n );
Paul Bakker5121ce52009-01-03 21:22:43 +00003838}
3839
3840/*
3841 * Notify the peer that the connection is being closed
3842 */
3843int ssl_close_notify( ssl_context *ssl )
3844{
3845 int ret;
3846
3847 SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
3848
3849 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
3850 {
3851 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
3852 return( ret );
3853 }
3854
3855 if( ssl->state == SSL_HANDSHAKE_OVER )
3856 {
Paul Bakker48916f92012-09-16 19:57:18 +00003857 if( ( ret = ssl_send_alert_message( ssl,
3858 SSL_ALERT_LEVEL_WARNING,
3859 SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00003860 {
Paul Bakker5121ce52009-01-03 21:22:43 +00003861 return( ret );
3862 }
3863 }
3864
3865 SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
3866
3867 return( ret );
3868}
3869
Paul Bakker48916f92012-09-16 19:57:18 +00003870void ssl_transform_free( ssl_transform *transform )
3871{
3872#if defined(POLARSSL_ZLIB_SUPPORT)
3873 deflateEnd( &transform->ctx_deflate );
3874 inflateEnd( &transform->ctx_inflate );
3875#endif
3876
3877 memset( transform, 0, sizeof( ssl_transform ) );
3878}
3879
3880void ssl_handshake_free( ssl_handshake_params *handshake )
3881{
3882#if defined(POLARSSL_DHM_C)
3883 dhm_free( &handshake->dhm_ctx );
3884#endif
3885 memset( handshake, 0, sizeof( ssl_handshake_params ) );
3886}
3887
3888void ssl_session_free( ssl_session *session )
3889{
Paul Bakker0a597072012-09-25 21:55:46 +00003890 if( session->peer_cert != NULL )
Paul Bakker48916f92012-09-16 19:57:18 +00003891 {
Paul Bakker0a597072012-09-25 21:55:46 +00003892 x509_free( session->peer_cert );
3893 free( session->peer_cert );
Paul Bakker48916f92012-09-16 19:57:18 +00003894 }
Paul Bakker0a597072012-09-25 21:55:46 +00003895
3896 memset( session, 0, sizeof( ssl_session ) );
Paul Bakker48916f92012-09-16 19:57:18 +00003897}
3898
Paul Bakker5121ce52009-01-03 21:22:43 +00003899/*
3900 * Free an SSL context
3901 */
3902void ssl_free( ssl_context *ssl )
3903{
3904 SSL_DEBUG_MSG( 2, ( "=> free" ) );
3905
Paul Bakker5121ce52009-01-03 21:22:43 +00003906 if( ssl->out_ctr != NULL )
3907 {
3908 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
3909 free( ssl->out_ctr );
3910 }
3911
3912 if( ssl->in_ctr != NULL )
3913 {
3914 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
3915 free( ssl->in_ctr );
3916 }
3917
Paul Bakker40e46942009-01-03 21:51:57 +00003918#if defined(POLARSSL_DHM_C)
Paul Bakker48916f92012-09-16 19:57:18 +00003919 mpi_free( &ssl->dhm_P );
3920 mpi_free( &ssl->dhm_G );
Paul Bakker5121ce52009-01-03 21:22:43 +00003921#endif
3922
Paul Bakker48916f92012-09-16 19:57:18 +00003923 if( ssl->transform )
3924 {
3925 ssl_transform_free( ssl->transform );
3926 free( ssl->transform );
3927 }
3928
3929 if( ssl->handshake )
3930 {
3931 ssl_handshake_free( ssl->handshake );
3932 ssl_transform_free( ssl->transform_negotiate );
3933 ssl_session_free( ssl->session_negotiate );
3934
3935 free( ssl->handshake );
3936 free( ssl->transform_negotiate );
3937 free( ssl->session_negotiate );
3938 }
3939
Paul Bakkerc0463502013-02-14 11:19:38 +01003940 if( ssl->session )
3941 {
3942 ssl_session_free( ssl->session );
3943 free( ssl->session );
3944 }
3945
Paul Bakker5121ce52009-01-03 21:22:43 +00003946 if ( ssl->hostname != NULL)
3947 {
3948 memset( ssl->hostname, 0, ssl->hostname_len );
3949 free( ssl->hostname );
3950 ssl->hostname_len = 0;
3951 }
3952
Paul Bakker05ef8352012-05-08 09:17:57 +00003953#if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
3954 if( ssl_hw_record_finish != NULL )
3955 {
3956 SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_finish()" ) );
3957 ssl_hw_record_finish( ssl );
3958 }
3959#endif
3960
Paul Bakker5121ce52009-01-03 21:22:43 +00003961 SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00003962
Paul Bakker86f04f42013-02-14 11:20:09 +01003963 /* Actually clear after last debug message */
Paul Bakker2da561c2009-02-05 18:00:28 +00003964 memset( ssl, 0, sizeof( ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00003965}
3966
3967#endif