blob: aeba799cb2010f5cb49c8516c622abe8256c210d [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
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001075 /* EC NOT IMPLEMENTED YET */
1076 if( ssl->session_negotiate->peer_cert->pk.type != POLARSSL_PK_RSA )
1077 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1078
Paul Bakker29e1f122013-04-16 13:07:56 +02001079 if( (unsigned int)( end - p ) !=
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001080 pk_rsa( ssl->session_negotiate->peer_cert->pk )->len )
Paul Bakker41c83d32013-03-20 14:39:14 +01001081 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001082 SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
Paul Bakker41c83d32013-03-20 14:39:14 +01001083 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
1084 }
1085
Paul Bakker29e1f122013-04-16 13:07:56 +02001086 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001087 {
Paul Bakker29e1f122013-04-16 13:07:56 +02001088 md5_context md5;
1089 sha1_context sha1;
1090
1091 /*
1092 * digitally-signed struct {
1093 * opaque md5_hash[16];
1094 * opaque sha_hash[20];
1095 * };
1096 *
1097 * md5_hash
1098 * MD5(ClientHello.random + ServerHello.random
1099 * + ServerParams);
1100 * sha_hash
1101 * SHA(ClientHello.random + ServerHello.random
1102 * + ServerParams);
1103 */
1104 n = ssl->in_hslen - ( end - p ) - 6;
1105
1106 md5_starts( &md5 );
1107 md5_update( &md5, ssl->handshake->randbytes, 64 );
1108 md5_update( &md5, ssl->in_msg + 4, n );
1109 md5_finish( &md5, hash );
1110
1111 sha1_starts( &sha1 );
1112 sha1_update( &sha1, ssl->handshake->randbytes, 64 );
1113 sha1_update( &sha1, ssl->in_msg + 4, n );
1114 sha1_finish( &sha1, hash + 16 );
1115
1116 md_alg = POLARSSL_MD_NONE;
1117 hashlen = 36;
1118 }
1119 else
1120 {
1121 md_context_t ctx;
1122
1123 n = ssl->in_hslen - ( end - p ) - 8;
1124
1125 /*
1126 * digitally-signed struct {
1127 * opaque client_random[32];
1128 * opaque server_random[32];
1129 * ServerDHParams params;
1130 * };
1131 */
1132 if( ( ret = md_init_ctx( &ctx, md_info_from_type( md_alg ) ) ) != 0 )
1133 {
1134 SSL_DEBUG_RET( 1, "md_init_ctx", ret );
1135 return( ret );
1136 }
1137
1138 md_starts( &ctx );
1139 md_update( &ctx, ssl->handshake->randbytes, 64 );
1140 md_update( &ctx, ssl->in_msg + 4, n );
1141 md_finish( &ctx, hash );
1142 }
1143
1144 SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
1145
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001146 if( ( ret = rsa_pkcs1_verify(
1147 pk_rsa( ssl->session_negotiate->peer_cert->pk ),
1148 RSA_PUBLIC, md_alg, hashlen, hash, p ) ) != 0 )
Paul Bakker29e1f122013-04-16 13:07:56 +02001149 {
1150 SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
Paul Bakkerc70b9822013-04-07 22:00:46 +02001151 return( ret );
Paul Bakkerc3f177a2012-04-11 16:11:49 +00001152 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001153 }
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001154#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1155 POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001156
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001157exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001158 ssl->state++;
1159
1160 SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
1161
1162 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +00001163}
1164
1165static int ssl_parse_certificate_request( ssl_context *ssl )
1166{
1167 int ret;
Paul Bakker926af752012-11-23 13:38:07 +01001168 unsigned char *buf, *p;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001169 size_t n = 0, m = 0;
Paul Bakker926af752012-11-23 13:38:07 +01001170 size_t cert_type_len = 0, sig_alg_len = 0, dn_len = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001171
1172 SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
1173
1174 /*
1175 * 0 . 0 handshake type
1176 * 1 . 3 handshake length
Paul Bakker926af752012-11-23 13:38:07 +01001177 * 4 . 4 cert type count
1178 * 5 .. m-1 cert types
1179 * m .. m+1 sig alg length (TLS 1.2 only)
1180 * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only)
Paul Bakker5121ce52009-01-03 21:22:43 +00001181 * n .. n+1 length of all DNs
1182 * n+2 .. n+3 length of DN 1
1183 * n+4 .. ... Distinguished Name #1
1184 * ... .. ... length of DN 2, etc.
1185 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001186 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001187 {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001188 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1189 {
1190 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1191 return( ret );
1192 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001193
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001194 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1195 {
1196 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1197 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
1198 }
1199
1200 ssl->record_read = 1;
Paul Bakker5121ce52009-01-03 21:22:43 +00001201 }
1202
1203 ssl->client_auth = 0;
1204 ssl->state++;
1205
1206 if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST )
1207 ssl->client_auth++;
1208
1209 SSL_DEBUG_MSG( 3, ( "got %s certificate request",
1210 ssl->client_auth ? "a" : "no" ) );
1211
Paul Bakker926af752012-11-23 13:38:07 +01001212 if( ssl->client_auth == 0 )
1213 goto exit;
1214
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001215 ssl->record_read = 0;
1216
Paul Bakker926af752012-11-23 13:38:07 +01001217 // TODO: handshake_failure alert for an anonymous server to request
1218 // client authentication
1219
1220 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02001221
Paul Bakker926af752012-11-23 13:38:07 +01001222 // Retrieve cert types
1223 //
1224 cert_type_len = buf[4];
1225 n = cert_type_len;
1226
1227 if( ssl->in_hslen < 6 + n )
1228 {
1229 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1230 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1231 }
1232
Paul Bakker73d44312013-05-22 13:56:26 +02001233 p = buf + 5;
Paul Bakker926af752012-11-23 13:38:07 +01001234 while( cert_type_len > 0 )
1235 {
1236 if( *p == SSL_CERT_TYPE_RSA_SIGN )
1237 {
1238 ssl->handshake->cert_type = SSL_CERT_TYPE_RSA_SIGN;
1239 break;
1240 }
1241
1242 cert_type_len--;
1243 p++;
1244 }
1245
1246 if( ssl->handshake->cert_type == 0 )
1247 {
1248 SSL_DEBUG_MSG( 1, ( "no known cert_type provided" ) );
1249 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1250 }
1251
1252 if( ssl->minor_ver == SSL_MINOR_VERSION_3 )
1253 {
1254 sig_alg_len = ( ( buf[5 + n] << 8 )
1255 | ( buf[6 + n] ) );
1256
1257 p = buf + 7 + n;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001258 m += 2;
Paul Bakker926af752012-11-23 13:38:07 +01001259 n += sig_alg_len;
1260
1261 if( ssl->in_hslen < 6 + n )
1262 {
1263 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1264 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1265 }
Paul Bakkerf7abd422013-04-16 13:15:56 +02001266 }
Paul Bakker926af752012-11-23 13:38:07 +01001267
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001268 dn_len = ( ( buf[5 + m + n] << 8 )
1269 | ( buf[6 + m + n] ) );
Paul Bakker926af752012-11-23 13:38:07 +01001270
1271 n += dn_len;
Paul Bakker9c94cdd2013-01-22 13:45:33 +01001272 if( ssl->in_hslen != 7 + m + n )
Paul Bakker926af752012-11-23 13:38:07 +01001273 {
1274 SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
1275 return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
1276 }
1277
1278exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00001279 SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
1280
1281 return( 0 );
1282}
1283
1284static int ssl_parse_server_hello_done( ssl_context *ssl )
1285{
1286 int ret;
1287
1288 SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
1289
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001290 if( ssl->record_read == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001291 {
1292 if( ( ret = ssl_read_record( ssl ) ) != 0 )
1293 {
1294 SSL_DEBUG_RET( 1, "ssl_read_record", ret );
1295 return( ret );
1296 }
1297
1298 if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
1299 {
1300 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001301 return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001302 }
1303 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001304 ssl->record_read = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001305
1306 if( ssl->in_hslen != 4 ||
1307 ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE )
1308 {
1309 SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
Paul Bakker40e46942009-01-03 21:51:57 +00001310 return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
Paul Bakker5121ce52009-01-03 21:22:43 +00001311 }
1312
1313 ssl->state++;
1314
1315 SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
1316
1317 return( 0 );
1318}
1319
1320static int ssl_write_client_key_exchange( ssl_context *ssl )
1321{
Paul Bakker23986e52011-04-24 08:57:21 +00001322 int ret;
1323 size_t i, n;
Paul Bakker41c83d32013-03-20 14:39:14 +01001324 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001325
1326 SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
1327
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001328#if defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001329 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001330 {
Paul Bakker5121ce52009-01-03 21:22:43 +00001331 /*
1332 * DHM key exchange -- send G^X mod P
1333 */
Paul Bakker48916f92012-09-16 19:57:18 +00001334 n = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001335
1336 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1337 ssl->out_msg[5] = (unsigned char)( n );
1338 i = 6;
1339
Paul Bakker29b64762012-09-25 09:36:44 +00001340 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1341 mpi_size( &ssl->handshake->dhm_ctx.P ),
Paul Bakker5121ce52009-01-03 21:22:43 +00001342 &ssl->out_msg[i], n,
1343 ssl->f_rng, ssl->p_rng );
1344 if( ret != 0 )
1345 {
1346 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1347 return( ret );
1348 }
1349
Paul Bakker48916f92012-09-16 19:57:18 +00001350 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1351 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
Paul Bakker5121ce52009-01-03 21:22:43 +00001352
Paul Bakker48916f92012-09-16 19:57:18 +00001353 ssl->handshake->pmslen = ssl->handshake->dhm_ctx.len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001354
Paul Bakker48916f92012-09-16 19:57:18 +00001355 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1356 ssl->handshake->premaster,
1357 &ssl->handshake->pmslen ) ) != 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +00001358 {
1359 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1360 return( ret );
1361 }
1362
Paul Bakker48916f92012-09-16 19:57:18 +00001363 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
Paul Bakker5121ce52009-01-03 21:22:43 +00001364 }
1365 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001366#endif /* POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED */
1367#if defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker41c83d32013-03-20 14:39:14 +01001368 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_ECDHE_RSA )
1369 {
1370 /*
1371 * ECDH key exchange -- send client public value
1372 */
1373 i = 4;
1374
1375 ret = ecdh_make_public( &ssl->handshake->ecdh_ctx,
1376 &n,
1377 &ssl->out_msg[i], 1000,
1378 ssl->f_rng, ssl->p_rng );
1379 if( ret != 0 )
1380 {
1381 SSL_DEBUG_RET( 1, "ecdh_make_public", ret );
1382 return( ret );
1383 }
1384
1385 SSL_DEBUG_ECP( 3, "ECDH: Q", &ssl->handshake->ecdh_ctx.Q );
1386
1387 if( ( ret = ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
1388 &ssl->handshake->pmslen,
1389 ssl->handshake->premaster,
1390 POLARSSL_MPI_MAX_SIZE ) ) != 0 )
1391 {
1392 SSL_DEBUG_RET( 1, "ecdh_calc_secret", ret );
1393 return( ret );
1394 }
1395
1396 SSL_DEBUG_MPI( 3, "ECDH: z", &ssl->handshake->ecdh_ctx.z );
1397 }
1398 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001399#endif /* POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001400#if defined(POLARSSL_KEY_EXCHANGE_PSK_ENABLED)
1401 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK )
1402 {
1403 unsigned char *p = ssl->handshake->premaster;
1404
1405 /*
1406 * PSK key exchange
1407 *
1408 * opaque psk_identity<0..2^16-1>;
1409 */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001410 if( ssl->psk == NULL )
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001411 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1412
1413 if( sizeof(ssl->handshake->premaster) < 4 + 2 * ssl->psk_len )
1414 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1415
1416 n = ssl->psk_identity_len;
1417
1418 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1419 ssl->out_msg[5] = (unsigned char)( n );
1420 i = 6;
1421
1422 memcpy( ssl->out_msg + i, ssl->psk_identity, ssl->psk_identity_len );
1423
1424 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1425 *(p++) = (unsigned char)( ssl->psk_len );
1426 p += ssl->psk_len;
1427
1428 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1429 *(p++) = (unsigned char)( ssl->psk_len );
1430 memcpy( p, ssl->psk, ssl->psk_len );
1431 p += ssl->psk_len;
1432
1433 ssl->handshake->pmslen = 4 + 2 * ssl->psk_len;
1434 }
1435 else
1436#endif /* POLARSSL_KEY_EXCHANGE_PSK_ENABLED */
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001437#if defined(POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED)
1438 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1439 {
1440 unsigned char *p = ssl->handshake->premaster;
1441
1442 /*
1443 * DHE_PSK key exchange
1444 *
1445 * opaque psk_identity<0..2^16-1>;
1446 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
1447 */
1448 if( ssl->psk == NULL )
1449 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
1450
1451 if( sizeof(ssl->handshake->premaster) < 4 + ssl->psk_identity_len +
1452 ssl->handshake->dhm_ctx.len )
1453 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1454
1455 i = 4;
1456 n = ssl->psk_identity_len;
1457 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1458 ssl->out_msg[5] = (unsigned char)( n );
1459
1460 memcpy( ssl->out_msg + 6, ssl->psk_identity, ssl->psk_identity_len );
1461
1462 n = ssl->handshake->dhm_ctx.len;
1463 ssl->out_msg[6 + ssl->psk_identity_len] = (unsigned char)( n >> 8 );
1464 ssl->out_msg[7 + ssl->psk_identity_len] = (unsigned char)( n );
1465
1466 ret = dhm_make_public( &ssl->handshake->dhm_ctx,
1467 mpi_size( &ssl->handshake->dhm_ctx.P ),
1468 &ssl->out_msg[8 + ssl->psk_identity_len], n,
1469 ssl->f_rng, ssl->p_rng );
1470 if( ret != 0 )
1471 {
1472 SSL_DEBUG_RET( 1, "dhm_make_public", ret );
1473 return( ret );
1474 }
1475
1476 SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X );
1477 SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
1478
1479 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len >> 8 );
1480 *(p++) = (unsigned char)( ssl->handshake->dhm_ctx.len );
1481 if( ( ret = dhm_calc_secret( &ssl->handshake->dhm_ctx,
1482 p, &n ) ) != 0 )
1483 {
1484 SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
1485 return( ret );
1486 }
1487
1488 if( n != ssl->handshake->dhm_ctx.len )
1489 {
1490 SSL_DEBUG_MSG( 1, ( "dhm_calc_secret result smaller than DHM" ) );
1491 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1492 }
1493
1494 SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K );
1495
1496 p += ssl->handshake->dhm_ctx.len;
1497
1498 *(p++) = (unsigned char)( ssl->psk_len >> 8 );
1499 *(p++) = (unsigned char)( ssl->psk_len );
1500 memcpy( p, ssl->psk, ssl->psk_len );
1501 p += ssl->psk_len;
1502
1503 ssl->handshake->pmslen = 4 + ssl->handshake->dhm_ctx.len + ssl->psk_len;
1504 n = ssl->handshake->pmslen;
1505 }
1506 else
1507#endif /* POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED */
1508#if defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED)
Paul Bakkered27a042013-04-18 22:46:23 +02001509 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_RSA )
Paul Bakker5121ce52009-01-03 21:22:43 +00001510 {
1511 /*
1512 * RSA key exchange -- send rsa_public(pkcs1 v1.5(premaster))
1513 */
Paul Bakker48916f92012-09-16 19:57:18 +00001514 ssl->handshake->premaster[0] = (unsigned char) ssl->max_major_ver;
1515 ssl->handshake->premaster[1] = (unsigned char) ssl->max_minor_ver;
1516 ssl->handshake->pmslen = 48;
Paul Bakker5121ce52009-01-03 21:22:43 +00001517
Paul Bakker48916f92012-09-16 19:57:18 +00001518 ret = ssl->f_rng( ssl->p_rng, ssl->handshake->premaster + 2,
1519 ssl->handshake->pmslen - 2 );
Paul Bakkera3d195c2011-11-27 21:07:34 +00001520 if( ret != 0 )
1521 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001522
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001523 /* EC NOT IMPLEMENTED YET */
1524 if( ssl->session_negotiate->peer_cert->pk.type != POLARSSL_PK_RSA )
1525 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1526
Paul Bakker5121ce52009-01-03 21:22:43 +00001527 i = 4;
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001528 n = pk_rsa( ssl->session_negotiate->peer_cert->pk )->len;
Paul Bakker5121ce52009-01-03 21:22:43 +00001529
1530 if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
1531 {
1532 i += 2;
1533 ssl->out_msg[4] = (unsigned char)( n >> 8 );
1534 ssl->out_msg[5] = (unsigned char)( n );
1535 }
1536
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02001537 ret = rsa_pkcs1_encrypt(
1538 pk_rsa( ssl->session_negotiate->peer_cert->pk ),
1539 ssl->f_rng, ssl->p_rng, RSA_PUBLIC,
1540 ssl->handshake->pmslen, ssl->handshake->premaster,
1541 ssl->out_msg + i );
Paul Bakker5121ce52009-01-03 21:22:43 +00001542 if( ret != 0 )
1543 {
1544 SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret );
1545 return( ret );
1546 }
1547 }
Paul Bakkered27a042013-04-18 22:46:23 +02001548 else
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001549#endif /* POLARSSL_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02001550 {
1551 ((void) ciphersuite_info);
1552 return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
1553 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001554
Paul Bakkerff60ee62010-03-16 21:09:09 +00001555 if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
1556 {
1557 SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
1558 return( ret );
1559 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001560
1561 ssl->out_msglen = i + n;
1562 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1563 ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE;
1564
1565 ssl->state++;
1566
1567 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1568 {
1569 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1570 return( ret );
1571 }
1572
1573 SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
1574
1575 return( 0 );
1576}
1577
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001578#if !defined(POLARSSL_KEY_EXCHANGE_RSA_ENABLED) && \
1579 !defined(POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED) && \
1580 !defined(POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED)
Paul Bakker5121ce52009-01-03 21:22:43 +00001581static int ssl_write_certificate_verify( ssl_context *ssl )
1582{
Paul Bakkered27a042013-04-18 22:46:23 +02001583 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1584 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001585
1586 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1587
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001588 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1589 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
Paul Bakkered27a042013-04-18 22:46:23 +02001590 {
1591 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1592 ssl->state++;
1593 return( 0 );
1594 }
1595
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001596 return( ret );
1597}
1598#else
1599static int ssl_write_certificate_verify( ssl_context *ssl )
1600{
1601 int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
1602 const ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;
1603 size_t n = 0, offset = 0;
1604 unsigned char hash[48];
1605 md_type_t md_alg = POLARSSL_MD_NONE;
1606 unsigned int hashlen = 0;
1607
1608 SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
1609
1610 if( ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_PSK ||
1611 ciphersuite_info->key_exchange == POLARSSL_KEY_EXCHANGE_DHE_PSK )
1612 {
1613 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1614 ssl->state++;
1615 return( 0 );
1616 }
1617
Paul Bakkered27a042013-04-18 22:46:23 +02001618 if( ssl->client_auth == 0 || ssl->own_cert == NULL )
Paul Bakker5121ce52009-01-03 21:22:43 +00001619 {
1620 SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
1621 ssl->state++;
1622 return( 0 );
1623 }
1624
1625 if( ssl->rsa_key == NULL )
1626 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001627 SSL_DEBUG_MSG( 1, ( "got no private key" ) );
1628 return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
Paul Bakker5121ce52009-01-03 21:22:43 +00001629 }
1630
1631 /*
1632 * Make an RSA signature of the handshake digests
1633 */
Paul Bakker48916f92012-09-16 19:57:18 +00001634 ssl->handshake->calc_verify( ssl, hash );
Paul Bakker5121ce52009-01-03 21:22:43 +00001635
Paul Bakker926af752012-11-23 13:38:07 +01001636 if( ssl->minor_ver != SSL_MINOR_VERSION_3 )
Paul Bakker1ef83d62012-04-11 12:09:53 +00001637 {
Paul Bakker926af752012-11-23 13:38:07 +01001638 /*
1639 * digitally-signed struct {
1640 * opaque md5_hash[16];
1641 * opaque sha_hash[20];
1642 * };
1643 *
1644 * md5_hash
1645 * MD5(handshake_messages);
1646 *
1647 * sha_hash
1648 * SHA(handshake_messages);
1649 */
1650 hashlen = 36;
Paul Bakkerc70b9822013-04-07 22:00:46 +02001651 md_alg = POLARSSL_MD_NONE;
Paul Bakker926af752012-11-23 13:38:07 +01001652 }
1653 else
1654 {
1655 /*
1656 * digitally-signed struct {
1657 * opaque handshake_messages[handshake_messages_length];
1658 * };
1659 *
1660 * Taking shortcut here. We assume that the server always allows the
1661 * PRF Hash function and has sent it in the allowed signature
1662 * algorithms list received in the Certificate Request message.
1663 *
1664 * Until we encounter a server that does not, we will take this
1665 * shortcut.
1666 *
1667 * Reason: Otherwise we should have running hashes for SHA512 and SHA224
1668 * in order to satisfy 'weird' needs from the server side.
1669 */
Paul Bakkerb7149bc2013-03-20 15:30:09 +01001670 if( ssl->transform_negotiate->ciphersuite_info->mac ==
1671 POLARSSL_MD_SHA384 )
Paul Bakkerca4ab492012-04-18 14:23:57 +00001672 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001673 md_alg = POLARSSL_MD_SHA384;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001674 ssl->out_msg[4] = SSL_HASH_SHA384;
1675 ssl->out_msg[5] = SSL_SIG_RSA;
1676 }
1677 else
1678 {
Paul Bakkerc70b9822013-04-07 22:00:46 +02001679 md_alg = POLARSSL_MD_SHA256;
Paul Bakkerca4ab492012-04-18 14:23:57 +00001680 ssl->out_msg[4] = SSL_HASH_SHA256;
1681 ssl->out_msg[5] = SSL_SIG_RSA;
1682 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00001683
1684 offset = 2;
1685 }
1686
Paul Bakker926af752012-11-23 13:38:07 +01001687 if ( ssl->rsa_key )
1688 n = ssl->rsa_key_len ( ssl->rsa_key );
1689
Paul Bakker1ef83d62012-04-11 12:09:53 +00001690 ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
1691 ssl->out_msg[5 + offset] = (unsigned char)( n );
Paul Bakker5121ce52009-01-03 21:22:43 +00001692
Paul Bakker43b7e352011-01-18 15:27:19 +00001693 if( ssl->rsa_key )
Paul Bakker5121ce52009-01-03 21:22:43 +00001694 {
Paul Bakkereb2c6582012-09-27 19:15:01 +00001695 ret = ssl->rsa_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
Paul Bakkerc70b9822013-04-07 22:00:46 +02001696 RSA_PRIVATE, md_alg,
Paul Bakkereb2c6582012-09-27 19:15:01 +00001697 hashlen, hash, ssl->out_msg + 6 + offset );
Paul Bakker43b7e352011-01-18 15:27:19 +00001698 }
1699
1700 if (ret != 0)
1701 {
1702 SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001703 return( ret );
1704 }
1705
Paul Bakker1ef83d62012-04-11 12:09:53 +00001706 ssl->out_msglen = 6 + n + offset;
Paul Bakker5121ce52009-01-03 21:22:43 +00001707 ssl->out_msgtype = SSL_MSG_HANDSHAKE;
1708 ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY;
1709
1710 ssl->state++;
1711
1712 if( ( ret = ssl_write_record( ssl ) ) != 0 )
1713 {
1714 SSL_DEBUG_RET( 1, "ssl_write_record", ret );
1715 return( ret );
1716 }
1717
1718 SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
1719
Paul Bakkered27a042013-04-18 22:46:23 +02001720 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +00001721}
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001722#endif /* !POLARSSL_KEY_EXCHANGE_RSA_ENABLED &&
1723 !POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED &&
1724 !POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00001725
1726/*
Paul Bakker1961b702013-01-25 14:49:24 +01001727 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00001728 */
Paul Bakker1961b702013-01-25 14:49:24 +01001729int ssl_handshake_client_step( ssl_context *ssl )
Paul Bakker5121ce52009-01-03 21:22:43 +00001730{
1731 int ret = 0;
1732
Paul Bakker1961b702013-01-25 14:49:24 +01001733 if( ssl->state == SSL_HANDSHAKE_OVER )
1734 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
Paul Bakker5121ce52009-01-03 21:22:43 +00001735
Paul Bakker1961b702013-01-25 14:49:24 +01001736 SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
1737
1738 if( ( ret = ssl_flush_output( ssl ) ) != 0 )
1739 return( ret );
1740
1741 switch( ssl->state )
Paul Bakker5121ce52009-01-03 21:22:43 +00001742 {
Paul Bakker1961b702013-01-25 14:49:24 +01001743 case SSL_HELLO_REQUEST:
1744 ssl->state = SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00001745 break;
1746
Paul Bakker1961b702013-01-25 14:49:24 +01001747 /*
1748 * ==> ClientHello
1749 */
1750 case SSL_CLIENT_HELLO:
1751 ret = ssl_write_client_hello( ssl );
1752 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001753
Paul Bakker1961b702013-01-25 14:49:24 +01001754 /*
1755 * <== ServerHello
1756 * Certificate
1757 * ( ServerKeyExchange )
1758 * ( CertificateRequest )
1759 * ServerHelloDone
1760 */
1761 case SSL_SERVER_HELLO:
1762 ret = ssl_parse_server_hello( ssl );
1763 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001764
Paul Bakker1961b702013-01-25 14:49:24 +01001765 case SSL_SERVER_CERTIFICATE:
1766 ret = ssl_parse_certificate( ssl );
1767 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001768
Paul Bakker1961b702013-01-25 14:49:24 +01001769 case SSL_SERVER_KEY_EXCHANGE:
1770 ret = ssl_parse_server_key_exchange( ssl );
1771 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001772
Paul Bakker1961b702013-01-25 14:49:24 +01001773 case SSL_CERTIFICATE_REQUEST:
1774 ret = ssl_parse_certificate_request( ssl );
1775 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001776
Paul Bakker1961b702013-01-25 14:49:24 +01001777 case SSL_SERVER_HELLO_DONE:
1778 ret = ssl_parse_server_hello_done( ssl );
1779 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001780
Paul Bakker1961b702013-01-25 14:49:24 +01001781 /*
1782 * ==> ( Certificate/Alert )
1783 * ClientKeyExchange
1784 * ( CertificateVerify )
1785 * ChangeCipherSpec
1786 * Finished
1787 */
1788 case SSL_CLIENT_CERTIFICATE:
1789 ret = ssl_write_certificate( ssl );
1790 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001791
Paul Bakker1961b702013-01-25 14:49:24 +01001792 case SSL_CLIENT_KEY_EXCHANGE:
1793 ret = ssl_write_client_key_exchange( ssl );
1794 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001795
Paul Bakker1961b702013-01-25 14:49:24 +01001796 case SSL_CERTIFICATE_VERIFY:
1797 ret = ssl_write_certificate_verify( ssl );
1798 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001799
Paul Bakker1961b702013-01-25 14:49:24 +01001800 case SSL_CLIENT_CHANGE_CIPHER_SPEC:
1801 ret = ssl_write_change_cipher_spec( ssl );
1802 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001803
Paul Bakker1961b702013-01-25 14:49:24 +01001804 case SSL_CLIENT_FINISHED:
1805 ret = ssl_write_finished( ssl );
1806 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001807
Paul Bakker1961b702013-01-25 14:49:24 +01001808 /*
1809 * <== ChangeCipherSpec
1810 * Finished
1811 */
1812 case SSL_SERVER_CHANGE_CIPHER_SPEC:
1813 ret = ssl_parse_change_cipher_spec( ssl );
1814 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001815
Paul Bakker1961b702013-01-25 14:49:24 +01001816 case SSL_SERVER_FINISHED:
1817 ret = ssl_parse_finished( ssl );
1818 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001819
Paul Bakker1961b702013-01-25 14:49:24 +01001820 case SSL_FLUSH_BUFFERS:
1821 SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
1822 ssl->state = SSL_HANDSHAKE_WRAPUP;
1823 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00001824
Paul Bakker1961b702013-01-25 14:49:24 +01001825 case SSL_HANDSHAKE_WRAPUP:
1826 ssl_handshake_wrapup( ssl );
1827 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001828
Paul Bakker1961b702013-01-25 14:49:24 +01001829 default:
1830 SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
1831 return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
1832 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001833
1834 return( ret );
1835}
Paul Bakker5121ce52009-01-03 21:22:43 +00001836#endif