blob: cbec7952b2d0ee1f650a7ea5718f0d104f6491be [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 server-side functions
3 *
Paul Bakker68884e32013-01-07 18:20:04 +01004 * Copyright (C) 2006-2013, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
Paul Bakker40e46942009-01-03 21:51:57 +000026#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Paul Bakker40e46942009-01-03 21:51:57 +000028#if defined(POLARSSL_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Paul Bakker40e46942009-01-03 21:51:57 +000030#include "polarssl/debug.h"
31#include "polarssl/ssl.h"
Paul Bakker41c83d32013-03-20 14:39:14 +010032#if defined(POLARSSL_ECP_C)
33#include "polarssl/ecp.h"
34#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Manuel Pégourié-Gonnard94f6a792013-08-01 14:33:49 +020036#if defined(POLARSSL_MEMORY_C)
37#include "polarssl/memory.h"
38#else
39#define polarssl_malloc malloc
40#define polarssl_free free
41#endif
42
Paul Bakker5121ce52009-01-03 21:22:43 +000043#include <stdlib.h>
44#include <stdio.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020045
46#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +000047#include <time.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020048#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000049
Manuel Pégourié-Gonnard94f6a792013-08-01 14:33:49 +020050/*
51 * Serialize a session in the following format:
52 * 0 . n-1 session structure, n = sizeof(ssl_session)
53 * n . n+2 peer_cert length = m (0 if no certificate)
54 * n+3 . n+2+m peer cert ASN.1
55 *
56 * Assumes ticket is NULL (always true on server side).
57 */
58static void ssl_save_session( const ssl_session *session,
59 unsigned char *buf, size_t *olen )
60{
61 unsigned char *p = buf;
62#if defined(POLARSSL_X509_PARSE_C)
63 size_t cert_len;
64#endif /* POLARSSL_X509_PARSE_C */
65
66 memcpy( p, session, sizeof( ssl_session ) );
67 p += sizeof( ssl_session );
68
69#if defined(POLARSSL_X509_PARSE_C)
70 ((ssl_session *) buf)->peer_cert = NULL;
71
72 if( session->peer_cert == NULL )
73 cert_len = 0;
74 else
75 cert_len = session->peer_cert->raw.len;
76
77 *p++ = (unsigned char)( cert_len >> 16 & 0xFF );
78 *p++ = (unsigned char)( cert_len >> 8 & 0xFF );
79 *p++ = (unsigned char)( cert_len & 0xFF );
80
81 if( session->peer_cert != NULL )
82 memcpy( p, session->peer_cert->raw.p, cert_len );
83
84 p += cert_len;
85#endif /* POLARSSL_X509_PARSE_C */
86
87 *olen = p - buf;
88}
89
90/*
91 * Unserialise session, see ssl_save_session()
92 */
93static int ssl_load_session( ssl_session *session,
94 const unsigned char *buf, size_t len )
95{
96 int ret;
97 const unsigned char *p = buf;
98 const unsigned char * const end = buf + len;
99#if defined(POLARSSL_X509_PARSE_C)
100 size_t cert_len;
101#endif /* POLARSSL_X509_PARSE_C */
102
103 if( p + sizeof( ssl_session ) > end )
104 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
105
106 memcpy( session, p, sizeof( ssl_session ) );
107 p += sizeof( ssl_session );
108
109#if defined(POLARSSL_X509_PARSE_C)
110 if( p + 3 > end )
111 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
112
113 cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];
114 p += 3;
115
116 if( cert_len == 0 )
117 {
118 session->peer_cert = NULL;
119 }
120 else
121 {
122 if( p + cert_len > end )
123 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
124
125 session->peer_cert = polarssl_malloc( cert_len );
126
127 if( session->peer_cert == NULL )
128 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
129
130 memset( session->peer_cert, 0, sizeof( x509_cert ) );
131
132 if( ( ret = x509parse_crt( session->peer_cert, p, cert_len ) ) != 0 )
133 {
134 polarssl_free( session->peer_cert );
135 free( session->peer_cert );
136 session->peer_cert = NULL;
137 return( ret );
138 }
139
140 p += cert_len;
141 }
142#endif /* POLARSSL_X509_PARSE_C */
143
144 if( p != end )
145 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
146
147 return( 0 );
148}
149
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200150/*
151 * Create session ticket, secured as recommended in RFC 5077 section 4:
152 *
153 * struct {
154 * opaque key_name[16];
155 * opaque iv[16];
156 * opaque encrypted_state<0..2^16-1>;
157 * opaque mac[32];
158 * } ticket;
159 *
160 * (the internal state structure differs, however).
161 */
162static int ssl_write_ticket( ssl_context *ssl, size_t *tlen )
163{
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200164 int ret;
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200165 unsigned char * const start = ssl->out_msg + 10;
166 unsigned char *p = start;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200167 unsigned char *state;
168 unsigned char iv[16];
169 size_t clear_len, enc_len, pad_len, i;
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200170
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +0200171 if( ssl->ticket_keys == NULL )
172 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
173
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200174 /* Write key name */
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +0200175 memcpy( p, ssl->ticket_keys->key_name, 16 );
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200176 p += 16;
177
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200178 /* Generate and write IV (with a copy for aes_crypt) */
179 if( ( ret = ssl->f_rng( ssl->p_rng, p, 16 ) ) != 0 )
180 return( ret );
181 memcpy( iv, p, 16 );
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200182 p += 16;
183
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200184 /* Dump session state */
185 state = p + 2;
186 ssl_save_session( ssl->session_negotiate, state, &clear_len );
187 SSL_DEBUG_BUF( 3, "session ticket cleartext", state, clear_len );
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200188
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200189 /* Apply PKCS padding */
190 pad_len = 16 - clear_len % 16;
191 enc_len = clear_len + pad_len;
192 for( i = clear_len; i < enc_len; i++ )
193 state[i] = (unsigned char) pad_len;
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200194
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200195 /* Encrypt */
196 if( ( ret = aes_crypt_cbc( &ssl->ticket_keys->enc, AES_ENCRYPT,
197 enc_len, iv, state, state ) ) != 0 )
198 {
199 return( ret );
200 }
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200201
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200202 /* Write length */
203 *p++ = (unsigned char)( ( enc_len >> 8 ) & 0xFF );
204 *p++ = (unsigned char)( ( enc_len ) & 0xFF );
205 p = state + enc_len;
206
207 /* Compute and write MAC */
208 memset( p, 0, 32 );
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200209 p += 32;
210
211 *tlen = p - start;
212
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200213 SSL_DEBUG_BUF( 3, "session ticket structure", start, *tlen );
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200214
215 return( 0 );
216}
217
218/*
219 * Load session ticket (see ssl_write_ticket for structure)
220 */
221static int ssl_parse_ticket( ssl_context *ssl,
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200222 unsigned char *buf,
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200223 size_t len )
224{
225 int ret;
226 ssl_session session;
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200227 unsigned char *key_name = buf;
228 unsigned char *iv = buf + 16;
229 unsigned char *enc_len_p = iv + 16;
230 unsigned char *ticket = enc_len_p + 2;
231 unsigned char *mac;
232 size_t enc_len, clear_len, i;
233 unsigned char pad_len;
234
235 SSL_DEBUG_BUF( 3, "session ticket structure", buf, len );
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200236
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +0200237 if( len < 34 || ssl->ticket_keys == NULL )
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200238 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
239
240 enc_len = ( enc_len_p[0] << 8 ) | enc_len_p[1];
241 mac = ticket + enc_len;
242
243 if( len != enc_len + 66 )
244 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
245
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200246 /* Check name */
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +0200247 if( memcmp( key_name, ssl->ticket_keys->key_name, 16 ) != 0 )
248 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200249
250 // TODO: check hmac
251 (void) mac;
252
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200253 /* Decrypt */
254 if( ( ret = aes_crypt_cbc( &ssl->ticket_keys->dec, AES_DECRYPT,
255 enc_len, iv, ticket, ticket ) ) != 0 )
256 {
257 return( ret );
258 }
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200259
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200260 /* Check PKCS padding */
261 pad_len = ticket[enc_len - 1];
262
263 ret = 0;
264 for( i = 2; i < pad_len; i++ )
265 if( ticket[enc_len - i] != pad_len )
266 ret = POLARSSL_ERR_SSL_BAD_INPUT_DATA;
267 if( ret != 0 )
268 return( ret );
269
270 clear_len = enc_len - pad_len;
271
272 SSL_DEBUG_BUF( 3, "session ticket cleartext", ticket, clear_len );
273
274 /* Actually load session */
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200275 if( ( ret = ssl_load_session( &session, ticket, clear_len ) ) != 0 )
276 {
277 SSL_DEBUG_MSG( 1, ( "failed to parse ticket content" ) );
278 memset( &session, 0, sizeof( ssl_session ) );
279 return( ret );
280 }
281
282 /*
283 * Keep the session ID sent by the client, since we MUST send it back to
284 * inform him we're accepting the ticket (RFC 5077 section 3.4)
285 */
286 session.length = ssl->session_negotiate->length;
287 memcpy( &session.id, ssl->session_negotiate->id, session.length );
288
289 ssl_session_free( ssl->session_negotiate );
290 memcpy( ssl->session_negotiate, &session, sizeof( ssl_session ) );
291 memset( &session, 0, sizeof( ssl_session ) );
292
293 return( 0 );
294}
295
Paul Bakker5701cdc2012-09-27 21:49:42 +0000296static int ssl_parse_servername_ext( ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +0000297 const unsigned char *buf,
Paul Bakker5701cdc2012-09-27 21:49:42 +0000298 size_t len )
299{
300 int ret;
301 size_t servername_list_size, hostname_len;
Paul Bakker23f36802012-09-28 14:15:14 +0000302 const unsigned char *p;
Paul Bakker5701cdc2012-09-27 21:49:42 +0000303
304 servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
305 if( servername_list_size + 2 != len )
306 {
307 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
308 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
309 }
310
311 p = buf + 2;
312 while( servername_list_size > 0 )
313 {
314 hostname_len = ( ( p[1] << 8 ) | p[2] );
315 if( hostname_len + 3 > servername_list_size )
316 {
317 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
318 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
319 }
320
321 if( p[0] == TLS_EXT_SERVERNAME_HOSTNAME )
322 {
323 ret = ssl->f_sni( ssl->p_sni, ssl, p + 3, hostname_len );
324 if( ret != 0 )
325 {
326 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
327 SSL_ALERT_MSG_UNRECOGNIZED_NAME );
328 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
329 }
Paul Bakker81420ab2012-10-23 10:31:15 +0000330 return( 0 );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000331 }
332
333 servername_list_size -= hostname_len + 3;
Paul Bakker23f36802012-09-28 14:15:14 +0000334 p += hostname_len + 3;
335 }
336
337 if( servername_list_size != 0 )
338 {
339 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
340 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000341 }
342
343 return( 0 );
344}
345
Paul Bakker48916f92012-09-16 19:57:18 +0000346static int ssl_parse_renegotiation_info( ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +0000347 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +0000348 size_t len )
349{
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000350 int ret;
351
Paul Bakker48916f92012-09-16 19:57:18 +0000352 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
353 {
354 if( len != 1 || buf[0] != 0x0 )
355 {
356 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000357
358 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
359 return( ret );
360
Paul Bakker48916f92012-09-16 19:57:18 +0000361 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
362 }
363
364 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
365 }
366 else
367 {
368 if( len != 1 + ssl->verify_data_len ||
369 buf[0] != ssl->verify_data_len ||
370 memcmp( buf + 1, ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
371 {
372 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000373
374 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
375 return( ret );
376
Paul Bakker48916f92012-09-16 19:57:18 +0000377 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
378 }
379 }
380
381 return( 0 );
382}
383
Paul Bakker23f36802012-09-28 14:15:14 +0000384static int ssl_parse_signature_algorithms_ext( ssl_context *ssl,
385 const unsigned char *buf,
386 size_t len )
387{
388 size_t sig_alg_list_size;
389 const unsigned char *p;
390
391 sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
392 if( sig_alg_list_size + 2 != len ||
393 sig_alg_list_size %2 != 0 )
394 {
395 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
396 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
397 }
398
399 p = buf + 2;
400 while( sig_alg_list_size > 0 )
401 {
402 if( p[1] != SSL_SIG_RSA )
Paul Bakker8611e732012-10-30 07:52:29 +0000403 {
404 sig_alg_list_size -= 2;
405 p += 2;
Paul Bakker23f36802012-09-28 14:15:14 +0000406 continue;
Paul Bakker8611e732012-10-30 07:52:29 +0000407 }
Paul Bakker9e36f042013-06-30 14:34:05 +0200408#if defined(POLARSSL_SHA512_C)
Paul Bakker23f36802012-09-28 14:15:14 +0000409 if( p[0] == SSL_HASH_SHA512 )
410 {
411 ssl->handshake->sig_alg = SSL_HASH_SHA512;
412 break;
413 }
414 if( p[0] == SSL_HASH_SHA384 )
415 {
416 ssl->handshake->sig_alg = SSL_HASH_SHA384;
417 break;
418 }
419#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200420#if defined(POLARSSL_SHA256_C)
Paul Bakker23f36802012-09-28 14:15:14 +0000421 if( p[0] == SSL_HASH_SHA256 )
422 {
423 ssl->handshake->sig_alg = SSL_HASH_SHA256;
424 break;
425 }
426 if( p[0] == SSL_HASH_SHA224 )
427 {
428 ssl->handshake->sig_alg = SSL_HASH_SHA224;
429 break;
430 }
431#endif
432 if( p[0] == SSL_HASH_SHA1 )
433 {
434 ssl->handshake->sig_alg = SSL_HASH_SHA1;
435 break;
436 }
437 if( p[0] == SSL_HASH_MD5 )
438 {
439 ssl->handshake->sig_alg = SSL_HASH_MD5;
440 break;
441 }
442
443 sig_alg_list_size -= 2;
444 p += 2;
445 }
446
447 SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d",
448 ssl->handshake->sig_alg ) );
449
450 return( 0 );
451}
452
Paul Bakker41c83d32013-03-20 14:39:14 +0100453#if defined(POLARSSL_ECP_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200454static int ssl_parse_supported_elliptic_curves( ssl_context *ssl,
455 const unsigned char *buf,
456 size_t len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100457{
458 size_t list_size;
459 const unsigned char *p;
460
461 list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
462 if( list_size + 2 != len ||
463 list_size % 2 != 0 )
464 {
465 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
466 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
467 }
468
469 p = buf + 2;
470 while( list_size > 0 )
471 {
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200472#if defined(POLARSSL_ECP_DP_SECP192R1_ENABLED)
473 if( p[0] == 0x00 && p[1] == POLARSSL_ECP_DP_SECP192R1 )
Paul Bakker41c83d32013-03-20 14:39:14 +0100474 {
475 ssl->handshake->ec_curve = p[1];
476 return( 0 );
477 }
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200478#endif
479#if defined(POLARSSL_ECP_DP_SECP224R1_ENABLED)
480 if( p[0] == 0x00 && p[1] == POLARSSL_ECP_DP_SECP224R1 )
481 {
482 ssl->handshake->ec_curve = p[1];
483 return( 0 );
484 }
485#endif
486#if defined(POLARSSL_ECP_DP_SECP256R1_ENABLED)
487 if( p[0] == 0x00 && p[1] == POLARSSL_ECP_DP_SECP256R1 )
488 {
489 ssl->handshake->ec_curve = p[1];
490 return( 0 );
491 }
492#endif
493#if defined(POLARSSL_ECP_DP_SECP384R1_ENABLED)
494 if( p[0] == 0x00 && p[1] == POLARSSL_ECP_DP_SECP384R1 )
495 {
496 ssl->handshake->ec_curve = p[1];
497 return( 0 );
498 }
499#endif
500#if defined(POLARSSL_ECP_DP_SECP521R1_ENABLED)
501 if( p[0] == 0x00 && p[1] == POLARSSL_ECP_DP_SECP521R1 )
502 {
503 ssl->handshake->ec_curve = p[1];
504 return( 0 );
505 }
506#endif
Paul Bakker41c83d32013-03-20 14:39:14 +0100507
508 list_size -= 2;
509 p += 2;
510 }
511
512 return( 0 );
513}
514
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200515static int ssl_parse_supported_point_formats( ssl_context *ssl,
516 const unsigned char *buf,
517 size_t len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100518{
519 size_t list_size;
520 const unsigned char *p;
521
522 list_size = buf[0];
523 if( list_size + 1 != len )
524 {
525 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
526 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
527 }
528
529 p = buf + 2;
530 while( list_size > 0 )
531 {
532 if( p[0] == POLARSSL_ECP_PF_UNCOMPRESSED ||
533 p[0] == POLARSSL_ECP_PF_COMPRESSED )
534 {
535 ssl->handshake->ec_point_format = p[0];
536 return( 0 );
537 }
538
539 list_size--;
540 p++;
541 }
542
543 return( 0 );
544}
545#endif /* POLARSSL_ECP_C */
546
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200547static int ssl_parse_max_fragment_length_ext( ssl_context *ssl,
548 const unsigned char *buf,
549 size_t len )
550{
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200551 if( len != 1 || buf[0] >= SSL_MAX_FRAG_LEN_INVALID )
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200552 {
553 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
554 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
555 }
556
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200557 ssl->session_negotiate->mfl_code = buf[0];
558
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200559 return( 0 );
560}
561
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200562static int ssl_parse_truncated_hmac_ext( ssl_context *ssl,
563 const unsigned char *buf,
564 size_t len )
565{
566 if( len != 0 )
567 {
568 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
569 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
570 }
571
572 ((void) buf);
573
574 ssl->session_negotiate->trunc_hmac = SSL_TRUNC_HMAC_ENABLED;
575
576 return( 0 );
577}
578
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200579static int ssl_parse_session_ticket_ext( ssl_context *ssl,
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200580 unsigned char *buf,
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200581 size_t len )
582{
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200583 int ret;
584
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200585 if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED )
586 return( 0 );
587
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200588 /* Remember the client asked us to send a new ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200589 ssl->handshake->new_session_ticket = 1;
590
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200591 SSL_DEBUG_MSG( 3, ( "ticket length: %d", len ) );
592
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200593 if( len == 0 )
594 return( 0 );
595
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200596 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE )
597 {
598 SSL_DEBUG_MSG( 3, ( "ticket rejected: renegotiating" ) );
599 return( 0 );
600 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200601
602 /*
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200603 * Failures are ok: just ignore the ticket and proceed.
604 */
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200605 if( ( ret = ssl_parse_ticket( ssl, buf, len ) ) != 0 )
606 {
607 SSL_DEBUG_RET( 1, "ssl_parse_ticket", ret );
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200608 return( 0 );
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +0200609 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200610
611 SSL_DEBUG_MSG( 3, ( "session successfully restored from ticket" ) );
612
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200613 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200614
Manuel Pégourié-Gonnard306827e2013-08-02 18:05:14 +0200615 /* Don't send a new ticket after all, this one is OK */
616 ssl->handshake->new_session_ticket = 0;
617
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200618 return( 0 );
619}
620
Paul Bakker78a8c712013-03-06 17:01:52 +0100621#if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
622static int ssl_parse_client_hello_v2( ssl_context *ssl )
623{
624 int ret;
625 unsigned int i, j;
626 size_t n;
627 unsigned int ciph_len, sess_len, chal_len;
628 unsigned char *buf, *p;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200629 const int *ciphersuites;
Paul Bakker59c28a22013-06-29 15:33:42 +0200630 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker78a8c712013-03-06 17:01:52 +0100631
632 SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) );
633
634 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE )
635 {
636 SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) );
637
638 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
639 return( ret );
640
641 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
642 }
643
644 buf = ssl->in_hdr;
645
646 SSL_DEBUG_BUF( 4, "record header", buf, 5 );
647
648 SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d",
649 buf[2] ) );
650 SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d",
651 ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) );
652 SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]",
653 buf[3], buf[4] ) );
654
655 /*
656 * SSLv2 Client Hello
657 *
658 * Record layer:
659 * 0 . 1 message length
660 *
661 * SSL layer:
662 * 2 . 2 message type
663 * 3 . 4 protocol version
664 */
665 if( buf[2] != SSL_HS_CLIENT_HELLO ||
666 buf[3] != SSL_MAJOR_VERSION_3 )
667 {
668 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
669 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
670 }
671
672 n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF;
673
674 if( n < 17 || n > 512 )
675 {
676 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
677 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
678 }
679
680 ssl->major_ver = SSL_MAJOR_VERSION_3;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200681 ssl->minor_ver = ( buf[4] <= ssl->max_minor_ver )
682 ? buf[4] : ssl->max_minor_ver;
Paul Bakker78a8c712013-03-06 17:01:52 +0100683
684 if( ssl->minor_ver < ssl->min_minor_ver )
685 {
686 SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
687 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
688 ssl->min_major_ver, ssl->min_minor_ver ) );
689
690 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
691 SSL_ALERT_MSG_PROTOCOL_VERSION );
692 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
693 }
694
Paul Bakker2fbefde2013-06-29 16:01:15 +0200695 ssl->handshake->max_major_ver = buf[3];
696 ssl->handshake->max_minor_ver = buf[4];
Paul Bakker78a8c712013-03-06 17:01:52 +0100697
698 if( ( ret = ssl_fetch_input( ssl, 2 + n ) ) != 0 )
699 {
700 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
701 return( ret );
702 }
703
704 ssl->handshake->update_checksum( ssl, buf + 2, n );
705
706 buf = ssl->in_msg;
707 n = ssl->in_left - 5;
708
709 /*
710 * 0 . 1 ciphersuitelist length
711 * 2 . 3 session id length
712 * 4 . 5 challenge length
713 * 6 . .. ciphersuitelist
714 * .. . .. session id
715 * .. . .. challenge
716 */
717 SSL_DEBUG_BUF( 4, "record contents", buf, n );
718
719 ciph_len = ( buf[0] << 8 ) | buf[1];
720 sess_len = ( buf[2] << 8 ) | buf[3];
721 chal_len = ( buf[4] << 8 ) | buf[5];
722
723 SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d",
724 ciph_len, sess_len, chal_len ) );
725
726 /*
727 * Make sure each parameter length is valid
728 */
729 if( ciph_len < 3 || ( ciph_len % 3 ) != 0 )
730 {
731 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
732 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
733 }
734
735 if( sess_len > 32 )
736 {
737 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
738 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
739 }
740
741 if( chal_len < 8 || chal_len > 32 )
742 {
743 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
744 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
745 }
746
747 if( n != 6 + ciph_len + sess_len + chal_len )
748 {
749 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
750 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
751 }
752
753 SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
754 buf + 6, ciph_len );
755 SSL_DEBUG_BUF( 3, "client hello, session id",
756 buf + 6 + ciph_len, sess_len );
757 SSL_DEBUG_BUF( 3, "client hello, challenge",
758 buf + 6 + ciph_len + sess_len, chal_len );
759
760 p = buf + 6 + ciph_len;
761 ssl->session_negotiate->length = sess_len;
762 memset( ssl->session_negotiate->id, 0, sizeof( ssl->session_negotiate->id ) );
763 memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->length );
764
765 p += sess_len;
766 memset( ssl->handshake->randbytes, 0, 64 );
767 memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len );
768
769 /*
770 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
771 */
772 for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )
773 {
774 if( p[0] == 0 && p[1] == 0 && p[2] == SSL_EMPTY_RENEGOTIATION_INFO )
775 {
776 SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
777 if( ssl->renegotiation == SSL_RENEGOTIATION )
778 {
779 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
780
781 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
782 return( ret );
783
784 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
785 }
786 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
787 break;
788 }
789 }
790
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200791 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
792 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker78a8c712013-03-06 17:01:52 +0100793 {
794 for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
795 {
Paul Bakker41c83d32013-03-20 14:39:14 +0100796 // Only allow non-ECC ciphersuites as we do not have extensions
797 //
Paul Bakker59c28a22013-06-29 15:33:42 +0200798 if( p[0] == 0 && p[1] == 0 &&
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200799 ( ( ciphersuites[i] >> 8 ) & 0xFF ) == 0 &&
800 p[2] == ( ciphersuites[i] & 0xFF ) )
Paul Bakker59c28a22013-06-29 15:33:42 +0200801 {
802 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
803
804 if( ciphersuite_info == NULL )
805 {
806 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
807 ciphersuites[i] ) );
808 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
809 }
810
Paul Bakker2fbefde2013-06-29 16:01:15 +0200811 if( ciphersuite_info->min_minor_ver > ssl->minor_ver ||
812 ciphersuite_info->max_minor_ver < ssl->minor_ver )
813 continue;
Paul Bakker59c28a22013-06-29 15:33:42 +0200814
Paul Bakker78a8c712013-03-06 17:01:52 +0100815 goto have_ciphersuite_v2;
Paul Bakker59c28a22013-06-29 15:33:42 +0200816 }
Paul Bakker78a8c712013-03-06 17:01:52 +0100817 }
818 }
819
820 SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
821
822 return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
823
824have_ciphersuite_v2:
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200825 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Paul Bakker59c28a22013-06-29 15:33:42 +0200826 ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +0100827 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
Paul Bakker78a8c712013-03-06 17:01:52 +0100828
829 /*
830 * SSLv2 Client Hello relevant renegotiation security checks
831 */
832 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
833 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
834 {
835 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
836
837 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
838 return( ret );
839
840 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
841 }
842
843 ssl->in_left = 0;
844 ssl->state++;
845
846 SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) );
847
848 return( 0 );
849}
850#endif /* POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
851
Paul Bakker5121ce52009-01-03 21:22:43 +0000852static int ssl_parse_client_hello( ssl_context *ssl )
853{
Paul Bakker23986e52011-04-24 08:57:21 +0000854 int ret;
855 unsigned int i, j;
856 size_t n;
857 unsigned int ciph_len, sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +0000858 unsigned int comp_len;
Paul Bakker48916f92012-09-16 19:57:18 +0000859 unsigned int ext_len = 0;
860 unsigned char *buf, *p, *ext;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000861 int renegotiation_info_seen = 0;
862 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200863 const int *ciphersuites;
Paul Bakker41c83d32013-03-20 14:39:14 +0100864 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000865
866 SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
867
Paul Bakker48916f92012-09-16 19:57:18 +0000868 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
869 ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000870 {
871 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
872 return( ret );
873 }
874
875 buf = ssl->in_hdr;
876
Paul Bakker78a8c712013-03-06 17:01:52 +0100877#if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
878 if( ( buf[0] & 0x80 ) != 0 )
879 return ssl_parse_client_hello_v2( ssl );
880#endif
881
Paul Bakkerec636f32012-09-09 19:17:02 +0000882 SSL_DEBUG_BUF( 4, "record header", buf, 5 );
883
884 SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d",
885 buf[0] ) );
886 SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d",
887 ( buf[3] << 8 ) | buf[4] ) );
888 SSL_DEBUG_MSG( 3, ( "client hello v3, protocol ver: [%d:%d]",
889 buf[1], buf[2] ) );
890
891 /*
892 * SSLv3 Client Hello
893 *
894 * Record layer:
895 * 0 . 0 message type
896 * 1 . 2 protocol version
897 * 3 . 4 message length
898 */
899 if( buf[0] != SSL_MSG_HANDSHAKE ||
900 buf[1] != SSL_MAJOR_VERSION_3 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000901 {
Paul Bakkerec636f32012-09-09 19:17:02 +0000902 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
903 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
904 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000905
Paul Bakkerec636f32012-09-09 19:17:02 +0000906 n = ( buf[3] << 8 ) | buf[4];
Paul Bakker5121ce52009-01-03 21:22:43 +0000907
Manuel Pégourié-Gonnard72882b22013-08-02 13:36:00 +0200908 if( n < 45 || n > 2048 )
Paul Bakkerec636f32012-09-09 19:17:02 +0000909 {
910 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
911 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
912 }
913
Paul Bakker48916f92012-09-16 19:57:18 +0000914 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
915 ( ret = ssl_fetch_input( ssl, 5 + n ) ) != 0 )
Paul Bakkerec636f32012-09-09 19:17:02 +0000916 {
917 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
918 return( ret );
919 }
920
921 buf = ssl->in_msg;
Paul Bakker48916f92012-09-16 19:57:18 +0000922 if( !ssl->renegotiation )
923 n = ssl->in_left - 5;
924 else
925 n = ssl->in_msglen;
Paul Bakkerec636f32012-09-09 19:17:02 +0000926
Paul Bakker48916f92012-09-16 19:57:18 +0000927 ssl->handshake->update_checksum( ssl, buf, n );
Paul Bakkerec636f32012-09-09 19:17:02 +0000928
929 /*
930 * SSL layer:
931 * 0 . 0 handshake type
932 * 1 . 3 handshake length
933 * 4 . 5 protocol version
934 * 6 . 9 UNIX time()
935 * 10 . 37 random bytes
936 * 38 . 38 session id length
937 * 39 . 38+x session id
938 * 39+x . 40+x ciphersuitelist length
939 * 41+x . .. ciphersuitelist
940 * .. . .. compression alg.
941 * .. . .. extensions
942 */
943 SSL_DEBUG_BUF( 4, "record contents", buf, n );
944
945 SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d",
946 buf[0] ) );
947 SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d",
948 ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) );
949 SSL_DEBUG_MSG( 3, ( "client hello v3, max. version: [%d:%d]",
950 buf[4], buf[5] ) );
951
952 /*
953 * Check the handshake type and protocol version
954 */
955 if( buf[0] != SSL_HS_CLIENT_HELLO ||
956 buf[4] != SSL_MAJOR_VERSION_3 )
957 {
958 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
959 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
960 }
961
962 ssl->major_ver = SSL_MAJOR_VERSION_3;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200963 ssl->minor_ver = ( buf[5] <= ssl->max_minor_ver )
964 ? buf[5] : ssl->max_minor_ver;
Paul Bakkerec636f32012-09-09 19:17:02 +0000965
Paul Bakker1d29fb52012-09-28 13:28:45 +0000966 if( ssl->minor_ver < ssl->min_minor_ver )
967 {
968 SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
969 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
Paul Bakker81420ab2012-10-23 10:31:15 +0000970 ssl->min_major_ver, ssl->min_minor_ver ) );
Paul Bakker1d29fb52012-09-28 13:28:45 +0000971
972 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
973 SSL_ALERT_MSG_PROTOCOL_VERSION );
974
975 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
976 }
977
Paul Bakker2fbefde2013-06-29 16:01:15 +0200978 ssl->handshake->max_major_ver = buf[4];
979 ssl->handshake->max_minor_ver = buf[5];
Paul Bakkerec636f32012-09-09 19:17:02 +0000980
Paul Bakker48916f92012-09-16 19:57:18 +0000981 memcpy( ssl->handshake->randbytes, buf + 6, 32 );
Paul Bakkerec636f32012-09-09 19:17:02 +0000982
983 /*
984 * Check the handshake message length
985 */
986 if( buf[1] != 0 || n != (unsigned int) 4 + ( ( buf[2] << 8 ) | buf[3] ) )
987 {
988 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
989 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
990 }
991
992 /*
993 * Check the session length
994 */
995 sess_len = buf[38];
996
997 if( sess_len > 32 )
998 {
999 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1000 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
1001 }
1002
Paul Bakker48916f92012-09-16 19:57:18 +00001003 ssl->session_negotiate->length = sess_len;
1004 memset( ssl->session_negotiate->id, 0,
1005 sizeof( ssl->session_negotiate->id ) );
1006 memcpy( ssl->session_negotiate->id, buf + 39,
1007 ssl->session_negotiate->length );
Paul Bakkerec636f32012-09-09 19:17:02 +00001008
1009 /*
1010 * Check the ciphersuitelist length
1011 */
1012 ciph_len = ( buf[39 + sess_len] << 8 )
1013 | ( buf[40 + sess_len] );
1014
1015 if( ciph_len < 2 || ciph_len > 256 || ( ciph_len % 2 ) != 0 )
1016 {
1017 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1018 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
1019 }
1020
1021 /*
1022 * Check the compression algorithms length
1023 */
1024 comp_len = buf[41 + sess_len + ciph_len];
1025
1026 if( comp_len < 1 || comp_len > 16 )
1027 {
1028 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1029 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
1030 }
1031
Paul Bakker48916f92012-09-16 19:57:18 +00001032 /*
1033 * Check the extension length
1034 */
1035 if( n > 42 + sess_len + ciph_len + comp_len )
1036 {
1037 ext_len = ( buf[42 + sess_len + ciph_len + comp_len] << 8 )
1038 | ( buf[43 + sess_len + ciph_len + comp_len] );
1039
1040 if( ( ext_len > 0 && ext_len < 4 ) ||
1041 n != 44 + sess_len + ciph_len + comp_len + ext_len )
1042 {
1043 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1044 SSL_DEBUG_BUF( 3, "Ext", buf + 44 + sess_len + ciph_len + comp_len, ext_len);
1045 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
1046 }
1047 }
1048
1049 ssl->session_negotiate->compression = SSL_COMPRESS_NULL;
Paul Bakkerec636f32012-09-09 19:17:02 +00001050#if defined(POLARSSL_ZLIB_SUPPORT)
1051 for( i = 0; i < comp_len; ++i )
1052 {
Paul Bakker48916f92012-09-16 19:57:18 +00001053 if( buf[42 + sess_len + ciph_len + i] == SSL_COMPRESS_DEFLATE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001054 {
Paul Bakker48916f92012-09-16 19:57:18 +00001055 ssl->session_negotiate->compression = SSL_COMPRESS_DEFLATE;
Paul Bakkerec636f32012-09-09 19:17:02 +00001056 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001057 }
1058 }
Paul Bakker2770fbd2012-07-03 13:30:23 +00001059#endif
1060
Paul Bakkerec636f32012-09-09 19:17:02 +00001061 SSL_DEBUG_BUF( 3, "client hello, random bytes",
1062 buf + 6, 32 );
1063 SSL_DEBUG_BUF( 3, "client hello, session id",
1064 buf + 38, sess_len );
1065 SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
1066 buf + 41 + sess_len, ciph_len );
1067 SSL_DEBUG_BUF( 3, "client hello, compression",
1068 buf + 42 + sess_len + ciph_len, comp_len );
Paul Bakker5121ce52009-01-03 21:22:43 +00001069
Paul Bakkerec636f32012-09-09 19:17:02 +00001070 /*
Paul Bakker48916f92012-09-16 19:57:18 +00001071 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1072 */
1073 for( i = 0, p = buf + 41 + sess_len; i < ciph_len; i += 2, p += 2 )
1074 {
1075 if( p[0] == 0 && p[1] == SSL_EMPTY_RENEGOTIATION_INFO )
1076 {
1077 SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
1078 if( ssl->renegotiation == SSL_RENEGOTIATION )
1079 {
1080 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001081
1082 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
1083 return( ret );
1084
Paul Bakker48916f92012-09-16 19:57:18 +00001085 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
1086 }
1087 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
1088 break;
1089 }
1090 }
1091
Paul Bakker48916f92012-09-16 19:57:18 +00001092 ext = buf + 44 + sess_len + ciph_len + comp_len;
Paul Bakker48916f92012-09-16 19:57:18 +00001093
1094 while( ext_len )
1095 {
1096 unsigned int ext_id = ( ( ext[0] << 8 )
1097 | ( ext[1] ) );
1098 unsigned int ext_size = ( ( ext[2] << 8 )
1099 | ( ext[3] ) );
1100
1101 if( ext_size + 4 > ext_len )
1102 {
1103 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1104 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
1105 }
1106 switch( ext_id )
1107 {
Paul Bakker5701cdc2012-09-27 21:49:42 +00001108 case TLS_EXT_SERVERNAME:
1109 SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
1110 if( ssl->f_sni == NULL )
1111 break;
1112
1113 ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size );
1114 if( ret != 0 )
1115 return( ret );
1116 break;
1117
Paul Bakker48916f92012-09-16 19:57:18 +00001118 case TLS_EXT_RENEGOTIATION_INFO:
1119 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
1120 renegotiation_info_seen = 1;
1121
Paul Bakker23f36802012-09-28 14:15:14 +00001122 ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size );
1123 if( ret != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001124 return( ret );
Paul Bakker23f36802012-09-28 14:15:14 +00001125 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001126
Paul Bakker23f36802012-09-28 14:15:14 +00001127 case TLS_EXT_SIG_ALG:
1128 SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
1129 if( ssl->renegotiation == SSL_RENEGOTIATION )
1130 break;
1131
1132 ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size );
1133 if( ret != 0 )
1134 return( ret );
Paul Bakker48916f92012-09-16 19:57:18 +00001135 break;
1136
Paul Bakker41c83d32013-03-20 14:39:14 +01001137#if defined(POLARSSL_ECP_C)
1138 case TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
1139 SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
1140
1141 ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size );
1142 if( ret != 0 )
1143 return( ret );
1144 break;
1145
1146 case TLS_EXT_SUPPORTED_POINT_FORMATS:
1147 SSL_DEBUG_MSG( 3, ( "found supported point formats extension" ) );
1148
1149 ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size );
1150 if( ret != 0 )
1151 return( ret );
1152 break;
1153#endif /* POLARSSL_ECP_C */
1154
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001155 case TLS_EXT_MAX_FRAGMENT_LENGTH:
1156 SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) );
1157
1158 ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size );
1159 if( ret != 0 )
1160 return( ret );
1161 break;
1162
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001163 case TLS_EXT_TRUNCATED_HMAC:
1164 SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) );
1165
1166 ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size );
1167 if( ret != 0 )
1168 return( ret );
1169 break;
1170
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001171 case TLS_EXT_SESSION_TICKET:
1172 SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) );
1173
1174 ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size );
1175 if( ret != 0 )
1176 return( ret );
1177 break;
1178
Paul Bakker48916f92012-09-16 19:57:18 +00001179 default:
1180 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
1181 ext_id ) );
1182 }
1183
1184 ext_len -= 4 + ext_size;
1185 ext += 4 + ext_size;
1186
1187 if( ext_len > 0 && ext_len < 4 )
1188 {
1189 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1190 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
1191 }
1192 }
1193
1194 /*
1195 * Renegotiation security checks
1196 */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001197 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1198 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
1199 {
1200 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
1201 handshake_failure = 1;
1202 }
1203 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1204 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
1205 renegotiation_info_seen == 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001206 {
1207 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001208 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +00001209 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001210 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1211 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1212 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00001213 {
1214 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001215 handshake_failure = 1;
1216 }
1217 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1218 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1219 renegotiation_info_seen == 1 )
1220 {
1221 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
1222 handshake_failure = 1;
1223 }
1224
1225 if( handshake_failure == 1 )
1226 {
1227 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
1228 return( ret );
1229
Paul Bakker48916f92012-09-16 19:57:18 +00001230 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
1231 }
Paul Bakker380da532012-04-18 16:10:25 +00001232
Paul Bakker41c83d32013-03-20 14:39:14 +01001233 /*
1234 * Search for a matching ciphersuite
1235 * (At the end because we need information from the EC-based extensions)
1236 */
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001237 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
1238 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker41c83d32013-03-20 14:39:14 +01001239 {
1240 for( j = 0, p = buf + 41 + sess_len; j < ciph_len;
1241 j += 2, p += 2 )
1242 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001243 if( p[0] == ( ( ciphersuites[i] >> 8 ) & 0xFF ) &&
1244 p[1] == ( ( ciphersuites[i] ) & 0xFF ) )
Paul Bakker41c83d32013-03-20 14:39:14 +01001245 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001246 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
Paul Bakker41c83d32013-03-20 14:39:14 +01001247
1248 if( ciphersuite_info == NULL )
1249 {
1250 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001251 ciphersuites[i] ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001252 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1253 }
1254
Paul Bakker2fbefde2013-06-29 16:01:15 +02001255 if( ciphersuite_info->min_minor_ver > ssl->minor_ver ||
1256 ciphersuite_info->max_minor_ver < ssl->minor_ver )
1257 continue;
1258
Paul Bakker41c83d32013-03-20 14:39:14 +01001259 if( ( ciphersuite_info->flags & POLARSSL_CIPHERSUITE_EC ) &&
1260 ssl->handshake->ec_curve == 0 )
1261 continue;
1262
1263 goto have_ciphersuite;
1264 }
1265 }
1266 }
1267
1268 SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
1269
1270 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
1271 return( ret );
1272
1273 return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
1274
1275have_ciphersuite:
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001276 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Paul Bakker41c83d32013-03-20 14:39:14 +01001277 ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
1278 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
1279
Paul Bakker5121ce52009-01-03 21:22:43 +00001280 ssl->in_left = 0;
1281 ssl->state++;
1282
1283 SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
1284
1285 return( 0 );
1286}
1287
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001288static void ssl_write_truncated_hmac_ext( ssl_context *ssl,
1289 unsigned char *buf,
1290 size_t *olen )
1291{
1292 unsigned char *p = buf;
1293
1294 if( ssl->session_negotiate->trunc_hmac == SSL_TRUNC_HMAC_DISABLED )
1295 {
1296 *olen = 0;
1297 return;
1298 }
1299
1300 SSL_DEBUG_MSG( 3, ( "server hello, adding truncated hmac extension" ) );
1301
1302 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
1303 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
1304
1305 *p++ = 0x00;
1306 *p++ = 0x00;
1307
1308 *olen = 4;
1309}
1310
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001311static void ssl_write_session_ticket_ext( ssl_context *ssl,
1312 unsigned char *buf,
1313 size_t *olen )
1314{
1315 unsigned char *p = buf;
1316
1317 if( ssl->handshake->new_session_ticket == 0 )
1318 {
1319 *olen = 0;
1320 return;
1321 }
1322
1323 SSL_DEBUG_MSG( 3, ( "server hello, adding session ticket extension" ) );
1324
1325 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
1326 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET ) & 0xFF );
1327
1328 *p++ = 0x00;
1329 *p++ = 0x00;
1330
1331 *olen = 4;
1332}
1333
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001334static void ssl_write_renegotiation_ext( ssl_context *ssl,
1335 unsigned char *buf,
1336 size_t *olen )
1337{
1338 unsigned char *p = buf;
1339
1340 if( ssl->secure_renegotiation != SSL_SECURE_RENEGOTIATION )
1341 {
1342 *olen = 0;
1343 return;
1344 }
1345
1346 SSL_DEBUG_MSG( 3, ( "server hello, secure renegotiation extension" ) );
1347
1348 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
1349 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
1350
1351 *p++ = 0x00;
1352 *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF;
1353 *p++ = ssl->verify_data_len * 2 & 0xFF;
1354
1355 memcpy( p, ssl->peer_verify_data, ssl->verify_data_len );
1356 p += ssl->verify_data_len;
1357 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
1358 p += ssl->verify_data_len;
1359
1360 *olen = 5 + ssl->verify_data_len * 2;
1361}
1362
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001363static void ssl_write_max_fragment_length_ext( ssl_context *ssl,
1364 unsigned char *buf,
1365 size_t *olen )
1366{
1367 unsigned char *p = buf;
1368
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001369 if( ssl->session_negotiate->mfl_code == SSL_MAX_FRAG_LEN_NONE )
1370 {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001371 *olen = 0;
1372 return;
1373 }
1374
1375 SSL_DEBUG_MSG( 3, ( "server hello, max_fragment_length extension" ) );
1376
1377 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
1378 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
1379
1380 *p++ = 0x00;
1381 *p++ = 1;
1382
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001383 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001384
1385 *olen = 5;
1386}
1387
Paul Bakker5121ce52009-01-03 21:22:43 +00001388static int ssl_write_server_hello( ssl_context *ssl )
1389{
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001390#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +00001391 time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001392#endif
Paul Bakkera3d195c2011-11-27 21:07:34 +00001393 int ret, n;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001394 size_t olen, ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001395 unsigned char *buf, *p;
1396
1397 SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
1398
1399 /*
1400 * 0 . 0 handshake type
1401 * 1 . 3 handshake length
1402 * 4 . 5 protocol version
1403 * 6 . 9 UNIX time()
1404 * 10 . 37 random bytes
1405 */
1406 buf = ssl->out_msg;
1407 p = buf + 4;
1408
1409 *p++ = (unsigned char) ssl->major_ver;
1410 *p++ = (unsigned char) ssl->minor_ver;
1411
1412 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
1413 buf[4], buf[5] ) );
1414
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001415#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +00001416 t = time( NULL );
1417 *p++ = (unsigned char)( t >> 24 );
1418 *p++ = (unsigned char)( t >> 16 );
1419 *p++ = (unsigned char)( t >> 8 );
1420 *p++ = (unsigned char)( t );
1421
1422 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001423#else
1424 if( ( ret = ssl->f_rng( ssl->p_rng, p, 4 ) ) != 0 )
1425 return( ret );
1426
1427 p += 4;
1428#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001429
Paul Bakkera3d195c2011-11-27 21:07:34 +00001430 if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
1431 return( ret );
1432
1433 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +00001434
Paul Bakker48916f92012-09-16 19:57:18 +00001435 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001436
1437 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
1438
1439 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001440 * Resume is 0 by default, see ssl_handshake_init().
1441 * It may be already set to 1 by ssl_parse_session_ticket_ext().
1442 * If not, try looking up session ID in our cache.
Paul Bakker5121ce52009-01-03 21:22:43 +00001443 */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001444 if( ssl->handshake->resume == 0 &&
1445 ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02001446 ssl->session_negotiate->length != 0 &&
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001447 ssl->f_get_cache != NULL &&
1448 ssl->f_get_cache( ssl->p_get_cache, ssl->session_negotiate ) == 0 )
1449 {
1450 ssl->handshake->resume = 1;
1451 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001452
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001453 if( ssl->handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001454 {
1455 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001456 * New session, create a new session id,
1457 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00001458 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001459 ssl->state++;
1460
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001461 if( ssl->handshake->new_session_ticket == 0 )
1462 {
1463 ssl->session_negotiate->length = n = 32;
1464 if( ( ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id,
1465 n ) ) != 0 )
1466 return( ret );
1467 }
1468 else
1469 {
1470 ssl->session_negotiate->length = 0;
1471 memset( ssl->session_negotiate->id, 0, 32 );
1472 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001473 }
1474 else
1475 {
1476 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001477 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00001478 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001479 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001480
1481 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1482 {
1483 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1484 return( ret );
1485 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001486 }
1487
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001488 /*
1489 * 38 . 38 session id length
1490 * 39 . 38+n session id
1491 * 39+n . 40+n chosen ciphersuite
1492 * 41+n . 41+n chosen compression alg.
1493 * 42+n . 43+n extensions length
1494 * 44+n . 43+n+m extensions
1495 */
1496 *p++ = (unsigned char) ssl->session_negotiate->length;
Paul Bakker48916f92012-09-16 19:57:18 +00001497 memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->length );
1498 p += ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +00001499
1500 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
1501 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
1502 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +00001503 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001504
Paul Bakker48916f92012-09-16 19:57:18 +00001505 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 );
1506 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite );
1507 *p++ = (unsigned char)( ssl->session_negotiate->compression );
Paul Bakker5121ce52009-01-03 21:22:43 +00001508
Paul Bakkere3166ce2011-01-27 17:40:50 +00001509 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001510 ssl->session_negotiate->ciphersuite ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001511 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001512 ssl->session_negotiate->compression ) );
1513
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001514 /*
1515 * First write extensions, then the total length
1516 */
1517 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
1518 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00001519
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001520 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
1521 ext_len += olen;
1522
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001523 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
1524 ext_len += olen;
1525
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001526 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
1527 ext_len += olen;
1528
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001529 SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d", ext_len ) );
Paul Bakker48916f92012-09-16 19:57:18 +00001530
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001531 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
1532 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
1533 p += ext_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001534
1535 ssl->out_msglen = p - buf;
1536 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1537 ssl->out_msg[0] = SSL_HS_SERVER_HELLO;
1538
1539 ret = ssl_write_record( ssl );
1540
1541 SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
1542
1543 return( ret );
1544}
1545
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001546#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1547 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1548 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001549static int ssl_write_certificate_request( ssl_context *ssl )
1550{
Paul Bakkered27a042013-04-18 22:46:23 +02001551 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1552 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001553
1554 SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
1555
1556 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1557 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1558 {
1559 SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
1560 ssl->state++;
1561 return( 0 );
1562 }
1563
1564 return( ret );
1565}
1566#else
1567static int ssl_write_certificate_request( ssl_context *ssl )
1568{
1569 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1570 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker926af752012-11-23 13:38:07 +01001571 size_t n = 0, dn_size, total_dn_size;
Paul Bakker5121ce52009-01-03 21:22:43 +00001572 unsigned char *buf, *p;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001573 const x509_cert *crt;
Paul Bakker5121ce52009-01-03 21:22:43 +00001574
1575 SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
1576
1577 ssl->state++;
1578
Paul Bakkerfbb17802013-04-17 19:10:21 +02001579 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001580 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
Paul Bakkerfbb17802013-04-17 19:10:21 +02001581 ssl->authmode == SSL_VERIFY_NONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001582 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001583 SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001584 return( 0 );
1585 }
1586
1587 /*
1588 * 0 . 0 handshake type
1589 * 1 . 3 handshake length
1590 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01001591 * 5 .. m-1 cert types
1592 * m .. m+1 sig alg length (TLS 1.2 only)
1593 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001594 * n .. n+1 length of all DNs
1595 * n+2 .. n+3 length of DN 1
1596 * n+4 .. ... Distinguished Name #1
1597 * ... .. ... length of DN 2, etc.
1598 */
1599 buf = ssl->out_msg;
1600 p = buf + 4;
1601
1602 /*
1603 * At the moment, only RSA certificates are supported
1604 */
1605 *p++ = 1;
Paul Bakker926af752012-11-23 13:38:07 +01001606 *p++ = SSL_CERT_TYPE_RSA_SIGN;
1607
1608 /*
1609 * Add signature_algorithms for verify (TLS 1.2)
1610 * Only add current running algorithm that is already required for
1611 * requested ciphersuite.
1612 *
1613 * Length is always 2
1614 */
Paul Bakker21dca692013-01-03 11:41:08 +01001615 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01001616 {
1617 ssl->handshake->verify_sig_alg = SSL_HASH_SHA256;
1618
1619 *p++ = 0;
1620 *p++ = 2;
1621
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001622 if( ssl->transform_negotiate->ciphersuite_info->mac ==
1623 POLARSSL_MD_SHA384 )
Paul Bakker926af752012-11-23 13:38:07 +01001624 {
1625 ssl->handshake->verify_sig_alg = SSL_HASH_SHA384;
1626 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001627
Paul Bakker926af752012-11-23 13:38:07 +01001628 *p++ = ssl->handshake->verify_sig_alg;
1629 *p++ = SSL_SIG_RSA;
1630
1631 n += 4;
1632 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001633
1634 p += 2;
1635 crt = ssl->ca_chain;
1636
Paul Bakkerbc3d9842012-11-26 16:12:02 +01001637 total_dn_size = 0;
Paul Bakker29087132010-03-21 21:03:34 +00001638 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001639 {
1640 if( p - buf > 4096 )
1641 break;
1642
Paul Bakker926af752012-11-23 13:38:07 +01001643 dn_size = crt->subject_raw.len;
1644 *p++ = (unsigned char)( dn_size >> 8 );
1645 *p++ = (unsigned char)( dn_size );
1646 memcpy( p, crt->subject_raw.p, dn_size );
1647 p += dn_size;
Paul Bakker5121ce52009-01-03 21:22:43 +00001648
Paul Bakker926af752012-11-23 13:38:07 +01001649 SSL_DEBUG_BUF( 3, "requested DN", p, dn_size );
1650
Paul Bakkerbc3d9842012-11-26 16:12:02 +01001651 total_dn_size += 2 + dn_size;
Paul Bakker926af752012-11-23 13:38:07 +01001652 crt = crt->next;
Paul Bakker5121ce52009-01-03 21:22:43 +00001653 }
1654
Paul Bakker926af752012-11-23 13:38:07 +01001655 ssl->out_msglen = p - buf;
Paul Bakker5121ce52009-01-03 21:22:43 +00001656 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1657 ssl->out_msg[0] = SSL_HS_CERTIFICATE_REQUEST;
Paul Bakker926af752012-11-23 13:38:07 +01001658 ssl->out_msg[6 + n] = (unsigned char)( total_dn_size >> 8 );
1659 ssl->out_msg[7 + n] = (unsigned char)( total_dn_size );
Paul Bakker5121ce52009-01-03 21:22:43 +00001660
1661 ret = ssl_write_record( ssl );
1662
1663 SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
1664
1665 return( ret );
1666}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001667#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1668 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1669 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001670
Paul Bakker41c83d32013-03-20 14:39:14 +01001671static int ssl_write_server_key_exchange( ssl_context *ssl )
1672{
Paul Bakker23986e52011-04-24 08:57:21 +00001673 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001674 size_t n = 0, len;
Paul Bakker23f36802012-09-28 14:15:14 +00001675 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +02001676 md_type_t md_alg = POLARSSL_MD_NONE;
Paul Bakker35a7fe52012-10-31 09:07:14 +00001677 unsigned int hashlen = 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001678 unsigned char *p = ssl->out_msg + 4;
1679 unsigned char *dig_sig = p;
1680 size_t dig_sig_len = 0;
Paul Bakker41c83d32013-03-20 14:39:14 +01001681
1682 const ssl_ciphersuite_t *ciphersuite_info;
1683 ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001684
1685 SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
1686
Paul Bakker41c83d32013-03-20 14:39:14 +01001687 if( ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_RSA &&
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001688 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_ECDHE_RSA &&
1689 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00001690 {
1691 SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
1692 ssl->state++;
1693 return( 0 );
1694 }
1695
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001696#if defined(POLARSSL_RSA_C)
Paul Bakker43b7e352011-01-18 15:27:19 +00001697 if( ssl->rsa_key == NULL )
1698 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001699 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1700 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker43b7e352011-01-18 15:27:19 +00001701 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001702#endif /* POLARSSL_RSA_C */
Paul Bakker43b7e352011-01-18 15:27:19 +00001703
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001704#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1705 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1706 {
1707 /* TODO: Support identity hints */
1708 *(p++) = 0x00;
1709 *(p++) = 0x00;
1710
1711 n += 2;
1712 }
1713#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1714
1715#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1716 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1717 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1718 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48916f92012-09-16 19:57:18 +00001719 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001720 /*
1721 * Ephemeral DH parameters:
1722 *
1723 * struct {
1724 * opaque dh_p<1..2^16-1>;
1725 * opaque dh_g<1..2^16-1>;
1726 * opaque dh_Ys<1..2^16-1>;
1727 * } ServerDHParams;
1728 */
1729 if( ( ret = mpi_copy( &ssl->handshake->dhm_ctx.P, &ssl->dhm_P ) ) != 0 ||
1730 ( ret = mpi_copy( &ssl->handshake->dhm_ctx.G, &ssl->dhm_G ) ) != 0 )
1731 {
1732 SSL_DEBUG_RET( 1, "mpi_copy", ret );
1733 return( ret );
1734 }
Paul Bakker48916f92012-09-16 19:57:18 +00001735
Paul Bakker41c83d32013-03-20 14:39:14 +01001736 if( ( ret = dhm_make_params( &ssl->handshake->dhm_ctx,
1737 mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001738 p,
1739 &len, ssl->f_rng, ssl->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001740 {
1741 SSL_DEBUG_RET( 1, "dhm_make_params", ret );
1742 return( ret );
1743 }
1744
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001745 dig_sig = p;
1746 dig_sig_len = len;
1747
1748 p += len;
1749 n += len;
1750
Paul Bakker41c83d32013-03-20 14:39:14 +01001751 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1752 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
1753 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
1754 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
1755 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001756#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1757 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001758
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001759#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001760 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001761 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001762 /*
1763 * Ephemeral ECDH parameters:
1764 *
1765 * struct {
1766 * ECParameters curve_params;
1767 * ECPoint public;
1768 * } ServerECDHParams;
1769 */
Paul Bakker41c83d32013-03-20 14:39:14 +01001770 if( ( ret = ecp_use_known_dp( &ssl->handshake->ecdh_ctx.grp,
1771 ssl->handshake->ec_curve ) ) != 0 )
1772 {
1773 SSL_DEBUG_RET( 1, "ecp_use_known_dp", ret );
1774 return( ret );
1775 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001776
Paul Bakker41c83d32013-03-20 14:39:14 +01001777 if( ( ret = ecdh_make_params( &ssl->handshake->ecdh_ctx,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001778 &len,
1779 p,
Paul Bakker41c83d32013-03-20 14:39:14 +01001780 1000, ssl->f_rng, ssl->p_rng ) ) != 0 )
1781 {
1782 SSL_DEBUG_RET( 1, "ecdh_make_params", ret );
1783 return( ret );
1784 }
1785
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001786 dig_sig = p;
1787 dig_sig_len = len;
1788
1789 p += len;
1790 n += len;
1791
Paul Bakker41c83d32013-03-20 14:39:14 +01001792 SSL_DEBUG_ECP( 3, "ECDH: Q ", &ssl->handshake->ecdh_ctx.Q );
1793 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001794#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001795
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001796#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1797 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
1798 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1799 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001800 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001801 size_t rsa_key_len = 0;
Paul Bakker23f36802012-09-28 14:15:14 +00001802
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001803 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker23f36802012-09-28 14:15:14 +00001804 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001805 md5_context md5;
1806 sha1_context sha1;
1807
1808 /*
1809 * digitally-signed struct {
1810 * opaque md5_hash[16];
1811 * opaque sha_hash[20];
1812 * };
1813 *
1814 * md5_hash
1815 * MD5(ClientHello.random + ServerHello.random
1816 * + ServerParams);
1817 * sha_hash
1818 * SHA(ClientHello.random + ServerHello.random
1819 * + ServerParams);
1820 */
1821 md5_starts( &md5 );
1822 md5_update( &md5, ssl->handshake->randbytes, 64 );
1823 md5_update( &md5, dig_sig, dig_sig_len );
1824 md5_finish( &md5, hash );
1825
1826 sha1_starts( &sha1 );
1827 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
1828 sha1_update( &sha1, dig_sig, dig_sig_len );
1829 sha1_finish( &sha1, hash + 16 );
1830
1831 hashlen = 36;
1832 md_alg = POLARSSL_MD_NONE;
1833 }
1834 else
1835 {
1836 md_context_t ctx;
1837
1838 /*
1839 * digitally-signed struct {
1840 * opaque client_random[32];
1841 * opaque server_random[32];
1842 * ServerDHParams params;
1843 * };
1844 */
1845 switch( ssl->handshake->sig_alg )
1846 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001847#if defined(POLARSSL_MD5_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001848 case SSL_HASH_MD5:
1849 md_alg = POLARSSL_MD_MD5;
1850 break;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001851#endif
1852#if defined(POLARSSL_SHA1_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001853 case SSL_HASH_SHA1:
1854 md_alg = POLARSSL_MD_SHA1;
1855 break;
Paul Bakker23f36802012-09-28 14:15:14 +00001856#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001857#if defined(POLARSSL_SHA256_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001858 case SSL_HASH_SHA224:
1859 md_alg = POLARSSL_MD_SHA224;
1860 break;
1861 case SSL_HASH_SHA256:
1862 md_alg = POLARSSL_MD_SHA256;
1863 break;
Paul Bakker23f36802012-09-28 14:15:14 +00001864#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001865#if defined(POLARSSL_SHA512_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001866 case SSL_HASH_SHA384:
1867 md_alg = POLARSSL_MD_SHA384;
1868 break;
1869 case SSL_HASH_SHA512:
1870 md_alg = POLARSSL_MD_SHA512;
1871 break;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001872#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001873 default:
1874 /* Should never happen */
1875 return( -1 );
1876 }
1877
1878 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1879 {
1880 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1881 return( ret );
1882 }
1883
1884 md_starts( &ctx );
1885 md_update( &ctx, ssl->handshake->randbytes, 64 );
1886 md_update( &ctx, dig_sig, dig_sig_len );
1887 md_finish( &ctx, hash );
Paul Bakker61d113b2013-07-04 11:51:43 +02001888
1889 if( ( ret = md_free_ctx( &ctx ) ) != 0 )
1890 {
1891 SSL_DEBUG_RET( 1, "md_free_ctx", ret );
1892 return( ret );
1893 }
1894
Paul Bakker23f36802012-09-28 14:15:14 +00001895 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02001896
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001897 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
1898
1899 if ( ssl->rsa_key )
1900 rsa_key_len = ssl->rsa_key_len( ssl->rsa_key );
1901
1902 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker23f36802012-09-28 14:15:14 +00001903 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001904 *(p++) = ssl->handshake->sig_alg;
1905 *(p++) = SSL_SIG_RSA;
1906
1907 n += 2;
1908 }
1909
1910 *(p++) = (unsigned char)( rsa_key_len >> 8 );
1911 *(p++) = (unsigned char)( rsa_key_len );
1912 n += 2;
1913
1914 if ( ssl->rsa_key )
1915 {
1916 ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
1917 RSA_PRIVATE, md_alg, hashlen, hash, p );
1918 }
1919
1920 if( ret != 0 )
1921 {
1922 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001923 return( ret );
Paul Bakker23f36802012-09-28 14:15:14 +00001924 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02001925
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001926 SSL_DEBUG_BUF( 3, "my RSA sig", p, rsa_key_len );
1927
1928 p += rsa_key_len;
1929 n += rsa_key_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001930 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001931#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) ||
1932 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001933
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001934 ssl->out_msglen = 4 + n;
Paul Bakker5121ce52009-01-03 21:22:43 +00001935 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1936 ssl->out_msg[0] = SSL_HS_SERVER_KEY_EXCHANGE;
1937
1938 ssl->state++;
1939
1940 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1941 {
1942 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1943 return( ret );
1944 }
1945
1946 SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) );
1947
1948 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001949}
1950
1951static int ssl_write_server_hello_done( ssl_context *ssl )
1952{
1953 int ret;
1954
1955 SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) );
1956
1957 ssl->out_msglen = 4;
1958 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1959 ssl->out_msg[0] = SSL_HS_SERVER_HELLO_DONE;
1960
1961 ssl->state++;
1962
1963 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1964 {
1965 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1966 return( ret );
1967 }
1968
1969 SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) );
1970
1971 return( 0 );
1972}
1973
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001974#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1975 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1976static int ssl_parse_client_dh_public( ssl_context *ssl, unsigned char **p,
1977 const unsigned char *end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02001978{
1979 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02001980 size_t n;
1981
1982 /*
1983 * Receive G^Y mod P, premaster = (G^Y)^X mod P
1984 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001985 if( *p + 2 > end )
1986 {
1987 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1988 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1989 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02001990
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001991 n = ( (*p)[0] << 8 ) | (*p)[1];
1992 *p += 2;
1993
1994 if( n < 1 || n > ssl->handshake->dhm_ctx.len || *p + n > end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02001995 {
1996 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1997 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1998 }
1999
2000 if( ( ret = dhm_read_public( &ssl->handshake->dhm_ctx,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002001 *p, n ) ) != 0 )
Paul Bakker70df2fb2013-04-17 17:19:09 +02002002 {
2003 SSL_DEBUG_RET( 1, "dhm_read_public", ret );
2004 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
2005 }
2006
2007 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
2008
Paul Bakker70df2fb2013-04-17 17:19:09 +02002009 return( ret );
2010}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002011#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2012 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02002013
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002014#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker70df2fb2013-04-17 17:19:09 +02002015static int ssl_parse_client_ecdh_public( ssl_context *ssl )
2016{
2017 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02002018 size_t n;
2019
2020 /*
2021 * Receive client public key and calculate premaster
2022 */
2023 n = ssl->in_msg[3];
2024
2025 if( n < 1 || n > mpi_size( &ssl->handshake->ecdh_ctx.grp.P ) * 2 + 2 ||
2026 n + 4 != ssl->in_hslen )
2027 {
2028 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
2029 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
2030 }
2031
2032 if( ( ret = ecdh_read_public( &ssl->handshake->ecdh_ctx,
2033 ssl->in_msg + 4, n ) ) != 0 )
2034 {
2035 SSL_DEBUG_RET( 1, "ecdh_read_public", ret );
2036 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
2037 }
2038
2039 SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp );
2040
Paul Bakker70df2fb2013-04-17 17:19:09 +02002041 return( ret );
2042}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002043#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02002044
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002045#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakker70df2fb2013-04-17 17:19:09 +02002046static int ssl_parse_encrypted_pms_secret( ssl_context *ssl )
2047{
2048 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
2049 size_t i, n = 0;
2050
2051 if( ssl->rsa_key == NULL )
2052 {
2053 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
2054 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
2055 }
2056
2057 /*
2058 * Decrypt the premaster using own private RSA key
2059 */
2060 i = 4;
2061 if( ssl->rsa_key )
2062 n = ssl->rsa_key_len( ssl->rsa_key );
2063 ssl->handshake->pmslen = 48;
2064
2065 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
2066 {
2067 i += 2;
2068 if( ssl->in_msg[4] != ( ( n >> 8 ) & 0xFF ) ||
2069 ssl->in_msg[5] != ( ( n ) & 0xFF ) )
2070 {
2071 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
2072 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
2073 }
2074 }
2075
2076 if( ssl->in_hslen != i + n )
2077 {
2078 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
2079 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
2080 }
2081
2082 if( ssl->rsa_key ) {
2083 ret = ssl->rsa_decrypt( ssl->rsa_key, RSA_PRIVATE,
2084 &ssl->handshake->pmslen,
2085 ssl->in_msg + i,
2086 ssl->handshake->premaster,
2087 sizeof(ssl->handshake->premaster) );
2088 }
2089
2090 if( ret != 0 || ssl->handshake->pmslen != 48 ||
Paul Bakker2fbefde2013-06-29 16:01:15 +02002091 ssl->handshake->premaster[0] != ssl->handshake->max_major_ver ||
2092 ssl->handshake->premaster[1] != ssl->handshake->max_minor_ver )
Paul Bakker70df2fb2013-04-17 17:19:09 +02002093 {
2094 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
2095
2096 /*
2097 * Protection against Bleichenbacher's attack:
2098 * invalid PKCS#1 v1.5 padding must not cause
2099 * the connection to end immediately; instead,
2100 * send a bad_record_mac later in the handshake.
2101 */
2102 ssl->handshake->pmslen = 48;
2103
2104 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster,
2105 ssl->handshake->pmslen );
2106 if( ret != 0 )
2107 return( ret );
2108 }
2109
2110 return( ret );
2111}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002112#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02002113
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002114#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
2115 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
2116static int ssl_parse_client_psk_identity( ssl_context *ssl, unsigned char **p,
2117 const unsigned char *end )
Paul Bakkerfbb17802013-04-17 19:10:21 +02002118{
2119 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerfbb17802013-04-17 19:10:21 +02002120 size_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02002121
2122 if( ssl->psk == NULL || ssl->psk_identity == NULL ||
2123 ssl->psk_identity_len == 0 || ssl->psk_len == 0 )
2124 {
2125 SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) );
2126 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
2127 }
2128
2129 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002130 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02002131 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002132 if( *p + 2 > end )
2133 {
2134 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
2135 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
2136 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02002137
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002138 n = ( (*p)[0] << 8 ) | (*p)[1];
2139 *p += 2;
2140
2141 if( n < 1 || n > 65535 || *p + n > end )
Paul Bakkerfbb17802013-04-17 19:10:21 +02002142 {
2143 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
2144 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
2145 }
2146
2147 if( n != ssl->psk_identity_len ||
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002148 memcmp( ssl->psk_identity, *p, n ) != 0 )
Paul Bakkerfbb17802013-04-17 19:10:21 +02002149 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002150 SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n );
Paul Bakkerfbb17802013-04-17 19:10:21 +02002151 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
2152 }
2153
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002154 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02002155 ret = 0;
2156
Paul Bakkerfbb17802013-04-17 19:10:21 +02002157 return( ret );
2158}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002159#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
2160 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02002161
Paul Bakker5121ce52009-01-03 21:22:43 +00002162static int ssl_parse_client_key_exchange( ssl_context *ssl )
2163{
Paul Bakker23986e52011-04-24 08:57:21 +00002164 int ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002165 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002166 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02002167
Paul Bakker41c83d32013-03-20 14:39:14 +01002168 ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002169
2170 SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) );
2171
2172 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2173 {
2174 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2175 return( ret );
2176 }
2177
2178 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2179 {
2180 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002181 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002182 }
2183
2184 if( ssl->in_msg[0] != SSL_HS_CLIENT_KEY_EXCHANGE )
2185 {
2186 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002187 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002188 }
2189
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002190 p = ssl->in_msg + 4;
2191 end = ssl->in_msg + ssl->in_msglen;
2192
2193#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01002194 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00002195 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002196 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002197 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02002198 SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
2199 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002200 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002201
2202 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
2203
2204 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
2205 ssl->handshake->premaster,
2206 &ssl->handshake->pmslen ) ) != 0 )
2207 {
2208 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
2209 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
2210 }
2211
2212 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker70df2fb2013-04-17 17:19:09 +02002213 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002214 else
2215#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
2216#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
2217 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker70df2fb2013-04-17 17:19:09 +02002218 {
2219 if( ( ret = ssl_parse_client_ecdh_public( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002220 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02002221 SSL_DEBUG_RET( 1, ( "ssl_parse_client_ecdh_public" ), ret );
2222 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002223 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002224
2225 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
2226 &ssl->handshake->pmslen,
2227 ssl->handshake->premaster,
2228 POLARSSL_MPI_MAX_SIZE ) ) != 0 )
2229 {
2230 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
2231 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
2232 }
2233
2234 SSL_DEBUG_MPI( 3, "ECDH: z ", &ssl->handshake->ecdh_ctx.z );
Paul Bakker5121ce52009-01-03 21:22:43 +00002235 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002236 else
2237#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
2238#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
2239 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakkerfbb17802013-04-17 19:10:21 +02002240 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002241 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
Paul Bakkerfbb17802013-04-17 19:10:21 +02002242 {
2243 SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
2244 return( ret );
2245 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002246
2247 // Set up the premaster secret
2248 //
2249 p = ssl->handshake->premaster;
2250 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
2251 *(p++) = (unsigned char)( ssl->psk_len );
2252 p += ssl->psk_len;
2253
2254 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
2255 *(p++) = (unsigned char)( ssl->psk_len );
2256 memcpy( p, ssl->psk, ssl->psk_len );
2257 p += ssl->psk_len;
2258
2259 ssl->handshake->pmslen = 4 + 2 * ssl->psk_len;
Paul Bakkerfbb17802013-04-17 19:10:21 +02002260 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002261 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002262#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
2263#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
2264 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
2265 {
2266 size_t n;
2267
2268 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
2269 {
2270 SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
2271 return( ret );
2272 }
2273 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
2274 {
2275 SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
2276 return( ret );
2277 }
2278
2279 // Set up the premaster secret
2280 //
2281 p = ssl->handshake->premaster;
2282 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len >> 8 );
2283 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len );
2284
2285 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
2286 p, &n ) ) != 0 )
2287 {
2288 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
2289 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
2290 }
2291
2292 if( n != ssl->handshake->dhm_ctx.len )
2293 {
2294 SSL_DEBUG_MSG( 1, ( "dhm_calc_secret result smaller than DHM" ) );
2295 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
2296 }
2297
2298 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
2299
2300 p += ssl->handshake->dhm_ctx.len;
2301
2302 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
2303 *(p++) = (unsigned char)( ssl->psk_len );
2304 memcpy( p, ssl->psk, ssl->psk_len );
2305 p += ssl->psk_len;
2306
2307 ssl->handshake->pmslen = 4 + ssl->handshake->dhm_ctx.len + ssl->psk_len;
2308 }
2309 else
2310#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
2311#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
2312 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01002313 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02002314 if( ( ret = ssl_parse_encrypted_pms_secret( ssl ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01002315 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02002316 SSL_DEBUG_RET( 1, ( "ssl_parse_client_ecdh_public" ), ret );
2317 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002318 }
2319 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002320 else
2321#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
2322 {
2323 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
2324 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002325
Paul Bakkerff60ee62010-03-16 21:09:09 +00002326 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
2327 {
2328 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
2329 return( ret );
2330 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002331
Paul Bakker5121ce52009-01-03 21:22:43 +00002332 ssl->state++;
2333
2334 SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) );
2335
2336 return( 0 );
2337}
2338
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002339#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
2340 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
2341 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00002342static int ssl_parse_certificate_verify( ssl_context *ssl )
2343{
Paul Bakkered27a042013-04-18 22:46:23 +02002344 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerfbb17802013-04-17 19:10:21 +02002345 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002346
2347 SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
2348
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002349 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2350 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02002351 {
2352 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
2353 ssl->state++;
2354 return( 0 );
2355 }
2356
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002357 return( ret );
2358}
2359#else
2360static int ssl_parse_certificate_verify( ssl_context *ssl )
2361{
2362 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
2363 size_t n = 0, n1, n2;
2364 unsigned char hash[48];
2365 md_type_t md_alg = POLARSSL_MD_NONE;
2366 unsigned int hashlen = 0;
2367 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
2368
2369 SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
2370
2371 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2372 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
2373 {
2374 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
2375 ssl->state++;
2376 return( 0 );
2377 }
2378
Paul Bakkered27a042013-04-18 22:46:23 +02002379 if( ssl->session_negotiate->peer_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002380 {
2381 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
2382 ssl->state++;
2383 return( 0 );
2384 }
2385
Paul Bakker48916f92012-09-16 19:57:18 +00002386 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00002387
2388 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2389 {
2390 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2391 return( ret );
2392 }
2393
2394 ssl->state++;
2395
2396 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2397 {
2398 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002399 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00002400 }
2401
2402 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE_VERIFY )
2403 {
2404 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002405 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00002406 }
2407
Paul Bakker926af752012-11-23 13:38:07 +01002408 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
2409 {
2410 /*
2411 * As server we know we either have SSL_HASH_SHA384 or
2412 * SSL_HASH_SHA256
2413 */
2414 if( ssl->in_msg[4] != ssl->handshake->verify_sig_alg ||
2415 ssl->in_msg[5] != SSL_SIG_RSA )
2416 {
2417 SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg for verify message" ) );
2418 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
2419 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002420
Paul Bakker926af752012-11-23 13:38:07 +01002421 if( ssl->handshake->verify_sig_alg == SSL_HASH_SHA384 )
Paul Bakkerc70b9822013-04-07 22:00:46 +02002422 md_alg = POLARSSL_MD_SHA384;
Paul Bakker926af752012-11-23 13:38:07 +01002423 else
Paul Bakkerc70b9822013-04-07 22:00:46 +02002424 md_alg = POLARSSL_MD_SHA256;
Paul Bakker926af752012-11-23 13:38:07 +01002425
2426 n += 2;
2427 }
2428 else
2429 {
2430 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02002431 md_alg = POLARSSL_MD_NONE;
Paul Bakker926af752012-11-23 13:38:07 +01002432 }
2433
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02002434 /* EC NOT IMPLEMENTED YET */
2435 if( ssl->session_negotiate->peer_cert->pk.type != POLARSSL_PK_RSA )
2436 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
2437
2438 n1 = pk_rsa( ssl->session_negotiate->peer_cert->pk )->len;
Paul Bakker78ce5072012-11-23 14:23:53 +01002439 n2 = ( ssl->in_msg[4 + n] << 8 ) | ssl->in_msg[5 + n];
Paul Bakker926af752012-11-23 13:38:07 +01002440
2441 if( n + n1 + 6 != ssl->in_hslen || n1 != n2 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002442 {
2443 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002444 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00002445 }
2446
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02002447 ret = rsa_pkcs1_verify( pk_rsa( ssl->session_negotiate->peer_cert->pk ),
2448 RSA_PUBLIC, md_alg, hashlen, hash,
2449 ssl->in_msg + 6 + n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002450 if( ret != 0 )
2451 {
2452 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
2453 return( ret );
2454 }
2455
2456 SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
2457
Paul Bakkered27a042013-04-18 22:46:23 +02002458 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002459}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002460#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2461 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2462 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002463
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002464static int ssl_write_new_session_ticket( ssl_context *ssl )
2465{
2466 int ret;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02002467 size_t tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002468
2469 SSL_DEBUG_MSG( 2, ( "=> write new session ticket" ) );
2470
2471 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2472 ssl->out_msg[0] = SSL_HS_NEW_SESSION_TICKET;
2473
2474 /*
2475 * struct {
2476 * uint32 ticket_lifetime_hint;
2477 * opaque ticket<0..2^16-1>;
2478 * } NewSessionTicket;
2479 *
2480 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
2481 * 8 . 9 ticket_len (n)
2482 * 10 . 9+n ticket content
2483 */
2484 ssl->out_msg[4] = 0x00;
2485 ssl->out_msg[5] = 0x00;
2486 ssl->out_msg[6] = 0x00;
2487 ssl->out_msg[7] = 0x00;
2488
Manuel Pégourié-Gonnard990c51a2013-08-03 15:37:58 +02002489 if( ( ret = ssl_write_ticket( ssl, &tlen ) ) != 0 )
2490 {
2491 SSL_DEBUG_RET( 1, "ssl_write_ticket", ret );
2492 tlen = 0;
2493 }
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002494
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02002495 ssl->out_msg[8] = (unsigned char)( ( tlen >> 8 ) & 0xFF );
2496 ssl->out_msg[9] = (unsigned char)( ( tlen ) & 0xFF );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002497
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02002498 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002499
2500 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2501 {
2502 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2503 return( ret );
2504 }
2505
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002506 /* No need to remember writing a NewSessionTicket any more */
2507 ssl->handshake->new_session_ticket = 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002508
2509 SSL_DEBUG_MSG( 2, ( "<= write new session ticket" ) );
2510
2511 return( 0 );
2512}
2513
Paul Bakker5121ce52009-01-03 21:22:43 +00002514/*
Paul Bakker1961b702013-01-25 14:49:24 +01002515 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00002516 */
Paul Bakker1961b702013-01-25 14:49:24 +01002517int ssl_handshake_server_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002518{
2519 int ret = 0;
2520
Paul Bakker1961b702013-01-25 14:49:24 +01002521 if( ssl->state == SSL_HANDSHAKE_OVER )
2522 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002523
Paul Bakker1961b702013-01-25 14:49:24 +01002524 SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) );
2525
2526 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
2527 return( ret );
2528
2529 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00002530 {
Paul Bakker1961b702013-01-25 14:49:24 +01002531 case SSL_HELLO_REQUEST:
2532 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002533 break;
2534
Paul Bakker1961b702013-01-25 14:49:24 +01002535 /*
2536 * <== ClientHello
2537 */
2538 case SSL_CLIENT_HELLO:
2539 ret = ssl_parse_client_hello( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00002540 break;
Paul Bakker1961b702013-01-25 14:49:24 +01002541
2542 /*
2543 * ==> ServerHello
2544 * Certificate
2545 * ( ServerKeyExchange )
2546 * ( CertificateRequest )
2547 * ServerHelloDone
2548 */
2549 case SSL_SERVER_HELLO:
2550 ret = ssl_write_server_hello( ssl );
2551 break;
2552
2553 case SSL_SERVER_CERTIFICATE:
2554 ret = ssl_write_certificate( ssl );
2555 break;
2556
2557 case SSL_SERVER_KEY_EXCHANGE:
2558 ret = ssl_write_server_key_exchange( ssl );
2559 break;
2560
2561 case SSL_CERTIFICATE_REQUEST:
2562 ret = ssl_write_certificate_request( ssl );
2563 break;
2564
2565 case SSL_SERVER_HELLO_DONE:
2566 ret = ssl_write_server_hello_done( ssl );
2567 break;
2568
2569 /*
2570 * <== ( Certificate/Alert )
2571 * ClientKeyExchange
2572 * ( CertificateVerify )
2573 * ChangeCipherSpec
2574 * Finished
2575 */
2576 case SSL_CLIENT_CERTIFICATE:
2577 ret = ssl_parse_certificate( ssl );
2578 break;
2579
2580 case SSL_CLIENT_KEY_EXCHANGE:
2581 ret = ssl_parse_client_key_exchange( ssl );
2582 break;
2583
2584 case SSL_CERTIFICATE_VERIFY:
2585 ret = ssl_parse_certificate_verify( ssl );
2586 break;
2587
2588 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
2589 ret = ssl_parse_change_cipher_spec( ssl );
2590 break;
2591
2592 case SSL_CLIENT_FINISHED:
2593 ret = ssl_parse_finished( ssl );
2594 break;
2595
2596 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002597 * ==> ( NewSessionTicket )
2598 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01002599 * Finished
2600 */
2601 case SSL_SERVER_CHANGE_CIPHER_SPEC:
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002602 if( ssl->handshake->new_session_ticket != 0 )
2603 ret = ssl_write_new_session_ticket( ssl );
2604 else
2605 ret = ssl_write_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01002606 break;
2607
2608 case SSL_SERVER_FINISHED:
2609 ret = ssl_write_finished( ssl );
2610 break;
2611
2612 case SSL_FLUSH_BUFFERS:
2613 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
2614 ssl->state = SSL_HANDSHAKE_WRAPUP;
2615 break;
2616
2617 case SSL_HANDSHAKE_WRAPUP:
2618 ssl_handshake_wrapup( ssl );
2619 break;
2620
2621 default:
2622 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
2623 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002624 }
2625
Paul Bakker5121ce52009-01-03 21:22:43 +00002626 return( ret );
2627}
Paul Bakker5121ce52009-01-03 21:22:43 +00002628#endif