blob: 76c943d962578b5fb19f80656a532225aef2b240 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 client-side functions
3 *
Paul Bakker68884e32013-01-07 18:20:04 +01004 * Copyright (C) 2006-2013, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
Paul Bakker40e46942009-01-03 21:51:57 +000026#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Paul Bakker40e46942009-01-03 21:51:57 +000028#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Paul Bakker40e46942009-01-03 21:51:57 +000030#include "polarssl/debug.h"
31#include "polarssl/ssl.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000032
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020033#if defined(POLARSSL_MEMORY_C)
34#include "polarssl/memory.h"
35#else
36#define polarssl_malloc malloc
37#define polarssl_free free
38#endif
39
Paul Bakker5121ce52009-01-03 21:22:43 +000040#include <stdlib.h>
41#include <stdio.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020042
Paul Bakkerfa6a6202013-10-28 18:48:30 +010043#if defined(_MSC_VER) && !defined(EFIX64) && !defined(EFI32)
Paul Bakkerfa9b1002013-07-03 15:31:03 +020044#include <basetsd.h>
45typedef UINT32 uint32_t;
46#else
47#include <inttypes.h>
48#endif
49
50#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +000051#include <time.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020052#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000053
Paul Bakker0be444a2013-08-27 21:55:01 +020054#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +010055static void ssl_write_hostname_ext( ssl_context *ssl,
56 unsigned char *buf,
57 size_t *olen )
58{
59 unsigned char *p = buf;
60
61 *olen = 0;
62
63 if ( ssl->hostname == NULL )
64 return;
65
66 SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
67 ssl->hostname ) );
68
69 /*
70 * struct {
71 * NameType name_type;
72 * select (name_type) {
73 * case host_name: HostName;
74 * } name;
75 * } ServerName;
76 *
77 * enum {
78 * host_name(0), (255)
79 * } NameType;
80 *
81 * opaque HostName<1..2^16-1>;
82 *
83 * struct {
84 * ServerName server_name_list<1..2^16-1>
85 * } ServerNameList;
86 */
87 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
88 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME ) & 0xFF );
89
90 *p++ = (unsigned char)( ( (ssl->hostname_len + 5) >> 8 ) & 0xFF );
91 *p++ = (unsigned char)( ( (ssl->hostname_len + 5) ) & 0xFF );
92
93 *p++ = (unsigned char)( ( (ssl->hostname_len + 3) >> 8 ) & 0xFF );
94 *p++ = (unsigned char)( ( (ssl->hostname_len + 3) ) & 0xFF );
95
96 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
97 *p++ = (unsigned char)( ( ssl->hostname_len >> 8 ) & 0xFF );
98 *p++ = (unsigned char)( ( ssl->hostname_len ) & 0xFF );
99
100 memcpy( p, ssl->hostname, ssl->hostname_len );
101
102 *olen = ssl->hostname_len + 9;
103}
Paul Bakker0be444a2013-08-27 21:55:01 +0200104#endif /* POLARSSL_SSL_SERVER_NAME_INDICATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100105
106static void ssl_write_renegotiation_ext( ssl_context *ssl,
107 unsigned char *buf,
108 size_t *olen )
109{
110 unsigned char *p = buf;
111
112 *olen = 0;
113
114 if( ssl->renegotiation != SSL_RENEGOTIATION )
115 return;
116
117 SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
118
119 /*
120 * Secure renegotiation
121 */
122 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
123 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
124
125 *p++ = 0x00;
126 *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
127 *p++ = ssl->verify_data_len & 0xFF;
128
129 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
130
131 *olen = 5 + ssl->verify_data_len;
132}
133
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200134#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100135static void ssl_write_signature_algorithms_ext( ssl_context *ssl,
136 unsigned char *buf,
137 size_t *olen )
138{
139 unsigned char *p = buf;
Manuel Pégourié-Gonnard9c9812a2013-08-23 12:18:46 +0200140 unsigned char *sig_alg_list = buf + 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100141 size_t sig_alg_len = 0;
142
143 *olen = 0;
144
145 if( ssl->max_minor_ver != SSL_MINOR_VERSION_3 )
146 return;
147
148 SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
149
150 /*
151 * Prepare signature_algorithms extension (TLS 1.2)
152 */
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200153#if defined(POLARSSL_RSA_C)
Paul Bakker9e36f042013-06-30 14:34:05 +0200154#if defined(POLARSSL_SHA512_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100155 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA512;
156 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
157 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA384;
158 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
159#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200160#if defined(POLARSSL_SHA256_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100161 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA256;
162 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
163 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA224;
164 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
165#endif
166#if defined(POLARSSL_SHA1_C)
167 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA1;
168 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
169#endif
170#if defined(POLARSSL_MD5_C)
171 sig_alg_list[sig_alg_len++] = SSL_HASH_MD5;
172 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
173#endif
Manuel Pégourié-Gonnardd11eb7c2013-08-22 15:57:15 +0200174#endif /* POLARSSL_RSA_C */
175#if defined(POLARSSL_ECDSA_C)
176#if defined(POLARSSL_SHA512_C)
177 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA512;
178 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
179 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA384;
180 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
181#endif
182#if defined(POLARSSL_SHA256_C)
183 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA256;
184 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
185 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA224;
186 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
187#endif
188#if defined(POLARSSL_SHA1_C)
189 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA1;
190 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
191#endif
192#if defined(POLARSSL_MD5_C)
193 sig_alg_list[sig_alg_len++] = SSL_HASH_MD5;
194 sig_alg_list[sig_alg_len++] = SSL_SIG_ECDSA;
195#endif
196#endif /* POLARSSL_ECDSA_C */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100197
198 /*
199 * enum {
200 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
201 * sha512(6), (255)
202 * } HashAlgorithm;
203 *
204 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
205 * SignatureAlgorithm;
206 *
207 * struct {
208 * HashAlgorithm hash;
209 * SignatureAlgorithm signature;
210 * } SignatureAndHashAlgorithm;
211 *
212 * SignatureAndHashAlgorithm
213 * supported_signature_algorithms<2..2^16-2>;
214 */
215 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
216 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG ) & 0xFF );
217
218 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
219 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
220
221 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
222 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
223
Paul Bakkerd3edc862013-03-20 16:07:17 +0100224 *olen = 6 + sig_alg_len;
225}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200226#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100227
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200228#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100229static void ssl_write_supported_elliptic_curves_ext( ssl_context *ssl,
230 unsigned char *buf,
231 size_t *olen )
232{
233 unsigned char *p = buf;
234 unsigned char elliptic_curve_list[20];
235 size_t elliptic_curve_len = 0;
Manuel Pégourié-Gonnarda79d1232013-09-17 15:42:35 +0200236 const ecp_curve_info *curve;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200237 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100238
239 *olen = 0;
240
241 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
242
Manuel Pégourié-Gonnardda179e42013-09-18 15:31:24 +0200243 for( curve = ecp_curve_list();
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200244 curve->grp_id != POLARSSL_ECP_DP_NONE;
245 curve++ )
246 {
Manuel Pégourié-Gonnard56cd3192013-09-17 17:23:07 +0200247 elliptic_curve_list[elliptic_curve_len++] = curve->tls_id >> 8;
248 elliptic_curve_list[elliptic_curve_len++] = curve->tls_id & 0xFF;
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200249 }
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200250
251 if( elliptic_curve_len == 0 )
252 return;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100253
254 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
255 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
256
257 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
258 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
259
260 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
261 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
262
263 memcpy( p, elliptic_curve_list, elliptic_curve_len );
264
265 *olen = 6 + elliptic_curve_len;
266}
267
268static void ssl_write_supported_point_formats_ext( ssl_context *ssl,
269 unsigned char *buf,
270 size_t *olen )
271{
272 unsigned char *p = buf;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200273 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100274
275 *olen = 0;
276
277 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
278
279 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
280 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
281
282 *p++ = 0x00;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100283 *p++ = 2;
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200284
285 *p++ = 1;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100286 *p++ = POLARSSL_ECP_PF_UNCOMPRESSED;
287
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200288 *olen = 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100289}
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200290#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100291
Paul Bakker05decb22013-08-15 13:33:48 +0200292#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200293static void ssl_write_max_fragment_length_ext( ssl_context *ssl,
294 unsigned char *buf,
295 size_t *olen )
296{
297 unsigned char *p = buf;
298
299 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ) {
300 *olen = 0;
301 return;
302 }
303
304 SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
305
306 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
307 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
308
309 *p++ = 0x00;
310 *p++ = 1;
311
312 *p++ = ssl->mfl_code;
313
314 *olen = 5;
315}
Paul Bakker05decb22013-08-15 13:33:48 +0200316#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200317
Paul Bakker1f2bc622013-08-15 13:45:55 +0200318#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200319static void ssl_write_truncated_hmac_ext( ssl_context *ssl,
320 unsigned char *buf, size_t *olen )
321{
322 unsigned char *p = buf;
323
324 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED )
325 {
326 *olen = 0;
327 return;
328 }
329
330 SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
331
332 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
333 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
334
335 *p++ = 0x00;
336 *p++ = 0x00;
337
338 *olen = 4;
339}
Paul Bakker1f2bc622013-08-15 13:45:55 +0200340#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200341
Paul Bakkera503a632013-08-14 13:48:06 +0200342#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200343static void ssl_write_session_ticket_ext( ssl_context *ssl,
344 unsigned char *buf, size_t *olen )
345{
346 unsigned char *p = buf;
347 size_t tlen = ssl->session_negotiate->ticket_len;
348
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200349 if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED )
350 {
351 *olen = 0;
352 return;
353 }
354
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200355 SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
356
357 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
358 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET ) & 0xFF );
359
360 *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
361 *p++ = (unsigned char)( ( tlen ) & 0xFF );
362
363 *olen = 4;
364
365 if( ssl->session_negotiate->ticket == NULL ||
366 ssl->session_negotiate->ticket_len == 0 )
367 {
368 return;
369 }
370
371 SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
372
373 memcpy( p, ssl->session_negotiate->ticket, tlen );
374
375 *olen += tlen;
376}
Paul Bakkera503a632013-08-14 13:48:06 +0200377#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200378
Paul Bakker5121ce52009-01-03 21:22:43 +0000379static int ssl_write_client_hello( ssl_context *ssl )
380{
Paul Bakker23986e52011-04-24 08:57:21 +0000381 int ret;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100382 size_t i, n, olen, ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000383 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200384 unsigned char *p, *q;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200385#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000386 time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200387#endif
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200388 const int *ciphersuites;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200389 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000390
391 SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
392
Paul Bakkera9a028e2013-11-21 17:31:06 +0100393 if( ssl->f_rng == NULL )
394 {
395 SSL_DEBUG_MSG( 1, ( "no RNG provided") );
396 return( POLARSSL_ERR_SSL_NO_RNG );
397 }
398
Paul Bakker48916f92012-09-16 19:57:18 +0000399 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
400 {
Paul Bakker993d11d2012-09-28 15:00:12 +0000401 ssl->major_ver = ssl->min_major_ver;
402 ssl->minor_ver = ssl->min_minor_ver;
Paul Bakker48916f92012-09-16 19:57:18 +0000403 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000404
Paul Bakker490ecc82011-10-06 13:04:09 +0000405 if( ssl->max_major_ver == 0 && ssl->max_minor_ver == 0 )
406 {
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200407 ssl->max_major_ver = SSL_MAX_MAJOR_VERSION;
408 ssl->max_minor_ver = SSL_MAX_MINOR_VERSION;
Paul Bakker490ecc82011-10-06 13:04:09 +0000409 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000410
411 /*
412 * 0 . 0 handshake type
413 * 1 . 3 handshake length
414 * 4 . 5 highest version supported
415 * 6 . 9 current UNIX time
416 * 10 . 37 random bytes
417 */
418 buf = ssl->out_msg;
419 p = buf + 4;
420
421 *p++ = (unsigned char) ssl->max_major_ver;
422 *p++ = (unsigned char) ssl->max_minor_ver;
423
424 SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
425 buf[4], buf[5] ) );
426
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200427#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000428 t = time( NULL );
429 *p++ = (unsigned char)( t >> 24 );
430 *p++ = (unsigned char)( t >> 16 );
431 *p++ = (unsigned char)( t >> 8 );
432 *p++ = (unsigned char)( t );
433
434 SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200435#else
436 if( ( ret = ssl->f_rng( ssl->p_rng, p, 4 ) ) != 0 )
437 return( ret );
438
439 p += 4;
440#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000441
Paul Bakkera3d195c2011-11-27 21:07:34 +0000442 if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
443 return( ret );
444
445 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +0000446
Paul Bakker48916f92012-09-16 19:57:18 +0000447 memcpy( ssl->handshake->randbytes, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000448
449 SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 6, 32 );
450
451 /*
452 * 38 . 38 session id length
453 * 39 . 39+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000454 * 40+n . 41+n ciphersuitelist length
455 * 42+n . .. ciphersuitelist
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000456 * .. . .. compression methods length
457 * .. . .. compression methods
458 * .. . .. extensions length
459 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +0000460 */
Paul Bakker48916f92012-09-16 19:57:18 +0000461 n = ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +0000462
Paul Bakker0a597072012-09-25 21:55:46 +0000463 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE || n < 16 || n > 32 ||
464 ssl->handshake->resume == 0 )
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200465 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000466 n = 0;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200467 }
468
Paul Bakkera503a632013-08-14 13:48:06 +0200469#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200470 /*
471 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
472 * generate and include a Session ID in the TLS ClientHello."
473 */
474 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
475 ssl->session_negotiate->ticket != NULL &&
476 ssl->session_negotiate->ticket_len != 0 )
477 {
478 ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id, 32 );
479
480 if( ret != 0 )
481 return( ret );
482
483 ssl->session_negotiate->length = n = 32;
484 }
Paul Bakkera503a632013-08-14 13:48:06 +0200485#endif /* POLARSSL_SSL_SESSION_TICKETS */
Paul Bakker5121ce52009-01-03 21:22:43 +0000486
487 *p++ = (unsigned char) n;
488
489 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000490 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000491
492 SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
493 SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
494
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200495 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
Paul Bakker2fbefde2013-06-29 16:01:15 +0200496 n = 0;
497 q = p;
498
499 // Skip writing ciphersuite length for now
500 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000501
Paul Bakker48916f92012-09-16 19:57:18 +0000502 /*
503 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
504 */
505 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
506 {
507 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
508 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO );
Paul Bakker2fbefde2013-06-29 16:01:15 +0200509 n++;
Paul Bakker48916f92012-09-16 19:57:18 +0000510 }
511
Paul Bakker2fbefde2013-06-29 16:01:15 +0200512 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000513 {
Paul Bakker2fbefde2013-06-29 16:01:15 +0200514 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
515
516 if( ciphersuite_info == NULL )
517 continue;
518
519 if( ciphersuite_info->min_minor_ver > ssl->max_minor_ver ||
520 ciphersuite_info->max_minor_ver < ssl->min_minor_ver )
521 continue;
522
Paul Bakkere3166ce2011-01-27 17:40:50 +0000523 SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %2d",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200524 ciphersuites[i] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000525
Paul Bakker2fbefde2013-06-29 16:01:15 +0200526 n++;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200527 *p++ = (unsigned char)( ciphersuites[i] >> 8 );
528 *p++ = (unsigned char)( ciphersuites[i] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000529 }
530
Paul Bakker2fbefde2013-06-29 16:01:15 +0200531 *q++ = (unsigned char)( n >> 7 );
532 *q++ = (unsigned char)( n << 1 );
533
534 SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
535
536
Paul Bakker2770fbd2012-07-03 13:30:23 +0000537#if defined(POLARSSL_ZLIB_SUPPORT)
538 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
539 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000540 SSL_COMPRESS_DEFLATE, SSL_COMPRESS_NULL ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000541
542 *p++ = 2;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000543 *p++ = SSL_COMPRESS_DEFLATE;
Paul Bakker48916f92012-09-16 19:57:18 +0000544 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000545#else
Paul Bakker5121ce52009-01-03 21:22:43 +0000546 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000547 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", SSL_COMPRESS_NULL ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000548
549 *p++ = 1;
550 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000551#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000552
Paul Bakkerd3edc862013-03-20 16:07:17 +0100553 // First write extensions, then the total length
554 //
Paul Bakker0be444a2013-08-27 21:55:01 +0200555#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100556 ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
557 ext_len += olen;
Paul Bakker0be444a2013-08-27 21:55:01 +0200558#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000559
Paul Bakkerd3edc862013-03-20 16:07:17 +0100560 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
561 ext_len += olen;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000562
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200563#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100564 ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
565 ext_len += olen;
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200566#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000567
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200568#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100569 ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
570 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100571
Paul Bakkerd3edc862013-03-20 16:07:17 +0100572 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
573 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100574#endif
575
Paul Bakker05decb22013-08-15 13:33:48 +0200576#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200577 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
578 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +0200579#endif
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200580
Paul Bakker1f2bc622013-08-15 13:45:55 +0200581#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200582 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
583 ext_len += olen;
Paul Bakker1f2bc622013-08-15 13:45:55 +0200584#endif
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200585
Paul Bakkera503a632013-08-14 13:48:06 +0200586#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200587 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
588 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +0200589#endif
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200590
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000591 SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
592 ext_len ) );
593
594 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
595 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100596 p += ext_len;
Paul Bakker41c83d32013-03-20 14:39:14 +0100597
Paul Bakker5121ce52009-01-03 21:22:43 +0000598 ssl->out_msglen = p - buf;
599 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
600 ssl->out_msg[0] = SSL_HS_CLIENT_HELLO;
601
602 ssl->state++;
603
604 if( ( ret = ssl_write_record( ssl ) ) != 0 )
605 {
606 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
607 return( ret );
608 }
609
610 SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
611
612 return( 0 );
613}
614
Paul Bakker48916f92012-09-16 19:57:18 +0000615static int ssl_parse_renegotiation_info( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200616 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +0000617 size_t len )
618{
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000619 int ret;
620
Paul Bakker48916f92012-09-16 19:57:18 +0000621 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
622 {
623 if( len != 1 || buf[0] != 0x0 )
624 {
625 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000626
627 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
628 return( ret );
629
Paul Bakker48916f92012-09-16 19:57:18 +0000630 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
631 }
632
633 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
634 }
635 else
636 {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +0100637 /* Check verify-data in constant-time. The length OTOH is no secret */
Paul Bakker48916f92012-09-16 19:57:18 +0000638 if( len != 1 + ssl->verify_data_len * 2 ||
639 buf[0] != ssl->verify_data_len * 2 ||
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +0100640 safer_memcmp( buf + 1,
641 ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
642 safer_memcmp( buf + 1 + ssl->verify_data_len,
643 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
Paul Bakker48916f92012-09-16 19:57:18 +0000644 {
645 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000646
647 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
648 return( ret );
649
Paul Bakker48916f92012-09-16 19:57:18 +0000650 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
651 }
652 }
653
654 return( 0 );
655}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200656
Paul Bakker05decb22013-08-15 13:33:48 +0200657#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200658static int ssl_parse_max_fragment_length_ext( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200659 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200660 size_t len )
661{
662 /*
663 * server should use the extension only if we did,
664 * and if so the server's value should match ours (and len is always 1)
665 */
666 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ||
667 len != 1 ||
668 buf[0] != ssl->mfl_code )
669 {
670 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
671 }
672
673 return( 0 );
674}
Paul Bakker05decb22013-08-15 13:33:48 +0200675#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Paul Bakker48916f92012-09-16 19:57:18 +0000676
Paul Bakker1f2bc622013-08-15 13:45:55 +0200677#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200678static int ssl_parse_truncated_hmac_ext( ssl_context *ssl,
679 const unsigned char *buf,
680 size_t len )
681{
682 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED ||
683 len != 0 )
684 {
685 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
686 }
687
688 ((void) buf);
689
690 ssl->session_negotiate->trunc_hmac = SSL_TRUNC_HMAC_ENABLED;
691
692 return( 0 );
693}
Paul Bakker1f2bc622013-08-15 13:45:55 +0200694#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200695
Paul Bakkera503a632013-08-14 13:48:06 +0200696#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200697static int ssl_parse_session_ticket_ext( ssl_context *ssl,
698 const unsigned char *buf,
699 size_t len )
700{
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200701 if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED ||
702 len != 0 )
703 {
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200704 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200705 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200706
707 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +0200708
709 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200710
711 return( 0 );
712}
Paul Bakkera503a632013-08-14 13:48:06 +0200713#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200714
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200715#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200716static int ssl_parse_supported_point_formats_ext( ssl_context *ssl,
717 const unsigned char *buf,
718 size_t len )
719{
720 size_t list_size;
721 const unsigned char *p;
722
723 list_size = buf[0];
724 if( list_size + 1 != len )
725 {
726 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
727 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
728 }
729
730 p = buf + 2;
731 while( list_size > 0 )
732 {
733 if( p[0] == POLARSSL_ECP_PF_UNCOMPRESSED ||
734 p[0] == POLARSSL_ECP_PF_COMPRESSED )
735 {
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200736 ssl->handshake->ecdh_ctx.point_format = p[0];
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200737 SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
738 return( 0 );
739 }
740
741 list_size--;
742 p++;
743 }
744
745 return( 0 );
746}
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200747#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200748
Paul Bakker5121ce52009-01-03 21:22:43 +0000749static int ssl_parse_server_hello( ssl_context *ssl )
750{
Paul Bakker2770fbd2012-07-03 13:30:23 +0000751 int ret, i, comp;
Paul Bakker23986e52011-04-24 08:57:21 +0000752 size_t n;
Paul Bakker48916f92012-09-16 19:57:18 +0000753 size_t ext_len = 0;
754 unsigned char *buf, *ext;
755 int renegotiation_info_seen = 0;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000756 int handshake_failure = 0;
Manuel Pégourié-Gonnard1032c1d2013-09-18 17:18:34 +0200757#if defined(POLARSSL_DEBUG_C)
758 uint32_t t;
759#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000760
761 SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
762
763 /*
764 * 0 . 0 handshake type
765 * 1 . 3 handshake length
766 * 4 . 5 protocol version
767 * 6 . 9 UNIX time()
768 * 10 . 37 random bytes
769 */
770 buf = ssl->in_msg;
771
772 if( ( ret = ssl_read_record( ssl ) ) != 0 )
773 {
774 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
775 return( ret );
776 }
777
778 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
779 {
780 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000781 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000782 }
783
784 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
785 buf[4], buf[5] ) );
786
787 if( ssl->in_hslen < 42 ||
788 buf[0] != SSL_HS_SERVER_HELLO ||
789 buf[4] != SSL_MAJOR_VERSION_3 )
790 {
791 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000792 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000793 }
794
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000795 if( buf[5] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +0000796 {
797 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000798 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000799 }
800
801 ssl->minor_ver = buf[5];
802
Paul Bakker1d29fb52012-09-28 13:28:45 +0000803 if( ssl->minor_ver < ssl->min_minor_ver )
804 {
805 SSL_DEBUG_MSG( 1, ( "server only supports ssl smaller than minimum"
806 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
807 buf[4], buf[5] ) );
808
809 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
810 SSL_ALERT_MSG_PROTOCOL_VERSION );
811
812 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
813 }
814
Paul Bakker1504af52012-02-11 16:17:43 +0000815#if defined(POLARSSL_DEBUG_C)
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200816 t = ( (uint32_t) buf[6] << 24 )
817 | ( (uint32_t) buf[7] << 16 )
818 | ( (uint32_t) buf[8] << 8 )
819 | ( (uint32_t) buf[9] );
Manuel Pégourié-Gonnard1032c1d2013-09-18 17:18:34 +0200820 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
Paul Bakker87e5cda2012-01-14 18:14:15 +0000821#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000822
Paul Bakker48916f92012-09-16 19:57:18 +0000823 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000824
825 n = buf[38];
826
Paul Bakker5121ce52009-01-03 21:22:43 +0000827 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
828
Paul Bakker48916f92012-09-16 19:57:18 +0000829 if( n > 32 )
830 {
831 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
832 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
833 }
834
Paul Bakker5121ce52009-01-03 21:22:43 +0000835 /*
836 * 38 . 38 session id length
837 * 39 . 38+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000838 * 39+n . 40+n chosen ciphersuite
Paul Bakker5121ce52009-01-03 21:22:43 +0000839 * 41+n . 41+n chosen compression alg.
840 * 42+n . 43+n extensions length
841 * 44+n . 44+n+m extensions
842 */
Paul Bakker48916f92012-09-16 19:57:18 +0000843 if( ssl->in_hslen > 42 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000844 {
845 ext_len = ( ( buf[42 + n] << 8 )
Paul Bakker48916f92012-09-16 19:57:18 +0000846 | ( buf[43 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000847
Paul Bakker48916f92012-09-16 19:57:18 +0000848 if( ( ext_len > 0 && ext_len < 4 ) ||
849 ssl->in_hslen != 44 + n + ext_len )
850 {
851 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
852 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
853 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000854 }
855
856 i = ( buf[39 + n] << 8 ) | buf[40 + n];
Paul Bakker2770fbd2012-07-03 13:30:23 +0000857 comp = buf[41 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +0000858
Paul Bakker380da532012-04-18 16:10:25 +0000859 /*
860 * Initialize update checksum functions
861 */
Paul Bakker68884e32013-01-07 18:20:04 +0100862 ssl->transform_negotiate->ciphersuite_info = ssl_ciphersuite_from_id( i );
Paul Bakker41c83d32013-03-20 14:39:14 +0100863 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
Paul Bakker68884e32013-01-07 18:20:04 +0100864
865 if( ssl->transform_negotiate->ciphersuite_info == NULL )
866 {
867 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200868 ssl->ciphersuite_list[ssl->minor_ver][i] ) );
Paul Bakker68884e32013-01-07 18:20:04 +0100869 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
870 }
Paul Bakker380da532012-04-18 16:10:25 +0000871
Paul Bakker5121ce52009-01-03 21:22:43 +0000872 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
873 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
874
875 /*
876 * Check if the session can be resumed
877 */
Paul Bakker0a597072012-09-25 21:55:46 +0000878 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE ||
879 ssl->handshake->resume == 0 || n == 0 ||
Paul Bakker48916f92012-09-16 19:57:18 +0000880 ssl->session_negotiate->ciphersuite != i ||
881 ssl->session_negotiate->compression != comp ||
882 ssl->session_negotiate->length != n ||
883 memcmp( ssl->session_negotiate->id, buf + 39, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000884 {
885 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +0000886 ssl->handshake->resume = 0;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200887#if defined(POLARSSL_HAVE_TIME)
Paul Bakker48916f92012-09-16 19:57:18 +0000888 ssl->session_negotiate->start = time( NULL );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200889#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000890 ssl->session_negotiate->ciphersuite = i;
891 ssl->session_negotiate->compression = comp;
892 ssl->session_negotiate->length = n;
893 memcpy( ssl->session_negotiate->id, buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000894 }
895 else
896 {
897 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +0000898
899 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
900 {
901 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
902 return( ret );
903 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000904 }
905
906 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +0000907 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000908
Paul Bakkere3166ce2011-01-27 17:40:50 +0000909 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", i ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000910 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[41 + n] ) );
911
912 i = 0;
913 while( 1 )
914 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200915 if( ssl->ciphersuite_list[ssl->minor_ver][i] == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000916 {
917 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000918 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000919 }
920
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200921 if( ssl->ciphersuite_list[ssl->minor_ver][i++] ==
922 ssl->session_negotiate->ciphersuite )
923 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000924 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200925 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000926 }
927
Paul Bakker2770fbd2012-07-03 13:30:23 +0000928 if( comp != SSL_COMPRESS_NULL
929#if defined(POLARSSL_ZLIB_SUPPORT)
930 && comp != SSL_COMPRESS_DEFLATE
931#endif
932 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000933 {
934 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000935 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000936 }
Paul Bakker48916f92012-09-16 19:57:18 +0000937 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +0000938
Paul Bakker48916f92012-09-16 19:57:18 +0000939 ext = buf + 44 + n;
940
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200941 SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) );
942
Paul Bakker48916f92012-09-16 19:57:18 +0000943 while( ext_len )
944 {
945 unsigned int ext_id = ( ( ext[0] << 8 )
946 | ( ext[1] ) );
947 unsigned int ext_size = ( ( ext[2] << 8 )
948 | ( ext[3] ) );
949
950 if( ext_size + 4 > ext_len )
951 {
952 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
953 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
954 }
955
956 switch( ext_id )
957 {
958 case TLS_EXT_RENEGOTIATION_INFO:
959 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
960 renegotiation_info_seen = 1;
961
962 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ) ) != 0 )
963 return( ret );
964
965 break;
966
Paul Bakker05decb22013-08-15 13:33:48 +0200967#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200968 case TLS_EXT_MAX_FRAGMENT_LENGTH:
969 SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
970
971 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
972 ext + 4, ext_size ) ) != 0 )
973 {
974 return( ret );
975 }
976
977 break;
Paul Bakker05decb22013-08-15 13:33:48 +0200978#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200979
Paul Bakker1f2bc622013-08-15 13:45:55 +0200980#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200981 case TLS_EXT_TRUNCATED_HMAC:
982 SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
983
984 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
985 ext + 4, ext_size ) ) != 0 )
986 {
987 return( ret );
988 }
989
990 break;
Paul Bakker1f2bc622013-08-15 13:45:55 +0200991#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200992
Paul Bakkera503a632013-08-14 13:48:06 +0200993#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200994 case TLS_EXT_SESSION_TICKET:
995 SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
996
997 if( ( ret = ssl_parse_session_ticket_ext( ssl,
998 ext + 4, ext_size ) ) != 0 )
999 {
1000 return( ret );
1001 }
1002
1003 break;
Paul Bakkera503a632013-08-14 13:48:06 +02001004#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001005
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +02001006#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001007 case TLS_EXT_SUPPORTED_POINT_FORMATS:
1008 SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
1009
1010 if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
1011 ext + 4, ext_size ) ) != 0 )
1012 {
1013 return( ret );
1014 }
1015
1016 break;
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +02001017#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001018
Paul Bakker48916f92012-09-16 19:57:18 +00001019 default:
1020 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
1021 ext_id ) );
1022 }
1023
1024 ext_len -= 4 + ext_size;
1025 ext += 4 + ext_size;
1026
1027 if( ext_len > 0 && ext_len < 4 )
1028 {
1029 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1030 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1031 }
1032 }
1033
1034 /*
1035 * Renegotiation security checks
1036 */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001037 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1038 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00001039 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001040 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
1041 handshake_failure = 1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001042 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001043 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1044 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
1045 renegotiation_info_seen == 0 )
1046 {
1047 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
1048 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +00001049 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001050 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1051 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1052 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00001053 {
1054 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001055 handshake_failure = 1;
1056 }
1057 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1058 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1059 renegotiation_info_seen == 1 )
1060 {
1061 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
1062 handshake_failure = 1;
1063 }
1064
1065 if( handshake_failure == 1 )
1066 {
1067 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
1068 return( ret );
1069
Paul Bakker48916f92012-09-16 19:57:18 +00001070 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1071 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001072
1073 SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
1074
1075 return( 0 );
1076}
1077
Manuel Pégourié-Gonnarde511ffc2013-08-22 17:33:21 +02001078#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1079 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001080static int ssl_parse_server_dh_params( ssl_context *ssl, unsigned char **p,
1081 unsigned char *end )
1082{
1083 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1084
Paul Bakker29e1f122013-04-16 13:07:56 +02001085 /*
1086 * Ephemeral DH parameters:
1087 *
1088 * struct {
1089 * opaque dh_p<1..2^16-1>;
1090 * opaque dh_g<1..2^16-1>;
1091 * opaque dh_Ys<1..2^16-1>;
1092 * } ServerDHParams;
1093 */
1094 if( ( ret = dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
1095 {
1096 SSL_DEBUG_RET( 2, ( "dhm_read_params" ), ret );
1097 return( ret );
1098 }
1099
1100 if( ssl->handshake->dhm_ctx.len < 64 ||
1101 ssl->handshake->dhm_ctx.len > 512 )
1102 {
1103 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (DHM length)" ) );
1104 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1105 }
1106
1107 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
1108 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
1109 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +02001110
1111 return( ret );
1112}
Manuel Pégourié-Gonnarde511ffc2013-08-22 17:33:21 +02001113#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1114 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001115
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001116#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02001117 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001118 defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
1119 defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
1120 defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
1121static int ssl_check_server_ecdh_params( const ssl_context *ssl )
1122{
1123 SSL_DEBUG_MSG( 2, ( "ECDH curve size: %d",
1124 (int) ssl->handshake->ecdh_ctx.grp.nbits ) );
1125
1126 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
1127 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
1128 {
1129 return( -1 );
1130 }
1131
1132 SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
1133
1134 return( 0 );
1135}
1136#endif
1137
1138
1139#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1140 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02001141 defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001142static int ssl_parse_server_ecdh_params( ssl_context *ssl,
1143 unsigned char **p,
1144 unsigned char *end )
1145{
1146 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1147
Paul Bakker29e1f122013-04-16 13:07:56 +02001148 /*
1149 * Ephemeral ECDH parameters:
1150 *
1151 * struct {
1152 * ECParameters curve_params;
1153 * ECPoint public;
1154 * } ServerECDHParams;
1155 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001156 if( ( ret = ecdh_read_params( &ssl->handshake->ecdh_ctx,
1157 (const unsigned char **) p, end ) ) != 0 )
1158 {
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +02001159 SSL_DEBUG_RET( 1, ( "ecdh_read_params" ), ret );
Paul Bakker29e1f122013-04-16 13:07:56 +02001160 return( ret );
1161 }
1162
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001163 if( ssl_check_server_ecdh_params( ssl ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02001164 {
1165 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDH length)" ) );
1166 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1167 }
1168
Paul Bakker29e1f122013-04-16 13:07:56 +02001169 return( ret );
1170}
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001171#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02001172 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
1173 POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001174
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02001175#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001176static int ssl_parse_server_psk_hint( ssl_context *ssl,
1177 unsigned char **p,
1178 unsigned char *end )
1179{
1180 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001181 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001182 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001183
1184 /*
1185 * PSK parameters:
1186 *
1187 * opaque psk_identity_hint<0..2^16-1>;
1188 */
Manuel Pégourié-Gonnard59b9fe22013-10-15 11:55:33 +02001189 len = (*p)[0] << 8 | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001190 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001191
1192 if( (*p) + len > end )
1193 {
1194 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
1195 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1196 }
1197
1198 // TODO: Retrieve PSK identity hint and callback to app
1199 //
1200 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001201 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001202
1203 return( ret );
1204}
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02001205#endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001206
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001207#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) || \
1208 defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
1209/*
1210 * Generate a pre-master secret and encrypt it with the server's RSA key
1211 */
1212static int ssl_write_encrypted_pms( ssl_context *ssl,
1213 size_t offset, size_t *olen,
1214 size_t pms_offset )
1215{
1216 int ret;
1217 size_t len_bytes = ssl->minor_ver == SSL_MINOR_VERSION_0 ? 0 : 2;
1218 unsigned char *p = ssl->handshake->premaster + pms_offset;
1219
1220 /*
1221 * Generate (part of) the pre-master as
1222 * struct {
1223 * ProtocolVersion client_version;
1224 * opaque random[46];
1225 * } PreMasterSecret;
1226 */
1227 p[0] = (unsigned char) ssl->max_major_ver;
1228 p[1] = (unsigned char) ssl->max_minor_ver;
1229
1230 if( ( ret = ssl->f_rng( ssl->p_rng, p + 2, 46 ) ) != 0 )
1231 {
1232 SSL_DEBUG_RET( 1, "f_rng", ret );
1233 return( ret );
1234 }
1235
1236 ssl->handshake->pmslen = 48;
1237
1238 /*
1239 * Now write it out, encrypted
1240 */
1241 if( ! pk_can_do( &ssl->session_negotiate->peer_cert->pk,
1242 POLARSSL_PK_RSA ) )
1243 {
1244 SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
1245 return( POLARSSL_ERR_SSL_PK_TYPE_MISMATCH );
1246 }
1247
1248 if( ( ret = pk_encrypt( &ssl->session_negotiate->peer_cert->pk,
1249 p, ssl->handshake->pmslen,
1250 ssl->out_msg + offset + len_bytes, olen,
1251 SSL_MAX_CONTENT_LEN - offset - len_bytes,
1252 ssl->f_rng, ssl->p_rng ) ) != 0 )
1253 {
1254 SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret );
1255 return( ret );
1256 }
1257
1258#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
1259 defined(POLARSSL_SSL_PROTO_TLS1_2)
1260 if( len_bytes == 2 )
1261 {
1262 ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 );
1263 ssl->out_msg[offset+1] = (unsigned char)( *olen );
1264 *olen += 2;
1265 }
1266#endif
1267
1268 return( 0 );
1269}
1270#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED ||
1271 POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001272
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001273#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001274#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001275 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1276 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001277static int ssl_parse_signature_algorithm( ssl_context *ssl,
1278 unsigned char **p,
1279 unsigned char *end,
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001280 md_type_t *md_alg,
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001281 pk_type_t *pk_alg )
Paul Bakker29e1f122013-04-16 13:07:56 +02001282{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001283 ((void) ssl);
Paul Bakker29e1f122013-04-16 13:07:56 +02001284 *md_alg = POLARSSL_MD_NONE;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001285 *pk_alg = POLARSSL_PK_NONE;
1286
1287 /* Only in TLS 1.2 */
1288 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
1289 {
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001290 return( 0 );
1291 }
Paul Bakker29e1f122013-04-16 13:07:56 +02001292
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001293 if( (*p) + 2 > end )
Paul Bakker29e1f122013-04-16 13:07:56 +02001294 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1295
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001296 /*
1297 * Get hash algorithm
1298 */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02001299 if( ( *md_alg = ssl_md_alg_from_hash( (*p)[0] ) ) == POLARSSL_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02001300 {
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02001301 SSL_DEBUG_MSG( 2, ( "Server used unsupported "
1302 "HashAlgorithm %d", *(p)[0] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001303 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1304 }
1305
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001306 /*
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001307 * Get signature algorithm
1308 */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02001309 if( ( *pk_alg = ssl_pk_alg_from_sig( (*p)[1] ) ) == POLARSSL_PK_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02001310 {
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02001311 SSL_DEBUG_MSG( 2, ( "server used unsupported "
1312 "SignatureAlgorithm %d", (*p)[1] ) );
1313 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
Paul Bakker29e1f122013-04-16 13:07:56 +02001314 }
1315
1316 SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
1317 SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
1318 *p += 2;
1319
1320 return( 0 );
1321}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001322#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001323 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
1324 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001325#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001326
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001327
1328#if defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
1329 defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
1330static int ssl_get_ecdh_params_from_cert( ssl_context *ssl )
1331{
1332 int ret;
1333 const ecp_keypair *peer_key;
1334
1335 if( ! pk_can_do( &ssl->session_negotiate->peer_cert->pk,
1336 POLARSSL_PK_ECKEY ) )
1337 {
1338 SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
1339 return( POLARSSL_ERR_SSL_PK_TYPE_MISMATCH );
1340 }
1341
1342 peer_key = pk_ec( ssl->session_negotiate->peer_cert->pk );
1343
1344 if( ( ret = ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
1345 POLARSSL_ECDH_THEIRS ) ) != 0 )
1346 {
1347 SSL_DEBUG_RET( 1, ( "ecdh_get_params" ), ret );
1348 return( ret );
1349 }
1350
1351 if( ssl_check_server_ecdh_params( ssl ) != 0 )
1352 {
1353 SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH length)" ) );
1354 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE );
1355 }
1356
1357 return( ret );
1358}
1359#endif /* POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
1360 POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
1361
Paul Bakker41c83d32013-03-20 14:39:14 +01001362static int ssl_parse_server_key_exchange( ssl_context *ssl )
1363{
Paul Bakker23986e52011-04-24 08:57:21 +00001364 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001365 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001366 unsigned char *p, *end;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001367#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001368 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1369 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001370 size_t sig_len, params_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001371 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +02001372 md_type_t md_alg = POLARSSL_MD_NONE;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001373 size_t hashlen;
1374 pk_type_t pk_alg = POLARSSL_PK_NONE;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001375#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001376
1377 SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
1378
Manuel Pégourié-Gonnardbac0e3b2013-10-15 11:54:47 +02001379#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001380 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001381 {
1382 SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
1383 ssl->state++;
1384 return( 0 );
1385 }
Manuel Pégourié-Gonnardbac0e3b2013-10-15 11:54:47 +02001386 ((void) p);
1387 ((void) end);
1388#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001389
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001390#if defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
1391 defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
1392 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_RSA ||
1393 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_ECDSA )
1394 {
1395 ssl_get_ecdh_params_from_cert( ssl );
1396
1397 SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
1398 ssl->state++;
1399 return( 0 );
1400 }
1401 ((void) p);
1402 ((void) end);
1403#endif
1404
Paul Bakker5121ce52009-01-03 21:22:43 +00001405 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1406 {
1407 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1408 return( ret );
1409 }
1410
1411 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1412 {
1413 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001414 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001415 }
1416
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001417 /*
1418 * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
1419 * doesn't use a psk_identity_hint
1420 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001421 if( ssl->in_msg[0] != SSL_HS_SERVER_KEY_EXCHANGE )
1422 {
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001423 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1424 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK )
Paul Bakker188c8de2013-04-19 09:13:37 +02001425 {
1426 ssl->record_read = 1;
1427 goto exit;
1428 }
1429
1430 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1431 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001432 }
1433
Paul Bakker3b6a07b2013-03-21 11:56:50 +01001434 p = ssl->in_msg + 4;
1435 end = ssl->in_msg + ssl->in_hslen;
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001436 SSL_DEBUG_BUF( 3, "server key exchange", p, ssl->in_hslen - 4 );
Paul Bakker3b6a07b2013-03-21 11:56:50 +01001437
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001438#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
1439 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1440 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
1441 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
1442 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
1443 {
1444 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
1445 {
1446 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1447 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1448 }
1449 } /* FALLTROUGH */
1450#endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
1451
1452#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
1453 defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
1454 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1455 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK )
1456 ; /* nothing more to do */
1457 else
1458#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
1459 POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED */
1460#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1461 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1462 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1463 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00001464 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001465 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001466 {
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001467 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001468 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1469 }
1470 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001471 else
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001472#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1473 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001474#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001475 defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001476 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
1477 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA ||
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001478 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK ||
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001479 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001480 {
1481 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
1482 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001483 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1484 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1485 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001486 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001487 else
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001488#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001489 POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001490 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01001491 {
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02001492 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001493 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1494 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001495
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001496#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001497 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1498 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001499 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001500 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA ||
1501 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001502 {
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001503 params_len = p - ( ssl->in_msg + 4 );
1504
Paul Bakker29e1f122013-04-16 13:07:56 +02001505 /*
1506 * Handle the digitally-signed structure
1507 */
Paul Bakker9659dae2013-08-28 16:21:34 +02001508#if defined(POLARSSL_SSL_PROTO_TLS1_2)
1509 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001510 {
Paul Bakker9659dae2013-08-28 16:21:34 +02001511 if( ssl_parse_signature_algorithm( ssl, &p, end,
1512 &md_alg, &pk_alg ) != 0 )
1513 {
1514 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1515 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1516 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001517
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02001518 if( pk_alg != ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001519 {
1520 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1521 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1522 }
1523 }
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02001524 else
Paul Bakker577e0062013-08-28 11:57:20 +02001525#endif
Paul Bakker9659dae2013-08-28 16:21:34 +02001526#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
1527 defined(POLARSSL_SSL_PROTO_TLS1_1)
1528 if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
Manuel Pégourié-Gonnard09edda82013-08-19 13:50:33 +02001529 {
1530 pk_alg = ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
Paul Bakker1ef83d62012-04-11 12:09:53 +00001531
Paul Bakker9659dae2013-08-28 16:21:34 +02001532 /* Default hash for ECDSA is SHA-1 */
1533 if( pk_alg == POLARSSL_PK_ECDSA && md_alg == POLARSSL_MD_NONE )
1534 md_alg = POLARSSL_MD_SHA1;
1535 }
1536 else
1537#endif
1538 {
1539 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1540 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1541 }
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02001542
1543 /*
1544 * Read signature
1545 */
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001546 sig_len = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00001547 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001548
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001549 if( end != p + sig_len )
Paul Bakker41c83d32013-03-20 14:39:14 +01001550 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001551 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001552 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1553 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001554
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02001555 SSL_DEBUG_BUF( 3, "signature", p, sig_len );
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001556
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001557 /*
1558 * Compute the hash that has been signed
1559 */
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001560#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
1561 defined(POLARSSL_SSL_PROTO_TLS1_1)
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02001562 if( md_alg == POLARSSL_MD_NONE )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001563 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001564 md5_context md5;
1565 sha1_context sha1;
1566
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02001567 hashlen = 36;
1568
Paul Bakker29e1f122013-04-16 13:07:56 +02001569 /*
1570 * digitally-signed struct {
1571 * opaque md5_hash[16];
1572 * opaque sha_hash[20];
1573 * };
1574 *
1575 * md5_hash
1576 * MD5(ClientHello.random + ServerHello.random
1577 * + ServerParams);
1578 * sha_hash
1579 * SHA(ClientHello.random + ServerHello.random
1580 * + ServerParams);
1581 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001582 md5_starts( &md5 );
1583 md5_update( &md5, ssl->handshake->randbytes, 64 );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001584 md5_update( &md5, ssl->in_msg + 4, params_len );
Paul Bakker29e1f122013-04-16 13:07:56 +02001585 md5_finish( &md5, hash );
1586
1587 sha1_starts( &sha1 );
1588 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001589 sha1_update( &sha1, ssl->in_msg + 4, params_len );
Paul Bakker29e1f122013-04-16 13:07:56 +02001590 sha1_finish( &sha1, hash + 16 );
Paul Bakker29e1f122013-04-16 13:07:56 +02001591 }
1592 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001593#endif /* POLARSSL_SSL_PROTO_SSL3 || POLARSSL_SSL_PROTO_TLS1 || \
1594 POLARSSL_SSL_PROTO_TLS1_1 */
Paul Bakker9659dae2013-08-28 16:21:34 +02001595#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
1596 defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker577e0062013-08-28 11:57:20 +02001597 if( md_alg != POLARSSL_MD_NONE )
Paul Bakker29e1f122013-04-16 13:07:56 +02001598 {
1599 md_context_t ctx;
1600
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02001601 /* Info from md_alg will be used instead */
1602 hashlen = 0;
Paul Bakker29e1f122013-04-16 13:07:56 +02001603
1604 /*
1605 * digitally-signed struct {
1606 * opaque client_random[32];
1607 * opaque server_random[32];
1608 * ServerDHParams params;
1609 * };
1610 */
1611 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1612 {
1613 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1614 return( ret );
1615 }
1616
1617 md_starts( &ctx );
1618 md_update( &ctx, ssl->handshake->randbytes, 64 );
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001619 md_update( &ctx, ssl->in_msg + 4, params_len );
Paul Bakker29e1f122013-04-16 13:07:56 +02001620 md_finish( &ctx, hash );
Paul Bakker04376b12013-08-16 14:45:26 +02001621 md_free_ctx( &ctx );
Paul Bakker29e1f122013-04-16 13:07:56 +02001622 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001623 else
Paul Bakker9659dae2013-08-28 16:21:34 +02001624#endif /* POLARSSL_SSL_PROTO_TLS1 || POLARSSL_SSL_PROTO_TLS1_1 || \
1625 POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001626 {
Paul Bakker577e0062013-08-28 11:57:20 +02001627 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
1628 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1629 }
Paul Bakker29e1f122013-04-16 13:07:56 +02001630
Manuel Pégourié-Gonnard9cc6f5c2013-08-27 14:29:44 +02001631 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen != 0 ? hashlen :
1632 (unsigned int) ( md_info_from_type( md_alg ) )->size );
Paul Bakker29e1f122013-04-16 13:07:56 +02001633
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001634 /*
1635 * Verify signature
1636 */
Manuel Pégourié-Gonnardf4842822013-08-22 16:03:41 +02001637 if( ! pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001638 {
1639 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1640 return( POLARSSL_ERR_SSL_PK_TYPE_MISMATCH );
1641 }
1642
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001643 if( ( ret = pk_verify( &ssl->session_negotiate->peer_cert->pk,
1644 md_alg, hash, hashlen, p, sig_len ) ) != 0 )
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02001645 {
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001646 SSL_DEBUG_RET( 1, "pk_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001647 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001648 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001649 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001650#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001651 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
1652 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001653
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001654exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001655 ssl->state++;
1656
1657 SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
1658
1659 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001660}
1661
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01001662#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1663 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1664 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
1665 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
1666static int ssl_parse_certificate_request( ssl_context *ssl )
1667{
1668 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1669 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1670
1671 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
1672
1673 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1674 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
1675 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
1676 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
1677 {
1678 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
1679 ssl->state++;
1680 return( 0 );
1681 }
1682
1683 SSL_DEBUG_MSG( 1, ( "should not happen" ) );
1684 return( ret );
1685}
1686#else
Paul Bakker5121ce52009-01-03 21:22:43 +00001687static int ssl_parse_certificate_request( ssl_context *ssl )
1688{
1689 int ret;
Paul Bakker926af752012-11-23 13:38:07 +01001690 unsigned char *buf, *p;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001691 size_t n = 0, m = 0;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001692 size_t cert_type_len = 0, dn_len = 0;
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01001693 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001694
1695 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
1696
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01001697 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1698 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
1699 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
1700 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
1701 {
1702 SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
1703 ssl->state++;
1704 return( 0 );
1705 }
1706
Paul Bakker5121ce52009-01-03 21:22:43 +00001707 /*
1708 * 0 . 0 handshake type
1709 * 1 . 3 handshake length
Paul Bakker926af752012-11-23 13:38:07 +01001710 * 4 . 4 cert type count
1711 * 5 .. m-1 cert types
1712 * m .. m+1 sig alg length (TLS 1.2 only)
1713 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001714 * n .. n+1 length of all DNs
1715 * n+2 .. n+3 length of DN 1
1716 * n+4 .. ... Distinguished Name #1
1717 * ... .. ... length of DN 2, etc.
1718 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001719 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001720 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001721 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1722 {
1723 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1724 return( ret );
1725 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001726
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001727 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1728 {
1729 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1730 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1731 }
1732
1733 ssl->record_read = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001734 }
1735
1736 ssl->client_auth = 0;
1737 ssl->state++;
1738
1739 if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST )
1740 ssl->client_auth++;
1741
1742 SSL_DEBUG_MSG( 3, ( "got %s certificate request",
1743 ssl->client_auth ? "a" : "no" ) );
1744
Paul Bakker926af752012-11-23 13:38:07 +01001745 if( ssl->client_auth == 0 )
1746 goto exit;
1747
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001748 ssl->record_read = 0;
1749
Paul Bakker926af752012-11-23 13:38:07 +01001750 // TODO: handshake_failure alert for an anonymous server to request
1751 // client authentication
1752
1753 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001754
Paul Bakker926af752012-11-23 13:38:07 +01001755 // Retrieve cert types
1756 //
1757 cert_type_len = buf[4];
1758 n = cert_type_len;
1759
1760 if( ssl->in_hslen < 6 + n )
1761 {
1762 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1763 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1764 }
1765
Paul Bakker73d44312013-05-22 13:56:26 +02001766 p = buf + 5;
Paul Bakker926af752012-11-23 13:38:07 +01001767 while( cert_type_len > 0 )
1768 {
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02001769#if defined(POLARSSL_RSA_C)
1770 if( *p == SSL_CERT_TYPE_RSA_SIGN &&
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02001771 pk_can_do( ssl_own_key( ssl ), POLARSSL_PK_RSA ) )
Paul Bakker926af752012-11-23 13:38:07 +01001772 {
1773 ssl->handshake->cert_type = SSL_CERT_TYPE_RSA_SIGN;
1774 break;
1775 }
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02001776 else
1777#endif
1778#if defined(POLARSSL_ECDSA_C)
1779 if( *p == SSL_CERT_TYPE_ECDSA_SIGN &&
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02001780 pk_can_do( ssl_own_key( ssl ), POLARSSL_PK_ECDSA ) )
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02001781 {
1782 ssl->handshake->cert_type = SSL_CERT_TYPE_ECDSA_SIGN;
1783 break;
1784 }
1785 else
1786#endif
1787 {
1788 ; /* Unsupported cert type, ignore */
1789 }
Paul Bakker926af752012-11-23 13:38:07 +01001790
1791 cert_type_len--;
1792 p++;
1793 }
1794
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001795#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker926af752012-11-23 13:38:07 +01001796 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
1797 {
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02001798 /* Ignored, see comments about hash in write_certificate_verify */
1799 // TODO: should check the signature part against our pk_key though
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001800 size_t sig_alg_len = ( ( buf[5 + n] << 8 )
1801 | ( buf[6 + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01001802
1803 p = buf + 7 + n;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001804 m += 2;
Paul Bakker926af752012-11-23 13:38:07 +01001805 n += sig_alg_len;
1806
1807 if( ssl->in_hslen < 6 + n )
1808 {
1809 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1810 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1811 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001812 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001813#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker926af752012-11-23 13:38:07 +01001814
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02001815 /* Ignore certificate_authorities, we only have one cert anyway */
1816 // TODO: should not send cert if no CA matches
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001817 dn_len = ( ( buf[5 + m + n] << 8 )
1818 | ( buf[6 + m + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01001819
1820 n += dn_len;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001821 if( ssl->in_hslen != 7 + m + n )
Paul Bakker926af752012-11-23 13:38:07 +01001822 {
1823 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1824 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1825 }
1826
1827exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001828 SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
1829
1830 return( 0 );
1831}
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01001832#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1833 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1834 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&
1835 !POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001836
1837static int ssl_parse_server_hello_done( ssl_context *ssl )
1838{
1839 int ret;
1840
1841 SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
1842
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001843 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001844 {
1845 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1846 {
1847 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1848 return( ret );
1849 }
1850
1851 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1852 {
1853 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001854 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001855 }
1856 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001857 ssl->record_read = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001858
1859 if( ssl->in_hslen != 4 ||
1860 ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE )
1861 {
1862 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001863 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001864 }
1865
1866 ssl->state++;
1867
1868 SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
1869
1870 return( 0 );
1871}
1872
1873static int ssl_write_client_key_exchange( ssl_context *ssl )
1874{
Paul Bakker23986e52011-04-24 08:57:21 +00001875 int ret;
1876 size_t i, n;
Paul Bakker41c83d32013-03-20 14:39:14 +01001877 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001878
1879 SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
1880
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001881#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001882 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001883 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001884 /*
1885 * DHM key exchange -- send G^X mod P
1886 */
Paul Bakker48916f92012-09-16 19:57:18 +00001887 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001888
1889 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1890 ssl->out_msg[5] = (unsigned char)( n );
1891 i = 6;
1892
Paul Bakker29b64762012-09-25 09:36:44 +00001893 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02001894 (int) mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker5121ce52009-01-03 21:22:43 +00001895 &ssl->out_msg[i], n,
1896 ssl->f_rng, ssl->p_rng );
1897 if( ret != 0 )
1898 {
1899 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1900 return( ret );
1901 }
1902
Paul Bakker48916f92012-09-16 19:57:18 +00001903 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1904 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00001905
Paul Bakker48916f92012-09-16 19:57:18 +00001906 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001907
Paul Bakker48916f92012-09-16 19:57:18 +00001908 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1909 ssl->handshake->premaster,
Manuel Pégourié-Gonnard2d627642013-09-04 14:22:07 +02001910 &ssl->handshake->pmslen,
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +02001911 ssl->f_rng, ssl->p_rng ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001912 {
1913 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1914 return( ret );
1915 }
1916
Paul Bakker48916f92012-09-16 19:57:18 +00001917 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00001918 }
1919 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001920#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001921#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001922 defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
1923 defined(POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
1924 defined(POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001925 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA ||
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001926 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA ||
1927 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_RSA ||
1928 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDH_ECDSA )
Paul Bakker41c83d32013-03-20 14:39:14 +01001929 {
1930 /*
1931 * ECDH key exchange -- send client public value
1932 */
1933 i = 4;
1934
1935 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx,
1936 &n,
1937 &ssl->out_msg[i], 1000,
1938 ssl->f_rng, ssl->p_rng );
1939 if( ret != 0 )
1940 {
1941 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
1942 return( ret );
1943 }
1944
1945 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
1946
1947 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
1948 &ssl->handshake->pmslen,
1949 ssl->handshake->premaster,
Manuel Pégourié-Gonnarde09d2f82013-09-02 14:29:09 +02001950 POLARSSL_MPI_MAX_SIZE,
1951 ssl->f_rng, ssl->p_rng ) ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001952 {
1953 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
1954 return( ret );
1955 }
1956
1957 SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
1958 }
1959 else
Manuel Pégourié-Gonnard20846b12013-08-19 12:32:12 +02001960#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01001961 POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
1962 POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
1963 POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02001964#if defined(POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED)
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02001965 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001966 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02001967 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK ||
1968 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001969 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001970 /*
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001971 * opaque psk_identity<0..2^16-1>;
1972 */
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02001973 if( ssl->psk == NULL || ssl->psk_identity == NULL )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001974 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1975
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001976 i = 4;
1977 n = ssl->psk_identity_len;
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02001978 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
1979 ssl->out_msg[i++] = (unsigned char)( n );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001980
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02001981 memcpy( ssl->out_msg + i, ssl->psk_identity, ssl->psk_identity_len );
1982 i += ssl->psk_identity_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001983
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001984#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02001985 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001986 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02001987 n = 0;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001988 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02001989 else
1990#endif
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001991#if defined(POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED)
1992 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK )
1993 {
1994 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 )
1995 return( ret );
1996 }
1997 else
1998#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001999#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002000 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002001 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002002 /*
2003 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
2004 */
2005 n = ssl->handshake->dhm_ctx.len;
2006 ssl->out_msg[i++] = (unsigned char)( n >> 8 );
2007 ssl->out_msg[i++] = (unsigned char)( n );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002008
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002009 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
Paul Bakker68881672013-10-15 13:24:01 +02002010 (int) mpi_size( &ssl->handshake->dhm_ctx.P ),
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002011 &ssl->out_msg[i], n,
2012 ssl->f_rng, ssl->p_rng );
2013 if( ret != 0 )
2014 {
2015 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
2016 return( ret );
2017 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002018 }
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002019 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002020#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02002021#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002022 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK )
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02002023 {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002024 /*
2025 * ClientECDiffieHellmanPublic public;
2026 */
2027 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx, &n,
2028 &ssl->out_msg[i], SSL_MAX_CONTENT_LEN - i,
2029 ssl->f_rng, ssl->p_rng );
2030 if( ret != 0 )
2031 {
2032 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
2033 return( ret );
2034 }
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02002035
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02002036 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
2037 }
2038 else
2039#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
2040 {
2041 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2042 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002043 }
2044
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002045 if( ( ret = ssl_psk_derive_premaster( ssl,
2046 ciphersuite_info->key_exchange ) ) != 0 )
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002047 {
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02002048 SSL_DEBUG_RET( 1, "ssl_psk_derive_premaster", ret );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002049 return( ret );
2050 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002051 }
2052 else
Manuel Pégourié-Gonnard8a3c64d2013-10-14 19:54:10 +02002053#endif /* POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002054#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02002055 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00002056 {
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002057 i = 4;
2058 if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 )
Paul Bakkera3d195c2011-11-27 21:07:34 +00002059 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002060 }
Paul Bakkered27a042013-04-18 22:46:23 +02002061 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002062#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02002063 {
2064 ((void) ciphersuite_info);
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02002065 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkered27a042013-04-18 22:46:23 +02002066 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
2067 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002068
Paul Bakkerff60ee62010-03-16 21:09:09 +00002069 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
2070 {
2071 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
2072 return( ret );
2073 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002074
2075 ssl->out_msglen = i + n;
2076 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2077 ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE;
2078
2079 ssl->state++;
2080
2081 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2082 {
2083 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2084 return( ret );
2085 }
2086
2087 SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
2088
2089 return( 0 );
2090}
2091
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002092#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
2093 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002094 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \
2095 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00002096static int ssl_write_certificate_verify( ssl_context *ssl )
2097{
Paul Bakkered27a042013-04-18 22:46:23 +02002098 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
2099 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002100
2101 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
2102
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002103 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnarddc953e82013-11-25 17:27:39 +01002104 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
Manuel Pégourié-Gonnard1b62c7f2013-10-14 14:02:19 +02002105 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK ||
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002106 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02002107 {
2108 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
2109 ssl->state++;
2110 return( 0 );
2111 }
2112
Manuel Pégourié-Gonnarda3104592013-09-17 21:17:44 +02002113 SSL_DEBUG_MSG( 1, ( "should not happen" ) );
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002114 return( ret );
2115}
2116#else
2117static int ssl_write_certificate_verify( ssl_context *ssl )
2118{
2119 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
2120 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
2121 size_t n = 0, offset = 0;
2122 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002123 unsigned char *hash_start = hash;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002124 md_type_t md_alg = POLARSSL_MD_NONE;
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02002125 unsigned int hashlen;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002126
2127 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
2128
2129 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnarddc953e82013-11-25 17:27:39 +01002130 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA_PSK ||
Manuel Pégourié-Gonnard1b62c7f2013-10-14 14:02:19 +02002131 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_PSK ||
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002132 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
2133 {
2134 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
2135 ssl->state++;
2136 return( 0 );
2137 }
2138
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002139 if( ssl->client_auth == 0 || ssl_own_cert( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002140 {
2141 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
2142 ssl->state++;
2143 return( 0 );
2144 }
2145
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002146 if( ssl_own_key( ssl ) == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00002147 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00002148 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
2149 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00002150 }
2151
2152 /*
2153 * Make an RSA signature of the handshake digests
2154 */
Paul Bakker48916f92012-09-16 19:57:18 +00002155 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00002156
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002157#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
2158 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker926af752012-11-23 13:38:07 +01002159 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00002160 {
Paul Bakker926af752012-11-23 13:38:07 +01002161 /*
2162 * digitally-signed struct {
2163 * opaque md5_hash[16];
2164 * opaque sha_hash[20];
2165 * };
2166 *
2167 * md5_hash
2168 * MD5(handshake_messages);
2169 *
2170 * sha_hash
2171 * SHA(handshake_messages);
2172 */
2173 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02002174 md_alg = POLARSSL_MD_NONE;
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002175
2176 /*
2177 * For ECDSA, default hash is SHA-1 only
2178 */
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002179 if( pk_can_do( ssl_own_key( ssl ), POLARSSL_PK_ECDSA ) )
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002180 {
2181 hash_start += 16;
2182 hashlen -= 16;
2183 md_alg = POLARSSL_MD_SHA1;
2184 }
Paul Bakker926af752012-11-23 13:38:07 +01002185 }
2186 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002187#endif /* POLARSSL_SSL_PROTO_SSL3 || POLARSSL_SSL_PROTO_TLS1 || \
2188 POLARSSL_SSL_PROTO_TLS1_1 */
2189#if defined(POLARSSL_SSL_PROTO_TLS1_2)
2190 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01002191 {
2192 /*
2193 * digitally-signed struct {
2194 * opaque handshake_messages[handshake_messages_length];
2195 * };
2196 *
2197 * Taking shortcut here. We assume that the server always allows the
2198 * PRF Hash function and has sent it in the allowed signature
2199 * algorithms list received in the Certificate Request message.
2200 *
2201 * Until we encounter a server that does not, we will take this
2202 * shortcut.
2203 *
2204 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
2205 * in order to satisfy 'weird' needs from the server side.
2206 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01002207 if( ssl->transform_negotiate->ciphersuite_info->mac ==
2208 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00002209 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02002210 md_alg = POLARSSL_MD_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002211 ssl->out_msg[4] = SSL_HASH_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002212 }
2213 else
2214 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02002215 md_alg = POLARSSL_MD_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002216 ssl->out_msg[4] = SSL_HASH_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00002217 }
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002218 ssl->out_msg[5] = ssl_sig_from_pk( ssl_own_key( ssl ) );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002219
Manuel Pégourié-Gonnardbfe32ef2013-08-22 14:55:30 +02002220 /* Info from md_alg will be used instead */
2221 hashlen = 0;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002222 offset = 2;
2223 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002224 else
2225#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker577e0062013-08-28 11:57:20 +02002226 {
2227 SSL_DEBUG_MSG( 1, ( "should never happen" ) );
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002228 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker577e0062013-08-28 11:57:20 +02002229 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002230
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02002231 if( ( ret = pk_sign( ssl_own_key( ssl ), md_alg, hash_start, hashlen,
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02002232 ssl->out_msg + 6 + offset, &n,
2233 ssl->f_rng, ssl->p_rng ) ) != 0 )
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02002234 {
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02002235 SSL_DEBUG_RET( 1, "pk_sign", ret );
2236 return( ret );
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02002237 }
Paul Bakker926af752012-11-23 13:38:07 +01002238
Paul Bakker1ef83d62012-04-11 12:09:53 +00002239 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
2240 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002241
Paul Bakker1ef83d62012-04-11 12:09:53 +00002242 ssl->out_msglen = 6 + n + offset;
Paul Bakker5121ce52009-01-03 21:22:43 +00002243 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2244 ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY;
2245
2246 ssl->state++;
2247
2248 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2249 {
2250 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2251 return( ret );
2252 }
2253
2254 SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
2255
Paul Bakkered27a042013-04-18 22:46:23 +02002256 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002257}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002258#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2259 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2260 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002261
Paul Bakkera503a632013-08-14 13:48:06 +02002262#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002263static int ssl_parse_new_session_ticket( ssl_context *ssl )
2264{
2265 int ret;
2266 uint32_t lifetime;
2267 size_t ticket_len;
2268 unsigned char *ticket;
2269
2270 SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
2271
2272 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2273 {
2274 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2275 return( ret );
2276 }
2277
2278 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2279 {
2280 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
2281 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
2282 }
2283
2284 /*
2285 * struct {
2286 * uint32 ticket_lifetime_hint;
2287 * opaque ticket<0..2^16-1>;
2288 * } NewSessionTicket;
2289 *
2290 * 0 . 0 handshake message type
2291 * 1 . 3 handshake message length
2292 * 4 . 7 ticket_lifetime_hint
2293 * 8 . 9 ticket_len (n)
2294 * 10 . 9+n ticket content
2295 */
2296 if( ssl->in_msg[0] != SSL_HS_NEW_SESSION_TICKET ||
2297 ssl->in_hslen < 10 )
2298 {
2299 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
2300 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
2301 }
2302
2303 lifetime = ( ssl->in_msg[4] << 24 ) | ( ssl->in_msg[5] << 16 ) |
2304 ( ssl->in_msg[6] << 8 ) | ( ssl->in_msg[7] );
2305
2306 ticket_len = ( ssl->in_msg[8] << 8 ) | ( ssl->in_msg[9] );
2307
2308 if( ticket_len + 10 != ssl->in_hslen )
2309 {
2310 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
2311 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
2312 }
2313
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002314 SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
2315
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002316 /* We're not waiting for a NewSessionTicket message any more */
2317 ssl->handshake->new_session_ticket = 0;
2318
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002319 /*
2320 * Zero-length ticket means the server changed his mind and doesn't want
2321 * to send a ticket after all, so just forget it
2322 */
2323 if( ticket_len == 0)
2324 return( 0 );
2325
2326 polarssl_free( ssl->session_negotiate->ticket );
2327 ssl->session_negotiate->ticket = NULL;
2328 ssl->session_negotiate->ticket_len = 0;
2329
2330 if( ( ticket = polarssl_malloc( ticket_len ) ) == NULL )
2331 {
2332 SSL_DEBUG_MSG( 1, ( "ticket malloc failed" ) );
2333 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2334 }
2335
2336 memcpy( ticket, ssl->in_msg + 10, ticket_len );
2337
2338 ssl->session_negotiate->ticket = ticket;
2339 ssl->session_negotiate->ticket_len = ticket_len;
2340 ssl->session_negotiate->ticket_lifetime = lifetime;
2341
2342 /*
2343 * RFC 5077 section 3.4:
2344 * "If the client receives a session ticket from the server, then it
2345 * discards any Session ID that was sent in the ServerHello."
2346 */
2347 SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
2348 ssl->session_negotiate->length = 0;
2349
2350 SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
2351
2352 return( 0 );
2353}
Paul Bakkera503a632013-08-14 13:48:06 +02002354#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002355
Paul Bakker5121ce52009-01-03 21:22:43 +00002356/*
Paul Bakker1961b702013-01-25 14:49:24 +01002357 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00002358 */
Paul Bakker1961b702013-01-25 14:49:24 +01002359int ssl_handshake_client_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002360{
2361 int ret = 0;
2362
Paul Bakker1961b702013-01-25 14:49:24 +01002363 if( ssl->state == SSL_HANDSHAKE_OVER )
2364 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002365
Paul Bakker1961b702013-01-25 14:49:24 +01002366 SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
2367
2368 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
2369 return( ret );
2370
2371 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00002372 {
Paul Bakker1961b702013-01-25 14:49:24 +01002373 case SSL_HELLO_REQUEST:
2374 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002375 break;
2376
Paul Bakker1961b702013-01-25 14:49:24 +01002377 /*
2378 * ==> ClientHello
2379 */
2380 case SSL_CLIENT_HELLO:
2381 ret = ssl_write_client_hello( ssl );
2382 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002383
Paul Bakker1961b702013-01-25 14:49:24 +01002384 /*
2385 * <== ServerHello
2386 * Certificate
2387 * ( ServerKeyExchange )
2388 * ( CertificateRequest )
2389 * ServerHelloDone
2390 */
2391 case SSL_SERVER_HELLO:
2392 ret = ssl_parse_server_hello( ssl );
2393 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002394
Paul Bakker1961b702013-01-25 14:49:24 +01002395 case SSL_SERVER_CERTIFICATE:
2396 ret = ssl_parse_certificate( ssl );
2397 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002398
Paul Bakker1961b702013-01-25 14:49:24 +01002399 case SSL_SERVER_KEY_EXCHANGE:
2400 ret = ssl_parse_server_key_exchange( ssl );
2401 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002402
Paul Bakker1961b702013-01-25 14:49:24 +01002403 case SSL_CERTIFICATE_REQUEST:
2404 ret = ssl_parse_certificate_request( ssl );
2405 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002406
Paul Bakker1961b702013-01-25 14:49:24 +01002407 case SSL_SERVER_HELLO_DONE:
2408 ret = ssl_parse_server_hello_done( ssl );
2409 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002410
Paul Bakker1961b702013-01-25 14:49:24 +01002411 /*
2412 * ==> ( Certificate/Alert )
2413 * ClientKeyExchange
2414 * ( CertificateVerify )
2415 * ChangeCipherSpec
2416 * Finished
2417 */
2418 case SSL_CLIENT_CERTIFICATE:
2419 ret = ssl_write_certificate( ssl );
2420 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002421
Paul Bakker1961b702013-01-25 14:49:24 +01002422 case SSL_CLIENT_KEY_EXCHANGE:
2423 ret = ssl_write_client_key_exchange( ssl );
2424 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002425
Paul Bakker1961b702013-01-25 14:49:24 +01002426 case SSL_CERTIFICATE_VERIFY:
2427 ret = ssl_write_certificate_verify( ssl );
2428 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002429
Paul Bakker1961b702013-01-25 14:49:24 +01002430 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
2431 ret = ssl_write_change_cipher_spec( ssl );
2432 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002433
Paul Bakker1961b702013-01-25 14:49:24 +01002434 case SSL_CLIENT_FINISHED:
2435 ret = ssl_write_finished( ssl );
2436 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002437
Paul Bakker1961b702013-01-25 14:49:24 +01002438 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002439 * <== ( NewSessionTicket )
2440 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01002441 * Finished
2442 */
2443 case SSL_SERVER_CHANGE_CIPHER_SPEC:
Paul Bakkera503a632013-08-14 13:48:06 +02002444#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002445 if( ssl->handshake->new_session_ticket != 0 )
2446 ret = ssl_parse_new_session_ticket( ssl );
2447 else
Paul Bakkera503a632013-08-14 13:48:06 +02002448#endif
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002449 ret = ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01002450 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002451
Paul Bakker1961b702013-01-25 14:49:24 +01002452 case SSL_SERVER_FINISHED:
2453 ret = ssl_parse_finished( ssl );
2454 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002455
Paul Bakker1961b702013-01-25 14:49:24 +01002456 case SSL_FLUSH_BUFFERS:
2457 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
2458 ssl->state = SSL_HANDSHAKE_WRAPUP;
2459 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002460
Paul Bakker1961b702013-01-25 14:49:24 +01002461 case SSL_HANDSHAKE_WRAPUP:
2462 ssl_handshake_wrapup( ssl );
2463 break;
Paul Bakker48916f92012-09-16 19:57:18 +00002464
Paul Bakker1961b702013-01-25 14:49:24 +01002465 default:
2466 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
2467 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
2468 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002469
2470 return( ret );
2471}
Paul Bakker5121ce52009-01-03 21:22:43 +00002472#endif