blob: 742b9126ec86d72366340e4978d54155c28a2c17 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 server-side functions
3 *
Paul Bakkerfab5c822012-02-06 16:45:10 +00004 * Copyright (C) 2006-2012, 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 Bakker5121ce52009-01-03 21:22:43 +000032
Paul Bakker43b7e352011-01-18 15:27:19 +000033#if defined(POLARSSL_PKCS11_C)
34#include "polarssl/pkcs11.h"
35#endif /* defined(POLARSSL_PKCS11_C) */
36
Paul Bakker5121ce52009-01-03 21:22:43 +000037#include <stdlib.h>
38#include <stdio.h>
39#include <time.h>
40
Paul Bakker48916f92012-09-16 19:57:18 +000041static int ssl_parse_renegotiation_info( ssl_context *ssl,
42 unsigned char *buf,
43 size_t len )
44{
45 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
46 {
47 if( len != 1 || buf[0] != 0x0 )
48 {
49 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
50 /* TODO: Send handshake failure alert */
51 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
52 }
53
54 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
55 }
56 else
57 {
58 if( len != 1 + ssl->verify_data_len ||
59 buf[0] != ssl->verify_data_len ||
60 memcmp( buf + 1, ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
61 {
62 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
63 /* TODO: Send handshake failure alert */
64 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
65 }
66 }
67
68 return( 0 );
69}
70
Paul Bakker5121ce52009-01-03 21:22:43 +000071static int ssl_parse_client_hello( ssl_context *ssl )
72{
Paul Bakker23986e52011-04-24 08:57:21 +000073 int ret;
74 unsigned int i, j;
75 size_t n;
76 unsigned int ciph_len, sess_len;
Paul Bakkerec636f32012-09-09 19:17:02 +000077 unsigned int comp_len;
Paul Bakker48916f92012-09-16 19:57:18 +000078 unsigned int ext_len = 0;
79 unsigned char *buf, *p, *ext;
80 int renegotiation_info_seen;
Paul Bakker5121ce52009-01-03 21:22:43 +000081
82 SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
83
Paul Bakker48916f92012-09-16 19:57:18 +000084 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
85 ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +000086 {
87 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
88 return( ret );
89 }
90
91 buf = ssl->in_hdr;
92
Paul Bakkerec636f32012-09-09 19:17:02 +000093 SSL_DEBUG_BUF( 4, "record header", buf, 5 );
94
95 SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d",
96 buf[0] ) );
97 SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d",
98 ( buf[3] << 8 ) | buf[4] ) );
99 SSL_DEBUG_MSG( 3, ( "client hello v3, protocol ver: [%d:%d]",
100 buf[1], buf[2] ) );
101
102 /*
103 * SSLv3 Client Hello
104 *
105 * Record layer:
106 * 0 . 0 message type
107 * 1 . 2 protocol version
108 * 3 . 4 message length
109 */
110 if( buf[0] != SSL_MSG_HANDSHAKE ||
111 buf[1] != SSL_MAJOR_VERSION_3 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000112 {
Paul Bakkerec636f32012-09-09 19:17:02 +0000113 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
114 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
115 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000116
Paul Bakkerec636f32012-09-09 19:17:02 +0000117 n = ( buf[3] << 8 ) | buf[4];
Paul Bakker5121ce52009-01-03 21:22:43 +0000118
Paul Bakkerec636f32012-09-09 19:17:02 +0000119 if( n < 45 || n > 512 )
120 {
121 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
122 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
123 }
124
Paul Bakker48916f92012-09-16 19:57:18 +0000125 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
126 ( ret = ssl_fetch_input( ssl, 5 + n ) ) != 0 )
Paul Bakkerec636f32012-09-09 19:17:02 +0000127 {
128 SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
129 return( ret );
130 }
131
132 buf = ssl->in_msg;
Paul Bakker48916f92012-09-16 19:57:18 +0000133 if( !ssl->renegotiation )
134 n = ssl->in_left - 5;
135 else
136 n = ssl->in_msglen;
Paul Bakkerec636f32012-09-09 19:17:02 +0000137
Paul Bakker48916f92012-09-16 19:57:18 +0000138 ssl->handshake->update_checksum( ssl, buf, n );
Paul Bakkerec636f32012-09-09 19:17:02 +0000139
140 /*
141 * SSL layer:
142 * 0 . 0 handshake type
143 * 1 . 3 handshake length
144 * 4 . 5 protocol version
145 * 6 . 9 UNIX time()
146 * 10 . 37 random bytes
147 * 38 . 38 session id length
148 * 39 . 38+x session id
149 * 39+x . 40+x ciphersuitelist length
150 * 41+x . .. ciphersuitelist
151 * .. . .. compression alg.
152 * .. . .. extensions
153 */
154 SSL_DEBUG_BUF( 4, "record contents", buf, n );
155
156 SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d",
157 buf[0] ) );
158 SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d",
159 ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) );
160 SSL_DEBUG_MSG( 3, ( "client hello v3, max. version: [%d:%d]",
161 buf[4], buf[5] ) );
162
163 /*
164 * Check the handshake type and protocol version
165 */
166 if( buf[0] != SSL_HS_CLIENT_HELLO ||
167 buf[4] != SSL_MAJOR_VERSION_3 )
168 {
169 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
170 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
171 }
172
173 ssl->major_ver = SSL_MAJOR_VERSION_3;
174 ssl->minor_ver = ( buf[5] <= SSL_MINOR_VERSION_3 )
175 ? buf[5] : SSL_MINOR_VERSION_3;
176
177 ssl->max_major_ver = buf[4];
178 ssl->max_minor_ver = buf[5];
179
Paul Bakker48916f92012-09-16 19:57:18 +0000180 memcpy( ssl->handshake->randbytes, buf + 6, 32 );
Paul Bakkerec636f32012-09-09 19:17:02 +0000181
182 /*
183 * Check the handshake message length
184 */
185 if( buf[1] != 0 || n != (unsigned int) 4 + ( ( buf[2] << 8 ) | buf[3] ) )
186 {
187 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
188 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
189 }
190
191 /*
192 * Check the session length
193 */
194 sess_len = buf[38];
195
196 if( sess_len > 32 )
197 {
198 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
199 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
200 }
201
Paul Bakker48916f92012-09-16 19:57:18 +0000202 ssl->session_negotiate->length = sess_len;
203 memset( ssl->session_negotiate->id, 0,
204 sizeof( ssl->session_negotiate->id ) );
205 memcpy( ssl->session_negotiate->id, buf + 39,
206 ssl->session_negotiate->length );
Paul Bakkerec636f32012-09-09 19:17:02 +0000207
208 /*
209 * Check the ciphersuitelist length
210 */
211 ciph_len = ( buf[39 + sess_len] << 8 )
212 | ( buf[40 + sess_len] );
213
214 if( ciph_len < 2 || ciph_len > 256 || ( ciph_len % 2 ) != 0 )
215 {
216 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
217 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
218 }
219
220 /*
221 * Check the compression algorithms length
222 */
223 comp_len = buf[41 + sess_len + ciph_len];
224
225 if( comp_len < 1 || comp_len > 16 )
226 {
227 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
228 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
229 }
230
Paul Bakker48916f92012-09-16 19:57:18 +0000231 /*
232 * Check the extension length
233 */
234 if( n > 42 + sess_len + ciph_len + comp_len )
235 {
236 ext_len = ( buf[42 + sess_len + ciph_len + comp_len] << 8 )
237 | ( buf[43 + sess_len + ciph_len + comp_len] );
238
239 if( ( ext_len > 0 && ext_len < 4 ) ||
240 n != 44 + sess_len + ciph_len + comp_len + ext_len )
241 {
242 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
243 SSL_DEBUG_BUF( 3, "Ext", buf + 44 + sess_len + ciph_len + comp_len, ext_len);
244 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
245 }
246 }
247
248 ssl->session_negotiate->compression = SSL_COMPRESS_NULL;
Paul Bakkerec636f32012-09-09 19:17:02 +0000249#if defined(POLARSSL_ZLIB_SUPPORT)
250 for( i = 0; i < comp_len; ++i )
251 {
Paul Bakker48916f92012-09-16 19:57:18 +0000252 if( buf[42 + sess_len + ciph_len + i] == SSL_COMPRESS_DEFLATE )
Paul Bakker5121ce52009-01-03 21:22:43 +0000253 {
Paul Bakker48916f92012-09-16 19:57:18 +0000254 ssl->session_negotiate->compression = SSL_COMPRESS_DEFLATE;
Paul Bakkerec636f32012-09-09 19:17:02 +0000255 break;
Paul Bakker5121ce52009-01-03 21:22:43 +0000256 }
257 }
Paul Bakker2770fbd2012-07-03 13:30:23 +0000258#endif
259
Paul Bakkerec636f32012-09-09 19:17:02 +0000260 SSL_DEBUG_BUF( 3, "client hello, random bytes",
261 buf + 6, 32 );
262 SSL_DEBUG_BUF( 3, "client hello, session id",
263 buf + 38, sess_len );
264 SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
265 buf + 41 + sess_len, ciph_len );
266 SSL_DEBUG_BUF( 3, "client hello, compression",
267 buf + 42 + sess_len + ciph_len, comp_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000268
Paul Bakkerec636f32012-09-09 19:17:02 +0000269 /*
Paul Bakker48916f92012-09-16 19:57:18 +0000270 * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
271 */
272 for( i = 0, p = buf + 41 + sess_len; i < ciph_len; i += 2, p += 2 )
273 {
274 if( p[0] == 0 && p[1] == SSL_EMPTY_RENEGOTIATION_INFO )
275 {
276 SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) );
277 if( ssl->renegotiation == SSL_RENEGOTIATION )
278 {
279 SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV during renegotiation" ) );
280 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
281 }
282 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
283 break;
284 }
285 }
286
287 /*
Paul Bakkerec636f32012-09-09 19:17:02 +0000288 * Search for a matching ciphersuite
289 */
290 for( i = 0; ssl->ciphersuites[i] != 0; i++ )
291 {
292 for( j = 0, p = buf + 41 + sess_len; j < ciph_len;
293 j += 2, p += 2 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000294 {
Paul Bakkerec636f32012-09-09 19:17:02 +0000295 if( p[0] == 0 && p[1] == ssl->ciphersuites[i] )
296 goto have_ciphersuite;
Paul Bakker5121ce52009-01-03 21:22:43 +0000297 }
298 }
299
Paul Bakkere3166ce2011-01-27 17:40:50 +0000300 SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000301
Paul Bakker40e46942009-01-03 21:51:57 +0000302 return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
Paul Bakker5121ce52009-01-03 21:22:43 +0000303
Paul Bakkere3166ce2011-01-27 17:40:50 +0000304have_ciphersuite:
Paul Bakker48916f92012-09-16 19:57:18 +0000305 ssl->session_negotiate->ciphersuite = ssl->ciphersuites[i];
306 ssl_optimize_checksum( ssl, ssl->session_negotiate->ciphersuite );
Paul Bakker5121ce52009-01-03 21:22:43 +0000307
Paul Bakker48916f92012-09-16 19:57:18 +0000308 ext = buf + 44 + sess_len + ciph_len + comp_len;
309 renegotiation_info_seen = 0;
310
311 while( ext_len )
312 {
313 unsigned int ext_id = ( ( ext[0] << 8 )
314 | ( ext[1] ) );
315 unsigned int ext_size = ( ( ext[2] << 8 )
316 | ( ext[3] ) );
317
318 if( ext_size + 4 > ext_len )
319 {
320 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
321 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
322 }
323 switch( ext_id )
324 {
325 case TLS_EXT_RENEGOTIATION_INFO:
326 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
327 renegotiation_info_seen = 1;
328
329 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ) ) != 0 )
330 return( ret );
331
332 break;
333
334 default:
335 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
336 ext_id ) );
337 }
338
339 ext_len -= 4 + ext_size;
340 ext += 4 + ext_size;
341
342 if( ext_len > 0 && ext_len < 4 )
343 {
344 SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
345 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
346 }
347 }
348
349 /*
350 * Renegotiation security checks
351 */
352 if( ssl->renegotiation == SSL_RENEGOTIATION &&
353 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
354 renegotiation_info_seen == 0 )
355 {
356 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
357 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
358 }
359
360 if( ssl->renegotiation == SSL_RENEGOTIATION &&
361 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
362 renegotiation_info_seen == 1 )
363 {
364 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
365 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
366 }
367
368 if( !ssl->allow_legacy_renegotiation &&
369 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION )
370 {
371 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
372 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
373 }
Paul Bakker380da532012-04-18 16:10:25 +0000374
Paul Bakker5121ce52009-01-03 21:22:43 +0000375 ssl->in_left = 0;
376 ssl->state++;
377
378 SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
379
380 return( 0 );
381}
382
383static int ssl_write_server_hello( ssl_context *ssl )
384{
385 time_t t;
Paul Bakkera3d195c2011-11-27 21:07:34 +0000386 int ret, n;
Paul Bakker48916f92012-09-16 19:57:18 +0000387 size_t ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000388 unsigned char *buf, *p;
389
390 SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
391
392 /*
393 * 0 . 0 handshake type
394 * 1 . 3 handshake length
395 * 4 . 5 protocol version
396 * 6 . 9 UNIX time()
397 * 10 . 37 random bytes
398 */
399 buf = ssl->out_msg;
400 p = buf + 4;
401
402 *p++ = (unsigned char) ssl->major_ver;
403 *p++ = (unsigned char) ssl->minor_ver;
404
405 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
406 buf[4], buf[5] ) );
407
408 t = time( NULL );
409 *p++ = (unsigned char)( t >> 24 );
410 *p++ = (unsigned char)( t >> 16 );
411 *p++ = (unsigned char)( t >> 8 );
412 *p++ = (unsigned char)( t );
413
414 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
415
Paul Bakkera3d195c2011-11-27 21:07:34 +0000416 if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
417 return( ret );
418
419 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +0000420
Paul Bakker48916f92012-09-16 19:57:18 +0000421 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000422
423 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
424
425 /*
426 * 38 . 38 session id length
427 * 39 . 38+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000428 * 39+n . 40+n chosen ciphersuite
Paul Bakker5121ce52009-01-03 21:22:43 +0000429 * 41+n . 41+n chosen compression alg.
430 */
Paul Bakker48916f92012-09-16 19:57:18 +0000431 ssl->session_negotiate->length = n = 32;
432 *p++ = (unsigned char) ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +0000433
434 if( ssl->s_get == NULL ||
435 ssl->s_get( ssl ) != 0 )
436 {
437 /*
438 * Not found, create a new session id
439 */
440 ssl->resume = 0;
441 ssl->state++;
442
Paul Bakker48916f92012-09-16 19:57:18 +0000443 if( ssl->session_negotiate == NULL )
Paul Bakker1c70d402011-12-04 22:30:17 +0000444 {
445 SSL_DEBUG_MSG( 1, ( "No session struct set" ) );
446 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
447 }
448
Paul Bakker48916f92012-09-16 19:57:18 +0000449 if( ( ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id,
450 n ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +0000451 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000452 }
453 else
454 {
455 /*
456 * Found a matching session, resume it
457 */
458 ssl->resume = 1;
459 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +0000460
461 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
462 {
463 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
464 return( ret );
465 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000466 }
467
Paul Bakker48916f92012-09-16 19:57:18 +0000468 memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->length );
469 p += ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +0000470
471 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
472 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
473 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
474 ssl->resume ? "a" : "no" ) );
475
Paul Bakker48916f92012-09-16 19:57:18 +0000476 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 );
477 *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite );
478 *p++ = (unsigned char)( ssl->session_negotiate->compression );
Paul Bakker5121ce52009-01-03 21:22:43 +0000479
Paul Bakkere3166ce2011-01-27 17:40:50 +0000480 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000481 ssl->session_negotiate->ciphersuite ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000482 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000483 ssl->session_negotiate->compression ) );
484
485 SSL_DEBUG_MSG( 3, ( "server hello, prepping for secure renegotiation extension" ) );
486 ext_len += 5 + ssl->verify_data_len * 2;
487
488 SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d",
489 ext_len ) );
490
491 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
492 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
493
494 /*
495 * Secure renegotiation
496 */
497 SSL_DEBUG_MSG( 3, ( "client hello, secure renegotiation extension" ) );
498
499 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
500 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
501
502 *p++ = 0x00;
503 *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF;
504 *p++ = ssl->verify_data_len * 2 & 0xFF;
505
506 memcpy( p, ssl->peer_verify_data, ssl->verify_data_len );
507 p += ssl->verify_data_len;
508 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
509 p += ssl->verify_data_len;
Paul Bakker5121ce52009-01-03 21:22:43 +0000510
511 ssl->out_msglen = p - buf;
512 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
513 ssl->out_msg[0] = SSL_HS_SERVER_HELLO;
514
515 ret = ssl_write_record( ssl );
516
517 SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
518
519 return( ret );
520}
521
522static int ssl_write_certificate_request( ssl_context *ssl )
523{
Paul Bakker23986e52011-04-24 08:57:21 +0000524 int ret;
525 size_t n;
Paul Bakker5121ce52009-01-03 21:22:43 +0000526 unsigned char *buf, *p;
Paul Bakkerff60ee62010-03-16 21:09:09 +0000527 const x509_cert *crt;
Paul Bakker5121ce52009-01-03 21:22:43 +0000528
529 SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
530
531 ssl->state++;
532
533 if( ssl->authmode == SSL_VERIFY_NONE )
534 {
535 SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
536 return( 0 );
537 }
538
539 /*
540 * 0 . 0 handshake type
541 * 1 . 3 handshake length
542 * 4 . 4 cert type count
543 * 5 .. n-1 cert types
544 * n .. n+1 length of all DNs
545 * n+2 .. n+3 length of DN 1
546 * n+4 .. ... Distinguished Name #1
547 * ... .. ... length of DN 2, etc.
548 */
549 buf = ssl->out_msg;
550 p = buf + 4;
551
552 /*
553 * At the moment, only RSA certificates are supported
554 */
555 *p++ = 1;
556 *p++ = 1;
557
558 p += 2;
559 crt = ssl->ca_chain;
560
Paul Bakker29087132010-03-21 21:03:34 +0000561 while( crt != NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +0000562 {
563 if( p - buf > 4096 )
564 break;
565
566 n = crt->subject_raw.len;
567 *p++ = (unsigned char)( n >> 8 );
568 *p++ = (unsigned char)( n );
569 memcpy( p, crt->subject_raw.p, n );
570
571 SSL_DEBUG_BUF( 3, "requested DN", p, n );
572 p += n; crt = crt->next;
573 }
574
575 ssl->out_msglen = n = p - buf;
576 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
577 ssl->out_msg[0] = SSL_HS_CERTIFICATE_REQUEST;
578 ssl->out_msg[6] = (unsigned char)( ( n - 8 ) >> 8 );
579 ssl->out_msg[7] = (unsigned char)( ( n - 8 ) );
580
581 ret = ssl_write_record( ssl );
582
583 SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
584
585 return( ret );
586}
587
588static int ssl_write_server_key_exchange( ssl_context *ssl )
589{
Paul Bakker5690efc2011-05-26 13:16:06 +0000590#if defined(POLARSSL_DHM_C)
Paul Bakker23986e52011-04-24 08:57:21 +0000591 int ret;
592 size_t n, rsa_key_len = 0;
Paul Bakkerca4ab492012-04-18 14:23:57 +0000593 unsigned char hash[48];
Paul Bakker5121ce52009-01-03 21:22:43 +0000594 md5_context md5;
595 sha1_context sha1;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000596 int hash_id;
597 unsigned int hashlen;
Paul Bakker5690efc2011-05-26 13:16:06 +0000598#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000599
600 SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
601
Paul Bakker48916f92012-09-16 19:57:18 +0000602 if( ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_DES_SHA &&
603 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_DES_168_SHA &&
604 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_AES_128_SHA &&
605 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_AES_256_SHA &&
606 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_AES_128_SHA256 &&
607 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_AES_256_SHA256 &&
608 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_CAMELLIA_128_SHA &&
609 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_CAMELLIA_256_SHA &&
610 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_CAMELLIA_128_SHA256 &&
611 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_CAMELLIA_256_SHA256 &&
612 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_AES_128_GCM_SHA256 &&
613 ssl->session_negotiate->ciphersuite != SSL_EDH_RSA_AES_256_GCM_SHA384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000614 {
615 SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
616 ssl->state++;
617 return( 0 );
618 }
619
Paul Bakker40e46942009-01-03 21:51:57 +0000620#if !defined(POLARSSL_DHM_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000621 SSL_DEBUG_MSG( 1, ( "support for dhm is not available" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000622 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000623#else
Paul Bakker43b7e352011-01-18 15:27:19 +0000624
625 if( ssl->rsa_key == NULL )
626 {
627#if defined(POLARSSL_PKCS11_C)
628 if( ssl->pkcs11_key == NULL )
629 {
630#endif /* defined(POLARSSL_PKCS11_C) */
631 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
632 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
633#if defined(POLARSSL_PKCS11_C)
634 }
635#endif /* defined(POLARSSL_PKCS11_C) */
636 }
637
Paul Bakker5121ce52009-01-03 21:22:43 +0000638 /*
639 * Ephemeral DH parameters:
640 *
641 * struct {
642 * opaque dh_p<1..2^16-1>;
643 * opaque dh_g<1..2^16-1>;
644 * opaque dh_Ys<1..2^16-1>;
645 * } ServerDHParams;
646 */
Paul Bakker48916f92012-09-16 19:57:18 +0000647 if( ( ret = mpi_copy( &ssl->handshake->dhm_ctx.P, &ssl->dhm_P ) ) != 0 ||
648 ( ret = mpi_copy( &ssl->handshake->dhm_ctx.G, &ssl->dhm_G ) ) != 0 )
649 {
650 SSL_DEBUG_RET( 1, "mpi_copy", ret );
651 return( ret );
652 }
653
654 if( ( ret = dhm_make_params( &ssl->handshake->dhm_ctx, 256, ssl->out_msg + 4,
655 &n, ssl->f_rng, ssl->p_rng ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000656 {
657 SSL_DEBUG_RET( 1, "dhm_make_params", ret );
658 return( ret );
659 }
660
Paul Bakker48916f92012-09-16 19:57:18 +0000661 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
662 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
663 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
664 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +0000665
Paul Bakker1ef83d62012-04-11 12:09:53 +0000666 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
667 {
668 /*
669 * digitally-signed struct {
670 * opaque md5_hash[16];
671 * opaque sha_hash[20];
672 * };
673 *
674 * md5_hash
675 * MD5(ClientHello.random + ServerHello.random
676 * + ServerParams);
677 * sha_hash
678 * SHA(ClientHello.random + ServerHello.random
679 * + ServerParams);
680 */
681 md5_starts( &md5 );
Paul Bakker48916f92012-09-16 19:57:18 +0000682 md5_update( &md5, ssl->handshake->randbytes, 64 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000683 md5_update( &md5, ssl->out_msg + 4, n );
684 md5_finish( &md5, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000685
Paul Bakker1ef83d62012-04-11 12:09:53 +0000686 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +0000687 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000688 sha1_update( &sha1, ssl->out_msg + 4, n );
689 sha1_finish( &sha1, hash + 16 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000690
Paul Bakker1ef83d62012-04-11 12:09:53 +0000691 hashlen = 36;
692 hash_id = SIG_RSA_RAW;
693 }
694 else
695 {
696 /*
697 * digitally-signed struct {
698 * opaque client_random[32];
699 * opaque server_random[32];
700 * ServerDHParams params;
701 * };
702 */
Paul Bakkerbf63b362012-04-12 20:44:34 +0000703 /* TODO TLS1.2 Get a supported hash algorithm from the
704 * signature_algorithms extension, Otherwise SHA1 + RSA!
705 */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000706
707 sha1_starts( &sha1 );
Paul Bakker48916f92012-09-16 19:57:18 +0000708 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
Paul Bakker1ef83d62012-04-11 12:09:53 +0000709 sha1_update( &sha1, ssl->out_msg + 4, n );
710 sha1_finish( &sha1, hash );
711
712 hashlen = 20;
713 hash_id = SIG_RSA_SHA1;
714 }
715
716 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000717
Paul Bakker43b7e352011-01-18 15:27:19 +0000718 if ( ssl->rsa_key )
719 rsa_key_len = ssl->rsa_key->len;
720#if defined(POLARSSL_PKCS11_C)
721 else
722 rsa_key_len = ssl->pkcs11_key->len;
723#endif /* defined(POLARSSL_PKCS11_C) */
Paul Bakker5121ce52009-01-03 21:22:43 +0000724
Paul Bakker1ef83d62012-04-11 12:09:53 +0000725 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
726 {
Paul Bakkerbf63b362012-04-12 20:44:34 +0000727 // TODO TLS1.2 Base on selection above (SHA1 + RSA is default choice)
Paul Bakker1ef83d62012-04-11 12:09:53 +0000728 ssl->out_msg[4 + n] = SSL_HASH_SHA1;
729 ssl->out_msg[5 + n] = SSL_SIG_RSA;
730
731 n += 2;
732 }
733
Paul Bakker43b7e352011-01-18 15:27:19 +0000734 ssl->out_msg[4 + n] = (unsigned char)( rsa_key_len >> 8 );
735 ssl->out_msg[5 + n] = (unsigned char)( rsa_key_len );
736
737 if ( ssl->rsa_key )
738 {
Paul Bakker9dcc3222011-03-08 14:16:06 +0000739 ret = rsa_pkcs1_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
740 RSA_PRIVATE,
Paul Bakker1ef83d62012-04-11 12:09:53 +0000741 hash_id, hashlen, hash, ssl->out_msg + 6 + n );
Paul Bakker43b7e352011-01-18 15:27:19 +0000742 }
743#if defined(POLARSSL_PKCS11_C)
744 else {
745 ret = pkcs11_sign( ssl->pkcs11_key, RSA_PRIVATE,
Paul Bakker1ef83d62012-04-11 12:09:53 +0000746 hash_id, hashlen, hash, ssl->out_msg + 6 + n );
Paul Bakker43b7e352011-01-18 15:27:19 +0000747 }
748#endif /* defined(POLARSSL_PKCS11_C) */
749
Paul Bakker5121ce52009-01-03 21:22:43 +0000750 if( ret != 0 )
751 {
Paul Bakker43b7e352011-01-18 15:27:19 +0000752 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000753 return( ret );
754 }
755
Paul Bakker43b7e352011-01-18 15:27:19 +0000756 SSL_DEBUG_BUF( 3, "my RSA sig", ssl->out_msg + 6 + n, rsa_key_len );
Paul Bakker5121ce52009-01-03 21:22:43 +0000757
Paul Bakker43b7e352011-01-18 15:27:19 +0000758 ssl->out_msglen = 6 + n + rsa_key_len;
Paul Bakker5121ce52009-01-03 21:22:43 +0000759 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
760 ssl->out_msg[0] = SSL_HS_SERVER_KEY_EXCHANGE;
761
762 ssl->state++;
763
764 if( ( ret = ssl_write_record( ssl ) ) != 0 )
765 {
766 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
767 return( ret );
768 }
769
770 SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) );
771
772 return( 0 );
773#endif
774}
775
776static int ssl_write_server_hello_done( ssl_context *ssl )
777{
778 int ret;
779
780 SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) );
781
782 ssl->out_msglen = 4;
783 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
784 ssl->out_msg[0] = SSL_HS_SERVER_HELLO_DONE;
785
786 ssl->state++;
787
788 if( ( ret = ssl_write_record( ssl ) ) != 0 )
789 {
790 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
791 return( ret );
792 }
793
794 SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) );
795
796 return( 0 );
797}
798
799static int ssl_parse_client_key_exchange( ssl_context *ssl )
800{
Paul Bakker23986e52011-04-24 08:57:21 +0000801 int ret;
802 size_t i, n = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000803
804 SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) );
805
806 if( ( ret = ssl_read_record( ssl ) ) != 0 )
807 {
808 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
809 return( ret );
810 }
811
812 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
813 {
814 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000815 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000816 }
817
818 if( ssl->in_msg[0] != SSL_HS_CLIENT_KEY_EXCHANGE )
819 {
820 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000821 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000822 }
823
Paul Bakker48916f92012-09-16 19:57:18 +0000824 if( ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_DES_SHA ||
825 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_DES_168_SHA ||
826 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_AES_128_SHA ||
827 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_AES_256_SHA ||
828 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_AES_128_SHA256 ||
829 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_AES_256_SHA256 ||
830 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA ||
831 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA ||
832 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA256 ||
833 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA256 ||
834 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_AES_128_GCM_SHA256 ||
835 ssl->session_negotiate->ciphersuite == SSL_EDH_RSA_AES_256_GCM_SHA384 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000836 {
Paul Bakker40e46942009-01-03 21:51:57 +0000837#if !defined(POLARSSL_DHM_C)
Paul Bakker5121ce52009-01-03 21:22:43 +0000838 SSL_DEBUG_MSG( 1, ( "support for dhm is not available" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000839 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000840#else
841 /*
842 * Receive G^Y mod P, premaster = (G^Y)^X mod P
843 */
844 n = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5];
845
Paul Bakker48916f92012-09-16 19:57:18 +0000846 if( n < 1 || n > ssl->handshake->dhm_ctx.len ||
Paul Bakker5121ce52009-01-03 21:22:43 +0000847 n + 6 != ssl->in_hslen )
848 {
849 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000850 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000851 }
852
Paul Bakker48916f92012-09-16 19:57:18 +0000853 if( ( ret = dhm_read_public( &ssl->handshake->dhm_ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +0000854 ssl->in_msg + 6, n ) ) != 0 )
855 {
856 SSL_DEBUG_RET( 1, "dhm_read_public", ret );
Paul Bakker9d781402011-05-09 16:17:09 +0000857 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_RP );
Paul Bakker5121ce52009-01-03 21:22:43 +0000858 }
859
Paul Bakker48916f92012-09-16 19:57:18 +0000860 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker5121ce52009-01-03 21:22:43 +0000861
Paul Bakker48916f92012-09-16 19:57:18 +0000862 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +0000863
Paul Bakker48916f92012-09-16 19:57:18 +0000864 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
865 ssl->handshake->premaster,
866 &ssl->handshake->pmslen ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000867 {
868 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
Paul Bakker9d781402011-05-09 16:17:09 +0000869 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_CS );
Paul Bakker5121ce52009-01-03 21:22:43 +0000870 }
871
Paul Bakker48916f92012-09-16 19:57:18 +0000872 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +0000873#endif
874 }
875 else
876 {
Paul Bakker43b7e352011-01-18 15:27:19 +0000877 if( ssl->rsa_key == NULL )
878 {
879#if defined(POLARSSL_PKCS11_C)
880 if( ssl->pkcs11_key == NULL )
881 {
882#endif
883 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
884 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
885#if defined(POLARSSL_PKCS11_C)
886 }
887#endif
888 }
889
Paul Bakker5121ce52009-01-03 21:22:43 +0000890 /*
891 * Decrypt the premaster using own private RSA key
892 */
893 i = 4;
Paul Bakker43b7e352011-01-18 15:27:19 +0000894 if( ssl->rsa_key )
895 n = ssl->rsa_key->len;
896#if defined(POLARSSL_PKCS11_C)
897 else
898 n = ssl->pkcs11_key->len;
899#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000900 ssl->handshake->pmslen = 48;
Paul Bakker5121ce52009-01-03 21:22:43 +0000901
902 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
903 {
904 i += 2;
905 if( ssl->in_msg[4] != ( ( n >> 8 ) & 0xFF ) ||
906 ssl->in_msg[5] != ( ( n ) & 0xFF ) )
907 {
908 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000909 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000910 }
911 }
912
913 if( ssl->in_hslen != i + n )
914 {
915 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000916 return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000917 }
918
Paul Bakker43b7e352011-01-18 15:27:19 +0000919 if( ssl->rsa_key ) {
Paul Bakker48916f92012-09-16 19:57:18 +0000920 ret = rsa_pkcs1_decrypt( ssl->rsa_key, RSA_PRIVATE,
921 &ssl->handshake->pmslen,
922 ssl->in_msg + i,
923 ssl->handshake->premaster,
924 sizeof(ssl->handshake->premaster) );
Paul Bakker43b7e352011-01-18 15:27:19 +0000925 }
926#if defined(POLARSSL_PKCS11_C)
927 else {
Paul Bakker48916f92012-09-16 19:57:18 +0000928 ret = pkcs11_decrypt( ssl->pkcs11_key, RSA_PRIVATE,
929 &ssl->handshake->pmslen,
930 ssl->in_msg + i,
931 ssl->handshake->premaster,
932 sizeof(ssl->handshake->premaster) );
Paul Bakker43b7e352011-01-18 15:27:19 +0000933 }
934#endif /* defined(POLARSSL_PKCS11_C) */
Paul Bakker5121ce52009-01-03 21:22:43 +0000935
Paul Bakker48916f92012-09-16 19:57:18 +0000936 if( ret != 0 || ssl->handshake->pmslen != 48 ||
937 ssl->handshake->premaster[0] != ssl->max_major_ver ||
938 ssl->handshake->premaster[1] != ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +0000939 {
940 SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
941
942 /*
943 * Protection against Bleichenbacher's attack:
944 * invalid PKCS#1 v1.5 padding must not cause
945 * the connection to end immediately; instead,
946 * send a bad_record_mac later in the handshake.
947 */
Paul Bakker48916f92012-09-16 19:57:18 +0000948 ssl->handshake->pmslen = 48;
Paul Bakker5121ce52009-01-03 21:22:43 +0000949
Paul Bakker48916f92012-09-16 19:57:18 +0000950 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster,
951 ssl->handshake->pmslen );
Paul Bakkera3d195c2011-11-27 21:07:34 +0000952 if( ret != 0 )
953 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000954 }
955 }
956
Paul Bakkerff60ee62010-03-16 21:09:09 +0000957 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
958 {
959 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
960 return( ret );
961 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000962
963 if( ssl->s_set != NULL )
964 ssl->s_set( ssl );
965
966 ssl->state++;
967
968 SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) );
969
970 return( 0 );
971}
972
973static int ssl_parse_certificate_verify( ssl_context *ssl )
974{
Paul Bakker23986e52011-04-24 08:57:21 +0000975 int ret;
976 size_t n1, n2;
Paul Bakker380da532012-04-18 16:10:25 +0000977 unsigned char hash[48];
Paul Bakker5121ce52009-01-03 21:22:43 +0000978
979 SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
980
Paul Bakker48916f92012-09-16 19:57:18 +0000981 if( ssl->session_negotiate->peer_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +0000982 {
983 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
984 ssl->state++;
985 return( 0 );
986 }
987
Paul Bakker48916f92012-09-16 19:57:18 +0000988 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +0000989
990 if( ( ret = ssl_read_record( ssl ) ) != 0 )
991 {
992 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
993 return( ret );
994 }
995
996 ssl->state++;
997
998 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
999 {
1000 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001001 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001002 }
1003
1004 if( ssl->in_msg[0] != SSL_HS_CERTIFICATE_VERIFY )
1005 {
1006 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001007 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001008 }
1009
Paul Bakker48916f92012-09-16 19:57:18 +00001010 n1 = ssl->session_negotiate->peer_cert->rsa.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001011 n2 = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5];
1012
1013 if( n1 + 6 != ssl->in_hslen || n1 != n2 )
1014 {
1015 SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001016 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
Paul Bakker5121ce52009-01-03 21:22:43 +00001017 }
1018
Paul Bakker48916f92012-09-16 19:57:18 +00001019 ret = rsa_pkcs1_verify( &ssl->session_negotiate->peer_cert->rsa, RSA_PUBLIC,
Paul Bakkerfc22c442009-07-19 20:36:27 +00001020 SIG_RSA_RAW, 36, hash, ssl->in_msg + 6 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001021 if( ret != 0 )
1022 {
1023 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
1024 return( ret );
1025 }
1026
1027 SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
1028
1029 return( 0 );
1030}
1031
1032/*
1033 * SSL handshake -- server side
1034 */
1035int ssl_handshake_server( ssl_context *ssl )
1036{
1037 int ret = 0;
1038
1039 SSL_DEBUG_MSG( 2, ( "=> handshake server" ) );
1040
1041 while( ssl->state != SSL_HANDSHAKE_OVER )
1042 {
1043 SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) );
1044
1045 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1046 break;
1047
1048 switch( ssl->state )
1049 {
1050 case SSL_HELLO_REQUEST:
1051 ssl->state = SSL_CLIENT_HELLO;
1052 break;
1053
1054 /*
1055 * <== ClientHello
1056 */
1057 case SSL_CLIENT_HELLO:
1058 ret = ssl_parse_client_hello( ssl );
1059 break;
1060
1061 /*
1062 * ==> ServerHello
1063 * Certificate
1064 * ( ServerKeyExchange )
1065 * ( CertificateRequest )
1066 * ServerHelloDone
1067 */
1068 case SSL_SERVER_HELLO:
1069 ret = ssl_write_server_hello( ssl );
1070 break;
1071
1072 case SSL_SERVER_CERTIFICATE:
1073 ret = ssl_write_certificate( ssl );
1074 break;
1075
1076 case SSL_SERVER_KEY_EXCHANGE:
1077 ret = ssl_write_server_key_exchange( ssl );
1078 break;
1079
1080 case SSL_CERTIFICATE_REQUEST:
1081 ret = ssl_write_certificate_request( ssl );
1082 break;
1083
1084 case SSL_SERVER_HELLO_DONE:
1085 ret = ssl_write_server_hello_done( ssl );
1086 break;
1087
1088 /*
1089 * <== ( Certificate/Alert )
1090 * ClientKeyExchange
1091 * ( CertificateVerify )
1092 * ChangeCipherSpec
1093 * Finished
1094 */
1095 case SSL_CLIENT_CERTIFICATE:
1096 ret = ssl_parse_certificate( ssl );
1097 break;
1098
1099 case SSL_CLIENT_KEY_EXCHANGE:
1100 ret = ssl_parse_client_key_exchange( ssl );
1101 break;
1102
1103 case SSL_CERTIFICATE_VERIFY:
1104 ret = ssl_parse_certificate_verify( ssl );
1105 break;
1106
1107 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
1108 ret = ssl_parse_change_cipher_spec( ssl );
1109 break;
1110
1111 case SSL_CLIENT_FINISHED:
1112 ret = ssl_parse_finished( ssl );
1113 break;
1114
1115 /*
1116 * ==> ChangeCipherSpec
1117 * Finished
1118 */
1119 case SSL_SERVER_CHANGE_CIPHER_SPEC:
1120 ret = ssl_write_change_cipher_spec( ssl );
1121 break;
1122
1123 case SSL_SERVER_FINISHED:
1124 ret = ssl_write_finished( ssl );
1125 break;
1126
1127 case SSL_FLUSH_BUFFERS:
1128 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
Paul Bakker48916f92012-09-16 19:57:18 +00001129 ssl->state = SSL_HANDSHAKE_WRAPUP;
1130 break;
1131
1132 case SSL_HANDSHAKE_WRAPUP:
1133 ssl_handshake_wrapup( ssl );
Paul Bakker5121ce52009-01-03 21:22:43 +00001134 break;
1135
1136 default:
1137 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001138 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00001139 }
1140
1141 if( ret != 0 )
1142 break;
1143 }
1144
1145 SSL_DEBUG_MSG( 2, ( "<= handshake server" ) );
1146
1147 return( ret );
1148}
1149
1150#endif