blob: e37a3c044f2ba6cb6a807ffc0fc4e6d03825fcbf [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 client-side functions
3 *
Paul Bakker68884e32013-01-07 18:20:04 +01004 * Copyright (C) 2006-2013, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
Paul Bakker40e46942009-01-03 21:51:57 +000026#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Paul Bakker40e46942009-01-03 21:51:57 +000028#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Paul Bakker40e46942009-01-03 21:51:57 +000030#include "polarssl/debug.h"
31#include "polarssl/ssl.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000032
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020033#if defined(POLARSSL_MEMORY_C)
34#include "polarssl/memory.h"
35#else
36#define polarssl_malloc malloc
37#define polarssl_free free
38#endif
39
Paul Bakker5121ce52009-01-03 21:22:43 +000040#include <stdlib.h>
41#include <stdio.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020042
43#ifdef _MSC_VER
44#include <basetsd.h>
45typedef UINT32 uint32_t;
46#else
47#include <inttypes.h>
48#endif
49
50#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +000051#include <time.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020052#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000053
Paul 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;
140 unsigned char sig_alg_list[20];
141 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 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200153#if defined(POLARSSL_SHA512_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100154 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA512;
155 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
156 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA384;
157 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
158#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200159#if defined(POLARSSL_SHA256_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100160 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA256;
161 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
162 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA224;
163 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
164#endif
165#if defined(POLARSSL_SHA1_C)
166 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA1;
167 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
168#endif
169#if defined(POLARSSL_MD5_C)
170 sig_alg_list[sig_alg_len++] = SSL_HASH_MD5;
171 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
172#endif
173
174 /*
175 * enum {
176 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
177 * sha512(6), (255)
178 * } HashAlgorithm;
179 *
180 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
181 * SignatureAlgorithm;
182 *
183 * struct {
184 * HashAlgorithm hash;
185 * SignatureAlgorithm signature;
186 * } SignatureAndHashAlgorithm;
187 *
188 * SignatureAndHashAlgorithm
189 * supported_signature_algorithms<2..2^16-2>;
190 */
191 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
192 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG ) & 0xFF );
193
194 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
195 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
196
197 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
198 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
199
200 memcpy( p, sig_alg_list, sig_alg_len );
201
202 *olen = 6 + sig_alg_len;
203}
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200204#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100205
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200206#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100207static void ssl_write_supported_elliptic_curves_ext( ssl_context *ssl,
208 unsigned char *buf,
209 size_t *olen )
210{
211 unsigned char *p = buf;
212 unsigned char elliptic_curve_list[20];
213 size_t elliptic_curve_len = 0;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200214 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100215
216 *olen = 0;
217
218 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
219
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200220#if defined(POLARSSL_ECP_DP_SECP521R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100221 elliptic_curve_list[elliptic_curve_len++] = 0x00;
222 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP521R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200223#endif
224#if defined(POLARSSL_ECP_DP_SECP384R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100225 elliptic_curve_list[elliptic_curve_len++] = 0x00;
226 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP384R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200227#endif
228#if defined(POLARSSL_ECP_DP_SECP256R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100229 elliptic_curve_list[elliptic_curve_len++] = 0x00;
230 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP256R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200231#endif
232#if defined(POLARSSL_ECP_DP_SECP224R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100233 elliptic_curve_list[elliptic_curve_len++] = 0x00;
234 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP224R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200235#endif
236#if defined(POLARSSL_ECP_DP_SECP192R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100237 elliptic_curve_list[elliptic_curve_len++] = 0x00;
238 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP192R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200239#endif
240
241 if( elliptic_curve_len == 0 )
242 return;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100243
244 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
245 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
246
247 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
248 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
249
250 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
251 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
252
253 memcpy( p, elliptic_curve_list, elliptic_curve_len );
254
255 *olen = 6 + elliptic_curve_len;
256}
257
258static void ssl_write_supported_point_formats_ext( ssl_context *ssl,
259 unsigned char *buf,
260 size_t *olen )
261{
262 unsigned char *p = buf;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200263 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100264
265 *olen = 0;
266
267 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
268
269 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
270 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
271
272 *p++ = 0x00;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100273 *p++ = 2;
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200274
275 *p++ = 1;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100276 *p++ = POLARSSL_ECP_PF_UNCOMPRESSED;
277
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200278 *olen = 6;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100279}
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200280#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100281
Paul Bakker05decb22013-08-15 13:33:48 +0200282#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200283static void ssl_write_max_fragment_length_ext( ssl_context *ssl,
284 unsigned char *buf,
285 size_t *olen )
286{
287 unsigned char *p = buf;
288
289 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ) {
290 *olen = 0;
291 return;
292 }
293
294 SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
295
296 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
297 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
298
299 *p++ = 0x00;
300 *p++ = 1;
301
302 *p++ = ssl->mfl_code;
303
304 *olen = 5;
305}
Paul Bakker05decb22013-08-15 13:33:48 +0200306#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200307
Paul Bakker1f2bc622013-08-15 13:45:55 +0200308#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200309static void ssl_write_truncated_hmac_ext( ssl_context *ssl,
310 unsigned char *buf, size_t *olen )
311{
312 unsigned char *p = buf;
313
314 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED )
315 {
316 *olen = 0;
317 return;
318 }
319
320 SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
321
322 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
323 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
324
325 *p++ = 0x00;
326 *p++ = 0x00;
327
328 *olen = 4;
329}
Paul Bakker1f2bc622013-08-15 13:45:55 +0200330#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200331
Paul Bakkera503a632013-08-14 13:48:06 +0200332#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200333static void ssl_write_session_ticket_ext( ssl_context *ssl,
334 unsigned char *buf, size_t *olen )
335{
336 unsigned char *p = buf;
337 size_t tlen = ssl->session_negotiate->ticket_len;
338
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200339 if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED )
340 {
341 *olen = 0;
342 return;
343 }
344
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200345 SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
346
347 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
348 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET ) & 0xFF );
349
350 *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
351 *p++ = (unsigned char)( ( tlen ) & 0xFF );
352
353 *olen = 4;
354
355 if( ssl->session_negotiate->ticket == NULL ||
356 ssl->session_negotiate->ticket_len == 0 )
357 {
358 return;
359 }
360
361 SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
362
363 memcpy( p, ssl->session_negotiate->ticket, tlen );
364
365 *olen += tlen;
366}
Paul Bakkera503a632013-08-14 13:48:06 +0200367#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200368
Paul Bakker5121ce52009-01-03 21:22:43 +0000369static int ssl_write_client_hello( ssl_context *ssl )
370{
Paul Bakker23986e52011-04-24 08:57:21 +0000371 int ret;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100372 size_t i, n, olen, ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000373 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200374 unsigned char *p, *q;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200375#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000376 time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200377#endif
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200378 const int *ciphersuites;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200379 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000380
381 SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
382
Paul Bakker48916f92012-09-16 19:57:18 +0000383 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
384 {
Paul Bakker993d11d2012-09-28 15:00:12 +0000385 ssl->major_ver = ssl->min_major_ver;
386 ssl->minor_ver = ssl->min_minor_ver;
Paul Bakker48916f92012-09-16 19:57:18 +0000387 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000388
Paul Bakker490ecc82011-10-06 13:04:09 +0000389 if( ssl->max_major_ver == 0 && ssl->max_minor_ver == 0 )
390 {
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200391 ssl->max_major_ver = SSL_MAX_MAJOR_VERSION;
392 ssl->max_minor_ver = SSL_MAX_MINOR_VERSION;
Paul Bakker490ecc82011-10-06 13:04:09 +0000393 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000394
395 /*
396 * 0 . 0 handshake type
397 * 1 . 3 handshake length
398 * 4 . 5 highest version supported
399 * 6 . 9 current UNIX time
400 * 10 . 37 random bytes
401 */
402 buf = ssl->out_msg;
403 p = buf + 4;
404
405 *p++ = (unsigned char) ssl->max_major_ver;
406 *p++ = (unsigned char) ssl->max_minor_ver;
407
408 SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
409 buf[4], buf[5] ) );
410
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200411#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000412 t = time( NULL );
413 *p++ = (unsigned char)( t >> 24 );
414 *p++ = (unsigned char)( t >> 16 );
415 *p++ = (unsigned char)( t >> 8 );
416 *p++ = (unsigned char)( t );
417
418 SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200419#else
420 if( ( ret = ssl->f_rng( ssl->p_rng, p, 4 ) ) != 0 )
421 return( ret );
422
423 p += 4;
424#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000425
Paul Bakkera3d195c2011-11-27 21:07:34 +0000426 if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
427 return( ret );
428
429 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +0000430
Paul Bakker48916f92012-09-16 19:57:18 +0000431 memcpy( ssl->handshake->randbytes, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000432
433 SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 6, 32 );
434
435 /*
436 * 38 . 38 session id length
437 * 39 . 39+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000438 * 40+n . 41+n ciphersuitelist length
439 * 42+n . .. ciphersuitelist
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000440 * .. . .. compression methods length
441 * .. . .. compression methods
442 * .. . .. extensions length
443 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +0000444 */
Paul Bakker48916f92012-09-16 19:57:18 +0000445 n = ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +0000446
Paul Bakker0a597072012-09-25 21:55:46 +0000447 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE || n < 16 || n > 32 ||
448 ssl->handshake->resume == 0 )
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200449 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000450 n = 0;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200451 }
452
Paul Bakkera503a632013-08-14 13:48:06 +0200453#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200454 /*
455 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
456 * generate and include a Session ID in the TLS ClientHello."
457 */
458 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
459 ssl->session_negotiate->ticket != NULL &&
460 ssl->session_negotiate->ticket_len != 0 )
461 {
462 ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id, 32 );
463
464 if( ret != 0 )
465 return( ret );
466
467 ssl->session_negotiate->length = n = 32;
468 }
Paul Bakkera503a632013-08-14 13:48:06 +0200469#endif /* POLARSSL_SSL_SESSION_TICKETS */
Paul Bakker5121ce52009-01-03 21:22:43 +0000470
471 *p++ = (unsigned char) n;
472
473 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000474 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000475
476 SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
477 SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
478
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200479 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
Paul Bakker2fbefde2013-06-29 16:01:15 +0200480 n = 0;
481 q = p;
482
483 // Skip writing ciphersuite length for now
484 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000485
Paul Bakker48916f92012-09-16 19:57:18 +0000486 /*
487 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
488 */
489 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
490 {
491 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
492 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO );
Paul Bakker2fbefde2013-06-29 16:01:15 +0200493 n++;
Paul Bakker48916f92012-09-16 19:57:18 +0000494 }
495
Paul Bakker2fbefde2013-06-29 16:01:15 +0200496 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000497 {
Paul Bakker2fbefde2013-06-29 16:01:15 +0200498 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
499
500 if( ciphersuite_info == NULL )
501 continue;
502
503 if( ciphersuite_info->min_minor_ver > ssl->max_minor_ver ||
504 ciphersuite_info->max_minor_ver < ssl->min_minor_ver )
505 continue;
506
Paul Bakkere3166ce2011-01-27 17:40:50 +0000507 SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %2d",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200508 ciphersuites[i] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000509
Paul Bakker2fbefde2013-06-29 16:01:15 +0200510 n++;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200511 *p++ = (unsigned char)( ciphersuites[i] >> 8 );
512 *p++ = (unsigned char)( ciphersuites[i] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000513 }
514
Paul Bakker2fbefde2013-06-29 16:01:15 +0200515 *q++ = (unsigned char)( n >> 7 );
516 *q++ = (unsigned char)( n << 1 );
517
518 SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
519
520
Paul Bakker2770fbd2012-07-03 13:30:23 +0000521#if defined(POLARSSL_ZLIB_SUPPORT)
522 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
523 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000524 SSL_COMPRESS_DEFLATE, SSL_COMPRESS_NULL ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000525
526 *p++ = 2;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000527 *p++ = SSL_COMPRESS_DEFLATE;
Paul Bakker48916f92012-09-16 19:57:18 +0000528 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000529#else
Paul Bakker5121ce52009-01-03 21:22:43 +0000530 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000531 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", SSL_COMPRESS_NULL ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000532
533 *p++ = 1;
534 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000535#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000536
Paul Bakkerd3edc862013-03-20 16:07:17 +0100537 // First write extensions, then the total length
538 //
Paul Bakker0be444a2013-08-27 21:55:01 +0200539#if defined(POLARSSL_SSL_SERVER_NAME_INDICATION)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100540 ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
541 ext_len += olen;
Paul Bakker0be444a2013-08-27 21:55:01 +0200542#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000543
Paul Bakkerd3edc862013-03-20 16:07:17 +0100544 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
545 ext_len += olen;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000546
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200547#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100548 ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
549 ext_len += olen;
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200550#endif
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000551
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200552#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100553 ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
554 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100555
Paul Bakkerd3edc862013-03-20 16:07:17 +0100556 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
557 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100558#endif
559
Paul Bakker05decb22013-08-15 13:33:48 +0200560#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200561 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
562 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +0200563#endif
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200564
Paul Bakker1f2bc622013-08-15 13:45:55 +0200565#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200566 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
567 ext_len += olen;
Paul Bakker1f2bc622013-08-15 13:45:55 +0200568#endif
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200569
Paul Bakkera503a632013-08-14 13:48:06 +0200570#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200571 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
572 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +0200573#endif
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200574
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000575 SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
576 ext_len ) );
577
578 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
579 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100580 p += ext_len;
Paul Bakker41c83d32013-03-20 14:39:14 +0100581
Paul Bakker5121ce52009-01-03 21:22:43 +0000582 ssl->out_msglen = p - buf;
583 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
584 ssl->out_msg[0] = SSL_HS_CLIENT_HELLO;
585
586 ssl->state++;
587
588 if( ( ret = ssl_write_record( ssl ) ) != 0 )
589 {
590 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
591 return( ret );
592 }
593
594 SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
595
596 return( 0 );
597}
598
Paul Bakker48916f92012-09-16 19:57:18 +0000599static int ssl_parse_renegotiation_info( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200600 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +0000601 size_t len )
602{
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000603 int ret;
604
Paul Bakker48916f92012-09-16 19:57:18 +0000605 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
606 {
607 if( len != 1 || buf[0] != 0x0 )
608 {
609 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000610
611 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
612 return( ret );
613
Paul Bakker48916f92012-09-16 19:57:18 +0000614 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
615 }
616
617 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
618 }
619 else
620 {
621 if( len != 1 + ssl->verify_data_len * 2 ||
622 buf[0] != ssl->verify_data_len * 2 ||
623 memcmp( buf + 1, ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
624 memcmp( buf + 1 + ssl->verify_data_len,
625 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
626 {
627 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000628
629 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
630 return( ret );
631
Paul Bakker48916f92012-09-16 19:57:18 +0000632 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
633 }
634 }
635
636 return( 0 );
637}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200638
Paul Bakker05decb22013-08-15 13:33:48 +0200639#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200640static int ssl_parse_max_fragment_length_ext( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200641 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200642 size_t len )
643{
644 /*
645 * server should use the extension only if we did,
646 * and if so the server's value should match ours (and len is always 1)
647 */
648 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ||
649 len != 1 ||
650 buf[0] != ssl->mfl_code )
651 {
652 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
653 }
654
655 return( 0 );
656}
Paul Bakker05decb22013-08-15 13:33:48 +0200657#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Paul Bakker48916f92012-09-16 19:57:18 +0000658
Paul Bakker1f2bc622013-08-15 13:45:55 +0200659#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200660static int ssl_parse_truncated_hmac_ext( ssl_context *ssl,
661 const unsigned char *buf,
662 size_t len )
663{
664 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED ||
665 len != 0 )
666 {
667 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
668 }
669
670 ((void) buf);
671
672 ssl->session_negotiate->trunc_hmac = SSL_TRUNC_HMAC_ENABLED;
673
674 return( 0 );
675}
Paul Bakker1f2bc622013-08-15 13:45:55 +0200676#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200677
Paul Bakkera503a632013-08-14 13:48:06 +0200678#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200679static int ssl_parse_session_ticket_ext( ssl_context *ssl,
680 const unsigned char *buf,
681 size_t len )
682{
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200683 if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED ||
684 len != 0 )
685 {
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200686 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200687 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200688
689 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +0200690
691 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200692
693 return( 0 );
694}
Paul Bakkera503a632013-08-14 13:48:06 +0200695#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200696
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200697#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200698static int ssl_parse_supported_point_formats_ext( ssl_context *ssl,
699 const unsigned char *buf,
700 size_t len )
701{
702 size_t list_size;
703 const unsigned char *p;
704
705 list_size = buf[0];
706 if( list_size + 1 != len )
707 {
708 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
709 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
710 }
711
712 p = buf + 2;
713 while( list_size > 0 )
714 {
715 if( p[0] == POLARSSL_ECP_PF_UNCOMPRESSED ||
716 p[0] == POLARSSL_ECP_PF_COMPRESSED )
717 {
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200718 ssl->handshake->ecdh_ctx.point_format = p[0];
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200719 SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
720 return( 0 );
721 }
722
723 list_size--;
724 p++;
725 }
726
727 return( 0 );
728}
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200729#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200730
Paul Bakker5121ce52009-01-03 21:22:43 +0000731static int ssl_parse_server_hello( ssl_context *ssl )
732{
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200733 uint32_t t;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000734 int ret, i, comp;
Paul Bakker23986e52011-04-24 08:57:21 +0000735 size_t n;
Paul Bakker48916f92012-09-16 19:57:18 +0000736 size_t ext_len = 0;
737 unsigned char *buf, *ext;
738 int renegotiation_info_seen = 0;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000739 int handshake_failure = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000740
741 SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
742
743 /*
744 * 0 . 0 handshake type
745 * 1 . 3 handshake length
746 * 4 . 5 protocol version
747 * 6 . 9 UNIX time()
748 * 10 . 37 random bytes
749 */
750 buf = ssl->in_msg;
751
752 if( ( ret = ssl_read_record( ssl ) ) != 0 )
753 {
754 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
755 return( ret );
756 }
757
758 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
759 {
760 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000761 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000762 }
763
764 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
765 buf[4], buf[5] ) );
766
767 if( ssl->in_hslen < 42 ||
768 buf[0] != SSL_HS_SERVER_HELLO ||
769 buf[4] != SSL_MAJOR_VERSION_3 )
770 {
771 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000772 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000773 }
774
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000775 if( buf[5] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +0000776 {
777 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000778 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000779 }
780
781 ssl->minor_ver = buf[5];
782
Paul Bakker1d29fb52012-09-28 13:28:45 +0000783 if( ssl->minor_ver < ssl->min_minor_ver )
784 {
785 SSL_DEBUG_MSG( 1, ( "server only supports ssl smaller than minimum"
786 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
787 buf[4], buf[5] ) );
788
789 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
790 SSL_ALERT_MSG_PROTOCOL_VERSION );
791
792 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
793 }
794
Paul Bakker1504af52012-02-11 16:17:43 +0000795#if defined(POLARSSL_DEBUG_C)
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200796 t = ( (uint32_t) buf[6] << 24 )
797 | ( (uint32_t) buf[7] << 16 )
798 | ( (uint32_t) buf[8] << 8 )
799 | ( (uint32_t) buf[9] );
Paul Bakker87e5cda2012-01-14 18:14:15 +0000800#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000801
Paul Bakker48916f92012-09-16 19:57:18 +0000802 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000803
804 n = buf[38];
805
806 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
807 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
808
Paul Bakker48916f92012-09-16 19:57:18 +0000809 if( n > 32 )
810 {
811 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
812 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
813 }
814
Paul Bakker5121ce52009-01-03 21:22:43 +0000815 /*
816 * 38 . 38 session id length
817 * 39 . 38+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000818 * 39+n . 40+n chosen ciphersuite
Paul Bakker5121ce52009-01-03 21:22:43 +0000819 * 41+n . 41+n chosen compression alg.
820 * 42+n . 43+n extensions length
821 * 44+n . 44+n+m extensions
822 */
Paul Bakker48916f92012-09-16 19:57:18 +0000823 if( ssl->in_hslen > 42 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000824 {
825 ext_len = ( ( buf[42 + n] << 8 )
Paul Bakker48916f92012-09-16 19:57:18 +0000826 | ( buf[43 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000827
Paul Bakker48916f92012-09-16 19:57:18 +0000828 if( ( ext_len > 0 && ext_len < 4 ) ||
829 ssl->in_hslen != 44 + n + ext_len )
830 {
831 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
832 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
833 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000834 }
835
836 i = ( buf[39 + n] << 8 ) | buf[40 + n];
Paul Bakker2770fbd2012-07-03 13:30:23 +0000837 comp = buf[41 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +0000838
Paul Bakker380da532012-04-18 16:10:25 +0000839 /*
840 * Initialize update checksum functions
841 */
Paul Bakker68884e32013-01-07 18:20:04 +0100842 ssl->transform_negotiate->ciphersuite_info = ssl_ciphersuite_from_id( i );
Paul Bakker41c83d32013-03-20 14:39:14 +0100843 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
Paul Bakker68884e32013-01-07 18:20:04 +0100844
845 if( ssl->transform_negotiate->ciphersuite_info == NULL )
846 {
847 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200848 ssl->ciphersuite_list[ssl->minor_ver][i] ) );
Paul Bakker68884e32013-01-07 18:20:04 +0100849 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
850 }
Paul Bakker380da532012-04-18 16:10:25 +0000851
Paul Bakker5121ce52009-01-03 21:22:43 +0000852 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
853 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
854
855 /*
856 * Check if the session can be resumed
857 */
Paul Bakker0a597072012-09-25 21:55:46 +0000858 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE ||
859 ssl->handshake->resume == 0 || n == 0 ||
Paul Bakker48916f92012-09-16 19:57:18 +0000860 ssl->session_negotiate->ciphersuite != i ||
861 ssl->session_negotiate->compression != comp ||
862 ssl->session_negotiate->length != n ||
863 memcmp( ssl->session_negotiate->id, buf + 39, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000864 {
865 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +0000866 ssl->handshake->resume = 0;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200867#if defined(POLARSSL_HAVE_TIME)
Paul Bakker48916f92012-09-16 19:57:18 +0000868 ssl->session_negotiate->start = time( NULL );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200869#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000870 ssl->session_negotiate->ciphersuite = i;
871 ssl->session_negotiate->compression = comp;
872 ssl->session_negotiate->length = n;
873 memcpy( ssl->session_negotiate->id, buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000874 }
875 else
876 {
877 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +0000878
879 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
880 {
881 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
882 return( ret );
883 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000884 }
885
886 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +0000887 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000888
Paul Bakkere3166ce2011-01-27 17:40:50 +0000889 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", i ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000890 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[41 + n] ) );
891
892 i = 0;
893 while( 1 )
894 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200895 if( ssl->ciphersuite_list[ssl->minor_ver][i] == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000896 {
897 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000898 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000899 }
900
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200901 if( ssl->ciphersuite_list[ssl->minor_ver][i++] ==
902 ssl->session_negotiate->ciphersuite )
903 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000904 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200905 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000906 }
907
Paul Bakker2770fbd2012-07-03 13:30:23 +0000908 if( comp != SSL_COMPRESS_NULL
909#if defined(POLARSSL_ZLIB_SUPPORT)
910 && comp != SSL_COMPRESS_DEFLATE
911#endif
912 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000913 {
914 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000915 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000916 }
Paul Bakker48916f92012-09-16 19:57:18 +0000917 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +0000918
Paul Bakker48916f92012-09-16 19:57:18 +0000919 ext = buf + 44 + n;
920
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200921 SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) );
922
Paul Bakker48916f92012-09-16 19:57:18 +0000923 while( ext_len )
924 {
925 unsigned int ext_id = ( ( ext[0] << 8 )
926 | ( ext[1] ) );
927 unsigned int ext_size = ( ( ext[2] << 8 )
928 | ( ext[3] ) );
929
930 if( ext_size + 4 > ext_len )
931 {
932 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
933 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
934 }
935
936 switch( ext_id )
937 {
938 case TLS_EXT_RENEGOTIATION_INFO:
939 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
940 renegotiation_info_seen = 1;
941
942 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ) ) != 0 )
943 return( ret );
944
945 break;
946
Paul Bakker05decb22013-08-15 13:33:48 +0200947#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200948 case TLS_EXT_MAX_FRAGMENT_LENGTH:
949 SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
950
951 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
952 ext + 4, ext_size ) ) != 0 )
953 {
954 return( ret );
955 }
956
957 break;
Paul Bakker05decb22013-08-15 13:33:48 +0200958#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200959
Paul Bakker1f2bc622013-08-15 13:45:55 +0200960#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200961 case TLS_EXT_TRUNCATED_HMAC:
962 SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
963
964 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
965 ext + 4, ext_size ) ) != 0 )
966 {
967 return( ret );
968 }
969
970 break;
Paul Bakker1f2bc622013-08-15 13:45:55 +0200971#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200972
Paul Bakkera503a632013-08-14 13:48:06 +0200973#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200974 case TLS_EXT_SESSION_TICKET:
975 SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
976
977 if( ( ret = ssl_parse_session_ticket_ext( ssl,
978 ext + 4, ext_size ) ) != 0 )
979 {
980 return( ret );
981 }
982
983 break;
Paul Bakkera503a632013-08-14 13:48:06 +0200984#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200985
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200986#if defined(POLARSSL_ECDH_C) || defined(POLARSSL_ECDSA_C)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200987 case TLS_EXT_SUPPORTED_POINT_FORMATS:
988 SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
989
990 if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
991 ext + 4, ext_size ) ) != 0 )
992 {
993 return( ret );
994 }
995
996 break;
Manuel Pégourié-Gonnard0b272672013-08-15 19:38:07 +0200997#endif /* POLARSSL_ECDH_C || POLARSSL_ECDSA_C */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200998
Paul Bakker48916f92012-09-16 19:57:18 +0000999 default:
1000 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
1001 ext_id ) );
1002 }
1003
1004 ext_len -= 4 + ext_size;
1005 ext += 4 + ext_size;
1006
1007 if( ext_len > 0 && ext_len < 4 )
1008 {
1009 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1010 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1011 }
1012 }
1013
1014 /*
1015 * Renegotiation security checks
1016 */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001017 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1018 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +00001019 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001020 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
1021 handshake_failure = 1;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001022 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001023 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1024 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
1025 renegotiation_info_seen == 0 )
1026 {
1027 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
1028 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +00001029 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001030 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1031 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1032 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +00001033 {
1034 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001035 handshake_failure = 1;
1036 }
1037 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
1038 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
1039 renegotiation_info_seen == 1 )
1040 {
1041 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
1042 handshake_failure = 1;
1043 }
1044
1045 if( handshake_failure == 1 )
1046 {
1047 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
1048 return( ret );
1049
Paul Bakker48916f92012-09-16 19:57:18 +00001050 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
1051 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001052
1053 SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
1054
1055 return( 0 );
1056}
1057
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001058#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001059static int ssl_parse_server_dh_params( ssl_context *ssl, unsigned char **p,
1060 unsigned char *end )
1061{
1062 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1063
Paul Bakker29e1f122013-04-16 13:07:56 +02001064 /*
1065 * Ephemeral DH parameters:
1066 *
1067 * struct {
1068 * opaque dh_p<1..2^16-1>;
1069 * opaque dh_g<1..2^16-1>;
1070 * opaque dh_Ys<1..2^16-1>;
1071 * } ServerDHParams;
1072 */
1073 if( ( ret = dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
1074 {
1075 SSL_DEBUG_RET( 2, ( "dhm_read_params" ), ret );
1076 return( ret );
1077 }
1078
1079 if( ssl->handshake->dhm_ctx.len < 64 ||
1080 ssl->handshake->dhm_ctx.len > 512 )
1081 {
1082 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (DHM length)" ) );
1083 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1084 }
1085
1086 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
1087 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
1088 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +02001089
1090 return( ret );
1091}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001092#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001093
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001094#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001095static int ssl_parse_server_ecdh_params( ssl_context *ssl,
1096 unsigned char **p,
1097 unsigned char *end )
1098{
1099 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1100
Paul Bakker29e1f122013-04-16 13:07:56 +02001101 /*
1102 * Ephemeral ECDH parameters:
1103 *
1104 * struct {
1105 * ECParameters curve_params;
1106 * ECPoint public;
1107 * } ServerECDHParams;
1108 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001109 if( ( ret = ecdh_read_params( &ssl->handshake->ecdh_ctx,
1110 (const unsigned char **) p, end ) ) != 0 )
1111 {
1112 SSL_DEBUG_RET( 2, ( "ecdh_read_params" ), ret );
1113 return( ret );
1114 }
1115
1116 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
1117 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
1118 {
1119 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDH length)" ) );
1120 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1121 }
1122
1123 SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
Paul Bakker29e1f122013-04-16 13:07:56 +02001124
1125 return( ret );
1126}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001127#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001128
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001129#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
1130 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001131static int ssl_parse_server_psk_hint( ssl_context *ssl,
1132 unsigned char **p,
1133 unsigned char *end )
1134{
1135 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001136 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001137 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001138
1139 /*
1140 * PSK parameters:
1141 *
1142 * opaque psk_identity_hint<0..2^16-1>;
1143 */
1144 len = (*p)[1] << 8 | (*p)[0];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001145 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001146
1147 if( (*p) + len > end )
1148 {
1149 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
1150 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1151 }
1152
1153 // TODO: Retrieve PSK identity hint and callback to app
1154 //
1155 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001156 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001157
1158 return( ret );
1159}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001160#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
1161 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001162
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001163#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001164#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1165 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001166static int ssl_parse_signature_algorithm( ssl_context *ssl,
1167 unsigned char **p,
1168 unsigned char *end,
1169 md_type_t *md_alg )
1170{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001171 ((void) ssl);
Paul Bakker29e1f122013-04-16 13:07:56 +02001172 *md_alg = POLARSSL_MD_NONE;
1173
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001174 if( (*p) + 2 > end )
Paul Bakker29e1f122013-04-16 13:07:56 +02001175 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1176
1177 if( (*p)[1] != SSL_SIG_RSA )
1178 {
1179 SSL_DEBUG_MSG( 2, ( "server used unsupported SignatureAlgorithm %d", (*p)[1] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001180 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1181 }
1182
1183 switch( (*p)[0] )
1184 {
1185#if defined(POLARSSL_MD5_C)
1186 case SSL_HASH_MD5:
1187 *md_alg = POLARSSL_MD_MD5;
1188 break;
1189#endif
1190#if defined(POLARSSL_SHA1_C)
1191 case SSL_HASH_SHA1:
1192 *md_alg = POLARSSL_MD_SHA1;
1193 break;
1194#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001195#if defined(POLARSSL_SHA256_C)
Paul Bakker29e1f122013-04-16 13:07:56 +02001196 case SSL_HASH_SHA224:
1197 *md_alg = POLARSSL_MD_SHA224;
1198 break;
1199 case SSL_HASH_SHA256:
1200 *md_alg = POLARSSL_MD_SHA256;
1201 break;
1202#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001203#if defined(POLARSSL_SHA512_C)
Paul Bakker29e1f122013-04-16 13:07:56 +02001204 case SSL_HASH_SHA384:
1205 *md_alg = POLARSSL_MD_SHA384;
1206 break;
1207 case SSL_HASH_SHA512:
1208 *md_alg = POLARSSL_MD_SHA512;
1209 break;
1210#endif
1211 default:
1212 SSL_DEBUG_MSG( 2, ( "Server used unsupported HashAlgorithm %d", *(p)[0] ) );
1213 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1214 }
1215
1216 SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
1217 SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
1218 *p += 2;
1219
1220 return( 0 );
1221}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001222#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1223 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001224#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001225
Paul Bakker41c83d32013-03-20 14:39:14 +01001226static int ssl_parse_server_key_exchange( ssl_context *ssl )
1227{
Paul Bakker23986e52011-04-24 08:57:21 +00001228 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001229 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001230 unsigned char *p, *end;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001231#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1232 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001233 size_t n;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001234 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +02001235 md_type_t md_alg = POLARSSL_MD_NONE;
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001236 unsigned int hashlen = 0;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001237#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001238
1239 SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
1240
Paul Bakker41c83d32013-03-20 14:39:14 +01001241 if( ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_RSA &&
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001242 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_ECDHE_RSA &&
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001243 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_PSK &&
1244 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00001245 {
1246 SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
1247 ssl->state++;
1248 return( 0 );
1249 }
1250
Paul Bakker5121ce52009-01-03 21:22:43 +00001251 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1252 {
1253 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1254 return( ret );
1255 }
1256
1257 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1258 {
1259 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001260 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001261 }
1262
1263 if( ssl->in_msg[0] != SSL_HS_SERVER_KEY_EXCHANGE )
1264 {
Paul Bakker188c8de2013-04-19 09:13:37 +02001265 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1266 {
1267 ssl->record_read = 1;
1268 goto exit;
1269 }
1270
1271 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1272 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001273 }
1274
Paul Bakker1ef83d62012-04-11 12:09:53 +00001275 SSL_DEBUG_BUF( 3, "server key exchange", ssl->in_msg + 4, ssl->in_hslen - 4 );
1276
Paul Bakker3b6a07b2013-03-21 11:56:50 +01001277 p = ssl->in_msg + 4;
1278 end = ssl->in_msg + ssl->in_hslen;
1279
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001280#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001281 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001282 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001283 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001284 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001285 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1286 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1287 }
1288 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001289 else
1290#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1291#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
1292 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001293 {
1294 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
1295 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001296 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1297 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1298 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001299 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001300 else
1301#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
1302#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1303 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakker41c83d32013-03-20 14:39:14 +01001304 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001305 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001306 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001307 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1308 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1309 }
1310 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001311 else
1312#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
1313#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1314 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1315 {
1316 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
1317 {
1318 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1319 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1320 }
1321 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
1322 {
1323 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1324 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1325 }
1326 }
1327 else
1328#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1329 {
1330 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1331 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001332
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001333#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1334 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001335 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1336 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001337 {
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001338#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker29e1f122013-04-16 13:07:56 +02001339 /*
1340 * Handle the digitally-signed structure
1341 */
1342 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001343 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001344 if( ssl_parse_signature_algorithm( ssl, &p, end, &md_alg ) != 0 )
1345 {
Paul Bakker1ef83d62012-04-11 12:09:53 +00001346 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001347 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1348 }
1349 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001350#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker1ef83d62012-04-11 12:09:53 +00001351
Paul Bakker29e1f122013-04-16 13:07:56 +02001352 n = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00001353 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001354
Paul Bakker29e1f122013-04-16 13:07:56 +02001355 if( end != p + n )
Paul Bakker41c83d32013-03-20 14:39:14 +01001356 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001357 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001358 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1359 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001360
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02001361 if( ! pk_can_do( &ssl->session_negotiate->peer_cert->pk,
1362 POLARSSL_PK_RSA ) )
1363 {
1364 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1365 return( POLARSSL_ERR_SSL_PK_TYPE_MISMATCH );
1366 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001367
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02001368 if( 8 * (unsigned int)( end - p ) !=
1369 pk_get_size( &ssl->session_negotiate->peer_cert->pk ) )
Paul Bakker41c83d32013-03-20 14:39:14 +01001370 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001371 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001372 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1373 }
1374
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001375#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
1376 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker29e1f122013-04-16 13:07:56 +02001377 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001378 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001379 md5_context md5;
1380 sha1_context sha1;
1381
1382 /*
1383 * digitally-signed struct {
1384 * opaque md5_hash[16];
1385 * opaque sha_hash[20];
1386 * };
1387 *
1388 * md5_hash
1389 * MD5(ClientHello.random + ServerHello.random
1390 * + ServerParams);
1391 * sha_hash
1392 * SHA(ClientHello.random + ServerHello.random
1393 * + ServerParams);
1394 */
1395 n = ssl->in_hslen - ( end - p ) - 6;
1396
1397 md5_starts( &md5 );
1398 md5_update( &md5, ssl->handshake->randbytes, 64 );
1399 md5_update( &md5, ssl->in_msg + 4, n );
1400 md5_finish( &md5, hash );
1401
1402 sha1_starts( &sha1 );
1403 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
1404 sha1_update( &sha1, ssl->in_msg + 4, n );
1405 sha1_finish( &sha1, hash + 16 );
1406
1407 md_alg = POLARSSL_MD_NONE;
1408 hashlen = 36;
1409 }
1410 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001411#endif /* POLARSSL_SSL_PROTO_SSL3 || POLARSSL_SSL_PROTO_TLS1 || \
1412 POLARSSL_SSL_PROTO_TLS1_1 */
1413#if defined(POLARSSL_SSL_PROTO_TLS1_2)
1414 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker29e1f122013-04-16 13:07:56 +02001415 {
1416 md_context_t ctx;
1417
1418 n = ssl->in_hslen - ( end - p ) - 8;
1419
1420 /*
1421 * digitally-signed struct {
1422 * opaque client_random[32];
1423 * opaque server_random[32];
1424 * ServerDHParams params;
1425 * };
1426 */
1427 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1428 {
1429 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1430 return( ret );
1431 }
1432
1433 md_starts( &ctx );
1434 md_update( &ctx, ssl->handshake->randbytes, 64 );
1435 md_update( &ctx, ssl->in_msg + 4, n );
1436 md_finish( &ctx, hash );
Paul Bakker04376b12013-08-16 14:45:26 +02001437 md_free_ctx( &ctx );
Paul Bakker29e1f122013-04-16 13:07:56 +02001438 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001439 else
1440#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
1441 /* Should never happen */
1442 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker29e1f122013-04-16 13:07:56 +02001443
1444 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
1445
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001446 if( ( ret = rsa_pkcs1_verify(
1447 pk_rsa( ssl->session_negotiate->peer_cert->pk ),
1448 RSA_PUBLIC, md_alg, hashlen, hash, p ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02001449 {
1450 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001451 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001452 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001453 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001454#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1455 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001456
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001457exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001458 ssl->state++;
1459
1460 SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
1461
1462 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001463}
1464
1465static int ssl_parse_certificate_request( ssl_context *ssl )
1466{
1467 int ret;
Paul Bakker926af752012-11-23 13:38:07 +01001468 unsigned char *buf, *p;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001469 size_t n = 0, m = 0;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001470 size_t cert_type_len = 0, dn_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001471
1472 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
1473
1474 /*
1475 * 0 . 0 handshake type
1476 * 1 . 3 handshake length
Paul Bakker926af752012-11-23 13:38:07 +01001477 * 4 . 4 cert type count
1478 * 5 .. m-1 cert types
1479 * m .. m+1 sig alg length (TLS 1.2 only)
1480 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001481 * n .. n+1 length of all DNs
1482 * n+2 .. n+3 length of DN 1
1483 * n+4 .. ... Distinguished Name #1
1484 * ... .. ... length of DN 2, etc.
1485 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001486 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001487 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001488 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1489 {
1490 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1491 return( ret );
1492 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001493
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001494 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1495 {
1496 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1497 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1498 }
1499
1500 ssl->record_read = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001501 }
1502
1503 ssl->client_auth = 0;
1504 ssl->state++;
1505
1506 if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST )
1507 ssl->client_auth++;
1508
1509 SSL_DEBUG_MSG( 3, ( "got %s certificate request",
1510 ssl->client_auth ? "a" : "no" ) );
1511
Paul Bakker926af752012-11-23 13:38:07 +01001512 if( ssl->client_auth == 0 )
1513 goto exit;
1514
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001515 ssl->record_read = 0;
1516
Paul Bakker926af752012-11-23 13:38:07 +01001517 // TODO: handshake_failure alert for an anonymous server to request
1518 // client authentication
1519
1520 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001521
Paul Bakker926af752012-11-23 13:38:07 +01001522 // Retrieve cert types
1523 //
1524 cert_type_len = buf[4];
1525 n = cert_type_len;
1526
1527 if( ssl->in_hslen < 6 + n )
1528 {
1529 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1530 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1531 }
1532
Paul Bakker73d44312013-05-22 13:56:26 +02001533 p = buf + 5;
Paul Bakker926af752012-11-23 13:38:07 +01001534 while( cert_type_len > 0 )
1535 {
1536 if( *p == SSL_CERT_TYPE_RSA_SIGN )
1537 {
1538 ssl->handshake->cert_type = SSL_CERT_TYPE_RSA_SIGN;
1539 break;
1540 }
1541
1542 cert_type_len--;
1543 p++;
1544 }
1545
1546 if( ssl->handshake->cert_type == 0 )
1547 {
1548 SSL_DEBUG_MSG( 1, ( "no known cert_type provided" ) );
1549 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1550 }
1551
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001552#if defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker926af752012-11-23 13:38:07 +01001553 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
1554 {
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001555 size_t sig_alg_len = ( ( buf[5 + n] << 8 )
1556 | ( buf[6 + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01001557
1558 p = buf + 7 + n;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001559 m += 2;
Paul Bakker926af752012-11-23 13:38:07 +01001560 n += sig_alg_len;
1561
1562 if( ssl->in_hslen < 6 + n )
1563 {
1564 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1565 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1566 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001567 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001568#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
Paul Bakker926af752012-11-23 13:38:07 +01001569
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001570 dn_len = ( ( buf[5 + m + n] << 8 )
1571 | ( buf[6 + m + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01001572
1573 n += dn_len;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001574 if( ssl->in_hslen != 7 + m + n )
Paul Bakker926af752012-11-23 13:38:07 +01001575 {
1576 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1577 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1578 }
1579
1580exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001581 SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
1582
1583 return( 0 );
1584}
1585
1586static int ssl_parse_server_hello_done( ssl_context *ssl )
1587{
1588 int ret;
1589
1590 SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
1591
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001592 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001593 {
1594 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1595 {
1596 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1597 return( ret );
1598 }
1599
1600 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1601 {
1602 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001603 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001604 }
1605 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001606 ssl->record_read = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001607
1608 if( ssl->in_hslen != 4 ||
1609 ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE )
1610 {
1611 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001612 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001613 }
1614
1615 ssl->state++;
1616
1617 SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
1618
1619 return( 0 );
1620}
1621
1622static int ssl_write_client_key_exchange( ssl_context *ssl )
1623{
Paul Bakker23986e52011-04-24 08:57:21 +00001624 int ret;
1625 size_t i, n;
Paul Bakker41c83d32013-03-20 14:39:14 +01001626 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001627
1628 SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
1629
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001630#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001631 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001632 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001633 /*
1634 * DHM key exchange -- send G^X mod P
1635 */
Paul Bakker48916f92012-09-16 19:57:18 +00001636 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001637
1638 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1639 ssl->out_msg[5] = (unsigned char)( n );
1640 i = 6;
1641
Paul Bakker29b64762012-09-25 09:36:44 +00001642 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1643 mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker5121ce52009-01-03 21:22:43 +00001644 &ssl->out_msg[i], n,
1645 ssl->f_rng, ssl->p_rng );
1646 if( ret != 0 )
1647 {
1648 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1649 return( ret );
1650 }
1651
Paul Bakker48916f92012-09-16 19:57:18 +00001652 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1653 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00001654
Paul Bakker48916f92012-09-16 19:57:18 +00001655 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001656
Paul Bakker48916f92012-09-16 19:57:18 +00001657 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1658 ssl->handshake->premaster,
1659 &ssl->handshake->pmslen ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001660 {
1661 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1662 return( ret );
1663 }
1664
Paul Bakker48916f92012-09-16 19:57:18 +00001665 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00001666 }
1667 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001668#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1669#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001670 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
1671 {
1672 /*
1673 * ECDH key exchange -- send client public value
1674 */
1675 i = 4;
1676
1677 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx,
1678 &n,
1679 &ssl->out_msg[i], 1000,
1680 ssl->f_rng, ssl->p_rng );
1681 if( ret != 0 )
1682 {
1683 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
1684 return( ret );
1685 }
1686
1687 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
1688
1689 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
1690 &ssl->handshake->pmslen,
1691 ssl->handshake->premaster,
1692 POLARSSL_MPI_MAX_SIZE ) ) != 0 )
1693 {
1694 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
1695 return( ret );
1696 }
1697
1698 SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
1699 }
1700 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001701#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001702#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1703 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1704 {
1705 unsigned char *p = ssl->handshake->premaster;
1706
1707 /*
1708 * PSK key exchange
1709 *
1710 * opaque psk_identity<0..2^16-1>;
1711 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001712 if( ssl->psk == NULL )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001713 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1714
1715 if( sizeof(ssl->handshake->premaster) < 4 + 2 * ssl->psk_len )
1716 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1717
1718 n = ssl->psk_identity_len;
1719
1720 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1721 ssl->out_msg[5] = (unsigned char)( n );
1722 i = 6;
1723
1724 memcpy( ssl->out_msg + i, ssl->psk_identity, ssl->psk_identity_len );
1725
1726 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1727 *(p++) = (unsigned char)( ssl->psk_len );
1728 p += ssl->psk_len;
1729
1730 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1731 *(p++) = (unsigned char)( ssl->psk_len );
1732 memcpy( p, ssl->psk, ssl->psk_len );
1733 p += ssl->psk_len;
1734
1735 ssl->handshake->pmslen = 4 + 2 * ssl->psk_len;
1736 }
1737 else
1738#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001739#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1740 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1741 {
1742 unsigned char *p = ssl->handshake->premaster;
1743
1744 /*
1745 * DHE_PSK key exchange
1746 *
1747 * opaque psk_identity<0..2^16-1>;
1748 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
1749 */
1750 if( ssl->psk == NULL )
1751 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1752
1753 if( sizeof(ssl->handshake->premaster) < 4 + ssl->psk_identity_len +
1754 ssl->handshake->dhm_ctx.len )
1755 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1756
1757 i = 4;
1758 n = ssl->psk_identity_len;
1759 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1760 ssl->out_msg[5] = (unsigned char)( n );
1761
1762 memcpy( ssl->out_msg + 6, ssl->psk_identity, ssl->psk_identity_len );
1763
1764 n = ssl->handshake->dhm_ctx.len;
1765 ssl->out_msg[6 + ssl->psk_identity_len] = (unsigned char)( n >> 8 );
1766 ssl->out_msg[7 + ssl->psk_identity_len] = (unsigned char)( n );
1767
1768 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1769 mpi_size( &ssl->handshake->dhm_ctx.P ),
1770 &ssl->out_msg[8 + ssl->psk_identity_len], n,
1771 ssl->f_rng, ssl->p_rng );
1772 if( ret != 0 )
1773 {
1774 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1775 return( ret );
1776 }
1777
1778 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1779 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
1780
1781 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len >> 8 );
1782 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len );
1783 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1784 p, &n ) ) != 0 )
1785 {
1786 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1787 return( ret );
1788 }
1789
1790 if( n != ssl->handshake->dhm_ctx.len )
1791 {
1792 SSL_DEBUG_MSG( 1, ( "dhm_calc_secret result smaller than DHM" ) );
1793 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1794 }
1795
1796 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
1797
1798 p += ssl->handshake->dhm_ctx.len;
1799
1800 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1801 *(p++) = (unsigned char)( ssl->psk_len );
1802 memcpy( p, ssl->psk, ssl->psk_len );
1803 p += ssl->psk_len;
1804
1805 ssl->handshake->pmslen = 4 + ssl->handshake->dhm_ctx.len + ssl->psk_len;
1806 n = ssl->handshake->pmslen;
1807 }
1808 else
1809#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1810#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001811 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001812 {
1813 /*
1814 * RSA key exchange -- send rsa_public(pkcs1 v1.5(premaster))
1815 */
Paul Bakker48916f92012-09-16 19:57:18 +00001816 ssl->handshake->premaster[0] = (unsigned char) ssl->max_major_ver;
1817 ssl->handshake->premaster[1] = (unsigned char) ssl->max_minor_ver;
1818 ssl->handshake->pmslen = 48;
Paul Bakker5121ce52009-01-03 21:22:43 +00001819
Paul Bakker48916f92012-09-16 19:57:18 +00001820 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster + 2,
1821 ssl->handshake->pmslen - 2 );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001822 if( ret != 0 )
1823 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001824
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02001825 if( ! pk_can_do( &ssl->session_negotiate->peer_cert->pk,
1826 POLARSSL_PK_RSA ) )
1827 {
1828 SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
1829 return( POLARSSL_ERR_SSL_PK_TYPE_MISMATCH );
1830 }
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001831
Paul Bakker5121ce52009-01-03 21:22:43 +00001832 i = 4;
Manuel Pégourié-Gonnardb3d91872013-08-14 15:56:19 +02001833 n = pk_get_size( &ssl->session_negotiate->peer_cert->pk ) / 8;
Paul Bakker5121ce52009-01-03 21:22:43 +00001834
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001835#if defined(POLARSSL_SSL_PROTO_TLS1) || defined(POLARSSL_SSL_PROTO_TLS1_1) || \
1836 defined(POLARSSL_SSL_PROTO_TLS1_2)
Paul Bakker5121ce52009-01-03 21:22:43 +00001837 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
1838 {
1839 i += 2;
1840 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1841 ssl->out_msg[5] = (unsigned char)( n );
1842 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001843#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001844
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001845 ret = rsa_pkcs1_encrypt(
1846 pk_rsa( ssl->session_negotiate->peer_cert->pk ),
1847 ssl->f_rng, ssl->p_rng, RSA_PUBLIC,
1848 ssl->handshake->pmslen, ssl->handshake->premaster,
1849 ssl->out_msg + i );
Paul Bakker5121ce52009-01-03 21:22:43 +00001850 if( ret != 0 )
1851 {
1852 SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret );
1853 return( ret );
1854 }
1855 }
Paul Bakkered27a042013-04-18 22:46:23 +02001856 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001857#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02001858 {
1859 ((void) ciphersuite_info);
1860 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1861 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001862
Paul Bakkerff60ee62010-03-16 21:09:09 +00001863 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1864 {
1865 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1866 return( ret );
1867 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001868
1869 ssl->out_msglen = i + n;
1870 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1871 ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE;
1872
1873 ssl->state++;
1874
1875 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1876 {
1877 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1878 return( ret );
1879 }
1880
1881 SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
1882
1883 return( 0 );
1884}
1885
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001886#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1887 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1888 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001889static int ssl_write_certificate_verify( ssl_context *ssl )
1890{
Paul Bakkered27a042013-04-18 22:46:23 +02001891 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1892 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001893
1894 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1895
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001896 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1897 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02001898 {
1899 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1900 ssl->state++;
1901 return( 0 );
1902 }
1903
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001904 return( ret );
1905}
1906#else
1907static int ssl_write_certificate_verify( ssl_context *ssl )
1908{
1909 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1910 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1911 size_t n = 0, offset = 0;
1912 unsigned char hash[48];
1913 md_type_t md_alg = POLARSSL_MD_NONE;
1914 unsigned int hashlen = 0;
1915
1916 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1917
1918 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1919 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1920 {
1921 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1922 ssl->state++;
1923 return( 0 );
1924 }
1925
Paul Bakkered27a042013-04-18 22:46:23 +02001926 if( ssl->client_auth == 0 || ssl->own_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001927 {
1928 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1929 ssl->state++;
1930 return( 0 );
1931 }
1932
1933 if( ssl->rsa_key == NULL )
1934 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001935 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1936 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001937 }
1938
1939 /*
1940 * Make an RSA signature of the handshake digests
1941 */
Paul Bakker48916f92012-09-16 19:57:18 +00001942 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001943
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001944#if defined(POLARSSL_SSL_PROTO_SSL3) || defined(POLARSSL_SSL_PROTO_TLS1) || \
1945 defined(POLARSSL_SSL_PROTO_TLS1_1)
Paul Bakker926af752012-11-23 13:38:07 +01001946 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001947 {
Paul Bakker926af752012-11-23 13:38:07 +01001948 /*
1949 * digitally-signed struct {
1950 * opaque md5_hash[16];
1951 * opaque sha_hash[20];
1952 * };
1953 *
1954 * md5_hash
1955 * MD5(handshake_messages);
1956 *
1957 * sha_hash
1958 * SHA(handshake_messages);
1959 */
1960 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001961 md_alg = POLARSSL_MD_NONE;
Paul Bakker926af752012-11-23 13:38:07 +01001962 }
1963 else
Paul Bakkerd2f068e2013-08-27 21:19:20 +02001964#endif /* POLARSSL_SSL_PROTO_SSL3 || POLARSSL_SSL_PROTO_TLS1 || \
1965 POLARSSL_SSL_PROTO_TLS1_1 */
1966#if defined(POLARSSL_SSL_PROTO_TLS1_2)
1967 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker926af752012-11-23 13:38:07 +01001968 {
1969 /*
1970 * digitally-signed struct {
1971 * opaque handshake_messages[handshake_messages_length];
1972 * };
1973 *
1974 * Taking shortcut here. We assume that the server always allows the
1975 * PRF Hash function and has sent it in the allowed signature
1976 * algorithms list received in the Certificate Request message.
1977 *
1978 * Until we encounter a server that does not, we will take this
1979 * shortcut.
1980 *
1981 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
1982 * in order to satisfy 'weird' needs from the server side.
1983 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001984 if( ssl->transform_negotiate->ciphersuite_info->mac ==
1985 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001986 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001987 md_alg = POLARSSL_MD_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001988 ssl->out_msg[4] = SSL_HASH_SHA384;
1989 ssl->out_msg[5] = SSL_SIG_RSA;
1990 }
1991 else
1992 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001993 md_alg = POLARSSL_MD_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001994 ssl->out_msg[4] = SSL_HASH_SHA256;
1995 ssl->out_msg[5] = SSL_SIG_RSA;
1996 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001997
1998 offset = 2;
1999 }
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002000 else
2001#endif /* POLARSSL_SSL_PROTO_TLS1_2 */
2002 /* Should never happen */
2003 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
Paul Bakker1ef83d62012-04-11 12:09:53 +00002004
Paul Bakker926af752012-11-23 13:38:07 +01002005 if ( ssl->rsa_key )
2006 n = ssl->rsa_key_len ( ssl->rsa_key );
2007
Paul Bakker1ef83d62012-04-11 12:09:53 +00002008 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
2009 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00002010
Paul Bakker43b7e352011-01-18 15:27:19 +00002011 if( ssl->rsa_key )
Paul Bakker5121ce52009-01-03 21:22:43 +00002012 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00002013 ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
Paul Bakkerc70b9822013-04-07 22:00:46 +02002014 RSA_PRIVATE, md_alg,
Paul Bakkereb2c6582012-09-27 19:15:01 +00002015 hashlen, hash, ssl->out_msg + 6 + offset );
Paul Bakker43b7e352011-01-18 15:27:19 +00002016 }
2017
2018 if (ret != 0)
2019 {
2020 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002021 return( ret );
2022 }
2023
Paul Bakker1ef83d62012-04-11 12:09:53 +00002024 ssl->out_msglen = 6 + n + offset;
Paul Bakker5121ce52009-01-03 21:22:43 +00002025 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
2026 ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY;
2027
2028 ssl->state++;
2029
2030 if( ( ret = ssl_write_record( ssl ) ) != 0 )
2031 {
2032 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
2033 return( ret );
2034 }
2035
2036 SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
2037
Paul Bakkered27a042013-04-18 22:46:23 +02002038 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00002039}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002040#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
2041 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
2042 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002043
Paul Bakkera503a632013-08-14 13:48:06 +02002044#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002045static int ssl_parse_new_session_ticket( ssl_context *ssl )
2046{
2047 int ret;
2048 uint32_t lifetime;
2049 size_t ticket_len;
2050 unsigned char *ticket;
2051
2052 SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
2053
2054 if( ( ret = ssl_read_record( ssl ) ) != 0 )
2055 {
2056 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
2057 return( ret );
2058 }
2059
2060 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
2061 {
2062 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
2063 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
2064 }
2065
2066 /*
2067 * struct {
2068 * uint32 ticket_lifetime_hint;
2069 * opaque ticket<0..2^16-1>;
2070 * } NewSessionTicket;
2071 *
2072 * 0 . 0 handshake message type
2073 * 1 . 3 handshake message length
2074 * 4 . 7 ticket_lifetime_hint
2075 * 8 . 9 ticket_len (n)
2076 * 10 . 9+n ticket content
2077 */
2078 if( ssl->in_msg[0] != SSL_HS_NEW_SESSION_TICKET ||
2079 ssl->in_hslen < 10 )
2080 {
2081 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
2082 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
2083 }
2084
2085 lifetime = ( ssl->in_msg[4] << 24 ) | ( ssl->in_msg[5] << 16 ) |
2086 ( ssl->in_msg[6] << 8 ) | ( ssl->in_msg[7] );
2087
2088 ticket_len = ( ssl->in_msg[8] << 8 ) | ( ssl->in_msg[9] );
2089
2090 if( ticket_len + 10 != ssl->in_hslen )
2091 {
2092 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
2093 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
2094 }
2095
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002096 SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
2097
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002098 /* We're not waiting for a NewSessionTicket message any more */
2099 ssl->handshake->new_session_ticket = 0;
2100
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002101 /*
2102 * Zero-length ticket means the server changed his mind and doesn't want
2103 * to send a ticket after all, so just forget it
2104 */
2105 if( ticket_len == 0)
2106 return( 0 );
2107
2108 polarssl_free( ssl->session_negotiate->ticket );
2109 ssl->session_negotiate->ticket = NULL;
2110 ssl->session_negotiate->ticket_len = 0;
2111
2112 if( ( ticket = polarssl_malloc( ticket_len ) ) == NULL )
2113 {
2114 SSL_DEBUG_MSG( 1, ( "ticket malloc failed" ) );
2115 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2116 }
2117
2118 memcpy( ticket, ssl->in_msg + 10, ticket_len );
2119
2120 ssl->session_negotiate->ticket = ticket;
2121 ssl->session_negotiate->ticket_len = ticket_len;
2122 ssl->session_negotiate->ticket_lifetime = lifetime;
2123
2124 /*
2125 * RFC 5077 section 3.4:
2126 * "If the client receives a session ticket from the server, then it
2127 * discards any Session ID that was sent in the ServerHello."
2128 */
2129 SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
2130 ssl->session_negotiate->length = 0;
2131
2132 SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
2133
2134 return( 0 );
2135}
Paul Bakkera503a632013-08-14 13:48:06 +02002136#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002137
Paul Bakker5121ce52009-01-03 21:22:43 +00002138/*
Paul Bakker1961b702013-01-25 14:49:24 +01002139 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00002140 */
Paul Bakker1961b702013-01-25 14:49:24 +01002141int ssl_handshake_client_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002142{
2143 int ret = 0;
2144
Paul Bakker1961b702013-01-25 14:49:24 +01002145 if( ssl->state == SSL_HANDSHAKE_OVER )
2146 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002147
Paul Bakker1961b702013-01-25 14:49:24 +01002148 SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
2149
2150 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
2151 return( ret );
2152
2153 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00002154 {
Paul Bakker1961b702013-01-25 14:49:24 +01002155 case SSL_HELLO_REQUEST:
2156 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002157 break;
2158
Paul Bakker1961b702013-01-25 14:49:24 +01002159 /*
2160 * ==> ClientHello
2161 */
2162 case SSL_CLIENT_HELLO:
2163 ret = ssl_write_client_hello( ssl );
2164 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002165
Paul Bakker1961b702013-01-25 14:49:24 +01002166 /*
2167 * <== ServerHello
2168 * Certificate
2169 * ( ServerKeyExchange )
2170 * ( CertificateRequest )
2171 * ServerHelloDone
2172 */
2173 case SSL_SERVER_HELLO:
2174 ret = ssl_parse_server_hello( ssl );
2175 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002176
Paul Bakker1961b702013-01-25 14:49:24 +01002177 case SSL_SERVER_CERTIFICATE:
2178 ret = ssl_parse_certificate( ssl );
2179 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002180
Paul Bakker1961b702013-01-25 14:49:24 +01002181 case SSL_SERVER_KEY_EXCHANGE:
2182 ret = ssl_parse_server_key_exchange( ssl );
2183 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002184
Paul Bakker1961b702013-01-25 14:49:24 +01002185 case SSL_CERTIFICATE_REQUEST:
2186 ret = ssl_parse_certificate_request( ssl );
2187 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002188
Paul Bakker1961b702013-01-25 14:49:24 +01002189 case SSL_SERVER_HELLO_DONE:
2190 ret = ssl_parse_server_hello_done( ssl );
2191 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002192
Paul Bakker1961b702013-01-25 14:49:24 +01002193 /*
2194 * ==> ( Certificate/Alert )
2195 * ClientKeyExchange
2196 * ( CertificateVerify )
2197 * ChangeCipherSpec
2198 * Finished
2199 */
2200 case SSL_CLIENT_CERTIFICATE:
2201 ret = ssl_write_certificate( ssl );
2202 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002203
Paul Bakker1961b702013-01-25 14:49:24 +01002204 case SSL_CLIENT_KEY_EXCHANGE:
2205 ret = ssl_write_client_key_exchange( ssl );
2206 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002207
Paul Bakker1961b702013-01-25 14:49:24 +01002208 case SSL_CERTIFICATE_VERIFY:
2209 ret = ssl_write_certificate_verify( ssl );
2210 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002211
Paul Bakker1961b702013-01-25 14:49:24 +01002212 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
2213 ret = ssl_write_change_cipher_spec( ssl );
2214 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002215
Paul Bakker1961b702013-01-25 14:49:24 +01002216 case SSL_CLIENT_FINISHED:
2217 ret = ssl_write_finished( ssl );
2218 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002219
Paul Bakker1961b702013-01-25 14:49:24 +01002220 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002221 * <== ( NewSessionTicket )
2222 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01002223 * Finished
2224 */
2225 case SSL_SERVER_CHANGE_CIPHER_SPEC:
Paul Bakkera503a632013-08-14 13:48:06 +02002226#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002227 if( ssl->handshake->new_session_ticket != 0 )
2228 ret = ssl_parse_new_session_ticket( ssl );
2229 else
Paul Bakkera503a632013-08-14 13:48:06 +02002230#endif
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002231 ret = ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01002232 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002233
Paul Bakker1961b702013-01-25 14:49:24 +01002234 case SSL_SERVER_FINISHED:
2235 ret = ssl_parse_finished( ssl );
2236 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002237
Paul Bakker1961b702013-01-25 14:49:24 +01002238 case SSL_FLUSH_BUFFERS:
2239 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
2240 ssl->state = SSL_HANDSHAKE_WRAPUP;
2241 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002242
Paul Bakker1961b702013-01-25 14:49:24 +01002243 case SSL_HANDSHAKE_WRAPUP:
2244 ssl_handshake_wrapup( ssl );
2245 break;
Paul Bakker48916f92012-09-16 19:57:18 +00002246
Paul Bakker1961b702013-01-25 14:49:24 +01002247 default:
2248 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
2249 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
2250 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002251
2252 return( ret );
2253}
Paul Bakker5121ce52009-01-03 21:22:43 +00002254#endif