2 * SSLv3/TLSv1 server-side functions
4 * Copyright (C) 2006-2012, Brainspark B.V.
6 * This file is part of PolarSSL (http://www.polarssl.org)
7 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
11 * 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.
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.
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.
28 #if defined(POLARSSL_SSL_SRV_C)
37 static int ssl_parse_servername_ext( ssl_context
*ssl
,
38 const unsigned char *buf
,
42 size_t servername_list_size
, hostname_len
;
43 const unsigned char *p
;
45 servername_list_size
= ( ( buf
[0] << 8 ) | ( buf
[1] ) );
46 if( servername_list_size
+ 2 != len
)
48 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
49 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
53 while( servername_list_size
> 0 )
55 hostname_len
= ( ( p
[1] << 8 ) | p
[2] );
56 if( hostname_len
+ 3 > servername_list_size
)
58 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
59 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
62 if( p
[0] == TLS_EXT_SERVERNAME_HOSTNAME
)
64 ret
= ssl
->f_sni( ssl
->p_sni
, ssl
, p
+ 3, hostname_len
);
67 ssl_send_alert_message( ssl
, SSL_ALERT_LEVEL_FATAL
,
68 SSL_ALERT_MSG_UNRECOGNIZED_NAME
);
69 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
74 servername_list_size
-= hostname_len
+ 3;
75 p
+= hostname_len
+ 3;
78 if( servername_list_size
!= 0 )
80 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
81 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
87 static int ssl_parse_renegotiation_info( ssl_context
*ssl
,
88 const unsigned char *buf
,
93 if( ssl
->renegotiation
== SSL_INITIAL_HANDSHAKE
)
95 if( len
!= 1 || buf
[0] != 0x0 )
97 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
99 if( ( ret
= ssl_send_fatal_handshake_failure( ssl
) ) != 0 )
102 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
105 ssl
->secure_renegotiation
= SSL_SECURE_RENEGOTIATION
;
109 if( len
!= 1 + ssl
->verify_data_len
||
110 buf
[0] != ssl
->verify_data_len
||
111 memcmp( buf
+ 1, ssl
->peer_verify_data
, ssl
->verify_data_len
) != 0 )
113 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
115 if( ( ret
= ssl_send_fatal_handshake_failure( ssl
) ) != 0 )
118 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
125 static int ssl_parse_signature_algorithms_ext( ssl_context
*ssl
,
126 const unsigned char *buf
,
129 size_t sig_alg_list_size
;
130 const unsigned char *p
;
132 sig_alg_list_size
= ( ( buf
[0] << 8 ) | ( buf
[1] ) );
133 if( sig_alg_list_size
+ 2 != len
||
134 sig_alg_list_size
%2 != 0 )
136 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
137 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
141 while( sig_alg_list_size
> 0 )
143 if( p
[1] != SSL_SIG_RSA
)
145 sig_alg_list_size
-= 2;
149 #if defined(POLARSSL_SHA4_C)
150 if( p
[0] == SSL_HASH_SHA512
)
152 ssl
->handshake
->sig_alg
= SSL_HASH_SHA512
;
155 if( p
[0] == SSL_HASH_SHA384
)
157 ssl
->handshake
->sig_alg
= SSL_HASH_SHA384
;
161 #if defined(POLARSSL_SHA2_C)
162 if( p
[0] == SSL_HASH_SHA256
)
164 ssl
->handshake
->sig_alg
= SSL_HASH_SHA256
;
167 if( p
[0] == SSL_HASH_SHA224
)
169 ssl
->handshake
->sig_alg
= SSL_HASH_SHA224
;
173 if( p
[0] == SSL_HASH_SHA1
)
175 ssl
->handshake
->sig_alg
= SSL_HASH_SHA1
;
178 if( p
[0] == SSL_HASH_MD5
)
180 ssl
->handshake
->sig_alg
= SSL_HASH_MD5
;
184 sig_alg_list_size
-= 2;
188 SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d",
189 ssl
->handshake
->sig_alg
) );
194 #if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
195 static int ssl_parse_client_hello_v2( ssl_context
*ssl
)
200 unsigned int ciph_len
, sess_len
, chal_len
;
201 unsigned char *buf
, *p
;
203 SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) );
205 if( ssl
->renegotiation
!= SSL_INITIAL_HANDSHAKE
)
207 SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) );
209 if( ( ret
= ssl_send_fatal_handshake_failure( ssl
) ) != 0 )
212 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
217 SSL_DEBUG_BUF( 4, "record header", buf
, 5 );
219 SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d",
221 SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d",
222 ( ( buf
[0] & 0x7F ) << 8 ) | buf
[1] ) );
223 SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]",
230 * 0 . 1 message length
234 * 3 . 4 protocol version
236 if( buf
[2] != SSL_HS_CLIENT_HELLO
||
237 buf
[3] != SSL_MAJOR_VERSION_3
)
239 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
240 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
243 n
= ( ( buf
[0] << 8 ) | buf
[1] ) & 0x7FFF;
245 if( n
< 17 || n
> 512 )
247 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
248 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
251 ssl
->major_ver
= SSL_MAJOR_VERSION_3
;
252 ssl
->minor_ver
= ( buf
[4] <= SSL_MINOR_VERSION_3
)
253 ? buf
[4] : SSL_MINOR_VERSION_3
;
255 if( ssl
->minor_ver
< ssl
->min_minor_ver
)
257 SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
258 " [%d:%d] < [%d:%d]", ssl
->major_ver
, ssl
->minor_ver
,
259 ssl
->min_major_ver
, ssl
->min_minor_ver
) );
261 ssl_send_alert_message( ssl
, SSL_ALERT_LEVEL_FATAL
,
262 SSL_ALERT_MSG_PROTOCOL_VERSION
);
263 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION
);
266 ssl
->max_major_ver
= buf
[3];
267 ssl
->max_minor_ver
= buf
[4];
269 if( ( ret
= ssl_fetch_input( ssl
, 2 + n
) ) != 0 )
271 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret
);
275 ssl
->handshake
->update_checksum( ssl
, buf
+ 2, n
);
278 n
= ssl
->in_left
- 5;
281 * 0 . 1 ciphersuitelist length
282 * 2 . 3 session id length
283 * 4 . 5 challenge length
284 * 6 . .. ciphersuitelist
288 SSL_DEBUG_BUF( 4, "record contents", buf
, n
);
290 ciph_len
= ( buf
[0] << 8 ) | buf
[1];
291 sess_len
= ( buf
[2] << 8 ) | buf
[3];
292 chal_len
= ( buf
[4] << 8 ) | buf
[5];
294 SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d",
295 ciph_len
, sess_len
, chal_len
) );
298 * Make sure each parameter length is valid
300 if( ciph_len
< 3 || ( ciph_len
% 3 ) != 0 )
302 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
303 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
308 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
309 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
312 if( chal_len
< 8 || chal_len
> 32 )
314 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
315 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
318 if( n
!= 6 + ciph_len
+ sess_len
+ chal_len
)
320 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
321 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
324 SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
326 SSL_DEBUG_BUF( 3, "client hello, session id",
327 buf
+ 6 + ciph_len
, sess_len
);
328 SSL_DEBUG_BUF( 3, "client hello, challenge",
329 buf
+ 6 + ciph_len
+ sess_len
, chal_len
);
331 p
= buf
+ 6 + ciph_len
;
332 ssl
->session_negotiate
->length
= sess_len
;
333 memset( ssl
->session_negotiate
->id
, 0, sizeof( ssl
->session_negotiate
->id
) );
334 memcpy( ssl
->session_negotiate
->id
, p
, ssl
->session_negotiate
->length
);
337 memset( ssl
->handshake
->randbytes
, 0, 64 );
338 memcpy( ssl
->handshake
->randbytes
+ 32 - chal_len
, p
, chal_len
);
341 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
343 for( i
= 0, p
= buf
+ 6; i
< ciph_len
; i
+= 3, p
+= 3 )
345 if( p
[0] == 0 && p
[1] == 0 && p
[2] == SSL_EMPTY_RENEGOTIATION_INFO
)
347 SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
348 if( ssl
->renegotiation
== SSL_RENEGOTIATION
)
350 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
352 if( ( ret
= ssl_send_fatal_handshake_failure( ssl
) ) != 0 )
355 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
357 ssl
->secure_renegotiation
= SSL_SECURE_RENEGOTIATION
;
362 for( i
= 0; ssl
->ciphersuites
[ssl
->minor_ver
][i
] != 0; i
++ )
364 for( j
= 0, p
= buf
+ 6; j
< ciph_len
; j
+= 3, p
+= 3 )
368 p
[2] == ssl
->ciphersuites
[ssl
->minor_ver
][i
] )
369 goto have_ciphersuite_v2
;
373 SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
375 return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN
);
378 ssl
->session_negotiate
->ciphersuite
= ssl
->ciphersuites
[ssl
->minor_ver
][i
];
379 ssl_optimize_checksum( ssl
, ssl
->session_negotiate
->ciphersuite
);
382 * SSLv2 Client Hello relevant renegotiation security checks
384 if( ssl
->secure_renegotiation
== SSL_LEGACY_RENEGOTIATION
&&
385 ssl
->allow_legacy_renegotiation
== SSL_LEGACY_BREAK_HANDSHAKE
)
387 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
389 if( ( ret
= ssl_send_fatal_handshake_failure( ssl
) ) != 0 )
392 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
398 SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) );
402 #endif /* POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */
404 static int ssl_parse_client_hello( ssl_context
*ssl
)
409 unsigned int ciph_len
, sess_len
;
410 unsigned int comp_len
;
411 unsigned int ext_len
= 0;
412 unsigned char *buf
, *p
, *ext
;
413 int renegotiation_info_seen
= 0;
414 int handshake_failure
= 0;
416 SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
418 if( ssl
->renegotiation
== SSL_INITIAL_HANDSHAKE
&&
419 ( ret
= ssl_fetch_input( ssl
, 5 ) ) != 0 )
421 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret
);
427 #if defined(POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)
428 if( ( buf
[0] & 0x80 ) != 0 )
429 return ssl_parse_client_hello_v2( ssl
);
432 SSL_DEBUG_BUF( 4, "record header", buf
, 5 );
434 SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d",
436 SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d",
437 ( buf
[3] << 8 ) | buf
[4] ) );
438 SSL_DEBUG_MSG( 3, ( "client hello v3, protocol ver: [%d:%d]",
446 * 1 . 2 protocol version
447 * 3 . 4 message length
449 if( buf
[0] != SSL_MSG_HANDSHAKE
||
450 buf
[1] != SSL_MAJOR_VERSION_3
)
452 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
453 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
456 n
= ( buf
[3] << 8 ) | buf
[4];
458 if( n
< 45 || n
> 512 )
460 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
461 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
464 if( ssl
->renegotiation
== SSL_INITIAL_HANDSHAKE
&&
465 ( ret
= ssl_fetch_input( ssl
, 5 + n
) ) != 0 )
467 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret
);
472 if( !ssl
->renegotiation
)
473 n
= ssl
->in_left
- 5;
477 ssl
->handshake
->update_checksum( ssl
, buf
, n
);
481 * 0 . 0 handshake type
482 * 1 . 3 handshake length
483 * 4 . 5 protocol version
485 * 10 . 37 random bytes
486 * 38 . 38 session id length
487 * 39 . 38+x session id
488 * 39+x . 40+x ciphersuitelist length
489 * 41+x . .. ciphersuitelist
490 * .. . .. compression alg.
493 SSL_DEBUG_BUF( 4, "record contents", buf
, n
);
495 SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d",
497 SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d",
498 ( buf
[1] << 16 ) | ( buf
[2] << 8 ) | buf
[3] ) );
499 SSL_DEBUG_MSG( 3, ( "client hello v3, max. version: [%d:%d]",
503 * Check the handshake type and protocol version
505 if( buf
[0] != SSL_HS_CLIENT_HELLO
||
506 buf
[4] != SSL_MAJOR_VERSION_3
)
508 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
509 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
512 ssl
->major_ver
= SSL_MAJOR_VERSION_3
;
513 ssl
->minor_ver
= ( buf
[5] <= SSL_MINOR_VERSION_3
)
514 ? buf
[5] : SSL_MINOR_VERSION_3
;
516 if( ssl
->minor_ver
< ssl
->min_minor_ver
)
518 SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum"
519 " [%d:%d] < [%d:%d]", ssl
->major_ver
, ssl
->minor_ver
,
520 ssl
->min_major_ver
, ssl
->min_minor_ver
) );
522 ssl_send_alert_message( ssl
, SSL_ALERT_LEVEL_FATAL
,
523 SSL_ALERT_MSG_PROTOCOL_VERSION
);
525 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION
);
528 ssl
->max_major_ver
= buf
[4];
529 ssl
->max_minor_ver
= buf
[5];
531 memcpy( ssl
->handshake
->randbytes
, buf
+ 6, 32 );
534 * Check the handshake message length
536 if( buf
[1] != 0 || n
!= (unsigned int) 4 + ( ( buf
[2] << 8 ) | buf
[3] ) )
538 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
539 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
543 * Check the session length
549 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
550 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
553 ssl
->session_negotiate
->length
= sess_len
;
554 memset( ssl
->session_negotiate
->id
, 0,
555 sizeof( ssl
->session_negotiate
->id
) );
556 memcpy( ssl
->session_negotiate
->id
, buf
+ 39,
557 ssl
->session_negotiate
->length
);
560 * Check the ciphersuitelist length
562 ciph_len
= ( buf
[39 + sess_len
] << 8 )
563 | ( buf
[40 + sess_len
] );
565 if( ciph_len
< 2 || ciph_len
> 256 || ( ciph_len
% 2 ) != 0 )
567 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
568 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
572 * Check the compression algorithms length
574 comp_len
= buf
[41 + sess_len
+ ciph_len
];
576 if( comp_len
< 1 || comp_len
> 16 )
578 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
579 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
583 * Check the extension length
585 if( n
> 42 + sess_len
+ ciph_len
+ comp_len
)
587 ext_len
= ( buf
[42 + sess_len
+ ciph_len
+ comp_len
] << 8 )
588 | ( buf
[43 + sess_len
+ ciph_len
+ comp_len
] );
590 if( ( ext_len
> 0 && ext_len
< 4 ) ||
591 n
!= 44 + sess_len
+ ciph_len
+ comp_len
+ ext_len
)
593 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
594 SSL_DEBUG_BUF( 3, "Ext", buf
+ 44 + sess_len
+ ciph_len
+ comp_len
, ext_len
);
595 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
599 ssl
->session_negotiate
->compression
= SSL_COMPRESS_NULL
;
600 #if defined(POLARSSL_ZLIB_SUPPORT)
601 for( i
= 0; i
< comp_len
; ++i
)
603 if( buf
[42 + sess_len
+ ciph_len
+ i
] == SSL_COMPRESS_DEFLATE
)
605 ssl
->session_negotiate
->compression
= SSL_COMPRESS_DEFLATE
;
611 SSL_DEBUG_BUF( 3, "client hello, random bytes",
613 SSL_DEBUG_BUF( 3, "client hello, session id",
614 buf
+ 38, sess_len
);
615 SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
616 buf
+ 41 + sess_len
, ciph_len
);
617 SSL_DEBUG_BUF( 3, "client hello, compression",
618 buf
+ 42 + sess_len
+ ciph_len
, comp_len
);
621 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
623 for( i
= 0, p
= buf
+ 41 + sess_len
; i
< ciph_len
; i
+= 2, p
+= 2 )
625 if( p
[0] == 0 && p
[1] == SSL_EMPTY_RENEGOTIATION_INFO
)
627 SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
628 if( ssl
->renegotiation
== SSL_RENEGOTIATION
)
630 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
632 if( ( ret
= ssl_send_fatal_handshake_failure( ssl
) ) != 0 )
635 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
637 ssl
->secure_renegotiation
= SSL_SECURE_RENEGOTIATION
;
643 * Search for a matching ciphersuite
645 for( i
= 0; ssl
->ciphersuites
[ssl
->minor_ver
][i
] != 0; i
++ )
647 for( j
= 0, p
= buf
+ 41 + sess_len
; j
< ciph_len
;
650 if( p
[0] == 0 && p
[1] == ssl
->ciphersuites
[ssl
->minor_ver
][i
] )
651 goto have_ciphersuite
;
655 SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
657 return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN
);
660 ssl
->session_negotiate
->ciphersuite
= ssl
->ciphersuites
[ssl
->minor_ver
][i
];
661 ssl_optimize_checksum( ssl
, ssl
->session_negotiate
->ciphersuite
);
663 ext
= buf
+ 44 + sess_len
+ ciph_len
+ comp_len
;
667 unsigned int ext_id
= ( ( ext
[0] << 8 )
669 unsigned int ext_size
= ( ( ext
[2] << 8 )
672 if( ext_size
+ 4 > ext_len
)
674 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
675 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
679 case TLS_EXT_SERVERNAME
:
680 SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) );
681 if( ssl
->f_sni
== NULL
)
684 ret
= ssl_parse_servername_ext( ssl
, ext
+ 4, ext_size
);
689 case TLS_EXT_RENEGOTIATION_INFO
:
690 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
691 renegotiation_info_seen
= 1;
693 ret
= ssl_parse_renegotiation_info( ssl
, ext
+ 4, ext_size
);
698 case TLS_EXT_SIG_ALG
:
699 SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) );
700 if( ssl
->renegotiation
== SSL_RENEGOTIATION
)
703 ret
= ssl_parse_signature_algorithms_ext( ssl
, ext
+ 4, ext_size
);
709 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
713 ext_len
-= 4 + ext_size
;
716 if( ext_len
> 0 && ext_len
< 4 )
718 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
719 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
724 * Renegotiation security checks
726 if( ssl
->secure_renegotiation
== SSL_LEGACY_RENEGOTIATION
&&
727 ssl
->allow_legacy_renegotiation
== SSL_LEGACY_BREAK_HANDSHAKE
)
729 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
730 handshake_failure
= 1;
732 else if( ssl
->renegotiation
== SSL_RENEGOTIATION
&&
733 ssl
->secure_renegotiation
== SSL_SECURE_RENEGOTIATION
&&
734 renegotiation_info_seen
== 0 )
736 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
737 handshake_failure
= 1;
739 else if( ssl
->renegotiation
== SSL_RENEGOTIATION
&&
740 ssl
->secure_renegotiation
== SSL_LEGACY_RENEGOTIATION
&&
741 ssl
->allow_legacy_renegotiation
== SSL_LEGACY_NO_RENEGOTIATION
)
743 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
744 handshake_failure
= 1;
746 else if( ssl
->renegotiation
== SSL_RENEGOTIATION
&&
747 ssl
->secure_renegotiation
== SSL_LEGACY_RENEGOTIATION
&&
748 renegotiation_info_seen
== 1 )
750 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
751 handshake_failure
= 1;
754 if( handshake_failure
== 1 )
756 if( ( ret
= ssl_send_fatal_handshake_failure( ssl
) ) != 0 )
759 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO
);
765 SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
770 static int ssl_write_server_hello( ssl_context
*ssl
)
775 unsigned char *buf
, *p
;
777 SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
780 * 0 . 0 handshake type
781 * 1 . 3 handshake length
782 * 4 . 5 protocol version
784 * 10 . 37 random bytes
789 *p
++ = (unsigned char) ssl
->major_ver
;
790 *p
++ = (unsigned char) ssl
->minor_ver
;
792 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
796 *p
++ = (unsigned char)( t
>> 24 );
797 *p
++ = (unsigned char)( t
>> 16 );
798 *p
++ = (unsigned char)( t
>> 8 );
799 *p
++ = (unsigned char)( t
);
801 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t
) );
803 if( ( ret
= ssl
->f_rng( ssl
->p_rng
, p
, 28 ) ) != 0 )
808 memcpy( ssl
->handshake
->randbytes
+ 32, buf
+ 6, 32 );
810 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf
+ 6, 32 );
813 * 38 . 38 session id length
814 * 39 . 38+n session id
815 * 39+n . 40+n chosen ciphersuite
816 * 41+n . 41+n chosen compression alg.
818 ssl
->session_negotiate
->length
= n
= 32;
819 *p
++ = (unsigned char) ssl
->session_negotiate
->length
;
821 if( ssl
->renegotiation
!= SSL_INITIAL_HANDSHAKE
||
822 ssl
->f_get_cache
== NULL
||
823 ssl
->f_get_cache( ssl
->p_get_cache
, ssl
->session_negotiate
) != 0 )
826 * Not found, create a new session id
828 ssl
->handshake
->resume
= 0;
831 if( ( ret
= ssl
->f_rng( ssl
->p_rng
, ssl
->session_negotiate
->id
,
838 * Found a matching session, resuming it
840 ssl
->handshake
->resume
= 1;
841 ssl
->state
= SSL_SERVER_CHANGE_CIPHER_SPEC
;
843 if( ( ret
= ssl_derive_keys( ssl
) ) != 0 )
845 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret
);
850 memcpy( p
, ssl
->session_negotiate
->id
, ssl
->session_negotiate
->length
);
851 p
+= ssl
->session_negotiate
->length
;
853 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n
) );
854 SSL_DEBUG_BUF( 3, "server hello, session id", buf
+ 39, n
);
855 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
856 ssl
->handshake
->resume
? "a" : "no" ) );
858 *p
++ = (unsigned char)( ssl
->session_negotiate
->ciphersuite
>> 8 );
859 *p
++ = (unsigned char)( ssl
->session_negotiate
->ciphersuite
);
860 *p
++ = (unsigned char)( ssl
->session_negotiate
->compression
);
862 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d",
863 ssl
->session_negotiate
->ciphersuite
) );
864 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d",
865 ssl
->session_negotiate
->compression
) );
867 if( ssl
->secure_renegotiation
== SSL_SECURE_RENEGOTIATION
)
869 SSL_DEBUG_MSG( 3, ( "server hello, prepping for secure renegotiation extension" ) );
870 ext_len
+= 5 + ssl
->verify_data_len
* 2;
872 SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d",
875 *p
++ = (unsigned char)( ( ext_len
>> 8 ) & 0xFF );
876 *p
++ = (unsigned char)( ( ext_len
) & 0xFF );
879 * Secure renegotiation
881 SSL_DEBUG_MSG( 3, ( "client hello, secure renegotiation extension" ) );
883 *p
++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO
>> 8 ) & 0xFF );
884 *p
++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO
) & 0xFF );
887 *p
++ = ( ssl
->verify_data_len
* 2 + 1 ) & 0xFF;
888 *p
++ = ssl
->verify_data_len
* 2 & 0xFF;
890 memcpy( p
, ssl
->peer_verify_data
, ssl
->verify_data_len
);
891 p
+= ssl
->verify_data_len
;
892 memcpy( p
, ssl
->own_verify_data
, ssl
->verify_data_len
);
893 p
+= ssl
->verify_data_len
;
896 ssl
->out_msglen
= p
- buf
;
897 ssl
->out_msgtype
= SSL_MSG_HANDSHAKE
;
898 ssl
->out_msg
[0] = SSL_HS_SERVER_HELLO
;
900 ret
= ssl_write_record( ssl
);
902 SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
907 static int ssl_write_certificate_request( ssl_context
*ssl
)
910 size_t n
= 0, dn_size
, total_dn_size
;
911 unsigned char *buf
, *p
;
912 const x509_cert
*crt
;
914 SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
918 if( ssl
->authmode
== SSL_VERIFY_NONE
)
920 SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
925 * 0 . 0 handshake type
926 * 1 . 3 handshake length
927 * 4 . 4 cert type count
928 * 5 .. m-1 cert types
929 * m .. m+1 sig alg length (TLS 1.2 only)
930 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
931 * n .. n+1 length of all DNs
932 * n+2 .. n+3 length of DN 1
933 * n+4 .. ... Distinguished Name #1
934 * ... .. ... length of DN 2, etc.
940 * At the moment, only RSA certificates are supported
943 *p
++ = SSL_CERT_TYPE_RSA_SIGN
;
946 * Add signature_algorithms for verify (TLS 1.2)
947 * Only add current running algorithm that is already required for
948 * requested ciphersuite.
952 if( ssl
->minor_ver
== SSL_MINOR_VERSION_3
)
954 ssl
->handshake
->verify_sig_alg
= SSL_HASH_SHA256
;
959 if( ssl
->session_negotiate
->ciphersuite
== TLS_RSA_WITH_AES_256_GCM_SHA384
||
960 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
)
962 ssl
->handshake
->verify_sig_alg
= SSL_HASH_SHA384
;
965 *p
++ = ssl
->handshake
->verify_sig_alg
;
975 while( crt
!= NULL
&& crt
->version
!= 0)
980 dn_size
= crt
->subject_raw
.len
;
981 *p
++ = (unsigned char)( dn_size
>> 8 );
982 *p
++ = (unsigned char)( dn_size
);
983 memcpy( p
, crt
->subject_raw
.p
, dn_size
);
986 SSL_DEBUG_BUF( 3, "requested DN", p
, dn_size
);
988 total_dn_size
+= 2 + dn_size
;
992 ssl
->out_msglen
= p
- buf
;
993 ssl
->out_msgtype
= SSL_MSG_HANDSHAKE
;
994 ssl
->out_msg
[0] = SSL_HS_CERTIFICATE_REQUEST
;
995 ssl
->out_msg
[6 + n
] = (unsigned char)( total_dn_size
>> 8 );
996 ssl
->out_msg
[7 + n
] = (unsigned char)( total_dn_size
);
998 ret
= ssl_write_record( ssl
);
1000 SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
1005 static int ssl_write_server_key_exchange( ssl_context
*ssl
)
1007 #if defined(POLARSSL_DHM_C)
1009 size_t n
, rsa_key_len
= 0;
1010 unsigned char hash
[64];
1012 unsigned int hashlen
= 0;
1015 SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
1017 if( ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_DES_CBC_SHA
&&
1018 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
&&
1019 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_AES_128_CBC_SHA
&&
1020 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_AES_256_CBC_SHA
&&
1021 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
&&
1022 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
&&
1023 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
&&
1024 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
&&
1025 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
&&
1026 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
&&
1027 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
&&
1028 ssl
->session_negotiate
->ciphersuite
!= TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
)
1030 SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
1035 #if !defined(POLARSSL_DHM_C)
1036 SSL_DEBUG_MSG( 1, ( "support for dhm is not available" ) );
1037 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE
);
1040 if( ssl
->rsa_key
== NULL
)
1042 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1043 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED
);
1047 * Ephemeral DH parameters:
1050 * opaque dh_p<1..2^16-1>;
1051 * opaque dh_g<1..2^16-1>;
1052 * opaque dh_Ys<1..2^16-1>;
1055 if( ( ret
= mpi_copy( &ssl
->handshake
->dhm_ctx
.P
, &ssl
->dhm_P
) ) != 0 ||
1056 ( ret
= mpi_copy( &ssl
->handshake
->dhm_ctx
.G
, &ssl
->dhm_G
) ) != 0 )
1058 SSL_DEBUG_RET( 1, "mpi_copy", ret
);
1062 if( ( ret
= dhm_make_params( &ssl
->handshake
->dhm_ctx
,
1063 mpi_size( &ssl
->handshake
->dhm_ctx
.P
),
1065 &n
, ssl
->f_rng
, ssl
->p_rng
) ) != 0 )
1067 SSL_DEBUG_RET( 1, "dhm_make_params", ret
);
1071 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl
->handshake
->dhm_ctx
.X
);
1072 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl
->handshake
->dhm_ctx
.P
);
1073 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl
->handshake
->dhm_ctx
.G
);
1074 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl
->handshake
->dhm_ctx
.GX
);
1076 if( ssl
->minor_ver
!= SSL_MINOR_VERSION_3
)
1082 * digitally-signed struct {
1083 * opaque md5_hash[16];
1084 * opaque sha_hash[20];
1088 * MD5(ClientHello.random + ServerHello.random
1091 * SHA(ClientHello.random + ServerHello.random
1095 md5_update( &md5
, ssl
->handshake
->randbytes
, 64 );
1096 md5_update( &md5
, ssl
->out_msg
+ 4, n
);
1097 md5_finish( &md5
, hash
);
1099 sha1_starts( &sha1
);
1100 sha1_update( &sha1
, ssl
->handshake
->randbytes
, 64 );
1101 sha1_update( &sha1
, ssl
->out_msg
+ 4, n
);
1102 sha1_finish( &sha1
, hash
+ 16 );
1105 hash_id
= SIG_RSA_RAW
;
1110 * digitally-signed struct {
1111 * opaque client_random[32];
1112 * opaque server_random[32];
1113 * ServerDHParams params;
1116 #if defined(POLARSSL_SHA4_C)
1117 if( ssl
->handshake
->sig_alg
== SSL_HASH_SHA512
)
1121 sha4_starts( &sha4
, 0 );
1122 sha4_update( &sha4
, ssl
->handshake
->randbytes
, 64 );
1123 sha4_update( &sha4
, ssl
->out_msg
+ 4, n
);
1124 sha4_finish( &sha4
, hash
);
1127 hash_id
= SIG_RSA_SHA512
;
1129 else if( ssl
->handshake
->sig_alg
== SSL_HASH_SHA384
)
1133 sha4_starts( &sha4
, 1 );
1134 sha4_update( &sha4
, ssl
->handshake
->randbytes
, 64 );
1135 sha4_update( &sha4
, ssl
->out_msg
+ 4, n
);
1136 sha4_finish( &sha4
, hash
);
1139 hash_id
= SIG_RSA_SHA384
;
1143 #if defined(POLARSSL_SHA2_C)
1144 if( ssl
->handshake
->sig_alg
== SSL_HASH_SHA256
)
1148 sha2_starts( &sha2
, 0 );
1149 sha2_update( &sha2
, ssl
->handshake
->randbytes
, 64 );
1150 sha2_update( &sha2
, ssl
->out_msg
+ 4, n
);
1151 sha2_finish( &sha2
, hash
);
1154 hash_id
= SIG_RSA_SHA256
;
1156 else if( ssl
->handshake
->sig_alg
== SSL_HASH_SHA224
)
1160 sha2_starts( &sha2
, 1 );
1161 sha2_update( &sha2
, ssl
->handshake
->randbytes
, 64 );
1162 sha2_update( &sha2
, ssl
->out_msg
+ 4, n
);
1163 sha2_finish( &sha2
, hash
);
1166 hash_id
= SIG_RSA_SHA224
;
1170 if( ssl
->handshake
->sig_alg
== SSL_HASH_SHA1
)
1174 sha1_starts( &sha1
);
1175 sha1_update( &sha1
, ssl
->handshake
->randbytes
, 64 );
1176 sha1_update( &sha1
, ssl
->out_msg
+ 4, n
);
1177 sha1_finish( &sha1
, hash
);
1180 hash_id
= SIG_RSA_SHA1
;
1182 else if( ssl
->handshake
->sig_alg
== SSL_HASH_MD5
)
1187 md5_update( &md5
, ssl
->handshake
->randbytes
, 64 );
1188 md5_update( &md5
, ssl
->out_msg
+ 4, n
);
1189 md5_finish( &md5
, hash
);
1192 hash_id
= SIG_RSA_MD5
;
1196 SSL_DEBUG_BUF( 3, "parameters hash", hash
, hashlen
);
1199 rsa_key_len
= ssl
->rsa_key_len( ssl
->rsa_key
);
1201 if( ssl
->minor_ver
== SSL_MINOR_VERSION_3
)
1203 ssl
->out_msg
[4 + n
] = ssl
->handshake
->sig_alg
;
1204 ssl
->out_msg
[5 + n
] = SSL_SIG_RSA
;
1209 ssl
->out_msg
[4 + n
] = (unsigned char)( rsa_key_len
>> 8 );
1210 ssl
->out_msg
[5 + n
] = (unsigned char)( rsa_key_len
);
1214 ret
= ssl
->rsa_sign( ssl
->rsa_key
, ssl
->f_rng
, ssl
->p_rng
,
1216 hash_id
, hashlen
, hash
,
1217 ssl
->out_msg
+ 6 + n
);
1222 SSL_DEBUG_RET( 1, "pkcs1_sign", ret
);
1226 SSL_DEBUG_BUF( 3, "my RSA sig", ssl
->out_msg
+ 6 + n
, rsa_key_len
);
1228 ssl
->out_msglen
= 6 + n
+ rsa_key_len
;
1229 ssl
->out_msgtype
= SSL_MSG_HANDSHAKE
;
1230 ssl
->out_msg
[0] = SSL_HS_SERVER_KEY_EXCHANGE
;
1234 if( ( ret
= ssl_write_record( ssl
) ) != 0 )
1236 SSL_DEBUG_RET( 1, "ssl_write_record", ret
);
1240 SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) );
1246 static int ssl_write_server_hello_done( ssl_context
*ssl
)
1250 SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) );
1252 ssl
->out_msglen
= 4;
1253 ssl
->out_msgtype
= SSL_MSG_HANDSHAKE
;
1254 ssl
->out_msg
[0] = SSL_HS_SERVER_HELLO_DONE
;
1258 if( ( ret
= ssl_write_record( ssl
) ) != 0 )
1260 SSL_DEBUG_RET( 1, "ssl_write_record", ret
);
1264 SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) );
1269 static int ssl_parse_client_key_exchange( ssl_context
*ssl
)
1274 SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) );
1276 if( ( ret
= ssl_read_record( ssl
) ) != 0 )
1278 SSL_DEBUG_RET( 1, "ssl_read_record", ret
);
1282 if( ssl
->in_msgtype
!= SSL_MSG_HANDSHAKE
)
1284 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1285 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE
);
1288 if( ssl
->in_msg
[0] != SSL_HS_CLIENT_KEY_EXCHANGE
)
1290 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1291 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE
);
1294 if( ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_DES_CBC_SHA
||
1295 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
||
1296 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_AES_128_CBC_SHA
||
1297 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_AES_256_CBC_SHA
||
1298 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
||
1299 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
||
1300 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
||
1301 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
||
1302 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
||
1303 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
||
1304 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
||
1305 ssl
->session_negotiate
->ciphersuite
== TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
)
1307 #if !defined(POLARSSL_DHM_C)
1308 SSL_DEBUG_MSG( 1, ( "support for dhm is not available" ) );
1309 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE
);
1312 * Receive G^Y mod P, premaster = (G^Y)^X mod P
1314 n
= ( ssl
->in_msg
[4] << 8 ) | ssl
->in_msg
[5];
1316 if( n
< 1 || n
> ssl
->handshake
->dhm_ctx
.len
||
1317 n
+ 6 != ssl
->in_hslen
)
1319 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1320 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE
);
1323 if( ( ret
= dhm_read_public( &ssl
->handshake
->dhm_ctx
,
1324 ssl
->in_msg
+ 6, n
) ) != 0 )
1326 SSL_DEBUG_RET( 1, "dhm_read_public", ret
);
1327 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_RP
);
1330 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl
->handshake
->dhm_ctx
.GY
);
1332 ssl
->handshake
->pmslen
= ssl
->handshake
->dhm_ctx
.len
;
1334 if( ( ret
= dhm_calc_secret( &ssl
->handshake
->dhm_ctx
,
1335 ssl
->handshake
->premaster
,
1336 &ssl
->handshake
->pmslen
) ) != 0 )
1338 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret
);
1339 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_CS
);
1342 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl
->handshake
->dhm_ctx
.K
);
1347 if( ssl
->rsa_key
== NULL
)
1349 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1350 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED
);
1354 * Decrypt the premaster using own private RSA key
1358 n
= ssl
->rsa_key_len( ssl
->rsa_key
);
1359 ssl
->handshake
->pmslen
= 48;
1361 if( ssl
->minor_ver
!= SSL_MINOR_VERSION_0
)
1364 if( ssl
->in_msg
[4] != ( ( n
>> 8 ) & 0xFF ) ||
1365 ssl
->in_msg
[5] != ( ( n
) & 0xFF ) )
1367 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1368 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE
);
1372 if( ssl
->in_hslen
!= i
+ n
)
1374 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1375 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE
);
1378 if( ssl
->rsa_key
) {
1379 ret
= ssl
->rsa_decrypt( ssl
->rsa_key
, RSA_PRIVATE
,
1380 &ssl
->handshake
->pmslen
,
1382 ssl
->handshake
->premaster
,
1383 sizeof(ssl
->handshake
->premaster
) );
1386 if( ret
!= 0 || ssl
->handshake
->pmslen
!= 48 ||
1387 ssl
->handshake
->premaster
[0] != ssl
->max_major_ver
||
1388 ssl
->handshake
->premaster
[1] != ssl
->max_minor_ver
)
1390 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
1393 * Protection against Bleichenbacher's attack:
1394 * invalid PKCS#1 v1.5 padding must not cause
1395 * the connection to end immediately; instead,
1396 * send a bad_record_mac later in the handshake.
1398 ssl
->handshake
->pmslen
= 48;
1400 ret
= ssl
->f_rng( ssl
->p_rng
, ssl
->handshake
->premaster
,
1401 ssl
->handshake
->pmslen
);
1407 if( ( ret
= ssl_derive_keys( ssl
) ) != 0 )
1409 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret
);
1415 SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) );
1420 static int ssl_parse_certificate_verify( ssl_context
*ssl
)
1423 size_t n
= 0, n1
, n2
;
1424 unsigned char hash
[48];
1426 unsigned int hashlen
;
1428 SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
1430 if( ssl
->session_negotiate
->peer_cert
== NULL
)
1432 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
1437 ssl
->handshake
->calc_verify( ssl
, hash
);
1439 if( ( ret
= ssl_read_record( ssl
) ) != 0 )
1441 SSL_DEBUG_RET( 1, "ssl_read_record", ret
);
1447 if( ssl
->in_msgtype
!= SSL_MSG_HANDSHAKE
)
1449 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
1450 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY
);
1453 if( ssl
->in_msg
[0] != SSL_HS_CERTIFICATE_VERIFY
)
1455 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
1456 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY
);
1459 if( ssl
->minor_ver
== SSL_MINOR_VERSION_3
)
1462 * As server we know we either have SSL_HASH_SHA384 or
1465 if( ssl
->in_msg
[4] != ssl
->handshake
->verify_sig_alg
||
1466 ssl
->in_msg
[5] != SSL_SIG_RSA
)
1468 SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg for verify message" ) );
1469 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY
);
1472 if( ssl
->handshake
->verify_sig_alg
== SSL_HASH_SHA384
)
1475 hash_id
= SIG_RSA_SHA384
;
1480 hash_id
= SIG_RSA_SHA256
;
1488 hash_id
= SIG_RSA_RAW
;
1491 n1
= ssl
->session_negotiate
->peer_cert
->rsa
.len
;
1492 n2
= ( ssl
->in_msg
[4 + n
] << 8 ) | ssl
->in_msg
[5 + n
];
1494 if( n
+ n1
+ 6 != ssl
->in_hslen
|| n1
!= n2
)
1496 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
1497 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY
);
1500 ret
= rsa_pkcs1_verify( &ssl
->session_negotiate
->peer_cert
->rsa
, RSA_PUBLIC
,
1501 hash_id
, hashlen
, hash
, ssl
->in_msg
+ 6 + n
);
1504 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret
);
1508 SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
1514 * SSL handshake -- server side -- single step
1516 int ssl_handshake_server_step( ssl_context
*ssl
)
1520 if( ssl
->state
== SSL_HANDSHAKE_OVER
)
1521 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA
);
1523 SSL_DEBUG_MSG( 2, ( "server state: %d", ssl
->state
) );
1525 if( ( ret
= ssl_flush_output( ssl
) ) != 0 )
1528 switch( ssl
->state
)
1530 case SSL_HELLO_REQUEST
:
1531 ssl
->state
= SSL_CLIENT_HELLO
;
1537 case SSL_CLIENT_HELLO
:
1538 ret
= ssl_parse_client_hello( ssl
);
1544 * ( ServerKeyExchange )
1545 * ( CertificateRequest )
1548 case SSL_SERVER_HELLO
:
1549 ret
= ssl_write_server_hello( ssl
);
1552 case SSL_SERVER_CERTIFICATE
:
1553 ret
= ssl_write_certificate( ssl
);
1556 case SSL_SERVER_KEY_EXCHANGE
:
1557 ret
= ssl_write_server_key_exchange( ssl
);
1560 case SSL_CERTIFICATE_REQUEST
:
1561 ret
= ssl_write_certificate_request( ssl
);
1564 case SSL_SERVER_HELLO_DONE
:
1565 ret
= ssl_write_server_hello_done( ssl
);
1569 * <== ( Certificate/Alert )
1571 * ( CertificateVerify )
1575 case SSL_CLIENT_CERTIFICATE
:
1576 ret
= ssl_parse_certificate( ssl
);
1579 case SSL_CLIENT_KEY_EXCHANGE
:
1580 ret
= ssl_parse_client_key_exchange( ssl
);
1583 case SSL_CERTIFICATE_VERIFY
:
1584 ret
= ssl_parse_certificate_verify( ssl
);
1587 case SSL_CLIENT_CHANGE_CIPHER_SPEC
:
1588 ret
= ssl_parse_change_cipher_spec( ssl
);
1591 case SSL_CLIENT_FINISHED
:
1592 ret
= ssl_parse_finished( ssl
);
1596 * ==> ChangeCipherSpec
1599 case SSL_SERVER_CHANGE_CIPHER_SPEC
:
1600 ret
= ssl_write_change_cipher_spec( ssl
);
1603 case SSL_SERVER_FINISHED
:
1604 ret
= ssl_write_finished( ssl
);
1607 case SSL_FLUSH_BUFFERS
:
1608 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
1609 ssl
->state
= SSL_HANDSHAKE_WRAPUP
;
1612 case SSL_HANDSHAKE_WRAPUP
:
1613 ssl_handshake_wrapup( ssl
);
1617 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl
->state
) );
1618 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA
);