blob: 9b643926d8cbe191128b35a1d40614ceb1220c08 [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 )
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200434 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000435 n = 0;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200436 }
437
438 /*
439 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
440 * generate and include a Session ID in the TLS ClientHello."
441 */
442 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
443 ssl->session_negotiate->ticket != NULL &&
444 ssl->session_negotiate->ticket_len != 0 )
445 {
446 ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id, 32 );
447
448 if( ret != 0 )
449 return( ret );
450
451 ssl->session_negotiate->length = n = 32;
452 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000453
454 *p++ = (unsigned char) n;
455
456 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000457 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000458
459 SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
460 SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
461
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200462 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
Paul Bakker2fbefde2013-06-29 16:01:15 +0200463 n = 0;
464 q = p;
465
466 // Skip writing ciphersuite length for now
467 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000468
Paul Bakker48916f92012-09-16 19:57:18 +0000469 /*
470 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
471 */
472 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
473 {
474 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
475 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO );
Paul Bakker2fbefde2013-06-29 16:01:15 +0200476 n++;
Paul Bakker48916f92012-09-16 19:57:18 +0000477 }
478
Paul Bakker2fbefde2013-06-29 16:01:15 +0200479 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000480 {
Paul Bakker2fbefde2013-06-29 16:01:15 +0200481 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
482
483 if( ciphersuite_info == NULL )
484 continue;
485
486 if( ciphersuite_info->min_minor_ver > ssl->max_minor_ver ||
487 ciphersuite_info->max_minor_ver < ssl->min_minor_ver )
488 continue;
489
Paul Bakkere3166ce2011-01-27 17:40:50 +0000490 SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %2d",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200491 ciphersuites[i] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000492
Paul Bakker2fbefde2013-06-29 16:01:15 +0200493 n++;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200494 *p++ = (unsigned char)( ciphersuites[i] >> 8 );
495 *p++ = (unsigned char)( ciphersuites[i] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000496 }
497
Paul Bakker2fbefde2013-06-29 16:01:15 +0200498 *q++ = (unsigned char)( n >> 7 );
499 *q++ = (unsigned char)( n << 1 );
500
501 SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
502
503
Paul Bakker2770fbd2012-07-03 13:30:23 +0000504#if defined(POLARSSL_ZLIB_SUPPORT)
505 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
506 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000507 SSL_COMPRESS_DEFLATE, SSL_COMPRESS_NULL ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000508
509 *p++ = 2;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000510 *p++ = SSL_COMPRESS_DEFLATE;
Paul Bakker48916f92012-09-16 19:57:18 +0000511 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000512#else
Paul Bakker5121ce52009-01-03 21:22:43 +0000513 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000514 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", SSL_COMPRESS_NULL ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000515
516 *p++ = 1;
517 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000518#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000519
Paul Bakkerd3edc862013-03-20 16:07:17 +0100520 // First write extensions, then the total length
521 //
522 ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
523 ext_len += olen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000524
Paul Bakkerd3edc862013-03-20 16:07:17 +0100525 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
526 ext_len += olen;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000527
Paul Bakkerd3edc862013-03-20 16:07:17 +0100528 ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
529 ext_len += olen;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000530
Paul Bakker41c83d32013-03-20 14:39:14 +0100531#if defined(POLARSSL_ECDH_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100532 ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
533 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100534
Paul Bakkerd3edc862013-03-20 16:07:17 +0100535 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
536 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100537#endif
538
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200539 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
540 ext_len += olen;
541
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200542 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
543 ext_len += olen;
544
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200545 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
546 ext_len += olen;
547
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000548 SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
549 ext_len ) );
550
551 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
552 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100553 p += ext_len;
Paul Bakker41c83d32013-03-20 14:39:14 +0100554
Paul Bakker5121ce52009-01-03 21:22:43 +0000555 ssl->out_msglen = p - buf;
556 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
557 ssl->out_msg[0] = SSL_HS_CLIENT_HELLO;
558
559 ssl->state++;
560
561 if( ( ret = ssl_write_record( ssl ) ) != 0 )
562 {
563 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
564 return( ret );
565 }
566
567 SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
568
569 return( 0 );
570}
571
Paul Bakker48916f92012-09-16 19:57:18 +0000572static int ssl_parse_renegotiation_info( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200573 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +0000574 size_t len )
575{
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000576 int ret;
577
Paul Bakker48916f92012-09-16 19:57:18 +0000578 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
579 {
580 if( len != 1 || buf[0] != 0x0 )
581 {
582 SSL_DEBUG_MSG( 1, ( "non-zero length 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 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
591 }
592 else
593 {
594 if( len != 1 + ssl->verify_data_len * 2 ||
595 buf[0] != ssl->verify_data_len * 2 ||
596 memcmp( buf + 1, ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
597 memcmp( buf + 1 + ssl->verify_data_len,
598 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
599 {
600 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000601
602 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
603 return( ret );
604
Paul Bakker48916f92012-09-16 19:57:18 +0000605 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
606 }
607 }
608
609 return( 0 );
610}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200611
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200612static int ssl_parse_max_fragment_length_ext( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200613 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200614 size_t len )
615{
616 /*
617 * server should use the extension only if we did,
618 * and if so the server's value should match ours (and len is always 1)
619 */
620 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ||
621 len != 1 ||
622 buf[0] != ssl->mfl_code )
623 {
624 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
625 }
626
627 return( 0 );
628}
Paul Bakker48916f92012-09-16 19:57:18 +0000629
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200630static int ssl_parse_truncated_hmac_ext( ssl_context *ssl,
631 const unsigned char *buf,
632 size_t len )
633{
634 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED ||
635 len != 0 )
636 {
637 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
638 }
639
640 ((void) buf);
641
642 ssl->session_negotiate->trunc_hmac = SSL_TRUNC_HMAC_ENABLED;
643
644 return( 0 );
645}
646
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200647static int ssl_parse_session_ticket_ext( ssl_context *ssl,
648 const unsigned char *buf,
649 size_t len )
650{
651 if( len != 0 )
652 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
653
654 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +0200655
656 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200657
658 return( 0 );
659}
660
Paul Bakker5121ce52009-01-03 21:22:43 +0000661static int ssl_parse_server_hello( ssl_context *ssl )
662{
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200663 uint32_t t;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000664 int ret, i, comp;
Paul Bakker23986e52011-04-24 08:57:21 +0000665 size_t n;
Paul Bakker48916f92012-09-16 19:57:18 +0000666 size_t ext_len = 0;
667 unsigned char *buf, *ext;
668 int renegotiation_info_seen = 0;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000669 int handshake_failure = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000670
671 SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
672
673 /*
674 * 0 . 0 handshake type
675 * 1 . 3 handshake length
676 * 4 . 5 protocol version
677 * 6 . 9 UNIX time()
678 * 10 . 37 random bytes
679 */
680 buf = ssl->in_msg;
681
682 if( ( ret = ssl_read_record( ssl ) ) != 0 )
683 {
684 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
685 return( ret );
686 }
687
688 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
689 {
690 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000691 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000692 }
693
694 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
695 buf[4], buf[5] ) );
696
697 if( ssl->in_hslen < 42 ||
698 buf[0] != SSL_HS_SERVER_HELLO ||
699 buf[4] != SSL_MAJOR_VERSION_3 )
700 {
701 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000702 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000703 }
704
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000705 if( buf[5] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +0000706 {
707 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000708 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000709 }
710
711 ssl->minor_ver = buf[5];
712
Paul Bakker1d29fb52012-09-28 13:28:45 +0000713 if( ssl->minor_ver < ssl->min_minor_ver )
714 {
715 SSL_DEBUG_MSG( 1, ( "server only supports ssl smaller than minimum"
716 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
717 buf[4], buf[5] ) );
718
719 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
720 SSL_ALERT_MSG_PROTOCOL_VERSION );
721
722 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
723 }
724
Paul Bakker1504af52012-02-11 16:17:43 +0000725#if defined(POLARSSL_DEBUG_C)
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200726 t = ( (uint32_t) buf[6] << 24 )
727 | ( (uint32_t) buf[7] << 16 )
728 | ( (uint32_t) buf[8] << 8 )
729 | ( (uint32_t) buf[9] );
Paul Bakker87e5cda2012-01-14 18:14:15 +0000730#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000731
Paul Bakker48916f92012-09-16 19:57:18 +0000732 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000733
734 n = buf[38];
735
736 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
737 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
738
Paul Bakker48916f92012-09-16 19:57:18 +0000739 if( n > 32 )
740 {
741 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
742 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
743 }
744
Paul Bakker5121ce52009-01-03 21:22:43 +0000745 /*
746 * 38 . 38 session id length
747 * 39 . 38+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000748 * 39+n . 40+n chosen ciphersuite
Paul Bakker5121ce52009-01-03 21:22:43 +0000749 * 41+n . 41+n chosen compression alg.
750 * 42+n . 43+n extensions length
751 * 44+n . 44+n+m extensions
752 */
Paul Bakker48916f92012-09-16 19:57:18 +0000753 if( ssl->in_hslen > 42 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000754 {
755 ext_len = ( ( buf[42 + n] << 8 )
Paul Bakker48916f92012-09-16 19:57:18 +0000756 | ( buf[43 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000757
Paul Bakker48916f92012-09-16 19:57:18 +0000758 if( ( ext_len > 0 && ext_len < 4 ) ||
759 ssl->in_hslen != 44 + n + ext_len )
760 {
761 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
762 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
763 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000764 }
765
766 i = ( buf[39 + n] << 8 ) | buf[40 + n];
Paul Bakker2770fbd2012-07-03 13:30:23 +0000767 comp = buf[41 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +0000768
Paul Bakker380da532012-04-18 16:10:25 +0000769 /*
770 * Initialize update checksum functions
771 */
Paul Bakker68884e32013-01-07 18:20:04 +0100772 ssl->transform_negotiate->ciphersuite_info = ssl_ciphersuite_from_id( i );
Paul Bakker41c83d32013-03-20 14:39:14 +0100773 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
Paul Bakker68884e32013-01-07 18:20:04 +0100774
775 if( ssl->transform_negotiate->ciphersuite_info == NULL )
776 {
777 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200778 ssl->ciphersuite_list[ssl->minor_ver][i] ) );
Paul Bakker68884e32013-01-07 18:20:04 +0100779 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
780 }
Paul Bakker380da532012-04-18 16:10:25 +0000781
Paul Bakker5121ce52009-01-03 21:22:43 +0000782 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
783 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
784
785 /*
786 * Check if the session can be resumed
787 */
Paul Bakker0a597072012-09-25 21:55:46 +0000788 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE ||
789 ssl->handshake->resume == 0 || n == 0 ||
Paul Bakker48916f92012-09-16 19:57:18 +0000790 ssl->session_negotiate->ciphersuite != i ||
791 ssl->session_negotiate->compression != comp ||
792 ssl->session_negotiate->length != n ||
793 memcmp( ssl->session_negotiate->id, buf + 39, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000794 {
795 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +0000796 ssl->handshake->resume = 0;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200797#if defined(POLARSSL_HAVE_TIME)
Paul Bakker48916f92012-09-16 19:57:18 +0000798 ssl->session_negotiate->start = time( NULL );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200799#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000800 ssl->session_negotiate->ciphersuite = i;
801 ssl->session_negotiate->compression = comp;
802 ssl->session_negotiate->length = n;
803 memcpy( ssl->session_negotiate->id, buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000804 }
805 else
806 {
807 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +0000808
809 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
810 {
811 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
812 return( ret );
813 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000814 }
815
816 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +0000817 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000818
Paul Bakkere3166ce2011-01-27 17:40:50 +0000819 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", i ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000820 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[41 + n] ) );
821
822 i = 0;
823 while( 1 )
824 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200825 if( ssl->ciphersuite_list[ssl->minor_ver][i] == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000826 {
827 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000828 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000829 }
830
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200831 if( ssl->ciphersuite_list[ssl->minor_ver][i++] ==
832 ssl->session_negotiate->ciphersuite )
833 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000834 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200835 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000836 }
837
Paul Bakker2770fbd2012-07-03 13:30:23 +0000838 if( comp != SSL_COMPRESS_NULL
839#if defined(POLARSSL_ZLIB_SUPPORT)
840 && comp != SSL_COMPRESS_DEFLATE
841#endif
842 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000843 {
844 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000845 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000846 }
Paul Bakker48916f92012-09-16 19:57:18 +0000847 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +0000848
Paul Bakker48916f92012-09-16 19:57:18 +0000849 ext = buf + 44 + n;
850
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200851 SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) );
852
Paul Bakker48916f92012-09-16 19:57:18 +0000853 while( ext_len )
854 {
855 unsigned int ext_id = ( ( ext[0] << 8 )
856 | ( ext[1] ) );
857 unsigned int ext_size = ( ( ext[2] << 8 )
858 | ( ext[3] ) );
859
860 if( ext_size + 4 > ext_len )
861 {
862 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
863 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
864 }
865
866 switch( ext_id )
867 {
868 case TLS_EXT_RENEGOTIATION_INFO:
869 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
870 renegotiation_info_seen = 1;
871
872 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ) ) != 0 )
873 return( ret );
874
875 break;
876
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200877 case TLS_EXT_MAX_FRAGMENT_LENGTH:
878 SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
879
880 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
881 ext + 4, ext_size ) ) != 0 )
882 {
883 return( ret );
884 }
885
886 break;
887
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200888 case TLS_EXT_TRUNCATED_HMAC:
889 SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
890
891 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
892 ext + 4, ext_size ) ) != 0 )
893 {
894 return( ret );
895 }
896
897 break;
898
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200899 case TLS_EXT_SESSION_TICKET:
900 SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
901
902 if( ( ret = ssl_parse_session_ticket_ext( ssl,
903 ext + 4, ext_size ) ) != 0 )
904 {
905 return( ret );
906 }
907
908 break;
909
Paul Bakker48916f92012-09-16 19:57:18 +0000910 default:
911 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
912 ext_id ) );
913 }
914
915 ext_len -= 4 + ext_size;
916 ext += 4 + ext_size;
917
918 if( ext_len > 0 && ext_len < 4 )
919 {
920 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
921 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
922 }
923 }
924
925 /*
926 * Renegotiation security checks
927 */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000928 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
929 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +0000930 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000931 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
932 handshake_failure = 1;
Paul Bakkerf7abd422013-04-16 13:15:56 +0200933 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000934 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
935 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
936 renegotiation_info_seen == 0 )
937 {
938 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
939 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +0000940 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000941 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
942 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
943 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +0000944 {
945 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000946 handshake_failure = 1;
947 }
948 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
949 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
950 renegotiation_info_seen == 1 )
951 {
952 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
953 handshake_failure = 1;
954 }
955
956 if( handshake_failure == 1 )
957 {
958 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
959 return( ret );
960
Paul Bakker48916f92012-09-16 19:57:18 +0000961 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
962 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000963
964 SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
965
966 return( 0 );
967}
968
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200969#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +0200970static int ssl_parse_server_dh_params( ssl_context *ssl, unsigned char **p,
971 unsigned char *end )
972{
973 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
974
Paul Bakker29e1f122013-04-16 13:07:56 +0200975 /*
976 * Ephemeral DH parameters:
977 *
978 * struct {
979 * opaque dh_p<1..2^16-1>;
980 * opaque dh_g<1..2^16-1>;
981 * opaque dh_Ys<1..2^16-1>;
982 * } ServerDHParams;
983 */
984 if( ( ret = dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
985 {
986 SSL_DEBUG_RET( 2, ( "dhm_read_params" ), ret );
987 return( ret );
988 }
989
990 if( ssl->handshake->dhm_ctx.len < 64 ||
991 ssl->handshake->dhm_ctx.len > 512 )
992 {
993 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (DHM length)" ) );
994 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
995 }
996
997 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
998 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
999 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +02001000
1001 return( ret );
1002}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001003#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001004
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001005#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001006static int ssl_parse_server_ecdh_params( ssl_context *ssl,
1007 unsigned char **p,
1008 unsigned char *end )
1009{
1010 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1011
Paul Bakker29e1f122013-04-16 13:07:56 +02001012 /*
1013 * Ephemeral ECDH parameters:
1014 *
1015 * struct {
1016 * ECParameters curve_params;
1017 * ECPoint public;
1018 * } ServerECDHParams;
1019 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001020 if( ( ret = ecdh_read_params( &ssl->handshake->ecdh_ctx,
1021 (const unsigned char **) p, end ) ) != 0 )
1022 {
1023 SSL_DEBUG_RET( 2, ( "ecdh_read_params" ), ret );
1024 return( ret );
1025 }
1026
1027 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
1028 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
1029 {
1030 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDH length)" ) );
1031 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1032 }
1033
1034 SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
Paul Bakker29e1f122013-04-16 13:07:56 +02001035
1036 return( ret );
1037}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001038#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001039
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001040#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
1041 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001042static int ssl_parse_server_psk_hint( ssl_context *ssl,
1043 unsigned char **p,
1044 unsigned char *end )
1045{
1046 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001047 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001048 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001049
1050 /*
1051 * PSK parameters:
1052 *
1053 * opaque psk_identity_hint<0..2^16-1>;
1054 */
1055 len = (*p)[1] << 8 | (*p)[0];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001056 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001057
1058 if( (*p) + len > end )
1059 {
1060 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
1061 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1062 }
1063
1064 // TODO: Retrieve PSK identity hint and callback to app
1065 //
1066 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001067 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001068
1069 return( ret );
1070}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001071#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
1072 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001073
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001074#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1075 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001076static int ssl_parse_signature_algorithm( ssl_context *ssl,
1077 unsigned char **p,
1078 unsigned char *end,
1079 md_type_t *md_alg )
1080{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001081 ((void) ssl);
Paul Bakker29e1f122013-04-16 13:07:56 +02001082 *md_alg = POLARSSL_MD_NONE;
1083
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001084 if( (*p) + 2 > end )
Paul Bakker29e1f122013-04-16 13:07:56 +02001085 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1086
1087 if( (*p)[1] != SSL_SIG_RSA )
1088 {
1089 SSL_DEBUG_MSG( 2, ( "server used unsupported SignatureAlgorithm %d", (*p)[1] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001090 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1091 }
1092
1093 switch( (*p)[0] )
1094 {
1095#if defined(POLARSSL_MD5_C)
1096 case SSL_HASH_MD5:
1097 *md_alg = POLARSSL_MD_MD5;
1098 break;
1099#endif
1100#if defined(POLARSSL_SHA1_C)
1101 case SSL_HASH_SHA1:
1102 *md_alg = POLARSSL_MD_SHA1;
1103 break;
1104#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001105#if defined(POLARSSL_SHA256_C)
Paul Bakker29e1f122013-04-16 13:07:56 +02001106 case SSL_HASH_SHA224:
1107 *md_alg = POLARSSL_MD_SHA224;
1108 break;
1109 case SSL_HASH_SHA256:
1110 *md_alg = POLARSSL_MD_SHA256;
1111 break;
1112#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001113#if defined(POLARSSL_SHA512_C)
Paul Bakker29e1f122013-04-16 13:07:56 +02001114 case SSL_HASH_SHA384:
1115 *md_alg = POLARSSL_MD_SHA384;
1116 break;
1117 case SSL_HASH_SHA512:
1118 *md_alg = POLARSSL_MD_SHA512;
1119 break;
1120#endif
1121 default:
1122 SSL_DEBUG_MSG( 2, ( "Server used unsupported HashAlgorithm %d", *(p)[0] ) );
1123 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1124 }
1125
1126 SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
1127 SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
1128 *p += 2;
1129
1130 return( 0 );
1131}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001132#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1133 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001134
Paul Bakker41c83d32013-03-20 14:39:14 +01001135static int ssl_parse_server_key_exchange( ssl_context *ssl )
1136{
Paul Bakker23986e52011-04-24 08:57:21 +00001137 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001138 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001139 unsigned char *p, *end;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001140#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1141 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001142 size_t n;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001143 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +02001144 md_type_t md_alg = POLARSSL_MD_NONE;
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001145 unsigned int hashlen = 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001146#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001147
1148 SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
1149
Paul Bakker41c83d32013-03-20 14:39:14 +01001150 if( ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_RSA &&
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001151 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_ECDHE_RSA &&
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001152 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_PSK &&
1153 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00001154 {
1155 SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
1156 ssl->state++;
1157 return( 0 );
1158 }
1159
Paul Bakker5121ce52009-01-03 21:22:43 +00001160 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1161 {
1162 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1163 return( ret );
1164 }
1165
1166 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1167 {
1168 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001169 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001170 }
1171
1172 if( ssl->in_msg[0] != SSL_HS_SERVER_KEY_EXCHANGE )
1173 {
Paul Bakker188c8de2013-04-19 09:13:37 +02001174 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1175 {
1176 ssl->record_read = 1;
1177 goto exit;
1178 }
1179
1180 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1181 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001182 }
1183
Paul Bakker1ef83d62012-04-11 12:09:53 +00001184 SSL_DEBUG_BUF( 3, "server key exchange", ssl->in_msg + 4, ssl->in_hslen - 4 );
1185
Paul Bakker3b6a07b2013-03-21 11:56:50 +01001186 p = ssl->in_msg + 4;
1187 end = ssl->in_msg + ssl->in_hslen;
1188
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001189#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001190 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001191 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001192 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001193 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001194 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1195 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1196 }
1197 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001198 else
1199#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1200#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
1201 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001202 {
1203 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
1204 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001205 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1206 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1207 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001208 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001209 else
1210#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
1211#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1212 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakker41c83d32013-03-20 14:39:14 +01001213 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001214 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001215 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001216 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1217 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1218 }
1219 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001220 else
1221#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
1222#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1223 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1224 {
1225 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
1226 {
1227 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1228 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1229 }
1230 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
1231 {
1232 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1233 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1234 }
1235 }
1236 else
1237#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1238 {
1239 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1240 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001241
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001242#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1243 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001244 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1245 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001246 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001247 /*
1248 * Handle the digitally-signed structure
1249 */
1250 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001251 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001252 if( ssl_parse_signature_algorithm( ssl, &p, end, &md_alg ) != 0 )
1253 {
Paul Bakker1ef83d62012-04-11 12:09:53 +00001254 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001255 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1256 }
1257 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001258
Paul Bakker29e1f122013-04-16 13:07:56 +02001259 n = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00001260 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001261
Paul Bakker29e1f122013-04-16 13:07:56 +02001262 if( end != p + n )
Paul Bakker41c83d32013-03-20 14:39:14 +01001263 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001264 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001265 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1266 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001267
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001268 /* EC NOT IMPLEMENTED YET */
1269 if( ssl->session_negotiate->peer_cert->pk.type != POLARSSL_PK_RSA )
1270 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1271
Paul Bakker29e1f122013-04-16 13:07:56 +02001272 if( (unsigned int)( end - p ) !=
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001273 pk_rsa( ssl->session_negotiate->peer_cert->pk )->len )
Paul Bakker41c83d32013-03-20 14:39:14 +01001274 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001275 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001276 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1277 }
1278
Paul Bakker29e1f122013-04-16 13:07:56 +02001279 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001280 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001281 md5_context md5;
1282 sha1_context sha1;
1283
1284 /*
1285 * digitally-signed struct {
1286 * opaque md5_hash[16];
1287 * opaque sha_hash[20];
1288 * };
1289 *
1290 * md5_hash
1291 * MD5(ClientHello.random + ServerHello.random
1292 * + ServerParams);
1293 * sha_hash
1294 * SHA(ClientHello.random + ServerHello.random
1295 * + ServerParams);
1296 */
1297 n = ssl->in_hslen - ( end - p ) - 6;
1298
1299 md5_starts( &md5 );
1300 md5_update( &md5, ssl->handshake->randbytes, 64 );
1301 md5_update( &md5, ssl->in_msg + 4, n );
1302 md5_finish( &md5, hash );
1303
1304 sha1_starts( &sha1 );
1305 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
1306 sha1_update( &sha1, ssl->in_msg + 4, n );
1307 sha1_finish( &sha1, hash + 16 );
1308
1309 md_alg = POLARSSL_MD_NONE;
1310 hashlen = 36;
1311 }
1312 else
1313 {
1314 md_context_t ctx;
1315
1316 n = ssl->in_hslen - ( end - p ) - 8;
1317
1318 /*
1319 * digitally-signed struct {
1320 * opaque client_random[32];
1321 * opaque server_random[32];
1322 * ServerDHParams params;
1323 * };
1324 */
1325 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1326 {
1327 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1328 return( ret );
1329 }
1330
1331 md_starts( &ctx );
1332 md_update( &ctx, ssl->handshake->randbytes, 64 );
1333 md_update( &ctx, ssl->in_msg + 4, n );
1334 md_finish( &ctx, hash );
1335 }
1336
1337 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
1338
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001339 if( ( ret = rsa_pkcs1_verify(
1340 pk_rsa( ssl->session_negotiate->peer_cert->pk ),
1341 RSA_PUBLIC, md_alg, hashlen, hash, p ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02001342 {
1343 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001344 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001345 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001346 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001347#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1348 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001349
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001350exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001351 ssl->state++;
1352
1353 SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
1354
1355 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001356}
1357
1358static int ssl_parse_certificate_request( ssl_context *ssl )
1359{
1360 int ret;
Paul Bakker926af752012-11-23 13:38:07 +01001361 unsigned char *buf, *p;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001362 size_t n = 0, m = 0;
Paul Bakker926af752012-11-23 13:38:07 +01001363 size_t cert_type_len = 0, sig_alg_len = 0, dn_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001364
1365 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
1366
1367 /*
1368 * 0 . 0 handshake type
1369 * 1 . 3 handshake length
Paul Bakker926af752012-11-23 13:38:07 +01001370 * 4 . 4 cert type count
1371 * 5 .. m-1 cert types
1372 * m .. m+1 sig alg length (TLS 1.2 only)
1373 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001374 * n .. n+1 length of all DNs
1375 * n+2 .. n+3 length of DN 1
1376 * n+4 .. ... Distinguished Name #1
1377 * ... .. ... length of DN 2, etc.
1378 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001379 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001380 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001381 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1382 {
1383 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1384 return( ret );
1385 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001386
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001387 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1388 {
1389 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1390 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1391 }
1392
1393 ssl->record_read = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001394 }
1395
1396 ssl->client_auth = 0;
1397 ssl->state++;
1398
1399 if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST )
1400 ssl->client_auth++;
1401
1402 SSL_DEBUG_MSG( 3, ( "got %s certificate request",
1403 ssl->client_auth ? "a" : "no" ) );
1404
Paul Bakker926af752012-11-23 13:38:07 +01001405 if( ssl->client_auth == 0 )
1406 goto exit;
1407
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001408 ssl->record_read = 0;
1409
Paul Bakker926af752012-11-23 13:38:07 +01001410 // TODO: handshake_failure alert for an anonymous server to request
1411 // client authentication
1412
1413 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001414
Paul Bakker926af752012-11-23 13:38:07 +01001415 // Retrieve cert types
1416 //
1417 cert_type_len = buf[4];
1418 n = cert_type_len;
1419
1420 if( ssl->in_hslen < 6 + n )
1421 {
1422 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1423 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1424 }
1425
Paul Bakker73d44312013-05-22 13:56:26 +02001426 p = buf + 5;
Paul Bakker926af752012-11-23 13:38:07 +01001427 while( cert_type_len > 0 )
1428 {
1429 if( *p == SSL_CERT_TYPE_RSA_SIGN )
1430 {
1431 ssl->handshake->cert_type = SSL_CERT_TYPE_RSA_SIGN;
1432 break;
1433 }
1434
1435 cert_type_len--;
1436 p++;
1437 }
1438
1439 if( ssl->handshake->cert_type == 0 )
1440 {
1441 SSL_DEBUG_MSG( 1, ( "no known cert_type provided" ) );
1442 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1443 }
1444
1445 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
1446 {
1447 sig_alg_len = ( ( buf[5 + n] << 8 )
1448 | ( buf[6 + n] ) );
1449
1450 p = buf + 7 + n;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001451 m += 2;
Paul Bakker926af752012-11-23 13:38:07 +01001452 n += sig_alg_len;
1453
1454 if( ssl->in_hslen < 6 + n )
1455 {
1456 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1457 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1458 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001459 }
Paul Bakker926af752012-11-23 13:38:07 +01001460
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001461 dn_len = ( ( buf[5 + m + n] << 8 )
1462 | ( buf[6 + m + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01001463
1464 n += dn_len;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001465 if( ssl->in_hslen != 7 + m + n )
Paul Bakker926af752012-11-23 13:38:07 +01001466 {
1467 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1468 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1469 }
1470
1471exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001472 SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
1473
1474 return( 0 );
1475}
1476
1477static int ssl_parse_server_hello_done( ssl_context *ssl )
1478{
1479 int ret;
1480
1481 SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
1482
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001483 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001484 {
1485 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1486 {
1487 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1488 return( ret );
1489 }
1490
1491 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1492 {
1493 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001494 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001495 }
1496 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001497 ssl->record_read = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001498
1499 if( ssl->in_hslen != 4 ||
1500 ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE )
1501 {
1502 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001503 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001504 }
1505
1506 ssl->state++;
1507
1508 SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
1509
1510 return( 0 );
1511}
1512
1513static int ssl_write_client_key_exchange( ssl_context *ssl )
1514{
Paul Bakker23986e52011-04-24 08:57:21 +00001515 int ret;
1516 size_t i, n;
Paul Bakker41c83d32013-03-20 14:39:14 +01001517 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001518
1519 SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
1520
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001521#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001522 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001523 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001524 /*
1525 * DHM key exchange -- send G^X mod P
1526 */
Paul Bakker48916f92012-09-16 19:57:18 +00001527 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001528
1529 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1530 ssl->out_msg[5] = (unsigned char)( n );
1531 i = 6;
1532
Paul Bakker29b64762012-09-25 09:36:44 +00001533 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1534 mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker5121ce52009-01-03 21:22:43 +00001535 &ssl->out_msg[i], n,
1536 ssl->f_rng, ssl->p_rng );
1537 if( ret != 0 )
1538 {
1539 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1540 return( ret );
1541 }
1542
Paul Bakker48916f92012-09-16 19:57:18 +00001543 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1544 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00001545
Paul Bakker48916f92012-09-16 19:57:18 +00001546 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001547
Paul Bakker48916f92012-09-16 19:57:18 +00001548 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1549 ssl->handshake->premaster,
1550 &ssl->handshake->pmslen ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001551 {
1552 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1553 return( ret );
1554 }
1555
Paul Bakker48916f92012-09-16 19:57:18 +00001556 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00001557 }
1558 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001559#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1560#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001561 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
1562 {
1563 /*
1564 * ECDH key exchange -- send client public value
1565 */
1566 i = 4;
1567
1568 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx,
1569 &n,
1570 &ssl->out_msg[i], 1000,
1571 ssl->f_rng, ssl->p_rng );
1572 if( ret != 0 )
1573 {
1574 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
1575 return( ret );
1576 }
1577
1578 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
1579
1580 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
1581 &ssl->handshake->pmslen,
1582 ssl->handshake->premaster,
1583 POLARSSL_MPI_MAX_SIZE ) ) != 0 )
1584 {
1585 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
1586 return( ret );
1587 }
1588
1589 SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
1590 }
1591 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001592#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001593#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1594 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1595 {
1596 unsigned char *p = ssl->handshake->premaster;
1597
1598 /*
1599 * PSK key exchange
1600 *
1601 * opaque psk_identity<0..2^16-1>;
1602 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001603 if( ssl->psk == NULL )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001604 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1605
1606 if( sizeof(ssl->handshake->premaster) < 4 + 2 * ssl->psk_len )
1607 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1608
1609 n = ssl->psk_identity_len;
1610
1611 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1612 ssl->out_msg[5] = (unsigned char)( n );
1613 i = 6;
1614
1615 memcpy( ssl->out_msg + i, ssl->psk_identity, ssl->psk_identity_len );
1616
1617 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1618 *(p++) = (unsigned char)( ssl->psk_len );
1619 p += ssl->psk_len;
1620
1621 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1622 *(p++) = (unsigned char)( ssl->psk_len );
1623 memcpy( p, ssl->psk, ssl->psk_len );
1624 p += ssl->psk_len;
1625
1626 ssl->handshake->pmslen = 4 + 2 * ssl->psk_len;
1627 }
1628 else
1629#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001630#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1631 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1632 {
1633 unsigned char *p = ssl->handshake->premaster;
1634
1635 /*
1636 * DHE_PSK key exchange
1637 *
1638 * opaque psk_identity<0..2^16-1>;
1639 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
1640 */
1641 if( ssl->psk == NULL )
1642 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1643
1644 if( sizeof(ssl->handshake->premaster) < 4 + ssl->psk_identity_len +
1645 ssl->handshake->dhm_ctx.len )
1646 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1647
1648 i = 4;
1649 n = ssl->psk_identity_len;
1650 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1651 ssl->out_msg[5] = (unsigned char)( n );
1652
1653 memcpy( ssl->out_msg + 6, ssl->psk_identity, ssl->psk_identity_len );
1654
1655 n = ssl->handshake->dhm_ctx.len;
1656 ssl->out_msg[6 + ssl->psk_identity_len] = (unsigned char)( n >> 8 );
1657 ssl->out_msg[7 + ssl->psk_identity_len] = (unsigned char)( n );
1658
1659 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1660 mpi_size( &ssl->handshake->dhm_ctx.P ),
1661 &ssl->out_msg[8 + ssl->psk_identity_len], n,
1662 ssl->f_rng, ssl->p_rng );
1663 if( ret != 0 )
1664 {
1665 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1666 return( ret );
1667 }
1668
1669 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1670 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
1671
1672 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len >> 8 );
1673 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len );
1674 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1675 p, &n ) ) != 0 )
1676 {
1677 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1678 return( ret );
1679 }
1680
1681 if( n != ssl->handshake->dhm_ctx.len )
1682 {
1683 SSL_DEBUG_MSG( 1, ( "dhm_calc_secret result smaller than DHM" ) );
1684 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1685 }
1686
1687 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
1688
1689 p += ssl->handshake->dhm_ctx.len;
1690
1691 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1692 *(p++) = (unsigned char)( ssl->psk_len );
1693 memcpy( p, ssl->psk, ssl->psk_len );
1694 p += ssl->psk_len;
1695
1696 ssl->handshake->pmslen = 4 + ssl->handshake->dhm_ctx.len + ssl->psk_len;
1697 n = ssl->handshake->pmslen;
1698 }
1699 else
1700#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1701#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001702 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001703 {
1704 /*
1705 * RSA key exchange -- send rsa_public(pkcs1 v1.5(premaster))
1706 */
Paul Bakker48916f92012-09-16 19:57:18 +00001707 ssl->handshake->premaster[0] = (unsigned char) ssl->max_major_ver;
1708 ssl->handshake->premaster[1] = (unsigned char) ssl->max_minor_ver;
1709 ssl->handshake->pmslen = 48;
Paul Bakker5121ce52009-01-03 21:22:43 +00001710
Paul Bakker48916f92012-09-16 19:57:18 +00001711 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster + 2,
1712 ssl->handshake->pmslen - 2 );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001713 if( ret != 0 )
1714 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001715
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001716 /* EC NOT IMPLEMENTED YET */
1717 if( ssl->session_negotiate->peer_cert->pk.type != POLARSSL_PK_RSA )
1718 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1719
Paul Bakker5121ce52009-01-03 21:22:43 +00001720 i = 4;
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001721 n = pk_rsa( ssl->session_negotiate->peer_cert->pk )->len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001722
1723 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
1724 {
1725 i += 2;
1726 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1727 ssl->out_msg[5] = (unsigned char)( n );
1728 }
1729
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001730 ret = rsa_pkcs1_encrypt(
1731 pk_rsa( ssl->session_negotiate->peer_cert->pk ),
1732 ssl->f_rng, ssl->p_rng, RSA_PUBLIC,
1733 ssl->handshake->pmslen, ssl->handshake->premaster,
1734 ssl->out_msg + i );
Paul Bakker5121ce52009-01-03 21:22:43 +00001735 if( ret != 0 )
1736 {
1737 SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret );
1738 return( ret );
1739 }
1740 }
Paul Bakkered27a042013-04-18 22:46:23 +02001741 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001742#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02001743 {
1744 ((void) ciphersuite_info);
1745 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1746 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001747
Paul Bakkerff60ee62010-03-16 21:09:09 +00001748 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1749 {
1750 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1751 return( ret );
1752 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001753
1754 ssl->out_msglen = i + n;
1755 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1756 ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE;
1757
1758 ssl->state++;
1759
1760 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1761 {
1762 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1763 return( ret );
1764 }
1765
1766 SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
1767
1768 return( 0 );
1769}
1770
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001771#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1772 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1773 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001774static int ssl_write_certificate_verify( ssl_context *ssl )
1775{
Paul Bakkered27a042013-04-18 22:46:23 +02001776 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1777 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001778
1779 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1780
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001781 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1782 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02001783 {
1784 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1785 ssl->state++;
1786 return( 0 );
1787 }
1788
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001789 return( ret );
1790}
1791#else
1792static int ssl_write_certificate_verify( ssl_context *ssl )
1793{
1794 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1795 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1796 size_t n = 0, offset = 0;
1797 unsigned char hash[48];
1798 md_type_t md_alg = POLARSSL_MD_NONE;
1799 unsigned int hashlen = 0;
1800
1801 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1802
1803 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1804 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1805 {
1806 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1807 ssl->state++;
1808 return( 0 );
1809 }
1810
Paul Bakkered27a042013-04-18 22:46:23 +02001811 if( ssl->client_auth == 0 || ssl->own_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001812 {
1813 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1814 ssl->state++;
1815 return( 0 );
1816 }
1817
1818 if( ssl->rsa_key == NULL )
1819 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001820 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1821 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001822 }
1823
1824 /*
1825 * Make an RSA signature of the handshake digests
1826 */
Paul Bakker48916f92012-09-16 19:57:18 +00001827 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001828
Paul Bakker926af752012-11-23 13:38:07 +01001829 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001830 {
Paul Bakker926af752012-11-23 13:38:07 +01001831 /*
1832 * digitally-signed struct {
1833 * opaque md5_hash[16];
1834 * opaque sha_hash[20];
1835 * };
1836 *
1837 * md5_hash
1838 * MD5(handshake_messages);
1839 *
1840 * sha_hash
1841 * SHA(handshake_messages);
1842 */
1843 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001844 md_alg = POLARSSL_MD_NONE;
Paul Bakker926af752012-11-23 13:38:07 +01001845 }
1846 else
1847 {
1848 /*
1849 * digitally-signed struct {
1850 * opaque handshake_messages[handshake_messages_length];
1851 * };
1852 *
1853 * Taking shortcut here. We assume that the server always allows the
1854 * PRF Hash function and has sent it in the allowed signature
1855 * algorithms list received in the Certificate Request message.
1856 *
1857 * Until we encounter a server that does not, we will take this
1858 * shortcut.
1859 *
1860 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
1861 * in order to satisfy 'weird' needs from the server side.
1862 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001863 if( ssl->transform_negotiate->ciphersuite_info->mac ==
1864 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001865 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001866 md_alg = POLARSSL_MD_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001867 ssl->out_msg[4] = SSL_HASH_SHA384;
1868 ssl->out_msg[5] = SSL_SIG_RSA;
1869 }
1870 else
1871 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001872 md_alg = POLARSSL_MD_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001873 ssl->out_msg[4] = SSL_HASH_SHA256;
1874 ssl->out_msg[5] = SSL_SIG_RSA;
1875 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001876
1877 offset = 2;
1878 }
1879
Paul Bakker926af752012-11-23 13:38:07 +01001880 if ( ssl->rsa_key )
1881 n = ssl->rsa_key_len ( ssl->rsa_key );
1882
Paul Bakker1ef83d62012-04-11 12:09:53 +00001883 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
1884 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001885
Paul Bakker43b7e352011-01-18 15:27:19 +00001886 if( ssl->rsa_key )
Paul Bakker5121ce52009-01-03 21:22:43 +00001887 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001888 ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001889 RSA_PRIVATE, md_alg,
Paul Bakkereb2c6582012-09-27 19:15:01 +00001890 hashlen, hash, ssl->out_msg + 6 + offset );
Paul Bakker43b7e352011-01-18 15:27:19 +00001891 }
1892
1893 if (ret != 0)
1894 {
1895 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001896 return( ret );
1897 }
1898
Paul Bakker1ef83d62012-04-11 12:09:53 +00001899 ssl->out_msglen = 6 + n + offset;
Paul Bakker5121ce52009-01-03 21:22:43 +00001900 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1901 ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY;
1902
1903 ssl->state++;
1904
1905 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1906 {
1907 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1908 return( ret );
1909 }
1910
1911 SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
1912
Paul Bakkered27a042013-04-18 22:46:23 +02001913 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001914}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001915#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1916 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1917 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001918
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02001919static int ssl_parse_new_session_ticket( ssl_context *ssl )
1920{
1921 int ret;
1922 uint32_t lifetime;
1923 size_t ticket_len;
1924 unsigned char *ticket;
1925
1926 SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
1927
1928 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1929 {
1930 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1931 return( ret );
1932 }
1933
1934 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1935 {
1936 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
1937 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1938 }
1939
1940 /*
1941 * struct {
1942 * uint32 ticket_lifetime_hint;
1943 * opaque ticket<0..2^16-1>;
1944 * } NewSessionTicket;
1945 *
1946 * 0 . 0 handshake message type
1947 * 1 . 3 handshake message length
1948 * 4 . 7 ticket_lifetime_hint
1949 * 8 . 9 ticket_len (n)
1950 * 10 . 9+n ticket content
1951 */
1952 if( ssl->in_msg[0] != SSL_HS_NEW_SESSION_TICKET ||
1953 ssl->in_hslen < 10 )
1954 {
1955 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
1956 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
1957 }
1958
1959 lifetime = ( ssl->in_msg[4] << 24 ) | ( ssl->in_msg[5] << 16 ) |
1960 ( ssl->in_msg[6] << 8 ) | ( ssl->in_msg[7] );
1961
1962 ticket_len = ( ssl->in_msg[8] << 8 ) | ( ssl->in_msg[9] );
1963
1964 if( ticket_len + 10 != ssl->in_hslen )
1965 {
1966 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
1967 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
1968 }
1969
1970 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
1971
1972 SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
1973
1974 /*
1975 * Zero-length ticket means the server changed his mind and doesn't want
1976 * to send a ticket after all, so just forget it
1977 */
1978 if( ticket_len == 0)
1979 return( 0 );
1980
1981 polarssl_free( ssl->session_negotiate->ticket );
1982 ssl->session_negotiate->ticket = NULL;
1983 ssl->session_negotiate->ticket_len = 0;
1984
1985 if( ( ticket = polarssl_malloc( ticket_len ) ) == NULL )
1986 {
1987 SSL_DEBUG_MSG( 1, ( "ticket malloc failed" ) );
1988 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
1989 }
1990
1991 memcpy( ticket, ssl->in_msg + 10, ticket_len );
1992
1993 ssl->session_negotiate->ticket = ticket;
1994 ssl->session_negotiate->ticket_len = ticket_len;
1995 ssl->session_negotiate->ticket_lifetime = lifetime;
1996
1997 /*
1998 * RFC 5077 section 3.4:
1999 * "If the client receives a session ticket from the server, then it
2000 * discards any Session ID that was sent in the ServerHello."
2001 */
2002 SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
2003 ssl->session_negotiate->length = 0;
2004
2005 SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
2006
2007 return( 0 );
2008}
2009
Paul Bakker5121ce52009-01-03 21:22:43 +00002010/*
Paul Bakker1961b702013-01-25 14:49:24 +01002011 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00002012 */
Paul Bakker1961b702013-01-25 14:49:24 +01002013int ssl_handshake_client_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002014{
2015 int ret = 0;
2016
Paul Bakker1961b702013-01-25 14:49:24 +01002017 if( ssl->state == SSL_HANDSHAKE_OVER )
2018 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002019
Paul Bakker1961b702013-01-25 14:49:24 +01002020 SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
2021
2022 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
2023 return( ret );
2024
2025 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00002026 {
Paul Bakker1961b702013-01-25 14:49:24 +01002027 case SSL_HELLO_REQUEST:
2028 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002029 break;
2030
Paul Bakker1961b702013-01-25 14:49:24 +01002031 /*
2032 * ==> ClientHello
2033 */
2034 case SSL_CLIENT_HELLO:
2035 ret = ssl_write_client_hello( ssl );
2036 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002037
Paul Bakker1961b702013-01-25 14:49:24 +01002038 /*
2039 * <== ServerHello
2040 * Certificate
2041 * ( ServerKeyExchange )
2042 * ( CertificateRequest )
2043 * ServerHelloDone
2044 */
2045 case SSL_SERVER_HELLO:
2046 ret = ssl_parse_server_hello( ssl );
2047 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002048
Paul Bakker1961b702013-01-25 14:49:24 +01002049 case SSL_SERVER_CERTIFICATE:
2050 ret = ssl_parse_certificate( ssl );
2051 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002052
Paul Bakker1961b702013-01-25 14:49:24 +01002053 case SSL_SERVER_KEY_EXCHANGE:
2054 ret = ssl_parse_server_key_exchange( ssl );
2055 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002056
Paul Bakker1961b702013-01-25 14:49:24 +01002057 case SSL_CERTIFICATE_REQUEST:
2058 ret = ssl_parse_certificate_request( ssl );
2059 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002060
Paul Bakker1961b702013-01-25 14:49:24 +01002061 case SSL_SERVER_HELLO_DONE:
2062 ret = ssl_parse_server_hello_done( ssl );
2063 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002064
Paul Bakker1961b702013-01-25 14:49:24 +01002065 /*
2066 * ==> ( Certificate/Alert )
2067 * ClientKeyExchange
2068 * ( CertificateVerify )
2069 * ChangeCipherSpec
2070 * Finished
2071 */
2072 case SSL_CLIENT_CERTIFICATE:
2073 ret = ssl_write_certificate( ssl );
2074 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002075
Paul Bakker1961b702013-01-25 14:49:24 +01002076 case SSL_CLIENT_KEY_EXCHANGE:
2077 ret = ssl_write_client_key_exchange( ssl );
2078 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002079
Paul Bakker1961b702013-01-25 14:49:24 +01002080 case SSL_CERTIFICATE_VERIFY:
2081 ret = ssl_write_certificate_verify( ssl );
2082 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002083
Paul Bakker1961b702013-01-25 14:49:24 +01002084 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
2085 ret = ssl_write_change_cipher_spec( ssl );
2086 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002087
Paul Bakker1961b702013-01-25 14:49:24 +01002088 case SSL_CLIENT_FINISHED:
2089 ret = ssl_write_finished( ssl );
2090 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002091
Paul Bakker1961b702013-01-25 14:49:24 +01002092 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002093 * <== ( NewSessionTicket )
2094 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01002095 * Finished
2096 */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002097 case SSL_SERVER_NEW_SESSION_TICKET:
2098 ret = ssl_parse_new_session_ticket( ssl );
2099 break;
2100
Paul Bakker1961b702013-01-25 14:49:24 +01002101 case SSL_SERVER_CHANGE_CIPHER_SPEC:
2102 ret = ssl_parse_change_cipher_spec( ssl );
2103 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002104
Paul Bakker1961b702013-01-25 14:49:24 +01002105 case SSL_SERVER_FINISHED:
2106 ret = ssl_parse_finished( ssl );
2107 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002108
Paul Bakker1961b702013-01-25 14:49:24 +01002109 case SSL_FLUSH_BUFFERS:
2110 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
2111 ssl->state = SSL_HANDSHAKE_WRAPUP;
2112 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002113
Paul Bakker1961b702013-01-25 14:49:24 +01002114 case SSL_HANDSHAKE_WRAPUP:
2115 ssl_handshake_wrapup( ssl );
2116 break;
Paul Bakker48916f92012-09-16 19:57:18 +00002117
Paul Bakker1961b702013-01-25 14:49:24 +01002118 default:
2119 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
2120 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
2121 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002122
2123 return( ret );
2124}
Paul Bakker5121ce52009-01-03 21:22:43 +00002125#endif