blob: a80a769c088cebeefea230675f8c6fb3ab49ada5 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * SSLv3/TLSv1 client-side functions
3 *
Paul Bakker68884e32013-01-07 18:20:04 +01004 * Copyright (C) 2006-2013, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
Paul Bakker40e46942009-01-03 21:51:57 +000026#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Paul Bakker40e46942009-01-03 21:51:57 +000028#if defined(POLARSSL_SSL_CLI_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000029
Paul Bakker40e46942009-01-03 21:51:57 +000030#include "polarssl/debug.h"
31#include "polarssl/ssl.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000032
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020033#if defined(POLARSSL_MEMORY_C)
34#include "polarssl/memory.h"
35#else
36#define polarssl_malloc malloc
37#define polarssl_free free
38#endif
39
Paul Bakker5121ce52009-01-03 21:22:43 +000040#include <stdlib.h>
41#include <stdio.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020042
43#ifdef _MSC_VER
44#include <basetsd.h>
45typedef UINT32 uint32_t;
46#else
47#include <inttypes.h>
48#endif
49
50#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +000051#include <time.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020052#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000053
Paul Bakkerd3edc862013-03-20 16:07:17 +010054static void ssl_write_hostname_ext( ssl_context *ssl,
55 unsigned char *buf,
56 size_t *olen )
57{
58 unsigned char *p = buf;
59
60 *olen = 0;
61
62 if ( ssl->hostname == NULL )
63 return;
64
65 SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
66 ssl->hostname ) );
67
68 /*
69 * struct {
70 * NameType name_type;
71 * select (name_type) {
72 * case host_name: HostName;
73 * } name;
74 * } ServerName;
75 *
76 * enum {
77 * host_name(0), (255)
78 * } NameType;
79 *
80 * opaque HostName<1..2^16-1>;
81 *
82 * struct {
83 * ServerName server_name_list<1..2^16-1>
84 * } ServerNameList;
85 */
86 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
87 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME ) & 0xFF );
88
89 *p++ = (unsigned char)( ( (ssl->hostname_len + 5) >> 8 ) & 0xFF );
90 *p++ = (unsigned char)( ( (ssl->hostname_len + 5) ) & 0xFF );
91
92 *p++ = (unsigned char)( ( (ssl->hostname_len + 3) >> 8 ) & 0xFF );
93 *p++ = (unsigned char)( ( (ssl->hostname_len + 3) ) & 0xFF );
94
95 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
96 *p++ = (unsigned char)( ( ssl->hostname_len >> 8 ) & 0xFF );
97 *p++ = (unsigned char)( ( ssl->hostname_len ) & 0xFF );
98
99 memcpy( p, ssl->hostname, ssl->hostname_len );
100
101 *olen = ssl->hostname_len + 9;
102}
103
104static void ssl_write_renegotiation_ext( ssl_context *ssl,
105 unsigned char *buf,
106 size_t *olen )
107{
108 unsigned char *p = buf;
109
110 *olen = 0;
111
112 if( ssl->renegotiation != SSL_RENEGOTIATION )
113 return;
114
115 SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
116
117 /*
118 * Secure renegotiation
119 */
120 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
121 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
122
123 *p++ = 0x00;
124 *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
125 *p++ = ssl->verify_data_len & 0xFF;
126
127 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
128
129 *olen = 5 + ssl->verify_data_len;
130}
131
132static void ssl_write_signature_algorithms_ext( ssl_context *ssl,
133 unsigned char *buf,
134 size_t *olen )
135{
136 unsigned char *p = buf;
137 unsigned char sig_alg_list[20];
138 size_t sig_alg_len = 0;
139
140 *olen = 0;
141
142 if( ssl->max_minor_ver != SSL_MINOR_VERSION_3 )
143 return;
144
145 SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
146
147 /*
148 * Prepare signature_algorithms extension (TLS 1.2)
149 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200150#if defined(POLARSSL_SHA512_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100151 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA512;
152 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
153 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA384;
154 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
155#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200156#if defined(POLARSSL_SHA256_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100157 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA256;
158 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
159 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA224;
160 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
161#endif
162#if defined(POLARSSL_SHA1_C)
163 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA1;
164 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
165#endif
166#if defined(POLARSSL_MD5_C)
167 sig_alg_list[sig_alg_len++] = SSL_HASH_MD5;
168 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
169#endif
170
171 /*
172 * enum {
173 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
174 * sha512(6), (255)
175 * } HashAlgorithm;
176 *
177 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
178 * SignatureAlgorithm;
179 *
180 * struct {
181 * HashAlgorithm hash;
182 * SignatureAlgorithm signature;
183 * } SignatureAndHashAlgorithm;
184 *
185 * SignatureAndHashAlgorithm
186 * supported_signature_algorithms<2..2^16-2>;
187 */
188 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
189 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG ) & 0xFF );
190
191 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
192 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
193
194 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
195 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
196
197 memcpy( p, sig_alg_list, sig_alg_len );
198
199 *olen = 6 + sig_alg_len;
200}
201
202#if defined(POLARSSL_ECDH_C)
203static void ssl_write_supported_elliptic_curves_ext( ssl_context *ssl,
204 unsigned char *buf,
205 size_t *olen )
206{
207 unsigned char *p = buf;
208 unsigned char elliptic_curve_list[20];
209 size_t elliptic_curve_len = 0;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200210 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100211
212 *olen = 0;
213
214 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
215
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200216#if defined(POLARSSL_ECP_DP_SECP521R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100217 elliptic_curve_list[elliptic_curve_len++] = 0x00;
218 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP521R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200219#endif
220#if defined(POLARSSL_ECP_DP_SECP384R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100221 elliptic_curve_list[elliptic_curve_len++] = 0x00;
222 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP384R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200223#endif
224#if defined(POLARSSL_ECP_DP_SECP256R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100225 elliptic_curve_list[elliptic_curve_len++] = 0x00;
226 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP256R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200227#endif
228#if defined(POLARSSL_ECP_DP_SECP224R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100229 elliptic_curve_list[elliptic_curve_len++] = 0x00;
230 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP224R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200231#endif
232#if defined(POLARSSL_ECP_DP_SECP192R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100233 elliptic_curve_list[elliptic_curve_len++] = 0x00;
234 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP192R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200235#endif
236
237 if( elliptic_curve_len == 0 )
238 return;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100239
240 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
241 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
242
243 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
244 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
245
246 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
247 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
248
249 memcpy( p, elliptic_curve_list, elliptic_curve_len );
250
251 *olen = 6 + elliptic_curve_len;
252}
253
254static void ssl_write_supported_point_formats_ext( ssl_context *ssl,
255 unsigned char *buf,
256 size_t *olen )
257{
258 unsigned char *p = buf;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200259 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100260
261 *olen = 0;
262
263 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
264
265 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
266 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
267
268 *p++ = 0x00;
269 *p++ = 3;
270
271 *p++ = 2;
272 *p++ = POLARSSL_ECP_PF_COMPRESSED;
273 *p++ = POLARSSL_ECP_PF_UNCOMPRESSED;
274
275 *olen = 7;
276}
277#endif
278
Paul Bakker05decb22013-08-15 13:33:48 +0200279#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200280static void ssl_write_max_fragment_length_ext( ssl_context *ssl,
281 unsigned char *buf,
282 size_t *olen )
283{
284 unsigned char *p = buf;
285
286 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ) {
287 *olen = 0;
288 return;
289 }
290
291 SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
292
293 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
294 *p++ = (unsigned char)( ( TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF );
295
296 *p++ = 0x00;
297 *p++ = 1;
298
299 *p++ = ssl->mfl_code;
300
301 *olen = 5;
302}
Paul Bakker05decb22013-08-15 13:33:48 +0200303#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200304
Paul Bakker1f2bc622013-08-15 13:45:55 +0200305#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200306static void ssl_write_truncated_hmac_ext( ssl_context *ssl,
307 unsigned char *buf, size_t *olen )
308{
309 unsigned char *p = buf;
310
311 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED )
312 {
313 *olen = 0;
314 return;
315 }
316
317 SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
318
319 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
320 *p++ = (unsigned char)( ( TLS_EXT_TRUNCATED_HMAC ) & 0xFF );
321
322 *p++ = 0x00;
323 *p++ = 0x00;
324
325 *olen = 4;
326}
Paul Bakker1f2bc622013-08-15 13:45:55 +0200327#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200328
Paul Bakkera503a632013-08-14 13:48:06 +0200329#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200330static void ssl_write_session_ticket_ext( ssl_context *ssl,
331 unsigned char *buf, size_t *olen )
332{
333 unsigned char *p = buf;
334 size_t tlen = ssl->session_negotiate->ticket_len;
335
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200336 if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED )
337 {
338 *olen = 0;
339 return;
340 }
341
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200342 SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
343
344 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
345 *p++ = (unsigned char)( ( TLS_EXT_SESSION_TICKET ) & 0xFF );
346
347 *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
348 *p++ = (unsigned char)( ( tlen ) & 0xFF );
349
350 *olen = 4;
351
352 if( ssl->session_negotiate->ticket == NULL ||
353 ssl->session_negotiate->ticket_len == 0 )
354 {
355 return;
356 }
357
358 SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
359
360 memcpy( p, ssl->session_negotiate->ticket, tlen );
361
362 *olen += tlen;
363}
Paul Bakkera503a632013-08-14 13:48:06 +0200364#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200365
Paul Bakker5121ce52009-01-03 21:22:43 +0000366static int ssl_write_client_hello( ssl_context *ssl )
367{
Paul Bakker23986e52011-04-24 08:57:21 +0000368 int ret;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100369 size_t i, n, olen, ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000370 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200371 unsigned char *p, *q;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200372#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000373 time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200374#endif
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200375 const int *ciphersuites;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200376 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000377
378 SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
379
Paul Bakker48916f92012-09-16 19:57:18 +0000380 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
381 {
Paul Bakker993d11d2012-09-28 15:00:12 +0000382 ssl->major_ver = ssl->min_major_ver;
383 ssl->minor_ver = ssl->min_minor_ver;
Paul Bakker48916f92012-09-16 19:57:18 +0000384 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000385
Paul Bakker490ecc82011-10-06 13:04:09 +0000386 if( ssl->max_major_ver == 0 && ssl->max_minor_ver == 0 )
387 {
388 ssl->max_major_ver = SSL_MAJOR_VERSION_3;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000389 ssl->max_minor_ver = SSL_MINOR_VERSION_3;
Paul Bakker490ecc82011-10-06 13:04:09 +0000390 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000391
392 /*
393 * 0 . 0 handshake type
394 * 1 . 3 handshake length
395 * 4 . 5 highest version supported
396 * 6 . 9 current UNIX time
397 * 10 . 37 random bytes
398 */
399 buf = ssl->out_msg;
400 p = buf + 4;
401
402 *p++ = (unsigned char) ssl->max_major_ver;
403 *p++ = (unsigned char) ssl->max_minor_ver;
404
405 SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
406 buf[4], buf[5] ) );
407
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200408#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000409 t = time( NULL );
410 *p++ = (unsigned char)( t >> 24 );
411 *p++ = (unsigned char)( t >> 16 );
412 *p++ = (unsigned char)( t >> 8 );
413 *p++ = (unsigned char)( t );
414
415 SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200416#else
417 if( ( ret = ssl->f_rng( ssl->p_rng, p, 4 ) ) != 0 )
418 return( ret );
419
420 p += 4;
421#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000422
Paul Bakkera3d195c2011-11-27 21:07:34 +0000423 if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
424 return( ret );
425
426 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +0000427
Paul Bakker48916f92012-09-16 19:57:18 +0000428 memcpy( ssl->handshake->randbytes, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000429
430 SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 6, 32 );
431
432 /*
433 * 38 . 38 session id length
434 * 39 . 39+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000435 * 40+n . 41+n ciphersuitelist length
436 * 42+n . .. ciphersuitelist
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000437 * .. . .. compression methods length
438 * .. . .. compression methods
439 * .. . .. extensions length
440 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +0000441 */
Paul Bakker48916f92012-09-16 19:57:18 +0000442 n = ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +0000443
Paul Bakker0a597072012-09-25 21:55:46 +0000444 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE || n < 16 || n > 32 ||
445 ssl->handshake->resume == 0 )
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200446 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000447 n = 0;
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200448 }
449
Paul Bakkera503a632013-08-14 13:48:06 +0200450#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard6377e412013-07-31 16:31:33 +0200451 /*
452 * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
453 * generate and include a Session ID in the TLS ClientHello."
454 */
455 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE &&
456 ssl->session_negotiate->ticket != NULL &&
457 ssl->session_negotiate->ticket_len != 0 )
458 {
459 ret = ssl->f_rng( ssl->p_rng, ssl->session_negotiate->id, 32 );
460
461 if( ret != 0 )
462 return( ret );
463
464 ssl->session_negotiate->length = n = 32;
465 }
Paul Bakkera503a632013-08-14 13:48:06 +0200466#endif /* POLARSSL_SSL_SESSION_TICKETS */
Paul Bakker5121ce52009-01-03 21:22:43 +0000467
468 *p++ = (unsigned char) n;
469
470 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000471 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000472
473 SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
474 SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
475
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200476 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
Paul Bakker2fbefde2013-06-29 16:01:15 +0200477 n = 0;
478 q = p;
479
480 // Skip writing ciphersuite length for now
481 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000482
Paul Bakker48916f92012-09-16 19:57:18 +0000483 /*
484 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
485 */
486 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
487 {
488 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
489 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO );
Paul Bakker2fbefde2013-06-29 16:01:15 +0200490 n++;
Paul Bakker48916f92012-09-16 19:57:18 +0000491 }
492
Paul Bakker2fbefde2013-06-29 16:01:15 +0200493 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000494 {
Paul Bakker2fbefde2013-06-29 16:01:15 +0200495 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
496
497 if( ciphersuite_info == NULL )
498 continue;
499
500 if( ciphersuite_info->min_minor_ver > ssl->max_minor_ver ||
501 ciphersuite_info->max_minor_ver < ssl->min_minor_ver )
502 continue;
503
Paul Bakkere3166ce2011-01-27 17:40:50 +0000504 SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %2d",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200505 ciphersuites[i] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000506
Paul Bakker2fbefde2013-06-29 16:01:15 +0200507 n++;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200508 *p++ = (unsigned char)( ciphersuites[i] >> 8 );
509 *p++ = (unsigned char)( ciphersuites[i] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000510 }
511
Paul Bakker2fbefde2013-06-29 16:01:15 +0200512 *q++ = (unsigned char)( n >> 7 );
513 *q++ = (unsigned char)( n << 1 );
514
515 SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
516
517
Paul Bakker2770fbd2012-07-03 13:30:23 +0000518#if defined(POLARSSL_ZLIB_SUPPORT)
519 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
520 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000521 SSL_COMPRESS_DEFLATE, SSL_COMPRESS_NULL ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000522
523 *p++ = 2;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000524 *p++ = SSL_COMPRESS_DEFLATE;
Paul Bakker48916f92012-09-16 19:57:18 +0000525 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000526#else
Paul Bakker5121ce52009-01-03 21:22:43 +0000527 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000528 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", SSL_COMPRESS_NULL ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000529
530 *p++ = 1;
531 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000532#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000533
Paul Bakkerd3edc862013-03-20 16:07:17 +0100534 // First write extensions, then the total length
535 //
536 ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
537 ext_len += olen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000538
Paul Bakkerd3edc862013-03-20 16:07:17 +0100539 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
540 ext_len += olen;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000541
Paul Bakkerd3edc862013-03-20 16:07:17 +0100542 ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
543 ext_len += olen;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000544
Paul Bakker41c83d32013-03-20 14:39:14 +0100545#if defined(POLARSSL_ECDH_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100546 ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
547 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100548
Paul Bakkerd3edc862013-03-20 16:07:17 +0100549 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
550 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100551#endif
552
Paul Bakker05decb22013-08-15 13:33:48 +0200553#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200554 ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
555 ext_len += olen;
Paul Bakker05decb22013-08-15 13:33:48 +0200556#endif
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200557
Paul Bakker1f2bc622013-08-15 13:45:55 +0200558#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200559 ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
560 ext_len += olen;
Paul Bakker1f2bc622013-08-15 13:45:55 +0200561#endif
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200562
Paul Bakkera503a632013-08-14 13:48:06 +0200563#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200564 ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
565 ext_len += olen;
Paul Bakkera503a632013-08-14 13:48:06 +0200566#endif
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200567
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000568 SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
569 ext_len ) );
570
571 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
572 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100573 p += ext_len;
Paul Bakker41c83d32013-03-20 14:39:14 +0100574
Paul Bakker5121ce52009-01-03 21:22:43 +0000575 ssl->out_msglen = p - buf;
576 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
577 ssl->out_msg[0] = SSL_HS_CLIENT_HELLO;
578
579 ssl->state++;
580
581 if( ( ret = ssl_write_record( ssl ) ) != 0 )
582 {
583 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
584 return( ret );
585 }
586
587 SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
588
589 return( 0 );
590}
591
Paul Bakker48916f92012-09-16 19:57:18 +0000592static int ssl_parse_renegotiation_info( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200593 const unsigned char *buf,
Paul Bakker48916f92012-09-16 19:57:18 +0000594 size_t len )
595{
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000596 int ret;
597
Paul Bakker48916f92012-09-16 19:57:18 +0000598 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
599 {
600 if( len != 1 || buf[0] != 0x0 )
601 {
602 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000603
604 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
605 return( ret );
606
Paul Bakker48916f92012-09-16 19:57:18 +0000607 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
608 }
609
610 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
611 }
612 else
613 {
614 if( len != 1 + ssl->verify_data_len * 2 ||
615 buf[0] != ssl->verify_data_len * 2 ||
616 memcmp( buf + 1, ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
617 memcmp( buf + 1 + ssl->verify_data_len,
618 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
619 {
620 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000621
622 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
623 return( ret );
624
Paul Bakker48916f92012-09-16 19:57:18 +0000625 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
626 }
627 }
628
629 return( 0 );
630}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200631
Paul Bakker05decb22013-08-15 13:33:48 +0200632#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200633static int ssl_parse_max_fragment_length_ext( ssl_context *ssl,
Manuel Pégourié-Gonnarde048b672013-07-19 12:47:00 +0200634 const unsigned char *buf,
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200635 size_t len )
636{
637 /*
638 * server should use the extension only if we did,
639 * and if so the server's value should match ours (and len is always 1)
640 */
641 if( ssl->mfl_code == SSL_MAX_FRAG_LEN_NONE ||
642 len != 1 ||
643 buf[0] != ssl->mfl_code )
644 {
645 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
646 }
647
648 return( 0 );
649}
Paul Bakker05decb22013-08-15 13:33:48 +0200650#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Paul Bakker48916f92012-09-16 19:57:18 +0000651
Paul Bakker1f2bc622013-08-15 13:45:55 +0200652#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200653static int ssl_parse_truncated_hmac_ext( ssl_context *ssl,
654 const unsigned char *buf,
655 size_t len )
656{
657 if( ssl->trunc_hmac == SSL_TRUNC_HMAC_DISABLED ||
658 len != 0 )
659 {
660 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
661 }
662
663 ((void) buf);
664
665 ssl->session_negotiate->trunc_hmac = SSL_TRUNC_HMAC_ENABLED;
666
667 return( 0 );
668}
Paul Bakker1f2bc622013-08-15 13:45:55 +0200669#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200670
Paul Bakkera503a632013-08-14 13:48:06 +0200671#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200672static int ssl_parse_session_ticket_ext( ssl_context *ssl,
673 const unsigned char *buf,
674 size_t len )
675{
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200676 if( ssl->session_tickets == SSL_SESSION_TICKETS_DISABLED ||
677 len != 0 )
678 {
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200679 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200680 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200681
682 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +0200683
684 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200685
686 return( 0 );
687}
Paul Bakkera503a632013-08-14 13:48:06 +0200688#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200689
Paul Bakker5121ce52009-01-03 21:22:43 +0000690static int ssl_parse_server_hello( ssl_context *ssl )
691{
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200692 uint32_t t;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000693 int ret, i, comp;
Paul Bakker23986e52011-04-24 08:57:21 +0000694 size_t n;
Paul Bakker48916f92012-09-16 19:57:18 +0000695 size_t ext_len = 0;
696 unsigned char *buf, *ext;
697 int renegotiation_info_seen = 0;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000698 int handshake_failure = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000699
700 SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
701
702 /*
703 * 0 . 0 handshake type
704 * 1 . 3 handshake length
705 * 4 . 5 protocol version
706 * 6 . 9 UNIX time()
707 * 10 . 37 random bytes
708 */
709 buf = ssl->in_msg;
710
711 if( ( ret = ssl_read_record( ssl ) ) != 0 )
712 {
713 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
714 return( ret );
715 }
716
717 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
718 {
719 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000720 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000721 }
722
723 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
724 buf[4], buf[5] ) );
725
726 if( ssl->in_hslen < 42 ||
727 buf[0] != SSL_HS_SERVER_HELLO ||
728 buf[4] != SSL_MAJOR_VERSION_3 )
729 {
730 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000731 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000732 }
733
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000734 if( buf[5] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +0000735 {
736 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000737 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000738 }
739
740 ssl->minor_ver = buf[5];
741
Paul Bakker1d29fb52012-09-28 13:28:45 +0000742 if( ssl->minor_ver < ssl->min_minor_ver )
743 {
744 SSL_DEBUG_MSG( 1, ( "server only supports ssl smaller than minimum"
745 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
746 buf[4], buf[5] ) );
747
748 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
749 SSL_ALERT_MSG_PROTOCOL_VERSION );
750
751 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
752 }
753
Paul Bakker1504af52012-02-11 16:17:43 +0000754#if defined(POLARSSL_DEBUG_C)
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200755 t = ( (uint32_t) buf[6] << 24 )
756 | ( (uint32_t) buf[7] << 16 )
757 | ( (uint32_t) buf[8] << 8 )
758 | ( (uint32_t) buf[9] );
Paul Bakker87e5cda2012-01-14 18:14:15 +0000759#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000760
Paul Bakker48916f92012-09-16 19:57:18 +0000761 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000762
763 n = buf[38];
764
765 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
766 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
767
Paul Bakker48916f92012-09-16 19:57:18 +0000768 if( n > 32 )
769 {
770 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
771 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
772 }
773
Paul Bakker5121ce52009-01-03 21:22:43 +0000774 /*
775 * 38 . 38 session id length
776 * 39 . 38+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000777 * 39+n . 40+n chosen ciphersuite
Paul Bakker5121ce52009-01-03 21:22:43 +0000778 * 41+n . 41+n chosen compression alg.
779 * 42+n . 43+n extensions length
780 * 44+n . 44+n+m extensions
781 */
Paul Bakker48916f92012-09-16 19:57:18 +0000782 if( ssl->in_hslen > 42 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000783 {
784 ext_len = ( ( buf[42 + n] << 8 )
Paul Bakker48916f92012-09-16 19:57:18 +0000785 | ( buf[43 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000786
Paul Bakker48916f92012-09-16 19:57:18 +0000787 if( ( ext_len > 0 && ext_len < 4 ) ||
788 ssl->in_hslen != 44 + n + ext_len )
789 {
790 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
791 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
792 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000793 }
794
795 i = ( buf[39 + n] << 8 ) | buf[40 + n];
Paul Bakker2770fbd2012-07-03 13:30:23 +0000796 comp = buf[41 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +0000797
Paul Bakker380da532012-04-18 16:10:25 +0000798 /*
799 * Initialize update checksum functions
800 */
Paul Bakker68884e32013-01-07 18:20:04 +0100801 ssl->transform_negotiate->ciphersuite_info = ssl_ciphersuite_from_id( i );
Paul Bakker41c83d32013-03-20 14:39:14 +0100802 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
Paul Bakker68884e32013-01-07 18:20:04 +0100803
804 if( ssl->transform_negotiate->ciphersuite_info == NULL )
805 {
806 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200807 ssl->ciphersuite_list[ssl->minor_ver][i] ) );
Paul Bakker68884e32013-01-07 18:20:04 +0100808 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
809 }
Paul Bakker380da532012-04-18 16:10:25 +0000810
Paul Bakker5121ce52009-01-03 21:22:43 +0000811 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
812 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
813
814 /*
815 * Check if the session can be resumed
816 */
Paul Bakker0a597072012-09-25 21:55:46 +0000817 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE ||
818 ssl->handshake->resume == 0 || n == 0 ||
Paul Bakker48916f92012-09-16 19:57:18 +0000819 ssl->session_negotiate->ciphersuite != i ||
820 ssl->session_negotiate->compression != comp ||
821 ssl->session_negotiate->length != n ||
822 memcmp( ssl->session_negotiate->id, buf + 39, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000823 {
824 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +0000825 ssl->handshake->resume = 0;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200826#if defined(POLARSSL_HAVE_TIME)
Paul Bakker48916f92012-09-16 19:57:18 +0000827 ssl->session_negotiate->start = time( NULL );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200828#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000829 ssl->session_negotiate->ciphersuite = i;
830 ssl->session_negotiate->compression = comp;
831 ssl->session_negotiate->length = n;
832 memcpy( ssl->session_negotiate->id, buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000833 }
834 else
835 {
836 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +0000837
838 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
839 {
840 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
841 return( ret );
842 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000843 }
844
845 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +0000846 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000847
Paul Bakkere3166ce2011-01-27 17:40:50 +0000848 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", i ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000849 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[41 + n] ) );
850
851 i = 0;
852 while( 1 )
853 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200854 if( ssl->ciphersuite_list[ssl->minor_ver][i] == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000855 {
856 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000857 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000858 }
859
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200860 if( ssl->ciphersuite_list[ssl->minor_ver][i++] ==
861 ssl->session_negotiate->ciphersuite )
862 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000863 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200864 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000865 }
866
Paul Bakker2770fbd2012-07-03 13:30:23 +0000867 if( comp != SSL_COMPRESS_NULL
868#if defined(POLARSSL_ZLIB_SUPPORT)
869 && comp != SSL_COMPRESS_DEFLATE
870#endif
871 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000872 {
873 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000874 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000875 }
Paul Bakker48916f92012-09-16 19:57:18 +0000876 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +0000877
Paul Bakker48916f92012-09-16 19:57:18 +0000878 ext = buf + 44 + n;
879
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200880 SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) );
881
Paul Bakker48916f92012-09-16 19:57:18 +0000882 while( ext_len )
883 {
884 unsigned int ext_id = ( ( ext[0] << 8 )
885 | ( ext[1] ) );
886 unsigned int ext_size = ( ( ext[2] << 8 )
887 | ( ext[3] ) );
888
889 if( ext_size + 4 > ext_len )
890 {
891 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
892 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
893 }
894
895 switch( ext_id )
896 {
897 case TLS_EXT_RENEGOTIATION_INFO:
898 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
899 renegotiation_info_seen = 1;
900
901 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ) ) != 0 )
902 return( ret );
903
904 break;
905
Paul Bakker05decb22013-08-15 13:33:48 +0200906#if defined(POLARSSL_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200907 case TLS_EXT_MAX_FRAGMENT_LENGTH:
908 SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
909
910 if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
911 ext + 4, ext_size ) ) != 0 )
912 {
913 return( ret );
914 }
915
916 break;
Paul Bakker05decb22013-08-15 13:33:48 +0200917#endif /* POLARSSL_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200918
Paul Bakker1f2bc622013-08-15 13:45:55 +0200919#if defined(POLARSSL_SSL_TRUNCATED_HMAC)
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200920 case TLS_EXT_TRUNCATED_HMAC:
921 SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
922
923 if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
924 ext + 4, ext_size ) ) != 0 )
925 {
926 return( ret );
927 }
928
929 break;
Paul Bakker1f2bc622013-08-15 13:45:55 +0200930#endif /* POLARSSL_SSL_TRUNCATED_HMAC */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200931
Paul Bakkera503a632013-08-14 13:48:06 +0200932#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200933 case TLS_EXT_SESSION_TICKET:
934 SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
935
936 if( ( ret = ssl_parse_session_ticket_ext( ssl,
937 ext + 4, ext_size ) ) != 0 )
938 {
939 return( ret );
940 }
941
942 break;
Paul Bakkera503a632013-08-14 13:48:06 +0200943#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200944
Paul Bakker48916f92012-09-16 19:57:18 +0000945 default:
946 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
947 ext_id ) );
948 }
949
950 ext_len -= 4 + ext_size;
951 ext += 4 + ext_size;
952
953 if( ext_len > 0 && ext_len < 4 )
954 {
955 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
956 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
957 }
958 }
959
960 /*
961 * Renegotiation security checks
962 */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000963 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
964 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +0000965 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000966 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
967 handshake_failure = 1;
Paul Bakkerf7abd422013-04-16 13:15:56 +0200968 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000969 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
970 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
971 renegotiation_info_seen == 0 )
972 {
973 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
974 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +0000975 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000976 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
977 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
978 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +0000979 {
980 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000981 handshake_failure = 1;
982 }
983 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
984 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
985 renegotiation_info_seen == 1 )
986 {
987 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
988 handshake_failure = 1;
989 }
990
991 if( handshake_failure == 1 )
992 {
993 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
994 return( ret );
995
Paul Bakker48916f92012-09-16 19:57:18 +0000996 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
997 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000998
999 SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
1000
1001 return( 0 );
1002}
1003
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001004#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001005static int ssl_parse_server_dh_params( ssl_context *ssl, unsigned char **p,
1006 unsigned char *end )
1007{
1008 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1009
Paul Bakker29e1f122013-04-16 13:07:56 +02001010 /*
1011 * Ephemeral DH parameters:
1012 *
1013 * struct {
1014 * opaque dh_p<1..2^16-1>;
1015 * opaque dh_g<1..2^16-1>;
1016 * opaque dh_Ys<1..2^16-1>;
1017 * } ServerDHParams;
1018 */
1019 if( ( ret = dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
1020 {
1021 SSL_DEBUG_RET( 2, ( "dhm_read_params" ), ret );
1022 return( ret );
1023 }
1024
1025 if( ssl->handshake->dhm_ctx.len < 64 ||
1026 ssl->handshake->dhm_ctx.len > 512 )
1027 {
1028 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (DHM length)" ) );
1029 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1030 }
1031
1032 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
1033 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
1034 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +02001035
1036 return( ret );
1037}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001038#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001039
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001040#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001041static int ssl_parse_server_ecdh_params( ssl_context *ssl,
1042 unsigned char **p,
1043 unsigned char *end )
1044{
1045 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1046
Paul Bakker29e1f122013-04-16 13:07:56 +02001047 /*
1048 * Ephemeral ECDH parameters:
1049 *
1050 * struct {
1051 * ECParameters curve_params;
1052 * ECPoint public;
1053 * } ServerECDHParams;
1054 */
Paul Bakker29e1f122013-04-16 13:07:56 +02001055 if( ( ret = ecdh_read_params( &ssl->handshake->ecdh_ctx,
1056 (const unsigned char **) p, end ) ) != 0 )
1057 {
1058 SSL_DEBUG_RET( 2, ( "ecdh_read_params" ), ret );
1059 return( ret );
1060 }
1061
1062 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
1063 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
1064 {
1065 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDH length)" ) );
1066 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1067 }
1068
1069 SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
Paul Bakker29e1f122013-04-16 13:07:56 +02001070
1071 return( ret );
1072}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001073#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001074
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001075#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
1076 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001077static int ssl_parse_server_psk_hint( ssl_context *ssl,
1078 unsigned char **p,
1079 unsigned char *end )
1080{
1081 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001082 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001083 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001084
1085 /*
1086 * PSK parameters:
1087 *
1088 * opaque psk_identity_hint<0..2^16-1>;
1089 */
1090 len = (*p)[1] << 8 | (*p)[0];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001091 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001092
1093 if( (*p) + len > end )
1094 {
1095 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
1096 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1097 }
1098
1099 // TODO: Retrieve PSK identity hint and callback to app
1100 //
1101 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001102 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001103
1104 return( ret );
1105}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001106#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
1107 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001108
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001109#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1110 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001111static int ssl_parse_signature_algorithm( ssl_context *ssl,
1112 unsigned char **p,
1113 unsigned char *end,
1114 md_type_t *md_alg )
1115{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001116 ((void) ssl);
Paul Bakker29e1f122013-04-16 13:07:56 +02001117 *md_alg = POLARSSL_MD_NONE;
1118
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001119 if( (*p) + 2 > end )
Paul Bakker29e1f122013-04-16 13:07:56 +02001120 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1121
1122 if( (*p)[1] != SSL_SIG_RSA )
1123 {
1124 SSL_DEBUG_MSG( 2, ( "server used unsupported SignatureAlgorithm %d", (*p)[1] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001125 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1126 }
1127
1128 switch( (*p)[0] )
1129 {
1130#if defined(POLARSSL_MD5_C)
1131 case SSL_HASH_MD5:
1132 *md_alg = POLARSSL_MD_MD5;
1133 break;
1134#endif
1135#if defined(POLARSSL_SHA1_C)
1136 case SSL_HASH_SHA1:
1137 *md_alg = POLARSSL_MD_SHA1;
1138 break;
1139#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001140#if defined(POLARSSL_SHA256_C)
Paul Bakker29e1f122013-04-16 13:07:56 +02001141 case SSL_HASH_SHA224:
1142 *md_alg = POLARSSL_MD_SHA224;
1143 break;
1144 case SSL_HASH_SHA256:
1145 *md_alg = POLARSSL_MD_SHA256;
1146 break;
1147#endif
Paul Bakker9e36f042013-06-30 14:34:05 +02001148#if defined(POLARSSL_SHA512_C)
Paul Bakker29e1f122013-04-16 13:07:56 +02001149 case SSL_HASH_SHA384:
1150 *md_alg = POLARSSL_MD_SHA384;
1151 break;
1152 case SSL_HASH_SHA512:
1153 *md_alg = POLARSSL_MD_SHA512;
1154 break;
1155#endif
1156 default:
1157 SSL_DEBUG_MSG( 2, ( "Server used unsupported HashAlgorithm %d", *(p)[0] ) );
1158 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1159 }
1160
1161 SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
1162 SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
1163 *p += 2;
1164
1165 return( 0 );
1166}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001167#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1168 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001169
Paul Bakker41c83d32013-03-20 14:39:14 +01001170static int ssl_parse_server_key_exchange( ssl_context *ssl )
1171{
Paul Bakker23986e52011-04-24 08:57:21 +00001172 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001173 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001174 unsigned char *p, *end;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001175#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1176 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001177 size_t n;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001178 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +02001179 md_type_t md_alg = POLARSSL_MD_NONE;
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001180 unsigned int hashlen = 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001181#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001182
1183 SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
1184
Paul Bakker41c83d32013-03-20 14:39:14 +01001185 if( ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_RSA &&
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001186 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_ECDHE_RSA &&
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001187 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_PSK &&
1188 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +00001189 {
1190 SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
1191 ssl->state++;
1192 return( 0 );
1193 }
1194
Paul Bakker5121ce52009-01-03 21:22:43 +00001195 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1196 {
1197 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1198 return( ret );
1199 }
1200
1201 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1202 {
1203 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001204 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001205 }
1206
1207 if( ssl->in_msg[0] != SSL_HS_SERVER_KEY_EXCHANGE )
1208 {
Paul Bakker188c8de2013-04-19 09:13:37 +02001209 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1210 {
1211 ssl->record_read = 1;
1212 goto exit;
1213 }
1214
1215 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1216 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001217 }
1218
Paul Bakker1ef83d62012-04-11 12:09:53 +00001219 SSL_DEBUG_BUF( 3, "server key exchange", ssl->in_msg + 4, ssl->in_hslen - 4 );
1220
Paul Bakker3b6a07b2013-03-21 11:56:50 +01001221 p = ssl->in_msg + 4;
1222 end = ssl->in_msg + ssl->in_hslen;
1223
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001224#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001225 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001226 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001227 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001228 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001229 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1230 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1231 }
1232 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001233 else
1234#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1235#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
1236 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001237 {
1238 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
1239 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001240 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1241 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1242 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001243 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001244 else
1245#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
1246#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1247 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakker41c83d32013-03-20 14:39:14 +01001248 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001249 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001250 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001251 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1252 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1253 }
1254 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001255 else
1256#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
1257#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1258 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1259 {
1260 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
1261 {
1262 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1263 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1264 }
1265 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
1266 {
1267 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1268 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1269 }
1270 }
1271 else
1272#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1273 {
1274 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1275 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001276
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001277#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1278 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001279 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1280 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001281 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001282 /*
1283 * Handle the digitally-signed structure
1284 */
1285 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001286 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001287 if( ssl_parse_signature_algorithm( ssl, &p, end, &md_alg ) != 0 )
1288 {
Paul Bakker1ef83d62012-04-11 12:09:53 +00001289 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001290 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1291 }
1292 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001293
Paul Bakker29e1f122013-04-16 13:07:56 +02001294 n = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00001295 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001296
Paul Bakker29e1f122013-04-16 13:07:56 +02001297 if( end != p + n )
Paul Bakker41c83d32013-03-20 14:39:14 +01001298 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001299 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001300 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1301 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001302
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001303 /* EC NOT IMPLEMENTED YET */
1304 if( ssl->session_negotiate->peer_cert->pk.type != POLARSSL_PK_RSA )
1305 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1306
Paul Bakker29e1f122013-04-16 13:07:56 +02001307 if( (unsigned int)( end - p ) !=
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001308 pk_rsa( ssl->session_negotiate->peer_cert->pk )->len )
Paul Bakker41c83d32013-03-20 14:39:14 +01001309 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001310 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001311 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1312 }
1313
Paul Bakker29e1f122013-04-16 13:07:56 +02001314 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001315 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001316 md5_context md5;
1317 sha1_context sha1;
1318
1319 /*
1320 * digitally-signed struct {
1321 * opaque md5_hash[16];
1322 * opaque sha_hash[20];
1323 * };
1324 *
1325 * md5_hash
1326 * MD5(ClientHello.random + ServerHello.random
1327 * + ServerParams);
1328 * sha_hash
1329 * SHA(ClientHello.random + ServerHello.random
1330 * + ServerParams);
1331 */
1332 n = ssl->in_hslen - ( end - p ) - 6;
1333
1334 md5_starts( &md5 );
1335 md5_update( &md5, ssl->handshake->randbytes, 64 );
1336 md5_update( &md5, ssl->in_msg + 4, n );
1337 md5_finish( &md5, hash );
1338
1339 sha1_starts( &sha1 );
1340 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
1341 sha1_update( &sha1, ssl->in_msg + 4, n );
1342 sha1_finish( &sha1, hash + 16 );
1343
1344 md_alg = POLARSSL_MD_NONE;
1345 hashlen = 36;
1346 }
1347 else
1348 {
1349 md_context_t ctx;
1350
1351 n = ssl->in_hslen - ( end - p ) - 8;
1352
1353 /*
1354 * digitally-signed struct {
1355 * opaque client_random[32];
1356 * opaque server_random[32];
1357 * ServerDHParams params;
1358 * };
1359 */
1360 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1361 {
1362 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1363 return( ret );
1364 }
1365
1366 md_starts( &ctx );
1367 md_update( &ctx, ssl->handshake->randbytes, 64 );
1368 md_update( &ctx, ssl->in_msg + 4, n );
1369 md_finish( &ctx, hash );
1370 }
1371
1372 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
1373
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001374 if( ( ret = rsa_pkcs1_verify(
1375 pk_rsa( ssl->session_negotiate->peer_cert->pk ),
1376 RSA_PUBLIC, md_alg, hashlen, hash, p ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02001377 {
1378 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001379 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001380 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001381 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001382#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1383 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001384
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001385exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001386 ssl->state++;
1387
1388 SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
1389
1390 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001391}
1392
1393static int ssl_parse_certificate_request( ssl_context *ssl )
1394{
1395 int ret;
Paul Bakker926af752012-11-23 13:38:07 +01001396 unsigned char *buf, *p;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001397 size_t n = 0, m = 0;
Paul Bakker926af752012-11-23 13:38:07 +01001398 size_t cert_type_len = 0, sig_alg_len = 0, dn_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001399
1400 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
1401
1402 /*
1403 * 0 . 0 handshake type
1404 * 1 . 3 handshake length
Paul Bakker926af752012-11-23 13:38:07 +01001405 * 4 . 4 cert type count
1406 * 5 .. m-1 cert types
1407 * m .. m+1 sig alg length (TLS 1.2 only)
1408 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001409 * n .. n+1 length of all DNs
1410 * n+2 .. n+3 length of DN 1
1411 * n+4 .. ... Distinguished Name #1
1412 * ... .. ... length of DN 2, etc.
1413 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001414 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001415 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001416 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1417 {
1418 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1419 return( ret );
1420 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001421
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001422 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1423 {
1424 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1425 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1426 }
1427
1428 ssl->record_read = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001429 }
1430
1431 ssl->client_auth = 0;
1432 ssl->state++;
1433
1434 if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST )
1435 ssl->client_auth++;
1436
1437 SSL_DEBUG_MSG( 3, ( "got %s certificate request",
1438 ssl->client_auth ? "a" : "no" ) );
1439
Paul Bakker926af752012-11-23 13:38:07 +01001440 if( ssl->client_auth == 0 )
1441 goto exit;
1442
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001443 ssl->record_read = 0;
1444
Paul Bakker926af752012-11-23 13:38:07 +01001445 // TODO: handshake_failure alert for an anonymous server to request
1446 // client authentication
1447
1448 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001449
Paul Bakker926af752012-11-23 13:38:07 +01001450 // Retrieve cert types
1451 //
1452 cert_type_len = buf[4];
1453 n = cert_type_len;
1454
1455 if( ssl->in_hslen < 6 + n )
1456 {
1457 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1458 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1459 }
1460
Paul Bakker73d44312013-05-22 13:56:26 +02001461 p = buf + 5;
Paul Bakker926af752012-11-23 13:38:07 +01001462 while( cert_type_len > 0 )
1463 {
1464 if( *p == SSL_CERT_TYPE_RSA_SIGN )
1465 {
1466 ssl->handshake->cert_type = SSL_CERT_TYPE_RSA_SIGN;
1467 break;
1468 }
1469
1470 cert_type_len--;
1471 p++;
1472 }
1473
1474 if( ssl->handshake->cert_type == 0 )
1475 {
1476 SSL_DEBUG_MSG( 1, ( "no known cert_type provided" ) );
1477 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1478 }
1479
1480 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
1481 {
1482 sig_alg_len = ( ( buf[5 + n] << 8 )
1483 | ( buf[6 + n] ) );
1484
1485 p = buf + 7 + n;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001486 m += 2;
Paul Bakker926af752012-11-23 13:38:07 +01001487 n += sig_alg_len;
1488
1489 if( ssl->in_hslen < 6 + n )
1490 {
1491 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1492 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1493 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001494 }
Paul Bakker926af752012-11-23 13:38:07 +01001495
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001496 dn_len = ( ( buf[5 + m + n] << 8 )
1497 | ( buf[6 + m + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01001498
1499 n += dn_len;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001500 if( ssl->in_hslen != 7 + m + n )
Paul Bakker926af752012-11-23 13:38:07 +01001501 {
1502 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1503 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1504 }
1505
1506exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001507 SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
1508
1509 return( 0 );
1510}
1511
1512static int ssl_parse_server_hello_done( ssl_context *ssl )
1513{
1514 int ret;
1515
1516 SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
1517
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001518 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001519 {
1520 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1521 {
1522 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1523 return( ret );
1524 }
1525
1526 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1527 {
1528 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001529 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001530 }
1531 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001532 ssl->record_read = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001533
1534 if( ssl->in_hslen != 4 ||
1535 ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE )
1536 {
1537 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001538 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001539 }
1540
1541 ssl->state++;
1542
1543 SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
1544
1545 return( 0 );
1546}
1547
1548static int ssl_write_client_key_exchange( ssl_context *ssl )
1549{
Paul Bakker23986e52011-04-24 08:57:21 +00001550 int ret;
1551 size_t i, n;
Paul Bakker41c83d32013-03-20 14:39:14 +01001552 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001553
1554 SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
1555
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001556#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001557 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001558 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001559 /*
1560 * DHM key exchange -- send G^X mod P
1561 */
Paul Bakker48916f92012-09-16 19:57:18 +00001562 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001563
1564 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1565 ssl->out_msg[5] = (unsigned char)( n );
1566 i = 6;
1567
Paul Bakker29b64762012-09-25 09:36:44 +00001568 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1569 mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker5121ce52009-01-03 21:22:43 +00001570 &ssl->out_msg[i], n,
1571 ssl->f_rng, ssl->p_rng );
1572 if( ret != 0 )
1573 {
1574 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1575 return( ret );
1576 }
1577
Paul Bakker48916f92012-09-16 19:57:18 +00001578 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1579 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00001580
Paul Bakker48916f92012-09-16 19:57:18 +00001581 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001582
Paul Bakker48916f92012-09-16 19:57:18 +00001583 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1584 ssl->handshake->premaster,
1585 &ssl->handshake->pmslen ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001586 {
1587 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1588 return( ret );
1589 }
1590
Paul Bakker48916f92012-09-16 19:57:18 +00001591 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00001592 }
1593 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001594#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1595#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001596 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
1597 {
1598 /*
1599 * ECDH key exchange -- send client public value
1600 */
1601 i = 4;
1602
1603 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx,
1604 &n,
1605 &ssl->out_msg[i], 1000,
1606 ssl->f_rng, ssl->p_rng );
1607 if( ret != 0 )
1608 {
1609 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
1610 return( ret );
1611 }
1612
1613 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
1614
1615 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
1616 &ssl->handshake->pmslen,
1617 ssl->handshake->premaster,
1618 POLARSSL_MPI_MAX_SIZE ) ) != 0 )
1619 {
1620 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
1621 return( ret );
1622 }
1623
1624 SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
1625 }
1626 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001627#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001628#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1629 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1630 {
1631 unsigned char *p = ssl->handshake->premaster;
1632
1633 /*
1634 * PSK key exchange
1635 *
1636 * opaque psk_identity<0..2^16-1>;
1637 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001638 if( ssl->psk == NULL )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001639 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1640
1641 if( sizeof(ssl->handshake->premaster) < 4 + 2 * ssl->psk_len )
1642 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1643
1644 n = ssl->psk_identity_len;
1645
1646 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1647 ssl->out_msg[5] = (unsigned char)( n );
1648 i = 6;
1649
1650 memcpy( ssl->out_msg + i, ssl->psk_identity, ssl->psk_identity_len );
1651
1652 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1653 *(p++) = (unsigned char)( ssl->psk_len );
1654 p += ssl->psk_len;
1655
1656 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1657 *(p++) = (unsigned char)( ssl->psk_len );
1658 memcpy( p, ssl->psk, ssl->psk_len );
1659 p += ssl->psk_len;
1660
1661 ssl->handshake->pmslen = 4 + 2 * ssl->psk_len;
1662 }
1663 else
1664#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001665#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1666 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1667 {
1668 unsigned char *p = ssl->handshake->premaster;
1669
1670 /*
1671 * DHE_PSK key exchange
1672 *
1673 * opaque psk_identity<0..2^16-1>;
1674 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
1675 */
1676 if( ssl->psk == NULL )
1677 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1678
1679 if( sizeof(ssl->handshake->premaster) < 4 + ssl->psk_identity_len +
1680 ssl->handshake->dhm_ctx.len )
1681 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1682
1683 i = 4;
1684 n = ssl->psk_identity_len;
1685 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1686 ssl->out_msg[5] = (unsigned char)( n );
1687
1688 memcpy( ssl->out_msg + 6, ssl->psk_identity, ssl->psk_identity_len );
1689
1690 n = ssl->handshake->dhm_ctx.len;
1691 ssl->out_msg[6 + ssl->psk_identity_len] = (unsigned char)( n >> 8 );
1692 ssl->out_msg[7 + ssl->psk_identity_len] = (unsigned char)( n );
1693
1694 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1695 mpi_size( &ssl->handshake->dhm_ctx.P ),
1696 &ssl->out_msg[8 + ssl->psk_identity_len], n,
1697 ssl->f_rng, ssl->p_rng );
1698 if( ret != 0 )
1699 {
1700 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1701 return( ret );
1702 }
1703
1704 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1705 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
1706
1707 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len >> 8 );
1708 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len );
1709 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1710 p, &n ) ) != 0 )
1711 {
1712 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1713 return( ret );
1714 }
1715
1716 if( n != ssl->handshake->dhm_ctx.len )
1717 {
1718 SSL_DEBUG_MSG( 1, ( "dhm_calc_secret result smaller than DHM" ) );
1719 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1720 }
1721
1722 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
1723
1724 p += ssl->handshake->dhm_ctx.len;
1725
1726 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1727 *(p++) = (unsigned char)( ssl->psk_len );
1728 memcpy( p, ssl->psk, ssl->psk_len );
1729 p += ssl->psk_len;
1730
1731 ssl->handshake->pmslen = 4 + ssl->handshake->dhm_ctx.len + ssl->psk_len;
1732 n = ssl->handshake->pmslen;
1733 }
1734 else
1735#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1736#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001737 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001738 {
1739 /*
1740 * RSA key exchange -- send rsa_public(pkcs1 v1.5(premaster))
1741 */
Paul Bakker48916f92012-09-16 19:57:18 +00001742 ssl->handshake->premaster[0] = (unsigned char) ssl->max_major_ver;
1743 ssl->handshake->premaster[1] = (unsigned char) ssl->max_minor_ver;
1744 ssl->handshake->pmslen = 48;
Paul Bakker5121ce52009-01-03 21:22:43 +00001745
Paul Bakker48916f92012-09-16 19:57:18 +00001746 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster + 2,
1747 ssl->handshake->pmslen - 2 );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001748 if( ret != 0 )
1749 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001750
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001751 /* EC NOT IMPLEMENTED YET */
1752 if( ssl->session_negotiate->peer_cert->pk.type != POLARSSL_PK_RSA )
1753 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1754
Paul Bakker5121ce52009-01-03 21:22:43 +00001755 i = 4;
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001756 n = pk_rsa( ssl->session_negotiate->peer_cert->pk )->len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001757
1758 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
1759 {
1760 i += 2;
1761 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1762 ssl->out_msg[5] = (unsigned char)( n );
1763 }
1764
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001765 ret = rsa_pkcs1_encrypt(
1766 pk_rsa( ssl->session_negotiate->peer_cert->pk ),
1767 ssl->f_rng, ssl->p_rng, RSA_PUBLIC,
1768 ssl->handshake->pmslen, ssl->handshake->premaster,
1769 ssl->out_msg + i );
Paul Bakker5121ce52009-01-03 21:22:43 +00001770 if( ret != 0 )
1771 {
1772 SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret );
1773 return( ret );
1774 }
1775 }
Paul Bakkered27a042013-04-18 22:46:23 +02001776 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001777#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02001778 {
1779 ((void) ciphersuite_info);
1780 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1781 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001782
Paul Bakkerff60ee62010-03-16 21:09:09 +00001783 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1784 {
1785 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1786 return( ret );
1787 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001788
1789 ssl->out_msglen = i + n;
1790 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1791 ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE;
1792
1793 ssl->state++;
1794
1795 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1796 {
1797 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1798 return( ret );
1799 }
1800
1801 SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
1802
1803 return( 0 );
1804}
1805
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001806#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1807 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1808 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001809static int ssl_write_certificate_verify( ssl_context *ssl )
1810{
Paul Bakkered27a042013-04-18 22:46:23 +02001811 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1812 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001813
1814 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1815
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001816 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1817 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02001818 {
1819 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1820 ssl->state++;
1821 return( 0 );
1822 }
1823
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001824 return( ret );
1825}
1826#else
1827static int ssl_write_certificate_verify( ssl_context *ssl )
1828{
1829 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1830 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1831 size_t n = 0, offset = 0;
1832 unsigned char hash[48];
1833 md_type_t md_alg = POLARSSL_MD_NONE;
1834 unsigned int hashlen = 0;
1835
1836 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1837
1838 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1839 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1840 {
1841 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1842 ssl->state++;
1843 return( 0 );
1844 }
1845
Paul Bakkered27a042013-04-18 22:46:23 +02001846 if( ssl->client_auth == 0 || ssl->own_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001847 {
1848 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1849 ssl->state++;
1850 return( 0 );
1851 }
1852
1853 if( ssl->rsa_key == NULL )
1854 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001855 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1856 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001857 }
1858
1859 /*
1860 * Make an RSA signature of the handshake digests
1861 */
Paul Bakker48916f92012-09-16 19:57:18 +00001862 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001863
Paul Bakker926af752012-11-23 13:38:07 +01001864 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001865 {
Paul Bakker926af752012-11-23 13:38:07 +01001866 /*
1867 * digitally-signed struct {
1868 * opaque md5_hash[16];
1869 * opaque sha_hash[20];
1870 * };
1871 *
1872 * md5_hash
1873 * MD5(handshake_messages);
1874 *
1875 * sha_hash
1876 * SHA(handshake_messages);
1877 */
1878 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001879 md_alg = POLARSSL_MD_NONE;
Paul Bakker926af752012-11-23 13:38:07 +01001880 }
1881 else
1882 {
1883 /*
1884 * digitally-signed struct {
1885 * opaque handshake_messages[handshake_messages_length];
1886 * };
1887 *
1888 * Taking shortcut here. We assume that the server always allows the
1889 * PRF Hash function and has sent it in the allowed signature
1890 * algorithms list received in the Certificate Request message.
1891 *
1892 * Until we encounter a server that does not, we will take this
1893 * shortcut.
1894 *
1895 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
1896 * in order to satisfy 'weird' needs from the server side.
1897 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001898 if( ssl->transform_negotiate->ciphersuite_info->mac ==
1899 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001900 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001901 md_alg = POLARSSL_MD_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001902 ssl->out_msg[4] = SSL_HASH_SHA384;
1903 ssl->out_msg[5] = SSL_SIG_RSA;
1904 }
1905 else
1906 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001907 md_alg = POLARSSL_MD_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001908 ssl->out_msg[4] = SSL_HASH_SHA256;
1909 ssl->out_msg[5] = SSL_SIG_RSA;
1910 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001911
1912 offset = 2;
1913 }
1914
Paul Bakker926af752012-11-23 13:38:07 +01001915 if ( ssl->rsa_key )
1916 n = ssl->rsa_key_len ( ssl->rsa_key );
1917
Paul Bakker1ef83d62012-04-11 12:09:53 +00001918 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
1919 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001920
Paul Bakker43b7e352011-01-18 15:27:19 +00001921 if( ssl->rsa_key )
Paul Bakker5121ce52009-01-03 21:22:43 +00001922 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001923 ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001924 RSA_PRIVATE, md_alg,
Paul Bakkereb2c6582012-09-27 19:15:01 +00001925 hashlen, hash, ssl->out_msg + 6 + offset );
Paul Bakker43b7e352011-01-18 15:27:19 +00001926 }
1927
1928 if (ret != 0)
1929 {
1930 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001931 return( ret );
1932 }
1933
Paul Bakker1ef83d62012-04-11 12:09:53 +00001934 ssl->out_msglen = 6 + n + offset;
Paul Bakker5121ce52009-01-03 21:22:43 +00001935 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1936 ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY;
1937
1938 ssl->state++;
1939
1940 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1941 {
1942 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1943 return( ret );
1944 }
1945
1946 SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
1947
Paul Bakkered27a042013-04-18 22:46:23 +02001948 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001949}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001950#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1951 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1952 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001953
Paul Bakkera503a632013-08-14 13:48:06 +02001954#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02001955static int ssl_parse_new_session_ticket( ssl_context *ssl )
1956{
1957 int ret;
1958 uint32_t lifetime;
1959 size_t ticket_len;
1960 unsigned char *ticket;
1961
1962 SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
1963
1964 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1965 {
1966 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1967 return( ret );
1968 }
1969
1970 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1971 {
1972 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
1973 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1974 }
1975
1976 /*
1977 * struct {
1978 * uint32 ticket_lifetime_hint;
1979 * opaque ticket<0..2^16-1>;
1980 * } NewSessionTicket;
1981 *
1982 * 0 . 0 handshake message type
1983 * 1 . 3 handshake message length
1984 * 4 . 7 ticket_lifetime_hint
1985 * 8 . 9 ticket_len (n)
1986 * 10 . 9+n ticket content
1987 */
1988 if( ssl->in_msg[0] != SSL_HS_NEW_SESSION_TICKET ||
1989 ssl->in_hslen < 10 )
1990 {
1991 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
1992 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
1993 }
1994
1995 lifetime = ( ssl->in_msg[4] << 24 ) | ( ssl->in_msg[5] << 16 ) |
1996 ( ssl->in_msg[6] << 8 ) | ( ssl->in_msg[7] );
1997
1998 ticket_len = ( ssl->in_msg[8] << 8 ) | ( ssl->in_msg[9] );
1999
2000 if( ticket_len + 10 != ssl->in_hslen )
2001 {
2002 SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
2003 return( POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
2004 }
2005
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002006 SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
2007
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002008 /* We're not waiting for a NewSessionTicket message any more */
2009 ssl->handshake->new_session_ticket = 0;
2010
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002011 /*
2012 * Zero-length ticket means the server changed his mind and doesn't want
2013 * to send a ticket after all, so just forget it
2014 */
2015 if( ticket_len == 0)
2016 return( 0 );
2017
2018 polarssl_free( ssl->session_negotiate->ticket );
2019 ssl->session_negotiate->ticket = NULL;
2020 ssl->session_negotiate->ticket_len = 0;
2021
2022 if( ( ticket = polarssl_malloc( ticket_len ) ) == NULL )
2023 {
2024 SSL_DEBUG_MSG( 1, ( "ticket malloc failed" ) );
2025 return( POLARSSL_ERR_SSL_MALLOC_FAILED );
2026 }
2027
2028 memcpy( ticket, ssl->in_msg + 10, ticket_len );
2029
2030 ssl->session_negotiate->ticket = ticket;
2031 ssl->session_negotiate->ticket_len = ticket_len;
2032 ssl->session_negotiate->ticket_lifetime = lifetime;
2033
2034 /*
2035 * RFC 5077 section 3.4:
2036 * "If the client receives a session ticket from the server, then it
2037 * discards any Session ID that was sent in the ServerHello."
2038 */
2039 SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
2040 ssl->session_negotiate->length = 0;
2041
2042 SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
2043
2044 return( 0 );
2045}
Paul Bakkera503a632013-08-14 13:48:06 +02002046#endif /* POLARSSL_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002047
Paul Bakker5121ce52009-01-03 21:22:43 +00002048/*
Paul Bakker1961b702013-01-25 14:49:24 +01002049 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00002050 */
Paul Bakker1961b702013-01-25 14:49:24 +01002051int ssl_handshake_client_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00002052{
2053 int ret = 0;
2054
Paul Bakker1961b702013-01-25 14:49:24 +01002055 if( ssl->state == SSL_HANDSHAKE_OVER )
2056 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00002057
Paul Bakker1961b702013-01-25 14:49:24 +01002058 SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
2059
2060 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
2061 return( ret );
2062
2063 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00002064 {
Paul Bakker1961b702013-01-25 14:49:24 +01002065 case SSL_HELLO_REQUEST:
2066 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00002067 break;
2068
Paul Bakker1961b702013-01-25 14:49:24 +01002069 /*
2070 * ==> ClientHello
2071 */
2072 case SSL_CLIENT_HELLO:
2073 ret = ssl_write_client_hello( ssl );
2074 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002075
Paul Bakker1961b702013-01-25 14:49:24 +01002076 /*
2077 * <== ServerHello
2078 * Certificate
2079 * ( ServerKeyExchange )
2080 * ( CertificateRequest )
2081 * ServerHelloDone
2082 */
2083 case SSL_SERVER_HELLO:
2084 ret = ssl_parse_server_hello( ssl );
2085 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002086
Paul Bakker1961b702013-01-25 14:49:24 +01002087 case SSL_SERVER_CERTIFICATE:
2088 ret = ssl_parse_certificate( ssl );
2089 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002090
Paul Bakker1961b702013-01-25 14:49:24 +01002091 case SSL_SERVER_KEY_EXCHANGE:
2092 ret = ssl_parse_server_key_exchange( ssl );
2093 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002094
Paul Bakker1961b702013-01-25 14:49:24 +01002095 case SSL_CERTIFICATE_REQUEST:
2096 ret = ssl_parse_certificate_request( ssl );
2097 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002098
Paul Bakker1961b702013-01-25 14:49:24 +01002099 case SSL_SERVER_HELLO_DONE:
2100 ret = ssl_parse_server_hello_done( ssl );
2101 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002102
Paul Bakker1961b702013-01-25 14:49:24 +01002103 /*
2104 * ==> ( Certificate/Alert )
2105 * ClientKeyExchange
2106 * ( CertificateVerify )
2107 * ChangeCipherSpec
2108 * Finished
2109 */
2110 case SSL_CLIENT_CERTIFICATE:
2111 ret = ssl_write_certificate( ssl );
2112 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002113
Paul Bakker1961b702013-01-25 14:49:24 +01002114 case SSL_CLIENT_KEY_EXCHANGE:
2115 ret = ssl_write_client_key_exchange( ssl );
2116 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002117
Paul Bakker1961b702013-01-25 14:49:24 +01002118 case SSL_CERTIFICATE_VERIFY:
2119 ret = ssl_write_certificate_verify( ssl );
2120 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002121
Paul Bakker1961b702013-01-25 14:49:24 +01002122 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
2123 ret = ssl_write_change_cipher_spec( ssl );
2124 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002125
Paul Bakker1961b702013-01-25 14:49:24 +01002126 case SSL_CLIENT_FINISHED:
2127 ret = ssl_write_finished( ssl );
2128 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002129
Paul Bakker1961b702013-01-25 14:49:24 +01002130 /*
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02002131 * <== ( NewSessionTicket )
2132 * ChangeCipherSpec
Paul Bakker1961b702013-01-25 14:49:24 +01002133 * Finished
2134 */
2135 case SSL_SERVER_CHANGE_CIPHER_SPEC:
Paul Bakkera503a632013-08-14 13:48:06 +02002136#if defined(POLARSSL_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002137 if( ssl->handshake->new_session_ticket != 0 )
2138 ret = ssl_parse_new_session_ticket( ssl );
2139 else
Paul Bakkera503a632013-08-14 13:48:06 +02002140#endif
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02002141 ret = ssl_parse_change_cipher_spec( ssl );
Paul Bakker1961b702013-01-25 14:49:24 +01002142 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002143
Paul Bakker1961b702013-01-25 14:49:24 +01002144 case SSL_SERVER_FINISHED:
2145 ret = ssl_parse_finished( ssl );
2146 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002147
Paul Bakker1961b702013-01-25 14:49:24 +01002148 case SSL_FLUSH_BUFFERS:
2149 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
2150 ssl->state = SSL_HANDSHAKE_WRAPUP;
2151 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00002152
Paul Bakker1961b702013-01-25 14:49:24 +01002153 case SSL_HANDSHAKE_WRAPUP:
2154 ssl_handshake_wrapup( ssl );
2155 break;
Paul Bakker48916f92012-09-16 19:57:18 +00002156
Paul Bakker1961b702013-01-25 14:49:24 +01002157 default:
2158 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
2159 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
2160 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002161
2162 return( ret );
2163}
Paul Bakker5121ce52009-01-03 21:22:43 +00002164#endif