blob: f053ba28a8697516171e34814f2f22f412b2419d [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
Paul Bakker5121ce52009-01-03 21:22:43 +000036#include <stdlib.h>
37#include <stdio.h>
38#include <time.h>
39
Paul Bakker5701cdc2012-09-27 21:49:42 +000040static int ssl_parse_servername_ext( ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +000041 const unsigned char *buf,
Paul Bakker5701cdc2012-09-27 21:49:42 +000042 size_t len )
43{
44 int ret;
45 size_t servername_list_size, hostname_len;
Paul Bakker23f36802012-09-28 14:15:14 +000046 const unsigned char *p;
Paul Bakker5701cdc2012-09-27 21:49:42 +000047
48 servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
49 if( servername_list_size + 2 != len )
50 {
51 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
52 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
53 }
54
55 p = buf + 2;
56 while( servername_list_size > 0 )
57 {
58 hostname_len = ( ( p[1] << 8 ) | p[2] );
59 if( hostname_len + 3 > servername_list_size )
60 {
61 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
62 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
63 }
64
65 if( p[0] == TLS_EXT_SERVERNAME_HOSTNAME )
66 {
67 ret = ssl->f_sni( ssl->p_sni, ssl, p + 3, hostname_len );
68 if( ret != 0 )
69 {
70 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
71 SSL_ALERT_MSG_UNRECOGNIZED_NAME );
72 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
73 }
Paul Bakker81420ab2012-10-23 10:31:15 +000074 return( 0 );
Paul Bakker5701cdc2012-09-27 21:49:42 +000075 }
76
77 servername_list_size -= hostname_len + 3;
Paul Bakker23f36802012-09-28 14:15:14 +000078 p += hostname_len + 3;
79 }
80
81 if( servername_list_size != 0 )
82 {
83 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
84 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
Paul Bakker5701cdc2012-09-27 21:49:42 +000085 }
86
87 return( 0 );
88}
89
Paul Bakker48916f92012-09-16 19:57:18 +000090static int ssl_parse_renegotiation_info( ssl_context *ssl,
Paul Bakker23f36802012-09-28 14:15:14 +000091 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +000092 size_t len )
93{
Paul Bakkerd0f6fa72012-09-17 09:18:12 +000094 int ret;
95
Paul Bakker48916f92012-09-16 19:57:18 +000096 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
97 {
98 if( len != 1 || buf[0] != 0x0 )
99 {
100 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000101
102 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
103 return( ret );
104
Paul Bakker48916f92012-09-16 19:57:18 +0000105 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
106 }
107
108 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
109 }
110 else
111 {
112 if( len != 1 + ssl->verify_data_len ||
113 buf[0] != ssl->verify_data_len ||
114 memcmp( buf + 1, ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
115 {
116 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000117
118 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
119 return( ret );
120
Paul Bakker48916f92012-09-16 19:57:18 +0000121 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
122 }
123 }
124
125 return( 0 );
126}
127
Paul Bakker23f36802012-09-28 14:15:14 +0000128static int ssl_parse_signature_algorithms_ext( ssl_context *ssl,
129 const unsigned char *buf,
130 size_t len )
131{
132 size_t sig_alg_list_size;
133 const unsigned char *p;
134
135 sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
136 if( sig_alg_list_size + 2 != len ||
137 sig_alg_list_size %2 != 0 )
138 {
139 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
140 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
141 }
142
143 p = buf + 2;
144 while( sig_alg_list_size > 0 )
145 {
146 if( p[1] != SSL_SIG_RSA )
Paul Bakker8611e732012-10-30 07:52:29 +0000147 {
148 sig_alg_list_size -= 2;
149 p += 2;
Paul Bakker23f36802012-09-28 14:15:14 +0000150 continue;
Paul Bakker8611e732012-10-30 07:52:29 +0000151 }
Paul Bakker23f36802012-09-28 14:15:14 +0000152#if defined(POLARSSL_SHA4_C)
153 if( p[0] == SSL_HASH_SHA512 )
154 {
155 ssl->handshake->sig_alg = SSL_HASH_SHA512;
156 break;
157 }
158 if( p[0] == SSL_HASH_SHA384 )
159 {
160 ssl->handshake->sig_alg = SSL_HASH_SHA384;
161 break;
162 }
163#endif
164#if defined(POLARSSL_SHA2_C)
165 if( p[0] == SSL_HASH_SHA256 )
166 {
167 ssl->handshake->sig_alg = SSL_HASH_SHA256;
168 break;
169 }
170 if( p[0] == SSL_HASH_SHA224 )
171 {
172 ssl->handshake->sig_alg = SSL_HASH_SHA224;
173 break;
174 }
175#endif
176 if( p[0] == SSL_HASH_SHA1 )
177 {
178 ssl->handshake->sig_alg = SSL_HASH_SHA1;
179 break;
180 }
181 if( p[0] == SSL_HASH_MD5 )
182 {
183 ssl->handshake->sig_alg = SSL_HASH_MD5;
184 break;
185 }
186
187 sig_alg_list_size -= 2;
188 p += 2;
189 }
190
191 SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d",
192 ssl->handshake->sig_alg ) );
193
194 return( 0 );
195}
196
Paul Bakker41c83d32013-03-20 14:39:14 +0100197#if defined(POLARSSL_ECP_C)
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200198static int ssl_parse_supported_elliptic_curves( ssl_context *ssl,
199 const unsigned char *buf,
200 size_t len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100201{
202 size_t list_size;
203 const unsigned char *p;
204
205 list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );
206 if( list_size + 2 != len ||
207 list_size % 2 != 0 )
208 {
209 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
210 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
211 }
212
213 p = buf + 2;
214 while( list_size > 0 )
215 {
216 if( p[0] == 0x00 && (
217 p[1] == POLARSSL_ECP_DP_SECP192R1 ||
218 p[1] == POLARSSL_ECP_DP_SECP224R1 ||
219 p[1] == POLARSSL_ECP_DP_SECP256R1 ||
220 p[1] == POLARSSL_ECP_DP_SECP384R1 ||
221 p[1] == POLARSSL_ECP_DP_SECP521R1 ) )
222 {
223 ssl->handshake->ec_curve = p[1];
224 return( 0 );
225 }
226
227 list_size -= 2;
228 p += 2;
229 }
230
231 return( 0 );
232}
233
Paul Bakkerb6c5d2e2013-06-25 16:25:17 +0200234static int ssl_parse_supported_point_formats( ssl_context *ssl,
235 const unsigned char *buf,
236 size_t len )
Paul Bakker41c83d32013-03-20 14:39:14 +0100237{
238 size_t list_size;
239 const unsigned char *p;
240
241 list_size = buf[0];
242 if( list_size + 1 != len )
243 {
244 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
245 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
246 }
247
248 p = buf + 2;
249 while( list_size > 0 )
250 {
251 if( p[0] == POLARSSL_ECP_PF_UNCOMPRESSED ||
252 p[0] == POLARSSL_ECP_PF_COMPRESSED )
253 {
254 ssl->handshake->ec_point_format = p[0];
255 return( 0 );
256 }
257
258 list_size--;
259 p++;
260 }
261
262 return( 0 );
263}
264#endif /* POLARSSL_ECP_C */
265
Paul Bakker78a8c712013-03-06 17:01:52 +0100266#if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
267static int ssl_parse_client_hello_v2( ssl_context *ssl )
268{
269 int ret;
270 unsigned int i, j;
271 size_t n;
272 unsigned int ciph_len, sess_len, chal_len;
273 unsigned char *buf, *p;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200274 const int *ciphersuites;
Paul Bakker59c28a22013-06-29 15:33:42 +0200275 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker78a8c712013-03-06 17:01:52 +0100276
277 SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) );
278
279 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE )
280 {
281 SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) );
282
283 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
284 return( ret );
285
286 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
287 }
288
289 buf = ssl->in_hdr;
290
291 SSL_DEBUG_BUF( 4, "record header", buf, 5 );
292
293 SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d",
294 buf[2] ) );
295 SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d",
296 ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) );
297 SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]",
298 buf[3], buf[4] ) );
299
300 /*
301 * SSLv2 Client Hello
302 *
303 * Record layer:
304 * 0 . 1 message length
305 *
306 * SSL layer:
307 * 2 . 2 message type
308 * 3 . 4 protocol version
309 */
310 if( buf[2] != SSL_HS_CLIENT_HELLO ||
311 buf[3] != SSL_MAJOR_VERSION_3 )
312 {
313 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
314 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
315 }
316
317 n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF;
318
319 if( n < 17 || n > 512 )
320 {
321 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
322 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
323 }
324
325 ssl->major_ver = SSL_MAJOR_VERSION_3;
326 ssl->minor_ver = ( buf[4] <= SSL_MINOR_VERSION_3 )
327 ? buf[4] : SSL_MINOR_VERSION_3;
328
329 if( ssl->minor_ver < ssl->min_minor_ver )
330 {
331 SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
332 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
333 ssl->min_major_ver, ssl->min_minor_ver ) );
334
335 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
336 SSL_ALERT_MSG_PROTOCOL_VERSION );
337 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
338 }
339
340 ssl->max_major_ver = buf[3];
341 ssl->max_minor_ver = buf[4];
342
343 if( ( ret = ssl_fetch_input( ssl, 2 + n ) ) != 0 )
344 {
345 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
346 return( ret );
347 }
348
349 ssl->handshake->update_checksum( ssl, buf + 2, n );
350
351 buf = ssl->in_msg;
352 n = ssl->in_left - 5;
353
354 /*
355 * 0 . 1 ciphersuitelist length
356 * 2 . 3 session id length
357 * 4 . 5 challenge length
358 * 6 . .. ciphersuitelist
359 * .. . .. session id
360 * .. . .. challenge
361 */
362 SSL_DEBUG_BUF( 4, "record contents", buf, n );
363
364 ciph_len = ( buf[0] << 8 ) | buf[1];
365 sess_len = ( buf[2] << 8 ) | buf[3];
366 chal_len = ( buf[4] << 8 ) | buf[5];
367
368 SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d",
369 ciph_len, sess_len, chal_len ) );
370
371 /*
372 * Make sure each parameter length is valid
373 */
374 if( ciph_len < 3 || ( ciph_len % 3 ) != 0 )
375 {
376 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
377 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
378 }
379
380 if( sess_len > 32 )
381 {
382 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
383 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
384 }
385
386 if( chal_len < 8 || chal_len > 32 )
387 {
388 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
389 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
390 }
391
392 if( n != 6 + ciph_len + sess_len + chal_len )
393 {
394 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
395 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
396 }
397
398 SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
399 buf + 6, ciph_len );
400 SSL_DEBUG_BUF( 3, "client hello, session id",
401 buf + 6 + ciph_len, sess_len );
402 SSL_DEBUG_BUF( 3, "client hello, challenge",
403 buf + 6 + ciph_len + sess_len, chal_len );
404
405 p = buf + 6 + ciph_len;
406 ssl->session_negotiate->length = sess_len;
407 memset( ssl->session_negotiate->id, 0, sizeof( ssl->session_negotiate->id ) );
408 memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->length );
409
410 p += sess_len;
411 memset( ssl->handshake->randbytes, 0, 64 );
412 memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len );
413
414 /*
415 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
416 */
417 for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )
418 {
419 if( p[0] == 0 && p[1] == 0 && p[2] == SSL_EMPTY_RENEGOTIATION_INFO )
420 {
421 SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
422 if( ssl->renegotiation == SSL_RENEGOTIATION )
423 {
424 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
425
426 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
427 return( ret );
428
429 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
430 }
431 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
432 break;
433 }
434 }
435
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200436 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
437 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker78a8c712013-03-06 17:01:52 +0100438 {
439 for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
440 {
Paul Bakker41c83d32013-03-20 14:39:14 +0100441 // Only allow non-ECC ciphersuites as we do not have extensions
442 //
Paul Bakker59c28a22013-06-29 15:33:42 +0200443 if( p[0] == 0 && p[1] == 0 &&
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200444 ( ( ciphersuites[i] >> 8 ) & 0xFF ) == 0 &&
445 p[2] == ( ciphersuites[i] & 0xFF ) )
Paul Bakker59c28a22013-06-29 15:33:42 +0200446 {
447 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
448
449 if( ciphersuite_info == NULL )
450 {
451 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
452 ciphersuites[i] ) );
453 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
454 }
455
456
Paul Bakker78a8c712013-03-06 17:01:52 +0100457 goto have_ciphersuite_v2;
Paul Bakker59c28a22013-06-29 15:33:42 +0200458 }
Paul Bakker78a8c712013-03-06 17:01:52 +0100459 }
460 }
461
462 SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
463
464 return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
465
466have_ciphersuite_v2:
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200467 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Paul Bakker59c28a22013-06-29 15:33:42 +0200468 ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
Paul Bakker41c83d32013-03-20 14:39:14 +0100469 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
Paul Bakker78a8c712013-03-06 17:01:52 +0100470
471 /*
472 * SSLv2 Client Hello relevant renegotiation security checks
473 */
474 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
475 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
476 {
477 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
478
479 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
480 return( ret );
481
482 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
483 }
484
485 ssl->in_left = 0;
486 ssl->state++;
487
488 SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) );
489
490 return( 0 );
491}
492#endif /* POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
493
Paul Bakker5121ce52009-01-03 21:22:43 +0000494static int ssl_parse_client_hello( ssl_context *ssl )
495{
Paul Bakker23986e52011-04-24 08:57:21 +0000496 int ret;
497 unsigned int i, j;
498 size_t n;
499 unsigned int ciph_len, sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +0000500 unsigned int comp_len;
Paul Bakker48916f92012-09-16 19:57:18 +0000501 unsigned int ext_len = 0;
502 unsigned char *buf, *p, *ext;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000503 int renegotiation_info_seen = 0;
504 int handshake_failure = 0;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200505 const int *ciphersuites;
Paul Bakker41c83d32013-03-20 14:39:14 +0100506 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000507
508 SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
509
Paul Bakker48916f92012-09-16 19:57:18 +0000510 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
511 ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000512 {
513 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
514 return( ret );
515 }
516
517 buf = ssl->in_hdr;
518
Paul Bakker78a8c712013-03-06 17:01:52 +0100519#if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
520 if( ( buf[0] & 0x80 ) != 0 )
521 return ssl_parse_client_hello_v2( ssl );
522#endif
523
Paul Bakkerec636f32012-09-09 19:17:02 +0000524 SSL_DEBUG_BUF( 4, "record header", buf, 5 );
525
526 SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d",
527 buf[0] ) );
528 SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d",
529 ( buf[3] << 8 ) | buf[4] ) );
530 SSL_DEBUG_MSG( 3, ( "client hello v3, protocol ver: [%d:%d]",
531 buf[1], buf[2] ) );
532
533 /*
534 * SSLv3 Client Hello
535 *
536 * Record layer:
537 * 0 . 0 message type
538 * 1 . 2 protocol version
539 * 3 . 4 message length
540 */
541 if( buf[0] != SSL_MSG_HANDSHAKE ||
542 buf[1] != SSL_MAJOR_VERSION_3 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000543 {
Paul Bakkerec636f32012-09-09 19:17:02 +0000544 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
545 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
546 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000547
Paul Bakkerec636f32012-09-09 19:17:02 +0000548 n = ( buf[3] << 8 ) | buf[4];
Paul Bakker5121ce52009-01-03 21:22:43 +0000549
Paul Bakkerec636f32012-09-09 19:17:02 +0000550 if( n < 45 || n > 512 )
551 {
552 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
553 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
554 }
555
Paul Bakker48916f92012-09-16 19:57:18 +0000556 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
557 ( ret = ssl_fetch_input( ssl, 5 + n ) ) != 0 )
Paul Bakkerec636f32012-09-09 19:17:02 +0000558 {
559 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
560 return( ret );
561 }
562
563 buf = ssl->in_msg;
Paul Bakker48916f92012-09-16 19:57:18 +0000564 if( !ssl->renegotiation )
565 n = ssl->in_left - 5;
566 else
567 n = ssl->in_msglen;
Paul Bakkerec636f32012-09-09 19:17:02 +0000568
Paul Bakker48916f92012-09-16 19:57:18 +0000569 ssl->handshake->update_checksum( ssl, buf, n );
Paul Bakkerec636f32012-09-09 19:17:02 +0000570
571 /*
572 * SSL layer:
573 * 0 . 0 handshake type
574 * 1 . 3 handshake length
575 * 4 . 5 protocol version
576 * 6 . 9 UNIX time()
577 * 10 . 37 random bytes
578 * 38 . 38 session id length
579 * 39 . 38+x session id
580 * 39+x . 40+x ciphersuitelist length
581 * 41+x . .. ciphersuitelist
582 * .. . .. compression alg.
583 * .. . .. extensions
584 */
585 SSL_DEBUG_BUF( 4, "record contents", buf, n );
586
587 SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d",
588 buf[0] ) );
589 SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d",
590 ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) );
591 SSL_DEBUG_MSG( 3, ( "client hello v3, max. version: [%d:%d]",
592 buf[4], buf[5] ) );
593
594 /*
595 * Check the handshake type and protocol version
596 */
597 if( buf[0] != SSL_HS_CLIENT_HELLO ||
598 buf[4] != SSL_MAJOR_VERSION_3 )
599 {
600 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
601 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
602 }
603
604 ssl->major_ver = SSL_MAJOR_VERSION_3;
605 ssl->minor_ver = ( buf[5] <= SSL_MINOR_VERSION_3 )
606 ? buf[5] : SSL_MINOR_VERSION_3;
607
Paul Bakker1d29fb52012-09-28 13:28:45 +0000608 if( ssl->minor_ver < ssl->min_minor_ver )
609 {
610 SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
611 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
Paul Bakker81420ab2012-10-23 10:31:15 +0000612 ssl->min_major_ver, ssl->min_minor_ver ) );
Paul Bakker1d29fb52012-09-28 13:28:45 +0000613
614 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
615 SSL_ALERT_MSG_PROTOCOL_VERSION );
616
617 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
618 }
619
Paul Bakkerec636f32012-09-09 19:17:02 +0000620 ssl->max_major_ver = buf[4];
621 ssl->max_minor_ver = buf[5];
622
Paul Bakker48916f92012-09-16 19:57:18 +0000623 memcpy( ssl->handshake->randbytes, buf + 6, 32 );
Paul Bakkerec636f32012-09-09 19:17:02 +0000624
625 /*
626 * Check the handshake message length
627 */
628 if( buf[1] != 0 || n != (unsigned int) 4 + ( ( buf[2] << 8 ) | buf[3] ) )
629 {
630 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
631 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
632 }
633
634 /*
635 * Check the session length
636 */
637 sess_len = buf[38];
638
639 if( sess_len > 32 )
640 {
641 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
642 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
643 }
644
Paul Bakker48916f92012-09-16 19:57:18 +0000645 ssl->session_negotiate->length = sess_len;
646 memset( ssl->session_negotiate->id, 0,
647 sizeof( ssl->session_negotiate->id ) );
648 memcpy( ssl->session_negotiate->id, buf + 39,
649 ssl->session_negotiate->length );
Paul Bakkerec636f32012-09-09 19:17:02 +0000650
651 /*
652 * Check the ciphersuitelist length
653 */
654 ciph_len = ( buf[39 + sess_len] << 8 )
655 | ( buf[40 + sess_len] );
656
657 if( ciph_len < 2 || ciph_len > 256 || ( ciph_len % 2 ) != 0 )
658 {
659 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
660 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
661 }
662
663 /*
664 * Check the compression algorithms length
665 */
666 comp_len = buf[41 + sess_len + ciph_len];
667
668 if( comp_len < 1 || comp_len > 16 )
669 {
670 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
671 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
672 }
673
Paul Bakker48916f92012-09-16 19:57:18 +0000674 /*
675 * Check the extension length
676 */
677 if( n > 42 + sess_len + ciph_len + comp_len )
678 {
679 ext_len = ( buf[42 + sess_len + ciph_len + comp_len] << 8 )
680 | ( buf[43 + sess_len + ciph_len + comp_len] );
681
682 if( ( ext_len > 0 && ext_len < 4 ) ||
683 n != 44 + sess_len + ciph_len + comp_len + ext_len )
684 {
685 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
686 SSL_DEBUG_BUF( 3, "Ext", buf + 44 + sess_len + ciph_len + comp_len, ext_len);
687 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
688 }
689 }
690
691 ssl->session_negotiate->compression = SSL_COMPRESS_NULL;
Paul Bakkerec636f32012-09-09 19:17:02 +0000692#if defined(POLARSSL_ZLIB_SUPPORT)
693 for( i = 0; i < comp_len; ++i )
694 {
Paul Bakker48916f92012-09-16 19:57:18 +0000695 if( buf[42 + sess_len + ciph_len + i] == SSL_COMPRESS_DEFLATE )
Paul Bakker5121ce52009-01-03 21:22:43 +0000696 {
Paul Bakker48916f92012-09-16 19:57:18 +0000697 ssl->session_negotiate->compression = SSL_COMPRESS_DEFLATE;
Paul Bakkerec636f32012-09-09 19:17:02 +0000698 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000699 }
700 }
Paul Bakker2770fbd2012-07-03 13:30:23 +0000701#endif
702
Paul Bakkerec636f32012-09-09 19:17:02 +0000703 SSL_DEBUG_BUF( 3, "client hello, random bytes",
704 buf + 6, 32 );
705 SSL_DEBUG_BUF( 3, "client hello, session id",
706 buf + 38, sess_len );
707 SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
708 buf + 41 + sess_len, ciph_len );
709 SSL_DEBUG_BUF( 3, "client hello, compression",
710 buf + 42 + sess_len + ciph_len, comp_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000711
Paul Bakkerec636f32012-09-09 19:17:02 +0000712 /*
Paul Bakker48916f92012-09-16 19:57:18 +0000713 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
714 */
715 for( i = 0, p = buf + 41 + sess_len; i < ciph_len; i += 2, p += 2 )
716 {
717 if( p[0] == 0 && p[1] == SSL_EMPTY_RENEGOTIATION_INFO )
718 {
719 SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
720 if( ssl->renegotiation == SSL_RENEGOTIATION )
721 {
722 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000723
724 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
725 return( ret );
726
Paul Bakker48916f92012-09-16 19:57:18 +0000727 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
728 }
729 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
730 break;
731 }
732 }
733
Paul Bakker48916f92012-09-16 19:57:18 +0000734 ext = buf + 44 + sess_len + ciph_len + comp_len;
Paul Bakker48916f92012-09-16 19:57:18 +0000735
736 while( ext_len )
737 {
738 unsigned int ext_id = ( ( ext[0] << 8 )
739 | ( ext[1] ) );
740 unsigned int ext_size = ( ( ext[2] << 8 )
741 | ( ext[3] ) );
742
743 if( ext_size + 4 > ext_len )
744 {
745 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
746 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
747 }
748 switch( ext_id )
749 {
Paul Bakker5701cdc2012-09-27 21:49:42 +0000750 case TLS_EXT_SERVERNAME:
751 SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
752 if( ssl->f_sni == NULL )
753 break;
754
755 ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size );
756 if( ret != 0 )
757 return( ret );
758 break;
759
Paul Bakker48916f92012-09-16 19:57:18 +0000760 case TLS_EXT_RENEGOTIATION_INFO:
761 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
762 renegotiation_info_seen = 1;
763
Paul Bakker23f36802012-09-28 14:15:14 +0000764 ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size );
765 if( ret != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +0000766 return( ret );
Paul Bakker23f36802012-09-28 14:15:14 +0000767 break;
Paul Bakker48916f92012-09-16 19:57:18 +0000768
Paul Bakker23f36802012-09-28 14:15:14 +0000769 case TLS_EXT_SIG_ALG:
770 SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
771 if( ssl->renegotiation == SSL_RENEGOTIATION )
772 break;
773
774 ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size );
775 if( ret != 0 )
776 return( ret );
Paul Bakker48916f92012-09-16 19:57:18 +0000777 break;
778
Paul Bakker41c83d32013-03-20 14:39:14 +0100779#if defined(POLARSSL_ECP_C)
780 case TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:
781 SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) );
782
783 ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size );
784 if( ret != 0 )
785 return( ret );
786 break;
787
788 case TLS_EXT_SUPPORTED_POINT_FORMATS:
789 SSL_DEBUG_MSG( 3, ( "found supported point formats extension" ) );
790
791 ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size );
792 if( ret != 0 )
793 return( ret );
794 break;
795#endif /* POLARSSL_ECP_C */
796
Paul Bakker48916f92012-09-16 19:57:18 +0000797 default:
798 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
799 ext_id ) );
800 }
801
802 ext_len -= 4 + ext_size;
803 ext += 4 + ext_size;
804
805 if( ext_len > 0 && ext_len < 4 )
806 {
807 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
808 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
809 }
810 }
811
812 /*
813 * Renegotiation security checks
814 */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000815 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
816 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
817 {
818 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
819 handshake_failure = 1;
820 }
821 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
822 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
823 renegotiation_info_seen == 0 )
Paul Bakker48916f92012-09-16 19:57:18 +0000824 {
825 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000826 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +0000827 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000828 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
829 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
830 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +0000831 {
832 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000833 handshake_failure = 1;
834 }
835 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
836 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
837 renegotiation_info_seen == 1 )
838 {
839 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
840 handshake_failure = 1;
841 }
842
843 if( handshake_failure == 1 )
844 {
845 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
846 return( ret );
847
Paul Bakker48916f92012-09-16 19:57:18 +0000848 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
849 }
Paul Bakker380da532012-04-18 16:10:25 +0000850
Paul Bakker41c83d32013-03-20 14:39:14 +0100851 /*
852 * Search for a matching ciphersuite
853 * (At the end because we need information from the EC-based extensions)
854 */
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200855 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
856 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker41c83d32013-03-20 14:39:14 +0100857 {
858 for( j = 0, p = buf + 41 + sess_len; j < ciph_len;
859 j += 2, p += 2 )
860 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200861 if( p[0] == ( ( ciphersuites[i] >> 8 ) & 0xFF ) &&
862 p[1] == ( ( ciphersuites[i] ) & 0xFF ) )
Paul Bakker41c83d32013-03-20 14:39:14 +0100863 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200864 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
Paul Bakker41c83d32013-03-20 14:39:14 +0100865
866 if( ciphersuite_info == NULL )
867 {
868 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200869 ciphersuites[i] ) );
Paul Bakker41c83d32013-03-20 14:39:14 +0100870 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
871 }
872
873 if( ( ciphersuite_info->flags & POLARSSL_CIPHERSUITE_EC ) &&
874 ssl->handshake->ec_curve == 0 )
875 continue;
876
877 goto have_ciphersuite;
878 }
879 }
880 }
881
882 SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
883
884 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
885 return( ret );
886
887 return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
888
889have_ciphersuite:
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200890 ssl->session_negotiate->ciphersuite = ciphersuites[i];
Paul Bakker41c83d32013-03-20 14:39:14 +0100891 ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;
892 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
893
Paul Bakker5121ce52009-01-03 21:22:43 +0000894 ssl->in_left = 0;
895 ssl->state++;
896
897 SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
898
899 return( 0 );
900}
901
902static int ssl_write_server_hello( ssl_context *ssl )
903{
904 time_t t;
Paul Bakkera3d195c2011-11-27 21:07:34 +0000905 int ret, n;
Paul Bakker48916f92012-09-16 19:57:18 +0000906 size_t ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000907 unsigned char *buf, *p;
908
909 SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
910
911 /*
912 * 0 . 0 handshake type
913 * 1 . 3 handshake length
914 * 4 . 5 protocol version
915 * 6 . 9 UNIX time()
916 * 10 . 37 random bytes
917 */
918 buf = ssl->out_msg;
919 p = buf + 4;
920
921 *p++ = (unsigned char) ssl->major_ver;
922 *p++ = (unsigned char) ssl->minor_ver;
923
924 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
925 buf[4], buf[5] ) );
926
927 t = time( NULL );
928 *p++ = (unsigned char)( t >> 24 );
929 *p++ = (unsigned char)( t >> 16 );
930 *p++ = (unsigned char)( t >> 8 );
931 *p++ = (unsigned char)( t );
932
933 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
934
Paul Bakkera3d195c2011-11-27 21:07:34 +0000935 if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
936 return( ret );
937
938 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +0000939
Paul Bakker48916f92012-09-16 19:57:18 +0000940 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000941
942 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
943
944 /*
945 * 38 . 38 session id length
946 * 39 . 38+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000947 * 39+n . 40+n chosen ciphersuite
Paul Bakker5121ce52009-01-03 21:22:43 +0000948 * 41+n . 41+n chosen compression alg.
949 */
Paul Bakker48916f92012-09-16 19:57:18 +0000950 ssl->session_negotiate->length = n = 32;
951 *p++ = (unsigned char) ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +0000952
Paul Bakker0a597072012-09-25 21:55:46 +0000953 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE ||
954 ssl->f_get_cache == NULL ||
955 ssl->f_get_cache( ssl->p_get_cache, ssl->session_negotiate ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000956 {
957 /*
958 * Not found, create a new session id
959 */
Paul Bakker0a597072012-09-25 21:55:46 +0000960 ssl->handshake->resume = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000961 ssl->state++;
962
Paul Bakker48916f92012-09-16 19:57:18 +0000963 if( ( ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id,
964 n ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +0000965 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000966 }
967 else
968 {
969 /*
Paul Bakker0a597072012-09-25 21:55:46 +0000970 * Found a matching session, resuming it
Paul Bakker5121ce52009-01-03 21:22:43 +0000971 */
Paul Bakker0a597072012-09-25 21:55:46 +0000972 ssl->handshake->resume = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +0000973 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +0000974
975 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
976 {
977 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
978 return( ret );
979 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000980 }
981
Paul Bakker48916f92012-09-16 19:57:18 +0000982 memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->length );
983 p += ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +0000984
985 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
986 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
987 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +0000988 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000989
Paul Bakker48916f92012-09-16 19:57:18 +0000990 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 );
991 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite );
992 *p++ = (unsigned char)( ssl->session_negotiate->compression );
Paul Bakker5121ce52009-01-03 21:22:43 +0000993
Paul Bakkere3166ce2011-01-27 17:40:50 +0000994 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000995 ssl->session_negotiate->ciphersuite ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000996 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000997 ssl->session_negotiate->compression ) );
998
Paul Bakker20139502013-06-24 12:05:39 +0200999 if( ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION )
1000 {
1001 SSL_DEBUG_MSG( 3, ( "server hello, prepping for secure renegotiation extension" ) );
1002 ext_len += 5 + ssl->verify_data_len * 2;
Paul Bakker48916f92012-09-16 19:57:18 +00001003
Paul Bakker20139502013-06-24 12:05:39 +02001004 SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d",
1005 ext_len ) );
Paul Bakker48916f92012-09-16 19:57:18 +00001006
Paul Bakker20139502013-06-24 12:05:39 +02001007 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
1008 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
Paul Bakker48916f92012-09-16 19:57:18 +00001009
Paul Bakker20139502013-06-24 12:05:39 +02001010 /*
1011 * Secure renegotiation
1012 */
1013 SSL_DEBUG_MSG( 3, ( "client hello, secure renegotiation extension" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00001014
Paul Bakker20139502013-06-24 12:05:39 +02001015 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
1016 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
Paul Bakker48916f92012-09-16 19:57:18 +00001017
Paul Bakker20139502013-06-24 12:05:39 +02001018 *p++ = 0x00;
1019 *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF;
1020 *p++ = ssl->verify_data_len * 2 & 0xFF;
Paul Bakker48916f92012-09-16 19:57:18 +00001021
Paul Bakker20139502013-06-24 12:05:39 +02001022 memcpy( p, ssl->peer_verify_data, ssl->verify_data_len );
1023 p += ssl->verify_data_len;
1024 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
1025 p += ssl->verify_data_len;
1026 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001027
1028 ssl->out_msglen = p - buf;
1029 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1030 ssl->out_msg[0] = SSL_HS_SERVER_HELLO;
1031
1032 ret = ssl_write_record( ssl );
1033
1034 SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
1035
1036 return( ret );
1037}
1038
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001039#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1040 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1041 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001042static int ssl_write_certificate_request( ssl_context *ssl )
1043{
Paul Bakkered27a042013-04-18 22:46:23 +02001044 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1045 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001046
1047 SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
1048
1049 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1050 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1051 {
1052 SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
1053 ssl->state++;
1054 return( 0 );
1055 }
1056
1057 return( ret );
1058}
1059#else
1060static int ssl_write_certificate_request( ssl_context *ssl )
1061{
1062 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1063 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker926af752012-11-23 13:38:07 +01001064 size_t n = 0, dn_size, total_dn_size;
Paul Bakker5121ce52009-01-03 21:22:43 +00001065 unsigned char *buf, *p;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001066 const x509_cert *crt;
Paul Bakker5121ce52009-01-03 21:22:43 +00001067
1068 SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
1069
1070 ssl->state++;
1071
Paul Bakkerfbb17802013-04-17 19:10:21 +02001072 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001073 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
Paul Bakkerfbb17802013-04-17 19:10:21 +02001074 ssl->authmode == SSL_VERIFY_NONE )
Paul Bakker5121ce52009-01-03 21:22:43 +00001075 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001076 SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001077 return( 0 );
1078 }
1079
1080 /*
1081 * 0 . 0 handshake type
1082 * 1 . 3 handshake length
1083 * 4 . 4 cert type count
Paul Bakker926af752012-11-23 13:38:07 +01001084 * 5 .. m-1 cert types
1085 * m .. m+1 sig alg length (TLS 1.2 only)
1086 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001087 * n .. n+1 length of all DNs
1088 * n+2 .. n+3 length of DN 1
1089 * n+4 .. ... Distinguished Name #1
1090 * ... .. ... length of DN 2, etc.
1091 */
1092 buf = ssl->out_msg;
1093 p = buf + 4;
1094
1095 /*
1096 * At the moment, only RSA certificates are supported
1097 */
1098 *p++ = 1;
Paul Bakker926af752012-11-23 13:38:07 +01001099 *p++ = SSL_CERT_TYPE_RSA_SIGN;
1100
1101 /*
1102 * Add signature_algorithms for verify (TLS 1.2)
1103 * Only add current running algorithm that is already required for
1104 * requested ciphersuite.
1105 *
1106 * Length is always 2
1107 */
Paul Bakker21dca692013-01-03 11:41:08 +01001108 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01001109 {
1110 ssl->handshake->verify_sig_alg = SSL_HASH_SHA256;
1111
1112 *p++ = 0;
1113 *p++ = 2;
1114
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001115 if( ssl->transform_negotiate->ciphersuite_info->mac ==
1116 POLARSSL_MD_SHA384 )
Paul Bakker926af752012-11-23 13:38:07 +01001117 {
1118 ssl->handshake->verify_sig_alg = SSL_HASH_SHA384;
1119 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001120
Paul Bakker926af752012-11-23 13:38:07 +01001121 *p++ = ssl->handshake->verify_sig_alg;
1122 *p++ = SSL_SIG_RSA;
1123
1124 n += 4;
1125 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001126
1127 p += 2;
1128 crt = ssl->ca_chain;
1129
Paul Bakkerbc3d9842012-11-26 16:12:02 +01001130 total_dn_size = 0;
Paul Bakker29087132010-03-21 21:03:34 +00001131 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001132 {
1133 if( p - buf > 4096 )
1134 break;
1135
Paul Bakker926af752012-11-23 13:38:07 +01001136 dn_size = crt->subject_raw.len;
1137 *p++ = (unsigned char)( dn_size >> 8 );
1138 *p++ = (unsigned char)( dn_size );
1139 memcpy( p, crt->subject_raw.p, dn_size );
1140 p += dn_size;
Paul Bakker5121ce52009-01-03 21:22:43 +00001141
Paul Bakker926af752012-11-23 13:38:07 +01001142 SSL_DEBUG_BUF( 3, "requested DN", p, dn_size );
1143
Paul Bakkerbc3d9842012-11-26 16:12:02 +01001144 total_dn_size += 2 + dn_size;
Paul Bakker926af752012-11-23 13:38:07 +01001145 crt = crt->next;
Paul Bakker5121ce52009-01-03 21:22:43 +00001146 }
1147
Paul Bakker926af752012-11-23 13:38:07 +01001148 ssl->out_msglen = p - buf;
Paul Bakker5121ce52009-01-03 21:22:43 +00001149 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1150 ssl->out_msg[0] = SSL_HS_CERTIFICATE_REQUEST;
Paul Bakker926af752012-11-23 13:38:07 +01001151 ssl->out_msg[6 + n] = (unsigned char)( total_dn_size >> 8 );
1152 ssl->out_msg[7 + n] = (unsigned char)( total_dn_size );
Paul Bakker5121ce52009-01-03 21:22:43 +00001153
1154 ret = ssl_write_record( ssl );
1155
1156 SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
1157
1158 return( ret );
1159}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001160#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1161 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1162 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001163
Paul Bakker41c83d32013-03-20 14:39:14 +01001164static int ssl_write_server_key_exchange( ssl_context *ssl )
1165{
Paul Bakker23986e52011-04-24 08:57:21 +00001166 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001167 size_t n = 0, len;
Paul Bakker23f36802012-09-28 14:15:14 +00001168 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +02001169 md_type_t md_alg = POLARSSL_MD_NONE;
Paul Bakker35a7fe52012-10-31 09:07:14 +00001170 unsigned int hashlen = 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001171 unsigned char *p = ssl->out_msg + 4;
1172 unsigned char *dig_sig = p;
1173 size_t dig_sig_len = 0;
Paul Bakker41c83d32013-03-20 14:39:14 +01001174
1175 const ssl_ciphersuite_t *ciphersuite_info;
1176 ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001177
1178 SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
1179
Paul Bakker41c83d32013-03-20 14:39:14 +01001180 if( ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_RSA &&
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001181 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_ECDHE_RSA &&
1182 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00001183 {
1184 SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
1185 ssl->state++;
1186 return( 0 );
1187 }
1188
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001189#if defined(POLARSSL_RSA_C)
Paul Bakker43b7e352011-01-18 15:27:19 +00001190 if( ssl->rsa_key == NULL )
1191 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001192 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1193 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker43b7e352011-01-18 15:27:19 +00001194 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001195#endif /* POLARSSL_RSA_C */
Paul Bakker43b7e352011-01-18 15:27:19 +00001196
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001197#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1198 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1199 {
1200 /* TODO: Support identity hints */
1201 *(p++) = 0x00;
1202 *(p++) = 0x00;
1203
1204 n += 2;
1205 }
1206#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1207
1208#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1209 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1210 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1211 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48916f92012-09-16 19:57:18 +00001212 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001213 /*
1214 * Ephemeral DH parameters:
1215 *
1216 * struct {
1217 * opaque dh_p<1..2^16-1>;
1218 * opaque dh_g<1..2^16-1>;
1219 * opaque dh_Ys<1..2^16-1>;
1220 * } ServerDHParams;
1221 */
1222 if( ( ret = mpi_copy( &ssl->handshake->dhm_ctx.P, &ssl->dhm_P ) ) != 0 ||
1223 ( ret = mpi_copy( &ssl->handshake->dhm_ctx.G, &ssl->dhm_G ) ) != 0 )
1224 {
1225 SSL_DEBUG_RET( 1, "mpi_copy", ret );
1226 return( ret );
1227 }
Paul Bakker48916f92012-09-16 19:57:18 +00001228
Paul Bakker41c83d32013-03-20 14:39:14 +01001229 if( ( ret = dhm_make_params( &ssl->handshake->dhm_ctx,
1230 mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001231 p,
1232 &len, ssl->f_rng, ssl->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001233 {
1234 SSL_DEBUG_RET( 1, "dhm_make_params", ret );
1235 return( ret );
1236 }
1237
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001238 dig_sig = p;
1239 dig_sig_len = len;
1240
1241 p += len;
1242 n += len;
1243
Paul Bakker41c83d32013-03-20 14:39:14 +01001244 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1245 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
1246 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
1247 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
1248 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001249#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1250 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001251
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001252#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001253 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001254 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001255 /*
1256 * Ephemeral ECDH parameters:
1257 *
1258 * struct {
1259 * ECParameters curve_params;
1260 * ECPoint public;
1261 * } ServerECDHParams;
1262 */
1263 ecdh_init( &ssl->handshake->ecdh_ctx );
1264 if( ( ret = ecp_use_known_dp( &ssl->handshake->ecdh_ctx.grp,
1265 ssl->handshake->ec_curve ) ) != 0 )
1266 {
1267 SSL_DEBUG_RET( 1, "ecp_use_known_dp", ret );
1268 return( ret );
1269 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001270
Paul Bakker41c83d32013-03-20 14:39:14 +01001271 if( ( ret = ecdh_make_params( &ssl->handshake->ecdh_ctx,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001272 &len,
1273 p,
Paul Bakker41c83d32013-03-20 14:39:14 +01001274 1000, ssl->f_rng, ssl->p_rng ) ) != 0 )
1275 {
1276 SSL_DEBUG_RET( 1, "ecdh_make_params", ret );
1277 return( ret );
1278 }
1279
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001280 dig_sig = p;
1281 dig_sig_len = len;
1282
1283 p += len;
1284 n += len;
1285
Paul Bakker41c83d32013-03-20 14:39:14 +01001286 SSL_DEBUG_ECP( 3, "ECDH: Q ", &ssl->handshake->ecdh_ctx.Q );
1287 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001288#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001289
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001290#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1291 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
1292 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1293 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001294 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001295 size_t rsa_key_len = 0;
Paul Bakker23f36802012-09-28 14:15:14 +00001296
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001297 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker23f36802012-09-28 14:15:14 +00001298 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001299 md5_context md5;
1300 sha1_context sha1;
1301
1302 /*
1303 * digitally-signed struct {
1304 * opaque md5_hash[16];
1305 * opaque sha_hash[20];
1306 * };
1307 *
1308 * md5_hash
1309 * MD5(ClientHello.random + ServerHello.random
1310 * + ServerParams);
1311 * sha_hash
1312 * SHA(ClientHello.random + ServerHello.random
1313 * + ServerParams);
1314 */
1315 md5_starts( &md5 );
1316 md5_update( &md5, ssl->handshake->randbytes, 64 );
1317 md5_update( &md5, dig_sig, dig_sig_len );
1318 md5_finish( &md5, hash );
1319
1320 sha1_starts( &sha1 );
1321 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
1322 sha1_update( &sha1, dig_sig, dig_sig_len );
1323 sha1_finish( &sha1, hash + 16 );
1324
1325 hashlen = 36;
1326 md_alg = POLARSSL_MD_NONE;
1327 }
1328 else
1329 {
1330 md_context_t ctx;
1331
1332 /*
1333 * digitally-signed struct {
1334 * opaque client_random[32];
1335 * opaque server_random[32];
1336 * ServerDHParams params;
1337 * };
1338 */
1339 switch( ssl->handshake->sig_alg )
1340 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001341#if defined(POLARSSL_MD5_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001342 case SSL_HASH_MD5:
1343 md_alg = POLARSSL_MD_MD5;
1344 break;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001345#endif
1346#if defined(POLARSSL_SHA1_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001347 case SSL_HASH_SHA1:
1348 md_alg = POLARSSL_MD_SHA1;
1349 break;
Paul Bakker23f36802012-09-28 14:15:14 +00001350#endif
1351#if defined(POLARSSL_SHA2_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001352 case SSL_HASH_SHA224:
1353 md_alg = POLARSSL_MD_SHA224;
1354 break;
1355 case SSL_HASH_SHA256:
1356 md_alg = POLARSSL_MD_SHA256;
1357 break;
Paul Bakker23f36802012-09-28 14:15:14 +00001358#endif
Paul Bakkerc70b9822013-04-07 22:00:46 +02001359#if defined(POLARSSL_SHA4_C)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001360 case SSL_HASH_SHA384:
1361 md_alg = POLARSSL_MD_SHA384;
1362 break;
1363 case SSL_HASH_SHA512:
1364 md_alg = POLARSSL_MD_SHA512;
1365 break;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001366#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001367 default:
1368 /* Should never happen */
1369 return( -1 );
1370 }
1371
1372 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1373 {
1374 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1375 return( ret );
1376 }
1377
1378 md_starts( &ctx );
1379 md_update( &ctx, ssl->handshake->randbytes, 64 );
1380 md_update( &ctx, dig_sig, dig_sig_len );
1381 md_finish( &ctx, hash );
Paul Bakker23f36802012-09-28 14:15:14 +00001382 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02001383
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001384 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
1385
1386 if ( ssl->rsa_key )
1387 rsa_key_len = ssl->rsa_key_len( ssl->rsa_key );
1388
1389 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker23f36802012-09-28 14:15:14 +00001390 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001391 *(p++) = ssl->handshake->sig_alg;
1392 *(p++) = SSL_SIG_RSA;
1393
1394 n += 2;
1395 }
1396
1397 *(p++) = (unsigned char)( rsa_key_len >> 8 );
1398 *(p++) = (unsigned char)( rsa_key_len );
1399 n += 2;
1400
1401 if ( ssl->rsa_key )
1402 {
1403 ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
1404 RSA_PRIVATE, md_alg, hashlen, hash, p );
1405 }
1406
1407 if( ret != 0 )
1408 {
1409 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001410 return( ret );
Paul Bakker23f36802012-09-28 14:15:14 +00001411 }
Paul Bakkerc70b9822013-04-07 22:00:46 +02001412
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001413 SSL_DEBUG_BUF( 3, "my RSA sig", p, rsa_key_len );
1414
1415 p += rsa_key_len;
1416 n += rsa_key_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001417 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001418#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) ||
1419 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001420
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001421 ssl->out_msglen = 4 + n;
Paul Bakker5121ce52009-01-03 21:22:43 +00001422 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1423 ssl->out_msg[0] = SSL_HS_SERVER_KEY_EXCHANGE;
1424
1425 ssl->state++;
1426
1427 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1428 {
1429 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1430 return( ret );
1431 }
1432
1433 SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) );
1434
1435 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001436}
1437
1438static int ssl_write_server_hello_done( ssl_context *ssl )
1439{
1440 int ret;
1441
1442 SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) );
1443
1444 ssl->out_msglen = 4;
1445 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1446 ssl->out_msg[0] = SSL_HS_SERVER_HELLO_DONE;
1447
1448 ssl->state++;
1449
1450 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1451 {
1452 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1453 return( ret );
1454 }
1455
1456 SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) );
1457
1458 return( 0 );
1459}
1460
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001461#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1462 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1463static int ssl_parse_client_dh_public( ssl_context *ssl, unsigned char **p,
1464 const unsigned char *end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02001465{
1466 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02001467 size_t n;
1468
1469 /*
1470 * Receive G^Y mod P, premaster = (G^Y)^X mod P
1471 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001472 if( *p + 2 > end )
1473 {
1474 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1475 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1476 }
Paul Bakker70df2fb2013-04-17 17:19:09 +02001477
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001478 n = ( (*p)[0] << 8 ) | (*p)[1];
1479 *p += 2;
1480
1481 if( n < 1 || n > ssl->handshake->dhm_ctx.len || *p + n > end )
Paul Bakker70df2fb2013-04-17 17:19:09 +02001482 {
1483 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1484 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1485 }
1486
1487 if( ( ret = dhm_read_public( &ssl->handshake->dhm_ctx,
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001488 *p, n ) ) != 0 )
Paul Bakker70df2fb2013-04-17 17:19:09 +02001489 {
1490 SSL_DEBUG_RET( 1, "dhm_read_public", ret );
1491 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
1492 }
1493
1494 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
1495
Paul Bakker70df2fb2013-04-17 17:19:09 +02001496 return( ret );
1497}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001498#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1499 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02001500
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001501#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker70df2fb2013-04-17 17:19:09 +02001502static int ssl_parse_client_ecdh_public( ssl_context *ssl )
1503{
1504 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker70df2fb2013-04-17 17:19:09 +02001505 size_t n;
1506
1507 /*
1508 * Receive client public key and calculate premaster
1509 */
1510 n = ssl->in_msg[3];
1511
1512 if( n < 1 || n > mpi_size( &ssl->handshake->ecdh_ctx.grp.P ) * 2 + 2 ||
1513 n + 4 != ssl->in_hslen )
1514 {
1515 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1516 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1517 }
1518
1519 if( ( ret = ecdh_read_public( &ssl->handshake->ecdh_ctx,
1520 ssl->in_msg + 4, n ) ) != 0 )
1521 {
1522 SSL_DEBUG_RET( 1, "ecdh_read_public", ret );
1523 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );
1524 }
1525
1526 SSL_DEBUG_ECP( 3, "ECDH: Qp ", &ssl->handshake->ecdh_ctx.Qp );
1527
Paul Bakker70df2fb2013-04-17 17:19:09 +02001528 return( ret );
1529}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001530#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02001531
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001532#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakker70df2fb2013-04-17 17:19:09 +02001533static int ssl_parse_encrypted_pms_secret( ssl_context *ssl )
1534{
1535 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1536 size_t i, n = 0;
1537
1538 if( ssl->rsa_key == NULL )
1539 {
1540 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1541 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1542 }
1543
1544 /*
1545 * Decrypt the premaster using own private RSA key
1546 */
1547 i = 4;
1548 if( ssl->rsa_key )
1549 n = ssl->rsa_key_len( ssl->rsa_key );
1550 ssl->handshake->pmslen = 48;
1551
1552 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
1553 {
1554 i += 2;
1555 if( ssl->in_msg[4] != ( ( n >> 8 ) & 0xFF ) ||
1556 ssl->in_msg[5] != ( ( n ) & 0xFF ) )
1557 {
1558 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1559 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1560 }
1561 }
1562
1563 if( ssl->in_hslen != i + n )
1564 {
1565 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1566 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1567 }
1568
1569 if( ssl->rsa_key ) {
1570 ret = ssl->rsa_decrypt( ssl->rsa_key, RSA_PRIVATE,
1571 &ssl->handshake->pmslen,
1572 ssl->in_msg + i,
1573 ssl->handshake->premaster,
1574 sizeof(ssl->handshake->premaster) );
1575 }
1576
1577 if( ret != 0 || ssl->handshake->pmslen != 48 ||
1578 ssl->handshake->premaster[0] != ssl->max_major_ver ||
1579 ssl->handshake->premaster[1] != ssl->max_minor_ver )
1580 {
1581 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1582
1583 /*
1584 * Protection against Bleichenbacher's attack:
1585 * invalid PKCS#1 v1.5 padding must not cause
1586 * the connection to end immediately; instead,
1587 * send a bad_record_mac later in the handshake.
1588 */
1589 ssl->handshake->pmslen = 48;
1590
1591 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster,
1592 ssl->handshake->pmslen );
1593 if( ret != 0 )
1594 return( ret );
1595 }
1596
1597 return( ret );
1598}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001599#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakker70df2fb2013-04-17 17:19:09 +02001600
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001601#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
1602 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1603static int ssl_parse_client_psk_identity( ssl_context *ssl, unsigned char **p,
1604 const unsigned char *end )
Paul Bakkerfbb17802013-04-17 19:10:21 +02001605{
1606 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerfbb17802013-04-17 19:10:21 +02001607 size_t n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02001608
1609 if( ssl->psk == NULL || ssl->psk_identity == NULL ||
1610 ssl->psk_identity_len == 0 || ssl->psk_len == 0 )
1611 {
1612 SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) );
1613 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1614 }
1615
1616 /*
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001617 * Receive client pre-shared key identity name
Paul Bakkerfbb17802013-04-17 19:10:21 +02001618 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001619 if( *p + 2 > end )
1620 {
1621 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1622 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1623 }
Paul Bakkerfbb17802013-04-17 19:10:21 +02001624
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001625 n = ( (*p)[0] << 8 ) | (*p)[1];
1626 *p += 2;
1627
1628 if( n < 1 || n > 65535 || *p + n > end )
Paul Bakkerfbb17802013-04-17 19:10:21 +02001629 {
1630 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1631 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1632 }
1633
1634 if( n != ssl->psk_identity_len ||
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001635 memcmp( ssl->psk_identity, *p, n ) != 0 )
Paul Bakkerfbb17802013-04-17 19:10:21 +02001636 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001637 SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n );
Paul Bakkerfbb17802013-04-17 19:10:21 +02001638 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
1639 }
1640
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001641 *p += n;
Paul Bakkerfbb17802013-04-17 19:10:21 +02001642 ret = 0;
1643
Paul Bakkerfbb17802013-04-17 19:10:21 +02001644 return( ret );
1645}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001646#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
1647 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakkerfbb17802013-04-17 19:10:21 +02001648
Paul Bakker5121ce52009-01-03 21:22:43 +00001649static int ssl_parse_client_key_exchange( ssl_context *ssl )
1650{
Paul Bakker23986e52011-04-24 08:57:21 +00001651 int ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01001652 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001653 unsigned char *p, *end;
Paul Bakker70df2fb2013-04-17 17:19:09 +02001654
Paul Bakker41c83d32013-03-20 14:39:14 +01001655 ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001656
1657 SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) );
1658
1659 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1660 {
1661 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1662 return( ret );
1663 }
1664
1665 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1666 {
1667 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001668 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001669 }
1670
1671 if( ssl->in_msg[0] != SSL_HS_CLIENT_KEY_EXCHANGE )
1672 {
1673 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001674 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001675 }
1676
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001677 p = ssl->in_msg + 4;
1678 end = ssl->in_msg + ssl->in_msglen;
1679
1680#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001681 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001682 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001683 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001684 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02001685 SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
1686 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001687 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001688
1689 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
1690
1691 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1692 ssl->handshake->premaster,
1693 &ssl->handshake->pmslen ) ) != 0 )
1694 {
1695 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1696 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
1697 }
1698
1699 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker70df2fb2013-04-17 17:19:09 +02001700 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001701 else
1702#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1703#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
1704 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker70df2fb2013-04-17 17:19:09 +02001705 {
1706 if( ( ret = ssl_parse_client_ecdh_public( ssl ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001707 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02001708 SSL_DEBUG_RET( 1, ( "ssl_parse_client_ecdh_public" ), ret );
1709 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001710 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001711
1712 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
1713 &ssl->handshake->pmslen,
1714 ssl->handshake->premaster,
1715 POLARSSL_MPI_MAX_SIZE ) ) != 0 )
1716 {
1717 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
1718 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
1719 }
1720
1721 SSL_DEBUG_MPI( 3, "ECDH: z ", &ssl->handshake->ecdh_ctx.z );
Paul Bakker5121ce52009-01-03 21:22:43 +00001722 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001723 else
1724#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
1725#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1726 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakkerfbb17802013-04-17 19:10:21 +02001727 {
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001728 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
Paul Bakkerfbb17802013-04-17 19:10:21 +02001729 {
1730 SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
1731 return( ret );
1732 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001733
1734 // Set up the premaster secret
1735 //
1736 p = ssl->handshake->premaster;
1737 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1738 *(p++) = (unsigned char)( ssl->psk_len );
1739 p += ssl->psk_len;
1740
1741 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1742 *(p++) = (unsigned char)( ssl->psk_len );
1743 memcpy( p, ssl->psk, ssl->psk_len );
1744 p += ssl->psk_len;
1745
1746 ssl->handshake->pmslen = 4 + 2 * ssl->psk_len;
Paul Bakkerfbb17802013-04-17 19:10:21 +02001747 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001748 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001749#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
1750#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1751 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1752 {
1753 size_t n;
1754
1755 if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )
1756 {
1757 SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret );
1758 return( ret );
1759 }
1760 if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )
1761 {
1762 SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret );
1763 return( ret );
1764 }
1765
1766 // Set up the premaster secret
1767 //
1768 p = ssl->handshake->premaster;
1769 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len >> 8 );
1770 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len );
1771
1772 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1773 p, &n ) ) != 0 )
1774 {
1775 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1776 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );
1777 }
1778
1779 if( n != ssl->handshake->dhm_ctx.len )
1780 {
1781 SSL_DEBUG_MSG( 1, ( "dhm_calc_secret result smaller than DHM" ) );
1782 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1783 }
1784
1785 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
1786
1787 p += ssl->handshake->dhm_ctx.len;
1788
1789 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1790 *(p++) = (unsigned char)( ssl->psk_len );
1791 memcpy( p, ssl->psk, ssl->psk_len );
1792 p += ssl->psk_len;
1793
1794 ssl->handshake->pmslen = 4 + ssl->handshake->dhm_ctx.len + ssl->psk_len;
1795 }
1796 else
1797#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1798#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
1799 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01001800 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02001801 if( ( ret = ssl_parse_encrypted_pms_secret( ssl ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001802 {
Paul Bakker70df2fb2013-04-17 17:19:09 +02001803 SSL_DEBUG_RET( 1, ( "ssl_parse_client_ecdh_public" ), ret );
1804 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001805 }
1806 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001807 else
1808#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
1809 {
1810 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1811 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001812
Paul Bakkerff60ee62010-03-16 21:09:09 +00001813 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1814 {
1815 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1816 return( ret );
1817 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001818
Paul Bakker5121ce52009-01-03 21:22:43 +00001819 ssl->state++;
1820
1821 SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) );
1822
1823 return( 0 );
1824}
1825
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001826#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1827 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1828 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001829static int ssl_parse_certificate_verify( ssl_context *ssl )
1830{
Paul Bakkered27a042013-04-18 22:46:23 +02001831 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerfbb17802013-04-17 19:10:21 +02001832 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001833
1834 SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
1835
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001836 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1837 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02001838 {
1839 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
1840 ssl->state++;
1841 return( 0 );
1842 }
1843
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001844 return( ret );
1845}
1846#else
1847static int ssl_parse_certificate_verify( ssl_context *ssl )
1848{
1849 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1850 size_t n = 0, n1, n2;
1851 unsigned char hash[48];
1852 md_type_t md_alg = POLARSSL_MD_NONE;
1853 unsigned int hashlen = 0;
1854 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1855
1856 SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
1857
1858 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1859 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1860 {
1861 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
1862 ssl->state++;
1863 return( 0 );
1864 }
1865
Paul Bakkered27a042013-04-18 22:46:23 +02001866 if( ssl->session_negotiate->peer_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001867 {
1868 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
1869 ssl->state++;
1870 return( 0 );
1871 }
1872
Paul Bakker48916f92012-09-16 19:57:18 +00001873 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001874
1875 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1876 {
1877 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1878 return( ret );
1879 }
1880
1881 ssl->state++;
1882
1883 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1884 {
1885 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001886 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001887 }
1888
1889 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE_VERIFY )
1890 {
1891 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001892 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001893 }
1894
Paul Bakker926af752012-11-23 13:38:07 +01001895 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
1896 {
1897 /*
1898 * As server we know we either have SSL_HASH_SHA384 or
1899 * SSL_HASH_SHA256
1900 */
1901 if( ssl->in_msg[4] != ssl->handshake->verify_sig_alg ||
1902 ssl->in_msg[5] != SSL_SIG_RSA )
1903 {
1904 SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg for verify message" ) );
1905 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
1906 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001907
Paul Bakker926af752012-11-23 13:38:07 +01001908 if( ssl->handshake->verify_sig_alg == SSL_HASH_SHA384 )
Paul Bakkerc70b9822013-04-07 22:00:46 +02001909 md_alg = POLARSSL_MD_SHA384;
Paul Bakker926af752012-11-23 13:38:07 +01001910 else
Paul Bakkerc70b9822013-04-07 22:00:46 +02001911 md_alg = POLARSSL_MD_SHA256;
Paul Bakker926af752012-11-23 13:38:07 +01001912
1913 n += 2;
1914 }
1915 else
1916 {
1917 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001918 md_alg = POLARSSL_MD_NONE;
Paul Bakker926af752012-11-23 13:38:07 +01001919 }
1920
1921 n1 = ssl->session_negotiate->peer_cert->rsa.len;
Paul Bakker78ce5072012-11-23 14:23:53 +01001922 n2 = ( ssl->in_msg[4 + n] << 8 ) | ssl->in_msg[5 + n];
Paul Bakker926af752012-11-23 13:38:07 +01001923
1924 if( n + n1 + 6 != ssl->in_hslen || n1 != n2 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001925 {
1926 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001927 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001928 }
1929
Paul Bakker48916f92012-09-16 19:57:18 +00001930 ret = rsa_pkcs1_verify( &ssl->session_negotiate->peer_cert->rsa, RSA_PUBLIC,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001931 md_alg, hashlen, hash, ssl->in_msg + 6 + n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001932 if( ret != 0 )
1933 {
1934 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
1935 return( ret );
1936 }
1937
1938 SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
1939
Paul Bakkered27a042013-04-18 22:46:23 +02001940 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001941}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001942#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1943 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1944 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001945
1946/*
Paul Bakker1961b702013-01-25 14:49:24 +01001947 * SSL handshake -- server side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00001948 */
Paul Bakker1961b702013-01-25 14:49:24 +01001949int ssl_handshake_server_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001950{
1951 int ret = 0;
1952
Paul Bakker1961b702013-01-25 14:49:24 +01001953 if( ssl->state == SSL_HANDSHAKE_OVER )
1954 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00001955
Paul Bakker1961b702013-01-25 14:49:24 +01001956 SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) );
1957
1958 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1959 return( ret );
1960
1961 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00001962 {
Paul Bakker1961b702013-01-25 14:49:24 +01001963 case SSL_HELLO_REQUEST:
1964 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00001965 break;
1966
Paul Bakker1961b702013-01-25 14:49:24 +01001967 /*
1968 * <== ClientHello
1969 */
1970 case SSL_CLIENT_HELLO:
1971 ret = ssl_parse_client_hello( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00001972 break;
Paul Bakker1961b702013-01-25 14:49:24 +01001973
1974 /*
1975 * ==> ServerHello
1976 * Certificate
1977 * ( ServerKeyExchange )
1978 * ( CertificateRequest )
1979 * ServerHelloDone
1980 */
1981 case SSL_SERVER_HELLO:
1982 ret = ssl_write_server_hello( ssl );
1983 break;
1984
1985 case SSL_SERVER_CERTIFICATE:
1986 ret = ssl_write_certificate( ssl );
1987 break;
1988
1989 case SSL_SERVER_KEY_EXCHANGE:
1990 ret = ssl_write_server_key_exchange( ssl );
1991 break;
1992
1993 case SSL_CERTIFICATE_REQUEST:
1994 ret = ssl_write_certificate_request( ssl );
1995 break;
1996
1997 case SSL_SERVER_HELLO_DONE:
1998 ret = ssl_write_server_hello_done( ssl );
1999 break;
2000
2001 /*
2002 * <== ( Certificate/Alert )
2003 * ClientKeyExchange
2004 * ( CertificateVerify )
2005 * ChangeCipherSpec
2006 * Finished
2007 */
2008 case SSL_CLIENT_CERTIFICATE:
2009 ret = ssl_parse_certificate( ssl );
2010 break;
2011
2012 case SSL_CLIENT_KEY_EXCHANGE:
2013 ret = ssl_parse_client_key_exchange( ssl );
2014 break;
2015
2016 case SSL_CERTIFICATE_VERIFY:
2017 ret = ssl_parse_certificate_verify( ssl );
2018 break;
2019
2020 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
2021 ret = ssl_parse_change_cipher_spec( ssl );
2022 break;
2023
2024 case SSL_CLIENT_FINISHED:
2025 ret = ssl_parse_finished( ssl );
2026 break;
2027
2028 /*
2029 * ==> ChangeCipherSpec
2030 * Finished
2031 */
2032 case SSL_SERVER_CHANGE_CIPHER_SPEC:
2033 ret = ssl_write_change_cipher_spec( ssl );
2034 break;
2035
2036 case SSL_SERVER_FINISHED:
2037 ret = ssl_write_finished( ssl );
2038 break;
2039
2040 case SSL_FLUSH_BUFFERS:
2041 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
2042 ssl->state = SSL_HANDSHAKE_WRAPUP;
2043 break;
2044
2045 case SSL_HANDSHAKE_WRAPUP:
2046 ssl_handshake_wrapup( ssl );
2047 break;
2048
2049 default:
2050 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
2051 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002052 }
2053
Paul Bakker5121ce52009-01-03 21:22:43 +00002054 return( ret );
2055}
Paul Bakker5121ce52009-01-03 21:22:43 +00002056#endif