blob: f572cabccfc623bf9ab65cfaec5ab3dc3c32de7e [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 client-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_CLI_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
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020033#if defined(POLARSSL_MEMORY_C)
34#include "polarssl/memory.h"
35#else
36#define polarssl_malloc malloc
37#define polarssl_free free
38#endif
39
Paul Bakker5121ce52009-01-03 21:22:43 +000040#include <stdlib.h>
41#include <stdio.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020042
43#ifdef _MSC_VER
44#include <basetsd.h>
45typedef UINT32 uint32_t;
46#else
47#include <inttypes.h>
48#endif
49
50#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +000051#include <time.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020052#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000053
Paul Bakkerd3edc862013-03-20 16:07:17 +010054static void ssl_write_hostname_ext( ssl_context *ssl,
55 unsigned char *buf,
56 size_t *olen )
57{
58 unsigned char *p = buf;
59
60 *olen = 0;
61
62 if ( ssl->hostname == NULL )
63 return;
64
65 SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
66 ssl->hostname ) );
67
68 /*
69 * struct {
70 * NameType name_type;
71 * select (name_type) {
72 * case host_name: HostName;
73 * } name;
74 * } ServerName;
75 *
76 * enum {
77 * host_name(0), (255)
78 * } NameType;
79 *
80 * opaque HostName<1..2^16-1>;
81 *
82 * struct {
83 * ServerName server_name_list<1..2^16-1>
84 * } ServerNameList;
85 */
86 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
87 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME ) & 0xFF );
88
89 *p++ = (unsigned char)( ( (ssl->hostname_len + 5) >> 8 ) & 0xFF );
90 *p++ = (unsigned char)( ( (ssl->hostname_len + 5) ) & 0xFF );
91
92 *p++ = (unsigned char)( ( (ssl->hostname_len + 3) >> 8 ) & 0xFF );
93 *p++ = (unsigned char)( ( (ssl->hostname_len + 3) ) & 0xFF );
94
95 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
96 *p++ = (unsigned char)( ( ssl->hostname_len >> 8 ) & 0xFF );
97 *p++ = (unsigned char)( ( ssl->hostname_len ) & 0xFF );
98
99 memcpy( p, ssl->hostname, ssl->hostname_len );
100
101 *olen = ssl->hostname_len + 9;
102}
103
104static void ssl_write_renegotiation_ext( ssl_context *ssl,
105 unsigned char *buf,
106 size_t *olen )
107{
108 unsigned char *p = buf;
109
110 *olen = 0;
111
112 if( ssl->renegotiation != SSL_RENEGOTIATION )
113 return;
114
115 SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
116
117 /*
118 * Secure renegotiation
119 */
120 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
121 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
122
123 *p++ = 0x00;
124 *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
125 *p++ = ssl->verify_data_len & 0xFF;
126
127 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
128
129 *olen = 5 + ssl->verify_data_len;
130}
131
132static void ssl_write_signature_algorithms_ext( ssl_context *ssl,
133 unsigned char *buf,
134 size_t *olen )
135{
136 unsigned char *p = buf;
137 unsigned char sig_alg_list[20];
138 size_t sig_alg_len = 0;
139
140 *olen = 0;
141
142 if( ssl->max_minor_ver != SSL_MINOR_VERSION_3 )
143 return;
144
145 SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
146
147 /*
148 * Prepare signature_algorithms extension (TLS 1.2)
149 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200150#if defined(POLARSSL_SHA512_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100151 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA512;
152 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
153 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA384;
154 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
155#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200156#if defined(POLARSSL_SHA256_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100157 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA256;
158 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
159 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA224;
160 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
161#endif
162#if defined(POLARSSL_SHA1_C)
163 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA1;
164 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
165#endif
166#if defined(POLARSSL_MD5_C)
167 sig_alg_list[sig_alg_len++] = SSL_HASH_MD5;
168 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
169#endif
170
171 /*
172 * enum {
173 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
174 * sha512(6), (255)
175 * } HashAlgorithm;
176 *
177 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
178 * SignatureAlgorithm;
179 *
180 * struct {
181 * HashAlgorithm hash;
182 * SignatureAlgorithm signature;
183 * } SignatureAndHashAlgorithm;
184 *
185 * SignatureAndHashAlgorithm
186 * supported_signature_algorithms<2..2^16-2>;
187 */
188 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
189 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG ) & 0xFF );
190
191 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
192 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
193
194 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
195 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
196
197 memcpy( p, sig_alg_list, sig_alg_len );
198
199 *olen = 6 + sig_alg_len;
200}
201
202#if defined(POLARSSL_ECDH_C)
203static void ssl_write_supported_elliptic_curves_ext( ssl_context *ssl,
204 unsigned char *buf,
205 size_t *olen )
206{
207 unsigned char *p = buf;
208 unsigned char elliptic_curve_list[20];
209 size_t elliptic_curve_len = 0;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200210 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100211
212 *olen = 0;
213
214 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
215
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200216#if defined(POLARSSL_ECP_DP_SECP521R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100217 elliptic_curve_list[elliptic_curve_len++] = 0x00;
218 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP521R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200219#endif
220#if defined(POLARSSL_ECP_DP_SECP384R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100221 elliptic_curve_list[elliptic_curve_len++] = 0x00;
222 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP384R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200223#endif
224#if defined(POLARSSL_ECP_DP_SECP256R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100225 elliptic_curve_list[elliptic_curve_len++] = 0x00;
226 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP256R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200227#endif
228#if defined(POLARSSL_ECP_DP_SECP224R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100229 elliptic_curve_list[elliptic_curve_len++] = 0x00;
230 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP224R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200231#endif
232#if defined(POLARSSL_ECP_DP_SECP192R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100233 elliptic_curve_list[elliptic_curve_len++] = 0x00;
234 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP192R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200235#endif
236
237 if( elliptic_curve_len == 0 )
238 return;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100239
240 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
241 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
242
243 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
244 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
245
246 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
247 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
248
249 memcpy( p, elliptic_curve_list, elliptic_curve_len );
250
251 *olen = 6 + elliptic_curve_len;
252}
253
254static void ssl_write_supported_point_formats_ext( ssl_context *ssl,
255 unsigned char *buf,
256 size_t *olen )
257{
258 unsigned char *p = buf;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200259 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100260
261 *olen = 0;
262
263 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
264
265 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
266 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
267
268 *p++ = 0x00;
269 *p++ = 3;
270
271 *p++ = 2;
272 *p++ = POLARSSL_ECP_PF_COMPRESSED;
273 *p++ = POLARSSL_ECP_PF_UNCOMPRESSED;
274
275 *olen = 7;
276}
277#endif
278
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200279static void ssl_write_max_fragment_length_ext( ssl_context *ssl,
280 unsigned char *buf,
281 size_t *olen )
282{
283 unsigned char *p = buf;
284
285 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ) {
286 *olen = 0;
287 return;
288 }
289
290 SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
291
292 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
293 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
294
295 *p++ = 0x00;
296 *p++ = 1;
297
298 *p++ = ssl->mfl_code;
299
300 *olen = 5;
301}
302
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200303static void ssl_write_truncated_hmac_ext( ssl_context *ssl,
304 unsigned char *buf, size_t *olen )
305{
306 unsigned char *p = buf;
307
308 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED )
309 {
310 *olen = 0;
311 return;
312 }
313
314 SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
315
316 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
317 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
318
319 *p++ = 0x00;
320 *p++ = 0x00;
321
322 *olen = 4;
323}
324
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200325static void ssl_write_session_ticket_ext( ssl_context *ssl,
326 unsigned char *buf, size_t *olen )
327{
328 unsigned char *p = buf;
329 size_t tlen = ssl->session_negotiate->ticket_len;
330
331 SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
332
333 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
334 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET ) & 0xFF );
335
336 *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
337 *p++ = (unsigned char)( ( tlen ) & 0xFF );
338
339 *olen = 4;
340
341 if( ssl->session_negotiate->ticket == NULL ||
342 ssl->session_negotiate->ticket_len == 0 )
343 {
344 return;
345 }
346
347 SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
348
349 memcpy( p, ssl->session_negotiate->ticket, tlen );
350
351 *olen += tlen;
352}
353
Paul Bakker5121ce52009-01-03 21:22:43 +0000354static int ssl_write_client_hello( ssl_context *ssl )
355{
Paul Bakker23986e52011-04-24 08:57:21 +0000356 int ret;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100357 size_t i, n, olen, ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000358 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200359 unsigned char *p, *q;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200360#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000361 time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200362#endif
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200363 const int *ciphersuites;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200364 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000365
366 SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
367
Paul Bakker48916f92012-09-16 19:57:18 +0000368 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
369 {
Paul Bakker993d11d2012-09-28 15:00:12 +0000370 ssl->major_ver = ssl->min_major_ver;
371 ssl->minor_ver = ssl->min_minor_ver;
Paul Bakker48916f92012-09-16 19:57:18 +0000372 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000373
Paul Bakker490ecc82011-10-06 13:04:09 +0000374 if( ssl->max_major_ver == 0 && ssl->max_minor_ver == 0 )
375 {
376 ssl->max_major_ver = SSL_MAJOR_VERSION_3;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000377 ssl->max_minor_ver = SSL_MINOR_VERSION_3;
Paul Bakker490ecc82011-10-06 13:04:09 +0000378 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000379
380 /*
381 * 0 . 0 handshake type
382 * 1 . 3 handshake length
383 * 4 . 5 highest version supported
384 * 6 . 9 current UNIX time
385 * 10 . 37 random bytes
386 */
387 buf = ssl->out_msg;
388 p = buf + 4;
389
390 *p++ = (unsigned char) ssl->max_major_ver;
391 *p++ = (unsigned char) ssl->max_minor_ver;
392
393 SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
394 buf[4], buf[5] ) );
395
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200396#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000397 t = time( NULL );
398 *p++ = (unsigned char)( t >> 24 );
399 *p++ = (unsigned char)( t >> 16 );
400 *p++ = (unsigned char)( t >> 8 );
401 *p++ = (unsigned char)( t );
402
403 SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200404#else
405 if( ( ret = ssl->f_rng( ssl->p_rng, p, 4 ) ) != 0 )
406 return( ret );
407
408 p += 4;
409#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000410
Paul Bakkera3d195c2011-11-27 21:07:34 +0000411 if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
412 return( ret );
413
414 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +0000415
Paul Bakker48916f92012-09-16 19:57:18 +0000416 memcpy( ssl->handshake->randbytes, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000417
418 SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 6, 32 );
419
420 /*
421 * 38 . 38 session id length
422 * 39 . 39+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000423 * 40+n . 41+n ciphersuitelist length
424 * 42+n . .. ciphersuitelist
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000425 * .. . .. compression methods length
426 * .. . .. compression methods
427 * .. . .. extensions length
428 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +0000429 */
Paul Bakker48916f92012-09-16 19:57:18 +0000430 n = ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +0000431
Paul Bakker0a597072012-09-25 21:55:46 +0000432 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE || n < 16 || n > 32 ||
433 ssl->handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000434 n = 0;
435
436 *p++ = (unsigned char) n;
437
438 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000439 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000440
441 SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
442 SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
443
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200444 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
Paul Bakker2fbefde2013-06-29 16:01:15 +0200445 n = 0;
446 q = p;
447
448 // Skip writing ciphersuite length for now
449 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000450
Paul Bakker48916f92012-09-16 19:57:18 +0000451 /*
452 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
453 */
454 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
455 {
456 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
457 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO );
Paul Bakker2fbefde2013-06-29 16:01:15 +0200458 n++;
Paul Bakker48916f92012-09-16 19:57:18 +0000459 }
460
Paul Bakker2fbefde2013-06-29 16:01:15 +0200461 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000462 {
Paul Bakker2fbefde2013-06-29 16:01:15 +0200463 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
464
465 if( ciphersuite_info == NULL )
466 continue;
467
468 if( ciphersuite_info->min_minor_ver > ssl->max_minor_ver ||
469 ciphersuite_info->max_minor_ver < ssl->min_minor_ver )
470 continue;
471
Paul Bakkere3166ce2011-01-27 17:40:50 +0000472 SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %2d",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200473 ciphersuites[i] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000474
Paul Bakker2fbefde2013-06-29 16:01:15 +0200475 n++;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200476 *p++ = (unsigned char)( ciphersuites[i] >> 8 );
477 *p++ = (unsigned char)( ciphersuites[i] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000478 }
479
Paul Bakker2fbefde2013-06-29 16:01:15 +0200480 *q++ = (unsigned char)( n >> 7 );
481 *q++ = (unsigned char)( n << 1 );
482
483 SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
484
485
Paul Bakker2770fbd2012-07-03 13:30:23 +0000486#if defined(POLARSSL_ZLIB_SUPPORT)
487 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
488 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000489 SSL_COMPRESS_DEFLATE, SSL_COMPRESS_NULL ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000490
491 *p++ = 2;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000492 *p++ = SSL_COMPRESS_DEFLATE;
Paul Bakker48916f92012-09-16 19:57:18 +0000493 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000494#else
Paul Bakker5121ce52009-01-03 21:22:43 +0000495 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000496 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", SSL_COMPRESS_NULL ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000497
498 *p++ = 1;
499 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000500#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000501
Paul Bakkerd3edc862013-03-20 16:07:17 +0100502 // First write extensions, then the total length
503 //
504 ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
505 ext_len += olen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000506
Paul Bakkerd3edc862013-03-20 16:07:17 +0100507 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
508 ext_len += olen;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000509
Paul Bakkerd3edc862013-03-20 16:07:17 +0100510 ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
511 ext_len += olen;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000512
Paul Bakker41c83d32013-03-20 14:39:14 +0100513#if defined(POLARSSL_ECDH_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100514 ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
515 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100516
Paul Bakkerd3edc862013-03-20 16:07:17 +0100517 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
518 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100519#endif
520
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200521 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
522 ext_len += olen;
523
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200524 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
525 ext_len += olen;
526
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200527 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
528 ext_len += olen;
529
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000530 SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
531 ext_len ) );
532
533 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
534 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100535 p += ext_len;
Paul Bakker41c83d32013-03-20 14:39:14 +0100536
Paul Bakker5121ce52009-01-03 21:22:43 +0000537 ssl->out_msglen = p - buf;
538 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
539 ssl->out_msg[0] = SSL_HS_CLIENT_HELLO;
540
541 ssl->state++;
542
543 if( ( ret = ssl_write_record( ssl ) ) != 0 )
544 {
545 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
546 return( ret );
547 }
548
549 SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
550
551 return( 0 );
552}
553
Paul Bakker48916f92012-09-16 19:57:18 +0000554static int ssl_parse_renegotiation_info( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200555 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +0000556 size_t len )
557{
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000558 int ret;
559
Paul Bakker48916f92012-09-16 19:57:18 +0000560 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
561 {
562 if( len != 1 || buf[0] != 0x0 )
563 {
564 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000565
566 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
567 return( ret );
568
Paul Bakker48916f92012-09-16 19:57:18 +0000569 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
570 }
571
572 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
573 }
574 else
575 {
576 if( len != 1 + ssl->verify_data_len * 2 ||
577 buf[0] != ssl->verify_data_len * 2 ||
578 memcmp( buf + 1, ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
579 memcmp( buf + 1 + ssl->verify_data_len,
580 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
581 {
582 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000583
584 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
585 return( ret );
586
Paul Bakker48916f92012-09-16 19:57:18 +0000587 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
588 }
589 }
590
591 return( 0 );
592}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200593
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200594static int ssl_parse_max_fragment_length_ext( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200595 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200596 size_t len )
597{
598 /*
599 * server should use the extension only if we did,
600 * and if so the server's value should match ours (and len is always 1)
601 */
602 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ||
603 len != 1 ||
604 buf[0] != ssl->mfl_code )
605 {
606 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
607 }
608
609 return( 0 );
610}
Paul Bakker48916f92012-09-16 19:57:18 +0000611
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200612static int ssl_parse_truncated_hmac_ext( ssl_context *ssl,
613 const unsigned char *buf,
614 size_t len )
615{
616 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED ||
617 len != 0 )
618 {
619 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
620 }
621
622 ((void) buf);
623
624 ssl->session_negotiate->trunc_hmac = SSL_TRUNC_HMAC_ENABLED;
625
626 return( 0 );
627}
628
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200629static int ssl_parse_session_ticket_ext( ssl_context *ssl,
630 const unsigned char *buf,
631 size_t len )
632{
633 if( len != 0 )
634 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
635
636 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +0200637
638 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200639
640 return( 0 );
641}
642
Paul Bakker5121ce52009-01-03 21:22:43 +0000643static int ssl_parse_server_hello( ssl_context *ssl )
644{
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200645 uint32_t t;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000646 int ret, i, comp;
Paul Bakker23986e52011-04-24 08:57:21 +0000647 size_t n;
Paul Bakker48916f92012-09-16 19:57:18 +0000648 size_t ext_len = 0;
649 unsigned char *buf, *ext;
650 int renegotiation_info_seen = 0;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000651 int handshake_failure = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000652
653 SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
654
655 /*
656 * 0 . 0 handshake type
657 * 1 . 3 handshake length
658 * 4 . 5 protocol version
659 * 6 . 9 UNIX time()
660 * 10 . 37 random bytes
661 */
662 buf = ssl->in_msg;
663
664 if( ( ret = ssl_read_record( ssl ) ) != 0 )
665 {
666 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
667 return( ret );
668 }
669
670 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
671 {
672 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000673 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000674 }
675
676 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
677 buf[4], buf[5] ) );
678
679 if( ssl->in_hslen < 42 ||
680 buf[0] != SSL_HS_SERVER_HELLO ||
681 buf[4] != SSL_MAJOR_VERSION_3 )
682 {
683 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000684 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000685 }
686
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000687 if( buf[5] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +0000688 {
689 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000690 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000691 }
692
693 ssl->minor_ver = buf[5];
694
Paul Bakker1d29fb52012-09-28 13:28:45 +0000695 if( ssl->minor_ver < ssl->min_minor_ver )
696 {
697 SSL_DEBUG_MSG( 1, ( "server only supports ssl smaller than minimum"
698 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
699 buf[4], buf[5] ) );
700
701 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
702 SSL_ALERT_MSG_PROTOCOL_VERSION );
703
704 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
705 }
706
Paul Bakker1504af52012-02-11 16:17:43 +0000707#if defined(POLARSSL_DEBUG_C)
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200708 t = ( (uint32_t) buf[6] << 24 )
709 | ( (uint32_t) buf[7] << 16 )
710 | ( (uint32_t) buf[8] << 8 )
711 | ( (uint32_t) buf[9] );
Paul Bakker87e5cda2012-01-14 18:14:15 +0000712#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000713
Paul Bakker48916f92012-09-16 19:57:18 +0000714 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000715
716 n = buf[38];
717
718 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
719 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
720
Paul Bakker48916f92012-09-16 19:57:18 +0000721 if( n > 32 )
722 {
723 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
724 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
725 }
726
Paul Bakker5121ce52009-01-03 21:22:43 +0000727 /*
728 * 38 . 38 session id length
729 * 39 . 38+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000730 * 39+n . 40+n chosen ciphersuite
Paul Bakker5121ce52009-01-03 21:22:43 +0000731 * 41+n . 41+n chosen compression alg.
732 * 42+n . 43+n extensions length
733 * 44+n . 44+n+m extensions
734 */
Paul Bakker48916f92012-09-16 19:57:18 +0000735 if( ssl->in_hslen > 42 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000736 {
737 ext_len = ( ( buf[42 + n] << 8 )
Paul Bakker48916f92012-09-16 19:57:18 +0000738 | ( buf[43 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000739
Paul Bakker48916f92012-09-16 19:57:18 +0000740 if( ( ext_len > 0 && ext_len < 4 ) ||
741 ssl->in_hslen != 44 + n + ext_len )
742 {
743 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
744 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
745 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000746 }
747
748 i = ( buf[39 + n] << 8 ) | buf[40 + n];
Paul Bakker2770fbd2012-07-03 13:30:23 +0000749 comp = buf[41 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +0000750
Paul Bakker380da532012-04-18 16:10:25 +0000751 /*
752 * Initialize update checksum functions
753 */
Paul Bakker68884e32013-01-07 18:20:04 +0100754 ssl->transform_negotiate->ciphersuite_info = ssl_ciphersuite_from_id( i );
Paul Bakker41c83d32013-03-20 14:39:14 +0100755 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
Paul Bakker68884e32013-01-07 18:20:04 +0100756
757 if( ssl->transform_negotiate->ciphersuite_info == NULL )
758 {
759 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200760 ssl->ciphersuite_list[ssl->minor_ver][i] ) );
Paul Bakker68884e32013-01-07 18:20:04 +0100761 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
762 }
Paul Bakker380da532012-04-18 16:10:25 +0000763
Paul Bakker5121ce52009-01-03 21:22:43 +0000764 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
765 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
766
767 /*
768 * Check if the session can be resumed
769 */
Paul Bakker0a597072012-09-25 21:55:46 +0000770 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE ||
771 ssl->handshake->resume == 0 || n == 0 ||
Paul Bakker48916f92012-09-16 19:57:18 +0000772 ssl->session_negotiate->ciphersuite != i ||
773 ssl->session_negotiate->compression != comp ||
774 ssl->session_negotiate->length != n ||
775 memcmp( ssl->session_negotiate->id, buf + 39, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000776 {
777 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +0000778 ssl->handshake->resume = 0;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200779#if defined(POLARSSL_HAVE_TIME)
Paul Bakker48916f92012-09-16 19:57:18 +0000780 ssl->session_negotiate->start = time( NULL );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200781#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000782 ssl->session_negotiate->ciphersuite = i;
783 ssl->session_negotiate->compression = comp;
784 ssl->session_negotiate->length = n;
785 memcpy( ssl->session_negotiate->id, buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000786 }
787 else
788 {
789 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +0000790
791 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
792 {
793 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
794 return( ret );
795 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000796 }
797
798 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +0000799 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000800
Paul Bakkere3166ce2011-01-27 17:40:50 +0000801 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", i ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000802 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[41 + n] ) );
803
804 i = 0;
805 while( 1 )
806 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200807 if( ssl->ciphersuite_list[ssl->minor_ver][i] == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000808 {
809 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000810 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000811 }
812
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200813 if( ssl->ciphersuite_list[ssl->minor_ver][i++] ==
814 ssl->session_negotiate->ciphersuite )
815 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000816 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200817 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000818 }
819
Paul Bakker2770fbd2012-07-03 13:30:23 +0000820 if( comp != SSL_COMPRESS_NULL
821#if defined(POLARSSL_ZLIB_SUPPORT)
822 && comp != SSL_COMPRESS_DEFLATE
823#endif
824 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000825 {
826 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000827 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000828 }
Paul Bakker48916f92012-09-16 19:57:18 +0000829 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +0000830
Paul Bakker48916f92012-09-16 19:57:18 +0000831 ext = buf + 44 + n;
832
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200833 SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) );
834
Paul Bakker48916f92012-09-16 19:57:18 +0000835 while( ext_len )
836 {
837 unsigned int ext_id = ( ( ext[0] << 8 )
838 | ( ext[1] ) );
839 unsigned int ext_size = ( ( ext[2] << 8 )
840 | ( ext[3] ) );
841
842 if( ext_size + 4 > ext_len )
843 {
844 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
845 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
846 }
847
848 switch( ext_id )
849 {
850 case TLS_EXT_RENEGOTIATION_INFO:
851 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
852 renegotiation_info_seen = 1;
853
854 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ) ) != 0 )
855 return( ret );
856
857 break;
858
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200859 case TLS_EXT_MAX_FRAGMENT_LENGTH:
860 SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
861
862 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
863 ext + 4, ext_size ) ) != 0 )
864 {
865 return( ret );
866 }
867
868 break;
869
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200870 case TLS_EXT_TRUNCATED_HMAC:
871 SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
872
873 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
874 ext + 4, ext_size ) ) != 0 )
875 {
876 return( ret );
877 }
878
879 break;
880
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200881 case TLS_EXT_SESSION_TICKET:
882 SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
883
884 if( ( ret = ssl_parse_session_ticket_ext( ssl,
885 ext + 4, ext_size ) ) != 0 )
886 {
887 return( ret );
888 }
889
890 break;
891
Paul Bakker48916f92012-09-16 19:57:18 +0000892 default:
893 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
894 ext_id ) );
895 }
896
897 ext_len -= 4 + ext_size;
898 ext += 4 + ext_size;
899
900 if( ext_len > 0 && ext_len < 4 )
901 {
902 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
903 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
904 }
905 }
906
907 /*
908 * Renegotiation security checks
909 */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000910 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
911 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +0000912 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000913 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
914 handshake_failure = 1;
Paul Bakkerf7abd422013-04-16 13:15:56 +0200915 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000916 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
917 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
918 renegotiation_info_seen == 0 )
919 {
920 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
921 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +0000922 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000923 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
924 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
925 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +0000926 {
927 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000928 handshake_failure = 1;
929 }
930 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
931 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
932 renegotiation_info_seen == 1 )
933 {
934 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
935 handshake_failure = 1;
936 }
937
938 if( handshake_failure == 1 )
939 {
940 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
941 return( ret );
942
Paul Bakker48916f92012-09-16 19:57:18 +0000943 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
944 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000945
946 SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
947
948 return( 0 );
949}
950
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200951#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +0200952static int ssl_parse_server_dh_params( ssl_context *ssl, unsigned char **p,
953 unsigned char *end )
954{
955 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
956
Paul Bakker29e1f122013-04-16 13:07:56 +0200957 /*
958 * Ephemeral DH parameters:
959 *
960 * struct {
961 * opaque dh_p<1..2^16-1>;
962 * opaque dh_g<1..2^16-1>;
963 * opaque dh_Ys<1..2^16-1>;
964 * } ServerDHParams;
965 */
966 if( ( ret = dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
967 {
968 SSL_DEBUG_RET( 2, ( "dhm_read_params" ), ret );
969 return( ret );
970 }
971
972 if( ssl->handshake->dhm_ctx.len < 64 ||
973 ssl->handshake->dhm_ctx.len > 512 )
974 {
975 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (DHM length)" ) );
976 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
977 }
978
979 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
980 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
981 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +0200982
983 return( ret );
984}
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200985#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +0200986
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200987#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +0200988static int ssl_parse_server_ecdh_params( ssl_context *ssl,
989 unsigned char **p,
990 unsigned char *end )
991{
992 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
993
Paul Bakker29e1f122013-04-16 13:07:56 +0200994 /*
995 * Ephemeral ECDH parameters:
996 *
997 * struct {
998 * ECParameters curve_params;
999 * ECPoint public;
1000 * } ServerECDHParams;
1001 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001002 if( ( ret = ecdh_read_params( &ssl->handshake->ecdh_ctx,
1003 (const unsigned char **) p, end ) ) != 0 )
1004 {
1005 SSL_DEBUG_RET( 2, ( "ecdh_read_params" ), ret );
1006 return( ret );
1007 }
1008
1009 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
1010 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
1011 {
1012 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDH length)" ) );
1013 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1014 }
1015
1016 SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
Paul Bakker29e1f122013-04-16 13:07:56 +02001017
1018 return( ret );
1019}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001020#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001021
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001022#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
1023 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001024static int ssl_parse_server_psk_hint( ssl_context *ssl,
1025 unsigned char **p,
1026 unsigned char *end )
1027{
1028 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001029 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001030 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001031
1032 /*
1033 * PSK parameters:
1034 *
1035 * opaque psk_identity_hint<0..2^16-1>;
1036 */
1037 len = (*p)[1] << 8 | (*p)[0];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001038 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001039
1040 if( (*p) + len > end )
1041 {
1042 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
1043 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1044 }
1045
1046 // TODO: Retrieve PSK identity hint and callback to app
1047 //
1048 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001049 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001050
1051 return( ret );
1052}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001053#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
1054 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001055
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001056#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1057 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001058static int ssl_parse_signature_algorithm( ssl_context *ssl,
1059 unsigned char **p,
1060 unsigned char *end,
1061 md_type_t *md_alg )
1062{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001063 ((void) ssl);
Paul Bakker29e1f122013-04-16 13:07:56 +02001064 *md_alg = POLARSSL_MD_NONE;
1065
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001066 if( (*p) + 2 > end )
Paul Bakker29e1f122013-04-16 13:07:56 +02001067 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1068
1069 if( (*p)[1] != SSL_SIG_RSA )
1070 {
1071 SSL_DEBUG_MSG( 2, ( "server used unsupported SignatureAlgorithm %d", (*p)[1] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001072 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1073 }
1074
1075 switch( (*p)[0] )
1076 {
1077#if defined(POLARSSL_MD5_C)
1078 case SSL_HASH_MD5:
1079 *md_alg = POLARSSL_MD_MD5;
1080 break;
1081#endif
1082#if defined(POLARSSL_SHA1_C)
1083 case SSL_HASH_SHA1:
1084 *md_alg = POLARSSL_MD_SHA1;
1085 break;
1086#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001087#if defined(POLARSSL_SHA256_C)
Paul Bakker29e1f122013-04-16 13:07:56 +02001088 case SSL_HASH_SHA224:
1089 *md_alg = POLARSSL_MD_SHA224;
1090 break;
1091 case SSL_HASH_SHA256:
1092 *md_alg = POLARSSL_MD_SHA256;
1093 break;
1094#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001095#if defined(POLARSSL_SHA512_C)
Paul Bakker29e1f122013-04-16 13:07:56 +02001096 case SSL_HASH_SHA384:
1097 *md_alg = POLARSSL_MD_SHA384;
1098 break;
1099 case SSL_HASH_SHA512:
1100 *md_alg = POLARSSL_MD_SHA512;
1101 break;
1102#endif
1103 default:
1104 SSL_DEBUG_MSG( 2, ( "Server used unsupported HashAlgorithm %d", *(p)[0] ) );
1105 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1106 }
1107
1108 SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
1109 SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
1110 *p += 2;
1111
1112 return( 0 );
1113}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001114#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1115 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001116
Paul Bakker41c83d32013-03-20 14:39:14 +01001117static int ssl_parse_server_key_exchange( ssl_context *ssl )
1118{
Paul Bakker23986e52011-04-24 08:57:21 +00001119 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001120 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001121 unsigned char *p, *end;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001122#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1123 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001124 size_t n;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001125 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +02001126 md_type_t md_alg = POLARSSL_MD_NONE;
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001127 unsigned int hashlen = 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001128#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001129
1130 SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
1131
Paul Bakker41c83d32013-03-20 14:39:14 +01001132 if( ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_RSA &&
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001133 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_ECDHE_RSA &&
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001134 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_PSK &&
1135 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00001136 {
1137 SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
1138 ssl->state++;
1139 return( 0 );
1140 }
1141
Paul Bakker5121ce52009-01-03 21:22:43 +00001142 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1143 {
1144 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1145 return( ret );
1146 }
1147
1148 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1149 {
1150 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001151 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001152 }
1153
1154 if( ssl->in_msg[0] != SSL_HS_SERVER_KEY_EXCHANGE )
1155 {
Paul Bakker188c8de2013-04-19 09:13:37 +02001156 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1157 {
1158 ssl->record_read = 1;
1159 goto exit;
1160 }
1161
1162 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1163 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001164 }
1165
Paul Bakker1ef83d62012-04-11 12:09:53 +00001166 SSL_DEBUG_BUF( 3, "server key exchange", ssl->in_msg + 4, ssl->in_hslen - 4 );
1167
Paul Bakker3b6a07b2013-03-21 11:56:50 +01001168 p = ssl->in_msg + 4;
1169 end = ssl->in_msg + ssl->in_hslen;
1170
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001171#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001172 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001173 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001174 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001175 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001176 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1177 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1178 }
1179 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001180 else
1181#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1182#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
1183 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001184 {
1185 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
1186 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001187 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1188 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1189 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001190 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001191 else
1192#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
1193#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1194 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakker41c83d32013-03-20 14:39:14 +01001195 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001196 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001197 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001198 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1199 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1200 }
1201 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001202 else
1203#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
1204#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1205 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1206 {
1207 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
1208 {
1209 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1210 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1211 }
1212 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
1213 {
1214 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1215 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1216 }
1217 }
1218 else
1219#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1220 {
1221 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1222 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001223
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001224#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1225 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001226 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1227 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001228 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001229 /*
1230 * Handle the digitally-signed structure
1231 */
1232 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001233 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001234 if( ssl_parse_signature_algorithm( ssl, &p, end, &md_alg ) != 0 )
1235 {
Paul Bakker1ef83d62012-04-11 12:09:53 +00001236 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001237 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1238 }
1239 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001240
Paul Bakker29e1f122013-04-16 13:07:56 +02001241 n = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00001242 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001243
Paul Bakker29e1f122013-04-16 13:07:56 +02001244 if( end != p + n )
Paul Bakker41c83d32013-03-20 14:39:14 +01001245 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001246 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001247 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1248 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001249
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001250 /* EC NOT IMPLEMENTED YET */
1251 if( ssl->session_negotiate->peer_cert->pk.type != POLARSSL_PK_RSA )
1252 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1253
Paul Bakker29e1f122013-04-16 13:07:56 +02001254 if( (unsigned int)( end - p ) !=
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001255 pk_rsa( ssl->session_negotiate->peer_cert->pk )->len )
Paul Bakker41c83d32013-03-20 14:39:14 +01001256 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001257 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001258 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1259 }
1260
Paul Bakker29e1f122013-04-16 13:07:56 +02001261 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001262 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001263 md5_context md5;
1264 sha1_context sha1;
1265
1266 /*
1267 * digitally-signed struct {
1268 * opaque md5_hash[16];
1269 * opaque sha_hash[20];
1270 * };
1271 *
1272 * md5_hash
1273 * MD5(ClientHello.random + ServerHello.random
1274 * + ServerParams);
1275 * sha_hash
1276 * SHA(ClientHello.random + ServerHello.random
1277 * + ServerParams);
1278 */
1279 n = ssl->in_hslen - ( end - p ) - 6;
1280
1281 md5_starts( &md5 );
1282 md5_update( &md5, ssl->handshake->randbytes, 64 );
1283 md5_update( &md5, ssl->in_msg + 4, n );
1284 md5_finish( &md5, hash );
1285
1286 sha1_starts( &sha1 );
1287 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
1288 sha1_update( &sha1, ssl->in_msg + 4, n );
1289 sha1_finish( &sha1, hash + 16 );
1290
1291 md_alg = POLARSSL_MD_NONE;
1292 hashlen = 36;
1293 }
1294 else
1295 {
1296 md_context_t ctx;
1297
1298 n = ssl->in_hslen - ( end - p ) - 8;
1299
1300 /*
1301 * digitally-signed struct {
1302 * opaque client_random[32];
1303 * opaque server_random[32];
1304 * ServerDHParams params;
1305 * };
1306 */
1307 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1308 {
1309 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1310 return( ret );
1311 }
1312
1313 md_starts( &ctx );
1314 md_update( &ctx, ssl->handshake->randbytes, 64 );
1315 md_update( &ctx, ssl->in_msg + 4, n );
1316 md_finish( &ctx, hash );
1317 }
1318
1319 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
1320
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001321 if( ( ret = rsa_pkcs1_verify(
1322 pk_rsa( ssl->session_negotiate->peer_cert->pk ),
1323 RSA_PUBLIC, md_alg, hashlen, hash, p ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02001324 {
1325 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001326 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001327 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001328 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001329#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1330 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001331
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001332exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001333 ssl->state++;
1334
1335 SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
1336
1337 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001338}
1339
1340static int ssl_parse_certificate_request( ssl_context *ssl )
1341{
1342 int ret;
Paul Bakker926af752012-11-23 13:38:07 +01001343 unsigned char *buf, *p;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001344 size_t n = 0, m = 0;
Paul Bakker926af752012-11-23 13:38:07 +01001345 size_t cert_type_len = 0, sig_alg_len = 0, dn_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001346
1347 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
1348
1349 /*
1350 * 0 . 0 handshake type
1351 * 1 . 3 handshake length
Paul Bakker926af752012-11-23 13:38:07 +01001352 * 4 . 4 cert type count
1353 * 5 .. m-1 cert types
1354 * m .. m+1 sig alg length (TLS 1.2 only)
1355 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001356 * n .. n+1 length of all DNs
1357 * n+2 .. n+3 length of DN 1
1358 * n+4 .. ... Distinguished Name #1
1359 * ... .. ... length of DN 2, etc.
1360 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001361 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001362 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001363 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1364 {
1365 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1366 return( ret );
1367 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001368
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001369 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1370 {
1371 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1372 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1373 }
1374
1375 ssl->record_read = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001376 }
1377
1378 ssl->client_auth = 0;
1379 ssl->state++;
1380
1381 if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST )
1382 ssl->client_auth++;
1383
1384 SSL_DEBUG_MSG( 3, ( "got %s certificate request",
1385 ssl->client_auth ? "a" : "no" ) );
1386
Paul Bakker926af752012-11-23 13:38:07 +01001387 if( ssl->client_auth == 0 )
1388 goto exit;
1389
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001390 ssl->record_read = 0;
1391
Paul Bakker926af752012-11-23 13:38:07 +01001392 // TODO: handshake_failure alert for an anonymous server to request
1393 // client authentication
1394
1395 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001396
Paul Bakker926af752012-11-23 13:38:07 +01001397 // Retrieve cert types
1398 //
1399 cert_type_len = buf[4];
1400 n = cert_type_len;
1401
1402 if( ssl->in_hslen < 6 + n )
1403 {
1404 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1405 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1406 }
1407
Paul Bakker73d44312013-05-22 13:56:26 +02001408 p = buf + 5;
Paul Bakker926af752012-11-23 13:38:07 +01001409 while( cert_type_len > 0 )
1410 {
1411 if( *p == SSL_CERT_TYPE_RSA_SIGN )
1412 {
1413 ssl->handshake->cert_type = SSL_CERT_TYPE_RSA_SIGN;
1414 break;
1415 }
1416
1417 cert_type_len--;
1418 p++;
1419 }
1420
1421 if( ssl->handshake->cert_type == 0 )
1422 {
1423 SSL_DEBUG_MSG( 1, ( "no known cert_type provided" ) );
1424 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1425 }
1426
1427 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
1428 {
1429 sig_alg_len = ( ( buf[5 + n] << 8 )
1430 | ( buf[6 + n] ) );
1431
1432 p = buf + 7 + n;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001433 m += 2;
Paul Bakker926af752012-11-23 13:38:07 +01001434 n += sig_alg_len;
1435
1436 if( ssl->in_hslen < 6 + n )
1437 {
1438 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1439 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1440 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001441 }
Paul Bakker926af752012-11-23 13:38:07 +01001442
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001443 dn_len = ( ( buf[5 + m + n] << 8 )
1444 | ( buf[6 + m + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01001445
1446 n += dn_len;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001447 if( ssl->in_hslen != 7 + m + n )
Paul Bakker926af752012-11-23 13:38:07 +01001448 {
1449 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1450 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1451 }
1452
1453exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001454 SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
1455
1456 return( 0 );
1457}
1458
1459static int ssl_parse_server_hello_done( ssl_context *ssl )
1460{
1461 int ret;
1462
1463 SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
1464
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001465 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001466 {
1467 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1468 {
1469 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1470 return( ret );
1471 }
1472
1473 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1474 {
1475 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001476 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001477 }
1478 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001479 ssl->record_read = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001480
1481 if( ssl->in_hslen != 4 ||
1482 ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE )
1483 {
1484 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001485 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001486 }
1487
1488 ssl->state++;
1489
1490 SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
1491
1492 return( 0 );
1493}
1494
1495static int ssl_write_client_key_exchange( ssl_context *ssl )
1496{
Paul Bakker23986e52011-04-24 08:57:21 +00001497 int ret;
1498 size_t i, n;
Paul Bakker41c83d32013-03-20 14:39:14 +01001499 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001500
1501 SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
1502
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001503#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001504 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001505 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001506 /*
1507 * DHM key exchange -- send G^X mod P
1508 */
Paul Bakker48916f92012-09-16 19:57:18 +00001509 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001510
1511 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1512 ssl->out_msg[5] = (unsigned char)( n );
1513 i = 6;
1514
Paul Bakker29b64762012-09-25 09:36:44 +00001515 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1516 mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker5121ce52009-01-03 21:22:43 +00001517 &ssl->out_msg[i], n,
1518 ssl->f_rng, ssl->p_rng );
1519 if( ret != 0 )
1520 {
1521 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1522 return( ret );
1523 }
1524
Paul Bakker48916f92012-09-16 19:57:18 +00001525 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1526 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00001527
Paul Bakker48916f92012-09-16 19:57:18 +00001528 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001529
Paul Bakker48916f92012-09-16 19:57:18 +00001530 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1531 ssl->handshake->premaster,
1532 &ssl->handshake->pmslen ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001533 {
1534 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1535 return( ret );
1536 }
1537
Paul Bakker48916f92012-09-16 19:57:18 +00001538 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00001539 }
1540 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001541#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1542#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001543 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
1544 {
1545 /*
1546 * ECDH key exchange -- send client public value
1547 */
1548 i = 4;
1549
1550 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx,
1551 &n,
1552 &ssl->out_msg[i], 1000,
1553 ssl->f_rng, ssl->p_rng );
1554 if( ret != 0 )
1555 {
1556 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
1557 return( ret );
1558 }
1559
1560 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
1561
1562 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
1563 &ssl->handshake->pmslen,
1564 ssl->handshake->premaster,
1565 POLARSSL_MPI_MAX_SIZE ) ) != 0 )
1566 {
1567 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
1568 return( ret );
1569 }
1570
1571 SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
1572 }
1573 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001574#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001575#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1576 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1577 {
1578 unsigned char *p = ssl->handshake->premaster;
1579
1580 /*
1581 * PSK key exchange
1582 *
1583 * opaque psk_identity<0..2^16-1>;
1584 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001585 if( ssl->psk == NULL )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001586 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1587
1588 if( sizeof(ssl->handshake->premaster) < 4 + 2 * ssl->psk_len )
1589 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1590
1591 n = ssl->psk_identity_len;
1592
1593 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1594 ssl->out_msg[5] = (unsigned char)( n );
1595 i = 6;
1596
1597 memcpy( ssl->out_msg + i, ssl->psk_identity, ssl->psk_identity_len );
1598
1599 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1600 *(p++) = (unsigned char)( ssl->psk_len );
1601 p += ssl->psk_len;
1602
1603 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1604 *(p++) = (unsigned char)( ssl->psk_len );
1605 memcpy( p, ssl->psk, ssl->psk_len );
1606 p += ssl->psk_len;
1607
1608 ssl->handshake->pmslen = 4 + 2 * ssl->psk_len;
1609 }
1610 else
1611#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001612#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1613 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1614 {
1615 unsigned char *p = ssl->handshake->premaster;
1616
1617 /*
1618 * DHE_PSK key exchange
1619 *
1620 * opaque psk_identity<0..2^16-1>;
1621 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
1622 */
1623 if( ssl->psk == NULL )
1624 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1625
1626 if( sizeof(ssl->handshake->premaster) < 4 + ssl->psk_identity_len +
1627 ssl->handshake->dhm_ctx.len )
1628 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1629
1630 i = 4;
1631 n = ssl->psk_identity_len;
1632 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1633 ssl->out_msg[5] = (unsigned char)( n );
1634
1635 memcpy( ssl->out_msg + 6, ssl->psk_identity, ssl->psk_identity_len );
1636
1637 n = ssl->handshake->dhm_ctx.len;
1638 ssl->out_msg[6 + ssl->psk_identity_len] = (unsigned char)( n >> 8 );
1639 ssl->out_msg[7 + ssl->psk_identity_len] = (unsigned char)( n );
1640
1641 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1642 mpi_size( &ssl->handshake->dhm_ctx.P ),
1643 &ssl->out_msg[8 + ssl->psk_identity_len], n,
1644 ssl->f_rng, ssl->p_rng );
1645 if( ret != 0 )
1646 {
1647 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1648 return( ret );
1649 }
1650
1651 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1652 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
1653
1654 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len >> 8 );
1655 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len );
1656 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1657 p, &n ) ) != 0 )
1658 {
1659 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1660 return( ret );
1661 }
1662
1663 if( n != ssl->handshake->dhm_ctx.len )
1664 {
1665 SSL_DEBUG_MSG( 1, ( "dhm_calc_secret result smaller than DHM" ) );
1666 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1667 }
1668
1669 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
1670
1671 p += ssl->handshake->dhm_ctx.len;
1672
1673 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1674 *(p++) = (unsigned char)( ssl->psk_len );
1675 memcpy( p, ssl->psk, ssl->psk_len );
1676 p += ssl->psk_len;
1677
1678 ssl->handshake->pmslen = 4 + ssl->handshake->dhm_ctx.len + ssl->psk_len;
1679 n = ssl->handshake->pmslen;
1680 }
1681 else
1682#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1683#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001684 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001685 {
1686 /*
1687 * RSA key exchange -- send rsa_public(pkcs1 v1.5(premaster))
1688 */
Paul Bakker48916f92012-09-16 19:57:18 +00001689 ssl->handshake->premaster[0] = (unsigned char) ssl->max_major_ver;
1690 ssl->handshake->premaster[1] = (unsigned char) ssl->max_minor_ver;
1691 ssl->handshake->pmslen = 48;
Paul Bakker5121ce52009-01-03 21:22:43 +00001692
Paul Bakker48916f92012-09-16 19:57:18 +00001693 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster + 2,
1694 ssl->handshake->pmslen - 2 );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001695 if( ret != 0 )
1696 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001697
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001698 /* EC NOT IMPLEMENTED YET */
1699 if( ssl->session_negotiate->peer_cert->pk.type != POLARSSL_PK_RSA )
1700 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1701
Paul Bakker5121ce52009-01-03 21:22:43 +00001702 i = 4;
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001703 n = pk_rsa( ssl->session_negotiate->peer_cert->pk )->len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001704
1705 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
1706 {
1707 i += 2;
1708 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1709 ssl->out_msg[5] = (unsigned char)( n );
1710 }
1711
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001712 ret = rsa_pkcs1_encrypt(
1713 pk_rsa( ssl->session_negotiate->peer_cert->pk ),
1714 ssl->f_rng, ssl->p_rng, RSA_PUBLIC,
1715 ssl->handshake->pmslen, ssl->handshake->premaster,
1716 ssl->out_msg + i );
Paul Bakker5121ce52009-01-03 21:22:43 +00001717 if( ret != 0 )
1718 {
1719 SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret );
1720 return( ret );
1721 }
1722 }
Paul Bakkered27a042013-04-18 22:46:23 +02001723 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001724#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02001725 {
1726 ((void) ciphersuite_info);
1727 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1728 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001729
Paul Bakkerff60ee62010-03-16 21:09:09 +00001730 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1731 {
1732 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1733 return( ret );
1734 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001735
1736 ssl->out_msglen = i + n;
1737 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1738 ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE;
1739
1740 ssl->state++;
1741
1742 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1743 {
1744 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1745 return( ret );
1746 }
1747
1748 SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
1749
1750 return( 0 );
1751}
1752
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001753#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1754 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1755 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001756static int ssl_write_certificate_verify( ssl_context *ssl )
1757{
Paul Bakkered27a042013-04-18 22:46:23 +02001758 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1759 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001760
1761 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1762
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001763 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1764 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02001765 {
1766 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1767 ssl->state++;
1768 return( 0 );
1769 }
1770
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001771 return( ret );
1772}
1773#else
1774static int ssl_write_certificate_verify( ssl_context *ssl )
1775{
1776 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1777 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1778 size_t n = 0, offset = 0;
1779 unsigned char hash[48];
1780 md_type_t md_alg = POLARSSL_MD_NONE;
1781 unsigned int hashlen = 0;
1782
1783 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1784
1785 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1786 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1787 {
1788 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1789 ssl->state++;
1790 return( 0 );
1791 }
1792
Paul Bakkered27a042013-04-18 22:46:23 +02001793 if( ssl->client_auth == 0 || ssl->own_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001794 {
1795 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1796 ssl->state++;
1797 return( 0 );
1798 }
1799
1800 if( ssl->rsa_key == NULL )
1801 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001802 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1803 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001804 }
1805
1806 /*
1807 * Make an RSA signature of the handshake digests
1808 */
Paul Bakker48916f92012-09-16 19:57:18 +00001809 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001810
Paul Bakker926af752012-11-23 13:38:07 +01001811 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001812 {
Paul Bakker926af752012-11-23 13:38:07 +01001813 /*
1814 * digitally-signed struct {
1815 * opaque md5_hash[16];
1816 * opaque sha_hash[20];
1817 * };
1818 *
1819 * md5_hash
1820 * MD5(handshake_messages);
1821 *
1822 * sha_hash
1823 * SHA(handshake_messages);
1824 */
1825 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001826 md_alg = POLARSSL_MD_NONE;
Paul Bakker926af752012-11-23 13:38:07 +01001827 }
1828 else
1829 {
1830 /*
1831 * digitally-signed struct {
1832 * opaque handshake_messages[handshake_messages_length];
1833 * };
1834 *
1835 * Taking shortcut here. We assume that the server always allows the
1836 * PRF Hash function and has sent it in the allowed signature
1837 * algorithms list received in the Certificate Request message.
1838 *
1839 * Until we encounter a server that does not, we will take this
1840 * shortcut.
1841 *
1842 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
1843 * in order to satisfy 'weird' needs from the server side.
1844 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001845 if( ssl->transform_negotiate->ciphersuite_info->mac ==
1846 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001847 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001848 md_alg = POLARSSL_MD_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001849 ssl->out_msg[4] = SSL_HASH_SHA384;
1850 ssl->out_msg[5] = SSL_SIG_RSA;
1851 }
1852 else
1853 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001854 md_alg = POLARSSL_MD_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001855 ssl->out_msg[4] = SSL_HASH_SHA256;
1856 ssl->out_msg[5] = SSL_SIG_RSA;
1857 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001858
1859 offset = 2;
1860 }
1861
Paul Bakker926af752012-11-23 13:38:07 +01001862 if ( ssl->rsa_key )
1863 n = ssl->rsa_key_len ( ssl->rsa_key );
1864
Paul Bakker1ef83d62012-04-11 12:09:53 +00001865 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
1866 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001867
Paul Bakker43b7e352011-01-18 15:27:19 +00001868 if( ssl->rsa_key )
Paul Bakker5121ce52009-01-03 21:22:43 +00001869 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001870 ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001871 RSA_PRIVATE, md_alg,
Paul Bakkereb2c6582012-09-27 19:15:01 +00001872 hashlen, hash, ssl->out_msg + 6 + offset );
Paul Bakker43b7e352011-01-18 15:27:19 +00001873 }
1874
1875 if (ret != 0)
1876 {
1877 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001878 return( ret );
1879 }
1880
Paul Bakker1ef83d62012-04-11 12:09:53 +00001881 ssl->out_msglen = 6 + n + offset;
Paul Bakker5121ce52009-01-03 21:22:43 +00001882 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1883 ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY;
1884
1885 ssl->state++;
1886
1887 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1888 {
1889 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1890 return( ret );
1891 }
1892
1893 SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
1894
Paul Bakkered27a042013-04-18 22:46:23 +02001895 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001896}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001897#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1898 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1899 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001900
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02001901static int ssl_parse_new_session_ticket( ssl_context *ssl )
1902{
1903 int ret;
1904 uint32_t lifetime;
1905 size_t ticket_len;
1906 unsigned char *ticket;
1907
1908 SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
1909
1910 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1911 {
1912 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1913 return( ret );
1914 }
1915
1916 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1917 {
1918 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
1919 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1920 }
1921
1922 /*
1923 * struct {
1924 * uint32 ticket_lifetime_hint;
1925 * opaque ticket<0..2^16-1>;
1926 * } NewSessionTicket;
1927 *
1928 * 0 . 0 handshake message type
1929 * 1 . 3 handshake message length
1930 * 4 . 7 ticket_lifetime_hint
1931 * 8 . 9 ticket_len (n)
1932 * 10 . 9+n ticket content
1933 */
1934 if( ssl->in_msg[0] != SSL_HS_NEW_SESSION_TICKET ||
1935 ssl->in_hslen < 10 )
1936 {
1937 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
1938 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
1939 }
1940
1941 lifetime = ( ssl->in_msg[4] << 24 ) | ( ssl->in_msg[5] << 16 ) |
1942 ( ssl->in_msg[6] << 8 ) | ( ssl->in_msg[7] );
1943
1944 ticket_len = ( ssl->in_msg[8] << 8 ) | ( ssl->in_msg[9] );
1945
1946 if( ticket_len + 10 != ssl->in_hslen )
1947 {
1948 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
1949 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
1950 }
1951
1952 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
1953
1954 SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
1955
1956 /*
1957 * Zero-length ticket means the server changed his mind and doesn't want
1958 * to send a ticket after all, so just forget it
1959 */
1960 if( ticket_len == 0)
1961 return( 0 );
1962
1963 polarssl_free( ssl->session_negotiate->ticket );
1964 ssl->session_negotiate->ticket = NULL;
1965 ssl->session_negotiate->ticket_len = 0;
1966
1967 if( ( ticket = polarssl_malloc( ticket_len ) ) == NULL )
1968 {
1969 SSL_DEBUG_MSG( 1, ( "ticket malloc failed" ) );
1970 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1971 }
1972
1973 memcpy( ticket, ssl->in_msg + 10, ticket_len );
1974
1975 ssl->session_negotiate->ticket = ticket;
1976 ssl->session_negotiate->ticket_len = ticket_len;
1977 ssl->session_negotiate->ticket_lifetime = lifetime;
1978
1979 /*
1980 * RFC 5077 section 3.4:
1981 * "If the client receives a session ticket from the server, then it
1982 * discards any Session ID that was sent in the ServerHello."
1983 */
1984 SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
1985 ssl->session_negotiate->length = 0;
1986
1987 SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
1988
1989 return( 0 );
1990}
1991
Paul Bakker5121ce52009-01-03 21:22:43 +00001992/*
Paul Bakker1961b702013-01-25 14:49:24 +01001993 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00001994 */
Paul Bakker1961b702013-01-25 14:49:24 +01001995int ssl_handshake_client_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001996{
1997 int ret = 0;
1998
Paul Bakker1961b702013-01-25 14:49:24 +01001999 if( ssl->state == SSL_HANDSHAKE_OVER )
2000 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002001
Paul Bakker1961b702013-01-25 14:49:24 +01002002 SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
2003
2004 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
2005 return( ret );
2006
2007 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00002008 {
Paul Bakker1961b702013-01-25 14:49:24 +01002009 case SSL_HELLO_REQUEST:
2010 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002011 break;
2012
Paul Bakker1961b702013-01-25 14:49:24 +01002013 /*
2014 * ==> ClientHello
2015 */
2016 case SSL_CLIENT_HELLO:
2017 ret = ssl_write_client_hello( ssl );
2018 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002019
Paul Bakker1961b702013-01-25 14:49:24 +01002020 /*
2021 * <== ServerHello
2022 * Certificate
2023 * ( ServerKeyExchange )
2024 * ( CertificateRequest )
2025 * ServerHelloDone
2026 */
2027 case SSL_SERVER_HELLO:
2028 ret = ssl_parse_server_hello( ssl );
2029 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002030
Paul Bakker1961b702013-01-25 14:49:24 +01002031 case SSL_SERVER_CERTIFICATE:
2032 ret = ssl_parse_certificate( ssl );
2033 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002034
Paul Bakker1961b702013-01-25 14:49:24 +01002035 case SSL_SERVER_KEY_EXCHANGE:
2036 ret = ssl_parse_server_key_exchange( ssl );
2037 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002038
Paul Bakker1961b702013-01-25 14:49:24 +01002039 case SSL_CERTIFICATE_REQUEST:
2040 ret = ssl_parse_certificate_request( ssl );
2041 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002042
Paul Bakker1961b702013-01-25 14:49:24 +01002043 case SSL_SERVER_HELLO_DONE:
2044 ret = ssl_parse_server_hello_done( ssl );
2045 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002046
Paul Bakker1961b702013-01-25 14:49:24 +01002047 /*
2048 * ==> ( Certificate/Alert )
2049 * ClientKeyExchange
2050 * ( CertificateVerify )
2051 * ChangeCipherSpec
2052 * Finished
2053 */
2054 case SSL_CLIENT_CERTIFICATE:
2055 ret = ssl_write_certificate( ssl );
2056 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002057
Paul Bakker1961b702013-01-25 14:49:24 +01002058 case SSL_CLIENT_KEY_EXCHANGE:
2059 ret = ssl_write_client_key_exchange( ssl );
2060 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002061
Paul Bakker1961b702013-01-25 14:49:24 +01002062 case SSL_CERTIFICATE_VERIFY:
2063 ret = ssl_write_certificate_verify( ssl );
2064 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002065
Paul Bakker1961b702013-01-25 14:49:24 +01002066 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
2067 ret = ssl_write_change_cipher_spec( ssl );
2068 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002069
Paul Bakker1961b702013-01-25 14:49:24 +01002070 case SSL_CLIENT_FINISHED:
2071 ret = ssl_write_finished( ssl );
2072 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002073
Paul Bakker1961b702013-01-25 14:49:24 +01002074 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002075 * <== ( NewSessionTicket )
2076 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01002077 * Finished
2078 */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002079 case SSL_SERVER_NEW_SESSION_TICKET:
2080 ret = ssl_parse_new_session_ticket( ssl );
2081 break;
2082
Paul Bakker1961b702013-01-25 14:49:24 +01002083 case SSL_SERVER_CHANGE_CIPHER_SPEC:
2084 ret = ssl_parse_change_cipher_spec( ssl );
2085 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002086
Paul Bakker1961b702013-01-25 14:49:24 +01002087 case SSL_SERVER_FINISHED:
2088 ret = ssl_parse_finished( ssl );
2089 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002090
Paul Bakker1961b702013-01-25 14:49:24 +01002091 case SSL_FLUSH_BUFFERS:
2092 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
2093 ssl->state = SSL_HANDSHAKE_WRAPUP;
2094 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002095
Paul Bakker1961b702013-01-25 14:49:24 +01002096 case SSL_HANDSHAKE_WRAPUP:
2097 ssl_handshake_wrapup( ssl );
2098 break;
Paul Bakker48916f92012-09-16 19:57:18 +00002099
Paul Bakker1961b702013-01-25 14:49:24 +01002100 default:
2101 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
2102 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
2103 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002104
2105 return( ret );
2106}
Paul Bakker5121ce52009-01-03 21:22:43 +00002107#endif