blob: 5b421fc94fa43d52526e37f61699f528c8bb96cb [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
Paul Bakker5701cdc2012-09-27 21:49:42 +0000150static int ssl_parse_servername_ext( ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +0000151 const unsigned char *buf,
Paul Bakker5701cdc2012-09-27 21:49:42 +0000152 size_t len )
153{
154 int ret;
155 size_t servername_list_size, hostname_len;
Paul Bakker23f36802012-09-28 14:15:14 +0000156 const unsigned char *p;
Paul Bakker5701cdc2012-09-27 21:49:42 +0000157
158 servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
159 if( servername_list_size + 2 != len )
160 {
161 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
162 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
163 }
164
165 p = buf + 2;
166 while( servername_list_size > 0 )
167 {
168 hostname_len = ( ( p[1] << 8 ) | p[2] );
169 if( hostname_len + 3 > servername_list_size )
170 {
171 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
172 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
173 }
174
175 if( p[0] == TLS_EXT_SERVERNAME_HOSTNAME )
176 {
177 ret = ssl->f_sni( ssl->p_sni, ssl, p + 3, hostname_len );
178 if( ret != 0 )
179 {
180 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
181 SSL_ALERT_MSG_UNRECOGNIZED_NAME );
182 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
183 }
Paul Bakker81420ab2012-10-23 10:31:15 +0000184 return( 0 );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000185 }
186
187 servername_list_size -= hostname_len + 3;
Paul Bakker23f36802012-09-28 14:15:14 +0000188 p += hostname_len + 3;
189 }
190
191 if( servername_list_size != 0 )
192 {
193 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
194 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +0000195 }
196
197 return( 0 );
198}
199
Paul Bakker48916f92012-09-16 19:57:18 +0000200static int ssl_parse_renegotiation_info( ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +0000201 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +0000202 size_t len )
203{
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000204 int ret;
205
Paul Bakker48916f92012-09-16 19:57:18 +0000206 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
207 {
208 if( len != 1 || buf[0] != 0x0 )
209 {
210 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000211
212 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
213 return( ret );
214
Paul Bakker48916f92012-09-16 19:57:18 +0000215 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
216 }
217
218 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
219 }
220 else
221 {
222 if( len != 1 + ssl->verify_data_len ||
223 buf[0] != ssl->verify_data_len ||
224 memcmp( buf + 1, ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
225 {
226 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000227
228 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
229 return( ret );
230
Paul Bakker48916f92012-09-16 19:57:18 +0000231 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
232 }
233 }
234
235 return( 0 );
236}
237
Paul Bakker23f36802012-09-28 14:15:14 +0000238static int ssl_parse_signature_algorithms_ext( ssl_context *ssl,
239 const unsigned char *buf,
240 size_t len )
241{
242 size_t sig_alg_list_size;
243 const unsigned char *p;
244
245 sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
246 if( sig_alg_list_size + 2 != len ||
247 sig_alg_list_size %2 != 0 )
248 {
249 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
250 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
251 }
252
253 p = buf + 2;
254 while( sig_alg_list_size > 0 )
255 {
256 if( p[1] != SSL_SIG_RSA )
Paul Bakker8611e732012-10-30 07:52:29 +0000257 {
258 sig_alg_list_size -= 2;
259 p += 2;
Paul Bakker23f36802012-09-28 14:15:14 +0000260 continue;
Paul Bakker8611e732012-10-30 07:52:29 +0000261 }
Paul Bakker9e36f042013-06-30 14:34:05 +0200262#if defined(POLARSSL_SHA512_C)
Paul Bakker23f36802012-09-28 14:15:14 +0000263 if( p[0] == SSL_HASH_SHA512 )
264 {
265 ssl->handshake->sig_alg = SSL_HASH_SHA512;
266 break;
267 }
268 if( p[0] == SSL_HASH_SHA384 )
269 {
270 ssl->handshake->sig_alg = SSL_HASH_SHA384;
271 break;
272 }
273#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200274#if defined(POLARSSL_SHA256_C)
Paul Bakker23f36802012-09-28 14:15:14 +0000275 if( p[0] == SSL_HASH_SHA256 )
276 {
277 ssl->handshake->sig_alg = SSL_HASH_SHA256;
278 break;
279 }
280 if( p[0] == SSL_HASH_SHA224 )
281 {
282 ssl->handshake->sig_alg = SSL_HASH_SHA224;
283 break;
284 }
285#endif
286 if( p[0] == SSL_HASH_SHA1 )
287 {
288 ssl->handshake->sig_alg = SSL_HASH_SHA1;
289 break;
290 }
291 if( p[0] == SSL_HASH_MD5 )
292 {
293 ssl->handshake->sig_alg = SSL_HASH_MD5;
294 break;
295 }
296
297 sig_alg_list_size -= 2;
298 p += 2;
299 }
300
301 SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d",
302 ssl->handshake->sig_alg ) );
303
304 return( 0 );
305}
306
Paul Bakker41c83d32013-03-20 14:39:14 +0100307#if defined(POLARSSL_ECP_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200308static int ssl_parse_supported_elliptic_curves( ssl_context *ssl,
309 const unsigned char *buf,
310 size_t len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100311{
312 size_t list_size;
313 const unsigned char *p;
314
315 list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
316 if( list_size + 2 != len ||
317 list_size % 2 != 0 )
318 {
319 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
320 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
321 }
322
323 p = buf + 2;
324 while( list_size > 0 )
325 {
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200326#if defined(POLARSSL_ECP_DP_SECP192R1_ENABLED)
327 if( p[0] == 0x00 && p[1] == POLARSSL_ECP_DP_SECP192R1 )
Paul Bakker41c83d32013-03-20 14:39:14 +0100328 {
329 ssl->handshake->ec_curve = p[1];
330 return( 0 );
331 }
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200332#endif
333#if defined(POLARSSL_ECP_DP_SECP224R1_ENABLED)
334 if( p[0] == 0x00 && p[1] == POLARSSL_ECP_DP_SECP224R1 )
335 {
336 ssl->handshake->ec_curve = p[1];
337 return( 0 );
338 }
339#endif
340#if defined(POLARSSL_ECP_DP_SECP256R1_ENABLED)
341 if( p[0] == 0x00 && p[1] == POLARSSL_ECP_DP_SECP256R1 )
342 {
343 ssl->handshake->ec_curve = p[1];
344 return( 0 );
345 }
346#endif
347#if defined(POLARSSL_ECP_DP_SECP384R1_ENABLED)
348 if( p[0] == 0x00 && p[1] == POLARSSL_ECP_DP_SECP384R1 )
349 {
350 ssl->handshake->ec_curve = p[1];
351 return( 0 );
352 }
353#endif
354#if defined(POLARSSL_ECP_DP_SECP521R1_ENABLED)
355 if( p[0] == 0x00 && p[1] == POLARSSL_ECP_DP_SECP521R1 )
356 {
357 ssl->handshake->ec_curve = p[1];
358 return( 0 );
359 }
360#endif
Paul Bakker41c83d32013-03-20 14:39:14 +0100361
362 list_size -= 2;
363 p += 2;
364 }
365
366 return( 0 );
367}
368
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200369static int ssl_parse_supported_point_formats( ssl_context *ssl,
370 const unsigned char *buf,
371 size_t len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100372{
373 size_t list_size;
374 const unsigned char *p;
375
376 list_size = buf[0];
377 if( list_size + 1 != len )
378 {
379 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
380 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
381 }
382
383 p = buf + 2;
384 while( list_size > 0 )
385 {
386 if( p[0] == POLARSSL_ECP_PF_UNCOMPRESSED ||
387 p[0] == POLARSSL_ECP_PF_COMPRESSED )
388 {
389 ssl->handshake->ec_point_format = p[0];
390 return( 0 );
391 }
392
393 list_size--;
394 p++;
395 }
396
397 return( 0 );
398}
399#endif /* POLARSSL_ECP_C */
400
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200401static int ssl_parse_max_fragment_length_ext( ssl_context *ssl,
402 const unsigned char *buf,
403 size_t len )
404{
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200405 if( len != 1 || buf[0] >= SSL_MAX_FRAG_LEN_INVALID )
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200406 {
407 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
408 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
409 }
410
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +0200411 ssl->session_negotiate->mfl_code = buf[0];
412
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +0200413 return( 0 );
414}
415
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200416static int ssl_parse_truncated_hmac_ext( ssl_context *ssl,
417 const unsigned char *buf,
418 size_t len )
419{
420 if( len != 0 )
421 {
422 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
423 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
424 }
425
426 ((void) buf);
427
428 ssl->session_negotiate->trunc_hmac = SSL_TRUNC_HMAC_ENABLED;
429
430 return( 0 );
431}
432
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200433static int ssl_parse_session_ticket_ext( ssl_context *ssl,
434 const unsigned char *buf,
435 size_t len )
436{
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200437 ssl_session session;
438
439 /* Remember the client asked us to send a ticket */
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200440 ssl->handshake->new_session_ticket = 1;
441
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200442 SSL_DEBUG_MSG( 3, ( "ticket length: %d", len ) );
443
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200444 if( len == 0 )
445 return( 0 );
446
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200447 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE )
448 {
449 SSL_DEBUG_MSG( 3, ( "ticket rejected: renegotiating" ) );
450 return( 0 );
451 }
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200452
453 /*
454 * Use a temporary session to preserve the current one of failures.
455 * Failures are ok: just ignore the ticket and proceed.
456 */
457 if( ssl_load_session( &session, buf, len ) != 0 )
458 {
459 SSL_DEBUG_MSG( 3, ( "failed to load ticket" ) );
460 return( 0 );
461 }
462
463 SSL_DEBUG_MSG( 3, ( "session successfully restored from ticket" ) );
464
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +0200465 /*
466 * Keep the session ID sent by the client, since we MUST send it back to
467 * inform him we're accepting the ticket (RFC 5077 section 3.4)
468 */
469 session.length = ssl->session_negotiate->length;
470 memcpy( &session.id, ssl->session_negotiate->id, session.length );
471
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +0200472 ssl_session_free( ssl->session_negotiate );
473 memcpy( ssl->session_negotiate, &session, sizeof( ssl_session ) );
474 memset( &session, 0, sizeof( ssl_session ) );
475
476 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +0200477
478 return( 0 );
479}
480
Paul Bakker78a8c712013-03-06 17:01:52 +0100481#if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
482static int ssl_parse_client_hello_v2( ssl_context *ssl )
483{
484 int ret;
485 unsigned int i, j;
486 size_t n;
487 unsigned int ciph_len, sess_len, chal_len;
488 unsigned char *buf, *p;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200489 const int *ciphersuites;
Paul Bakker59c28a22013-06-29 15:33:42 +0200490 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker78a8c712013-03-06 17:01:52 +0100491
492 SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) );
493
494 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE )
495 {
496 SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) );
497
498 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
499 return( ret );
500
501 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
502 }
503
504 buf = ssl->in_hdr;
505
506 SSL_DEBUG_BUF( 4, "record header", buf, 5 );
507
508 SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d",
509 buf[2] ) );
510 SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d",
511 ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) );
512 SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]",
513 buf[3], buf[4] ) );
514
515 /*
516 * SSLv2 Client Hello
517 *
518 * Record layer:
519 * 0 . 1 message length
520 *
521 * SSL layer:
522 * 2 . 2 message type
523 * 3 . 4 protocol version
524 */
525 if( buf[2] != SSL_HS_CLIENT_HELLO ||
526 buf[3] != SSL_MAJOR_VERSION_3 )
527 {
528 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
529 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
530 }
531
532 n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF;
533
534 if( n < 17 || n > 512 )
535 {
536 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
537 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
538 }
539
540 ssl->major_ver = SSL_MAJOR_VERSION_3;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200541 ssl->minor_ver = ( buf[4] <= ssl->max_minor_ver )
542 ? buf[4] : ssl->max_minor_ver;
Paul Bakker78a8c712013-03-06 17:01:52 +0100543
544 if( ssl->minor_ver < ssl->min_minor_ver )
545 {
546 SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
547 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
548 ssl->min_major_ver, ssl->min_minor_ver ) );
549
550 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
551 SSL_ALERT_MSG_PROTOCOL_VERSION );
552 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
553 }
554
Paul Bakker2fbefde2013-06-29 16:01:15 +0200555 ssl->handshake->max_major_ver = buf[3];
556 ssl->handshake->max_minor_ver = buf[4];
Paul Bakker78a8c712013-03-06 17:01:52 +0100557
558 if( ( ret = ssl_fetch_input( ssl, 2 + n ) ) != 0 )
559 {
560 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
561 return( ret );
562 }
563
564 ssl->handshake->update_checksum( ssl, buf + 2, n );
565
566 buf = ssl->in_msg;
567 n = ssl->in_left - 5;
568
569 /*
570 * 0 . 1 ciphersuitelist length
571 * 2 . 3 session id length
572 * 4 . 5 challenge length
573 * 6 . .. ciphersuitelist
574 * .. . .. session id
575 * .. . .. challenge
576 */
577 SSL_DEBUG_BUF( 4, "record contents", buf, n );
578
579 ciph_len = ( buf[0] << 8 ) | buf[1];
580 sess_len = ( buf[2] << 8 ) | buf[3];
581 chal_len = ( buf[4] << 8 ) | buf[5];
582
583 SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d",
584 ciph_len, sess_len, chal_len ) );
585
586 /*
587 * Make sure each parameter length is valid
588 */
589 if( ciph_len < 3 || ( ciph_len % 3 ) != 0 )
590 {
591 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
592 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
593 }
594
595 if( sess_len > 32 )
596 {
597 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
598 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
599 }
600
601 if( chal_len < 8 || chal_len > 32 )
602 {
603 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
604 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
605 }
606
607 if( n != 6 + ciph_len + sess_len + chal_len )
608 {
609 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
610 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
611 }
612
613 SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
614 buf + 6, ciph_len );
615 SSL_DEBUG_BUF( 3, "client hello, session id",
616 buf + 6 + ciph_len, sess_len );
617 SSL_DEBUG_BUF( 3, "client hello, challenge",
618 buf + 6 + ciph_len + sess_len, chal_len );
619
620 p = buf + 6 + ciph_len;
621 ssl->session_negotiate->length = sess_len;
622 memset( ssl->session_negotiate->id, 0, sizeof( ssl->session_negotiate->id ) );
623 memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->length );
624
625 p += sess_len;
626 memset( ssl->handshake->randbytes, 0, 64 );
627 memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len );
628
629 /*
630 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
631 */
632 for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )
633 {
634 if( p[0] == 0 && p[1] == 0 && p[2] == SSL_EMPTY_RENEGOTIATION_INFO )
635 {
636 SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
637 if( ssl->renegotiation == SSL_RENEGOTIATION )
638 {
639 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
640
641 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
642 return( ret );
643
644 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
645 }
646 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
647 break;
648 }
649 }
650
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200651 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
652 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker78a8c712013-03-06 17:01:52 +0100653 {
654 for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
655 {
Paul Bakker41c83d32013-03-20 14:39:14 +0100656 // Only allow non-ECC ciphersuites as we do not have extensions
657 //
Paul Bakker59c28a22013-06-29 15:33:42 +0200658 if( p[0] == 0 && p[1] == 0 &&
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200659 ( ( ciphersuites[i] >> 8 ) & 0xFF ) == 0 &&
660 p[2] == ( ciphersuites[i] & 0xFF ) )
Paul Bakker59c28a22013-06-29 15:33:42 +0200661 {
662 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
663
664 if( ciphersuite_info == NULL )
665 {
666 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
667 ciphersuites[i] ) );
668 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
669 }
670
Paul Bakker2fbefde2013-06-29 16:01:15 +0200671 if( ciphersuite_info->min_minor_ver > ssl->minor_ver ||
672 ciphersuite_info->max_minor_ver < ssl->minor_ver )
673 continue;
Paul Bakker59c28a22013-06-29 15:33:42 +0200674
Paul Bakker78a8c712013-03-06 17:01:52 +0100675 goto have_ciphersuite_v2;
Paul Bakker59c28a22013-06-29 15:33:42 +0200676 }
Paul Bakker78a8c712013-03-06 17:01:52 +0100677 }
678 }
679
680 SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
681
682 return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
683
684have_ciphersuite_v2:
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200685 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Paul Bakker59c28a22013-06-29 15:33:42 +0200686 ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +0100687 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
Paul Bakker78a8c712013-03-06 17:01:52 +0100688
689 /*
690 * SSLv2 Client Hello relevant renegotiation security checks
691 */
692 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
693 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
694 {
695 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
696
697 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
698 return( ret );
699
700 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
701 }
702
703 ssl->in_left = 0;
704 ssl->state++;
705
706 SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) );
707
708 return( 0 );
709}
710#endif /* POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
711
Paul Bakker5121ce52009-01-03 21:22:43 +0000712static int ssl_parse_client_hello( ssl_context *ssl )
713{
Paul Bakker23986e52011-04-24 08:57:21 +0000714 int ret;
715 unsigned int i, j;
716 size_t n;
717 unsigned int ciph_len, sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +0000718 unsigned int comp_len;
Paul Bakker48916f92012-09-16 19:57:18 +0000719 unsigned int ext_len = 0;
720 unsigned char *buf, *p, *ext;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000721 int renegotiation_info_seen = 0;
722 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200723 const int *ciphersuites;
Paul Bakker41c83d32013-03-20 14:39:14 +0100724 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000725
726 SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
727
Paul Bakker48916f92012-09-16 19:57:18 +0000728 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
729 ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000730 {
731 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
732 return( ret );
733 }
734
735 buf = ssl->in_hdr;
736
Paul Bakker78a8c712013-03-06 17:01:52 +0100737#if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
738 if( ( buf[0] & 0x80 ) != 0 )
739 return ssl_parse_client_hello_v2( ssl );
740#endif
741
Paul Bakkerec636f32012-09-09 19:17:02 +0000742 SSL_DEBUG_BUF( 4, "record header", buf, 5 );
743
744 SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d",
745 buf[0] ) );
746 SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d",
747 ( buf[3] << 8 ) | buf[4] ) );
748 SSL_DEBUG_MSG( 3, ( "client hello v3, protocol ver: [%d:%d]",
749 buf[1], buf[2] ) );
750
751 /*
752 * SSLv3 Client Hello
753 *
754 * Record layer:
755 * 0 . 0 message type
756 * 1 . 2 protocol version
757 * 3 . 4 message length
758 */
759 if( buf[0] != SSL_MSG_HANDSHAKE ||
760 buf[1] != SSL_MAJOR_VERSION_3 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000761 {
Paul Bakkerec636f32012-09-09 19:17:02 +0000762 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
763 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
764 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000765
Paul Bakkerec636f32012-09-09 19:17:02 +0000766 n = ( buf[3] << 8 ) | buf[4];
Paul Bakker5121ce52009-01-03 21:22:43 +0000767
Manuel Pégourié-Gonnard72882b22013-08-02 13:36:00 +0200768 if( n < 45 || n > 2048 )
Paul Bakkerec636f32012-09-09 19:17:02 +0000769 {
770 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
771 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
772 }
773
Paul Bakker48916f92012-09-16 19:57:18 +0000774 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
775 ( ret = ssl_fetch_input( ssl, 5 + n ) ) != 0 )
Paul Bakkerec636f32012-09-09 19:17:02 +0000776 {
777 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
778 return( ret );
779 }
780
781 buf = ssl->in_msg;
Paul Bakker48916f92012-09-16 19:57:18 +0000782 if( !ssl->renegotiation )
783 n = ssl->in_left - 5;
784 else
785 n = ssl->in_msglen;
Paul Bakkerec636f32012-09-09 19:17:02 +0000786
Paul Bakker48916f92012-09-16 19:57:18 +0000787 ssl->handshake->update_checksum( ssl, buf, n );
Paul Bakkerec636f32012-09-09 19:17:02 +0000788
789 /*
790 * SSL layer:
791 * 0 . 0 handshake type
792 * 1 . 3 handshake length
793 * 4 . 5 protocol version
794 * 6 . 9 UNIX time()
795 * 10 . 37 random bytes
796 * 38 . 38 session id length
797 * 39 . 38+x session id
798 * 39+x . 40+x ciphersuitelist length
799 * 41+x . .. ciphersuitelist
800 * .. . .. compression alg.
801 * .. . .. extensions
802 */
803 SSL_DEBUG_BUF( 4, "record contents", buf, n );
804
805 SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d",
806 buf[0] ) );
807 SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d",
808 ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) );
809 SSL_DEBUG_MSG( 3, ( "client hello v3, max. version: [%d:%d]",
810 buf[4], buf[5] ) );
811
812 /*
813 * Check the handshake type and protocol version
814 */
815 if( buf[0] != SSL_HS_CLIENT_HELLO ||
816 buf[4] != SSL_MAJOR_VERSION_3 )
817 {
818 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
819 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
820 }
821
822 ssl->major_ver = SSL_MAJOR_VERSION_3;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200823 ssl->minor_ver = ( buf[5] <= ssl->max_minor_ver )
824 ? buf[5] : ssl->max_minor_ver;
Paul Bakkerec636f32012-09-09 19:17:02 +0000825
Paul Bakker1d29fb52012-09-28 13:28:45 +0000826 if( ssl->minor_ver < ssl->min_minor_ver )
827 {
828 SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
829 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
Paul Bakker81420ab2012-10-23 10:31:15 +0000830 ssl->min_major_ver, ssl->min_minor_ver ) );
Paul Bakker1d29fb52012-09-28 13:28:45 +0000831
832 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
833 SSL_ALERT_MSG_PROTOCOL_VERSION );
834
835 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
836 }
837
Paul Bakker2fbefde2013-06-29 16:01:15 +0200838 ssl->handshake->max_major_ver = buf[4];
839 ssl->handshake->max_minor_ver = buf[5];
Paul Bakkerec636f32012-09-09 19:17:02 +0000840
Paul Bakker48916f92012-09-16 19:57:18 +0000841 memcpy( ssl->handshake->randbytes, buf + 6, 32 );
Paul Bakkerec636f32012-09-09 19:17:02 +0000842
843 /*
844 * Check the handshake message length
845 */
846 if( buf[1] != 0 || n != (unsigned int) 4 + ( ( buf[2] << 8 ) | buf[3] ) )
847 {
848 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
849 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
850 }
851
852 /*
853 * Check the session length
854 */
855 sess_len = buf[38];
856
857 if( sess_len > 32 )
858 {
859 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
860 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
861 }
862
Paul Bakker48916f92012-09-16 19:57:18 +0000863 ssl->session_negotiate->length = sess_len;
864 memset( ssl->session_negotiate->id, 0,
865 sizeof( ssl->session_negotiate->id ) );
866 memcpy( ssl->session_negotiate->id, buf + 39,
867 ssl->session_negotiate->length );
Paul Bakkerec636f32012-09-09 19:17:02 +0000868
869 /*
870 * Check the ciphersuitelist length
871 */
872 ciph_len = ( buf[39 + sess_len] << 8 )
873 | ( buf[40 + sess_len] );
874
875 if( ciph_len < 2 || ciph_len > 256 || ( ciph_len % 2 ) != 0 )
876 {
877 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
878 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
879 }
880
881 /*
882 * Check the compression algorithms length
883 */
884 comp_len = buf[41 + sess_len + ciph_len];
885
886 if( comp_len < 1 || comp_len > 16 )
887 {
888 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
889 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
890 }
891
Paul Bakker48916f92012-09-16 19:57:18 +0000892 /*
893 * Check the extension length
894 */
895 if( n > 42 + sess_len + ciph_len + comp_len )
896 {
897 ext_len = ( buf[42 + sess_len + ciph_len + comp_len] << 8 )
898 | ( buf[43 + sess_len + ciph_len + comp_len] );
899
900 if( ( ext_len > 0 && ext_len < 4 ) ||
901 n != 44 + sess_len + ciph_len + comp_len + ext_len )
902 {
903 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
904 SSL_DEBUG_BUF( 3, "Ext", buf + 44 + sess_len + ciph_len + comp_len, ext_len);
905 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
906 }
907 }
908
909 ssl->session_negotiate->compression = SSL_COMPRESS_NULL;
Paul Bakkerec636f32012-09-09 19:17:02 +0000910#if defined(POLARSSL_ZLIB_SUPPORT)
911 for( i = 0; i < comp_len; ++i )
912 {
Paul Bakker48916f92012-09-16 19:57:18 +0000913 if( buf[42 + sess_len + ciph_len + i] == SSL_COMPRESS_DEFLATE )
Paul Bakker5121ce52009-01-03 21:22:43 +0000914 {
Paul Bakker48916f92012-09-16 19:57:18 +0000915 ssl->session_negotiate->compression = SSL_COMPRESS_DEFLATE;
Paul Bakkerec636f32012-09-09 19:17:02 +0000916 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000917 }
918 }
Paul Bakker2770fbd2012-07-03 13:30:23 +0000919#endif
920
Paul Bakkerec636f32012-09-09 19:17:02 +0000921 SSL_DEBUG_BUF( 3, "client hello, random bytes",
922 buf + 6, 32 );
923 SSL_DEBUG_BUF( 3, "client hello, session id",
924 buf + 38, sess_len );
925 SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
926 buf + 41 + sess_len, ciph_len );
927 SSL_DEBUG_BUF( 3, "client hello, compression",
928 buf + 42 + sess_len + ciph_len, comp_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000929
Paul Bakkerec636f32012-09-09 19:17:02 +0000930 /*
Paul Bakker48916f92012-09-16 19:57:18 +0000931 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
932 */
933 for( i = 0, p = buf + 41 + sess_len; i < ciph_len; i += 2, p += 2 )
934 {
935 if( p[0] == 0 && p[1] == SSL_EMPTY_RENEGOTIATION_INFO )
936 {
937 SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
938 if( ssl->renegotiation == SSL_RENEGOTIATION )
939 {
940 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000941
942 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
943 return( ret );
944
Paul Bakker48916f92012-09-16 19:57:18 +0000945 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
946 }
947 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
948 break;
949 }
950 }
951
Paul Bakker48916f92012-09-16 19:57:18 +0000952 ext = buf + 44 + sess_len + ciph_len + comp_len;
Paul Bakker48916f92012-09-16 19:57:18 +0000953
954 while( ext_len )
955 {
956 unsigned int ext_id = ( ( ext[0] << 8 )
957 | ( ext[1] ) );
958 unsigned int ext_size = ( ( ext[2] << 8 )
959 | ( ext[3] ) );
960
961 if( ext_size + 4 > ext_len )
962 {
963 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
964 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
965 }
966 switch( ext_id )
967 {
Paul Bakker5701cdc2012-09-27 21:49:42 +0000968 case TLS_EXT_SERVERNAME:
969 SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
970 if( ssl->f_sni == NULL )
971 break;
972
973 ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size );
974 if( ret != 0 )
975 return( ret );
976 break;
977
Paul Bakker48916f92012-09-16 19:57:18 +0000978 case TLS_EXT_RENEGOTIATION_INFO:
979 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
980 renegotiation_info_seen = 1;
981
Paul Bakker23f36802012-09-28 14:15:14 +0000982 ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size );
983 if( ret != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +0000984 return( ret );
Paul Bakker23f36802012-09-28 14:15:14 +0000985 break;
Paul Bakker48916f92012-09-16 19:57:18 +0000986
Paul Bakker23f36802012-09-28 14:15:14 +0000987 case TLS_EXT_SIG_ALG:
988 SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
989 if( ssl->renegotiation == SSL_RENEGOTIATION )
990 break;
991
992 ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size );
993 if( ret != 0 )
994 return( ret );
Paul Bakker48916f92012-09-16 19:57:18 +0000995 break;
996
Paul Bakker41c83d32013-03-20 14:39:14 +0100997#if defined(POLARSSL_ECP_C)
998 case TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
999 SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
1000
1001 ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size );
1002 if( ret != 0 )
1003 return( ret );
1004 break;
1005
1006 case TLS_EXT_SUPPORTED_POINT_FORMATS:
1007 SSL_DEBUG_MSG( 3, ( "found supported point formats extension" ) );
1008
1009 ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size );
1010 if( ret != 0 )
1011 return( ret );
1012 break;
1013#endif /* POLARSSL_ECP_C */
1014
Manuel Pégourié-Gonnard48f8d0d2013-07-17 10:25:37 +02001015 case TLS_EXT_MAX_FRAGMENT_LENGTH:
1016 SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) );
1017
1018 ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size );
1019 if( ret != 0 )
1020 return( ret );
1021 break;
1022
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001023 case TLS_EXT_TRUNCATED_HMAC:
1024 SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) );
1025
1026 ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size );
1027 if( ret != 0 )
1028 return( ret );
1029 break;
1030
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001031 case TLS_EXT_SESSION_TICKET:
1032 SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) );
1033
1034 ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size );
1035 if( ret != 0 )
1036 return( ret );
1037 break;
1038
Paul Bakker48916f92012-09-16 19:57:18 +00001039 default:
1040 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
1041 ext_id ) );
1042 }
1043
1044 ext_len -= 4 + ext_size;
1045 ext += 4 + ext_size;
1046
1047 if( ext_len > 0 && ext_len < 4 )
1048 {
1049 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
1050 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
1051 }
1052 }
1053
1054 /*
1055 * Renegotiation security checks
1056 */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001057 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1058 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
1059 {
1060 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
1061 handshake_failure = 1;
1062 }
1063 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1064 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
1065 renegotiation_info_seen == 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001066 {
1067 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001068 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +00001069 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001070 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1071 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1072 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00001073 {
1074 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001075 handshake_failure = 1;
1076 }
1077 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1078 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1079 renegotiation_info_seen == 1 )
1080 {
1081 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
1082 handshake_failure = 1;
1083 }
1084
1085 if( handshake_failure == 1 )
1086 {
1087 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
1088 return( ret );
1089
Paul Bakker48916f92012-09-16 19:57:18 +00001090 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
1091 }
Paul Bakker380da532012-04-18 16:10:25 +00001092
Paul Bakker41c83d32013-03-20 14:39:14 +01001093 /*
1094 * Search for a matching ciphersuite
1095 * (At the end because we need information from the EC-based extensions)
1096 */
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001097 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
1098 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker41c83d32013-03-20 14:39:14 +01001099 {
1100 for( j = 0, p = buf + 41 + sess_len; j < ciph_len;
1101 j += 2, p += 2 )
1102 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001103 if( p[0] == ( ( ciphersuites[i] >> 8 ) & 0xFF ) &&
1104 p[1] == ( ( ciphersuites[i] ) & 0xFF ) )
Paul Bakker41c83d32013-03-20 14:39:14 +01001105 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001106 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
Paul Bakker41c83d32013-03-20 14:39:14 +01001107
1108 if( ciphersuite_info == NULL )
1109 {
1110 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001111 ciphersuites[i] ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001112 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1113 }
1114
Paul Bakker2fbefde2013-06-29 16:01:15 +02001115 if( ciphersuite_info->min_minor_ver > ssl->minor_ver ||
1116 ciphersuite_info->max_minor_ver < ssl->minor_ver )
1117 continue;
1118
Paul Bakker41c83d32013-03-20 14:39:14 +01001119 if( ( ciphersuite_info->flags & POLARSSL_CIPHERSUITE_EC ) &&
1120 ssl->handshake->ec_curve == 0 )
1121 continue;
1122
1123 goto have_ciphersuite;
1124 }
1125 }
1126 }
1127
1128 SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
1129
1130 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
1131 return( ret );
1132
1133 return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
1134
1135have_ciphersuite:
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001136 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Paul Bakker41c83d32013-03-20 14:39:14 +01001137 ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
1138 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
1139
Paul Bakker5121ce52009-01-03 21:22:43 +00001140 ssl->in_left = 0;
1141 ssl->state++;
1142
1143 SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
1144
1145 return( 0 );
1146}
1147
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001148static void ssl_write_truncated_hmac_ext( ssl_context *ssl,
1149 unsigned char *buf,
1150 size_t *olen )
1151{
1152 unsigned char *p = buf;
1153
1154 if( ssl->session_negotiate->trunc_hmac == SSL_TRUNC_HMAC_DISABLED )
1155 {
1156 *olen = 0;
1157 return;
1158 }
1159
1160 SSL_DEBUG_MSG( 3, ( "server hello, adding truncated hmac extension" ) );
1161
1162 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
1163 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
1164
1165 *p++ = 0x00;
1166 *p++ = 0x00;
1167
1168 *olen = 4;
1169}
1170
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001171static void ssl_write_session_ticket_ext( ssl_context *ssl,
1172 unsigned char *buf,
1173 size_t *olen )
1174{
1175 unsigned char *p = buf;
1176
1177 if( ssl->handshake->new_session_ticket == 0 )
1178 {
1179 *olen = 0;
1180 return;
1181 }
1182
1183 SSL_DEBUG_MSG( 3, ( "server hello, adding session ticket extension" ) );
1184
1185 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
1186 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET ) & 0xFF );
1187
1188 *p++ = 0x00;
1189 *p++ = 0x00;
1190
1191 *olen = 4;
1192}
1193
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001194static void ssl_write_renegotiation_ext( ssl_context *ssl,
1195 unsigned char *buf,
1196 size_t *olen )
1197{
1198 unsigned char *p = buf;
1199
1200 if( ssl->secure_renegotiation != SSL_SECURE_RENEGOTIATION )
1201 {
1202 *olen = 0;
1203 return;
1204 }
1205
1206 SSL_DEBUG_MSG( 3, ( "server hello, secure renegotiation extension" ) );
1207
1208 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
1209 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
1210
1211 *p++ = 0x00;
1212 *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF;
1213 *p++ = ssl->verify_data_len * 2 & 0xFF;
1214
1215 memcpy( p, ssl->peer_verify_data, ssl->verify_data_len );
1216 p += ssl->verify_data_len;
1217 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
1218 p += ssl->verify_data_len;
1219
1220 *olen = 5 + ssl->verify_data_len * 2;
1221}
1222
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001223static void ssl_write_max_fragment_length_ext( ssl_context *ssl,
1224 unsigned char *buf,
1225 size_t *olen )
1226{
1227 unsigned char *p = buf;
1228
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +02001229 if( ssl->session_negotiate->mfl_code == SSL_MAX_FRAG_LEN_NONE )
1230 {
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001231 *olen = 0;
1232 return;
1233 }
1234
1235 SSL_DEBUG_MSG( 3, ( "server hello, max_fragment_length extension" ) );
1236
1237 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
1238 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
1239
1240 *p++ = 0x00;
1241 *p++ = 1;
1242
Manuel Pégourié-Gonnarded4af8b2013-07-18 14:07:09 +02001243 *p++ = ssl->session_negotiate->mfl_code;
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001244
1245 *olen = 5;
1246}
1247
Paul Bakker5121ce52009-01-03 21:22:43 +00001248static int ssl_write_server_hello( ssl_context *ssl )
1249{
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001250#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +00001251 time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001252#endif
Paul Bakkera3d195c2011-11-27 21:07:34 +00001253 int ret, n;
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001254 size_t olen, ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001255 unsigned char *buf, *p;
1256
1257 SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
1258
1259 /*
1260 * 0 . 0 handshake type
1261 * 1 . 3 handshake length
1262 * 4 . 5 protocol version
1263 * 6 . 9 UNIX time()
1264 * 10 . 37 random bytes
1265 */
1266 buf = ssl->out_msg;
1267 p = buf + 4;
1268
1269 *p++ = (unsigned char) ssl->major_ver;
1270 *p++ = (unsigned char) ssl->minor_ver;
1271
1272 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
1273 buf[4], buf[5] ) );
1274
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001275#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +00001276 t = time( NULL );
1277 *p++ = (unsigned char)( t >> 24 );
1278 *p++ = (unsigned char)( t >> 16 );
1279 *p++ = (unsigned char)( t >> 8 );
1280 *p++ = (unsigned char)( t );
1281
1282 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001283#else
1284 if( ( ret = ssl->f_rng( ssl->p_rng, p, 4 ) ) != 0 )
1285 return( ret );
1286
1287 p += 4;
1288#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001289
Paul Bakkera3d195c2011-11-27 21:07:34 +00001290 if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
1291 return( ret );
1292
1293 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +00001294
Paul Bakker48916f92012-09-16 19:57:18 +00001295 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001296
1297 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
1298
1299 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001300 * Resume is 0 by default, see ssl_handshake_init().
1301 * It may be already set to 1 by ssl_parse_session_ticket_ext().
1302 * If not, try looking up session ID in our cache.
Paul Bakker5121ce52009-01-03 21:22:43 +00001303 */
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001304 if( ssl->handshake->resume == 0 &&
1305 ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02001306 ssl->session_negotiate->length != 0 &&
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001307 ssl->f_get_cache != NULL &&
1308 ssl->f_get_cache( ssl->p_get_cache, ssl->session_negotiate ) == 0 )
1309 {
1310 ssl->handshake->resume = 1;
1311 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001312
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001313 if( ssl->handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001314 {
1315 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001316 * New session, create a new session id,
1317 * unless we're about to issue a session ticket
Paul Bakker5121ce52009-01-03 21:22:43 +00001318 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001319 ssl->state++;
1320
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001321 if( ssl->handshake->new_session_ticket == 0 )
1322 {
1323 ssl->session_negotiate->length = n = 32;
1324 if( ( ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id,
1325 n ) ) != 0 )
1326 return( ret );
1327 }
1328 else
1329 {
1330 ssl->session_negotiate->length = 0;
1331 memset( ssl->session_negotiate->id, 0, 32 );
1332 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001333 }
1334 else
1335 {
1336 /*
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001337 * Resuming a session
Paul Bakker5121ce52009-01-03 21:22:43 +00001338 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001339 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001340
1341 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1342 {
1343 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1344 return( ret );
1345 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001346 }
1347
Manuel Pégourié-Gonnard3ffa3db2013-08-02 11:59:05 +02001348 /*
1349 * 38 . 38 session id length
1350 * 39 . 38+n session id
1351 * 39+n . 40+n chosen ciphersuite
1352 * 41+n . 41+n chosen compression alg.
1353 * 42+n . 43+n extensions length
1354 * 44+n . 43+n+m extensions
1355 */
1356 *p++ = (unsigned char) ssl->session_negotiate->length;
Paul Bakker48916f92012-09-16 19:57:18 +00001357 memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->length );
1358 p += ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +00001359
1360 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
1361 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
1362 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +00001363 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001364
Paul Bakker48916f92012-09-16 19:57:18 +00001365 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 );
1366 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite );
1367 *p++ = (unsigned char)( ssl->session_negotiate->compression );
Paul Bakker5121ce52009-01-03 21:22:43 +00001368
Paul Bakkere3166ce2011-01-27 17:40:50 +00001369 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001370 ssl->session_negotiate->ciphersuite ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +00001371 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d",
Paul Bakker48916f92012-09-16 19:57:18 +00001372 ssl->session_negotiate->compression ) );
1373
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001374 /*
1375 * First write extensions, then the total length
1376 */
1377 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
1378 ext_len += olen;
Paul Bakker48916f92012-09-16 19:57:18 +00001379
Manuel Pégourié-Gonnard7bb78992013-07-17 13:50:08 +02001380 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
1381 ext_len += olen;
1382
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001383 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
1384 ext_len += olen;
1385
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02001386 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
1387 ext_len += olen;
1388
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001389 SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d", ext_len ) );
Paul Bakker48916f92012-09-16 19:57:18 +00001390
Manuel Pégourié-Gonnardf11a6d72013-07-17 11:17:14 +02001391 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
1392 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
1393 p += ext_len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001394
1395 ssl->out_msglen = p - buf;
1396 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1397 ssl->out_msg[0] = SSL_HS_SERVER_HELLO;
1398
1399 ret = ssl_write_record( ssl );
1400
1401 SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
1402
1403 return( ret );
1404}
1405
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001406#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1407 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1408 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001409static int ssl_write_certificate_request( ssl_context *ssl )
1410{
Paul Bakkered27a042013-04-18 22:46:23 +02001411 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1412 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001413
1414 SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
1415
1416 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1417 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1418 {
1419 SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
1420 ssl->state++;
1421 return( 0 );
1422 }
1423
1424 return( ret );
1425}
1426#else
1427static int ssl_write_certificate_request( ssl_context *ssl )
1428{
1429 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1430 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker926af752012-11-23 13:38:07 +01001431 size_t n = 0, dn_size, total_dn_size;
Paul Bakker5121ce52009-01-03 21:22:43 +00001432 unsigned char *buf, *p;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001433 const x509_cert *crt;
Paul Bakker5121ce52009-01-03 21:22:43 +00001434
1435 SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
1436
1437 ssl->state++;
1438
Paul Bakkerfbb17802013-04-17 19:10:21 +02001439 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001440 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
Paul Bakkerfbb17802013-04-17 19:10:21 +02001441 ssl->authmode == SSL_VERIFY_NONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001442 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001443 SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001444 return( 0 );
1445 }
1446
1447 /*
1448 * 0 . 0 handshake type
1449 * 1 . 3 handshake length
1450 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01001451 * 5 .. m-1 cert types
1452 * m .. m+1 sig alg length (TLS 1.2 only)
1453 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001454 * n .. n+1 length of all DNs
1455 * n+2 .. n+3 length of DN 1
1456 * n+4 .. ... Distinguished Name #1
1457 * ... .. ... length of DN 2, etc.
1458 */
1459 buf = ssl->out_msg;
1460 p = buf + 4;
1461
1462 /*
1463 * At the moment, only RSA certificates are supported
1464 */
1465 *p++ = 1;
Paul Bakker926af752012-11-23 13:38:07 +01001466 *p++ = SSL_CERT_TYPE_RSA_SIGN;
1467
1468 /*
1469 * Add signature_algorithms for verify (TLS 1.2)
1470 * Only add current running algorithm that is already required for
1471 * requested ciphersuite.
1472 *
1473 * Length is always 2
1474 */
Paul Bakker21dca692013-01-03 11:41:08 +01001475 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01001476 {
1477 ssl->handshake->verify_sig_alg = SSL_HASH_SHA256;
1478
1479 *p++ = 0;
1480 *p++ = 2;
1481
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001482 if( ssl->transform_negotiate->ciphersuite_info->mac ==
1483 POLARSSL_MD_SHA384 )
Paul Bakker926af752012-11-23 13:38:07 +01001484 {
1485 ssl->handshake->verify_sig_alg = SSL_HASH_SHA384;
1486 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001487
Paul Bakker926af752012-11-23 13:38:07 +01001488 *p++ = ssl->handshake->verify_sig_alg;
1489 *p++ = SSL_SIG_RSA;
1490
1491 n += 4;
1492 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001493
1494 p += 2;
1495 crt = ssl->ca_chain;
1496
Paul Bakkerbc3d9842012-11-26 16:12:02 +01001497 total_dn_size = 0;
Paul Bakker29087132010-03-21 21:03:34 +00001498 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001499 {
1500 if( p - buf > 4096 )
1501 break;
1502
Paul Bakker926af752012-11-23 13:38:07 +01001503 dn_size = crt->subject_raw.len;
1504 *p++ = (unsigned char)( dn_size >> 8 );
1505 *p++ = (unsigned char)( dn_size );
1506 memcpy( p, crt->subject_raw.p, dn_size );
1507 p += dn_size;
Paul Bakker5121ce52009-01-03 21:22:43 +00001508
Paul Bakker926af752012-11-23 13:38:07 +01001509 SSL_DEBUG_BUF( 3, "requested DN", p, dn_size );
1510
Paul Bakkerbc3d9842012-11-26 16:12:02 +01001511 total_dn_size += 2 + dn_size;
Paul Bakker926af752012-11-23 13:38:07 +01001512 crt = crt->next;
Paul Bakker5121ce52009-01-03 21:22:43 +00001513 }
1514
Paul Bakker926af752012-11-23 13:38:07 +01001515 ssl->out_msglen = p - buf;
Paul Bakker5121ce52009-01-03 21:22:43 +00001516 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1517 ssl->out_msg[0] = SSL_HS_CERTIFICATE_REQUEST;
Paul Bakker926af752012-11-23 13:38:07 +01001518 ssl->out_msg[6 + n] = (unsigned char)( total_dn_size >> 8 );
1519 ssl->out_msg[7 + n] = (unsigned char)( total_dn_size );
Paul Bakker5121ce52009-01-03 21:22:43 +00001520
1521 ret = ssl_write_record( ssl );
1522
1523 SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
1524
1525 return( ret );
1526}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001527#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1528 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1529 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001530
Paul Bakker41c83d32013-03-20 14:39:14 +01001531static int ssl_write_server_key_exchange( ssl_context *ssl )
1532{
Paul Bakker23986e52011-04-24 08:57:21 +00001533 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001534 size_t n = 0, len;
Paul Bakker23f36802012-09-28 14:15:14 +00001535 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +02001536 md_type_t md_alg = POLARSSL_MD_NONE;
Paul Bakker35a7fe52012-10-31 09:07:14 +00001537 unsigned int hashlen = 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001538 unsigned char *p = ssl->out_msg + 4;
1539 unsigned char *dig_sig = p;
1540 size_t dig_sig_len = 0;
Paul Bakker41c83d32013-03-20 14:39:14 +01001541
1542 const ssl_ciphersuite_t *ciphersuite_info;
1543 ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001544
1545 SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
1546
Paul Bakker41c83d32013-03-20 14:39:14 +01001547 if( ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_RSA &&
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001548 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_ECDHE_RSA &&
1549 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00001550 {
1551 SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
1552 ssl->state++;
1553 return( 0 );
1554 }
1555
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001556#if defined(POLARSSL_RSA_C)
Paul Bakker43b7e352011-01-18 15:27:19 +00001557 if( ssl->rsa_key == NULL )
1558 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001559 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1560 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker43b7e352011-01-18 15:27:19 +00001561 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001562#endif /* POLARSSL_RSA_C */
Paul Bakker43b7e352011-01-18 15:27:19 +00001563
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001564#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1565 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1566 {
1567 /* TODO: Support identity hints */
1568 *(p++) = 0x00;
1569 *(p++) = 0x00;
1570
1571 n += 2;
1572 }
1573#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1574
1575#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1576 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1577 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1578 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48916f92012-09-16 19:57:18 +00001579 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001580 /*
1581 * Ephemeral DH parameters:
1582 *
1583 * struct {
1584 * opaque dh_p<1..2^16-1>;
1585 * opaque dh_g<1..2^16-1>;
1586 * opaque dh_Ys<1..2^16-1>;
1587 * } ServerDHParams;
1588 */
1589 if( ( ret = mpi_copy( &ssl->handshake->dhm_ctx.P, &ssl->dhm_P ) ) != 0 ||
1590 ( ret = mpi_copy( &ssl->handshake->dhm_ctx.G, &ssl->dhm_G ) ) != 0 )
1591 {
1592 SSL_DEBUG_RET( 1, "mpi_copy", ret );
1593 return( ret );
1594 }
Paul Bakker48916f92012-09-16 19:57:18 +00001595
Paul Bakker41c83d32013-03-20 14:39:14 +01001596 if( ( ret = dhm_make_params( &ssl->handshake->dhm_ctx,
1597 mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001598 p,
1599 &len, ssl->f_rng, ssl->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001600 {
1601 SSL_DEBUG_RET( 1, "dhm_make_params", ret );
1602 return( ret );
1603 }
1604
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001605 dig_sig = p;
1606 dig_sig_len = len;
1607
1608 p += len;
1609 n += len;
1610
Paul Bakker41c83d32013-03-20 14:39:14 +01001611 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1612 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
1613 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
1614 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
1615 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001616#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1617 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001618
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001619#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001620 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001621 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001622 /*
1623 * Ephemeral ECDH parameters:
1624 *
1625 * struct {
1626 * ECParameters curve_params;
1627 * ECPoint public;
1628 * } ServerECDHParams;
1629 */
Paul Bakker41c83d32013-03-20 14:39:14 +01001630 if( ( ret = ecp_use_known_dp( &ssl->handshake->ecdh_ctx.grp,
1631 ssl->handshake->ec_curve ) ) != 0 )
1632 {
1633 SSL_DEBUG_RET( 1, "ecp_use_known_dp", ret );
1634 return( ret );
1635 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001636
Paul Bakker41c83d32013-03-20 14:39:14 +01001637 if( ( ret = ecdh_make_params( &ssl->handshake->ecdh_ctx,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001638 &len,
1639 p,
Paul Bakker41c83d32013-03-20 14:39:14 +01001640 1000, ssl->f_rng, ssl->p_rng ) ) != 0 )
1641 {
1642 SSL_DEBUG_RET( 1, "ecdh_make_params", ret );
1643 return( ret );
1644 }
1645
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001646 dig_sig = p;
1647 dig_sig_len = len;
1648
1649 p += len;
1650 n += len;
1651
Paul Bakker41c83d32013-03-20 14:39:14 +01001652 SSL_DEBUG_ECP( 3, "ECDH: Q ", &ssl->handshake->ecdh_ctx.Q );
1653 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001654#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001655
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001656#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1657 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
1658 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1659 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001660 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001661 size_t rsa_key_len = 0;
Paul Bakker23f36802012-09-28 14:15:14 +00001662
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001663 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker23f36802012-09-28 14:15:14 +00001664 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001665 md5_context md5;
1666 sha1_context sha1;
1667
1668 /*
1669 * digitally-signed struct {
1670 * opaque md5_hash[16];
1671 * opaque sha_hash[20];
1672 * };
1673 *
1674 * md5_hash
1675 * MD5(ClientHello.random + ServerHello.random
1676 * + ServerParams);
1677 * sha_hash
1678 * SHA(ClientHello.random + ServerHello.random
1679 * + ServerParams);
1680 */
1681 md5_starts( &md5 );
1682 md5_update( &md5, ssl->handshake->randbytes, 64 );
1683 md5_update( &md5, dig_sig, dig_sig_len );
1684 md5_finish( &md5, hash );
1685
1686 sha1_starts( &sha1 );
1687 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
1688 sha1_update( &sha1, dig_sig, dig_sig_len );
1689 sha1_finish( &sha1, hash + 16 );
1690
1691 hashlen = 36;
1692 md_alg = POLARSSL_MD_NONE;
1693 }
1694 else
1695 {
1696 md_context_t ctx;
1697
1698 /*
1699 * digitally-signed struct {
1700 * opaque client_random[32];
1701 * opaque server_random[32];
1702 * ServerDHParams params;
1703 * };
1704 */
1705 switch( ssl->handshake->sig_alg )
1706 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001707#if defined(POLARSSL_MD5_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001708 case SSL_HASH_MD5:
1709 md_alg = POLARSSL_MD_MD5;
1710 break;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001711#endif
1712#if defined(POLARSSL_SHA1_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001713 case SSL_HASH_SHA1:
1714 md_alg = POLARSSL_MD_SHA1;
1715 break;
Paul Bakker23f36802012-09-28 14:15:14 +00001716#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001717#if defined(POLARSSL_SHA256_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001718 case SSL_HASH_SHA224:
1719 md_alg = POLARSSL_MD_SHA224;
1720 break;
1721 case SSL_HASH_SHA256:
1722 md_alg = POLARSSL_MD_SHA256;
1723 break;
Paul Bakker23f36802012-09-28 14:15:14 +00001724#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001725#if defined(POLARSSL_SHA512_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001726 case SSL_HASH_SHA384:
1727 md_alg = POLARSSL_MD_SHA384;
1728 break;
1729 case SSL_HASH_SHA512:
1730 md_alg = POLARSSL_MD_SHA512;
1731 break;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001732#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001733 default:
1734 /* Should never happen */
1735 return( -1 );
1736 }
1737
1738 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1739 {
1740 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1741 return( ret );
1742 }
1743
1744 md_starts( &ctx );
1745 md_update( &ctx, ssl->handshake->randbytes, 64 );
1746 md_update( &ctx, dig_sig, dig_sig_len );
1747 md_finish( &ctx, hash );
Paul Bakker61d113b2013-07-04 11:51:43 +02001748
1749 if( ( ret = md_free_ctx( &ctx ) ) != 0 )
1750 {
1751 SSL_DEBUG_RET( 1, "md_free_ctx", ret );
1752 return( ret );
1753 }
1754
Paul Bakker23f36802012-09-28 14:15:14 +00001755 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02001756
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001757 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
1758
1759 if ( ssl->rsa_key )
1760 rsa_key_len = ssl->rsa_key_len( ssl->rsa_key );
1761
1762 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker23f36802012-09-28 14:15:14 +00001763 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001764 *(p++) = ssl->handshake->sig_alg;
1765 *(p++) = SSL_SIG_RSA;
1766
1767 n += 2;
1768 }
1769
1770 *(p++) = (unsigned char)( rsa_key_len >> 8 );
1771 *(p++) = (unsigned char)( rsa_key_len );
1772 n += 2;
1773
1774 if ( ssl->rsa_key )
1775 {
1776 ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
1777 RSA_PRIVATE, md_alg, hashlen, hash, p );
1778 }
1779
1780 if( ret != 0 )
1781 {
1782 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001783 return( ret );
Paul Bakker23f36802012-09-28 14:15:14 +00001784 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02001785
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001786 SSL_DEBUG_BUF( 3, "my RSA sig", p, rsa_key_len );
1787
1788 p += rsa_key_len;
1789 n += rsa_key_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001790 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001791#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) ||
1792 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001793
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001794 ssl->out_msglen = 4 + n;
Paul Bakker5121ce52009-01-03 21:22:43 +00001795 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1796 ssl->out_msg[0] = SSL_HS_SERVER_KEY_EXCHANGE;
1797
1798 ssl->state++;
1799
1800 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1801 {
1802 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1803 return( ret );
1804 }
1805
1806 SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) );
1807
1808 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001809}
1810
1811static int ssl_write_server_hello_done( ssl_context *ssl )
1812{
1813 int ret;
1814
1815 SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) );
1816
1817 ssl->out_msglen = 4;
1818 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1819 ssl->out_msg[0] = SSL_HS_SERVER_HELLO_DONE;
1820
1821 ssl->state++;
1822
1823 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1824 {
1825 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1826 return( ret );
1827 }
1828
1829 SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) );
1830
1831 return( 0 );
1832}
1833
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001834#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1835 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1836static int ssl_parse_client_dh_public( ssl_context *ssl, unsigned char **p,
1837 const unsigned char *end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02001838{
1839 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02001840 size_t n;
1841
1842 /*
1843 * Receive G^Y mod P, premaster = (G^Y)^X mod P
1844 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001845 if( *p + 2 > end )
1846 {
1847 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1848 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1849 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02001850
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001851 n = ( (*p)[0] << 8 ) | (*p)[1];
1852 *p += 2;
1853
1854 if( n < 1 || n > ssl->handshake->dhm_ctx.len || *p + n > end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02001855 {
1856 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1857 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1858 }
1859
1860 if( ( ret = dhm_read_public( &ssl->handshake->dhm_ctx,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001861 *p, n ) ) != 0 )
Paul Bakker70df2fb2013-04-17 17:19:09 +02001862 {
1863 SSL_DEBUG_RET( 1, "dhm_read_public", ret );
1864 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
1865 }
1866
1867 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
1868
Paul Bakker70df2fb2013-04-17 17:19:09 +02001869 return( ret );
1870}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001871#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1872 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02001873
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001874#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker70df2fb2013-04-17 17:19:09 +02001875static int ssl_parse_client_ecdh_public( ssl_context *ssl )
1876{
1877 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02001878 size_t n;
1879
1880 /*
1881 * Receive client public key and calculate premaster
1882 */
1883 n = ssl->in_msg[3];
1884
1885 if( n < 1 || n > mpi_size( &ssl->handshake->ecdh_ctx.grp.P ) * 2 + 2 ||
1886 n + 4 != ssl->in_hslen )
1887 {
1888 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1889 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1890 }
1891
1892 if( ( ret = ecdh_read_public( &ssl->handshake->ecdh_ctx,
1893 ssl->in_msg + 4, n ) ) != 0 )
1894 {
1895 SSL_DEBUG_RET( 1, "ecdh_read_public", ret );
1896 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
1897 }
1898
1899 SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp );
1900
Paul Bakker70df2fb2013-04-17 17:19:09 +02001901 return( ret );
1902}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001903#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02001904
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001905#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakker70df2fb2013-04-17 17:19:09 +02001906static int ssl_parse_encrypted_pms_secret( ssl_context *ssl )
1907{
1908 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1909 size_t i, n = 0;
1910
1911 if( ssl->rsa_key == NULL )
1912 {
1913 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1914 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1915 }
1916
1917 /*
1918 * Decrypt the premaster using own private RSA key
1919 */
1920 i = 4;
1921 if( ssl->rsa_key )
1922 n = ssl->rsa_key_len( ssl->rsa_key );
1923 ssl->handshake->pmslen = 48;
1924
1925 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
1926 {
1927 i += 2;
1928 if( ssl->in_msg[4] != ( ( n >> 8 ) & 0xFF ) ||
1929 ssl->in_msg[5] != ( ( n ) & 0xFF ) )
1930 {
1931 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1932 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1933 }
1934 }
1935
1936 if( ssl->in_hslen != i + n )
1937 {
1938 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1939 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1940 }
1941
1942 if( ssl->rsa_key ) {
1943 ret = ssl->rsa_decrypt( ssl->rsa_key, RSA_PRIVATE,
1944 &ssl->handshake->pmslen,
1945 ssl->in_msg + i,
1946 ssl->handshake->premaster,
1947 sizeof(ssl->handshake->premaster) );
1948 }
1949
1950 if( ret != 0 || ssl->handshake->pmslen != 48 ||
Paul Bakker2fbefde2013-06-29 16:01:15 +02001951 ssl->handshake->premaster[0] != ssl->handshake->max_major_ver ||
1952 ssl->handshake->premaster[1] != ssl->handshake->max_minor_ver )
Paul Bakker70df2fb2013-04-17 17:19:09 +02001953 {
1954 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1955
1956 /*
1957 * Protection against Bleichenbacher's attack:
1958 * invalid PKCS#1 v1.5 padding must not cause
1959 * the connection to end immediately; instead,
1960 * send a bad_record_mac later in the handshake.
1961 */
1962 ssl->handshake->pmslen = 48;
1963
1964 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster,
1965 ssl->handshake->pmslen );
1966 if( ret != 0 )
1967 return( ret );
1968 }
1969
1970 return( ret );
1971}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001972#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02001973
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001974#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
1975 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1976static int ssl_parse_client_psk_identity( ssl_context *ssl, unsigned char **p,
1977 const unsigned char *end )
Paul Bakkerfbb17802013-04-17 19:10:21 +02001978{
1979 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerfbb17802013-04-17 19:10:21 +02001980 size_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02001981
1982 if( ssl->psk == NULL || ssl->psk_identity == NULL ||
1983 ssl->psk_identity_len == 0 || ssl->psk_len == 0 )
1984 {
1985 SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) );
1986 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1987 }
1988
1989 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001990 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02001991 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001992 if( *p + 2 > end )
1993 {
1994 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1995 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1996 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02001997
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001998 n = ( (*p)[0] << 8 ) | (*p)[1];
1999 *p += 2;
2000
2001 if( n < 1 || n > 65535 || *p + n > end )
Paul Bakkerfbb17802013-04-17 19:10:21 +02002002 {
2003 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
2004 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
2005 }
2006
2007 if( n != ssl->psk_identity_len ||
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002008 memcmp( ssl->psk_identity, *p, n ) != 0 )
Paul Bakkerfbb17802013-04-17 19:10:21 +02002009 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002010 SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n );
Paul Bakkerfbb17802013-04-17 19:10:21 +02002011 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
2012 }
2013
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002014 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02002015 ret = 0;
2016
Paul Bakkerfbb17802013-04-17 19:10:21 +02002017 return( ret );
2018}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002019#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
2020 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02002021
Paul Bakker5121ce52009-01-03 21:22:43 +00002022static int ssl_parse_client_key_exchange( ssl_context *ssl )
2023{
Paul Bakker23986e52011-04-24 08:57:21 +00002024 int ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002025 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002026 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02002027
Paul Bakker41c83d32013-03-20 14:39:14 +01002028 ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002029
2030 SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) );
2031
2032 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2033 {
2034 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2035 return( ret );
2036 }
2037
2038 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2039 {
2040 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002041 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002042 }
2043
2044 if( ssl->in_msg[0] != SSL_HS_CLIENT_KEY_EXCHANGE )
2045 {
2046 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002047 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002048 }
2049
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002050 p = ssl->in_msg + 4;
2051 end = ssl->in_msg + ssl->in_msglen;
2052
2053#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01002054 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00002055 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002056 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002057 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02002058 SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
2059 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002060 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002061
2062 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
2063
2064 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
2065 ssl->handshake->premaster,
2066 &ssl->handshake->pmslen ) ) != 0 )
2067 {
2068 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
2069 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
2070 }
2071
2072 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker70df2fb2013-04-17 17:19:09 +02002073 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002074 else
2075#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
2076#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
2077 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker70df2fb2013-04-17 17:19:09 +02002078 {
2079 if( ( ret = ssl_parse_client_ecdh_public( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002080 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02002081 SSL_DEBUG_RET( 1, ( "ssl_parse_client_ecdh_public" ), ret );
2082 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002083 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002084
2085 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
2086 &ssl->handshake->pmslen,
2087 ssl->handshake->premaster,
2088 POLARSSL_MPI_MAX_SIZE ) ) != 0 )
2089 {
2090 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
2091 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
2092 }
2093
2094 SSL_DEBUG_MPI( 3, "ECDH: z ", &ssl->handshake->ecdh_ctx.z );
Paul Bakker5121ce52009-01-03 21:22:43 +00002095 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002096 else
2097#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
2098#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
2099 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakkerfbb17802013-04-17 19:10:21 +02002100 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002101 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
Paul Bakkerfbb17802013-04-17 19:10:21 +02002102 {
2103 SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
2104 return( ret );
2105 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002106
2107 // Set up the premaster secret
2108 //
2109 p = ssl->handshake->premaster;
2110 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
2111 *(p++) = (unsigned char)( ssl->psk_len );
2112 p += ssl->psk_len;
2113
2114 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
2115 *(p++) = (unsigned char)( ssl->psk_len );
2116 memcpy( p, ssl->psk, ssl->psk_len );
2117 p += ssl->psk_len;
2118
2119 ssl->handshake->pmslen = 4 + 2 * ssl->psk_len;
Paul Bakkerfbb17802013-04-17 19:10:21 +02002120 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002121 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002122#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
2123#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
2124 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
2125 {
2126 size_t n;
2127
2128 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
2129 {
2130 SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
2131 return( ret );
2132 }
2133 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
2134 {
2135 SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
2136 return( ret );
2137 }
2138
2139 // Set up the premaster secret
2140 //
2141 p = ssl->handshake->premaster;
2142 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len >> 8 );
2143 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len );
2144
2145 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
2146 p, &n ) ) != 0 )
2147 {
2148 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
2149 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
2150 }
2151
2152 if( n != ssl->handshake->dhm_ctx.len )
2153 {
2154 SSL_DEBUG_MSG( 1, ( "dhm_calc_secret result smaller than DHM" ) );
2155 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
2156 }
2157
2158 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
2159
2160 p += ssl->handshake->dhm_ctx.len;
2161
2162 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
2163 *(p++) = (unsigned char)( ssl->psk_len );
2164 memcpy( p, ssl->psk, ssl->psk_len );
2165 p += ssl->psk_len;
2166
2167 ssl->handshake->pmslen = 4 + ssl->handshake->dhm_ctx.len + ssl->psk_len;
2168 }
2169 else
2170#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
2171#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
2172 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01002173 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02002174 if( ( ret = ssl_parse_encrypted_pms_secret( ssl ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01002175 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02002176 SSL_DEBUG_RET( 1, ( "ssl_parse_client_ecdh_public" ), ret );
2177 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002178 }
2179 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002180 else
2181#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
2182 {
2183 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
2184 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002185
Paul Bakkerff60ee62010-03-16 21:09:09 +00002186 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
2187 {
2188 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
2189 return( ret );
2190 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002191
Paul Bakker5121ce52009-01-03 21:22:43 +00002192 ssl->state++;
2193
2194 SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) );
2195
2196 return( 0 );
2197}
2198
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002199#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
2200 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
2201 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00002202static int ssl_parse_certificate_verify( ssl_context *ssl )
2203{
Paul Bakkered27a042013-04-18 22:46:23 +02002204 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerfbb17802013-04-17 19:10:21 +02002205 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002206
2207 SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
2208
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002209 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2210 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02002211 {
2212 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
2213 ssl->state++;
2214 return( 0 );
2215 }
2216
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002217 return( ret );
2218}
2219#else
2220static int ssl_parse_certificate_verify( ssl_context *ssl )
2221{
2222 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
2223 size_t n = 0, n1, n2;
2224 unsigned char hash[48];
2225 md_type_t md_alg = POLARSSL_MD_NONE;
2226 unsigned int hashlen = 0;
2227 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
2228
2229 SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
2230
2231 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2232 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
2233 {
2234 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
2235 ssl->state++;
2236 return( 0 );
2237 }
2238
Paul Bakkered27a042013-04-18 22:46:23 +02002239 if( ssl->session_negotiate->peer_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002240 {
2241 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
2242 ssl->state++;
2243 return( 0 );
2244 }
2245
Paul Bakker48916f92012-09-16 19:57:18 +00002246 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00002247
2248 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2249 {
2250 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2251 return( ret );
2252 }
2253
2254 ssl->state++;
2255
2256 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2257 {
2258 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002259 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00002260 }
2261
2262 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE_VERIFY )
2263 {
2264 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002265 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00002266 }
2267
Paul Bakker926af752012-11-23 13:38:07 +01002268 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
2269 {
2270 /*
2271 * As server we know we either have SSL_HASH_SHA384 or
2272 * SSL_HASH_SHA256
2273 */
2274 if( ssl->in_msg[4] != ssl->handshake->verify_sig_alg ||
2275 ssl->in_msg[5] != SSL_SIG_RSA )
2276 {
2277 SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg for verify message" ) );
2278 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
2279 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002280
Paul Bakker926af752012-11-23 13:38:07 +01002281 if( ssl->handshake->verify_sig_alg == SSL_HASH_SHA384 )
Paul Bakkerc70b9822013-04-07 22:00:46 +02002282 md_alg = POLARSSL_MD_SHA384;
Paul Bakker926af752012-11-23 13:38:07 +01002283 else
Paul Bakkerc70b9822013-04-07 22:00:46 +02002284 md_alg = POLARSSL_MD_SHA256;
Paul Bakker926af752012-11-23 13:38:07 +01002285
2286 n += 2;
2287 }
2288 else
2289 {
2290 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02002291 md_alg = POLARSSL_MD_NONE;
Paul Bakker926af752012-11-23 13:38:07 +01002292 }
2293
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02002294 /* EC NOT IMPLEMENTED YET */
2295 if( ssl->session_negotiate->peer_cert->pk.type != POLARSSL_PK_RSA )
2296 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
2297
2298 n1 = pk_rsa( ssl->session_negotiate->peer_cert->pk )->len;
Paul Bakker78ce5072012-11-23 14:23:53 +01002299 n2 = ( ssl->in_msg[4 + n] << 8 ) | ssl->in_msg[5 + n];
Paul Bakker926af752012-11-23 13:38:07 +01002300
2301 if( n + n1 + 6 != ssl->in_hslen || n1 != n2 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002302 {
2303 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002304 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00002305 }
2306
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02002307 ret = rsa_pkcs1_verify( pk_rsa( ssl->session_negotiate->peer_cert->pk ),
2308 RSA_PUBLIC, md_alg, hashlen, hash,
2309 ssl->in_msg + 6 + n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002310 if( ret != 0 )
2311 {
2312 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
2313 return( ret );
2314 }
2315
2316 SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
2317
Paul Bakkered27a042013-04-18 22:46:23 +02002318 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002319}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002320#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2321 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2322 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002323
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002324static int ssl_write_new_session_ticket( ssl_context *ssl )
2325{
2326 int ret;
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02002327 size_t tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002328
2329 SSL_DEBUG_MSG( 2, ( "=> write new session ticket" ) );
2330
2331 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2332 ssl->out_msg[0] = SSL_HS_NEW_SESSION_TICKET;
2333
2334 /*
2335 * struct {
2336 * uint32 ticket_lifetime_hint;
2337 * opaque ticket<0..2^16-1>;
2338 * } NewSessionTicket;
2339 *
2340 * 4 . 7 ticket_lifetime_hint (0 = unspecified)
2341 * 8 . 9 ticket_len (n)
2342 * 10 . 9+n ticket content
2343 */
2344 ssl->out_msg[4] = 0x00;
2345 ssl->out_msg[5] = 0x00;
2346 ssl->out_msg[6] = 0x00;
2347 ssl->out_msg[7] = 0x00;
2348
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02002349 ssl_save_session( ssl->session_negotiate, ssl->out_msg + 10, &tlen );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002350
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02002351 ssl->out_msg[8] = (unsigned char)( ( tlen >> 8 ) & 0xFF );
2352 ssl->out_msg[9] = (unsigned char)( ( tlen ) & 0xFF );
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002353
Manuel Pégourié-Gonnard609bc812013-08-01 15:08:40 +02002354 ssl->out_msglen = 10 + tlen;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002355
2356 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2357 {
2358 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2359 return( ret );
2360 }
2361
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002362 /* No need to remember writing a NewSessionTicket any more */
2363 ssl->handshake->new_session_ticket = 0;
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002364
2365 SSL_DEBUG_MSG( 2, ( "<= write new session ticket" ) );
2366
2367 return( 0 );
2368}
2369
Paul Bakker5121ce52009-01-03 21:22:43 +00002370/*
Paul Bakker1961b702013-01-25 14:49:24 +01002371 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00002372 */
Paul Bakker1961b702013-01-25 14:49:24 +01002373int ssl_handshake_server_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002374{
2375 int ret = 0;
2376
Paul Bakker1961b702013-01-25 14:49:24 +01002377 if( ssl->state == SSL_HANDSHAKE_OVER )
2378 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002379
Paul Bakker1961b702013-01-25 14:49:24 +01002380 SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) );
2381
2382 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
2383 return( ret );
2384
2385 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00002386 {
Paul Bakker1961b702013-01-25 14:49:24 +01002387 case SSL_HELLO_REQUEST:
2388 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002389 break;
2390
Paul Bakker1961b702013-01-25 14:49:24 +01002391 /*
2392 * <== ClientHello
2393 */
2394 case SSL_CLIENT_HELLO:
2395 ret = ssl_parse_client_hello( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00002396 break;
Paul Bakker1961b702013-01-25 14:49:24 +01002397
2398 /*
2399 * ==> ServerHello
2400 * Certificate
2401 * ( ServerKeyExchange )
2402 * ( CertificateRequest )
2403 * ServerHelloDone
2404 */
2405 case SSL_SERVER_HELLO:
2406 ret = ssl_write_server_hello( ssl );
2407 break;
2408
2409 case SSL_SERVER_CERTIFICATE:
2410 ret = ssl_write_certificate( ssl );
2411 break;
2412
2413 case SSL_SERVER_KEY_EXCHANGE:
2414 ret = ssl_write_server_key_exchange( ssl );
2415 break;
2416
2417 case SSL_CERTIFICATE_REQUEST:
2418 ret = ssl_write_certificate_request( ssl );
2419 break;
2420
2421 case SSL_SERVER_HELLO_DONE:
2422 ret = ssl_write_server_hello_done( ssl );
2423 break;
2424
2425 /*
2426 * <== ( Certificate/Alert )
2427 * ClientKeyExchange
2428 * ( CertificateVerify )
2429 * ChangeCipherSpec
2430 * Finished
2431 */
2432 case SSL_CLIENT_CERTIFICATE:
2433 ret = ssl_parse_certificate( ssl );
2434 break;
2435
2436 case SSL_CLIENT_KEY_EXCHANGE:
2437 ret = ssl_parse_client_key_exchange( ssl );
2438 break;
2439
2440 case SSL_CERTIFICATE_VERIFY:
2441 ret = ssl_parse_certificate_verify( ssl );
2442 break;
2443
2444 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
2445 ret = ssl_parse_change_cipher_spec( ssl );
2446 break;
2447
2448 case SSL_CLIENT_FINISHED:
2449 ret = ssl_parse_finished( ssl );
2450 break;
2451
2452 /*
Manuel Pégourié-Gonnard7a358b82013-08-01 11:47:56 +02002453 * ==> ( NewSessionTicket )
2454 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01002455 * Finished
2456 */
2457 case SSL_SERVER_CHANGE_CIPHER_SPEC:
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002458 if( ssl->handshake->new_session_ticket != 0 )
2459 ret = ssl_write_new_session_ticket( ssl );
2460 else
2461 ret = ssl_write_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01002462 break;
2463
2464 case SSL_SERVER_FINISHED:
2465 ret = ssl_write_finished( ssl );
2466 break;
2467
2468 case SSL_FLUSH_BUFFERS:
2469 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
2470 ssl->state = SSL_HANDSHAKE_WRAPUP;
2471 break;
2472
2473 case SSL_HANDSHAKE_WRAPUP:
2474 ssl_handshake_wrapup( ssl );
2475 break;
2476
2477 default:
2478 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
2479 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002480 }
2481
Paul Bakker5121ce52009-01-03 21:22:43 +00002482 return( ret );
2483}
Paul Bakker5121ce52009-01-03 21:22:43 +00002484#endif