blob: f603cffc1cc45f7be29366f14ed6a79ab0330b49 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 client-side functions
3 *
Manuel Pégourié-Gonnarda658a402015-01-23 09:45:19 +00004 * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +00006 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakkerb96f1542010-07-18 20:36:00 +00007 *
Paul Bakker5121ce52009-01-03 21:22:43 +00008 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020023#if !defined(POLARSSL_CONFIG_FILE)
Paul Bakker40e46942009-01-03 21:51:57 +000024#include "polarssl/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020025#else
26#include POLARSSL_CONFIG_FILE
27#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000028
Paul Bakker40e46942009-01-03 21:51:57 +000029#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000030
Paul Bakker40e46942009-01-03 21:51:57 +000031#include "polarssl/debug.h"
32#include "polarssl/ssl.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Rich Evans00ab4702015-02-06 13:43:58 +000034#include <string.h>
35
Paul Bakker7dc4c442014-02-01 22:50:26 +010036#if defined(POLARSSL_PLATFORM_C)
37#include "polarssl/platform.h"
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020038#else
Rich Evans00ab4702015-02-06 13:43:58 +000039#include <stdlib.h>
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020040#define polarssl_malloc malloc
41#define polarssl_free free
42#endif
43
Paul Bakkerfa6a6202013-10-28 18:48:30 +010044#if defined(_MSC_VER) && !defined(EFIX64) && !defined(EFI32)
Paul Bakkerfa9b1002013-07-03 15:31:03 +020045#include <basetsd.h>
46typedef UINT32 uint32_t;
47#else
48#include <inttypes.h>
49#endif
50
51#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +000052#include <time.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020053#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000054
Paul Bakker34617722014-06-13 17:20:13 +020055#if defined(POLARSSL_SSL_SESSION_TICKETS)
56/* Implementation that should never be optimized out by the compiler */
57static void polarssl_zeroize( void *v, size_t n ) {
58 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
59}
60#endif
61
Paul Bakker0be444a2013-08-27 21:55:01 +020062#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +010063static void ssl_write_hostname_ext( ssl_context *ssl,
64 unsigned char *buf,
65 size_t *olen )
66{
67 unsigned char *p = buf;
68
69 *olen = 0;
70
Paul Bakker66d5d072014-06-17 16:39:18 +020071 if( ssl->hostname == NULL )
Paul Bakkerd3edc862013-03-20 16:07:17 +010072 return;
73
74 SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
75 ssl->hostname ) );
76
77 /*
78 * struct {
79 * NameType name_type;
80 * select (name_type) {
81 * case host_name: HostName;
82 * } name;
83 * } ServerName;
84 *
85 * enum {
86 * host_name(0), (255)
87 * } NameType;
88 *
89 * opaque HostName<1..2^16-1>;
90 *
91 * struct {
92 * ServerName server_name_list<1..2^16-1>
93 * } ServerNameList;
94 */
95 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
96 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME ) & 0xFF );
97
98 *p++ = (unsigned char)( ( (ssl->hostname_len + 5) >> 8 ) & 0xFF );
99 *p++ = (unsigned char)( ( (ssl->hostname_len + 5) ) & 0xFF );
100
101 *p++ = (unsigned char)( ( (ssl->hostname_len + 3) >> 8 ) & 0xFF );
102 *p++ = (unsigned char)( ( (ssl->hostname_len + 3) ) & 0xFF );
103
104 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
105 *p++ = (unsigned char)( ( ssl->hostname_len >> 8 ) & 0xFF );
106 *p++ = (unsigned char)( ( ssl->hostname_len ) & 0xFF );
107
108 memcpy( p, ssl->hostname, ssl->hostname_len );
109
110 *olen = ssl->hostname_len + 9;
111}
Paul Bakker0be444a2013-08-27 21:55:01 +0200112#endif /* POLARSSL_SSL_SERVER_NAME_INDICATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100113
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100114#if defined(POLARSSL_SSL_RENEGOTIATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100115static void ssl_write_renegotiation_ext( ssl_context *ssl,
116 unsigned char *buf,
117 size_t *olen )
118{
119 unsigned char *p = buf;
120
121 *olen = 0;
122
123 if( ssl->renegotiation != SSL_RENEGOTIATION )
124 return;
125
126 SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
127
128 /*
129 * Secure renegotiation
130 */
131 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
132 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
133
134 *p++ = 0x00;
135 *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
136 *p++ = ssl->verify_data_len & 0xFF;
137
138 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
139
140 *olen = 5 + ssl->verify_data_len;
141}
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100142#endif /* POLARSSL_SSL_RENEGOTIATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100143
Manuel Pégourié-Gonnardd9423232014-12-02 11:57:29 +0100144/*
145 * Only if we handle at least one key exchange that needs signatures.
146 */
147#if defined(POLARSSL_SSL_PROTO_TLS1_2) && \
148 defined(POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100149static void ssl_write_signature_algorithms_ext( ssl_context *ssl,
150 unsigned char *buf,
151 size_t *olen )
152{
153 unsigned char *p = buf;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100154 size_t sig_alg_len = 0;
Manuel Pégourié-Gonnard5bfd9682014-06-24 15:18:11 +0200155#if defined(POLARSSL_RSA_C) || defined(POLARSSL_ECDSA_C)
156 unsigned char *sig_alg_list = buf + 6;
157#endif
Paul Bakkerd3edc862013-03-20 16:07:17 +0100158
159 *olen = 0;
160
161 if( ssl->max_minor_ver != SSL_MINOR_VERSION_3 )
162 return;
163
164 SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
165
166 /*
167 * Prepare signature_algorithms extension (TLS 1.2)
168 */
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200169#if defined(POLARSSL_RSA_C)
Paul Bakker9e36f042013-06-30 14:34:05 +0200170#if defined(POLARSSL_SHA512_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100171 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA512;
172 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
173 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA384;
174 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
175#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200176#if defined(POLARSSL_SHA256_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100177 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA256;
178 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
179 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA224;
180 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
181#endif
182#if defined(POLARSSL_SHA1_C)
183 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA1;
184 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
185#endif
186#if defined(POLARSSL_MD5_C)
187 sig_alg_list[sig_alg_len++] = SSL_HASH_MD5;
188 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
189#endif
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200190#endif /* POLARSSL_RSA_C */
191#if defined(POLARSSL_ECDSA_C)
192#if defined(POLARSSL_SHA512_C)
193 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA512;
194 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
195 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA384;
196 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
197#endif
198#if defined(POLARSSL_SHA256_C)
199 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA256;
200 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
201 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA224;
202 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
203#endif
204#if defined(POLARSSL_SHA1_C)
205 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA1;
206 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
207#endif
208#if defined(POLARSSL_MD5_C)
209 sig_alg_list[sig_alg_len++] = SSL_HASH_MD5;
210 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
211#endif
212#endif /* POLARSSL_ECDSA_C */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100213
214 /*
215 * enum {
216 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
217 * sha512(6), (255)
218 * } HashAlgorithm;
219 *
220 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
221 * SignatureAlgorithm;
222 *
223 * struct {
224 * HashAlgorithm hash;
225 * SignatureAlgorithm signature;
226 * } SignatureAndHashAlgorithm;
227 *
228 * SignatureAndHashAlgorithm
229 * supported_signature_algorithms<2..2^16-2>;
230 */
231 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
232 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG ) & 0xFF );
233
234 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
235 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
236
237 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
238 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
239
Paul Bakkerd3edc862013-03-20 16:07:17 +0100240 *olen = 6 + sig_alg_len;
241}
Manuel Pégourié-Gonnardd9423232014-12-02 11:57:29 +0100242#endif /* POLARSSL_SSL_PROTO_TLS1_2 &&
243 POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100244
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200245#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100246static void ssl_write_supported_elliptic_curves_ext( ssl_context *ssl,
247 unsigned char *buf,
248 size_t *olen )
249{
250 unsigned char *p = buf;
Manuel Pégourié-Gonnard8e205fc2014-01-23 17:27:10 +0100251 unsigned char *elliptic_curve_list = p + 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100252 size_t elliptic_curve_len = 0;
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100253 const ecp_curve_info *info;
254#if defined(POLARSSL_SSL_SET_CURVES)
255 const ecp_group_id *grp_id;
Paul Bakker0910f322014-02-06 13:41:18 +0100256#else
257 ((void) ssl);
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100258#endif
Paul Bakkerd3edc862013-03-20 16:07:17 +0100259
260 *olen = 0;
261
262 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
263
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100264#if defined(POLARSSL_SSL_SET_CURVES)
265 for( grp_id = ssl->curve_list; *grp_id != POLARSSL_ECP_DP_NONE; grp_id++ )
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200266 {
Manuel Pégourié-Gonnardcd49f762014-02-04 15:14:13 +0100267 info = ecp_curve_info_from_grp_id( *grp_id );
268#else
269 for( info = ecp_curve_list(); info->grp_id != POLARSSL_ECP_DP_NONE; info++ )
270 {
271#endif
272
273 elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8;
274 elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF;
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200275 }
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200276
277 if( elliptic_curve_len == 0 )
278 return;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100279
280 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
281 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
282
283 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
284 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
285
286 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
287 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
288
Paul Bakkerd3edc862013-03-20 16:07:17 +0100289 *olen = 6 + elliptic_curve_len;
290}
291
292static void ssl_write_supported_point_formats_ext( ssl_context *ssl,
293 unsigned char *buf,
294 size_t *olen )
295{
296 unsigned char *p = buf;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200297 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100298
299 *olen = 0;
300
301 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
302
303 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
304 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
305
306 *p++ = 0x00;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100307 *p++ = 2;
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200308
309 *p++ = 1;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100310 *p++ = POLARSSL_ECP_PF_UNCOMPRESSED;
311
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200312 *olen = 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100313}
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200314#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100315
Paul Bakker05decb22013-08-15 13:33:48 +0200316#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200317static void ssl_write_max_fragment_length_ext( ssl_context *ssl,
318 unsigned char *buf,
319 size_t *olen )
320{
321 unsigned char *p = buf;
322
323 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ) {
324 *olen = 0;
325 return;
326 }
327
328 SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
329
330 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
331 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
332
333 *p++ = 0x00;
334 *p++ = 1;
335
336 *p++ = ssl->mfl_code;
337
338 *olen = 5;
339}
Paul Bakker05decb22013-08-15 13:33:48 +0200340#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200341
Paul Bakker1f2bc622013-08-15 13:45:55 +0200342#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200343static void ssl_write_truncated_hmac_ext( ssl_context *ssl,
344 unsigned char *buf, size_t *olen )
345{
346 unsigned char *p = buf;
347
348 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED )
349 {
350 *olen = 0;
351 return;
352 }
353
354 SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
355
356 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
357 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
358
359 *p++ = 0x00;
360 *p++ = 0x00;
361
362 *olen = 4;
363}
Paul Bakker1f2bc622013-08-15 13:45:55 +0200364#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200365
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100366#if defined(POLARSSL_SSL_ENCRYPT_THEN_MAC)
367static void ssl_write_encrypt_then_mac_ext( ssl_context *ssl,
368 unsigned char *buf, size_t *olen )
369{
370 unsigned char *p = buf;
371
372 if( ssl->encrypt_then_mac == SSL_ETM_DISABLED ||
373 ssl->max_minor_ver == SSL_MINOR_VERSION_0 )
374 {
375 *olen = 0;
376 return;
377 }
378
379 SSL_DEBUG_MSG( 3, ( "client hello, adding encrypt_then_mac "
380 "extension" ) );
381
382 *p++ = (unsigned char)( ( TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
383 *p++ = (unsigned char)( ( TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF );
384
385 *p++ = 0x00;
386 *p++ = 0x00;
387
388 *olen = 4;
389}
390#endif /* POLARSSL_SSL_ENCRYPT_THEN_MAC */
391
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200392#if defined(POLARSSL_SSL_EXTENDED_MASTER_SECRET)
393static void ssl_write_extended_ms_ext( ssl_context *ssl,
394 unsigned char *buf, size_t *olen )
395{
396 unsigned char *p = buf;
397
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200398 if( ssl->extended_ms == SSL_EXTENDED_MS_DISABLED ||
399 ssl->max_minor_ver == SSL_MINOR_VERSION_0 )
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200400 {
401 *olen = 0;
402 return;
403 }
404
405 SSL_DEBUG_MSG( 3, ( "client hello, adding extended_master_secret "
406 "extension" ) );
407
408 *p++ = (unsigned char)( ( TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
409 *p++ = (unsigned char)( ( TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF );
410
411 *p++ = 0x00;
412 *p++ = 0x00;
413
414 *olen = 4;
415}
416#endif /* POLARSSL_SSL_EXTENDED_MASTER_SECRET */
417
Paul Bakkera503a632013-08-14 13:48:06 +0200418#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200419static void ssl_write_session_ticket_ext( ssl_context *ssl,
420 unsigned char *buf, size_t *olen )
421{
422 unsigned char *p = buf;
423 size_t tlen = ssl->session_negotiate->ticket_len;
424
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200425 if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED )
426 {
427 *olen = 0;
428 return;
429 }
430
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200431 SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
432
433 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
434 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET ) & 0xFF );
435
436 *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
437 *p++ = (unsigned char)( ( tlen ) & 0xFF );
438
439 *olen = 4;
440
441 if( ssl->session_negotiate->ticket == NULL ||
442 ssl->session_negotiate->ticket_len == 0 )
443 {
444 return;
445 }
446
447 SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
448
449 memcpy( p, ssl->session_negotiate->ticket, tlen );
450
451 *olen += tlen;
452}
Paul Bakkera503a632013-08-14 13:48:06 +0200453#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200454
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200455#if defined(POLARSSL_SSL_ALPN)
456static void ssl_write_alpn_ext( ssl_context *ssl,
457 unsigned char *buf, size_t *olen )
458{
459 unsigned char *p = buf;
460 const char **cur;
461
462 if( ssl->alpn_list == NULL )
463 {
464 *olen = 0;
465 return;
466 }
467
Manuel Pégourié-Gonnardf6521de2014-04-07 12:42:04 +0200468 SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200469
470 *p++ = (unsigned char)( ( TLS_EXT_ALPN >> 8 ) & 0xFF );
471 *p++ = (unsigned char)( ( TLS_EXT_ALPN ) & 0xFF );
472
473 /*
474 * opaque ProtocolName<1..2^8-1>;
475 *
476 * struct {
477 * ProtocolName protocol_name_list<2..2^16-1>
478 * } ProtocolNameList;
479 */
480
481 /* Skip writing extension and list length for now */
482 p += 4;
483
484 for( cur = ssl->alpn_list; *cur != NULL; cur++ )
485 {
486 *p = (unsigned char)( strlen( *cur ) & 0xFF );
487 memcpy( p + 1, *cur, *p );
488 p += 1 + *p;
489 }
490
491 *olen = p - buf;
492
493 /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
494 buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
495 buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF );
496
497 /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
498 buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
499 buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF );
500}
501#endif /* POLARSSL_SSL_ALPN */
502
Paul Bakker5121ce52009-01-03 21:22:43 +0000503static int ssl_write_client_hello( ssl_context *ssl )
504{
Paul Bakker23986e52011-04-24 08:57:21 +0000505 int ret;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100506 size_t i, n, olen, ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000507 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200508 unsigned char *p, *q;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200509#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000510 time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200511#endif
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200512 const int *ciphersuites;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200513 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000514
515 SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
516
Paul Bakkera9a028e2013-11-21 17:31:06 +0100517 if( ssl->f_rng == NULL )
518 {
519 SSL_DEBUG_MSG( 1, ( "no RNG provided") );
520 return( POLARSSL_ERR_SSL_NO_RNG );
521 }
522
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100523#if defined(POLARSSL_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +0000524 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100525#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000526 {
Paul Bakker993d11d2012-09-28 15:00:12 +0000527 ssl->major_ver = ssl->min_major_ver;
528 ssl->minor_ver = ssl->min_minor_ver;
Paul Bakker48916f92012-09-16 19:57:18 +0000529 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000530
Paul Bakker490ecc82011-10-06 13:04:09 +0000531 if( ssl->max_major_ver == 0 && ssl->max_minor_ver == 0 )
532 {
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200533 ssl->max_major_ver = SSL_MAX_MAJOR_VERSION;
534 ssl->max_minor_ver = SSL_MAX_MINOR_VERSION;
Paul Bakker490ecc82011-10-06 13:04:09 +0000535 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000536
537 /*
538 * 0 . 0 handshake type
539 * 1 . 3 handshake length
540 * 4 . 5 highest version supported
541 * 6 . 9 current UNIX time
542 * 10 . 37 random bytes
543 */
544 buf = ssl->out_msg;
545 p = buf + 4;
546
547 *p++ = (unsigned char) ssl->max_major_ver;
548 *p++ = (unsigned char) ssl->max_minor_ver;
549
550 SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
551 buf[4], buf[5] ) );
552
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200553#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000554 t = time( NULL );
555 *p++ = (unsigned char)( t >> 24 );
556 *p++ = (unsigned char)( t >> 16 );
557 *p++ = (unsigned char)( t >> 8 );
558 *p++ = (unsigned char)( t );
559
560 SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200561#else
562 if( ( ret = ssl->f_rng( ssl->p_rng, p, 4 ) ) != 0 )
563 return( ret );
564
565 p += 4;
Paul Bakker9af723c2014-05-01 13:03:14 +0200566#endif /* POLARSSL_HAVE_TIME */
Paul Bakker5121ce52009-01-03 21:22:43 +0000567
Paul Bakkera3d195c2011-11-27 21:07:34 +0000568 if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
569 return( ret );
570
571 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +0000572
Paul Bakker48916f92012-09-16 19:57:18 +0000573 memcpy( ssl->handshake->randbytes, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000574
575 SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 6, 32 );
576
577 /*
578 * 38 . 38 session id length
579 * 39 . 39+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000580 * 40+n . 41+n ciphersuitelist length
581 * 42+n . .. ciphersuitelist
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000582 * .. . .. compression methods length
583 * .. . .. compression methods
584 * .. . .. extensions length
585 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +0000586 */
Paul Bakker48916f92012-09-16 19:57:18 +0000587 n = ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +0000588
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100589 if( n < 16 || n > 32 ||
590#if defined(POLARSSL_SSL_RENEGOTIATION)
591 ssl->renegotiation != SSL_INITIAL_HANDSHAKE ||
592#endif
Paul Bakker0a597072012-09-25 21:55:46 +0000593 ssl->handshake->resume == 0 )
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200594 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000595 n = 0;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200596 }
597
Paul Bakkera503a632013-08-14 13:48:06 +0200598#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200599 /*
600 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
601 * generate and include a Session ID in the TLS ClientHello."
602 */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100603#if defined(POLARSSL_SSL_RENEGOTIATION)
604 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000605#endif
Manuel Pégourié-Gonnard51bccd32015-03-10 16:09:08 +0000606 {
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000607 if( ssl->session_negotiate->ticket != NULL &&
608 ssl->session_negotiate->ticket_len != 0 )
609 {
610 ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id, 32 );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200611
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000612 if( ret != 0 )
613 return( ret );
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200614
Manuel Pégourié-Gonnard59c6f2e2015-01-22 11:06:40 +0000615 ssl->session_negotiate->length = n = 32;
616 }
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200617 }
Paul Bakkera503a632013-08-14 13:48:06 +0200618#endif /* POLARSSL_SSL_SESSION_TICKETS */
Paul Bakker5121ce52009-01-03 21:22:43 +0000619
620 *p++ = (unsigned char) n;
621
622 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000623 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000624
625 SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
626 SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
627
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200628 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
Paul Bakker2fbefde2013-06-29 16:01:15 +0200629 n = 0;
630 q = p;
631
632 // Skip writing ciphersuite length for now
633 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000634
Paul Bakker2fbefde2013-06-29 16:01:15 +0200635 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000636 {
Paul Bakker2fbefde2013-06-29 16:01:15 +0200637 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
638
639 if( ciphersuite_info == NULL )
640 continue;
641
642 if( ciphersuite_info->min_minor_ver > ssl->max_minor_ver ||
643 ciphersuite_info->max_minor_ver < ssl->min_minor_ver )
644 continue;
645
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +0100646 if( ssl->arc4_disabled == SSL_ARC4_DISABLED &&
647 ciphersuite_info->cipher == POLARSSL_CIPHER_ARC4_128 )
648 continue;
649
Paul Bakkere3166ce2011-01-27 17:40:50 +0000650 SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %2d",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200651 ciphersuites[i] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000652
Paul Bakker2fbefde2013-06-29 16:01:15 +0200653 n++;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200654 *p++ = (unsigned char)( ciphersuites[i] >> 8 );
655 *p++ = (unsigned char)( ciphersuites[i] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000656 }
657
Manuel Pégourié-Gonnard5d9cde22015-01-22 10:49:41 +0000658 /*
659 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
660 */
661#if defined(POLARSSL_SSL_RENEGOTIATION)
662 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
663#endif
664 {
665 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
666 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO );
667 n++;
668 }
669
Manuel Pégourié-Gonnard1cbd39d2014-10-20 13:34:59 +0200670 /* Some versions of OpenSSL don't handle it correctly if not at end */
671#if defined(POLARSSL_SSL_FALLBACK_SCSV)
672 if( ssl->fallback == SSL_IS_FALLBACK )
673 {
674 SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) );
675 *p++ = (unsigned char)( SSL_FALLBACK_SCSV >> 8 );
676 *p++ = (unsigned char)( SSL_FALLBACK_SCSV );
677 n++;
678 }
679#endif
680
Paul Bakker2fbefde2013-06-29 16:01:15 +0200681 *q++ = (unsigned char)( n >> 7 );
682 *q++ = (unsigned char)( n << 1 );
683
684 SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
685
686
Paul Bakker2770fbd2012-07-03 13:30:23 +0000687#if defined(POLARSSL_ZLIB_SUPPORT)
688 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
689 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000690 SSL_COMPRESS_DEFLATE, SSL_COMPRESS_NULL ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000691
692 *p++ = 2;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000693 *p++ = SSL_COMPRESS_DEFLATE;
Paul Bakker48916f92012-09-16 19:57:18 +0000694 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000695#else
Paul Bakker5121ce52009-01-03 21:22:43 +0000696 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000697 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", SSL_COMPRESS_NULL ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000698
699 *p++ = 1;
700 *p++ = SSL_COMPRESS_NULL;
Paul Bakker9af723c2014-05-01 13:03:14 +0200701#endif /* POLARSSL_ZLIB_SUPPORT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000702
Paul Bakkerd3edc862013-03-20 16:07:17 +0100703 // First write extensions, then the total length
704 //
Paul Bakker0be444a2013-08-27 21:55:01 +0200705#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100706 ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
707 ext_len += olen;
Paul Bakker0be444a2013-08-27 21:55:01 +0200708#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000709
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100710#if defined(POLARSSL_SSL_RENEGOTIATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100711 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
712 ext_len += olen;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100713#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000714
Manuel Pégourié-Gonnardd9423232014-12-02 11:57:29 +0100715#if defined(POLARSSL_SSL_PROTO_TLS1_2) && \
716 defined(POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100717 ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
718 ext_len += olen;
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200719#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000720
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200721#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100722 ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
723 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100724
Paul Bakkerd3edc862013-03-20 16:07:17 +0100725 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
726 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100727#endif
728
Paul Bakker05decb22013-08-15 13:33:48 +0200729#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200730 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
731 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +0200732#endif
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200733
Paul Bakker1f2bc622013-08-15 13:45:55 +0200734#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200735 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
736 ext_len += olen;
Paul Bakker1f2bc622013-08-15 13:45:55 +0200737#endif
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200738
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100739#if defined(POLARSSL_SSL_ENCRYPT_THEN_MAC)
740 ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );
741 ext_len += olen;
742#endif
743
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200744#if defined(POLARSSL_SSL_EXTENDED_MASTER_SECRET)
745 ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );
746 ext_len += olen;
747#endif
748
Paul Bakkera503a632013-08-14 13:48:06 +0200749#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200750 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
751 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +0200752#endif
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200753
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200754#if defined(POLARSSL_SSL_ALPN)
755 ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
756 ext_len += olen;
757#endif
758
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +0100759 /* olen unused if all extensions are disabled */
760 ((void) olen);
761
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000762 SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
763 ext_len ) );
764
Paul Bakkera7036632014-04-30 10:15:38 +0200765 if( ext_len > 0 )
766 {
767 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
768 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
769 p += ext_len;
770 }
Paul Bakker41c83d32013-03-20 14:39:14 +0100771
Paul Bakker5121ce52009-01-03 21:22:43 +0000772 ssl->out_msglen = p - buf;
773 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
774 ssl->out_msg[0] = SSL_HS_CLIENT_HELLO;
775
776 ssl->state++;
777
778 if( ( ret = ssl_write_record( ssl ) ) != 0 )
779 {
780 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
781 return( ret );
782 }
783
784 SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
785
786 return( 0 );
787}
788
Paul Bakker48916f92012-09-16 19:57:18 +0000789static int ssl_parse_renegotiation_info( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200790 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +0000791 size_t len )
792{
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000793 int ret;
794
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100795#if defined(POLARSSL_SSL_RENEGOTIATION)
796 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +0000797 {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +0100798 /* Check verify-data in constant-time. The length OTOH is no secret */
Paul Bakker48916f92012-09-16 19:57:18 +0000799 if( len != 1 + ssl->verify_data_len * 2 ||
800 buf[0] != ssl->verify_data_len * 2 ||
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +0100801 safer_memcmp( buf + 1,
802 ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
803 safer_memcmp( buf + 1 + ssl->verify_data_len,
804 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +0000805 {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100806 SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000807
808 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
809 return( ret );
810
Paul Bakker48916f92012-09-16 19:57:18 +0000811 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
812 }
813 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100814 else
815#endif /* POLARSSL_SSL_RENEGOTIATION */
816 {
817 if( len != 1 || buf[0] != 0x00 )
818 {
819 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) );
820
821 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
822 return( ret );
823
824 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
825 }
826
827 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
828 }
Paul Bakker48916f92012-09-16 19:57:18 +0000829
830 return( 0 );
831}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200832
Paul Bakker05decb22013-08-15 13:33:48 +0200833#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200834static int ssl_parse_max_fragment_length_ext( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200835 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200836 size_t len )
837{
838 /*
839 * server should use the extension only if we did,
840 * and if so the server's value should match ours (and len is always 1)
841 */
842 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ||
843 len != 1 ||
844 buf[0] != ssl->mfl_code )
845 {
846 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
847 }
848
849 return( 0 );
850}
Paul Bakker05decb22013-08-15 13:33:48 +0200851#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Paul Bakker48916f92012-09-16 19:57:18 +0000852
Paul Bakker1f2bc622013-08-15 13:45:55 +0200853#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200854static int ssl_parse_truncated_hmac_ext( ssl_context *ssl,
855 const unsigned char *buf,
856 size_t len )
857{
858 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED ||
859 len != 0 )
860 {
861 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
862 }
863
864 ((void) buf);
865
866 ssl->session_negotiate->trunc_hmac = SSL_TRUNC_HMAC_ENABLED;
867
868 return( 0 );
869}
Paul Bakker1f2bc622013-08-15 13:45:55 +0200870#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200871
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100872#if defined(POLARSSL_SSL_ENCRYPT_THEN_MAC)
873static int ssl_parse_encrypt_then_mac_ext( ssl_context *ssl,
874 const unsigned char *buf,
875 size_t len )
876{
877 if( ssl->encrypt_then_mac == SSL_ETM_DISABLED ||
878 ssl->minor_ver == SSL_MINOR_VERSION_0 ||
879 len != 0 )
880 {
881 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
882 }
883
884 ((void) buf);
885
886 ssl->session_negotiate->encrypt_then_mac = SSL_ETM_ENABLED;
887
888 return( 0 );
889}
890#endif /* POLARSSL_SSL_ENCRYPT_THEN_MAC */
891
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200892#if defined(POLARSSL_SSL_EXTENDED_MASTER_SECRET)
893static int ssl_parse_extended_ms_ext( ssl_context *ssl,
894 const unsigned char *buf,
895 size_t len )
896{
897 if( ssl->extended_ms == SSL_EXTENDED_MS_DISABLED ||
Manuel Pégourié-Gonnardb575b542014-10-24 15:12:31 +0200898 ssl->minor_ver == SSL_MINOR_VERSION_0 ||
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200899 len != 0 )
900 {
901 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
902 }
903
904 ((void) buf);
905
906 ssl->handshake->extended_ms = SSL_EXTENDED_MS_ENABLED;
907
908 return( 0 );
909}
910#endif /* POLARSSL_SSL_EXTENDED_MASTER_SECRET */
911
Paul Bakkera503a632013-08-14 13:48:06 +0200912#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200913static int ssl_parse_session_ticket_ext( ssl_context *ssl,
914 const unsigned char *buf,
915 size_t len )
916{
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200917 if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED ||
918 len != 0 )
919 {
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200920 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200921 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200922
923 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +0200924
925 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200926
927 return( 0 );
928}
Paul Bakkera503a632013-08-14 13:48:06 +0200929#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200930
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200931#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200932static int ssl_parse_supported_point_formats_ext( ssl_context *ssl,
933 const unsigned char *buf,
934 size_t len )
935{
936 size_t list_size;
937 const unsigned char *p;
938
939 list_size = buf[0];
940 if( list_size + 1 != len )
941 {
942 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
943 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
944 }
945
Manuel Pégourié-Gonnardfd35af12014-06-23 14:10:13 +0200946 p = buf + 1;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200947 while( list_size > 0 )
948 {
949 if( p[0] == POLARSSL_ECP_PF_UNCOMPRESSED ||
950 p[0] == POLARSSL_ECP_PF_COMPRESSED )
951 {
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200952 ssl->handshake->ecdh_ctx.point_format = p[0];
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200953 SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
954 return( 0 );
955 }
956
957 list_size--;
958 p++;
959 }
960
Manuel Pégourié-Gonnard5c1f0322014-06-23 14:24:43 +0200961 SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
962 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200963}
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200964#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200965
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200966#if defined(POLARSSL_SSL_ALPN)
967static int ssl_parse_alpn_ext( ssl_context *ssl,
968 const unsigned char *buf, size_t len )
969{
970 size_t list_len, name_len;
971 const char **p;
972
973 /* If we didn't send it, the server shouldn't send it */
974 if( ssl->alpn_list == NULL )
975 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
976
977 /*
978 * opaque ProtocolName<1..2^8-1>;
979 *
980 * struct {
981 * ProtocolName protocol_name_list<2..2^16-1>
982 * } ProtocolNameList;
983 *
984 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
985 */
986
987 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
988 if( len < 4 )
989 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
990
991 list_len = ( buf[0] << 8 ) | buf[1];
992 if( list_len != len - 2 )
993 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
994
995 name_len = buf[2];
996 if( name_len != list_len - 1 )
997 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
998
999 /* Check that the server chosen protocol was in our list and save it */
1000 for( p = ssl->alpn_list; *p != NULL; p++ )
1001 {
1002 if( name_len == strlen( *p ) &&
1003 memcmp( buf + 3, *p, name_len ) == 0 )
1004 {
1005 ssl->alpn_chosen = *p;
1006 return( 0 );
1007 }
1008 }
1009
1010 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1011}
1012#endif /* POLARSSL_SSL_ALPN */
1013
Paul Bakker5121ce52009-01-03 21:22:43 +00001014static int ssl_parse_server_hello( ssl_context *ssl )
1015{
Paul Bakker2770fbd2012-07-03 13:30:23 +00001016 int ret, i, comp;
Paul Bakker23986e52011-04-24 08:57:21 +00001017 size_t n;
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001018 size_t ext_len;
Paul Bakker48916f92012-09-16 19:57:18 +00001019 unsigned char *buf, *ext;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001020#if defined(POLARSSL_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001021 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001022#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001023 int handshake_failure = 0;
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01001024 const ssl_ciphersuite_t *suite_info;
Manuel Pégourié-Gonnard1032c1d2013-09-18 17:18:34 +02001025#if defined(POLARSSL_DEBUG_C)
1026 uint32_t t;
1027#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001028
1029 SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
1030
1031 /*
1032 * 0 . 0 handshake type
1033 * 1 . 3 handshake length
1034 * 4 . 5 protocol version
1035 * 6 . 9 UNIX time()
1036 * 10 . 37 random bytes
1037 */
1038 buf = ssl->in_msg;
1039
1040 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1041 {
1042 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1043 return( ret );
1044 }
1045
1046 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1047 {
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001048#if defined(POLARSSL_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001049 if( ssl->renegotiation == SSL_RENEGOTIATION )
1050 {
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001051 ssl->renego_records_seen++;
1052
1053 if( ssl->renego_max_records >= 0 &&
1054 ssl->renego_records_seen > ssl->renego_max_records )
1055 {
1056 SSL_DEBUG_MSG( 1, ( "renegotiation requested, "
1057 "but not honored by server" ) );
1058 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1059 }
1060
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001061 SSL_DEBUG_MSG( 1, ( "non-handshake message during renego" ) );
1062 return( POLARSSL_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );
1063 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001064#endif /* POLARSSL_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001065
Paul Bakker5121ce52009-01-03 21:22:43 +00001066 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001067 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001068 }
1069
1070 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
1071 buf[4], buf[5] ) );
1072
1073 if( ssl->in_hslen < 42 ||
1074 buf[0] != SSL_HS_SERVER_HELLO ||
1075 buf[4] != SSL_MAJOR_VERSION_3 )
1076 {
1077 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001078 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001079 }
1080
Paul Bakker2e11f7d2010-07-25 14:24:53 +00001081 if( buf[5] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +00001082 {
1083 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001084 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001085 }
1086
1087 ssl->minor_ver = buf[5];
1088
Paul Bakker1d29fb52012-09-28 13:28:45 +00001089 if( ssl->minor_ver < ssl->min_minor_ver )
1090 {
1091 SSL_DEBUG_MSG( 1, ( "server only supports ssl smaller than minimum"
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001092 " [%d:%d] < [%d:%d]", ssl->major_ver,
1093 ssl->minor_ver, buf[4], buf[5] ) );
Paul Bakker1d29fb52012-09-28 13:28:45 +00001094
1095 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
1096 SSL_ALERT_MSG_PROTOCOL_VERSION );
1097
1098 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
1099 }
1100
Paul Bakker1504af52012-02-11 16:17:43 +00001101#if defined(POLARSSL_DEBUG_C)
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001102 t = ( (uint32_t) buf[6] << 24 )
1103 | ( (uint32_t) buf[7] << 16 )
1104 | ( (uint32_t) buf[8] << 8 )
1105 | ( (uint32_t) buf[9] );
Manuel Pégourié-Gonnard1032c1d2013-09-18 17:18:34 +02001106 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
Paul Bakker87e5cda2012-01-14 18:14:15 +00001107#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001108
Paul Bakker48916f92012-09-16 19:57:18 +00001109 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001110
1111 n = buf[38];
1112
Paul Bakker5121ce52009-01-03 21:22:43 +00001113 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
1114
Paul Bakker48916f92012-09-16 19:57:18 +00001115 if( n > 32 )
1116 {
1117 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1118 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1119 }
1120
Paul Bakker5121ce52009-01-03 21:22:43 +00001121 /*
1122 * 38 . 38 session id length
1123 * 39 . 38+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +00001124 * 39+n . 40+n chosen ciphersuite
Paul Bakker5121ce52009-01-03 21:22:43 +00001125 * 41+n . 41+n chosen compression alg.
1126 * 42+n . 43+n extensions length
1127 * 44+n . 44+n+m extensions
1128 */
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001129 if( ssl->in_hslen > 43 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +00001130 {
1131 ext_len = ( ( buf[42 + n] << 8 )
Paul Bakker48916f92012-09-16 19:57:18 +00001132 | ( buf[43 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001133
Paul Bakker48916f92012-09-16 19:57:18 +00001134 if( ( ext_len > 0 && ext_len < 4 ) ||
1135 ssl->in_hslen != 44 + n + ext_len )
1136 {
1137 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1138 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1139 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001140 }
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001141 else if( ssl->in_hslen == 42 + n )
1142 {
1143 ext_len = 0;
1144 }
1145 else
1146 {
1147 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1148 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1149 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001150
1151 i = ( buf[39 + n] << 8 ) | buf[40 + n];
Paul Bakker2770fbd2012-07-03 13:30:23 +00001152 comp = buf[41 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +00001153
Paul Bakker380da532012-04-18 16:10:25 +00001154 /*
1155 * Initialize update checksum functions
1156 */
Paul Bakker68884e32013-01-07 18:20:04 +01001157 ssl->transform_negotiate->ciphersuite_info = ssl_ciphersuite_from_id( i );
1158
1159 if( ssl->transform_negotiate->ciphersuite_info == NULL )
1160 {
Manuel Pégourié-Gonnard3c599f12014-03-10 13:25:07 +01001161 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", i ) );
Paul Bakker68884e32013-01-07 18:20:04 +01001162 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1163 }
Paul Bakker380da532012-04-18 16:10:25 +00001164
Manuel Pégourié-Gonnard3c599f12014-03-10 13:25:07 +01001165 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
1166
Paul Bakker5121ce52009-01-03 21:22:43 +00001167 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
1168 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
1169
1170 /*
1171 * Check if the session can be resumed
1172 */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001173 if( ssl->handshake->resume == 0 || n == 0 ||
1174#if defined(POLARSSL_SSL_RENEGOTIATION)
1175 ssl->renegotiation != SSL_INITIAL_HANDSHAKE ||
1176#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001177 ssl->session_negotiate->ciphersuite != i ||
1178 ssl->session_negotiate->compression != comp ||
1179 ssl->session_negotiate->length != n ||
1180 memcmp( ssl->session_negotiate->id, buf + 39, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001181 {
1182 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +00001183 ssl->handshake->resume = 0;
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001184#if defined(POLARSSL_HAVE_TIME)
Paul Bakker48916f92012-09-16 19:57:18 +00001185 ssl->session_negotiate->start = time( NULL );
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001186#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001187 ssl->session_negotiate->ciphersuite = i;
1188 ssl->session_negotiate->compression = comp;
1189 ssl->session_negotiate->length = n;
1190 memcpy( ssl->session_negotiate->id, buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001191 }
1192 else
1193 {
1194 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +00001195
1196 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1197 {
1198 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1199 return( ret );
1200 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001201 }
1202
1203 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +00001204 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001205
Paul Bakkere3166ce2011-01-27 17:40:50 +00001206 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", i ) );
Paul Bakker5121ce52009-01-03 21:22:43 +00001207 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[41 + n] ) );
1208
Manuel Pégourié-Gonnardbd47a582015-01-12 13:43:29 +01001209 suite_info = ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite );
1210 if( suite_info == NULL ||
1211 ( ssl->arc4_disabled &&
1212 suite_info->cipher == POLARSSL_CIPHER_ARC4_128 ) )
1213 {
1214 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1215 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1216 }
1217
1218
Paul Bakker5121ce52009-01-03 21:22:43 +00001219 i = 0;
1220 while( 1 )
1221 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001222 if( ssl->ciphersuite_list[ssl->minor_ver][i] == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001223 {
1224 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001225 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001226 }
1227
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001228 if( ssl->ciphersuite_list[ssl->minor_ver][i++] ==
1229 ssl->session_negotiate->ciphersuite )
1230 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001231 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001232 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001233 }
1234
Paul Bakker2770fbd2012-07-03 13:30:23 +00001235 if( comp != SSL_COMPRESS_NULL
1236#if defined(POLARSSL_ZLIB_SUPPORT)
1237 && comp != SSL_COMPRESS_DEFLATE
1238#endif
1239 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001240 {
1241 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001242 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +00001243 }
Paul Bakker48916f92012-09-16 19:57:18 +00001244 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +00001245
Paul Bakker48916f92012-09-16 19:57:18 +00001246 ext = buf + 44 + n;
1247
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001248 SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) );
1249
Paul Bakker48916f92012-09-16 19:57:18 +00001250 while( ext_len )
1251 {
1252 unsigned int ext_id = ( ( ext[0] << 8 )
1253 | ( ext[1] ) );
1254 unsigned int ext_size = ( ( ext[2] << 8 )
1255 | ( ext[3] ) );
1256
1257 if( ext_size + 4 > ext_len )
1258 {
1259 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1260 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1261 }
1262
1263 switch( ext_id )
1264 {
1265 case TLS_EXT_RENEGOTIATION_INFO:
1266 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001267#if defined(POLARSSL_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001268 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001269#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001270
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001271 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4,
1272 ext_size ) ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +00001273 return( ret );
1274
1275 break;
1276
Paul Bakker05decb22013-08-15 13:33:48 +02001277#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001278 case TLS_EXT_MAX_FRAGMENT_LENGTH:
1279 SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
1280
1281 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
1282 ext + 4, ext_size ) ) != 0 )
1283 {
1284 return( ret );
1285 }
1286
1287 break;
Paul Bakker05decb22013-08-15 13:33:48 +02001288#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001289
Paul Bakker1f2bc622013-08-15 13:45:55 +02001290#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001291 case TLS_EXT_TRUNCATED_HMAC:
1292 SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
1293
1294 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
1295 ext + 4, ext_size ) ) != 0 )
1296 {
1297 return( ret );
1298 }
1299
1300 break;
Paul Bakker1f2bc622013-08-15 13:45:55 +02001301#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +02001302
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001303#if defined(POLARSSL_SSL_ENCRYPT_THEN_MAC)
1304 case TLS_EXT_ENCRYPT_THEN_MAC:
1305 SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) );
1306
1307 if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl,
1308 ext + 4, ext_size ) ) != 0 )
1309 {
1310 return( ret );
1311 }
1312
1313 break;
1314#endif /* POLARSSL_SSL_ENCRYPT_THEN_MAC */
1315
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001316#if defined(POLARSSL_SSL_EXTENDED_MASTER_SECRET)
1317 case TLS_EXT_EXTENDED_MASTER_SECRET:
1318 SSL_DEBUG_MSG( 3, ( "found extended_master_secret extension" ) );
1319
1320 if( ( ret = ssl_parse_extended_ms_ext( ssl,
1321 ext + 4, ext_size ) ) != 0 )
1322 {
1323 return( ret );
1324 }
1325
1326 break;
1327#endif /* POLARSSL_SSL_EXTENDED_MASTER_SECRET */
1328
Paul Bakkera503a632013-08-14 13:48:06 +02001329#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001330 case TLS_EXT_SESSION_TICKET:
1331 SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
1332
1333 if( ( ret = ssl_parse_session_ticket_ext( ssl,
1334 ext + 4, ext_size ) ) != 0 )
1335 {
1336 return( ret );
1337 }
1338
1339 break;
Paul Bakkera503a632013-08-14 13:48:06 +02001340#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001341
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +02001342#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001343 case TLS_EXT_SUPPORTED_POINT_FORMATS:
1344 SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
1345
1346 if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
1347 ext + 4, ext_size ) ) != 0 )
1348 {
1349 return( ret );
1350 }
1351
1352 break;
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +02001353#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001354
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001355#if defined(POLARSSL_SSL_ALPN)
1356 case TLS_EXT_ALPN:
1357 SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
1358
1359 if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )
1360 return( ret );
1361
1362 break;
1363#endif /* POLARSSL_SSL_ALPN */
1364
Paul Bakker48916f92012-09-16 19:57:18 +00001365 default:
1366 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
1367 ext_id ) );
1368 }
1369
1370 ext_len -= 4 + ext_size;
1371 ext += 4 + ext_size;
1372
1373 if( ext_len > 0 && ext_len < 4 )
1374 {
1375 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1376 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1377 }
1378 }
1379
1380 /*
1381 * Renegotiation security checks
1382 */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001383 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1384 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00001385 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001386 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
1387 handshake_failure = 1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001388 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001389#if defined(POLARSSL_SSL_RENEGOTIATION)
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001390 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1391 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
1392 renegotiation_info_seen == 0 )
1393 {
1394 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
1395 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +00001396 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001397 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1398 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1399 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00001400 {
1401 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001402 handshake_failure = 1;
1403 }
1404 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1405 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1406 renegotiation_info_seen == 1 )
1407 {
1408 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
1409 handshake_failure = 1;
1410 }
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001411#endif /* POLARSSL_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001412
1413 if( handshake_failure == 1 )
1414 {
1415 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
1416 return( ret );
1417
Paul Bakker48916f92012-09-16 19:57:18 +00001418 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1419 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001420
1421 SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
1422
1423 return( 0 );
1424}
1425
Manuel Pégourié-Gonnarde511ffc2013-08-22 17:33:21 +02001426#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1427 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001428static int ssl_parse_server_dh_params( ssl_context *ssl, unsigned char **p,
1429 unsigned char *end )
1430{
1431 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1432
Paul Bakker29e1f122013-04-16 13:07:56 +02001433 /*
1434 * Ephemeral DH parameters:
1435 *
1436 * struct {
1437 * opaque dh_p<1..2^16-1>;
1438 * opaque dh_g<1..2^16-1>;
1439 * opaque dh_Ys<1..2^16-1>;
1440 * } ServerDHParams;
1441 */
1442 if( ( ret = dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
1443 {
1444 SSL_DEBUG_RET( 2, ( "dhm_read_params" ), ret );
1445 return( ret );
1446 }
1447
Manuel Pégourié-Gonnard9ea1b232015-06-29 15:27:52 +02001448 if( ssl->handshake->dhm_ctx.len < SSL_MIN_DHM_BYTES ||
Paul Bakker29e1f122013-04-16 13:07:56 +02001449 ssl->handshake->dhm_ctx.len > 512 )
1450 {
1451 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (DHM length)" ) );
1452 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1453 }
1454
1455 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
1456 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
1457 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +02001458
1459 return( ret );
1460}
Manuel Pégourié-Gonnarde511ffc2013-08-22 17:33:21 +02001461#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1462 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001463
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001464#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02001465 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001466 defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
1467 defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
1468 defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
1469static int ssl_check_server_ecdh_params( const ssl_context *ssl )
1470{
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01001471 const ecp_curve_info *curve_info;
1472
1473 curve_info = ecp_curve_info_from_grp_id( ssl->handshake->ecdh_ctx.grp.id );
1474 if( curve_info == NULL )
1475 {
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02001476 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1477 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardc3f6b62c2014-02-06 10:13:09 +01001478 }
1479
1480 SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001481
Manuel Pégourié-Gonnard29f777e2015-04-03 17:26:50 +02001482#if defined(POLARSSL_SSL_SET_CURVES)
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01001483 if( ! ssl_curve_is_acceptable( ssl, ssl->handshake->ecdh_ctx.grp.id ) )
1484#else
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001485 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
1486 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01001487#endif
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001488 return( -1 );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001489
1490 SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
1491
1492 return( 0 );
1493}
Paul Bakker9af723c2014-05-01 13:03:14 +02001494#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
1495 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
1496 POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
1497 POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
1498 POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001499
1500#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1501 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02001502 defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001503static int ssl_parse_server_ecdh_params( ssl_context *ssl,
1504 unsigned char **p,
1505 unsigned char *end )
1506{
1507 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1508
Paul Bakker29e1f122013-04-16 13:07:56 +02001509 /*
1510 * Ephemeral ECDH parameters:
1511 *
1512 * struct {
1513 * ECParameters curve_params;
1514 * ECPoint public;
1515 * } ServerECDHParams;
1516 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001517 if( ( ret = ecdh_read_params( &ssl->handshake->ecdh_ctx,
1518 (const unsigned char **) p, end ) ) != 0 )
1519 {
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +02001520 SSL_DEBUG_RET( 1, ( "ecdh_read_params" ), ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02001521 return( ret );
1522 }
1523
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001524 if( ssl_check_server_ecdh_params( ssl ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02001525 {
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01001526 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDHE curve)" ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001527 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1528 }
1529
Paul Bakker29e1f122013-04-16 13:07:56 +02001530 return( ret );
1531}
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001532#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02001533 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
1534 POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001535
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02001536#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001537static int ssl_parse_server_psk_hint( ssl_context *ssl,
1538 unsigned char **p,
1539 unsigned char *end )
1540{
1541 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001542 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001543 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001544
1545 /*
1546 * PSK parameters:
1547 *
1548 * opaque psk_identity_hint<0..2^16-1>;
1549 */
Manuel Pégourié-Gonnard59b9fe22013-10-15 11:55:33 +02001550 len = (*p)[0] << 8 | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001551 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001552
1553 if( (*p) + len > end )
1554 {
1555 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
1556 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1557 }
1558
1559 // TODO: Retrieve PSK identity hint and callback to app
1560 //
1561 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001562 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001563
1564 return( ret );
1565}
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02001566#endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001567
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001568#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) || \
1569 defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
1570/*
1571 * Generate a pre-master secret and encrypt it with the server's RSA key
1572 */
1573static int ssl_write_encrypted_pms( ssl_context *ssl,
1574 size_t offset, size_t *olen,
1575 size_t pms_offset )
1576{
1577 int ret;
1578 size_t len_bytes = ssl->minor_ver == SSL_MINOR_VERSION_0 ? 0 : 2;
1579 unsigned char *p = ssl->handshake->premaster + pms_offset;
1580
Manuel Pégourié-Gonnard65125542015-08-27 16:37:35 +02001581 if( offset + len_bytes > SSL_MAX_CONTENT_LEN )
1582 {
1583 SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) );
1584 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1585 }
1586
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001587 /*
1588 * Generate (part of) the pre-master as
1589 * struct {
1590 * ProtocolVersion client_version;
1591 * opaque random[46];
1592 * } PreMasterSecret;
1593 */
1594 p[0] = (unsigned char) ssl->max_major_ver;
1595 p[1] = (unsigned char) ssl->max_minor_ver;
1596
1597 if( ( ret = ssl->f_rng( ssl->p_rng, p + 2, 46 ) ) != 0 )
1598 {
1599 SSL_DEBUG_RET( 1, "f_rng", ret );
1600 return( ret );
1601 }
1602
1603 ssl->handshake->pmslen = 48;
1604
Manuel Pégourié-Gonnardbb564e02015-09-03 10:44:32 +02001605 if( ssl->session_negotiate->peer_cert == NULL )
1606 {
1607 SSL_DEBUG_MSG( 2, ( "certificate required" ) );
1608 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1609 }
1610
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001611 /*
1612 * Now write it out, encrypted
1613 */
1614 if( ! pk_can_do( &ssl->session_negotiate->peer_cert->pk,
1615 POLARSSL_PK_RSA ) )
1616 {
1617 SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
1618 return( POLARSSL_ERR_SSL_PK_TYPE_MISMATCH );
1619 }
1620
1621 if( ( ret = pk_encrypt( &ssl->session_negotiate->peer_cert->pk,
1622 p, ssl->handshake->pmslen,
1623 ssl->out_msg + offset + len_bytes, olen,
1624 SSL_MAX_CONTENT_LEN - offset - len_bytes,
1625 ssl->f_rng, ssl->p_rng ) ) != 0 )
1626 {
1627 SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret );
1628 return( ret );
1629 }
1630
1631#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
1632 defined(POLARSSL_SSL_PROTO_TLS1_2)
1633 if( len_bytes == 2 )
1634 {
1635 ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 );
1636 ssl->out_msg[offset+1] = (unsigned char)( *olen );
1637 *olen += 2;
1638 }
1639#endif
1640
1641 return( 0 );
1642}
1643#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED ||
1644 POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001645
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001646#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001647#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001648 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1649 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001650static int ssl_parse_signature_algorithm( ssl_context *ssl,
1651 unsigned char **p,
1652 unsigned char *end,
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001653 md_type_t *md_alg,
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001654 pk_type_t *pk_alg )
Paul Bakker29e1f122013-04-16 13:07:56 +02001655{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001656 ((void) ssl);
Paul Bakker29e1f122013-04-16 13:07:56 +02001657 *md_alg = POLARSSL_MD_NONE;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001658 *pk_alg = POLARSSL_PK_NONE;
1659
1660 /* Only in TLS 1.2 */
1661 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
1662 {
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001663 return( 0 );
1664 }
Paul Bakker29e1f122013-04-16 13:07:56 +02001665
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001666 if( (*p) + 2 > end )
Paul Bakker29e1f122013-04-16 13:07:56 +02001667 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1668
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001669 /*
1670 * Get hash algorithm
1671 */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02001672 if( ( *md_alg = ssl_md_alg_from_hash( (*p)[0] ) ) == POLARSSL_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02001673 {
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02001674 SSL_DEBUG_MSG( 2, ( "Server used unsupported "
1675 "HashAlgorithm %d", *(p)[0] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001676 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1677 }
1678
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001679 /*
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001680 * Get signature algorithm
1681 */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02001682 if( ( *pk_alg = ssl_pk_alg_from_sig( (*p)[1] ) ) == POLARSSL_PK_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02001683 {
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02001684 SSL_DEBUG_MSG( 2, ( "server used unsupported "
1685 "SignatureAlgorithm %d", (*p)[1] ) );
1686 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02001687 }
1688
1689 SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
1690 SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
1691 *p += 2;
1692
1693 return( 0 );
1694}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001695#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001696 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
1697 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001698#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001699
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001700
1701#if defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
1702 defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
1703static int ssl_get_ecdh_params_from_cert( ssl_context *ssl )
1704{
1705 int ret;
1706 const ecp_keypair *peer_key;
1707
Manuel Pégourié-Gonnardbb564e02015-09-03 10:44:32 +02001708 if( ssl->session_negotiate->peer_cert == NULL )
1709 {
1710 SSL_DEBUG_MSG( 2, ( "certificate required" ) );
1711 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1712 }
1713
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001714 if( ! pk_can_do( &ssl->session_negotiate->peer_cert->pk,
1715 POLARSSL_PK_ECKEY ) )
1716 {
1717 SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
1718 return( POLARSSL_ERR_SSL_PK_TYPE_MISMATCH );
1719 }
1720
1721 peer_key = pk_ec( ssl->session_negotiate->peer_cert->pk );
1722
1723 if( ( ret = ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
1724 POLARSSL_ECDH_THEIRS ) ) != 0 )
1725 {
1726 SSL_DEBUG_RET( 1, ( "ecdh_get_params" ), ret );
1727 return( ret );
1728 }
1729
1730 if( ssl_check_server_ecdh_params( ssl ) != 0 )
1731 {
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01001732 SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) );
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001733 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
1734 }
1735
1736 return( ret );
1737}
1738#endif /* POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
1739 POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
1740
Paul Bakker41c83d32013-03-20 14:39:14 +01001741static int ssl_parse_server_key_exchange( ssl_context *ssl )
1742{
Paul Bakker23986e52011-04-24 08:57:21 +00001743 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001744 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001745 unsigned char *p, *end;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001746#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001747 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1748 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001749 size_t sig_len, params_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001750 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +02001751 md_type_t md_alg = POLARSSL_MD_NONE;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001752 size_t hashlen;
1753 pk_type_t pk_alg = POLARSSL_PK_NONE;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001754#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001755
1756 SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
1757
Manuel Pégourié-Gonnardbac0e3b2013-10-15 11:54:47 +02001758#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001759 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001760 {
1761 SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
1762 ssl->state++;
1763 return( 0 );
1764 }
Manuel Pégourié-Gonnardbac0e3b2013-10-15 11:54:47 +02001765 ((void) p);
1766 ((void) end);
1767#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001768
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001769#if defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
1770 defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
1771 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_RSA ||
1772 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_ECDSA )
1773 {
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01001774 if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 )
1775 {
1776 SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret );
1777 return( ret );
1778 }
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001779
1780 SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
1781 ssl->state++;
1782 return( 0 );
1783 }
1784 ((void) p);
1785 ((void) end);
Paul Bakker9af723c2014-05-01 13:03:14 +02001786#endif /* POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
1787 POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001788
Paul Bakker5121ce52009-01-03 21:22:43 +00001789 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1790 {
1791 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1792 return( ret );
1793 }
1794
1795 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1796 {
1797 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001798 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001799 }
1800
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001801 /*
1802 * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
1803 * doesn't use a psk_identity_hint
1804 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001805 if( ssl->in_msg[0] != SSL_HS_SERVER_KEY_EXCHANGE )
1806 {
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001807 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1808 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK )
Paul Bakker188c8de2013-04-19 09:13:37 +02001809 {
1810 ssl->record_read = 1;
1811 goto exit;
1812 }
1813
1814 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1815 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001816 }
1817
Paul Bakker3b6a07b2013-03-21 11:56:50 +01001818 p = ssl->in_msg + 4;
1819 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001820 SSL_DEBUG_BUF( 3, "server key exchange", p, ssl->in_hslen - 4 );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01001821
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001822#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
1823 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1824 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
1825 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
1826 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
1827 {
1828 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
1829 {
1830 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1831 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1832 }
1833 } /* FALLTROUGH */
1834#endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
1835
1836#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
1837 defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
1838 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1839 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK )
1840 ; /* nothing more to do */
1841 else
1842#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
1843 POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED */
1844#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1845 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1846 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1847 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00001848 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001849 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001850 {
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001851 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001852 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1853 }
1854 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001855 else
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001856#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1857 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001858#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001859 defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001860 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
1861 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA ||
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001862 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK ||
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001863 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001864 {
1865 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
1866 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001867 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1868 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1869 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001870 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001871 else
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001872#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001873 POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001874 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001875 {
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001876 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02001877 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001878 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001879
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001880#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001881 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1882 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001883 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001884 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA ||
1885 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001886 {
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001887 params_len = p - ( ssl->in_msg + 4 );
1888
Paul Bakker29e1f122013-04-16 13:07:56 +02001889 /*
1890 * Handle the digitally-signed structure
1891 */
Paul Bakker9659dae2013-08-28 16:21:34 +02001892#if defined(POLARSSL_SSL_PROTO_TLS1_2)
1893 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001894 {
Paul Bakker9659dae2013-08-28 16:21:34 +02001895 if( ssl_parse_signature_algorithm( ssl, &p, end,
1896 &md_alg, &pk_alg ) != 0 )
1897 {
1898 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1899 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1900 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001901
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02001902 if( pk_alg != ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001903 {
1904 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1905 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1906 }
1907 }
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02001908 else
Paul Bakker9af723c2014-05-01 13:03:14 +02001909#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker9659dae2013-08-28 16:21:34 +02001910#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
1911 defined(POLARSSL_SSL_PROTO_TLS1_1)
1912 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02001913 {
1914 pk_alg = ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
Paul Bakker1ef83d62012-04-11 12:09:53 +00001915
Paul Bakker9659dae2013-08-28 16:21:34 +02001916 /* Default hash for ECDSA is SHA-1 */
1917 if( pk_alg == POLARSSL_PK_ECDSA && md_alg == POLARSSL_MD_NONE )
1918 md_alg = POLARSSL_MD_SHA1;
1919 }
1920 else
1921#endif
1922 {
1923 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02001924 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakker9659dae2013-08-28 16:21:34 +02001925 }
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02001926
1927 /*
1928 * Read signature
1929 */
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001930 sig_len = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00001931 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001932
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001933 if( end != p + sig_len )
Paul Bakker41c83d32013-03-20 14:39:14 +01001934 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001935 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001936 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1937 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001938
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02001939 SSL_DEBUG_BUF( 3, "signature", p, sig_len );
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001940
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001941 /*
1942 * Compute the hash that has been signed
1943 */
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001944#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
1945 defined(POLARSSL_SSL_PROTO_TLS1_1)
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02001946 if( md_alg == POLARSSL_MD_NONE )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001947 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001948 md5_context md5;
1949 sha1_context sha1;
1950
Paul Bakker5b4af392014-06-26 12:09:34 +02001951 md5_init( &md5 );
1952 sha1_init( &sha1 );
1953
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02001954 hashlen = 36;
1955
Paul Bakker29e1f122013-04-16 13:07:56 +02001956 /*
1957 * digitally-signed struct {
1958 * opaque md5_hash[16];
1959 * opaque sha_hash[20];
1960 * };
1961 *
1962 * md5_hash
1963 * MD5(ClientHello.random + ServerHello.random
1964 * + ServerParams);
1965 * sha_hash
1966 * SHA(ClientHello.random + ServerHello.random
1967 * + ServerParams);
1968 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001969 md5_starts( &md5 );
1970 md5_update( &md5, ssl->handshake->randbytes, 64 );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001971 md5_update( &md5, ssl->in_msg + 4, params_len );
Paul Bakker29e1f122013-04-16 13:07:56 +02001972 md5_finish( &md5, hash );
1973
1974 sha1_starts( &sha1 );
1975 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001976 sha1_update( &sha1, ssl->in_msg + 4, params_len );
Paul Bakker29e1f122013-04-16 13:07:56 +02001977 sha1_finish( &sha1, hash + 16 );
Paul Bakker5b4af392014-06-26 12:09:34 +02001978
1979 md5_free( &md5 );
1980 sha1_free( &sha1 );
Paul Bakker29e1f122013-04-16 13:07:56 +02001981 }
1982 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001983#endif /* POLARSSL_SSL_PROTO_SSL3 || POLARSSL_SSL_PROTO_TLS1 || \
1984 POLARSSL_SSL_PROTO_TLS1_1 */
Paul Bakker9659dae2013-08-28 16:21:34 +02001985#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
1986 defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker577e0062013-08-28 11:57:20 +02001987 if( md_alg != POLARSSL_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02001988 {
1989 md_context_t ctx;
1990
Paul Bakker84bbeb52014-07-01 14:53:22 +02001991 md_init( &ctx );
1992
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02001993 /* Info from md_alg will be used instead */
1994 hashlen = 0;
Paul Bakker29e1f122013-04-16 13:07:56 +02001995
1996 /*
1997 * digitally-signed struct {
1998 * opaque client_random[32];
1999 * opaque server_random[32];
2000 * ServerDHParams params;
2001 * };
2002 */
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02002003 if( ( ret = md_init_ctx( &ctx,
2004 md_info_from_type( md_alg ) ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02002005 {
2006 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
2007 return( ret );
2008 }
2009
2010 md_starts( &ctx );
2011 md_update( &ctx, ssl->handshake->randbytes, 64 );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002012 md_update( &ctx, ssl->in_msg + 4, params_len );
Paul Bakker29e1f122013-04-16 13:07:56 +02002013 md_finish( &ctx, hash );
Paul Bakker84bbeb52014-07-01 14:53:22 +02002014 md_free( &ctx );
Paul Bakker29e1f122013-04-16 13:07:56 +02002015 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002016 else
Paul Bakker9659dae2013-08-28 16:21:34 +02002017#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
2018 POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02002019 {
Paul Bakker577e0062013-08-28 11:57:20 +02002020 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02002021 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02002022 }
Paul Bakker29e1f122013-04-16 13:07:56 +02002023
Manuel Pégourié-Gonnard9cc6f5c2013-08-27 14:29:44 +02002024 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen != 0 ? hashlen :
2025 (unsigned int) ( md_info_from_type( md_alg ) )->size );
Paul Bakker29e1f122013-04-16 13:07:56 +02002026
Manuel Pégourié-Gonnardbb564e02015-09-03 10:44:32 +02002027 if( ssl->session_negotiate->peer_cert == NULL )
2028 {
2029 SSL_DEBUG_MSG( 2, ( "certificate required" ) );
2030 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
2031 }
2032
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002033 /*
2034 * Verify signature
2035 */
Manuel Pégourié-Gonnardf4842822013-08-22 16:03:41 +02002036 if( ! pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002037 {
2038 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2039 return( POLARSSL_ERR_SSL_PK_TYPE_MISMATCH );
2040 }
2041
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02002042 if( ( ret = pk_verify( &ssl->session_negotiate->peer_cert->pk,
2043 md_alg, hash, hashlen, p, sig_len ) ) != 0 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002044 {
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02002045 SSL_DEBUG_RET( 1, "pk_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02002046 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00002047 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002048 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002049#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02002050 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2051 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002052
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002053exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00002054 ssl->state++;
2055
2056 SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
2057
2058 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00002059}
2060
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002061#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
2062 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
2063 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
2064 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
2065static int ssl_parse_certificate_request( ssl_context *ssl )
2066{
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002067 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
2068
2069 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
2070
2071 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2072 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
2073 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
2074 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
2075 {
2076 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
2077 ssl->state++;
2078 return( 0 );
2079 }
2080
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02002081 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2082 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002083}
2084#else
Paul Bakker5121ce52009-01-03 21:22:43 +00002085static int ssl_parse_certificate_request( ssl_context *ssl )
2086{
2087 int ret;
Paul Bakker926af752012-11-23 13:38:07 +01002088 unsigned char *buf, *p;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01002089 size_t n = 0, m = 0;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002090 size_t cert_type_len = 0, dn_len = 0;
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002091 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002092
2093 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
2094
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002095 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
2096 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
2097 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
2098 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
2099 {
2100 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
2101 ssl->state++;
2102 return( 0 );
2103 }
2104
Paul Bakker5121ce52009-01-03 21:22:43 +00002105 /*
2106 * 0 . 0 handshake type
2107 * 1 . 3 handshake length
Paul Bakker926af752012-11-23 13:38:07 +01002108 * 4 . 4 cert type count
2109 * 5 .. m-1 cert types
2110 * m .. m+1 sig alg length (TLS 1.2 only)
2111 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00002112 * n .. n+1 length of all DNs
2113 * n+2 .. n+3 length of DN 1
2114 * n+4 .. ... Distinguished Name #1
2115 * ... .. ... length of DN 2, etc.
2116 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002117 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002118 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002119 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2120 {
2121 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2122 return( ret );
2123 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002124
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002125 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2126 {
2127 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
2128 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
2129 }
2130
2131 ssl->record_read = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00002132 }
2133
2134 ssl->client_auth = 0;
2135 ssl->state++;
2136
2137 if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST )
2138 ssl->client_auth++;
2139
2140 SSL_DEBUG_MSG( 3, ( "got %s certificate request",
2141 ssl->client_auth ? "a" : "no" ) );
2142
Paul Bakker926af752012-11-23 13:38:07 +01002143 if( ssl->client_auth == 0 )
2144 goto exit;
2145
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002146 ssl->record_read = 0;
2147
Paul Bakker926af752012-11-23 13:38:07 +01002148 // TODO: handshake_failure alert for an anonymous server to request
2149 // client authentication
2150
2151 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002152
Paul Bakker926af752012-11-23 13:38:07 +01002153 // Retrieve cert types
2154 //
2155 cert_type_len = buf[4];
2156 n = cert_type_len;
2157
2158 if( ssl->in_hslen < 6 + n )
2159 {
2160 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
2161 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
2162 }
2163
Paul Bakker73d44312013-05-22 13:56:26 +02002164 p = buf + 5;
Paul Bakker926af752012-11-23 13:38:07 +01002165 while( cert_type_len > 0 )
2166 {
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002167#if defined(POLARSSL_RSA_C)
2168 if( *p == SSL_CERT_TYPE_RSA_SIGN &&
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002169 pk_can_do( ssl_own_key( ssl ), POLARSSL_PK_RSA ) )
Paul Bakker926af752012-11-23 13:38:07 +01002170 {
2171 ssl->handshake->cert_type = SSL_CERT_TYPE_RSA_SIGN;
2172 break;
2173 }
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002174 else
2175#endif
2176#if defined(POLARSSL_ECDSA_C)
2177 if( *p == SSL_CERT_TYPE_ECDSA_SIGN &&
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002178 pk_can_do( ssl_own_key( ssl ), POLARSSL_PK_ECDSA ) )
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002179 {
2180 ssl->handshake->cert_type = SSL_CERT_TYPE_ECDSA_SIGN;
2181 break;
2182 }
2183 else
2184#endif
2185 {
2186 ; /* Unsupported cert type, ignore */
2187 }
Paul Bakker926af752012-11-23 13:38:07 +01002188
2189 cert_type_len--;
2190 p++;
2191 }
2192
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002193#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker926af752012-11-23 13:38:07 +01002194 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
2195 {
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002196 /* Ignored, see comments about hash in write_certificate_verify */
2197 // TODO: should check the signature part against our pk_key though
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002198 size_t sig_alg_len = ( ( buf[5 + n] << 8 )
2199 | ( buf[6 + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01002200
2201 p = buf + 7 + n;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01002202 m += 2;
Paul Bakker926af752012-11-23 13:38:07 +01002203 n += sig_alg_len;
2204
2205 if( ssl->in_hslen < 6 + n )
2206 {
2207 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
2208 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
2209 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02002210 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002211#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker926af752012-11-23 13:38:07 +01002212
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002213 /* Ignore certificate_authorities, we only have one cert anyway */
2214 // TODO: should not send cert if no CA matches
Paul Bakker9c94cdd2013-01-22 13:45:33 +01002215 dn_len = ( ( buf[5 + m + n] << 8 )
2216 | ( buf[6 + m + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01002217
2218 n += dn_len;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01002219 if( ssl->in_hslen != 7 + m + n )
Paul Bakker926af752012-11-23 13:38:07 +01002220 {
2221 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
2222 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
2223 }
2224
2225exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00002226 SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
2227
2228 return( 0 );
2229}
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002230#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2231 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2232 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
2233 !POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002234
2235static int ssl_parse_server_hello_done( ssl_context *ssl )
2236{
2237 int ret;
2238
2239 SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
2240
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002241 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002242 {
2243 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2244 {
2245 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2246 return( ret );
2247 }
2248
2249 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2250 {
2251 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002252 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002253 }
2254 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002255 ssl->record_read = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002256
2257 if( ssl->in_hslen != 4 ||
2258 ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE )
2259 {
2260 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00002261 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00002262 }
2263
2264 ssl->state++;
2265
2266 SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
2267
2268 return( 0 );
2269}
2270
2271static int ssl_write_client_key_exchange( ssl_context *ssl )
2272{
Paul Bakker23986e52011-04-24 08:57:21 +00002273 int ret;
2274 size_t i, n;
Paul Bakker41c83d32013-03-20 14:39:14 +01002275 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002276
2277 SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
2278
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002279#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01002280 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00002281 {
Paul Bakker5121ce52009-01-03 21:22:43 +00002282 /*
2283 * DHM key exchange -- send G^X mod P
2284 */
Paul Bakker48916f92012-09-16 19:57:18 +00002285 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00002286
2287 ssl->out_msg[4] = (unsigned char)( n >> 8 );
2288 ssl->out_msg[5] = (unsigned char)( n );
2289 i = 6;
2290
Paul Bakker29b64762012-09-25 09:36:44 +00002291 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002292 (int) mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker5121ce52009-01-03 21:22:43 +00002293 &ssl->out_msg[i], n,
2294 ssl->f_rng, ssl->p_rng );
2295 if( ret != 0 )
2296 {
2297 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
2298 return( ret );
2299 }
2300
Paul Bakker48916f92012-09-16 19:57:18 +00002301 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
2302 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00002303
Manuel Pégourié-Gonnarddd0c0f32014-06-23 18:07:11 +02002304 ssl->handshake->pmslen = POLARSSL_PREMASTER_SIZE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002305
Paul Bakker48916f92012-09-16 19:57:18 +00002306 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
2307 ssl->handshake->premaster,
Manuel Pégourié-Gonnard2d627642013-09-04 14:22:07 +02002308 &ssl->handshake->pmslen,
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +02002309 ssl->f_rng, ssl->p_rng ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00002310 {
2311 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
2312 return( ret );
2313 }
2314
Paul Bakker48916f92012-09-16 19:57:18 +00002315 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00002316 }
2317 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002318#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02002319#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002320 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2321 defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2322 defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02002323 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA ||
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002324 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA ||
2325 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_RSA ||
2326 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_ECDSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01002327 {
2328 /*
2329 * ECDH key exchange -- send client public value
2330 */
2331 i = 4;
2332
2333 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx,
2334 &n,
2335 &ssl->out_msg[i], 1000,
2336 ssl->f_rng, ssl->p_rng );
2337 if( ret != 0 )
2338 {
2339 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
2340 return( ret );
2341 }
2342
2343 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
2344
2345 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
2346 &ssl->handshake->pmslen,
2347 ssl->handshake->premaster,
Manuel Pégourié-Gonnarde09d2f82013-09-02 14:29:09 +02002348 POLARSSL_MPI_MAX_SIZE,
2349 ssl->f_rng, ssl->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01002350 {
2351 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
2352 return( ret );
2353 }
2354
2355 SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
2356 }
2357 else
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02002358#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002359 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2360 POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2361 POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02002362#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002363 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002364 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002365 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
2366 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002367 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002368 /*
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002369 * opaque psk_identity<0..2^16-1>;
2370 */
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002371 if( ssl->psk == NULL || ssl->psk_identity == NULL )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002372 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
2373
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002374 i = 4;
2375 n = ssl->psk_identity_len;
Manuel Pégourié-Gonnard65125542015-08-27 16:37:35 +02002376
2377 if( i + 2 + n > SSL_MAX_CONTENT_LEN )
2378 {
2379 SSL_DEBUG_MSG( 1, ( "psk identity too long or "
2380 "SSL buffer too short" ) );
2381 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
2382 }
2383
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002384 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
2385 ssl->out_msg[i++] = (unsigned char)( n );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002386
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002387 memcpy( ssl->out_msg + i, ssl->psk_identity, ssl->psk_identity_len );
2388 i += ssl->psk_identity_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002389
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002390#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002391 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002392 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002393 n = 0;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002394 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002395 else
2396#endif
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002397#if defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
2398 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK )
2399 {
2400 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 )
2401 return( ret );
2402 }
2403 else
2404#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002405#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002406 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002407 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002408 /*
2409 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
2410 */
2411 n = ssl->handshake->dhm_ctx.len;
Manuel Pégourié-Gonnard65125542015-08-27 16:37:35 +02002412
2413 if( i + 2 + n > SSL_MAX_CONTENT_LEN )
2414 {
2415 SSL_DEBUG_MSG( 1, ( "psk identity or DHM size too long"
2416 " or SSL buffer too short" ) );
2417 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
2418 }
2419
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002420 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
2421 ssl->out_msg[i++] = (unsigned char)( n );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002422
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002423 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
Paul Bakker68881672013-10-15 13:24:01 +02002424 (int) mpi_size( &ssl->handshake->dhm_ctx.P ),
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002425 &ssl->out_msg[i], n,
2426 ssl->f_rng, ssl->p_rng );
2427 if( ret != 0 )
2428 {
2429 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
2430 return( ret );
2431 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002432 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002433 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002434#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02002435#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002436 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02002437 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002438 /*
2439 * ClientECDiffieHellmanPublic public;
2440 */
2441 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx, &n,
2442 &ssl->out_msg[i], SSL_MAX_CONTENT_LEN - i,
2443 ssl->f_rng, ssl->p_rng );
2444 if( ret != 0 )
2445 {
2446 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
2447 return( ret );
2448 }
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02002449
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002450 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
2451 }
2452 else
2453#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
2454 {
2455 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02002456 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002457 }
2458
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002459 if( ( ret = ssl_psk_derive_premaster( ssl,
2460 ciphersuite_info->key_exchange ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002461 {
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002462 SSL_DEBUG_RET( 1, "ssl_psk_derive_premaster", ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002463 return( ret );
2464 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002465 }
2466 else
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02002467#endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002468#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02002469 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00002470 {
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002471 i = 4;
2472 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +00002473 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002474 }
Paul Bakkered27a042013-04-18 22:46:23 +02002475 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002476#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02002477 {
2478 ((void) ciphersuite_info);
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002479 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02002480 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakkered27a042013-04-18 22:46:23 +02002481 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002482
Paul Bakker5121ce52009-01-03 21:22:43 +00002483 ssl->out_msglen = i + n;
2484 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2485 ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE;
2486
2487 ssl->state++;
2488
2489 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2490 {
2491 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2492 return( ret );
2493 }
2494
2495 SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
2496
2497 return( 0 );
2498}
2499
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002500#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
2501 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002502 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
2503 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00002504static int ssl_write_certificate_verify( ssl_context *ssl )
2505{
Paul Bakkered27a042013-04-18 22:46:23 +02002506 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02002507 int ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002508
2509 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
2510
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02002511 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
2512 {
2513 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
2514 return( ret );
2515 }
2516
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002517 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnarddc953e82013-11-25 17:27:39 +01002518 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
Manuel Pégourié-Gonnard1b62c7f2013-10-14 14:02:19 +02002519 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK ||
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002520 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02002521 {
2522 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
2523 ssl->state++;
2524 return( 0 );
2525 }
2526
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02002527 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2528 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002529}
2530#else
2531static int ssl_write_certificate_verify( ssl_context *ssl )
2532{
2533 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
2534 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
2535 size_t n = 0, offset = 0;
2536 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002537 unsigned char *hash_start = hash;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002538 md_type_t md_alg = POLARSSL_MD_NONE;
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02002539 unsigned int hashlen;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002540
2541 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
2542
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02002543 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
2544 {
2545 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
2546 return( ret );
2547 }
2548
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002549 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnarddc953e82013-11-25 17:27:39 +01002550 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
Manuel Pégourié-Gonnard1b62c7f2013-10-14 14:02:19 +02002551 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK ||
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002552 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
2553 {
2554 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
2555 ssl->state++;
2556 return( 0 );
2557 }
2558
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002559 if( ssl->client_auth == 0 || ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002560 {
2561 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
2562 ssl->state++;
2563 return( 0 );
2564 }
2565
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002566 if( ssl_own_key( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002567 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00002568 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
2569 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002570 }
2571
2572 /*
2573 * Make an RSA signature of the handshake digests
2574 */
Paul Bakker48916f92012-09-16 19:57:18 +00002575 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00002576
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002577#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
2578 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker926af752012-11-23 13:38:07 +01002579 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002580 {
Paul Bakker926af752012-11-23 13:38:07 +01002581 /*
2582 * digitally-signed struct {
2583 * opaque md5_hash[16];
2584 * opaque sha_hash[20];
2585 * };
2586 *
2587 * md5_hash
2588 * MD5(handshake_messages);
2589 *
2590 * sha_hash
2591 * SHA(handshake_messages);
2592 */
2593 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02002594 md_alg = POLARSSL_MD_NONE;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002595
2596 /*
2597 * For ECDSA, default hash is SHA-1 only
2598 */
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002599 if( pk_can_do( ssl_own_key( ssl ), POLARSSL_PK_ECDSA ) )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002600 {
2601 hash_start += 16;
2602 hashlen -= 16;
2603 md_alg = POLARSSL_MD_SHA1;
2604 }
Paul Bakker926af752012-11-23 13:38:07 +01002605 }
2606 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002607#endif /* POLARSSL_SSL_PROTO_SSL3 || POLARSSL_SSL_PROTO_TLS1 || \
2608 POLARSSL_SSL_PROTO_TLS1_1 */
2609#if defined(POLARSSL_SSL_PROTO_TLS1_2)
2610 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01002611 {
2612 /*
2613 * digitally-signed struct {
2614 * opaque handshake_messages[handshake_messages_length];
2615 * };
2616 *
2617 * Taking shortcut here. We assume that the server always allows the
2618 * PRF Hash function and has sent it in the allowed signature
2619 * algorithms list received in the Certificate Request message.
2620 *
2621 * Until we encounter a server that does not, we will take this
2622 * shortcut.
2623 *
2624 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
2625 * in order to satisfy 'weird' needs from the server side.
2626 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01002627 if( ssl->transform_negotiate->ciphersuite_info->mac ==
2628 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00002629 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02002630 md_alg = POLARSSL_MD_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002631 ssl->out_msg[4] = SSL_HASH_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002632 }
2633 else
2634 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02002635 md_alg = POLARSSL_MD_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002636 ssl->out_msg[4] = SSL_HASH_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002637 }
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002638 ssl->out_msg[5] = ssl_sig_from_pk( ssl_own_key( ssl ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002639
Manuel Pégourié-Gonnardbfe32ef2013-08-22 14:55:30 +02002640 /* Info from md_alg will be used instead */
2641 hashlen = 0;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002642 offset = 2;
2643 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002644 else
2645#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02002646 {
2647 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02002648 return( POLARSSL_ERR_SSL_INTERNAL_ERROR );
Paul Bakker577e0062013-08-28 11:57:20 +02002649 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002650
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002651 if( ( ret = pk_sign( ssl_own_key( ssl ), md_alg, hash_start, hashlen,
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02002652 ssl->out_msg + 6 + offset, &n,
2653 ssl->f_rng, ssl->p_rng ) ) != 0 )
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02002654 {
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02002655 SSL_DEBUG_RET( 1, "pk_sign", ret );
2656 return( ret );
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02002657 }
Paul Bakker926af752012-11-23 13:38:07 +01002658
Paul Bakker1ef83d62012-04-11 12:09:53 +00002659 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
2660 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002661
Paul Bakker1ef83d62012-04-11 12:09:53 +00002662 ssl->out_msglen = 6 + n + offset;
Paul Bakker5121ce52009-01-03 21:22:43 +00002663 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2664 ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY;
2665
2666 ssl->state++;
2667
2668 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2669 {
2670 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2671 return( ret );
2672 }
2673
2674 SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
2675
Paul Bakkered27a042013-04-18 22:46:23 +02002676 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002677}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002678#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2679 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2680 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002681
Paul Bakkera503a632013-08-14 13:48:06 +02002682#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002683static int ssl_parse_new_session_ticket( ssl_context *ssl )
2684{
2685 int ret;
2686 uint32_t lifetime;
2687 size_t ticket_len;
2688 unsigned char *ticket;
2689
2690 SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
2691
2692 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2693 {
2694 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2695 return( ret );
2696 }
2697
2698 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2699 {
2700 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
2701 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
2702 }
2703
2704 /*
2705 * struct {
2706 * uint32 ticket_lifetime_hint;
2707 * opaque ticket<0..2^16-1>;
2708 * } NewSessionTicket;
2709 *
2710 * 0 . 0 handshake message type
2711 * 1 . 3 handshake message length
2712 * 4 . 7 ticket_lifetime_hint
2713 * 8 . 9 ticket_len (n)
2714 * 10 . 9+n ticket content
2715 */
2716 if( ssl->in_msg[0] != SSL_HS_NEW_SESSION_TICKET ||
2717 ssl->in_hslen < 10 )
2718 {
2719 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
2720 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
2721 }
2722
2723 lifetime = ( ssl->in_msg[4] << 24 ) | ( ssl->in_msg[5] << 16 ) |
2724 ( ssl->in_msg[6] << 8 ) | ( ssl->in_msg[7] );
2725
2726 ticket_len = ( ssl->in_msg[8] << 8 ) | ( ssl->in_msg[9] );
2727
2728 if( ticket_len + 10 != ssl->in_hslen )
2729 {
2730 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
2731 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
2732 }
2733
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002734 SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
2735
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002736 /* We're not waiting for a NewSessionTicket message any more */
2737 ssl->handshake->new_session_ticket = 0;
2738
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002739 /*
2740 * Zero-length ticket means the server changed his mind and doesn't want
2741 * to send a ticket after all, so just forget it
2742 */
Paul Bakker66d5d072014-06-17 16:39:18 +02002743 if( ticket_len == 0 )
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002744 return( 0 );
2745
Paul Bakker34617722014-06-13 17:20:13 +02002746 polarssl_zeroize( ssl->session_negotiate->ticket,
2747 ssl->session_negotiate->ticket_len );
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002748 polarssl_free( ssl->session_negotiate->ticket );
2749 ssl->session_negotiate->ticket = NULL;
2750 ssl->session_negotiate->ticket_len = 0;
2751
2752 if( ( ticket = polarssl_malloc( ticket_len ) ) == NULL )
2753 {
2754 SSL_DEBUG_MSG( 1, ( "ticket malloc failed" ) );
2755 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2756 }
2757
2758 memcpy( ticket, ssl->in_msg + 10, ticket_len );
2759
2760 ssl->session_negotiate->ticket = ticket;
2761 ssl->session_negotiate->ticket_len = ticket_len;
2762 ssl->session_negotiate->ticket_lifetime = lifetime;
2763
2764 /*
2765 * RFC 5077 section 3.4:
2766 * "If the client receives a session ticket from the server, then it
2767 * discards any Session ID that was sent in the ServerHello."
2768 */
2769 SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
2770 ssl->session_negotiate->length = 0;
2771
2772 SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
2773
2774 return( 0 );
2775}
Paul Bakkera503a632013-08-14 13:48:06 +02002776#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002777
Paul Bakker5121ce52009-01-03 21:22:43 +00002778/*
Paul Bakker1961b702013-01-25 14:49:24 +01002779 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00002780 */
Paul Bakker1961b702013-01-25 14:49:24 +01002781int ssl_handshake_client_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002782{
2783 int ret = 0;
2784
Paul Bakker1961b702013-01-25 14:49:24 +01002785 if( ssl->state == SSL_HANDSHAKE_OVER )
2786 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002787
Paul Bakker1961b702013-01-25 14:49:24 +01002788 SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
2789
2790 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
2791 return( ret );
2792
2793 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00002794 {
Paul Bakker1961b702013-01-25 14:49:24 +01002795 case SSL_HELLO_REQUEST:
2796 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002797 break;
2798
Paul Bakker1961b702013-01-25 14:49:24 +01002799 /*
2800 * ==> ClientHello
2801 */
2802 case SSL_CLIENT_HELLO:
2803 ret = ssl_write_client_hello( ssl );
2804 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002805
Paul Bakker1961b702013-01-25 14:49:24 +01002806 /*
2807 * <== ServerHello
2808 * Certificate
2809 * ( ServerKeyExchange )
2810 * ( CertificateRequest )
2811 * ServerHelloDone
2812 */
2813 case SSL_SERVER_HELLO:
2814 ret = ssl_parse_server_hello( ssl );
2815 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002816
Paul Bakker1961b702013-01-25 14:49:24 +01002817 case SSL_SERVER_CERTIFICATE:
2818 ret = ssl_parse_certificate( ssl );
2819 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002820
Paul Bakker1961b702013-01-25 14:49:24 +01002821 case SSL_SERVER_KEY_EXCHANGE:
2822 ret = ssl_parse_server_key_exchange( ssl );
2823 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002824
Paul Bakker1961b702013-01-25 14:49:24 +01002825 case SSL_CERTIFICATE_REQUEST:
2826 ret = ssl_parse_certificate_request( ssl );
2827 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002828
Paul Bakker1961b702013-01-25 14:49:24 +01002829 case SSL_SERVER_HELLO_DONE:
2830 ret = ssl_parse_server_hello_done( ssl );
2831 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002832
Paul Bakker1961b702013-01-25 14:49:24 +01002833 /*
2834 * ==> ( Certificate/Alert )
2835 * ClientKeyExchange
2836 * ( CertificateVerify )
2837 * ChangeCipherSpec
2838 * Finished
2839 */
2840 case SSL_CLIENT_CERTIFICATE:
2841 ret = ssl_write_certificate( ssl );
2842 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002843
Paul Bakker1961b702013-01-25 14:49:24 +01002844 case SSL_CLIENT_KEY_EXCHANGE:
2845 ret = ssl_write_client_key_exchange( ssl );
2846 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002847
Paul Bakker1961b702013-01-25 14:49:24 +01002848 case SSL_CERTIFICATE_VERIFY:
2849 ret = ssl_write_certificate_verify( ssl );
2850 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002851
Paul Bakker1961b702013-01-25 14:49:24 +01002852 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
2853 ret = ssl_write_change_cipher_spec( ssl );
2854 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002855
Paul Bakker1961b702013-01-25 14:49:24 +01002856 case SSL_CLIENT_FINISHED:
2857 ret = ssl_write_finished( ssl );
2858 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002859
Paul Bakker1961b702013-01-25 14:49:24 +01002860 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002861 * <== ( NewSessionTicket )
2862 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01002863 * Finished
2864 */
2865 case SSL_SERVER_CHANGE_CIPHER_SPEC:
Paul Bakkera503a632013-08-14 13:48:06 +02002866#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002867 if( ssl->handshake->new_session_ticket != 0 )
2868 ret = ssl_parse_new_session_ticket( ssl );
2869 else
Paul Bakkera503a632013-08-14 13:48:06 +02002870#endif
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002871 ret = ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01002872 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002873
Paul Bakker1961b702013-01-25 14:49:24 +01002874 case SSL_SERVER_FINISHED:
2875 ret = ssl_parse_finished( ssl );
2876 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002877
Paul Bakker1961b702013-01-25 14:49:24 +01002878 case SSL_FLUSH_BUFFERS:
2879 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
2880 ssl->state = SSL_HANDSHAKE_WRAPUP;
2881 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002882
Paul Bakker1961b702013-01-25 14:49:24 +01002883 case SSL_HANDSHAKE_WRAPUP:
2884 ssl_handshake_wrapup( ssl );
2885 break;
Paul Bakker48916f92012-09-16 19:57:18 +00002886
Paul Bakker1961b702013-01-25 14:49:24 +01002887 default:
2888 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
2889 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
2890 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002891
2892 return( ret );
2893}
Paul Bakker9af723c2014-05-01 13:03:14 +02002894#endif /* POLARSSL_SSL_CLI_C */