blob: 66ebcefcbd98deeceeedaf7e761c79d83371f49d [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
Paul Bakker5121ce52009-01-03 21:22:43 +000033#include <stdlib.h>
34#include <stdio.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020035
36#ifdef _MSC_VER
37#include <basetsd.h>
38typedef UINT32 uint32_t;
39#else
40#include <inttypes.h>
41#endif
42
43#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +000044#include <time.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020045#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000046
Paul Bakkerd3edc862013-03-20 16:07:17 +010047static void ssl_write_hostname_ext( ssl_context *ssl,
48 unsigned char *buf,
49 size_t *olen )
50{
51 unsigned char *p = buf;
52
53 *olen = 0;
54
55 if ( ssl->hostname == NULL )
56 return;
57
58 SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
59 ssl->hostname ) );
60
61 /*
62 * struct {
63 * NameType name_type;
64 * select (name_type) {
65 * case host_name: HostName;
66 * } name;
67 * } ServerName;
68 *
69 * enum {
70 * host_name(0), (255)
71 * } NameType;
72 *
73 * opaque HostName<1..2^16-1>;
74 *
75 * struct {
76 * ServerName server_name_list<1..2^16-1>
77 * } ServerNameList;
78 */
79 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
80 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME ) & 0xFF );
81
82 *p++ = (unsigned char)( ( (ssl->hostname_len + 5) >> 8 ) & 0xFF );
83 *p++ = (unsigned char)( ( (ssl->hostname_len + 5) ) & 0xFF );
84
85 *p++ = (unsigned char)( ( (ssl->hostname_len + 3) >> 8 ) & 0xFF );
86 *p++ = (unsigned char)( ( (ssl->hostname_len + 3) ) & 0xFF );
87
88 *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
89 *p++ = (unsigned char)( ( ssl->hostname_len >> 8 ) & 0xFF );
90 *p++ = (unsigned char)( ( ssl->hostname_len ) & 0xFF );
91
92 memcpy( p, ssl->hostname, ssl->hostname_len );
93
94 *olen = ssl->hostname_len + 9;
95}
96
97static void ssl_write_renegotiation_ext( ssl_context *ssl,
98 unsigned char *buf,
99 size_t *olen )
100{
101 unsigned char *p = buf;
102
103 *olen = 0;
104
105 if( ssl->renegotiation != SSL_RENEGOTIATION )
106 return;
107
108 SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
109
110 /*
111 * Secure renegotiation
112 */
113 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
114 *p++ = (unsigned char)( ( TLS_EXT_RENEGOTIATION_INFO ) & 0xFF );
115
116 *p++ = 0x00;
117 *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
118 *p++ = ssl->verify_data_len & 0xFF;
119
120 memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
121
122 *olen = 5 + ssl->verify_data_len;
123}
124
125static void ssl_write_signature_algorithms_ext( ssl_context *ssl,
126 unsigned char *buf,
127 size_t *olen )
128{
129 unsigned char *p = buf;
130 unsigned char sig_alg_list[20];
131 size_t sig_alg_len = 0;
132
133 *olen = 0;
134
135 if( ssl->max_minor_ver != SSL_MINOR_VERSION_3 )
136 return;
137
138 SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
139
140 /*
141 * Prepare signature_algorithms extension (TLS 1.2)
142 */
Paul Bakker9e36f042013-06-30 14:34:05 +0200143#if defined(POLARSSL_SHA512_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100144 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA512;
145 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
146 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA384;
147 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
148#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200149#if defined(POLARSSL_SHA256_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100150 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA256;
151 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
152 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA224;
153 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
154#endif
155#if defined(POLARSSL_SHA1_C)
156 sig_alg_list[sig_alg_len++] = SSL_HASH_SHA1;
157 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
158#endif
159#if defined(POLARSSL_MD5_C)
160 sig_alg_list[sig_alg_len++] = SSL_HASH_MD5;
161 sig_alg_list[sig_alg_len++] = SSL_SIG_RSA;
162#endif
163
164 /*
165 * enum {
166 * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
167 * sha512(6), (255)
168 * } HashAlgorithm;
169 *
170 * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
171 * SignatureAlgorithm;
172 *
173 * struct {
174 * HashAlgorithm hash;
175 * SignatureAlgorithm signature;
176 * } SignatureAndHashAlgorithm;
177 *
178 * SignatureAndHashAlgorithm
179 * supported_signature_algorithms<2..2^16-2>;
180 */
181 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
182 *p++ = (unsigned char)( ( TLS_EXT_SIG_ALG ) & 0xFF );
183
184 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
185 *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF );
186
187 *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
188 *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF );
189
190 memcpy( p, sig_alg_list, sig_alg_len );
191
192 *olen = 6 + sig_alg_len;
193}
194
195#if defined(POLARSSL_ECDH_C)
196static void ssl_write_supported_elliptic_curves_ext( ssl_context *ssl,
197 unsigned char *buf,
198 size_t *olen )
199{
200 unsigned char *p = buf;
201 unsigned char elliptic_curve_list[20];
202 size_t elliptic_curve_len = 0;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200203 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100204
205 *olen = 0;
206
207 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
208
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200209#if defined(POLARSSL_ECP_DP_SECP521R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100210 elliptic_curve_list[elliptic_curve_len++] = 0x00;
211 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP521R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200212#endif
213#if defined(POLARSSL_ECP_DP_SECP384R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100214 elliptic_curve_list[elliptic_curve_len++] = 0x00;
215 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP384R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200216#endif
217#if defined(POLARSSL_ECP_DP_SECP256R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100218 elliptic_curve_list[elliptic_curve_len++] = 0x00;
219 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP256R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200220#endif
221#if defined(POLARSSL_ECP_DP_SECP224R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100222 elliptic_curve_list[elliptic_curve_len++] = 0x00;
223 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP224R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200224#endif
225#if defined(POLARSSL_ECP_DP_SECP192R1_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100226 elliptic_curve_list[elliptic_curve_len++] = 0x00;
227 elliptic_curve_list[elliptic_curve_len++] = POLARSSL_ECP_DP_SECP192R1;
Paul Bakker5dc6b5f2013-06-29 23:26:34 +0200228#endif
229
230 if( elliptic_curve_len == 0 )
231 return;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100232
233 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
234 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF );
235
236 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
237 *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF );
238
239 *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF );
240 *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF );
241
242 memcpy( p, elliptic_curve_list, elliptic_curve_len );
243
244 *olen = 6 + elliptic_curve_len;
245}
246
247static void ssl_write_supported_point_formats_ext( ssl_context *ssl,
248 unsigned char *buf,
249 size_t *olen )
250{
251 unsigned char *p = buf;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200252 ((void) ssl);
Paul Bakkerd3edc862013-03-20 16:07:17 +0100253
254 *olen = 0;
255
256 SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
257
258 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
259 *p++ = (unsigned char)( ( TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF );
260
261 *p++ = 0x00;
262 *p++ = 3;
263
264 *p++ = 2;
265 *p++ = POLARSSL_ECP_PF_COMPRESSED;
266 *p++ = POLARSSL_ECP_PF_UNCOMPRESSED;
267
268 *olen = 7;
269}
270#endif
271
Paul Bakker5121ce52009-01-03 21:22:43 +0000272static int ssl_write_client_hello( ssl_context *ssl )
273{
Paul Bakker23986e52011-04-24 08:57:21 +0000274 int ret;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100275 size_t i, n, olen, ext_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000276 unsigned char *buf;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200277 unsigned char *p, *q;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200278#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000279 time_t t;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200280#endif
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200281 const int *ciphersuites;
Paul Bakker2fbefde2013-06-29 16:01:15 +0200282 const ssl_ciphersuite_t *ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000283
284 SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
285
Paul Bakker48916f92012-09-16 19:57:18 +0000286 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
287 {
Paul Bakker993d11d2012-09-28 15:00:12 +0000288 ssl->major_ver = ssl->min_major_ver;
289 ssl->minor_ver = ssl->min_minor_ver;
Paul Bakker48916f92012-09-16 19:57:18 +0000290 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000291
Paul Bakker490ecc82011-10-06 13:04:09 +0000292 if( ssl->max_major_ver == 0 && ssl->max_minor_ver == 0 )
293 {
294 ssl->max_major_ver = SSL_MAJOR_VERSION_3;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000295 ssl->max_minor_ver = SSL_MINOR_VERSION_3;
Paul Bakker490ecc82011-10-06 13:04:09 +0000296 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000297
298 /*
299 * 0 . 0 handshake type
300 * 1 . 3 handshake length
301 * 4 . 5 highest version supported
302 * 6 . 9 current UNIX time
303 * 10 . 37 random bytes
304 */
305 buf = ssl->out_msg;
306 p = buf + 4;
307
308 *p++ = (unsigned char) ssl->max_major_ver;
309 *p++ = (unsigned char) ssl->max_minor_ver;
310
311 SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
312 buf[4], buf[5] ) );
313
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200314#if defined(POLARSSL_HAVE_TIME)
Paul Bakker5121ce52009-01-03 21:22:43 +0000315 t = time( NULL );
316 *p++ = (unsigned char)( t >> 24 );
317 *p++ = (unsigned char)( t >> 16 );
318 *p++ = (unsigned char)( t >> 8 );
319 *p++ = (unsigned char)( t );
320
321 SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200322#else
323 if( ( ret = ssl->f_rng( ssl->p_rng, p, 4 ) ) != 0 )
324 return( ret );
325
326 p += 4;
327#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000328
Paul Bakkera3d195c2011-11-27 21:07:34 +0000329 if( ( ret = ssl->f_rng( ssl->p_rng, p, 28 ) ) != 0 )
330 return( ret );
331
332 p += 28;
Paul Bakker5121ce52009-01-03 21:22:43 +0000333
Paul Bakker48916f92012-09-16 19:57:18 +0000334 memcpy( ssl->handshake->randbytes, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000335
336 SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 6, 32 );
337
338 /*
339 * 38 . 38 session id length
340 * 39 . 39+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000341 * 40+n . 41+n ciphersuitelist length
342 * 42+n . .. ciphersuitelist
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000343 * .. . .. compression methods length
344 * .. . .. compression methods
345 * .. . .. extensions length
346 * .. . .. extensions
Paul Bakker5121ce52009-01-03 21:22:43 +0000347 */
Paul Bakker48916f92012-09-16 19:57:18 +0000348 n = ssl->session_negotiate->length;
Paul Bakker5121ce52009-01-03 21:22:43 +0000349
Paul Bakker0a597072012-09-25 21:55:46 +0000350 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE || n < 16 || n > 32 ||
351 ssl->handshake->resume == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000352 n = 0;
353
354 *p++ = (unsigned char) n;
355
356 for( i = 0; i < n; i++ )
Paul Bakker48916f92012-09-16 19:57:18 +0000357 *p++ = ssl->session_negotiate->id[i];
Paul Bakker5121ce52009-01-03 21:22:43 +0000358
359 SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
360 SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
361
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200362 ciphersuites = ssl->ciphersuite_list[ssl->minor_ver];
Paul Bakker2fbefde2013-06-29 16:01:15 +0200363 n = 0;
364 q = p;
365
366 // Skip writing ciphersuite length for now
367 p += 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000368
Paul Bakker48916f92012-09-16 19:57:18 +0000369 /*
370 * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
371 */
372 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
373 {
374 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
375 *p++ = (unsigned char)( SSL_EMPTY_RENEGOTIATION_INFO );
Paul Bakker2fbefde2013-06-29 16:01:15 +0200376 n++;
Paul Bakker48916f92012-09-16 19:57:18 +0000377 }
378
Paul Bakker2fbefde2013-06-29 16:01:15 +0200379 for( i = 0; ciphersuites[i] != 0; i++ )
Paul Bakker5121ce52009-01-03 21:22:43 +0000380 {
Paul Bakker2fbefde2013-06-29 16:01:15 +0200381 ciphersuite_info = ssl_ciphersuite_from_id( ciphersuites[i] );
382
383 if( ciphersuite_info == NULL )
384 continue;
385
386 if( ciphersuite_info->min_minor_ver > ssl->max_minor_ver ||
387 ciphersuite_info->max_minor_ver < ssl->min_minor_ver )
388 continue;
389
Paul Bakkere3166ce2011-01-27 17:40:50 +0000390 SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %2d",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200391 ciphersuites[i] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000392
Paul Bakker2fbefde2013-06-29 16:01:15 +0200393 n++;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200394 *p++ = (unsigned char)( ciphersuites[i] >> 8 );
395 *p++ = (unsigned char)( ciphersuites[i] );
Paul Bakker5121ce52009-01-03 21:22:43 +0000396 }
397
Paul Bakker2fbefde2013-06-29 16:01:15 +0200398 *q++ = (unsigned char)( n >> 7 );
399 *q++ = (unsigned char)( n << 1 );
400
401 SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
402
403
Paul Bakker2770fbd2012-07-03 13:30:23 +0000404#if defined(POLARSSL_ZLIB_SUPPORT)
405 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
406 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
Paul Bakker48916f92012-09-16 19:57:18 +0000407 SSL_COMPRESS_DEFLATE, SSL_COMPRESS_NULL ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000408
409 *p++ = 2;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000410 *p++ = SSL_COMPRESS_DEFLATE;
Paul Bakker48916f92012-09-16 19:57:18 +0000411 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000412#else
Paul Bakker5121ce52009-01-03 21:22:43 +0000413 SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
Paul Bakker2770fbd2012-07-03 13:30:23 +0000414 SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", SSL_COMPRESS_NULL ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000415
416 *p++ = 1;
417 *p++ = SSL_COMPRESS_NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000418#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000419
Paul Bakkerd3edc862013-03-20 16:07:17 +0100420 // First write extensions, then the total length
421 //
422 ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
423 ext_len += olen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000424
Paul Bakkerd3edc862013-03-20 16:07:17 +0100425 ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
426 ext_len += olen;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000427
Paul Bakkerd3edc862013-03-20 16:07:17 +0100428 ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
429 ext_len += olen;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000430
Paul Bakker41c83d32013-03-20 14:39:14 +0100431#if defined(POLARSSL_ECDH_C)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100432 ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
433 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100434
Paul Bakkerd3edc862013-03-20 16:07:17 +0100435 ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
436 ext_len += olen;
Paul Bakker41c83d32013-03-20 14:39:14 +0100437#endif
438
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000439 SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
440 ext_len ) );
441
442 *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
443 *p++ = (unsigned char)( ( ext_len ) & 0xFF );
Paul Bakkerd3edc862013-03-20 16:07:17 +0100444 p += ext_len;
Paul Bakker41c83d32013-03-20 14:39:14 +0100445
Paul Bakker5121ce52009-01-03 21:22:43 +0000446 ssl->out_msglen = p - buf;
447 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
448 ssl->out_msg[0] = SSL_HS_CLIENT_HELLO;
449
450 ssl->state++;
451
452 if( ( ret = ssl_write_record( ssl ) ) != 0 )
453 {
454 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
455 return( ret );
456 }
457
458 SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
459
460 return( 0 );
461}
462
Paul Bakker48916f92012-09-16 19:57:18 +0000463static int ssl_parse_renegotiation_info( ssl_context *ssl,
464 unsigned char *buf,
465 size_t len )
466{
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000467 int ret;
468
Paul Bakker48916f92012-09-16 19:57:18 +0000469 if( ssl->renegotiation == SSL_INITIAL_HANDSHAKE )
470 {
471 if( len != 1 || buf[0] != 0x0 )
472 {
473 SSL_DEBUG_MSG( 1, ( "non-zero length renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000474
475 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
476 return( ret );
477
Paul Bakker48916f92012-09-16 19:57:18 +0000478 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
479 }
480
481 ssl->secure_renegotiation = SSL_SECURE_RENEGOTIATION;
482 }
483 else
484 {
485 if( len != 1 + ssl->verify_data_len * 2 ||
486 buf[0] != ssl->verify_data_len * 2 ||
487 memcmp( buf + 1, ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
488 memcmp( buf + 1 + ssl->verify_data_len,
489 ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
490 {
491 SSL_DEBUG_MSG( 1, ( "non-matching renegotiated connection field" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000492
493 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
494 return( ret );
495
Paul Bakker48916f92012-09-16 19:57:18 +0000496 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
497 }
498 }
499
500 return( 0 );
501}
502
Paul Bakker5121ce52009-01-03 21:22:43 +0000503static int ssl_parse_server_hello( ssl_context *ssl )
504{
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200505 uint32_t t;
Paul Bakker2770fbd2012-07-03 13:30:23 +0000506 int ret, i, comp;
Paul Bakker23986e52011-04-24 08:57:21 +0000507 size_t n;
Paul Bakker48916f92012-09-16 19:57:18 +0000508 size_t ext_len = 0;
509 unsigned char *buf, *ext;
510 int renegotiation_info_seen = 0;
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000511 int handshake_failure = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000512
513 SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
514
515 /*
516 * 0 . 0 handshake type
517 * 1 . 3 handshake length
518 * 4 . 5 protocol version
519 * 6 . 9 UNIX time()
520 * 10 . 37 random bytes
521 */
522 buf = ssl->in_msg;
523
524 if( ( ret = ssl_read_record( ssl ) ) != 0 )
525 {
526 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
527 return( ret );
528 }
529
530 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
531 {
532 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000533 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000534 }
535
536 SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
537 buf[4], buf[5] ) );
538
539 if( ssl->in_hslen < 42 ||
540 buf[0] != SSL_HS_SERVER_HELLO ||
541 buf[4] != SSL_MAJOR_VERSION_3 )
542 {
543 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000544 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000545 }
546
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000547 if( buf[5] > ssl->max_minor_ver )
Paul Bakker5121ce52009-01-03 21:22:43 +0000548 {
549 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000550 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000551 }
552
553 ssl->minor_ver = buf[5];
554
Paul Bakker1d29fb52012-09-28 13:28:45 +0000555 if( ssl->minor_ver < ssl->min_minor_ver )
556 {
557 SSL_DEBUG_MSG( 1, ( "server only supports ssl smaller than minimum"
558 " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver,
559 buf[4], buf[5] ) );
560
561 ssl_send_alert_message( ssl, SSL_ALERT_LEVEL_FATAL,
562 SSL_ALERT_MSG_PROTOCOL_VERSION );
563
564 return( POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
565 }
566
Paul Bakker1504af52012-02-11 16:17:43 +0000567#if defined(POLARSSL_DEBUG_C)
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200568 t = ( (uint32_t) buf[6] << 24 )
569 | ( (uint32_t) buf[7] << 16 )
570 | ( (uint32_t) buf[8] << 8 )
571 | ( (uint32_t) buf[9] );
Paul Bakker87e5cda2012-01-14 18:14:15 +0000572#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000573
Paul Bakker48916f92012-09-16 19:57:18 +0000574 memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000575
576 n = buf[38];
577
578 SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
579 SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
580
Paul Bakker48916f92012-09-16 19:57:18 +0000581 if( n > 32 )
582 {
583 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
584 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
585 }
586
Paul Bakker5121ce52009-01-03 21:22:43 +0000587 /*
588 * 38 . 38 session id length
589 * 39 . 38+n session id
Paul Bakkere3166ce2011-01-27 17:40:50 +0000590 * 39+n . 40+n chosen ciphersuite
Paul Bakker5121ce52009-01-03 21:22:43 +0000591 * 41+n . 41+n chosen compression alg.
592 * 42+n . 43+n extensions length
593 * 44+n . 44+n+m extensions
594 */
Paul Bakker48916f92012-09-16 19:57:18 +0000595 if( ssl->in_hslen > 42 + n )
Paul Bakker5121ce52009-01-03 21:22:43 +0000596 {
597 ext_len = ( ( buf[42 + n] << 8 )
Paul Bakker48916f92012-09-16 19:57:18 +0000598 | ( buf[43 + n] ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000599
Paul Bakker48916f92012-09-16 19:57:18 +0000600 if( ( ext_len > 0 && ext_len < 4 ) ||
601 ssl->in_hslen != 44 + n + ext_len )
602 {
603 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
604 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
605 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000606 }
607
608 i = ( buf[39 + n] << 8 ) | buf[40 + n];
Paul Bakker2770fbd2012-07-03 13:30:23 +0000609 comp = buf[41 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +0000610
Paul Bakker380da532012-04-18 16:10:25 +0000611 /*
612 * Initialize update checksum functions
613 */
Paul Bakker68884e32013-01-07 18:20:04 +0100614 ssl->transform_negotiate->ciphersuite_info = ssl_ciphersuite_from_id( i );
Paul Bakker41c83d32013-03-20 14:39:14 +0100615 ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );
Paul Bakker68884e32013-01-07 18:20:04 +0100616
617 if( ssl->transform_negotiate->ciphersuite_info == NULL )
618 {
619 SSL_DEBUG_MSG( 1, ( "ciphersuite info for %02x not found",
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200620 ssl->ciphersuite_list[ssl->minor_ver][i] ) );
Paul Bakker68884e32013-01-07 18:20:04 +0100621 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
622 }
Paul Bakker380da532012-04-18 16:10:25 +0000623
Paul Bakker5121ce52009-01-03 21:22:43 +0000624 SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
625 SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
626
627 /*
628 * Check if the session can be resumed
629 */
Paul Bakker0a597072012-09-25 21:55:46 +0000630 if( ssl->renegotiation != SSL_INITIAL_HANDSHAKE ||
631 ssl->handshake->resume == 0 || n == 0 ||
Paul Bakker48916f92012-09-16 19:57:18 +0000632 ssl->session_negotiate->ciphersuite != i ||
633 ssl->session_negotiate->compression != comp ||
634 ssl->session_negotiate->length != n ||
635 memcmp( ssl->session_negotiate->id, buf + 39, n ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000636 {
637 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +0000638 ssl->handshake->resume = 0;
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200639#if defined(POLARSSL_HAVE_TIME)
Paul Bakker48916f92012-09-16 19:57:18 +0000640 ssl->session_negotiate->start = time( NULL );
Paul Bakkerfa9b1002013-07-03 15:31:03 +0200641#endif
Paul Bakker48916f92012-09-16 19:57:18 +0000642 ssl->session_negotiate->ciphersuite = i;
643 ssl->session_negotiate->compression = comp;
644 ssl->session_negotiate->length = n;
645 memcpy( ssl->session_negotiate->id, buf + 39, n );
Paul Bakker5121ce52009-01-03 21:22:43 +0000646 }
647 else
648 {
649 ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakkerff60ee62010-03-16 21:09:09 +0000650
651 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
652 {
653 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
654 return( ret );
655 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000656 }
657
658 SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
Paul Bakker0a597072012-09-25 21:55:46 +0000659 ssl->handshake->resume ? "a" : "no" ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000660
Paul Bakkere3166ce2011-01-27 17:40:50 +0000661 SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", i ) );
Paul Bakker5121ce52009-01-03 21:22:43 +0000662 SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[41 + n] ) );
663
664 i = 0;
665 while( 1 )
666 {
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200667 if( ssl->ciphersuite_list[ssl->minor_ver][i] == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000668 {
669 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000670 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000671 }
672
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200673 if( ssl->ciphersuite_list[ssl->minor_ver][i++] ==
674 ssl->session_negotiate->ciphersuite )
675 {
Paul Bakker5121ce52009-01-03 21:22:43 +0000676 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +0200677 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000678 }
679
Paul Bakker2770fbd2012-07-03 13:30:23 +0000680 if( comp != SSL_COMPRESS_NULL
681#if defined(POLARSSL_ZLIB_SUPPORT)
682 && comp != SSL_COMPRESS_DEFLATE
683#endif
684 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000685 {
686 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000687 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
Paul Bakker5121ce52009-01-03 21:22:43 +0000688 }
Paul Bakker48916f92012-09-16 19:57:18 +0000689 ssl->session_negotiate->compression = comp;
Paul Bakker5121ce52009-01-03 21:22:43 +0000690
Paul Bakker48916f92012-09-16 19:57:18 +0000691 ext = buf + 44 + n;
692
693 while( ext_len )
694 {
695 unsigned int ext_id = ( ( ext[0] << 8 )
696 | ( ext[1] ) );
697 unsigned int ext_size = ( ( ext[2] << 8 )
698 | ( ext[3] ) );
699
700 if( ext_size + 4 > ext_len )
701 {
702 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
703 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
704 }
705
706 switch( ext_id )
707 {
708 case TLS_EXT_RENEGOTIATION_INFO:
709 SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
710 renegotiation_info_seen = 1;
711
712 if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ) ) != 0 )
713 return( ret );
714
715 break;
716
717 default:
718 SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
719 ext_id ) );
720 }
721
722 ext_len -= 4 + ext_size;
723 ext += 4 + ext_size;
724
725 if( ext_len > 0 && ext_len < 4 )
726 {
727 SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
728 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
729 }
730 }
731
732 /*
733 * Renegotiation security checks
734 */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000735 if( ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
736 ssl->allow_legacy_renegotiation == SSL_LEGACY_BREAK_HANDSHAKE )
Paul Bakker48916f92012-09-16 19:57:18 +0000737 {
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000738 SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
739 handshake_failure = 1;
Paul Bakkerf7abd422013-04-16 13:15:56 +0200740 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000741 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
742 ssl->secure_renegotiation == SSL_SECURE_RENEGOTIATION &&
743 renegotiation_info_seen == 0 )
744 {
745 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
746 handshake_failure = 1;
Paul Bakker48916f92012-09-16 19:57:18 +0000747 }
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000748 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
749 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
750 ssl->allow_legacy_renegotiation == SSL_LEGACY_NO_RENEGOTIATION )
Paul Bakker48916f92012-09-16 19:57:18 +0000751 {
752 SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
Paul Bakkerd0f6fa72012-09-17 09:18:12 +0000753 handshake_failure = 1;
754 }
755 else if( ssl->renegotiation == SSL_RENEGOTIATION &&
756 ssl->secure_renegotiation == SSL_LEGACY_RENEGOTIATION &&
757 renegotiation_info_seen == 1 )
758 {
759 SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
760 handshake_failure = 1;
761 }
762
763 if( handshake_failure == 1 )
764 {
765 if( ( ret = ssl_send_fatal_handshake_failure( ssl ) ) != 0 )
766 return( ret );
767
Paul Bakker48916f92012-09-16 19:57:18 +0000768 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
769 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000770
771 SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
772
773 return( 0 );
774}
775
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200776#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +0200777static int ssl_parse_server_dh_params( ssl_context *ssl, unsigned char **p,
778 unsigned char *end )
779{
780 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
781
Paul Bakker29e1f122013-04-16 13:07:56 +0200782 /*
783 * Ephemeral DH parameters:
784 *
785 * struct {
786 * opaque dh_p<1..2^16-1>;
787 * opaque dh_g<1..2^16-1>;
788 * opaque dh_Ys<1..2^16-1>;
789 * } ServerDHParams;
790 */
791 if( ( ret = dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
792 {
793 SSL_DEBUG_RET( 2, ( "dhm_read_params" ), ret );
794 return( ret );
795 }
796
797 if( ssl->handshake->dhm_ctx.len < 64 ||
798 ssl->handshake->dhm_ctx.len > 512 )
799 {
800 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (DHM length)" ) );
801 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
802 }
803
804 SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P );
805 SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G );
806 SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
Paul Bakker29e1f122013-04-16 13:07:56 +0200807
808 return( ret );
809}
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200810#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +0200811
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200812#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +0200813static int ssl_parse_server_ecdh_params( ssl_context *ssl,
814 unsigned char **p,
815 unsigned char *end )
816{
817 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
818
Paul Bakker29e1f122013-04-16 13:07:56 +0200819 /*
820 * Ephemeral ECDH parameters:
821 *
822 * struct {
823 * ECParameters curve_params;
824 * ECPoint public;
825 * } ServerECDHParams;
826 */
Paul Bakker29e1f122013-04-16 13:07:56 +0200827 if( ( ret = ecdh_read_params( &ssl->handshake->ecdh_ctx,
828 (const unsigned char **) p, end ) ) != 0 )
829 {
830 SSL_DEBUG_RET( 2, ( "ecdh_read_params" ), ret );
831 return( ret );
832 }
833
834 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
835 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
836 {
837 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDH length)" ) );
838 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
839 }
840
841 SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
Paul Bakker29e1f122013-04-16 13:07:56 +0200842
843 return( ret );
844}
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200845#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +0200846
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200847#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
848 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200849static int ssl_parse_server_psk_hint( ssl_context *ssl,
850 unsigned char **p,
851 unsigned char *end )
852{
853 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200854 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200855 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200856
857 /*
858 * PSK parameters:
859 *
860 * opaque psk_identity_hint<0..2^16-1>;
861 */
862 len = (*p)[1] << 8 | (*p)[0];
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200863 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200864
865 if( (*p) + len > end )
866 {
867 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
868 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
869 }
870
871 // TODO: Retrieve PSK identity hint and callback to app
872 //
873 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200874 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200875
876 return( ret );
877}
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200878#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
879 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200880
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200881#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
882 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +0200883static int ssl_parse_signature_algorithm( ssl_context *ssl,
884 unsigned char **p,
885 unsigned char *end,
886 md_type_t *md_alg )
887{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200888 ((void) ssl);
Paul Bakker29e1f122013-04-16 13:07:56 +0200889 *md_alg = POLARSSL_MD_NONE;
890
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200891 if( (*p) + 2 > end )
Paul Bakker29e1f122013-04-16 13:07:56 +0200892 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
893
894 if( (*p)[1] != SSL_SIG_RSA )
895 {
896 SSL_DEBUG_MSG( 2, ( "server used unsupported SignatureAlgorithm %d", (*p)[1] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +0200897 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
898 }
899
900 switch( (*p)[0] )
901 {
902#if defined(POLARSSL_MD5_C)
903 case SSL_HASH_MD5:
904 *md_alg = POLARSSL_MD_MD5;
905 break;
906#endif
907#if defined(POLARSSL_SHA1_C)
908 case SSL_HASH_SHA1:
909 *md_alg = POLARSSL_MD_SHA1;
910 break;
911#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200912#if defined(POLARSSL_SHA256_C)
Paul Bakker29e1f122013-04-16 13:07:56 +0200913 case SSL_HASH_SHA224:
914 *md_alg = POLARSSL_MD_SHA224;
915 break;
916 case SSL_HASH_SHA256:
917 *md_alg = POLARSSL_MD_SHA256;
918 break;
919#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200920#if defined(POLARSSL_SHA512_C)
Paul Bakker29e1f122013-04-16 13:07:56 +0200921 case SSL_HASH_SHA384:
922 *md_alg = POLARSSL_MD_SHA384;
923 break;
924 case SSL_HASH_SHA512:
925 *md_alg = POLARSSL_MD_SHA512;
926 break;
927#endif
928 default:
929 SSL_DEBUG_MSG( 2, ( "Server used unsupported HashAlgorithm %d", *(p)[0] ) );
930 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
931 }
932
933 SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
934 SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
935 *p += 2;
936
937 return( 0 );
938}
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200939#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
940 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +0200941
Paul Bakker41c83d32013-03-20 14:39:14 +0100942static int ssl_parse_server_key_exchange( ssl_context *ssl )
943{
Paul Bakker23986e52011-04-24 08:57:21 +0000944 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200945 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000946 unsigned char *p, *end;
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200947#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
948 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +0200949 size_t n;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000950 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +0200951 md_type_t md_alg = POLARSSL_MD_NONE;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000952 unsigned int hashlen = 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200953#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000954
955 SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
956
Paul Bakker41c83d32013-03-20 14:39:14 +0100957 if( ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_RSA &&
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200958 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_ECDHE_RSA &&
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200959 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_PSK &&
960 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +0000961 {
962 SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
963 ssl->state++;
964 return( 0 );
965 }
966
Paul Bakker5121ce52009-01-03 21:22:43 +0000967 if( ( ret = ssl_read_record( ssl ) ) != 0 )
968 {
969 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
970 return( ret );
971 }
972
973 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
974 {
975 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000976 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000977 }
978
979 if( ssl->in_msg[0] != SSL_HS_SERVER_KEY_EXCHANGE )
980 {
Paul Bakker188c8de2013-04-19 09:13:37 +0200981 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
982 {
983 ssl->record_read = 1;
984 goto exit;
985 }
986
987 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
988 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000989 }
990
Paul Bakker1ef83d62012-04-11 12:09:53 +0000991 SSL_DEBUG_BUF( 3, "server key exchange", ssl->in_msg + 4, ssl->in_hslen - 4 );
992
Paul Bakker3b6a07b2013-03-21 11:56:50 +0100993 p = ssl->in_msg + 4;
994 end = ssl->in_msg + ssl->in_hslen;
995
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200996#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +0100997 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +0000998 {
Paul Bakker29e1f122013-04-16 13:07:56 +0200999 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001000 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001001 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1002 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1003 }
1004 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001005 else
1006#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1007#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
1008 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001009 {
1010 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
1011 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001012 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1013 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1014 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001015 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001016 else
1017#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
1018#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1019 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakker41c83d32013-03-20 14:39:14 +01001020 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001021 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001022 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001023 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1024 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1025 }
1026 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001027 else
1028#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
1029#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1030 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1031 {
1032 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
1033 {
1034 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1035 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1036 }
1037 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
1038 {
1039 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1040 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1041 }
1042 }
1043 else
1044#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1045 {
1046 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1047 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001048
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001049#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1050 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001051 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1052 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001053 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001054 /*
1055 * Handle the digitally-signed structure
1056 */
1057 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001058 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001059 if( ssl_parse_signature_algorithm( ssl, &p, end, &md_alg ) != 0 )
1060 {
Paul Bakker1ef83d62012-04-11 12:09:53 +00001061 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001062 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1063 }
1064 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001065
Paul Bakker29e1f122013-04-16 13:07:56 +02001066 n = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00001067 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001068
Paul Bakker29e1f122013-04-16 13:07:56 +02001069 if( end != p + n )
Paul Bakker41c83d32013-03-20 14:39:14 +01001070 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001071 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001072 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1073 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001074
Paul Bakker29e1f122013-04-16 13:07:56 +02001075 if( (unsigned int)( end - p ) !=
1076 ssl->session_negotiate->peer_cert->rsa.len )
Paul Bakker41c83d32013-03-20 14:39:14 +01001077 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001078 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001079 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1080 }
1081
Paul Bakker29e1f122013-04-16 13:07:56 +02001082 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001083 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001084 md5_context md5;
1085 sha1_context sha1;
1086
1087 /*
1088 * digitally-signed struct {
1089 * opaque md5_hash[16];
1090 * opaque sha_hash[20];
1091 * };
1092 *
1093 * md5_hash
1094 * MD5(ClientHello.random + ServerHello.random
1095 * + ServerParams);
1096 * sha_hash
1097 * SHA(ClientHello.random + ServerHello.random
1098 * + ServerParams);
1099 */
1100 n = ssl->in_hslen - ( end - p ) - 6;
1101
1102 md5_starts( &md5 );
1103 md5_update( &md5, ssl->handshake->randbytes, 64 );
1104 md5_update( &md5, ssl->in_msg + 4, n );
1105 md5_finish( &md5, hash );
1106
1107 sha1_starts( &sha1 );
1108 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
1109 sha1_update( &sha1, ssl->in_msg + 4, n );
1110 sha1_finish( &sha1, hash + 16 );
1111
1112 md_alg = POLARSSL_MD_NONE;
1113 hashlen = 36;
1114 }
1115 else
1116 {
1117 md_context_t ctx;
1118
1119 n = ssl->in_hslen - ( end - p ) - 8;
1120
1121 /*
1122 * digitally-signed struct {
1123 * opaque client_random[32];
1124 * opaque server_random[32];
1125 * ServerDHParams params;
1126 * };
1127 */
1128 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1129 {
1130 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1131 return( ret );
1132 }
1133
1134 md_starts( &ctx );
1135 md_update( &ctx, ssl->handshake->randbytes, 64 );
1136 md_update( &ctx, ssl->in_msg + 4, n );
1137 md_finish( &ctx, hash );
1138 }
1139
1140 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
1141
1142 if( ( ret = rsa_pkcs1_verify( &ssl->session_negotiate->peer_cert->rsa,
1143 RSA_PUBLIC,
1144 md_alg, hashlen, hash, p ) ) != 0 )
1145 {
1146 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001147 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001148 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001149 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001150#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1151 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001152
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001153exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001154 ssl->state++;
1155
1156 SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
1157
1158 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001159}
1160
1161static int ssl_parse_certificate_request( ssl_context *ssl )
1162{
1163 int ret;
Paul Bakker926af752012-11-23 13:38:07 +01001164 unsigned char *buf, *p;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001165 size_t n = 0, m = 0;
Paul Bakker926af752012-11-23 13:38:07 +01001166 size_t cert_type_len = 0, sig_alg_len = 0, dn_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001167
1168 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
1169
1170 /*
1171 * 0 . 0 handshake type
1172 * 1 . 3 handshake length
Paul Bakker926af752012-11-23 13:38:07 +01001173 * 4 . 4 cert type count
1174 * 5 .. m-1 cert types
1175 * m .. m+1 sig alg length (TLS 1.2 only)
1176 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001177 * n .. n+1 length of all DNs
1178 * n+2 .. n+3 length of DN 1
1179 * n+4 .. ... Distinguished Name #1
1180 * ... .. ... length of DN 2, etc.
1181 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001182 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001183 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001184 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1185 {
1186 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1187 return( ret );
1188 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001189
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001190 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1191 {
1192 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1193 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1194 }
1195
1196 ssl->record_read = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001197 }
1198
1199 ssl->client_auth = 0;
1200 ssl->state++;
1201
1202 if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST )
1203 ssl->client_auth++;
1204
1205 SSL_DEBUG_MSG( 3, ( "got %s certificate request",
1206 ssl->client_auth ? "a" : "no" ) );
1207
Paul Bakker926af752012-11-23 13:38:07 +01001208 if( ssl->client_auth == 0 )
1209 goto exit;
1210
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001211 ssl->record_read = 0;
1212
Paul Bakker926af752012-11-23 13:38:07 +01001213 // TODO: handshake_failure alert for an anonymous server to request
1214 // client authentication
1215
1216 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001217
Paul Bakker926af752012-11-23 13:38:07 +01001218 // Retrieve cert types
1219 //
1220 cert_type_len = buf[4];
1221 n = cert_type_len;
1222
1223 if( ssl->in_hslen < 6 + n )
1224 {
1225 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1226 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1227 }
1228
Paul Bakker73d44312013-05-22 13:56:26 +02001229 p = buf + 5;
Paul Bakker926af752012-11-23 13:38:07 +01001230 while( cert_type_len > 0 )
1231 {
1232 if( *p == SSL_CERT_TYPE_RSA_SIGN )
1233 {
1234 ssl->handshake->cert_type = SSL_CERT_TYPE_RSA_SIGN;
1235 break;
1236 }
1237
1238 cert_type_len--;
1239 p++;
1240 }
1241
1242 if( ssl->handshake->cert_type == 0 )
1243 {
1244 SSL_DEBUG_MSG( 1, ( "no known cert_type provided" ) );
1245 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1246 }
1247
1248 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
1249 {
1250 sig_alg_len = ( ( buf[5 + n] << 8 )
1251 | ( buf[6 + n] ) );
1252
1253 p = buf + 7 + n;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001254 m += 2;
Paul Bakker926af752012-11-23 13:38:07 +01001255 n += sig_alg_len;
1256
1257 if( ssl->in_hslen < 6 + n )
1258 {
1259 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1260 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1261 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001262 }
Paul Bakker926af752012-11-23 13:38:07 +01001263
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001264 dn_len = ( ( buf[5 + m + n] << 8 )
1265 | ( buf[6 + m + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01001266
1267 n += dn_len;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001268 if( ssl->in_hslen != 7 + m + n )
Paul Bakker926af752012-11-23 13:38:07 +01001269 {
1270 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1271 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1272 }
1273
1274exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001275 SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
1276
1277 return( 0 );
1278}
1279
1280static int ssl_parse_server_hello_done( ssl_context *ssl )
1281{
1282 int ret;
1283
1284 SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
1285
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001286 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001287 {
1288 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1289 {
1290 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1291 return( ret );
1292 }
1293
1294 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1295 {
1296 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001297 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001298 }
1299 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001300 ssl->record_read = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001301
1302 if( ssl->in_hslen != 4 ||
1303 ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE )
1304 {
1305 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001306 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001307 }
1308
1309 ssl->state++;
1310
1311 SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
1312
1313 return( 0 );
1314}
1315
1316static int ssl_write_client_key_exchange( ssl_context *ssl )
1317{
Paul Bakker23986e52011-04-24 08:57:21 +00001318 int ret;
1319 size_t i, n;
Paul Bakker41c83d32013-03-20 14:39:14 +01001320 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001321
1322 SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
1323
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001324#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001325 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001326 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001327 /*
1328 * DHM key exchange -- send G^X mod P
1329 */
Paul Bakker48916f92012-09-16 19:57:18 +00001330 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001331
1332 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1333 ssl->out_msg[5] = (unsigned char)( n );
1334 i = 6;
1335
Paul Bakker29b64762012-09-25 09:36:44 +00001336 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1337 mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker5121ce52009-01-03 21:22:43 +00001338 &ssl->out_msg[i], n,
1339 ssl->f_rng, ssl->p_rng );
1340 if( ret != 0 )
1341 {
1342 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1343 return( ret );
1344 }
1345
Paul Bakker48916f92012-09-16 19:57:18 +00001346 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1347 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00001348
Paul Bakker48916f92012-09-16 19:57:18 +00001349 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001350
Paul Bakker48916f92012-09-16 19:57:18 +00001351 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1352 ssl->handshake->premaster,
1353 &ssl->handshake->pmslen ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001354 {
1355 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1356 return( ret );
1357 }
1358
Paul Bakker48916f92012-09-16 19:57:18 +00001359 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00001360 }
1361 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001362#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1363#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001364 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
1365 {
1366 /*
1367 * ECDH key exchange -- send client public value
1368 */
1369 i = 4;
1370
1371 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx,
1372 &n,
1373 &ssl->out_msg[i], 1000,
1374 ssl->f_rng, ssl->p_rng );
1375 if( ret != 0 )
1376 {
1377 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
1378 return( ret );
1379 }
1380
1381 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
1382
1383 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
1384 &ssl->handshake->pmslen,
1385 ssl->handshake->premaster,
1386 POLARSSL_MPI_MAX_SIZE ) ) != 0 )
1387 {
1388 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
1389 return( ret );
1390 }
1391
1392 SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
1393 }
1394 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001395#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001396#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1397 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1398 {
1399 unsigned char *p = ssl->handshake->premaster;
1400
1401 /*
1402 * PSK key exchange
1403 *
1404 * opaque psk_identity<0..2^16-1>;
1405 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001406 if( ssl->psk == NULL )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001407 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1408
1409 if( sizeof(ssl->handshake->premaster) < 4 + 2 * ssl->psk_len )
1410 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1411
1412 n = ssl->psk_identity_len;
1413
1414 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1415 ssl->out_msg[5] = (unsigned char)( n );
1416 i = 6;
1417
1418 memcpy( ssl->out_msg + i, ssl->psk_identity, ssl->psk_identity_len );
1419
1420 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1421 *(p++) = (unsigned char)( ssl->psk_len );
1422 p += ssl->psk_len;
1423
1424 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1425 *(p++) = (unsigned char)( ssl->psk_len );
1426 memcpy( p, ssl->psk, ssl->psk_len );
1427 p += ssl->psk_len;
1428
1429 ssl->handshake->pmslen = 4 + 2 * ssl->psk_len;
1430 }
1431 else
1432#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001433#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1434 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1435 {
1436 unsigned char *p = ssl->handshake->premaster;
1437
1438 /*
1439 * DHE_PSK key exchange
1440 *
1441 * opaque psk_identity<0..2^16-1>;
1442 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
1443 */
1444 if( ssl->psk == NULL )
1445 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1446
1447 if( sizeof(ssl->handshake->premaster) < 4 + ssl->psk_identity_len +
1448 ssl->handshake->dhm_ctx.len )
1449 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1450
1451 i = 4;
1452 n = ssl->psk_identity_len;
1453 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1454 ssl->out_msg[5] = (unsigned char)( n );
1455
1456 memcpy( ssl->out_msg + 6, ssl->psk_identity, ssl->psk_identity_len );
1457
1458 n = ssl->handshake->dhm_ctx.len;
1459 ssl->out_msg[6 + ssl->psk_identity_len] = (unsigned char)( n >> 8 );
1460 ssl->out_msg[7 + ssl->psk_identity_len] = (unsigned char)( n );
1461
1462 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1463 mpi_size( &ssl->handshake->dhm_ctx.P ),
1464 &ssl->out_msg[8 + ssl->psk_identity_len], n,
1465 ssl->f_rng, ssl->p_rng );
1466 if( ret != 0 )
1467 {
1468 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1469 return( ret );
1470 }
1471
1472 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1473 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
1474
1475 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len >> 8 );
1476 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len );
1477 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1478 p, &n ) ) != 0 )
1479 {
1480 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1481 return( ret );
1482 }
1483
1484 if( n != ssl->handshake->dhm_ctx.len )
1485 {
1486 SSL_DEBUG_MSG( 1, ( "dhm_calc_secret result smaller than DHM" ) );
1487 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1488 }
1489
1490 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
1491
1492 p += ssl->handshake->dhm_ctx.len;
1493
1494 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1495 *(p++) = (unsigned char)( ssl->psk_len );
1496 memcpy( p, ssl->psk, ssl->psk_len );
1497 p += ssl->psk_len;
1498
1499 ssl->handshake->pmslen = 4 + ssl->handshake->dhm_ctx.len + ssl->psk_len;
1500 n = ssl->handshake->pmslen;
1501 }
1502 else
1503#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1504#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001505 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001506 {
1507 /*
1508 * RSA key exchange -- send rsa_public(pkcs1 v1.5(premaster))
1509 */
Paul Bakker48916f92012-09-16 19:57:18 +00001510 ssl->handshake->premaster[0] = (unsigned char) ssl->max_major_ver;
1511 ssl->handshake->premaster[1] = (unsigned char) ssl->max_minor_ver;
1512 ssl->handshake->pmslen = 48;
Paul Bakker5121ce52009-01-03 21:22:43 +00001513
Paul Bakker48916f92012-09-16 19:57:18 +00001514 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster + 2,
1515 ssl->handshake->pmslen - 2 );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001516 if( ret != 0 )
1517 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001518
1519 i = 4;
Paul Bakker48916f92012-09-16 19:57:18 +00001520 n = ssl->session_negotiate->peer_cert->rsa.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001521
1522 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
1523 {
1524 i += 2;
1525 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1526 ssl->out_msg[5] = (unsigned char)( n );
1527 }
1528
Paul Bakker48916f92012-09-16 19:57:18 +00001529 ret = rsa_pkcs1_encrypt( &ssl->session_negotiate->peer_cert->rsa,
Paul Bakker21eb2802010-08-16 11:10:02 +00001530 ssl->f_rng, ssl->p_rng,
1531 RSA_PUBLIC,
Paul Bakker48916f92012-09-16 19:57:18 +00001532 ssl->handshake->pmslen,
1533 ssl->handshake->premaster,
Paul Bakker5121ce52009-01-03 21:22:43 +00001534 ssl->out_msg + i );
1535 if( ret != 0 )
1536 {
1537 SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret );
1538 return( ret );
1539 }
1540 }
Paul Bakkered27a042013-04-18 22:46:23 +02001541 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001542#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02001543 {
1544 ((void) ciphersuite_info);
1545 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1546 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001547
Paul Bakkerff60ee62010-03-16 21:09:09 +00001548 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1549 {
1550 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1551 return( ret );
1552 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001553
1554 ssl->out_msglen = i + n;
1555 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1556 ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE;
1557
1558 ssl->state++;
1559
1560 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1561 {
1562 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1563 return( ret );
1564 }
1565
1566 SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
1567
1568 return( 0 );
1569}
1570
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001571#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1572 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1573 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001574static int ssl_write_certificate_verify( ssl_context *ssl )
1575{
Paul Bakkered27a042013-04-18 22:46:23 +02001576 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1577 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001578
1579 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1580
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001581 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1582 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02001583 {
1584 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1585 ssl->state++;
1586 return( 0 );
1587 }
1588
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001589 return( ret );
1590}
1591#else
1592static int ssl_write_certificate_verify( ssl_context *ssl )
1593{
1594 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1595 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1596 size_t n = 0, offset = 0;
1597 unsigned char hash[48];
1598 md_type_t md_alg = POLARSSL_MD_NONE;
1599 unsigned int hashlen = 0;
1600
1601 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1602
1603 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1604 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1605 {
1606 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1607 ssl->state++;
1608 return( 0 );
1609 }
1610
Paul Bakkered27a042013-04-18 22:46:23 +02001611 if( ssl->client_auth == 0 || ssl->own_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001612 {
1613 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1614 ssl->state++;
1615 return( 0 );
1616 }
1617
1618 if( ssl->rsa_key == NULL )
1619 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001620 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1621 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001622 }
1623
1624 /*
1625 * Make an RSA signature of the handshake digests
1626 */
Paul Bakker48916f92012-09-16 19:57:18 +00001627 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001628
Paul Bakker926af752012-11-23 13:38:07 +01001629 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001630 {
Paul Bakker926af752012-11-23 13:38:07 +01001631 /*
1632 * digitally-signed struct {
1633 * opaque md5_hash[16];
1634 * opaque sha_hash[20];
1635 * };
1636 *
1637 * md5_hash
1638 * MD5(handshake_messages);
1639 *
1640 * sha_hash
1641 * SHA(handshake_messages);
1642 */
1643 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001644 md_alg = POLARSSL_MD_NONE;
Paul Bakker926af752012-11-23 13:38:07 +01001645 }
1646 else
1647 {
1648 /*
1649 * digitally-signed struct {
1650 * opaque handshake_messages[handshake_messages_length];
1651 * };
1652 *
1653 * Taking shortcut here. We assume that the server always allows the
1654 * PRF Hash function and has sent it in the allowed signature
1655 * algorithms list received in the Certificate Request message.
1656 *
1657 * Until we encounter a server that does not, we will take this
1658 * shortcut.
1659 *
1660 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
1661 * in order to satisfy 'weird' needs from the server side.
1662 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001663 if( ssl->transform_negotiate->ciphersuite_info->mac ==
1664 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001665 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001666 md_alg = POLARSSL_MD_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001667 ssl->out_msg[4] = SSL_HASH_SHA384;
1668 ssl->out_msg[5] = SSL_SIG_RSA;
1669 }
1670 else
1671 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001672 md_alg = POLARSSL_MD_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001673 ssl->out_msg[4] = SSL_HASH_SHA256;
1674 ssl->out_msg[5] = SSL_SIG_RSA;
1675 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001676
1677 offset = 2;
1678 }
1679
Paul Bakker926af752012-11-23 13:38:07 +01001680 if ( ssl->rsa_key )
1681 n = ssl->rsa_key_len ( ssl->rsa_key );
1682
Paul Bakker1ef83d62012-04-11 12:09:53 +00001683 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
1684 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001685
Paul Bakker43b7e352011-01-18 15:27:19 +00001686 if( ssl->rsa_key )
Paul Bakker5121ce52009-01-03 21:22:43 +00001687 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001688 ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001689 RSA_PRIVATE, md_alg,
Paul Bakkereb2c6582012-09-27 19:15:01 +00001690 hashlen, hash, ssl->out_msg + 6 + offset );
Paul Bakker43b7e352011-01-18 15:27:19 +00001691 }
1692
1693 if (ret != 0)
1694 {
1695 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001696 return( ret );
1697 }
1698
Paul Bakker1ef83d62012-04-11 12:09:53 +00001699 ssl->out_msglen = 6 + n + offset;
Paul Bakker5121ce52009-01-03 21:22:43 +00001700 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1701 ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY;
1702
1703 ssl->state++;
1704
1705 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1706 {
1707 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1708 return( ret );
1709 }
1710
1711 SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
1712
Paul Bakkered27a042013-04-18 22:46:23 +02001713 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001714}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001715#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1716 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1717 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001718
1719/*
Paul Bakker1961b702013-01-25 14:49:24 +01001720 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00001721 */
Paul Bakker1961b702013-01-25 14:49:24 +01001722int ssl_handshake_client_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001723{
1724 int ret = 0;
1725
Paul Bakker1961b702013-01-25 14:49:24 +01001726 if( ssl->state == SSL_HANDSHAKE_OVER )
1727 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00001728
Paul Bakker1961b702013-01-25 14:49:24 +01001729 SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
1730
1731 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1732 return( ret );
1733
1734 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00001735 {
Paul Bakker1961b702013-01-25 14:49:24 +01001736 case SSL_HELLO_REQUEST:
1737 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00001738 break;
1739
Paul Bakker1961b702013-01-25 14:49:24 +01001740 /*
1741 * ==> ClientHello
1742 */
1743 case SSL_CLIENT_HELLO:
1744 ret = ssl_write_client_hello( ssl );
1745 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001746
Paul Bakker1961b702013-01-25 14:49:24 +01001747 /*
1748 * <== ServerHello
1749 * Certificate
1750 * ( ServerKeyExchange )
1751 * ( CertificateRequest )
1752 * ServerHelloDone
1753 */
1754 case SSL_SERVER_HELLO:
1755 ret = ssl_parse_server_hello( ssl );
1756 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001757
Paul Bakker1961b702013-01-25 14:49:24 +01001758 case SSL_SERVER_CERTIFICATE:
1759 ret = ssl_parse_certificate( ssl );
1760 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001761
Paul Bakker1961b702013-01-25 14:49:24 +01001762 case SSL_SERVER_KEY_EXCHANGE:
1763 ret = ssl_parse_server_key_exchange( ssl );
1764 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001765
Paul Bakker1961b702013-01-25 14:49:24 +01001766 case SSL_CERTIFICATE_REQUEST:
1767 ret = ssl_parse_certificate_request( ssl );
1768 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001769
Paul Bakker1961b702013-01-25 14:49:24 +01001770 case SSL_SERVER_HELLO_DONE:
1771 ret = ssl_parse_server_hello_done( ssl );
1772 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001773
Paul Bakker1961b702013-01-25 14:49:24 +01001774 /*
1775 * ==> ( Certificate/Alert )
1776 * ClientKeyExchange
1777 * ( CertificateVerify )
1778 * ChangeCipherSpec
1779 * Finished
1780 */
1781 case SSL_CLIENT_CERTIFICATE:
1782 ret = ssl_write_certificate( ssl );
1783 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001784
Paul Bakker1961b702013-01-25 14:49:24 +01001785 case SSL_CLIENT_KEY_EXCHANGE:
1786 ret = ssl_write_client_key_exchange( ssl );
1787 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001788
Paul Bakker1961b702013-01-25 14:49:24 +01001789 case SSL_CERTIFICATE_VERIFY:
1790 ret = ssl_write_certificate_verify( ssl );
1791 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001792
Paul Bakker1961b702013-01-25 14:49:24 +01001793 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
1794 ret = ssl_write_change_cipher_spec( ssl );
1795 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001796
Paul Bakker1961b702013-01-25 14:49:24 +01001797 case SSL_CLIENT_FINISHED:
1798 ret = ssl_write_finished( ssl );
1799 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001800
Paul Bakker1961b702013-01-25 14:49:24 +01001801 /*
1802 * <== ChangeCipherSpec
1803 * Finished
1804 */
1805 case SSL_SERVER_CHANGE_CIPHER_SPEC:
1806 ret = ssl_parse_change_cipher_spec( ssl );
1807 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001808
Paul Bakker1961b702013-01-25 14:49:24 +01001809 case SSL_SERVER_FINISHED:
1810 ret = ssl_parse_finished( ssl );
1811 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001812
Paul Bakker1961b702013-01-25 14:49:24 +01001813 case SSL_FLUSH_BUFFERS:
1814 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
1815 ssl->state = SSL_HANDSHAKE_WRAPUP;
1816 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001817
Paul Bakker1961b702013-01-25 14:49:24 +01001818 case SSL_HANDSHAKE_WRAPUP:
1819 ssl_handshake_wrapup( ssl );
1820 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001821
Paul Bakker1961b702013-01-25 14:49:24 +01001822 default:
1823 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
1824 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1825 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001826
1827 return( ret );
1828}
Paul Bakker5121ce52009-01-03 21:22:43 +00001829#endif