blob: 733551307c97ac4804c71348244882a3a9ee7e44 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 shared functions
3 *
Paul Bakker77b385e2009-07-28 17:23:11 +00004 * Copyright (C) 2006-2009, Paul Bakker <polarssl_maintainer at polarssl.org>
5 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +00006 *
Paul Bakker77b385e2009-07-28 17:23:11 +00007 * Joined copyright on original XySSL code with: Christophe Devine
Paul Bakker5121ce52009-01-03 21:22:43 +00008 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 */
23/*
24 * The SSL 3.0 specification was drafted by Netscape in 1996,
25 * and became an IETF standard in 1999.
26 *
27 * http://wp.netscape.com/eng/ssl3/
28 * http://www.ietf.org/rfc/rfc2246.txt
29 * http://www.ietf.org/rfc/rfc4346.txt
30 */
31
Paul Bakker40e46942009-01-03 21:51:57 +000032#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Paul Bakker40e46942009-01-03 21:51:57 +000034#if defined(POLARSSL_SSL_TLS_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakker40e46942009-01-03 21:51:57 +000036#include "polarssl/aes.h"
37#include "polarssl/arc4.h"
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +000038#include "polarssl/camellia.h"
Paul Bakker40e46942009-01-03 21:51:57 +000039#include "polarssl/des.h"
40#include "polarssl/debug.h"
41#include "polarssl/ssl.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000042
43#include <string.h>
44#include <stdlib.h>
45#include <time.h>
46
47/*
48 * Key material generation
49 */
50static int tls1_prf( unsigned char *secret, int slen, char *label,
51 unsigned char *random, int rlen,
52 unsigned char *dstbuf, int dlen )
53{
54 int nb, hs;
55 int i, j, k;
56 unsigned char *S1, *S2;
57 unsigned char tmp[128];
58 unsigned char h_i[20];
59
60 if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
Paul Bakker40e46942009-01-03 21:51:57 +000061 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +000062
63 hs = ( slen + 1 ) / 2;
64 S1 = secret;
65 S2 = secret + slen - hs;
66
67 nb = strlen( label );
68 memcpy( tmp + 20, label, nb );
69 memcpy( tmp + 20 + nb, random, rlen );
70 nb += rlen;
71
72 /*
73 * First compute P_md5(secret,label+random)[0..dlen]
74 */
75 md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
76
77 for( i = 0; i < dlen; i += 16 )
78 {
79 md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
80 md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp );
81
82 k = ( i + 16 > dlen ) ? dlen % 16 : 16;
83
84 for( j = 0; j < k; j++ )
85 dstbuf[i + j] = h_i[j];
86 }
87
88 /*
89 * XOR out with P_sha1(secret,label+random)[0..dlen]
90 */
91 sha1_hmac( S2, hs, tmp + 20, nb, tmp );
92
93 for( i = 0; i < dlen; i += 20 )
94 {
95 sha1_hmac( S2, hs, tmp, 20 + nb, h_i );
96 sha1_hmac( S2, hs, tmp, 20, tmp );
97
98 k = ( i + 20 > dlen ) ? dlen % 20 : 20;
99
100 for( j = 0; j < k; j++ )
101 dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
102 }
103
104 memset( tmp, 0, sizeof( tmp ) );
105 memset( h_i, 0, sizeof( h_i ) );
106
107 return( 0 );
108}
109
110int ssl_derive_keys( ssl_context *ssl )
111{
112 int i;
113 md5_context md5;
114 sha1_context sha1;
115 unsigned char tmp[64];
116 unsigned char padding[16];
117 unsigned char sha1sum[20];
118 unsigned char keyblk[256];
119 unsigned char *key1;
120 unsigned char *key2;
121
122 SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
123
124 /*
125 * SSLv3:
126 * master =
127 * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
128 * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
129 * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
130 *
131 * TLSv1:
132 * master = PRF( premaster, "master secret", randbytes )[0..47]
133 */
134 if( ssl->resume == 0 )
135 {
136 int len = ssl->pmslen;
137
138 SSL_DEBUG_BUF( 3, "premaster secret", ssl->premaster, len );
139
140 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
141 {
142 for( i = 0; i < 3; i++ )
143 {
144 memset( padding, 'A' + i, 1 + i );
145
146 sha1_starts( &sha1 );
147 sha1_update( &sha1, padding, 1 + i );
148 sha1_update( &sha1, ssl->premaster, len );
149 sha1_update( &sha1, ssl->randbytes, 64 );
150 sha1_finish( &sha1, sha1sum );
151
152 md5_starts( &md5 );
153 md5_update( &md5, ssl->premaster, len );
154 md5_update( &md5, sha1sum, 20 );
155 md5_finish( &md5, ssl->session->master + i * 16 );
156 }
157 }
158 else
159 tls1_prf( ssl->premaster, len, "master secret",
160 ssl->randbytes, 64, ssl->session->master, 48 );
161
162 memset( ssl->premaster, 0, sizeof( ssl->premaster ) );
163 }
164 else
165 SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
166
167 /*
168 * Swap the client and server random values.
169 */
170 memcpy( tmp, ssl->randbytes, 64 );
171 memcpy( ssl->randbytes, tmp + 32, 32 );
172 memcpy( ssl->randbytes + 32, tmp, 32 );
173 memset( tmp, 0, sizeof( tmp ) );
174
175 /*
176 * SSLv3:
177 * key block =
178 * MD5( master + SHA1( 'A' + master + randbytes ) ) +
179 * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
180 * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
181 * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
182 * ...
183 *
184 * TLSv1:
185 * key block = PRF( master, "key expansion", randbytes )
186 */
187 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
188 {
189 for( i = 0; i < 16; i++ )
190 {
191 memset( padding, 'A' + i, 1 + i );
192
193 sha1_starts( &sha1 );
194 sha1_update( &sha1, padding, 1 + i );
195 sha1_update( &sha1, ssl->session->master, 48 );
196 sha1_update( &sha1, ssl->randbytes, 64 );
197 sha1_finish( &sha1, sha1sum );
198
199 md5_starts( &md5 );
200 md5_update( &md5, ssl->session->master, 48 );
201 md5_update( &md5, sha1sum, 20 );
202 md5_finish( &md5, keyblk + i * 16 );
203 }
204
205 memset( &md5, 0, sizeof( md5 ) );
206 memset( &sha1, 0, sizeof( sha1 ) );
207
208 memset( padding, 0, sizeof( padding ) );
209 memset( sha1sum, 0, sizeof( sha1sum ) );
210 }
211 else
212 tls1_prf( ssl->session->master, 48, "key expansion",
213 ssl->randbytes, 64, keyblk, 256 );
214
215 SSL_DEBUG_MSG( 3, ( "cipher = %s", ssl_get_cipher( ssl ) ) );
216 SSL_DEBUG_BUF( 3, "master secret", ssl->session->master, 48 );
217 SSL_DEBUG_BUF( 4, "random bytes", ssl->randbytes, 64 );
218 SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
219
220 memset( ssl->randbytes, 0, sizeof( ssl->randbytes ) );
221
222 /*
223 * Determine the appropriate key, IV and MAC length.
224 */
225 switch( ssl->session->cipher )
226 {
Paul Bakker40e46942009-01-03 21:51:57 +0000227#if defined(POLARSSL_ARC4_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000228 case SSL_RSA_RC4_128_MD5:
229 ssl->keylen = 16; ssl->minlen = 16;
230 ssl->ivlen = 0; ssl->maclen = 16;
231 break;
232
233 case SSL_RSA_RC4_128_SHA:
234 ssl->keylen = 16; ssl->minlen = 20;
235 ssl->ivlen = 0; ssl->maclen = 20;
236 break;
237#endif
238
Paul Bakker40e46942009-01-03 21:51:57 +0000239#if defined(POLARSSL_DES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000240 case SSL_RSA_DES_168_SHA:
241 case SSL_EDH_RSA_DES_168_SHA:
242 ssl->keylen = 24; ssl->minlen = 24;
243 ssl->ivlen = 8; ssl->maclen = 20;
244 break;
245#endif
246
Paul Bakker40e46942009-01-03 21:51:57 +0000247#if defined(POLARSSL_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000248 case SSL_RSA_AES_128_SHA:
249 ssl->keylen = 16; ssl->minlen = 32;
250 ssl->ivlen = 16; ssl->maclen = 20;
251 break;
252
253 case SSL_RSA_AES_256_SHA:
254 case SSL_EDH_RSA_AES_256_SHA:
255 ssl->keylen = 32; ssl->minlen = 32;
256 ssl->ivlen = 16; ssl->maclen = 20;
257 break;
258#endif
259
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000260#if defined(POLARSSL_CAMELLIA_C)
261 case SSL_RSA_CAMELLIA_128_SHA:
262 ssl->keylen = 16; ssl->minlen = 32;
263 ssl->ivlen = 16; ssl->maclen = 20;
264 break;
265
266 case SSL_RSA_CAMELLIA_256_SHA:
267 case SSL_EDH_RSA_CAMELLIA_256_SHA:
268 ssl->keylen = 32; ssl->minlen = 32;
269 ssl->ivlen = 16; ssl->maclen = 20;
270 break;
271#endif
272
Paul Bakker5121ce52009-01-03 21:22:43 +0000273 default:
274 SSL_DEBUG_MSG( 1, ( "cipher %s is not available",
275 ssl_get_cipher( ssl ) ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000276 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000277 }
278
279 SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
280 ssl->keylen, ssl->minlen, ssl->ivlen, ssl->maclen ) );
281
282 /*
283 * Finally setup the cipher contexts, IVs and MAC secrets.
284 */
285 if( ssl->endpoint == SSL_IS_CLIENT )
286 {
287 key1 = keyblk + ssl->maclen * 2;
288 key2 = keyblk + ssl->maclen * 2 + ssl->keylen;
289
290 memcpy( ssl->mac_enc, keyblk, ssl->maclen );
291 memcpy( ssl->mac_dec, keyblk + ssl->maclen, ssl->maclen );
292
293 memcpy( ssl->iv_enc, key2 + ssl->keylen, ssl->ivlen );
294 memcpy( ssl->iv_dec, key2 + ssl->keylen + ssl->ivlen,
295 ssl->ivlen );
296 }
297 else
298 {
299 key1 = keyblk + ssl->maclen * 2 + ssl->keylen;
300 key2 = keyblk + ssl->maclen * 2;
301
302 memcpy( ssl->mac_dec, keyblk, ssl->maclen );
303 memcpy( ssl->mac_enc, keyblk + ssl->maclen, ssl->maclen );
304
305 memcpy( ssl->iv_dec, key1 + ssl->keylen, ssl->ivlen );
306 memcpy( ssl->iv_enc, key1 + ssl->keylen + ssl->ivlen,
307 ssl->ivlen );
308 }
309
310 switch( ssl->session->cipher )
311 {
Paul Bakker40e46942009-01-03 21:51:57 +0000312#if defined(POLARSSL_ARC4_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000313 case SSL_RSA_RC4_128_MD5:
314 case SSL_RSA_RC4_128_SHA:
315 arc4_setup( (arc4_context *) ssl->ctx_enc, key1, ssl->keylen );
316 arc4_setup( (arc4_context *) ssl->ctx_dec, key2, ssl->keylen );
317 break;
318#endif
319
Paul Bakker40e46942009-01-03 21:51:57 +0000320#if defined(POLARSSL_DES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000321 case SSL_RSA_DES_168_SHA:
322 case SSL_EDH_RSA_DES_168_SHA:
323 des3_set3key_enc( (des3_context *) ssl->ctx_enc, key1 );
324 des3_set3key_dec( (des3_context *) ssl->ctx_dec, key2 );
325 break;
326#endif
327
Paul Bakker40e46942009-01-03 21:51:57 +0000328#if defined(POLARSSL_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000329 case SSL_RSA_AES_128_SHA:
330 aes_setkey_enc( (aes_context *) ssl->ctx_enc, key1, 128 );
331 aes_setkey_dec( (aes_context *) ssl->ctx_dec, key2, 128 );
332 break;
333
334 case SSL_RSA_AES_256_SHA:
335 case SSL_EDH_RSA_AES_256_SHA:
336 aes_setkey_enc( (aes_context *) ssl->ctx_enc, key1, 256 );
337 aes_setkey_dec( (aes_context *) ssl->ctx_dec, key2, 256 );
338 break;
339#endif
340
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000341#if defined(POLARSSL_CAMELLIA_C)
342 case SSL_RSA_CAMELLIA_128_SHA:
343 camellia_setkey_enc( (camellia_context *) ssl->ctx_enc, key1, 128 );
344 camellia_setkey_dec( (camellia_context *) ssl->ctx_dec, key2, 128 );
345 break;
346
347 case SSL_RSA_CAMELLIA_256_SHA:
348 case SSL_EDH_RSA_CAMELLIA_256_SHA:
349 camellia_setkey_enc( (camellia_context *) ssl->ctx_enc, key1, 256 );
350 camellia_setkey_dec( (camellia_context *) ssl->ctx_dec, key2, 256 );
351 break;
352#endif
353
Paul Bakker5121ce52009-01-03 21:22:43 +0000354 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000355 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000356 }
357
358 memset( keyblk, 0, sizeof( keyblk ) );
359
360 SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
361
362 return( 0 );
363}
364
365void ssl_calc_verify( ssl_context *ssl, unsigned char hash[36] )
366{
367 md5_context md5;
368 sha1_context sha1;
369 unsigned char pad_1[48];
370 unsigned char pad_2[48];
371
372 SSL_DEBUG_MSG( 2, ( "=> calc verify" ) );
373
374 memcpy( &md5 , &ssl->fin_md5 , sizeof( md5_context ) );
375 memcpy( &sha1, &ssl->fin_sha1, sizeof( sha1_context ) );
376
377 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
378 {
379 memset( pad_1, 0x36, 48 );
380 memset( pad_2, 0x5C, 48 );
381
382 md5_update( &md5, ssl->session->master, 48 );
383 md5_update( &md5, pad_1, 48 );
384 md5_finish( &md5, hash );
385
386 md5_starts( &md5 );
387 md5_update( &md5, ssl->session->master, 48 );
388 md5_update( &md5, pad_2, 48 );
389 md5_update( &md5, hash, 16 );
390 md5_finish( &md5, hash );
391
392 sha1_update( &sha1, ssl->session->master, 48 );
393 sha1_update( &sha1, pad_1, 40 );
394 sha1_finish( &sha1, hash + 16 );
395
396 sha1_starts( &sha1 );
397 sha1_update( &sha1, ssl->session->master, 48 );
398 sha1_update( &sha1, pad_2, 40 );
399 sha1_update( &sha1, hash + 16, 20 );
400 sha1_finish( &sha1, hash + 16 );
401 }
402 else /* TLSv1 */
403 {
404 md5_finish( &md5, hash );
405 sha1_finish( &sha1, hash + 16 );
406 }
407
408 SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
409 SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
410
411 return;
412}
413
414/*
415 * SSLv3.0 MAC functions
416 */
417static void ssl_mac_md5( unsigned char *secret,
418 unsigned char *buf, int len,
419 unsigned char *ctr, int type )
420{
421 unsigned char header[11];
422 unsigned char padding[48];
423 md5_context md5;
424
425 memcpy( header, ctr, 8 );
426 header[ 8] = (unsigned char) type;
427 header[ 9] = (unsigned char)( len >> 8 );
428 header[10] = (unsigned char)( len );
429
430 memset( padding, 0x36, 48 );
431 md5_starts( &md5 );
432 md5_update( &md5, secret, 16 );
433 md5_update( &md5, padding, 48 );
434 md5_update( &md5, header, 11 );
435 md5_update( &md5, buf, len );
436 md5_finish( &md5, buf + len );
437
438 memset( padding, 0x5C, 48 );
439 md5_starts( &md5 );
440 md5_update( &md5, secret, 16 );
441 md5_update( &md5, padding, 48 );
442 md5_update( &md5, buf + len, 16 );
443 md5_finish( &md5, buf + len );
444}
445
446static void ssl_mac_sha1( unsigned char *secret,
447 unsigned char *buf, int len,
448 unsigned char *ctr, int type )
449{
450 unsigned char header[11];
451 unsigned char padding[40];
452 sha1_context sha1;
453
454 memcpy( header, ctr, 8 );
455 header[ 8] = (unsigned char) type;
456 header[ 9] = (unsigned char)( len >> 8 );
457 header[10] = (unsigned char)( len );
458
459 memset( padding, 0x36, 40 );
460 sha1_starts( &sha1 );
461 sha1_update( &sha1, secret, 20 );
462 sha1_update( &sha1, padding, 40 );
463 sha1_update( &sha1, header, 11 );
464 sha1_update( &sha1, buf, len );
465 sha1_finish( &sha1, buf + len );
466
467 memset( padding, 0x5C, 40 );
468 sha1_starts( &sha1 );
469 sha1_update( &sha1, secret, 20 );
470 sha1_update( &sha1, padding, 40 );
471 sha1_update( &sha1, buf + len, 20 );
472 sha1_finish( &sha1, buf + len );
473}
474
475/*
476 * Encryption/decryption functions
477 */
478static int ssl_encrypt_buf( ssl_context *ssl )
479{
480 int i, padlen;
481
482 SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
483
484 /*
485 * Add MAC then encrypt
486 */
487 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
488 {
489 if( ssl->maclen == 16 )
490 ssl_mac_md5( ssl->mac_enc,
491 ssl->out_msg, ssl->out_msglen,
492 ssl->out_ctr, ssl->out_msgtype );
493
494 if( ssl->maclen == 20 )
495 ssl_mac_sha1( ssl->mac_enc,
496 ssl->out_msg, ssl->out_msglen,
497 ssl->out_ctr, ssl->out_msgtype );
498 }
499 else
500 {
501 if( ssl->maclen == 16 )
502 md5_hmac( ssl->mac_enc, 16,
503 ssl->out_ctr, ssl->out_msglen + 13,
504 ssl->out_msg + ssl->out_msglen );
505
506 if( ssl->maclen == 20 )
507 sha1_hmac( ssl->mac_enc, 20,
508 ssl->out_ctr, ssl->out_msglen + 13,
509 ssl->out_msg + ssl->out_msglen );
510 }
511
512 SSL_DEBUG_BUF( 4, "computed mac",
513 ssl->out_msg + ssl->out_msglen, ssl->maclen );
514
515 ssl->out_msglen += ssl->maclen;
516
517 for( i = 7; i >= 0; i-- )
518 if( ++ssl->out_ctr[i] != 0 )
519 break;
520
521 if( ssl->ivlen == 0 )
522 {
Paul Bakker40e46942009-01-03 21:51:57 +0000523#if defined(POLARSSL_ARC4_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000524 padlen = 0;
525
526 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
527 "including %d bytes of padding",
528 ssl->out_msglen, 0 ) );
529
530 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
531 ssl->out_msg, ssl->out_msglen );
532
533 arc4_crypt( (arc4_context *) ssl->ctx_enc,
Paul Bakkerbaad6502010-03-21 15:42:15 +0000534 ssl->out_msglen, ssl->out_msg,
535 ssl->out_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +0000536#else
Paul Bakker40e46942009-01-03 21:51:57 +0000537 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000538#endif
539 }
540 else
541 {
542 padlen = ssl->ivlen - ( ssl->out_msglen + 1 ) % ssl->ivlen;
543 if( padlen == ssl->ivlen )
544 padlen = 0;
545
546 for( i = 0; i <= padlen; i++ )
547 ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
548
549 ssl->out_msglen += padlen + 1;
550
551 SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
552 "including %d bytes of padding",
553 ssl->out_msglen, padlen + 1 ) );
554
555 SSL_DEBUG_BUF( 4, "before encrypt: output payload",
556 ssl->out_msg, ssl->out_msglen );
557
558 switch( ssl->ivlen )
559 {
560 case 8:
Paul Bakker40e46942009-01-03 21:51:57 +0000561#if defined(POLARSSL_DES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000562 des3_crypt_cbc( (des3_context *) ssl->ctx_enc,
563 DES_ENCRYPT, ssl->out_msglen,
564 ssl->iv_enc, ssl->out_msg, ssl->out_msg );
565 break;
566#endif
567
568 case 16:
Paul Bakker40e46942009-01-03 21:51:57 +0000569#if defined(POLARSSL_AES_C)
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000570 if ( ssl->session->cipher == SSL_RSA_AES_128_SHA ||
571 ssl->session->cipher == SSL_RSA_AES_256_SHA ||
572 ssl->session->cipher == SSL_EDH_RSA_AES_256_SHA)
573 {
574 aes_crypt_cbc( (aes_context *) ssl->ctx_enc,
575 AES_ENCRYPT, ssl->out_msglen,
576 ssl->iv_enc, ssl->out_msg, ssl->out_msg );
577 break;
578 }
579#endif
580
581#if defined(POLARSSL_CAMELLIA_C)
582 if ( ssl->session->cipher == SSL_RSA_CAMELLIA_128_SHA ||
583 ssl->session->cipher == SSL_RSA_CAMELLIA_256_SHA ||
584 ssl->session->cipher == SSL_EDH_RSA_CAMELLIA_256_SHA)
585 {
586 camellia_crypt_cbc( (camellia_context *) ssl->ctx_enc,
587 CAMELLIA_ENCRYPT, ssl->out_msglen,
588 ssl->iv_enc, ssl->out_msg, ssl->out_msg );
589 break;
590 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000591#endif
592
593 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000594 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000595 }
596 }
597
598 SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
599
600 return( 0 );
601}
602
603static int ssl_decrypt_buf( ssl_context *ssl )
604{
605 int i, padlen;
606 unsigned char tmp[20];
607
608 SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
609
610 if( ssl->in_msglen < ssl->minlen )
611 {
612 SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
613 ssl->in_msglen, ssl->minlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000614 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +0000615 }
616
617 if( ssl->ivlen == 0 )
618 {
Paul Bakker40e46942009-01-03 21:51:57 +0000619#if defined(POLARSSL_ARC4_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000620 padlen = 0;
621 arc4_crypt( (arc4_context *) ssl->ctx_dec,
Paul Bakkerbaad6502010-03-21 15:42:15 +0000622 ssl->in_msglen, ssl->in_msg,
623 ssl->in_msg );
Paul Bakker5121ce52009-01-03 21:22:43 +0000624#else
Paul Bakker40e46942009-01-03 21:51:57 +0000625 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000626#endif
627 }
628 else
629 {
630 /*
631 * Decrypt and check the padding
632 */
633 if( ssl->in_msglen % ssl->ivlen != 0 )
634 {
635 SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
636 ssl->in_msglen, ssl->ivlen ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000637 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +0000638 }
639
640 switch( ssl->ivlen )
641 {
Paul Bakker40e46942009-01-03 21:51:57 +0000642#if defined(POLARSSL_DES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000643 case 8:
644 des3_crypt_cbc( (des3_context *) ssl->ctx_dec,
645 DES_DECRYPT, ssl->in_msglen,
646 ssl->iv_dec, ssl->in_msg, ssl->in_msg );
647 break;
648#endif
649
Paul Bakker5121ce52009-01-03 21:22:43 +0000650 case 16:
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +0000651#if defined(POLARSSL_AES_C)
652 if ( ssl->session->cipher == SSL_RSA_AES_128_SHA ||
653 ssl->session->cipher == SSL_RSA_AES_256_SHA ||
654 ssl->session->cipher == SSL_EDH_RSA_AES_256_SHA)
655 {
656 aes_crypt_cbc( (aes_context *) ssl->ctx_dec,
657 AES_DECRYPT, ssl->in_msglen,
658 ssl->iv_dec, ssl->in_msg, ssl->in_msg );
659 break;
660 }
661#endif
662
663#if defined(POLARSSL_CAMELLIA_C)
664 if ( ssl->session->cipher == SSL_RSA_CAMELLIA_128_SHA ||
665 ssl->session->cipher == SSL_RSA_CAMELLIA_256_SHA ||
666 ssl->session->cipher == SSL_EDH_RSA_CAMELLIA_256_SHA)
667 {
668 camellia_crypt_cbc( (camellia_context *) ssl->ctx_dec,
669 CAMELLIA_DECRYPT, ssl->in_msglen,
670 ssl->iv_dec, ssl->in_msg, ssl->in_msg );
671 break;
672 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000673#endif
674
675 default:
Paul Bakker40e46942009-01-03 21:51:57 +0000676 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000677 }
678
679 padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
680
681 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
682 {
683 if( padlen > ssl->ivlen )
684 {
685 SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
686 "should be no more than %d",
687 padlen, ssl->ivlen ) );
688 padlen = 0;
689 }
690 }
691 else
692 {
693 /*
694 * TLSv1: always check the padding
695 */
696 for( i = 1; i <= padlen; i++ )
697 {
698 if( ssl->in_msg[ssl->in_msglen - i] != padlen - 1 )
699 {
700 SSL_DEBUG_MSG( 1, ( "bad padding byte: should be "
701 "%02x, but is %02x", padlen - 1,
702 ssl->in_msg[ssl->in_msglen - i] ) );
703 padlen = 0;
704 }
705 }
706 }
707 }
708
709 SSL_DEBUG_BUF( 4, "raw buffer after decryption",
710 ssl->in_msg, ssl->in_msglen );
711
712 /*
713 * Always compute the MAC (RFC4346, CBCTIME).
714 */
715 ssl->in_msglen -= ( ssl->maclen + padlen );
716
717 ssl->in_hdr[3] = (unsigned char)( ssl->in_msglen >> 8 );
718 ssl->in_hdr[4] = (unsigned char)( ssl->in_msglen );
719
720 memcpy( tmp, ssl->in_msg + ssl->in_msglen, 20 );
721
722 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
723 {
724 if( ssl->maclen == 16 )
725 ssl_mac_md5( ssl->mac_dec,
726 ssl->in_msg, ssl->in_msglen,
727 ssl->in_ctr, ssl->in_msgtype );
728 else
729 ssl_mac_sha1( ssl->mac_dec,
730 ssl->in_msg, ssl->in_msglen,
731 ssl->in_ctr, ssl->in_msgtype );
732 }
733 else
734 {
735 if( ssl->maclen == 16 )
736 md5_hmac( ssl->mac_dec, 16,
737 ssl->in_ctr, ssl->in_msglen + 13,
738 ssl->in_msg + ssl->in_msglen );
739 else
740 sha1_hmac( ssl->mac_dec, 20,
741 ssl->in_ctr, ssl->in_msglen + 13,
742 ssl->in_msg + ssl->in_msglen );
743 }
744
745 SSL_DEBUG_BUF( 4, "message mac", tmp, ssl->maclen );
746 SSL_DEBUG_BUF( 4, "computed mac", ssl->in_msg + ssl->in_msglen,
747 ssl->maclen );
748
749 if( memcmp( tmp, ssl->in_msg + ssl->in_msglen,
750 ssl->maclen ) != 0 )
751 {
752 SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000753 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +0000754 }
755
756 /*
757 * Finally check the padding length; bad padding
758 * will produce the same error as an invalid MAC.
759 */
760 if( ssl->ivlen != 0 && padlen == 0 )
Paul Bakker40e46942009-01-03 21:51:57 +0000761 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +0000762
763 if( ssl->in_msglen == 0 )
764 {
765 ssl->nb_zero++;
766
767 /*
768 * Three or more empty messages may be a DoS attack
769 * (excessive CPU consumption).
770 */
771 if( ssl->nb_zero > 3 )
772 {
773 SSL_DEBUG_MSG( 1, ( "received four consecutive empty "
774 "messages, possible DoS attack" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000775 return( POLARSSL_ERR_SSL_INVALID_MAC );
Paul Bakker5121ce52009-01-03 21:22:43 +0000776 }
777 }
778 else
779 ssl->nb_zero = 0;
780
781 for( i = 7; i >= 0; i-- )
782 if( ++ssl->in_ctr[i] != 0 )
783 break;
784
785 SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) );
786
787 return( 0 );
788}
789
790/*
791 * Fill the input message buffer
792 */
793int ssl_fetch_input( ssl_context *ssl, int nb_want )
794{
795 int ret, len;
796
797 SSL_DEBUG_MSG( 2, ( "=> fetch input" ) );
798
799 while( ssl->in_left < nb_want )
800 {
801 len = nb_want - ssl->in_left;
802 ret = ssl->f_recv( ssl->p_recv, ssl->in_hdr + ssl->in_left, len );
803
804 SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d",
805 ssl->in_left, nb_want ) );
806 SSL_DEBUG_RET( 2, "ssl->f_recv", ret );
807
808 if( ret < 0 )
809 return( ret );
810
811 ssl->in_left += ret;
812 }
813
814 SSL_DEBUG_MSG( 2, ( "<= fetch input" ) );
815
816 return( 0 );
817}
818
819/*
820 * Flush any data not yet written
821 */
822int ssl_flush_output( ssl_context *ssl )
823{
824 int ret;
825 unsigned char *buf;
826
827 SSL_DEBUG_MSG( 2, ( "=> flush output" ) );
828
829 while( ssl->out_left > 0 )
830 {
831 SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d",
832 5 + ssl->out_msglen, ssl->out_left ) );
833
834 buf = ssl->out_hdr + 5 + ssl->out_msglen - ssl->out_left;
835 ret = ssl->f_send( ssl->p_send, buf, ssl->out_left );
836 SSL_DEBUG_RET( 2, "ssl->f_send", ret );
837
838 if( ret <= 0 )
839 return( ret );
840
841 ssl->out_left -= ret;
842 }
843
844 SSL_DEBUG_MSG( 2, ( "<= flush output" ) );
845
846 return( 0 );
847}
848
849/*
850 * Record layer functions
851 */
852int ssl_write_record( ssl_context *ssl )
853{
854 int ret, len = ssl->out_msglen;
855
856 SSL_DEBUG_MSG( 2, ( "=> write record" ) );
857
858 ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;
859 ssl->out_hdr[1] = (unsigned char) ssl->major_ver;
860 ssl->out_hdr[2] = (unsigned char) ssl->minor_ver;
861 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
862 ssl->out_hdr[4] = (unsigned char)( len );
863
864 if( ssl->out_msgtype == SSL_MSG_HANDSHAKE )
865 {
866 ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );
867 ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >> 8 );
868 ssl->out_msg[3] = (unsigned char)( ( len - 4 ) );
869
870 md5_update( &ssl->fin_md5 , ssl->out_msg, len );
871 sha1_update( &ssl->fin_sha1, ssl->out_msg, len );
872 }
873
874 if( ssl->do_crypt != 0 )
875 {
876 if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )
877 {
878 SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret );
879 return( ret );
880 }
881
882 len = ssl->out_msglen;
883 ssl->out_hdr[3] = (unsigned char)( len >> 8 );
884 ssl->out_hdr[4] = (unsigned char)( len );
885 }
886
887 ssl->out_left = 5 + ssl->out_msglen;
888
889 SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, "
890 "version = [%d:%d], msglen = %d",
891 ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],
892 ( ssl->out_hdr[3] << 8 ) | ssl->out_hdr[4] ) );
893
894 SSL_DEBUG_BUF( 4, "output record sent to network",
895 ssl->out_hdr, 5 + ssl->out_msglen );
896
897 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
898 {
899 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
900 return( ret );
901 }
902
903 SSL_DEBUG_MSG( 2, ( "<= write record" ) );
904
905 return( 0 );
906}
907
908int ssl_read_record( ssl_context *ssl )
909{
910 int ret;
911
912 SSL_DEBUG_MSG( 2, ( "=> read record" ) );
913
914 if( ssl->in_hslen != 0 &&
915 ssl->in_hslen < ssl->in_msglen )
916 {
917 /*
918 * Get next Handshake message in the current record
919 */
920 ssl->in_msglen -= ssl->in_hslen;
921
922 memcpy( ssl->in_msg, ssl->in_msg + ssl->in_hslen,
923 ssl->in_msglen );
924
925 ssl->in_hslen = 4;
926 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
927
928 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
929 " %d, type = %d, hslen = %d",
930 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
931
932 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
933 {
934 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000935 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +0000936 }
937
938 if( ssl->in_msglen < ssl->in_hslen )
939 {
940 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000941 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +0000942 }
943
944 md5_update( &ssl->fin_md5 , ssl->in_msg, ssl->in_hslen );
945 sha1_update( &ssl->fin_sha1, ssl->in_msg, ssl->in_hslen );
946
947 return( 0 );
948 }
949
950 ssl->in_hslen = 0;
951
952 /*
953 * Read the record header and validate it
954 */
955 if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
956 {
957 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
958 return( ret );
959 }
960
961 ssl->in_msgtype = ssl->in_hdr[0];
962 ssl->in_msglen = ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4];
963
964 SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, "
965 "version = [%d:%d], msglen = %d",
966 ssl->in_hdr[0], ssl->in_hdr[1], ssl->in_hdr[2],
967 ( ssl->in_hdr[3] << 8 ) | ssl->in_hdr[4] ) );
968
969 if( ssl->in_hdr[1] != ssl->major_ver )
970 {
971 SSL_DEBUG_MSG( 1, ( "major version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000972 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +0000973 }
974
975 if( ssl->in_hdr[2] != SSL_MINOR_VERSION_0 &&
976 ssl->in_hdr[2] != SSL_MINOR_VERSION_1 )
977 {
978 SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000979 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +0000980 }
981
982 /*
983 * Make sure the message length is acceptable
984 */
985 if( ssl->do_crypt == 0 )
986 {
987 if( ssl->in_msglen < 1 ||
988 ssl->in_msglen > SSL_MAX_CONTENT_LEN )
989 {
990 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000991 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +0000992 }
993 }
994 else
995 {
996 if( ssl->in_msglen < ssl->minlen )
997 {
998 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000999 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001000 }
1001
1002 if( ssl->minor_ver == SSL_MINOR_VERSION_0 &&
1003 ssl->in_msglen > ssl->minlen + SSL_MAX_CONTENT_LEN )
1004 {
1005 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001006 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001007 }
1008
1009 /*
1010 * TLS encrypted messages can have up to 256 bytes of padding
1011 */
1012 if( ssl->minor_ver == SSL_MINOR_VERSION_1 &&
1013 ssl->in_msglen > ssl->minlen + SSL_MAX_CONTENT_LEN + 256 )
1014 {
1015 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001016 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001017 }
1018 }
1019
1020 /*
1021 * Read and optionally decrypt the message contents
1022 */
1023 if( ( ret = ssl_fetch_input( ssl, 5 + ssl->in_msglen ) ) != 0 )
1024 {
1025 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
1026 return( ret );
1027 }
1028
1029 SSL_DEBUG_BUF( 4, "input record from network",
1030 ssl->in_hdr, 5 + ssl->in_msglen );
1031
1032 if( ssl->do_crypt != 0 )
1033 {
1034 if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )
1035 {
1036 SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret );
1037 return( ret );
1038 }
1039
1040 SSL_DEBUG_BUF( 4, "input payload after decrypt",
1041 ssl->in_msg, ssl->in_msglen );
1042
1043 if( ssl->in_msglen > SSL_MAX_CONTENT_LEN )
1044 {
1045 SSL_DEBUG_MSG( 1, ( "bad message length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001046 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001047 }
1048 }
1049
1050 if( ssl->in_msgtype == SSL_MSG_HANDSHAKE )
1051 {
1052 ssl->in_hslen = 4;
1053 ssl->in_hslen += ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3];
1054
1055 SSL_DEBUG_MSG( 3, ( "handshake message: msglen ="
1056 " %d, type = %d, hslen = %d",
1057 ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );
1058
1059 /*
1060 * Additional checks to validate the handshake header
1061 */
1062 if( ssl->in_msglen < 4 || ssl->in_msg[1] != 0 )
1063 {
1064 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001065 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001066 }
1067
1068 if( ssl->in_msglen < ssl->in_hslen )
1069 {
1070 SSL_DEBUG_MSG( 1, ( "bad handshake length" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001071 return( POLARSSL_ERR_SSL_INVALID_RECORD );
Paul Bakker5121ce52009-01-03 21:22:43 +00001072 }
1073
1074 md5_update( &ssl->fin_md5 , ssl->in_msg, ssl->in_hslen );
1075 sha1_update( &ssl->fin_sha1, ssl->in_msg, ssl->in_hslen );
1076 }
1077
1078 if( ssl->in_msgtype == SSL_MSG_ALERT )
1079 {
1080 SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]",
1081 ssl->in_msg[0], ssl->in_msg[1] ) );
1082
1083 /*
1084 * Ignore non-fatal alerts, except close_notify
1085 */
1086 if( ssl->in_msg[0] == SSL_ALERT_FATAL )
1087 {
1088 SSL_DEBUG_MSG( 1, ( "is a fatal alert message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001089 return( POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE | ssl->in_msg[1] );
Paul Bakker5121ce52009-01-03 21:22:43 +00001090 }
1091
1092 if( ssl->in_msg[0] == SSL_ALERT_WARNING &&
1093 ssl->in_msg[1] == SSL_ALERT_CLOSE_NOTIFY )
1094 {
1095 SSL_DEBUG_MSG( 2, ( "is a close notify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001096 return( POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001097 }
1098 }
1099
1100 ssl->in_left = 0;
1101
1102 SSL_DEBUG_MSG( 2, ( "<= read record" ) );
1103
1104 return( 0 );
1105}
1106
1107/*
1108 * Handshake functions
1109 */
1110int ssl_write_certificate( ssl_context *ssl )
1111{
1112 int ret, i, n;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001113 const x509_cert *crt;
Paul Bakker5121ce52009-01-03 21:22:43 +00001114
1115 SSL_DEBUG_MSG( 2, ( "=> write certificate" ) );
1116
1117 if( ssl->endpoint == SSL_IS_CLIENT )
1118 {
1119 if( ssl->client_auth == 0 )
1120 {
1121 SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) );
1122 ssl->state++;
1123 return( 0 );
1124 }
1125
1126 /*
1127 * If using SSLv3 and got no cert, send an Alert message
1128 * (otherwise an empty Certificate message will be sent).
1129 */
1130 if( ssl->own_cert == NULL &&
1131 ssl->minor_ver == SSL_MINOR_VERSION_0 )
1132 {
1133 ssl->out_msglen = 2;
1134 ssl->out_msgtype = SSL_MSG_ALERT;
1135 ssl->out_msg[0] = SSL_ALERT_WARNING;
1136 ssl->out_msg[1] = SSL_ALERT_NO_CERTIFICATE;
1137
1138 SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) );
1139 goto write_msg;
1140 }
1141 }
1142 else /* SSL_IS_SERVER */
1143 {
1144 if( ssl->own_cert == NULL )
1145 {
1146 SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001147 return( POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001148 }
1149 }
1150
1151 SSL_DEBUG_CRT( 3, "own certificate", ssl->own_cert );
1152
1153 /*
1154 * 0 . 0 handshake type
1155 * 1 . 3 handshake length
1156 * 4 . 6 length of all certs
1157 * 7 . 9 length of cert. 1
1158 * 10 . n-1 peer certificate
1159 * n . n+2 length of cert. 2
1160 * n+3 . ... upper level cert, etc.
1161 */
1162 i = 7;
1163 crt = ssl->own_cert;
1164
Paul Bakker1f761152010-02-18 18:16:31 +00001165 while( crt != NULL && crt->version != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001166 {
1167 n = crt->raw.len;
1168 if( i + 3 + n > SSL_MAX_CONTENT_LEN )
1169 {
1170 SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d",
1171 i + 3 + n, SSL_MAX_CONTENT_LEN ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001172 return( POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001173 }
1174
1175 ssl->out_msg[i ] = (unsigned char)( n >> 16 );
1176 ssl->out_msg[i + 1] = (unsigned char)( n >> 8 );
1177 ssl->out_msg[i + 2] = (unsigned char)( n );
1178
1179 i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );
1180 i += n; crt = crt->next;
1181 }
1182
1183 ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 );
1184 ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 );
1185 ssl->out_msg[6] = (unsigned char)( ( i - 7 ) );
1186
1187 ssl->out_msglen = i;
1188 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1189 ssl->out_msg[0] = SSL_HS_CERTIFICATE;
1190
1191write_msg:
1192
1193 ssl->state++;
1194
1195 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1196 {
1197 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1198 return( ret );
1199 }
1200
1201 SSL_DEBUG_MSG( 2, ( "<= write certificate" ) );
1202
1203 return( 0 );
1204}
1205
1206int ssl_parse_certificate( ssl_context *ssl )
1207{
1208 int ret, i, n;
1209
1210 SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) );
1211
1212 if( ssl->endpoint == SSL_IS_SERVER &&
1213 ssl->authmode == SSL_VERIFY_NONE )
1214 {
1215 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) );
1216 ssl->state++;
1217 return( 0 );
1218 }
1219
1220 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1221 {
1222 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1223 return( ret );
1224 }
1225
1226 ssl->state++;
1227
1228 /*
1229 * Check if the client sent an empty certificate
1230 */
1231 if( ssl->endpoint == SSL_IS_SERVER &&
1232 ssl->minor_ver == SSL_MINOR_VERSION_0 )
1233 {
1234 if( ssl->in_msglen == 2 &&
1235 ssl->in_msgtype == SSL_MSG_ALERT &&
1236 ssl->in_msg[0] == SSL_ALERT_WARNING &&
1237 ssl->in_msg[1] == SSL_ALERT_NO_CERTIFICATE )
1238 {
1239 SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) );
1240
1241 if( ssl->authmode == SSL_VERIFY_OPTIONAL )
1242 return( 0 );
1243 else
Paul Bakker40e46942009-01-03 21:51:57 +00001244 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001245 }
1246 }
1247
1248 if( ssl->endpoint == SSL_IS_SERVER &&
1249 ssl->minor_ver != SSL_MINOR_VERSION_0 )
1250 {
1251 if( ssl->in_hslen == 7 &&
1252 ssl->in_msgtype == SSL_MSG_HANDSHAKE &&
1253 ssl->in_msg[0] == SSL_HS_CERTIFICATE &&
1254 memcmp( ssl->in_msg + 4, "\0\0\0", 3 ) == 0 )
1255 {
1256 SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) );
1257
1258 if( ssl->authmode == SSL_VERIFY_REQUIRED )
Paul Bakker40e46942009-01-03 21:51:57 +00001259 return( POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001260 else
1261 return( 0 );
1262 }
1263 }
1264
1265 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1266 {
1267 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001268 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001269 }
1270
1271 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE || ssl->in_hslen < 10 )
1272 {
1273 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001274 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001275 }
1276
1277 /*
1278 * Same message structure as in ssl_write_certificate()
1279 */
1280 n = ( ssl->in_msg[5] << 8 ) | ssl->in_msg[6];
1281
1282 if( ssl->in_msg[4] != 0 || ssl->in_hslen != 7 + n )
1283 {
1284 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001285 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001286 }
1287
1288 if( ( ssl->peer_cert = (x509_cert *) malloc(
1289 sizeof( x509_cert ) ) ) == NULL )
1290 {
1291 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed",
1292 sizeof( x509_cert ) ) );
1293 return( 1 );
1294 }
1295
1296 memset( ssl->peer_cert, 0, sizeof( x509_cert ) );
1297
1298 i = 7;
1299
1300 while( i < ssl->in_hslen )
1301 {
1302 if( ssl->in_msg[i] != 0 )
1303 {
1304 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001305 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001306 }
1307
1308 n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )
1309 | (unsigned int) ssl->in_msg[i + 2];
1310 i += 3;
1311
1312 if( n < 128 || i + n > ssl->in_hslen )
1313 {
1314 SSL_DEBUG_MSG( 1, ( "bad certificate message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001315 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001316 }
1317
1318 ret = x509parse_crt( ssl->peer_cert, ssl->in_msg + i, n );
1319 if( ret != 0 )
1320 {
1321 SSL_DEBUG_RET( 1, " x509parse_crt", ret );
1322 return( ret );
1323 }
1324
1325 i += n;
1326 }
1327
1328 SSL_DEBUG_CRT( 3, "peer certificate", ssl->peer_cert );
1329
1330 if( ssl->authmode != SSL_VERIFY_NONE )
1331 {
1332 if( ssl->ca_chain == NULL )
1333 {
1334 SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001335 return( POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001336 }
1337
Paul Bakker40ea7de2009-05-03 10:18:48 +00001338 ret = x509parse_verify( ssl->peer_cert, ssl->ca_chain, ssl->ca_crl,
Paul Bakker5121ce52009-01-03 21:22:43 +00001339 ssl->peer_cn, &ssl->verify_result );
1340
1341 if( ret != 0 )
1342 SSL_DEBUG_RET( 1, "x509_verify_cert", ret );
1343
1344 if( ssl->authmode != SSL_VERIFY_REQUIRED )
1345 ret = 0;
1346 }
1347
1348 SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) );
1349
1350 return( ret );
1351}
1352
1353int ssl_write_change_cipher_spec( ssl_context *ssl )
1354{
1355 int ret;
1356
1357 SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) );
1358
1359 ssl->out_msgtype = SSL_MSG_CHANGE_CIPHER_SPEC;
1360 ssl->out_msglen = 1;
1361 ssl->out_msg[0] = 1;
1362
1363 ssl->do_crypt = 0;
1364 ssl->state++;
1365
1366 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1367 {
1368 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1369 return( ret );
1370 }
1371
1372 SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) );
1373
1374 return( 0 );
1375}
1376
1377int ssl_parse_change_cipher_spec( ssl_context *ssl )
1378{
1379 int ret;
1380
1381 SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) );
1382
1383 ssl->do_crypt = 0;
1384
1385 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1386 {
1387 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1388 return( ret );
1389 }
1390
1391 if( ssl->in_msgtype != SSL_MSG_CHANGE_CIPHER_SPEC )
1392 {
1393 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001394 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001395 }
1396
1397 if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )
1398 {
1399 SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001400 return( POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );
Paul Bakker5121ce52009-01-03 21:22:43 +00001401 }
1402
1403 ssl->state++;
1404
1405 SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) );
1406
1407 return( 0 );
1408}
1409
1410static void ssl_calc_finished(
1411 ssl_context *ssl, unsigned char *buf, int from,
1412 md5_context *md5, sha1_context *sha1 )
1413{
1414 int len = 12;
1415 char *sender;
1416 unsigned char padbuf[48];
1417 unsigned char md5sum[16];
1418 unsigned char sha1sum[20];
1419
1420 SSL_DEBUG_MSG( 2, ( "=> calc finished" ) );
1421
1422 /*
1423 * SSLv3:
1424 * hash =
1425 * MD5( master + pad2 +
1426 * MD5( handshake + sender + master + pad1 ) )
1427 * + SHA1( master + pad2 +
1428 * SHA1( handshake + sender + master + pad1 ) )
1429 *
1430 * TLSv1:
1431 * hash = PRF( master, finished_label,
1432 * MD5( handshake ) + SHA1( handshake ) )[0..11]
1433 */
1434
1435 SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *)
1436 md5->state, sizeof( md5->state ) );
1437
1438 SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *)
1439 sha1->state, sizeof( sha1->state ) );
1440
1441 if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
1442 {
1443 sender = ( from == SSL_IS_CLIENT ) ? (char *) "CLNT"
1444 : (char *) "SRVR";
1445
1446 memset( padbuf, 0x36, 48 );
1447
1448 md5_update( md5, (unsigned char *) sender, 4 );
1449 md5_update( md5, ssl->session->master, 48 );
1450 md5_update( md5, padbuf, 48 );
1451 md5_finish( md5, md5sum );
1452
1453 sha1_update( sha1, (unsigned char *) sender, 4 );
1454 sha1_update( sha1, ssl->session->master, 48 );
1455 sha1_update( sha1, padbuf, 40 );
1456 sha1_finish( sha1, sha1sum );
1457
1458 memset( padbuf, 0x5C, 48 );
1459
1460 md5_starts( md5 );
1461 md5_update( md5, ssl->session->master, 48 );
1462 md5_update( md5, padbuf, 48 );
1463 md5_update( md5, md5sum, 16 );
1464 md5_finish( md5, buf );
1465
1466 sha1_starts( sha1 );
1467 sha1_update( sha1, ssl->session->master, 48 );
1468 sha1_update( sha1, padbuf , 40 );
1469 sha1_update( sha1, sha1sum, 20 );
1470 sha1_finish( sha1, buf + 16 );
1471
1472 len += 24;
1473 }
1474 else
1475 {
1476 sender = ( from == SSL_IS_CLIENT )
1477 ? (char *) "client finished"
1478 : (char *) "server finished";
1479
1480 md5_finish( md5, padbuf );
1481 sha1_finish( sha1, padbuf + 16 );
1482
1483 tls1_prf( ssl->session->master, 48, sender,
1484 padbuf, 36, buf, len );
1485 }
1486
1487 SSL_DEBUG_BUF( 3, "calc finished result", buf, len );
1488
1489 memset( md5, 0, sizeof( md5_context ) );
1490 memset( sha1, 0, sizeof( sha1_context ) );
1491
1492 memset( padbuf, 0, sizeof( padbuf ) );
1493 memset( md5sum, 0, sizeof( md5sum ) );
1494 memset( sha1sum, 0, sizeof( sha1sum ) );
1495
1496 SSL_DEBUG_MSG( 2, ( "<= calc finished" ) );
1497}
1498
1499int ssl_write_finished( ssl_context *ssl )
1500{
1501 int ret, hash_len;
1502 md5_context md5;
1503 sha1_context sha1;
1504
1505 SSL_DEBUG_MSG( 2, ( "=> write finished" ) );
1506
1507 memcpy( &md5 , &ssl->fin_md5 , sizeof( md5_context ) );
1508 memcpy( &sha1, &ssl->fin_sha1, sizeof( sha1_context ) );
1509
1510 ssl_calc_finished( ssl, ssl->out_msg + 4,
1511 ssl->endpoint, &md5, &sha1 );
1512
1513 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
1514
1515 ssl->out_msglen = 4 + hash_len;
1516 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1517 ssl->out_msg[0] = SSL_HS_FINISHED;
1518
1519 /*
1520 * In case of session resuming, invert the client and server
1521 * ChangeCipherSpec messages order.
1522 */
1523 if( ssl->resume != 0 )
1524 {
1525 if( ssl->endpoint == SSL_IS_CLIENT )
1526 ssl->state = SSL_HANDSHAKE_OVER;
1527 else
1528 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
1529 }
1530 else
1531 ssl->state++;
1532
1533 ssl->do_crypt = 1;
1534
1535 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1536 {
1537 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1538 return( ret );
1539 }
1540
1541 SSL_DEBUG_MSG( 2, ( "<= write finished" ) );
1542
1543 return( 0 );
1544}
1545
1546int ssl_parse_finished( ssl_context *ssl )
1547{
1548 int ret, hash_len;
1549 md5_context md5;
1550 sha1_context sha1;
1551 unsigned char buf[36];
1552
1553 SSL_DEBUG_MSG( 2, ( "=> parse finished" ) );
1554
1555 memcpy( &md5 , &ssl->fin_md5 , sizeof( md5_context ) );
1556 memcpy( &sha1, &ssl->fin_sha1, sizeof( sha1_context ) );
1557
1558 ssl->do_crypt = 1;
1559
1560 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1561 {
1562 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1563 return( ret );
1564 }
1565
1566 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1567 {
1568 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001569 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001570 }
1571
1572 hash_len = ( ssl->minor_ver == SSL_MINOR_VERSION_0 ) ? 36 : 12;
1573
1574 if( ssl->in_msg[0] != SSL_HS_FINISHED ||
1575 ssl->in_hslen != 4 + hash_len )
1576 {
1577 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001578 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001579 }
1580
1581 ssl_calc_finished( ssl, buf, ssl->endpoint ^ 1, &md5, &sha1 );
1582
1583 if( memcmp( ssl->in_msg + 4, buf, hash_len ) != 0 )
1584 {
1585 SSL_DEBUG_MSG( 1, ( "bad finished message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001586 return( POLARSSL_ERR_SSL_BAD_HS_FINISHED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001587 }
1588
1589 if( ssl->resume != 0 )
1590 {
1591 if( ssl->endpoint == SSL_IS_CLIENT )
1592 ssl->state = SSL_CLIENT_CHANGE_CIPHER_SPEC;
1593
1594 if( ssl->endpoint == SSL_IS_SERVER )
1595 ssl->state = SSL_HANDSHAKE_OVER;
1596 }
1597 else
1598 ssl->state++;
1599
1600 SSL_DEBUG_MSG( 2, ( "<= parse finished" ) );
1601
1602 return( 0 );
1603}
1604
1605/*
1606 * Initialize an SSL context
1607 */
1608int ssl_init( ssl_context *ssl )
1609{
1610 int len = SSL_BUFFER_LEN;
1611
1612 memset( ssl, 0, sizeof( ssl_context ) );
1613
1614 ssl->in_ctr = (unsigned char *) malloc( len );
1615 ssl->in_hdr = ssl->in_ctr + 8;
1616 ssl->in_msg = ssl->in_ctr + 13;
1617
1618 if( ssl->in_ctr == NULL )
1619 {
1620 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
1621 return( 1 );
1622 }
1623
1624 ssl->out_ctr = (unsigned char *) malloc( len );
1625 ssl->out_hdr = ssl->out_ctr + 8;
1626 ssl->out_msg = ssl->out_ctr + 13;
1627
1628 if( ssl->out_ctr == NULL )
1629 {
1630 SSL_DEBUG_MSG( 1, ( "malloc(%d bytes) failed", len ) );
1631 free( ssl-> in_ctr );
1632 return( 1 );
1633 }
1634
1635 memset( ssl-> in_ctr, 0, SSL_BUFFER_LEN );
1636 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
1637
1638 ssl->hostname = NULL;
1639 ssl->hostname_len = 0;
1640
1641 md5_starts( &ssl->fin_md5 );
1642 sha1_starts( &ssl->fin_sha1 );
1643
1644 return( 0 );
1645}
1646
1647/*
1648 * SSL set accessors
1649 */
1650void ssl_set_endpoint( ssl_context *ssl, int endpoint )
1651{
1652 ssl->endpoint = endpoint;
1653}
1654
1655void ssl_set_authmode( ssl_context *ssl, int authmode )
1656{
1657 ssl->authmode = authmode;
1658}
1659
1660void ssl_set_rng( ssl_context *ssl,
1661 int (*f_rng)(void *),
1662 void *p_rng )
1663{
1664 ssl->f_rng = f_rng;
1665 ssl->p_rng = p_rng;
1666}
1667
1668void ssl_set_dbg( ssl_context *ssl,
Paul Bakkerff60ee62010-03-16 21:09:09 +00001669 void (*f_dbg)(void *, int, const char *),
Paul Bakker5121ce52009-01-03 21:22:43 +00001670 void *p_dbg )
1671{
1672 ssl->f_dbg = f_dbg;
1673 ssl->p_dbg = p_dbg;
1674}
1675
1676void ssl_set_bio( ssl_context *ssl,
1677 int (*f_recv)(void *, unsigned char *, int), void *p_recv,
1678 int (*f_send)(void *, unsigned char *, int), void *p_send )
1679{
1680 ssl->f_recv = f_recv;
1681 ssl->f_send = f_send;
1682 ssl->p_recv = p_recv;
1683 ssl->p_send = p_send;
1684}
1685
1686void ssl_set_scb( ssl_context *ssl,
1687 int (*s_get)(ssl_context *),
1688 int (*s_set)(ssl_context *) )
1689{
1690 ssl->s_get = s_get;
1691 ssl->s_set = s_set;
1692}
1693
1694void ssl_set_session( ssl_context *ssl, int resume, int timeout,
1695 ssl_session *session )
1696{
1697 ssl->resume = resume;
1698 ssl->timeout = timeout;
1699 ssl->session = session;
1700}
1701
1702void ssl_set_ciphers( ssl_context *ssl, int *ciphers )
1703{
1704 ssl->ciphers = ciphers;
1705}
1706
1707void ssl_set_ca_chain( ssl_context *ssl, x509_cert *ca_chain,
Paul Bakker40ea7de2009-05-03 10:18:48 +00001708 x509_crl *ca_crl, char *peer_cn )
Paul Bakker5121ce52009-01-03 21:22:43 +00001709{
1710 ssl->ca_chain = ca_chain;
Paul Bakker40ea7de2009-05-03 10:18:48 +00001711 ssl->ca_crl = ca_crl;
Paul Bakker5121ce52009-01-03 21:22:43 +00001712 ssl->peer_cn = peer_cn;
1713}
1714
1715void ssl_set_own_cert( ssl_context *ssl, x509_cert *own_cert,
1716 rsa_context *rsa_key )
1717{
1718 ssl->own_cert = own_cert;
1719 ssl->rsa_key = rsa_key;
1720}
1721
Paul Bakkerff60ee62010-03-16 21:09:09 +00001722int ssl_set_dh_param( ssl_context *ssl, const char *dhm_P, const char *dhm_G )
Paul Bakker5121ce52009-01-03 21:22:43 +00001723{
1724 int ret;
1725
1726 if( ( ret = mpi_read_string( &ssl->dhm_ctx.P, 16, dhm_P ) ) != 0 )
1727 {
1728 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
1729 return( ret );
1730 }
1731
1732 if( ( ret = mpi_read_string( &ssl->dhm_ctx.G, 16, dhm_G ) ) != 0 )
1733 {
1734 SSL_DEBUG_RET( 1, "mpi_read_string", ret );
1735 return( ret );
1736 }
1737
1738 return( 0 );
1739}
1740
Paul Bakkerff60ee62010-03-16 21:09:09 +00001741int ssl_set_hostname( ssl_context *ssl, const char *hostname )
Paul Bakker5121ce52009-01-03 21:22:43 +00001742{
1743 if( hostname == NULL )
Paul Bakker40e46942009-01-03 21:51:57 +00001744 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00001745
1746 ssl->hostname_len = strlen( hostname );
Paul Bakker40ea7de2009-05-03 10:18:48 +00001747 ssl->hostname = (unsigned char *) malloc( ssl->hostname_len + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001748
1749 memcpy( ssl->hostname, (unsigned char *) hostname,
1750 ssl->hostname_len );
Paul Bakker40ea7de2009-05-03 10:18:48 +00001751
1752 ssl->hostname[ssl->hostname_len] = '\0';
Paul Bakker5121ce52009-01-03 21:22:43 +00001753
1754 return( 0 );
1755}
1756
1757/*
1758 * SSL get accessors
1759 */
Paul Bakkerff60ee62010-03-16 21:09:09 +00001760int ssl_get_bytes_avail( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001761{
1762 return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );
1763}
1764
Paul Bakkerff60ee62010-03-16 21:09:09 +00001765int ssl_get_verify_result( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001766{
1767 return( ssl->verify_result );
1768}
1769
Paul Bakkerff60ee62010-03-16 21:09:09 +00001770const char *ssl_get_cipher( const ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001771{
1772 switch( ssl->session->cipher )
1773 {
Paul Bakker40e46942009-01-03 21:51:57 +00001774#if defined(POLARSSL_ARC4_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001775 case SSL_RSA_RC4_128_MD5:
1776 return( "SSL_RSA_RC4_128_MD5" );
1777
1778 case SSL_RSA_RC4_128_SHA:
1779 return( "SSL_RSA_RC4_128_SHA" );
1780#endif
1781
Paul Bakker40e46942009-01-03 21:51:57 +00001782#if defined(POLARSSL_DES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001783 case SSL_RSA_DES_168_SHA:
1784 return( "SSL_RSA_DES_168_SHA" );
1785
1786 case SSL_EDH_RSA_DES_168_SHA:
1787 return( "SSL_EDH_RSA_DES_168_SHA" );
1788#endif
1789
Paul Bakker40e46942009-01-03 21:51:57 +00001790#if defined(POLARSSL_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001791 case SSL_RSA_AES_128_SHA:
1792 return( "SSL_RSA_AES_128_SHA" );
1793
1794 case SSL_RSA_AES_256_SHA:
1795 return( "SSL_RSA_AES_256_SHA" );
1796
1797 case SSL_EDH_RSA_AES_256_SHA:
1798 return( "SSL_EDH_RSA_AES_256_SHA" );
1799#endif
1800
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001801#if defined(POLARSSL_CAMELLIA_C)
1802 case SSL_RSA_CAMELLIA_128_SHA:
1803 return( "SSL_RSA_CAMELLIA_128_SHA" );
1804
1805 case SSL_RSA_CAMELLIA_256_SHA:
1806 return( "SSL_RSA_CAMELLIA_256_SHA" );
1807
1808 case SSL_EDH_RSA_CAMELLIA_256_SHA:
1809 return( "SSL_EDH_RSA_CAMELLIA_256_SHA" );
1810#endif
1811
Paul Bakker5121ce52009-01-03 21:22:43 +00001812 default:
1813 break;
1814 }
1815
1816 return( "unknown" );
1817}
1818
1819int ssl_default_ciphers[] =
1820{
Paul Bakker40e46942009-01-03 21:51:57 +00001821#if defined(POLARSSL_DHM_C)
1822#if defined(POLARSSL_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001823 SSL_EDH_RSA_AES_256_SHA,
1824#endif
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001825#if defined(POLARSSL_CAMELLIA_C)
1826 SSL_EDH_RSA_CAMELLIA_256_SHA,
1827#endif
Paul Bakker40e46942009-01-03 21:51:57 +00001828#if defined(POLARSSL_DES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001829 SSL_EDH_RSA_DES_168_SHA,
1830#endif
1831#endif
1832
Paul Bakker40e46942009-01-03 21:51:57 +00001833#if defined(POLARSSL_AES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001834 SSL_RSA_AES_256_SHA,
1835#endif
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001836#if defined(POLARSSL_CAMELLIA_C)
Paul Bakkerb5ef0ba2009-01-11 20:25:36 +00001837 SSL_RSA_CAMELLIA_256_SHA,
1838#endif
Paul Bakkeref75f252009-03-28 18:43:23 +00001839#if defined(POLARSSL_AES_C)
1840 SSL_RSA_AES_128_SHA,
1841#endif
1842#if defined(POLARSSL_CAMELLIA_C)
1843 SSL_RSA_CAMELLIA_128_SHA,
1844#endif
Paul Bakker40e46942009-01-03 21:51:57 +00001845#if defined(POLARSSL_DES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001846 SSL_RSA_DES_168_SHA,
1847#endif
Paul Bakker40e46942009-01-03 21:51:57 +00001848#if defined(POLARSSL_ARC4_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001849 SSL_RSA_RC4_128_SHA,
1850 SSL_RSA_RC4_128_MD5,
1851#endif
1852 0
1853};
1854
1855/*
1856 * Perform the SSL handshake
1857 */
1858int ssl_handshake( ssl_context *ssl )
1859{
Paul Bakker40e46942009-01-03 21:51:57 +00001860 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00001861
1862 SSL_DEBUG_MSG( 2, ( "=> handshake" ) );
1863
Paul Bakker40e46942009-01-03 21:51:57 +00001864#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001865 if( ssl->endpoint == SSL_IS_CLIENT )
1866 ret = ssl_handshake_client( ssl );
1867#endif
1868
Paul Bakker40e46942009-01-03 21:51:57 +00001869#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00001870 if( ssl->endpoint == SSL_IS_SERVER )
1871 ret = ssl_handshake_server( ssl );
1872#endif
1873
1874 SSL_DEBUG_MSG( 2, ( "<= handshake" ) );
1875
1876 return( ret );
1877}
1878
1879/*
1880 * Receive application data decrypted from the SSL layer
1881 */
1882int ssl_read( ssl_context *ssl, unsigned char *buf, int len )
1883{
1884 int ret, n;
1885
1886 SSL_DEBUG_MSG( 2, ( "=> read" ) );
1887
1888 if( ssl->state != SSL_HANDSHAKE_OVER )
1889 {
1890 if( ( ret = ssl_handshake( ssl ) ) != 0 )
1891 {
1892 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
1893 return( ret );
1894 }
1895 }
1896
1897 if( ssl->in_offt == NULL )
1898 {
1899 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1900 {
1901 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1902 return( ret );
1903 }
1904
1905 if( ssl->in_msglen == 0 &&
1906 ssl->in_msgtype == SSL_MSG_APPLICATION_DATA )
1907 {
1908 /*
1909 * OpenSSL sends empty messages to randomize the IV
1910 */
1911 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1912 {
1913 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1914 return( ret );
1915 }
1916 }
1917
1918 if( ssl->in_msgtype != SSL_MSG_APPLICATION_DATA )
1919 {
1920 SSL_DEBUG_MSG( 1, ( "bad application data message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001921 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001922 }
1923
1924 ssl->in_offt = ssl->in_msg;
1925 }
1926
1927 n = ( len < ssl->in_msglen )
1928 ? len : ssl->in_msglen;
1929
1930 memcpy( buf, ssl->in_offt, n );
1931 ssl->in_msglen -= n;
1932
1933 if( ssl->in_msglen == 0 )
1934 /* all bytes consumed */
1935 ssl->in_offt = NULL;
1936 else
1937 /* more data available */
1938 ssl->in_offt += n;
1939
1940 SSL_DEBUG_MSG( 2, ( "<= read" ) );
1941
1942 return( n );
1943}
1944
1945/*
1946 * Send application data to be encrypted by the SSL layer
1947 */
Paul Bakkerff60ee62010-03-16 21:09:09 +00001948int ssl_write( ssl_context *ssl, const unsigned char *buf, int len )
Paul Bakker5121ce52009-01-03 21:22:43 +00001949{
1950 int ret, n;
1951
1952 SSL_DEBUG_MSG( 2, ( "=> write" ) );
1953
1954 if( ssl->state != SSL_HANDSHAKE_OVER )
1955 {
1956 if( ( ret = ssl_handshake( ssl ) ) != 0 )
1957 {
1958 SSL_DEBUG_RET( 1, "ssl_handshake", ret );
1959 return( ret );
1960 }
1961 }
1962
1963 n = ( len < SSL_MAX_CONTENT_LEN )
1964 ? len : SSL_MAX_CONTENT_LEN;
1965
1966 if( ssl->out_left != 0 )
1967 {
1968 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1969 {
1970 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
1971 return( ret );
1972 }
1973 }
1974 else
1975 {
1976 ssl->out_msglen = n;
1977 ssl->out_msgtype = SSL_MSG_APPLICATION_DATA;
1978 memcpy( ssl->out_msg, buf, n );
1979
1980 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1981 {
1982 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1983 return( ret );
1984 }
1985 }
1986
1987 SSL_DEBUG_MSG( 2, ( "<= write" ) );
1988
1989 return( n );
1990}
1991
1992/*
1993 * Notify the peer that the connection is being closed
1994 */
1995int ssl_close_notify( ssl_context *ssl )
1996{
1997 int ret;
1998
1999 SSL_DEBUG_MSG( 2, ( "=> write close notify" ) );
2000
2001 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
2002 {
2003 SSL_DEBUG_RET( 1, "ssl_flush_output", ret );
2004 return( ret );
2005 }
2006
2007 if( ssl->state == SSL_HANDSHAKE_OVER )
2008 {
2009 ssl->out_msgtype = SSL_MSG_ALERT;
2010 ssl->out_msglen = 2;
2011 ssl->out_msg[0] = SSL_ALERT_WARNING;
2012 ssl->out_msg[1] = SSL_ALERT_CLOSE_NOTIFY;
2013
2014 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2015 {
2016 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2017 return( ret );
2018 }
2019 }
2020
2021 SSL_DEBUG_MSG( 2, ( "<= write close notify" ) );
2022
2023 return( ret );
2024}
2025
2026/*
2027 * Free an SSL context
2028 */
2029void ssl_free( ssl_context *ssl )
2030{
2031 SSL_DEBUG_MSG( 2, ( "=> free" ) );
2032
2033 if( ssl->peer_cert != NULL )
2034 {
2035 x509_free( ssl->peer_cert );
2036 memset( ssl->peer_cert, 0, sizeof( x509_cert ) );
2037 free( ssl->peer_cert );
2038 }
2039
2040 if( ssl->out_ctr != NULL )
2041 {
2042 memset( ssl->out_ctr, 0, SSL_BUFFER_LEN );
2043 free( ssl->out_ctr );
2044 }
2045
2046 if( ssl->in_ctr != NULL )
2047 {
2048 memset( ssl->in_ctr, 0, SSL_BUFFER_LEN );
2049 free( ssl->in_ctr );
2050 }
2051
Paul Bakker40e46942009-01-03 21:51:57 +00002052#if defined(POLARSSL_DHM_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00002053 dhm_free( &ssl->dhm_ctx );
2054#endif
2055
2056 if ( ssl->hostname != NULL)
2057 {
2058 memset( ssl->hostname, 0, ssl->hostname_len );
2059 free( ssl->hostname );
2060 ssl->hostname_len = 0;
2061 }
2062
Paul Bakker5121ce52009-01-03 21:22:43 +00002063 SSL_DEBUG_MSG( 2, ( "<= free" ) );
Paul Bakker2da561c2009-02-05 18:00:28 +00002064
2065 /* Actually free after last debug message */
2066 memset( ssl, 0, sizeof( ssl_context ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00002067}
2068
2069#endif