blob: 6496b84b7b8611d5a1cb98f71ab038c0b9b68d3c [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 */
827 ecdh_init( &ssl->handshake->ecdh_ctx );
828
829 if( ( ret = ecdh_read_params( &ssl->handshake->ecdh_ctx,
830 (const unsigned char **) p, end ) ) != 0 )
831 {
832 SSL_DEBUG_RET( 2, ( "ecdh_read_params" ), ret );
833 return( ret );
834 }
835
836 if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
837 ssl->handshake->ecdh_ctx.grp.nbits > 521 )
838 {
839 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDH length)" ) );
840 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
841 }
842
843 SSL_DEBUG_ECP( 3, "ECDH: Qp", &ssl->handshake->ecdh_ctx.Qp );
Paul Bakker29e1f122013-04-16 13:07:56 +0200844
845 return( ret );
846}
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200847#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +0200848
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200849#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED) || \
850 defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200851static int ssl_parse_server_psk_hint( ssl_context *ssl,
852 unsigned char **p,
853 unsigned char *end )
854{
855 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200856 size_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200857 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200858
859 /*
860 * PSK parameters:
861 *
862 * opaque psk_identity_hint<0..2^16-1>;
863 */
864 len = (*p)[1] << 8 | (*p)[0];
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200865 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200866
867 if( (*p) + len > end )
868 {
869 SSL_DEBUG_MSG( 1, ( "bad server key exchange message (psk_identity_hint length)" ) );
870 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
871 }
872
873 // TODO: Retrieve PSK identity hint and callback to app
874 //
875 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200876 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200877
878 return( ret );
879}
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200880#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED ||
881 POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200882
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200883#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
884 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +0200885static int ssl_parse_signature_algorithm( ssl_context *ssl,
886 unsigned char **p,
887 unsigned char *end,
888 md_type_t *md_alg )
889{
Paul Bakkerc5a79cc2013-06-26 15:08:35 +0200890 ((void) ssl);
Paul Bakker29e1f122013-04-16 13:07:56 +0200891 *md_alg = POLARSSL_MD_NONE;
892
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200893 if( (*p) + 2 > end )
Paul Bakker29e1f122013-04-16 13:07:56 +0200894 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
895
896 if( (*p)[1] != SSL_SIG_RSA )
897 {
898 SSL_DEBUG_MSG( 2, ( "server used unsupported SignatureAlgorithm %d", (*p)[1] ) );
Paul Bakker29e1f122013-04-16 13:07:56 +0200899 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
900 }
901
902 switch( (*p)[0] )
903 {
904#if defined(POLARSSL_MD5_C)
905 case SSL_HASH_MD5:
906 *md_alg = POLARSSL_MD_MD5;
907 break;
908#endif
909#if defined(POLARSSL_SHA1_C)
910 case SSL_HASH_SHA1:
911 *md_alg = POLARSSL_MD_SHA1;
912 break;
913#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200914#if defined(POLARSSL_SHA256_C)
Paul Bakker29e1f122013-04-16 13:07:56 +0200915 case SSL_HASH_SHA224:
916 *md_alg = POLARSSL_MD_SHA224;
917 break;
918 case SSL_HASH_SHA256:
919 *md_alg = POLARSSL_MD_SHA256;
920 break;
921#endif
Paul Bakker9e36f042013-06-30 14:34:05 +0200922#if defined(POLARSSL_SHA512_C)
Paul Bakker29e1f122013-04-16 13:07:56 +0200923 case SSL_HASH_SHA384:
924 *md_alg = POLARSSL_MD_SHA384;
925 break;
926 case SSL_HASH_SHA512:
927 *md_alg = POLARSSL_MD_SHA512;
928 break;
929#endif
930 default:
931 SSL_DEBUG_MSG( 2, ( "Server used unsupported HashAlgorithm %d", *(p)[0] ) );
932 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
933 }
934
935 SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
936 SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
937 *p += 2;
938
939 return( 0 );
940}
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200941#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
942 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +0200943
Paul Bakker41c83d32013-03-20 14:39:14 +0100944static int ssl_parse_server_key_exchange( ssl_context *ssl )
945{
Paul Bakker23986e52011-04-24 08:57:21 +0000946 int ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200947 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +0000948 unsigned char *p, *end;
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200949#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
950 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +0200951 size_t n;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000952 unsigned char hash[64];
Paul Bakkerc70b9822013-04-07 22:00:46 +0200953 md_type_t md_alg = POLARSSL_MD_NONE;
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000954 unsigned int hashlen = 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200955#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000956
957 SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
958
Paul Bakker41c83d32013-03-20 14:39:14 +0100959 if( ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_RSA &&
Paul Bakkerd4a56ec2013-04-16 18:05:29 +0200960 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_ECDHE_RSA &&
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200961 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_PSK &&
962 ciphersuite_info->key_exchange != POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakker5121ce52009-01-03 21:22:43 +0000963 {
964 SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
965 ssl->state++;
966 return( 0 );
967 }
968
Paul Bakker5121ce52009-01-03 21:22:43 +0000969 if( ( ret = ssl_read_record( ssl ) ) != 0 )
970 {
971 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
972 return( ret );
973 }
974
975 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
976 {
977 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +0000978 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000979 }
980
981 if( ssl->in_msg[0] != SSL_HS_SERVER_KEY_EXCHANGE )
982 {
Paul Bakker188c8de2013-04-19 09:13:37 +0200983 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
984 {
985 ssl->record_read = 1;
986 goto exit;
987 }
988
989 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
990 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +0000991 }
992
Paul Bakker1ef83d62012-04-11 12:09:53 +0000993 SSL_DEBUG_BUF( 3, "server key exchange", ssl->in_msg + 4, ssl->in_hslen - 4 );
994
Paul Bakker3b6a07b2013-03-21 11:56:50 +0100995 p = ssl->in_msg + 4;
996 end = ssl->in_msg + ssl->in_hslen;
997
Paul Bakker48f7a5d2013-04-19 14:30:58 +0200998#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +0100999 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001000 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001001 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001002 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001003 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1004 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1005 }
1006 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001007 else
1008#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1009#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
1010 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001011 {
1012 if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
1013 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001014 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1015 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1016 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001017 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001018 else
1019#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
1020#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1021 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
Paul Bakker41c83d32013-03-20 14:39:14 +01001022 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001023 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
Paul Bakker41c83d32013-03-20 14:39:14 +01001024 {
Paul Bakker41c83d32013-03-20 14:39:14 +01001025 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1026 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1027 }
1028 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001029 else
1030#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
1031#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1032 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1033 {
1034 if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
1035 {
1036 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
1037 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1038 }
1039 if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
1040 {
1041 SSL_DEBUG_MSG( 1, ( "failed to parsebad server key exchange message" ) );
1042 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1043 }
1044 }
1045 else
1046#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1047 {
1048 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1049 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001050
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001051#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1052 defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker29e1f122013-04-16 13:07:56 +02001053 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA ||
1054 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001055 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001056 /*
1057 * Handle the digitally-signed structure
1058 */
1059 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001060 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001061 if( ssl_parse_signature_algorithm( ssl, &p, end, &md_alg ) != 0 )
1062 {
Paul Bakker1ef83d62012-04-11 12:09:53 +00001063 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker29e1f122013-04-16 13:07:56 +02001064 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1065 }
1066 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001067
Paul Bakker29e1f122013-04-16 13:07:56 +02001068 n = ( p[0] << 8 ) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00001069 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00001070
Paul Bakker29e1f122013-04-16 13:07:56 +02001071 if( end != p + n )
Paul Bakker41c83d32013-03-20 14:39:14 +01001072 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001073 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001074 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1075 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001076
Paul Bakker29e1f122013-04-16 13:07:56 +02001077 if( (unsigned int)( end - p ) !=
1078 ssl->session_negotiate->peer_cert->rsa.len )
Paul Bakker41c83d32013-03-20 14:39:14 +01001079 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001080 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001081 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1082 }
1083
Paul Bakker29e1f122013-04-16 13:07:56 +02001084 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001085 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001086 md5_context md5;
1087 sha1_context sha1;
1088
1089 /*
1090 * digitally-signed struct {
1091 * opaque md5_hash[16];
1092 * opaque sha_hash[20];
1093 * };
1094 *
1095 * md5_hash
1096 * MD5(ClientHello.random + ServerHello.random
1097 * + ServerParams);
1098 * sha_hash
1099 * SHA(ClientHello.random + ServerHello.random
1100 * + ServerParams);
1101 */
1102 n = ssl->in_hslen - ( end - p ) - 6;
1103
1104 md5_starts( &md5 );
1105 md5_update( &md5, ssl->handshake->randbytes, 64 );
1106 md5_update( &md5, ssl->in_msg + 4, n );
1107 md5_finish( &md5, hash );
1108
1109 sha1_starts( &sha1 );
1110 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
1111 sha1_update( &sha1, ssl->in_msg + 4, n );
1112 sha1_finish( &sha1, hash + 16 );
1113
1114 md_alg = POLARSSL_MD_NONE;
1115 hashlen = 36;
1116 }
1117 else
1118 {
1119 md_context_t ctx;
1120
1121 n = ssl->in_hslen - ( end - p ) - 8;
1122
1123 /*
1124 * digitally-signed struct {
1125 * opaque client_random[32];
1126 * opaque server_random[32];
1127 * ServerDHParams params;
1128 * };
1129 */
1130 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1131 {
1132 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1133 return( ret );
1134 }
1135
1136 md_starts( &ctx );
1137 md_update( &ctx, ssl->handshake->randbytes, 64 );
1138 md_update( &ctx, ssl->in_msg + 4, n );
1139 md_finish( &ctx, hash );
1140 }
1141
1142 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
1143
1144 if( ( ret = rsa_pkcs1_verify( &ssl->session_negotiate->peer_cert->rsa,
1145 RSA_PUBLIC,
1146 md_alg, hashlen, hash, p ) ) != 0 )
1147 {
1148 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001149 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001150 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001151 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001152#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1153 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001154
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001155exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001156 ssl->state++;
1157
1158 SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
1159
1160 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001161}
1162
1163static int ssl_parse_certificate_request( ssl_context *ssl )
1164{
1165 int ret;
Paul Bakker926af752012-11-23 13:38:07 +01001166 unsigned char *buf, *p;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001167 size_t n = 0, m = 0;
Paul Bakker926af752012-11-23 13:38:07 +01001168 size_t cert_type_len = 0, sig_alg_len = 0, dn_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001169
1170 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
1171
1172 /*
1173 * 0 . 0 handshake type
1174 * 1 . 3 handshake length
Paul Bakker926af752012-11-23 13:38:07 +01001175 * 4 . 4 cert type count
1176 * 5 .. m-1 cert types
1177 * m .. m+1 sig alg length (TLS 1.2 only)
1178 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001179 * n .. n+1 length of all DNs
1180 * n+2 .. n+3 length of DN 1
1181 * n+4 .. ... Distinguished Name #1
1182 * ... .. ... length of DN 2, etc.
1183 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001184 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001185 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001186 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1187 {
1188 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1189 return( ret );
1190 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001191
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001192 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1193 {
1194 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1195 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1196 }
1197
1198 ssl->record_read = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001199 }
1200
1201 ssl->client_auth = 0;
1202 ssl->state++;
1203
1204 if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST )
1205 ssl->client_auth++;
1206
1207 SSL_DEBUG_MSG( 3, ( "got %s certificate request",
1208 ssl->client_auth ? "a" : "no" ) );
1209
Paul Bakker926af752012-11-23 13:38:07 +01001210 if( ssl->client_auth == 0 )
1211 goto exit;
1212
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001213 ssl->record_read = 0;
1214
Paul Bakker926af752012-11-23 13:38:07 +01001215 // TODO: handshake_failure alert for an anonymous server to request
1216 // client authentication
1217
1218 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001219
Paul Bakker926af752012-11-23 13:38:07 +01001220 // Retrieve cert types
1221 //
1222 cert_type_len = buf[4];
1223 n = cert_type_len;
1224
1225 if( ssl->in_hslen < 6 + n )
1226 {
1227 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1228 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1229 }
1230
Paul Bakker73d44312013-05-22 13:56:26 +02001231 p = buf + 5;
Paul Bakker926af752012-11-23 13:38:07 +01001232 while( cert_type_len > 0 )
1233 {
1234 if( *p == SSL_CERT_TYPE_RSA_SIGN )
1235 {
1236 ssl->handshake->cert_type = SSL_CERT_TYPE_RSA_SIGN;
1237 break;
1238 }
1239
1240 cert_type_len--;
1241 p++;
1242 }
1243
1244 if( ssl->handshake->cert_type == 0 )
1245 {
1246 SSL_DEBUG_MSG( 1, ( "no known cert_type provided" ) );
1247 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1248 }
1249
1250 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
1251 {
1252 sig_alg_len = ( ( buf[5 + n] << 8 )
1253 | ( buf[6 + n] ) );
1254
1255 p = buf + 7 + n;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001256 m += 2;
Paul Bakker926af752012-11-23 13:38:07 +01001257 n += sig_alg_len;
1258
1259 if( ssl->in_hslen < 6 + n )
1260 {
1261 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1262 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1263 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001264 }
Paul Bakker926af752012-11-23 13:38:07 +01001265
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001266 dn_len = ( ( buf[5 + m + n] << 8 )
1267 | ( buf[6 + m + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01001268
1269 n += dn_len;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001270 if( ssl->in_hslen != 7 + m + n )
Paul Bakker926af752012-11-23 13:38:07 +01001271 {
1272 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1273 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1274 }
1275
1276exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001277 SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
1278
1279 return( 0 );
1280}
1281
1282static int ssl_parse_server_hello_done( ssl_context *ssl )
1283{
1284 int ret;
1285
1286 SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
1287
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001288 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001289 {
1290 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1291 {
1292 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1293 return( ret );
1294 }
1295
1296 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1297 {
1298 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001299 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001300 }
1301 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001302 ssl->record_read = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001303
1304 if( ssl->in_hslen != 4 ||
1305 ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE )
1306 {
1307 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001308 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001309 }
1310
1311 ssl->state++;
1312
1313 SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
1314
1315 return( 0 );
1316}
1317
1318static int ssl_write_client_key_exchange( ssl_context *ssl )
1319{
Paul Bakker23986e52011-04-24 08:57:21 +00001320 int ret;
1321 size_t i, n;
Paul Bakker41c83d32013-03-20 14:39:14 +01001322 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001323
1324 SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
1325
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001326#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001327 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001328 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001329 /*
1330 * DHM key exchange -- send G^X mod P
1331 */
Paul Bakker48916f92012-09-16 19:57:18 +00001332 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001333
1334 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1335 ssl->out_msg[5] = (unsigned char)( n );
1336 i = 6;
1337
Paul Bakker29b64762012-09-25 09:36:44 +00001338 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1339 mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker5121ce52009-01-03 21:22:43 +00001340 &ssl->out_msg[i], n,
1341 ssl->f_rng, ssl->p_rng );
1342 if( ret != 0 )
1343 {
1344 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1345 return( ret );
1346 }
1347
Paul Bakker48916f92012-09-16 19:57:18 +00001348 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1349 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00001350
Paul Bakker48916f92012-09-16 19:57:18 +00001351 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001352
Paul Bakker48916f92012-09-16 19:57:18 +00001353 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1354 ssl->handshake->premaster,
1355 &ssl->handshake->pmslen ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001356 {
1357 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1358 return( ret );
1359 }
1360
Paul Bakker48916f92012-09-16 19:57:18 +00001361 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00001362 }
1363 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001364#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1365#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001366 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
1367 {
1368 /*
1369 * ECDH key exchange -- send client public value
1370 */
1371 i = 4;
1372
1373 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx,
1374 &n,
1375 &ssl->out_msg[i], 1000,
1376 ssl->f_rng, ssl->p_rng );
1377 if( ret != 0 )
1378 {
1379 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
1380 return( ret );
1381 }
1382
1383 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
1384
1385 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
1386 &ssl->handshake->pmslen,
1387 ssl->handshake->premaster,
1388 POLARSSL_MPI_MAX_SIZE ) ) != 0 )
1389 {
1390 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
1391 return( ret );
1392 }
1393
1394 SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
1395 }
1396 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001397#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001398#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1399 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1400 {
1401 unsigned char *p = ssl->handshake->premaster;
1402
1403 /*
1404 * PSK key exchange
1405 *
1406 * opaque psk_identity<0..2^16-1>;
1407 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001408 if( ssl->psk == NULL )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001409 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1410
1411 if( sizeof(ssl->handshake->premaster) < 4 + 2 * ssl->psk_len )
1412 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1413
1414 n = ssl->psk_identity_len;
1415
1416 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1417 ssl->out_msg[5] = (unsigned char)( n );
1418 i = 6;
1419
1420 memcpy( ssl->out_msg + i, ssl->psk_identity, ssl->psk_identity_len );
1421
1422 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1423 *(p++) = (unsigned char)( ssl->psk_len );
1424 p += ssl->psk_len;
1425
1426 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1427 *(p++) = (unsigned char)( ssl->psk_len );
1428 memcpy( p, ssl->psk, ssl->psk_len );
1429 p += ssl->psk_len;
1430
1431 ssl->handshake->pmslen = 4 + 2 * ssl->psk_len;
1432 }
1433 else
1434#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001435#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1436 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1437 {
1438 unsigned char *p = ssl->handshake->premaster;
1439
1440 /*
1441 * DHE_PSK key exchange
1442 *
1443 * opaque psk_identity<0..2^16-1>;
1444 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
1445 */
1446 if( ssl->psk == NULL )
1447 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1448
1449 if( sizeof(ssl->handshake->premaster) < 4 + ssl->psk_identity_len +
1450 ssl->handshake->dhm_ctx.len )
1451 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1452
1453 i = 4;
1454 n = ssl->psk_identity_len;
1455 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1456 ssl->out_msg[5] = (unsigned char)( n );
1457
1458 memcpy( ssl->out_msg + 6, ssl->psk_identity, ssl->psk_identity_len );
1459
1460 n = ssl->handshake->dhm_ctx.len;
1461 ssl->out_msg[6 + ssl->psk_identity_len] = (unsigned char)( n >> 8 );
1462 ssl->out_msg[7 + ssl->psk_identity_len] = (unsigned char)( n );
1463
1464 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1465 mpi_size( &ssl->handshake->dhm_ctx.P ),
1466 &ssl->out_msg[8 + ssl->psk_identity_len], n,
1467 ssl->f_rng, ssl->p_rng );
1468 if( ret != 0 )
1469 {
1470 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1471 return( ret );
1472 }
1473
1474 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1475 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
1476
1477 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len >> 8 );
1478 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len );
1479 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1480 p, &n ) ) != 0 )
1481 {
1482 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1483 return( ret );
1484 }
1485
1486 if( n != ssl->handshake->dhm_ctx.len )
1487 {
1488 SSL_DEBUG_MSG( 1, ( "dhm_calc_secret result smaller than DHM" ) );
1489 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1490 }
1491
1492 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
1493
1494 p += ssl->handshake->dhm_ctx.len;
1495
1496 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1497 *(p++) = (unsigned char)( ssl->psk_len );
1498 memcpy( p, ssl->psk, ssl->psk_len );
1499 p += ssl->psk_len;
1500
1501 ssl->handshake->pmslen = 4 + ssl->handshake->dhm_ctx.len + ssl->psk_len;
1502 n = ssl->handshake->pmslen;
1503 }
1504 else
1505#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1506#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001507 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001508 {
1509 /*
1510 * RSA key exchange -- send rsa_public(pkcs1 v1.5(premaster))
1511 */
Paul Bakker48916f92012-09-16 19:57:18 +00001512 ssl->handshake->premaster[0] = (unsigned char) ssl->max_major_ver;
1513 ssl->handshake->premaster[1] = (unsigned char) ssl->max_minor_ver;
1514 ssl->handshake->pmslen = 48;
Paul Bakker5121ce52009-01-03 21:22:43 +00001515
Paul Bakker48916f92012-09-16 19:57:18 +00001516 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster + 2,
1517 ssl->handshake->pmslen - 2 );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001518 if( ret != 0 )
1519 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001520
1521 i = 4;
Paul Bakker48916f92012-09-16 19:57:18 +00001522 n = ssl->session_negotiate->peer_cert->rsa.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001523
1524 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
1525 {
1526 i += 2;
1527 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1528 ssl->out_msg[5] = (unsigned char)( n );
1529 }
1530
Paul Bakker48916f92012-09-16 19:57:18 +00001531 ret = rsa_pkcs1_encrypt( &ssl->session_negotiate->peer_cert->rsa,
Paul Bakker21eb2802010-08-16 11:10:02 +00001532 ssl->f_rng, ssl->p_rng,
1533 RSA_PUBLIC,
Paul Bakker48916f92012-09-16 19:57:18 +00001534 ssl->handshake->pmslen,
1535 ssl->handshake->premaster,
Paul Bakker5121ce52009-01-03 21:22:43 +00001536 ssl->out_msg + i );
1537 if( ret != 0 )
1538 {
1539 SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret );
1540 return( ret );
1541 }
1542 }
Paul Bakkered27a042013-04-18 22:46:23 +02001543 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001544#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02001545 {
1546 ((void) ciphersuite_info);
1547 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1548 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001549
Paul Bakkerff60ee62010-03-16 21:09:09 +00001550 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1551 {
1552 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1553 return( ret );
1554 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001555
1556 ssl->out_msglen = i + n;
1557 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1558 ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE;
1559
1560 ssl->state++;
1561
1562 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1563 {
1564 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1565 return( ret );
1566 }
1567
1568 SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
1569
1570 return( 0 );
1571}
1572
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001573#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1574 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1575 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001576static int ssl_write_certificate_verify( ssl_context *ssl )
1577{
Paul Bakkered27a042013-04-18 22:46:23 +02001578 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1579 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001580
1581 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1582
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001583 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1584 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02001585 {
1586 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1587 ssl->state++;
1588 return( 0 );
1589 }
1590
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001591 return( ret );
1592}
1593#else
1594static int ssl_write_certificate_verify( ssl_context *ssl )
1595{
1596 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1597 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1598 size_t n = 0, offset = 0;
1599 unsigned char hash[48];
1600 md_type_t md_alg = POLARSSL_MD_NONE;
1601 unsigned int hashlen = 0;
1602
1603 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1604
1605 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1606 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1607 {
1608 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1609 ssl->state++;
1610 return( 0 );
1611 }
1612
Paul Bakkered27a042013-04-18 22:46:23 +02001613 if( ssl->client_auth == 0 || ssl->own_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001614 {
1615 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1616 ssl->state++;
1617 return( 0 );
1618 }
1619
1620 if( ssl->rsa_key == NULL )
1621 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001622 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1623 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001624 }
1625
1626 /*
1627 * Make an RSA signature of the handshake digests
1628 */
Paul Bakker48916f92012-09-16 19:57:18 +00001629 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001630
Paul Bakker926af752012-11-23 13:38:07 +01001631 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001632 {
Paul Bakker926af752012-11-23 13:38:07 +01001633 /*
1634 * digitally-signed struct {
1635 * opaque md5_hash[16];
1636 * opaque sha_hash[20];
1637 * };
1638 *
1639 * md5_hash
1640 * MD5(handshake_messages);
1641 *
1642 * sha_hash
1643 * SHA(handshake_messages);
1644 */
1645 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001646 md_alg = POLARSSL_MD_NONE;
Paul Bakker926af752012-11-23 13:38:07 +01001647 }
1648 else
1649 {
1650 /*
1651 * digitally-signed struct {
1652 * opaque handshake_messages[handshake_messages_length];
1653 * };
1654 *
1655 * Taking shortcut here. We assume that the server always allows the
1656 * PRF Hash function and has sent it in the allowed signature
1657 * algorithms list received in the Certificate Request message.
1658 *
1659 * Until we encounter a server that does not, we will take this
1660 * shortcut.
1661 *
1662 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
1663 * in order to satisfy 'weird' needs from the server side.
1664 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001665 if( ssl->transform_negotiate->ciphersuite_info->mac ==
1666 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001667 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001668 md_alg = POLARSSL_MD_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001669 ssl->out_msg[4] = SSL_HASH_SHA384;
1670 ssl->out_msg[5] = SSL_SIG_RSA;
1671 }
1672 else
1673 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001674 md_alg = POLARSSL_MD_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001675 ssl->out_msg[4] = SSL_HASH_SHA256;
1676 ssl->out_msg[5] = SSL_SIG_RSA;
1677 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001678
1679 offset = 2;
1680 }
1681
Paul Bakker926af752012-11-23 13:38:07 +01001682 if ( ssl->rsa_key )
1683 n = ssl->rsa_key_len ( ssl->rsa_key );
1684
Paul Bakker1ef83d62012-04-11 12:09:53 +00001685 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
1686 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001687
Paul Bakker43b7e352011-01-18 15:27:19 +00001688 if( ssl->rsa_key )
Paul Bakker5121ce52009-01-03 21:22:43 +00001689 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001690 ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001691 RSA_PRIVATE, md_alg,
Paul Bakkereb2c6582012-09-27 19:15:01 +00001692 hashlen, hash, ssl->out_msg + 6 + offset );
Paul Bakker43b7e352011-01-18 15:27:19 +00001693 }
1694
1695 if (ret != 0)
1696 {
1697 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001698 return( ret );
1699 }
1700
Paul Bakker1ef83d62012-04-11 12:09:53 +00001701 ssl->out_msglen = 6 + n + offset;
Paul Bakker5121ce52009-01-03 21:22:43 +00001702 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1703 ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY;
1704
1705 ssl->state++;
1706
1707 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1708 {
1709 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1710 return( ret );
1711 }
1712
1713 SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
1714
Paul Bakkered27a042013-04-18 22:46:23 +02001715 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001716}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001717#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1718 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1719 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001720
1721/*
Paul Bakker1961b702013-01-25 14:49:24 +01001722 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00001723 */
Paul Bakker1961b702013-01-25 14:49:24 +01001724int ssl_handshake_client_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001725{
1726 int ret = 0;
1727
Paul Bakker1961b702013-01-25 14:49:24 +01001728 if( ssl->state == SSL_HANDSHAKE_OVER )
1729 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00001730
Paul Bakker1961b702013-01-25 14:49:24 +01001731 SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
1732
1733 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1734 return( ret );
1735
1736 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00001737 {
Paul Bakker1961b702013-01-25 14:49:24 +01001738 case SSL_HELLO_REQUEST:
1739 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00001740 break;
1741
Paul Bakker1961b702013-01-25 14:49:24 +01001742 /*
1743 * ==> ClientHello
1744 */
1745 case SSL_CLIENT_HELLO:
1746 ret = ssl_write_client_hello( ssl );
1747 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001748
Paul Bakker1961b702013-01-25 14:49:24 +01001749 /*
1750 * <== ServerHello
1751 * Certificate
1752 * ( ServerKeyExchange )
1753 * ( CertificateRequest )
1754 * ServerHelloDone
1755 */
1756 case SSL_SERVER_HELLO:
1757 ret = ssl_parse_server_hello( ssl );
1758 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001759
Paul Bakker1961b702013-01-25 14:49:24 +01001760 case SSL_SERVER_CERTIFICATE:
1761 ret = ssl_parse_certificate( ssl );
1762 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001763
Paul Bakker1961b702013-01-25 14:49:24 +01001764 case SSL_SERVER_KEY_EXCHANGE:
1765 ret = ssl_parse_server_key_exchange( ssl );
1766 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001767
Paul Bakker1961b702013-01-25 14:49:24 +01001768 case SSL_CERTIFICATE_REQUEST:
1769 ret = ssl_parse_certificate_request( ssl );
1770 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001771
Paul Bakker1961b702013-01-25 14:49:24 +01001772 case SSL_SERVER_HELLO_DONE:
1773 ret = ssl_parse_server_hello_done( ssl );
1774 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001775
Paul Bakker1961b702013-01-25 14:49:24 +01001776 /*
1777 * ==> ( Certificate/Alert )
1778 * ClientKeyExchange
1779 * ( CertificateVerify )
1780 * ChangeCipherSpec
1781 * Finished
1782 */
1783 case SSL_CLIENT_CERTIFICATE:
1784 ret = ssl_write_certificate( ssl );
1785 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001786
Paul Bakker1961b702013-01-25 14:49:24 +01001787 case SSL_CLIENT_KEY_EXCHANGE:
1788 ret = ssl_write_client_key_exchange( ssl );
1789 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001790
Paul Bakker1961b702013-01-25 14:49:24 +01001791 case SSL_CERTIFICATE_VERIFY:
1792 ret = ssl_write_certificate_verify( ssl );
1793 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001794
Paul Bakker1961b702013-01-25 14:49:24 +01001795 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
1796 ret = ssl_write_change_cipher_spec( ssl );
1797 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001798
Paul Bakker1961b702013-01-25 14:49:24 +01001799 case SSL_CLIENT_FINISHED:
1800 ret = ssl_write_finished( ssl );
1801 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001802
Paul Bakker1961b702013-01-25 14:49:24 +01001803 /*
1804 * <== ChangeCipherSpec
1805 * Finished
1806 */
1807 case SSL_SERVER_CHANGE_CIPHER_SPEC:
1808 ret = ssl_parse_change_cipher_spec( ssl );
1809 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001810
Paul Bakker1961b702013-01-25 14:49:24 +01001811 case SSL_SERVER_FINISHED:
1812 ret = ssl_parse_finished( ssl );
1813 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001814
Paul Bakker1961b702013-01-25 14:49:24 +01001815 case SSL_FLUSH_BUFFERS:
1816 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
1817 ssl->state = SSL_HANDSHAKE_WRAPUP;
1818 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001819
Paul Bakker1961b702013-01-25 14:49:24 +01001820 case SSL_HANDSHAKE_WRAPUP:
1821 ssl_handshake_wrapup( ssl );
1822 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001823
Paul Bakker1961b702013-01-25 14:49:24 +01001824 default:
1825 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
1826 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1827 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001828
1829 return( ret );
1830}
Paul Bakker5121ce52009-01-03 21:22:43 +00001831#endif