Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / third_party / mbedtls / repo / library / ssl_cli.c
1 /*
2  *  SSLv3/TLSv1 client-side functions
3  *
4  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
5  *  SPDX-License-Identifier: Apache-2.0
6  *
7  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
8  *  not use this file except in compliance with the License.
9  *  You may obtain a copy of the License at
10  *
11  *  http://www.apache.org/licenses/LICENSE-2.0
12  *
13  *  Unless required by applicable law or agreed to in writing, software
14  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  *  See the License for the specific language governing permissions and
17  *  limitations under the License.
18  *
19  *  This file is part of mbed TLS (https://tls.mbed.org)
20  */
21
22 #if !defined(MBEDTLS_CONFIG_FILE)
23 #include "mbedtls/config.h"
24 #else
25 #include MBEDTLS_CONFIG_FILE
26 #endif
27
28 #if defined(MBEDTLS_SSL_CLI_C)
29
30 #if defined(MBEDTLS_PLATFORM_C)
31 #include "mbedtls/platform.h"
32 #else
33 #include <stdlib.h>
34 #define mbedtls_calloc    calloc
35 #define mbedtls_free      free
36 #endif
37
38 #include "mbedtls/debug.h"
39 #include "mbedtls/ssl.h"
40 #include "mbedtls/ssl_internal.h"
41
42 #if defined(MBEDTLS_USE_PSA_CRYPTO)
43 #include "mbedtls/psa_util.h"
44 #endif /* MBEDTLS_USE_PSA_CRYPTO */
45
46 #include <string.h>
47
48 #include <stdint.h>
49
50 #if defined(MBEDTLS_HAVE_TIME)
51 #include "mbedtls/platform_time.h"
52 #endif
53
54 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
55 #include "mbedtls/platform_util.h"
56 #endif
57
58 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
59 static int ssl_conf_has_static_psk( mbedtls_ssl_config const *conf )
60 {
61     if( conf->psk_identity     == NULL ||
62         conf->psk_identity_len == 0     )
63     {
64         return( 0 );
65     }
66
67     if( conf->psk != NULL && conf->psk_len != 0 )
68         return( 1 );
69
70 #if defined(MBEDTLS_USE_PSA_CRYPTO)
71     if( conf->psk_opaque != 0 )
72         return( 1 );
73 #endif /* MBEDTLS_USE_PSA_CRYPTO */
74
75     return( 0 );
76 }
77
78 #if defined(MBEDTLS_USE_PSA_CRYPTO)
79 static int ssl_conf_has_static_raw_psk( mbedtls_ssl_config const *conf )
80 {
81     if( conf->psk_identity     == NULL ||
82         conf->psk_identity_len == 0     )
83     {
84         return( 0 );
85     }
86
87     if( conf->psk != NULL && conf->psk_len != 0 )
88         return( 1 );
89
90     return( 0 );
91 }
92 #endif /* MBEDTLS_USE_PSA_CRYPTO */
93
94 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
95
96 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
97 static void ssl_write_hostname_ext( mbedtls_ssl_context *ssl,
98                                     unsigned char *buf,
99                                     size_t *olen )
100 {
101     unsigned char *p = buf;
102     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
103     size_t hostname_len;
104
105     *olen = 0;
106
107     if( ssl->hostname == NULL )
108         return;
109
110     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s",
111                    ssl->hostname ) );
112
113     hostname_len = strlen( ssl->hostname );
114
115     if( end < p || (size_t)( end - p ) < hostname_len + 9 )
116     {
117         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
118         return;
119     }
120
121     /*
122      * Sect. 3, RFC 6066 (TLS Extensions Definitions)
123      *
124      * In order to provide any of the server names, clients MAY include an
125      * extension of type "server_name" in the (extended) client hello. The
126      * "extension_data" field of this extension SHALL contain
127      * "ServerNameList" where:
128      *
129      * struct {
130      *     NameType name_type;
131      *     select (name_type) {
132      *         case host_name: HostName;
133      *     } name;
134      * } ServerName;
135      *
136      * enum {
137      *     host_name(0), (255)
138      * } NameType;
139      *
140      * opaque HostName<1..2^16-1>;
141      *
142      * struct {
143      *     ServerName server_name_list<1..2^16-1>
144      * } ServerNameList;
145      *
146      */
147     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
148     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME      ) & 0xFF );
149
150     *p++ = (unsigned char)( ( (hostname_len + 5) >> 8 ) & 0xFF );
151     *p++ = (unsigned char)( ( (hostname_len + 5)      ) & 0xFF );
152
153     *p++ = (unsigned char)( ( (hostname_len + 3) >> 8 ) & 0xFF );
154     *p++ = (unsigned char)( ( (hostname_len + 3)      ) & 0xFF );
155
156     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
157     *p++ = (unsigned char)( ( hostname_len >> 8 ) & 0xFF );
158     *p++ = (unsigned char)( ( hostname_len      ) & 0xFF );
159
160     memcpy( p, ssl->hostname, hostname_len );
161
162     *olen = hostname_len + 9;
163 }
164 #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
165
166 #if defined(MBEDTLS_SSL_RENEGOTIATION)
167 static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,
168                                          unsigned char *buf,
169                                          size_t *olen )
170 {
171     unsigned char *p = buf;
172     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
173
174     *olen = 0;
175
176     /* We're always including an TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the
177      * initial ClientHello, in which case also adding the renegotiation
178      * info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */
179     if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
180         return;
181
182     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) );
183
184     if( end < p || (size_t)( end - p ) < 5 + ssl->verify_data_len )
185     {
186         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
187         return;
188     }
189
190     /*
191      * Secure renegotiation
192      */
193     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );
194     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO      ) & 0xFF );
195
196     *p++ = 0x00;
197     *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;
198     *p++ = ssl->verify_data_len & 0xFF;
199
200     memcpy( p, ssl->own_verify_data, ssl->verify_data_len );
201
202     *olen = 5 + ssl->verify_data_len;
203 }
204 #endif /* MBEDTLS_SSL_RENEGOTIATION */
205
206 /*
207  * Only if we handle at least one key exchange that needs signatures.
208  */
209 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
210     defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
211 static void ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl,
212                                                 unsigned char *buf,
213                                                 size_t *olen )
214 {
215     unsigned char *p = buf;
216     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
217     size_t sig_alg_len = 0;
218     const int *md;
219 #if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)
220     unsigned char *sig_alg_list = buf + 6;
221 #endif
222
223     *olen = 0;
224
225     if( ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
226         return;
227
228     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) );
229
230     for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
231     {
232 #if defined(MBEDTLS_ECDSA_C)
233         sig_alg_len += 2;
234 #endif
235 #if defined(MBEDTLS_RSA_C)
236         sig_alg_len += 2;
237 #endif
238     }
239
240     if( end < p || (size_t)( end - p ) < sig_alg_len + 6 )
241     {
242         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
243         return;
244     }
245
246     /*
247      * Prepare signature_algorithms extension (TLS 1.2)
248      */
249     sig_alg_len = 0;
250
251     for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )
252     {
253 #if defined(MBEDTLS_ECDSA_C)
254         sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
255         sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA;
256 #endif
257 #if defined(MBEDTLS_RSA_C)
258         sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );
259         sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA;
260 #endif
261     }
262
263     /*
264      * enum {
265      *     none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),
266      *     sha512(6), (255)
267      * } HashAlgorithm;
268      *
269      * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }
270      *   SignatureAlgorithm;
271      *
272      * struct {
273      *     HashAlgorithm hash;
274      *     SignatureAlgorithm signature;
275      * } SignatureAndHashAlgorithm;
276      *
277      * SignatureAndHashAlgorithm
278      *   supported_signature_algorithms<2..2^16-2>;
279      */
280     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF );
281     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG      ) & 0xFF );
282
283     *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );
284     *p++ = (unsigned char)( ( ( sig_alg_len + 2 )      ) & 0xFF );
285
286     *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );
287     *p++ = (unsigned char)( ( sig_alg_len      ) & 0xFF );
288
289     *olen = 6 + sig_alg_len;
290 }
291 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&
292           MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */
293
294 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
295     defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
296 static void ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,
297                                                      unsigned char *buf,
298                                                      size_t *olen )
299 {
300     unsigned char *p = buf;
301     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
302     unsigned char *elliptic_curve_list = p + 6;
303     size_t elliptic_curve_len = 0;
304     const mbedtls_ecp_curve_info *info;
305 #if defined(MBEDTLS_ECP_C)
306     const mbedtls_ecp_group_id *grp_id;
307 #else
308     ((void) ssl);
309 #endif
310
311     *olen = 0;
312
313     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) );
314
315 #if defined(MBEDTLS_ECP_C)
316     for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )
317 #else
318     for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )
319 #endif
320     {
321 #if defined(MBEDTLS_ECP_C)
322         info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
323 #endif
324         if( info == NULL )
325         {
326             MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid curve in ssl configuration" ) );
327             return;
328         }
329
330         elliptic_curve_len += 2;
331     }
332
333     if( end < p || (size_t)( end - p ) < 6 + elliptic_curve_len )
334     {
335         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
336         return;
337     }
338
339     elliptic_curve_len = 0;
340
341 #if defined(MBEDTLS_ECP_C)
342     for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )
343 #else
344     for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )
345 #endif
346     {
347 #if defined(MBEDTLS_ECP_C)
348         info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );
349 #endif
350         elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8;
351         elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF;
352     }
353
354     if( elliptic_curve_len == 0 )
355         return;
356
357     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );
358     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES      ) & 0xFF );
359
360     *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );
361     *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 )      ) & 0xFF );
362
363     *p++ = (unsigned char)( ( ( elliptic_curve_len     ) >> 8 ) & 0xFF );
364     *p++ = (unsigned char)( ( ( elliptic_curve_len     )      ) & 0xFF );
365
366     *olen = 6 + elliptic_curve_len;
367 }
368
369 static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,
370                                                    unsigned char *buf,
371                                                    size_t *olen )
372 {
373     unsigned char *p = buf;
374     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
375
376     *olen = 0;
377
378     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) );
379
380     if( end < p || (size_t)( end - p ) < 6 )
381     {
382         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
383         return;
384     }
385
386     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );
387     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS      ) & 0xFF );
388
389     *p++ = 0x00;
390     *p++ = 2;
391
392     *p++ = 1;
393     *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
394
395     *olen = 6;
396 }
397 #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
398           MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
399
400 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
401 static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,
402                                         unsigned char *buf,
403                                         size_t *olen )
404 {
405     int ret;
406     unsigned char *p = buf;
407     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
408     size_t kkpp_len;
409
410     *olen = 0;
411
412     /* Skip costly extension if we can't use EC J-PAKE anyway */
413     if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
414         return;
415
416     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding ecjpake_kkpp extension" ) );
417
418     if( end - p < 4 )
419     {
420         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
421         return;
422     }
423
424     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );
425     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP      ) & 0xFF );
426
427     /*
428      * We may need to send ClientHello multiple times for Hello verification.
429      * We don't want to compute fresh values every time (both for performance
430      * and consistency reasons), so cache the extension content.
431      */
432     if( ssl->handshake->ecjpake_cache == NULL ||
433         ssl->handshake->ecjpake_cache_len == 0 )
434     {
435         MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) );
436
437         ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,
438                                         p + 2, end - p - 2, &kkpp_len,
439                                         ssl->conf->f_rng, ssl->conf->p_rng );
440         if( ret != 0 )
441         {
442             MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret );
443             return;
444         }
445
446         ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );
447         if( ssl->handshake->ecjpake_cache == NULL )
448         {
449             MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) );
450             return;
451         }
452
453         memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );
454         ssl->handshake->ecjpake_cache_len = kkpp_len;
455     }
456     else
457     {
458         MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) );
459
460         kkpp_len = ssl->handshake->ecjpake_cache_len;
461
462         if( (size_t)( end - p - 2 ) < kkpp_len )
463         {
464             MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
465             return;
466         }
467
468         memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );
469     }
470
471     *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );
472     *p++ = (unsigned char)( ( kkpp_len      ) & 0xFF );
473
474     *olen = kkpp_len + 4;
475 }
476 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
477
478 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
479 static void ssl_write_cid_ext( mbedtls_ssl_context *ssl,
480                                unsigned char *buf,
481                                size_t *olen )
482 {
483     unsigned char *p = buf;
484     size_t ext_len;
485     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
486
487     /*
488      * Quoting draft-ietf-tls-dtls-connection-id-05
489      * https://tools.ietf.org/html/draft-ietf-tls-dtls-connection-id-05
490      *
491      *   struct {
492      *      opaque cid<0..2^8-1>;
493      *   } ConnectionId;
494     */
495
496     *olen = 0;
497     if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
498         ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED )
499     {
500         return;
501     }
502     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding CID extension" ) );
503
504     /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
505      * which is at most 255, so the increment cannot overflow. */
506     if( end < p || (size_t)( end - p ) < (unsigned)( ssl->own_cid_len + 5 ) )
507     {
508         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
509         return;
510     }
511
512     /* Add extension ID + size */
513     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_CID >> 8 ) & 0xFF );
514     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_CID      ) & 0xFF );
515     ext_len = (size_t) ssl->own_cid_len + 1;
516     *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
517     *p++ = (unsigned char)( ( ext_len      ) & 0xFF );
518
519     *p++ = (uint8_t) ssl->own_cid_len;
520     memcpy( p, ssl->own_cid, ssl->own_cid_len );
521
522     *olen = ssl->own_cid_len + 5;
523 }
524 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
525
526 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
527 static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,
528                                                unsigned char *buf,
529                                                size_t *olen )
530 {
531     unsigned char *p = buf;
532     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
533
534     *olen = 0;
535
536     if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) {
537         return;
538     }
539
540     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) );
541
542     if( end < p || (size_t)( end - p ) < 5 )
543     {
544         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
545         return;
546     }
547
548     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );
549     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH      ) & 0xFF );
550
551     *p++ = 0x00;
552     *p++ = 1;
553
554     *p++ = ssl->conf->mfl_code;
555
556     *olen = 5;
557 }
558 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
559
560 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
561 static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,
562                                           unsigned char *buf, size_t *olen )
563 {
564     unsigned char *p = buf;
565     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
566
567     *olen = 0;
568
569     if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )
570     {
571         return;
572     }
573
574     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) );
575
576     if( end < p || (size_t)( end - p ) < 4 )
577     {
578         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
579         return;
580     }
581
582     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );
583     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC      ) & 0xFF );
584
585     *p++ = 0x00;
586     *p++ = 0x00;
587
588     *olen = 4;
589 }
590 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
591
592 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
593 static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
594                                        unsigned char *buf, size_t *olen )
595 {
596     unsigned char *p = buf;
597     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
598
599     *olen = 0;
600
601     if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
602         ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
603     {
604         return;
605     }
606
607     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding encrypt_then_mac "
608                         "extension" ) );
609
610     if( end < p || (size_t)( end - p ) < 4 )
611     {
612         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
613         return;
614     }
615
616     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );
617     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC      ) & 0xFF );
618
619     *p++ = 0x00;
620     *p++ = 0x00;
621
622     *olen = 4;
623 }
624 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
625
626 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
627 static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,
628                                        unsigned char *buf, size_t *olen )
629 {
630     unsigned char *p = buf;
631     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
632
633     *olen = 0;
634
635     if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
636         ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )
637     {
638         return;
639     }
640
641     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding extended_master_secret "
642                         "extension" ) );
643
644     if( end < p || (size_t)( end - p ) < 4 )
645     {
646         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
647         return;
648     }
649
650     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );
651     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET      ) & 0xFF );
652
653     *p++ = 0x00;
654     *p++ = 0x00;
655
656     *olen = 4;
657 }
658 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
659
660 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
661 static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,
662                                           unsigned char *buf, size_t *olen )
663 {
664     unsigned char *p = buf;
665     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
666     size_t tlen = ssl->session_negotiate->ticket_len;
667
668     *olen = 0;
669
670     if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED )
671     {
672         return;
673     }
674
675     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) );
676
677     if( end < p || (size_t)( end - p ) < 4 + tlen )
678     {
679         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
680         return;
681     }
682
683     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );
684     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET      ) & 0xFF );
685
686     *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );
687     *p++ = (unsigned char)( ( tlen      ) & 0xFF );
688
689     *olen = 4;
690
691     if( ssl->session_negotiate->ticket == NULL || tlen == 0 )
692     {
693         return;
694     }
695
696     MBEDTLS_SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) );
697
698     memcpy( p, ssl->session_negotiate->ticket, tlen );
699
700     *olen += tlen;
701 }
702 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
703
704 #if defined(MBEDTLS_SSL_ALPN)
705 static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,
706                                 unsigned char *buf, size_t *olen )
707 {
708     unsigned char *p = buf;
709     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
710     size_t alpnlen = 0;
711     const char **cur;
712
713     *olen = 0;
714
715     if( ssl->conf->alpn_list == NULL )
716     {
717         return;
718     }
719
720     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) );
721
722     for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
723         alpnlen += (unsigned char)( strlen( *cur ) & 0xFF ) + 1;
724
725     if( end < p || (size_t)( end - p ) < 6 + alpnlen )
726     {
727         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) );
728         return;
729     }
730
731     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );
732     *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN      ) & 0xFF );
733
734     /*
735      * opaque ProtocolName<1..2^8-1>;
736      *
737      * struct {
738      *     ProtocolName protocol_name_list<2..2^16-1>
739      * } ProtocolNameList;
740      */
741
742     /* Skip writing extension and list length for now */
743     p += 4;
744
745     for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )
746     {
747         *p = (unsigned char)( strlen( *cur ) & 0xFF );
748         memcpy( p + 1, *cur, *p );
749         p += 1 + *p;
750     }
751
752     *olen = p - buf;
753
754     /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */
755     buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );
756     buf[5] = (unsigned char)( ( ( *olen - 6 )      ) & 0xFF );
757
758     /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */
759     buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );
760     buf[3] = (unsigned char)( ( ( *olen - 4 )      ) & 0xFF );
761 }
762 #endif /* MBEDTLS_SSL_ALPN */
763
764 /*
765  * Generate random bytes for ClientHello
766  */
767 static int ssl_generate_random( mbedtls_ssl_context *ssl )
768 {
769     int ret;
770     unsigned char *p = ssl->handshake->randbytes;
771 #if defined(MBEDTLS_HAVE_TIME)
772     mbedtls_time_t t;
773 #endif
774
775     /*
776      * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1)
777      */
778 #if defined(MBEDTLS_SSL_PROTO_DTLS)
779     if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
780         ssl->handshake->verify_cookie != NULL )
781     {
782         return( 0 );
783     }
784 #endif
785
786 #if defined(MBEDTLS_HAVE_TIME)
787     t = mbedtls_time( NULL );
788     *p++ = (unsigned char)( t >> 24 );
789     *p++ = (unsigned char)( t >> 16 );
790     *p++ = (unsigned char)( t >>  8 );
791     *p++ = (unsigned char)( t       );
792
793     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
794 #else
795     if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )
796         return( ret );
797
798     p += 4;
799 #endif /* MBEDTLS_HAVE_TIME */
800
801     if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )
802         return( ret );
803
804     return( 0 );
805 }
806
807 /**
808  * \brief           Validate cipher suite against config in SSL context.
809  *
810  * \param suite_info    cipher suite to validate
811  * \param ssl           SSL context
812  * \param min_minor_ver Minimal minor version to accept a cipher suite
813  * \param max_minor_ver Maximal minor version to accept a cipher suite
814  *
815  * \return          0 if valid, else 1
816  */
817 static int ssl_validate_ciphersuite( const mbedtls_ssl_ciphersuite_t * suite_info,
818                                      const mbedtls_ssl_context * ssl,
819                                      int min_minor_ver, int max_minor_ver )
820 {
821     (void) ssl;
822     if( suite_info == NULL )
823         return( 1 );
824
825     if( suite_info->min_minor_ver > max_minor_ver ||
826             suite_info->max_minor_ver < min_minor_ver )
827         return( 1 );
828
829 #if defined(MBEDTLS_SSL_PROTO_DTLS)
830     if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
831             ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )
832         return( 1 );
833 #endif
834
835 #if defined(MBEDTLS_ARC4_C)
836     if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&
837             suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )
838         return( 1 );
839 #endif
840
841 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
842     if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
843             mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )
844         return( 1 );
845 #endif
846
847     /* Don't suggest PSK-based ciphersuite if no PSK is available. */
848 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
849     if( mbedtls_ssl_ciphersuite_uses_psk( suite_info ) &&
850         ssl_conf_has_static_psk( ssl->conf ) == 0 )
851     {
852         return( 1 );
853     }
854 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
855
856     return( 0 );
857 }
858
859 static int ssl_write_client_hello( mbedtls_ssl_context *ssl )
860 {
861     int ret;
862     size_t i, n, olen, ext_len = 0;
863     unsigned char *buf;
864     unsigned char *p, *q;
865     unsigned char offer_compress;
866     const int *ciphersuites;
867     const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
868 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
869     defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
870     int uses_ec = 0;
871 #endif
872
873     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
874
875     if( ssl->conf->f_rng == NULL )
876     {
877         MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") );
878         return( MBEDTLS_ERR_SSL_NO_RNG );
879     }
880
881 #if defined(MBEDTLS_SSL_RENEGOTIATION)
882     if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
883 #endif
884     {
885         ssl->major_ver = ssl->conf->min_major_ver;
886         ssl->minor_ver = ssl->conf->min_minor_ver;
887     }
888
889     if( ssl->conf->max_major_ver == 0 )
890     {
891         MBEDTLS_SSL_DEBUG_MSG( 1, ( "configured max major version is invalid, "
892                             "consider using mbedtls_ssl_config_defaults()" ) );
893         return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
894     }
895
896     /*
897      *     0  .   0   handshake type
898      *     1  .   3   handshake length
899      *     4  .   5   highest version supported
900      *     6  .   9   current UNIX time
901      *    10  .  37   random bytes
902      */
903     buf = ssl->out_msg;
904     p = buf + 4;
905
906     mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver,
907                        ssl->conf->transport, p );
908     p += 2;
909
910     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
911                    buf[4], buf[5] ) );
912
913     if( ( ret = ssl_generate_random( ssl ) ) != 0 )
914     {
915         MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret );
916         return( ret );
917     }
918
919     memcpy( p, ssl->handshake->randbytes, 32 );
920     MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 );
921     p += 32;
922
923     /*
924      *    38  .  38   session id length
925      *    39  . 39+n  session id
926      *   39+n . 39+n  DTLS only: cookie length (1 byte)
927      *   40+n .  ..   DTSL only: cookie
928      *   ..   . ..    ciphersuitelist length (2 bytes)
929      *   ..   . ..    ciphersuitelist
930      *   ..   . ..    compression methods length (1 byte)
931      *   ..   . ..    compression methods
932      *   ..   . ..    extensions length (2 bytes)
933      *   ..   . ..    extensions
934      */
935     n = ssl->session_negotiate->id_len;
936
937     if( n < 16 || n > 32 ||
938 #if defined(MBEDTLS_SSL_RENEGOTIATION)
939         ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
940 #endif
941         ssl->handshake->resume == 0 )
942     {
943         n = 0;
944     }
945
946 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
947     /*
948      * RFC 5077 section 3.4: "When presenting a ticket, the client MAY
949      * generate and include a Session ID in the TLS ClientHello."
950      */
951 #if defined(MBEDTLS_SSL_RENEGOTIATION)
952     if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
953 #endif
954     {
955         if( ssl->session_negotiate->ticket != NULL &&
956                 ssl->session_negotiate->ticket_len != 0 )
957         {
958             ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id, 32 );
959
960             if( ret != 0 )
961                 return( ret );
962
963             ssl->session_negotiate->id_len = n = 32;
964         }
965     }
966 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
967
968     *p++ = (unsigned char) n;
969
970     for( i = 0; i < n; i++ )
971         *p++ = ssl->session_negotiate->id[i];
972
973     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
974     MBEDTLS_SSL_DEBUG_BUF( 3,   "client hello, session id", buf + 39, n );
975
976     /*
977      * DTLS cookie
978      */
979 #if defined(MBEDTLS_SSL_PROTO_DTLS)
980     if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
981     {
982         if( ssl->handshake->verify_cookie == NULL )
983         {
984             MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) );
985             *p++ = 0;
986         }
987         else
988         {
989             MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie",
990                               ssl->handshake->verify_cookie,
991                               ssl->handshake->verify_cookie_len );
992
993             *p++ = ssl->handshake->verify_cookie_len;
994             memcpy( p, ssl->handshake->verify_cookie,
995                        ssl->handshake->verify_cookie_len );
996             p += ssl->handshake->verify_cookie_len;
997         }
998     }
999 #endif
1000
1001     /*
1002      * Ciphersuite list
1003      */
1004     ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];
1005
1006     /* Skip writing ciphersuite length for now */
1007     n = 0;
1008     q = p;
1009     p += 2;
1010
1011     for( i = 0; ciphersuites[i] != 0; i++ )
1012     {
1013         ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] );
1014
1015         if( ssl_validate_ciphersuite( ciphersuite_info, ssl,
1016                                       ssl->conf->min_minor_ver,
1017                                       ssl->conf->max_minor_ver ) != 0 )
1018             continue;
1019
1020         MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x",
1021                                     ciphersuites[i] ) );
1022
1023 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
1024     defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1025         uses_ec |= mbedtls_ssl_ciphersuite_uses_ec( ciphersuite_info );
1026 #endif
1027
1028         n++;
1029         *p++ = (unsigned char)( ciphersuites[i] >> 8 );
1030         *p++ = (unsigned char)( ciphersuites[i]      );
1031     }
1032
1033     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites (excluding SCSVs)", n ) );
1034
1035     /*
1036      * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1037      */
1038 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1039     if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )
1040 #endif
1041     {
1042         MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding EMPTY_RENEGOTIATION_INFO_SCSV" ) );
1043         *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 );
1044         *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO      );
1045         n++;
1046     }
1047
1048     /* Some versions of OpenSSL don't handle it correctly if not at end */
1049 #if defined(MBEDTLS_SSL_FALLBACK_SCSV)
1050     if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK )
1051     {
1052         MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) );
1053         *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 );
1054         *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE      );
1055         n++;
1056     }
1057 #endif
1058
1059     *q++ = (unsigned char)( n >> 7 );
1060     *q++ = (unsigned char)( n << 1 );
1061
1062 #if defined(MBEDTLS_ZLIB_SUPPORT)
1063     offer_compress = 1;
1064 #else
1065     offer_compress = 0;
1066 #endif
1067
1068     /*
1069      * We don't support compression with DTLS right now: if many records come
1070      * in the same datagram, uncompressing one could overwrite the next one.
1071      * We don't want to add complexity for handling that case unless there is
1072      * an actual need for it.
1073      */
1074 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1075     if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
1076         offer_compress = 0;
1077 #endif
1078
1079     if( offer_compress )
1080     {
1081         MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) );
1082         MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d",
1083                             MBEDTLS_SSL_COMPRESS_DEFLATE, MBEDTLS_SSL_COMPRESS_NULL ) );
1084
1085         *p++ = 2;
1086         *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE;
1087         *p++ = MBEDTLS_SSL_COMPRESS_NULL;
1088     }
1089     else
1090     {
1091         MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
1092         MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d",
1093                             MBEDTLS_SSL_COMPRESS_NULL ) );
1094
1095         *p++ = 1;
1096         *p++ = MBEDTLS_SSL_COMPRESS_NULL;
1097     }
1098
1099     // First write extensions, then the total length
1100     //
1101 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1102     ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );
1103     ext_len += olen;
1104 #endif
1105
1106     /* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added
1107      * even if MBEDTLS_SSL_RENEGOTIATION is not defined. */
1108 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1109     ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );
1110     ext_len += olen;
1111 #endif
1112
1113 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
1114     defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)
1115     ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );
1116     ext_len += olen;
1117 #endif
1118
1119 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
1120     defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1121     if( uses_ec )
1122     {
1123         ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );
1124         ext_len += olen;
1125
1126         ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );
1127         ext_len += olen;
1128     }
1129 #endif
1130
1131 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1132     ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );
1133     ext_len += olen;
1134 #endif
1135
1136 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1137     ssl_write_cid_ext( ssl, p + 2 + ext_len, &olen );
1138     ext_len += olen;
1139 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1140
1141 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1142     ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );
1143     ext_len += olen;
1144 #endif
1145
1146 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1147     ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );
1148     ext_len += olen;
1149 #endif
1150
1151 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1152     ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );
1153     ext_len += olen;
1154 #endif
1155
1156 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1157     ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );
1158     ext_len += olen;
1159 #endif
1160
1161 #if defined(MBEDTLS_SSL_ALPN)
1162     ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );
1163     ext_len += olen;
1164 #endif
1165
1166 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
1167     ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );
1168     ext_len += olen;
1169 #endif
1170
1171     /* olen unused if all extensions are disabled */
1172     ((void) olen);
1173
1174     MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d",
1175                    ext_len ) );
1176
1177     if( ext_len > 0 )
1178     {
1179         *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );
1180         *p++ = (unsigned char)( ( ext_len      ) & 0xFF );
1181         p += ext_len;
1182     }
1183
1184     ssl->out_msglen  = p - buf;
1185     ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
1186     ssl->out_msg[0]  = MBEDTLS_SSL_HS_CLIENT_HELLO;
1187
1188     ssl->state++;
1189
1190 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1191     if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
1192         mbedtls_ssl_send_flight_completed( ssl );
1193 #endif
1194
1195     if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
1196     {
1197         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
1198         return( ret );
1199     }
1200
1201 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1202     if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
1203         ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
1204     {
1205         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret );
1206         return( ret );
1207     }
1208 #endif /* MBEDTLS_SSL_PROTO_DTLS */
1209
1210     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
1211
1212     return( 0 );
1213 }
1214
1215 static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,
1216                                          const unsigned char *buf,
1217                                          size_t len )
1218 {
1219 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1220     if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )
1221     {
1222         /* Check verify-data in constant-time. The length OTOH is no secret */
1223         if( len    != 1 + ssl->verify_data_len * 2 ||
1224             buf[0] !=     ssl->verify_data_len * 2 ||
1225             mbedtls_ssl_safer_memcmp( buf + 1,
1226                           ssl->own_verify_data, ssl->verify_data_len ) != 0 ||
1227             mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len,
1228                           ssl->peer_verify_data, ssl->verify_data_len ) != 0 )
1229         {
1230             MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) );
1231             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1232                                             MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1233             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1234         }
1235     }
1236     else
1237 #endif /* MBEDTLS_SSL_RENEGOTIATION */
1238     {
1239         if( len != 1 || buf[0] != 0x00 )
1240         {
1241             MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) );
1242             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1243                                             MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1244             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1245         }
1246
1247         ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
1248     }
1249
1250     return( 0 );
1251 }
1252
1253 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1254 static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,
1255                                               const unsigned char *buf,
1256                                               size_t len )
1257 {
1258     /*
1259      * server should use the extension only if we did,
1260      * and if so the server's value should match ours (and len is always 1)
1261      */
1262     if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||
1263         len != 1 ||
1264         buf[0] != ssl->conf->mfl_code )
1265     {
1266         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching max fragment length extension" ) );
1267         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1268                                         MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1269         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1270     }
1271
1272     return( 0 );
1273 }
1274 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
1275
1276 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1277 static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,
1278                                          const unsigned char *buf,
1279                                          size_t len )
1280 {
1281     if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ||
1282         len != 0 )
1283     {
1284         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching truncated HMAC extension" ) );
1285         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1286                                         MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1287         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1288     }
1289
1290     ((void) buf);
1291
1292     ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;
1293
1294     return( 0 );
1295 }
1296 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
1297
1298 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1299 static int ssl_parse_cid_ext( mbedtls_ssl_context *ssl,
1300                               const unsigned char *buf,
1301                               size_t len )
1302 {
1303     size_t peer_cid_len;
1304
1305     if( /* CID extension only makes sense in DTLS */
1306         ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
1307         /* The server must only send the CID extension if we have offered it. */
1308         ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED )
1309     {
1310         MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension unexpected" ) );
1311         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1312                                      MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1313         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1314     }
1315
1316     if( len == 0 )
1317     {
1318         MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
1319         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1320                                      MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1321         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1322     }
1323
1324     peer_cid_len = *buf++;
1325     len--;
1326
1327     if( peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX )
1328     {
1329         MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
1330         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1331                                      MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1332         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1333     }
1334
1335     if( len != peer_cid_len )
1336     {
1337         MBEDTLS_SSL_DEBUG_MSG( 1, ( "CID extension invalid" ) );
1338         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1339                                      MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
1340         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1341     }
1342
1343     ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
1344     ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
1345     memcpy( ssl->handshake->peer_cid, buf, peer_cid_len );
1346
1347     MBEDTLS_SSL_DEBUG_MSG( 3, ( "Use of CID extension negotiated" ) );
1348     MBEDTLS_SSL_DEBUG_BUF( 3, "Server CID", buf, peer_cid_len );
1349
1350     return( 0 );
1351 }
1352 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1353
1354 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1355 static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,
1356                                          const unsigned char *buf,
1357                                          size_t len )
1358 {
1359     if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
1360         ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
1361         len != 0 )
1362     {
1363         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching encrypt-then-MAC extension" ) );
1364         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1365                                         MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1366         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1367     }
1368
1369     ((void) buf);
1370
1371     ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
1372
1373     return( 0 );
1374 }
1375 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
1376
1377 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1378 static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,
1379                                          const unsigned char *buf,
1380                                          size_t len )
1381 {
1382     if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
1383         ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||
1384         len != 0 )
1385     {
1386         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching extended master secret extension" ) );
1387         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1388                                         MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1389         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1390     }
1391
1392     ((void) buf);
1393
1394     ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
1395
1396     return( 0 );
1397 }
1398 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
1399
1400 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
1401 static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,
1402                                          const unsigned char *buf,
1403                                          size_t len )
1404 {
1405     if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||
1406         len != 0 )
1407     {
1408         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching session ticket extension" ) );
1409         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1410                                         MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1411         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1412     }
1413
1414     ((void) buf);
1415
1416     ssl->handshake->new_session_ticket = 1;
1417
1418     return( 0 );
1419 }
1420 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
1421
1422 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
1423     defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1424 static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,
1425                                                   const unsigned char *buf,
1426                                                   size_t len )
1427 {
1428     size_t list_size;
1429     const unsigned char *p;
1430
1431     if( len == 0 || (size_t)( buf[0] + 1 ) != len )
1432     {
1433         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1434         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1435                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1436         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1437     }
1438     list_size = buf[0];
1439
1440     p = buf + 1;
1441     while( list_size > 0 )
1442     {
1443         if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
1444             p[0] == MBEDTLS_ECP_PF_COMPRESSED )
1445         {
1446 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)
1447             ssl->handshake->ecdh_ctx.point_format = p[0];
1448 #endif
1449 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1450             ssl->handshake->ecjpake_ctx.point_format = p[0];
1451 #endif
1452             MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) );
1453             return( 0 );
1454         }
1455
1456         list_size--;
1457         p++;
1458     }
1459
1460     MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) );
1461     mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1462                                     MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1463     return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1464 }
1465 #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
1466           MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1467
1468 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1469 static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,
1470                                    const unsigned char *buf,
1471                                    size_t len )
1472 {
1473     int ret;
1474
1475     if( ssl->handshake->ciphersuite_info->key_exchange !=
1476         MBEDTLS_KEY_EXCHANGE_ECJPAKE )
1477     {
1478         MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) );
1479         return( 0 );
1480     }
1481
1482     /* If we got here, we no longer need our cached extension */
1483     mbedtls_free( ssl->handshake->ecjpake_cache );
1484     ssl->handshake->ecjpake_cache = NULL;
1485     ssl->handshake->ecjpake_cache_len = 0;
1486
1487     if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,
1488                                                 buf, len ) ) != 0 )
1489     {
1490         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret );
1491         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1492                                         MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1493         return( ret );
1494     }
1495
1496     return( 0 );
1497 }
1498 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1499
1500 #if defined(MBEDTLS_SSL_ALPN)
1501 static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,
1502                                const unsigned char *buf, size_t len )
1503 {
1504     size_t list_len, name_len;
1505     const char **p;
1506
1507     /* If we didn't send it, the server shouldn't send it */
1508     if( ssl->conf->alpn_list == NULL )
1509     {
1510         MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching ALPN extension" ) );
1511         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1512                                         MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1513         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1514     }
1515
1516     /*
1517      * opaque ProtocolName<1..2^8-1>;
1518      *
1519      * struct {
1520      *     ProtocolName protocol_name_list<2..2^16-1>
1521      * } ProtocolNameList;
1522      *
1523      * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
1524      */
1525
1526     /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
1527     if( len < 4 )
1528     {
1529         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1530                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1531         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1532     }
1533
1534     list_len = ( buf[0] << 8 ) | buf[1];
1535     if( list_len != len - 2 )
1536     {
1537         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1538                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1539         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1540     }
1541
1542     name_len = buf[2];
1543     if( name_len != list_len - 1 )
1544     {
1545         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1546                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1547         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1548     }
1549
1550     /* Check that the server chosen protocol was in our list and save it */
1551     for( p = ssl->conf->alpn_list; *p != NULL; p++ )
1552     {
1553         if( name_len == strlen( *p ) &&
1554             memcmp( buf + 3, *p, name_len ) == 0 )
1555         {
1556             ssl->alpn_chosen = *p;
1557             return( 0 );
1558         }
1559     }
1560
1561     MBEDTLS_SSL_DEBUG_MSG( 1, ( "ALPN extension: no matching protocol" ) );
1562     mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1563                                     MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
1564     return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1565 }
1566 #endif /* MBEDTLS_SSL_ALPN */
1567
1568 /*
1569  * Parse HelloVerifyRequest.  Only called after verifying the HS type.
1570  */
1571 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1572 static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl )
1573 {
1574     const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
1575     int major_ver, minor_ver;
1576     unsigned char cookie_len;
1577
1578     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) );
1579
1580     /*
1581      * struct {
1582      *   ProtocolVersion server_version;
1583      *   opaque cookie<0..2^8-1>;
1584      * } HelloVerifyRequest;
1585      */
1586     MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 );
1587     mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p );
1588     p += 2;
1589
1590     /*
1591      * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1)
1592      * even is lower than our min version.
1593      */
1594     if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
1595         minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ||
1596         major_ver > ssl->conf->max_major_ver  ||
1597         minor_ver > ssl->conf->max_minor_ver  )
1598     {
1599         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) );
1600
1601         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1602                                      MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
1603
1604         return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
1605     }
1606
1607     cookie_len = *p++;
1608     MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len );
1609
1610     if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len )
1611     {
1612         MBEDTLS_SSL_DEBUG_MSG( 1,
1613             ( "cookie length does not match incoming message size" ) );
1614         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1615                                     MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1616         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1617     }
1618
1619     mbedtls_free( ssl->handshake->verify_cookie );
1620
1621     ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len );
1622     if( ssl->handshake->verify_cookie  == NULL )
1623     {
1624         MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) );
1625         return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
1626     }
1627
1628     memcpy( ssl->handshake->verify_cookie, p, cookie_len );
1629     ssl->handshake->verify_cookie_len = cookie_len;
1630
1631     /* Start over at ClientHello */
1632     ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
1633     mbedtls_ssl_reset_checksum( ssl );
1634
1635     mbedtls_ssl_recv_flight_completed( ssl );
1636
1637     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) );
1638
1639     return( 0 );
1640 }
1641 #endif /* MBEDTLS_SSL_PROTO_DTLS */
1642
1643 static int ssl_parse_server_hello( mbedtls_ssl_context *ssl )
1644 {
1645     int ret, i;
1646     size_t n;
1647     size_t ext_len;
1648     unsigned char *buf, *ext;
1649     unsigned char comp;
1650 #if defined(MBEDTLS_ZLIB_SUPPORT)
1651     int accept_comp;
1652 #endif
1653 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1654     int renegotiation_info_seen = 0;
1655 #endif
1656     int handshake_failure = 0;
1657     const mbedtls_ssl_ciphersuite_t *suite_info;
1658
1659     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
1660
1661     if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
1662     {
1663         /* No alert on a read error. */
1664         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
1665         return( ret );
1666     }
1667
1668     buf = ssl->in_msg;
1669
1670     if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
1671     {
1672 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1673         if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )
1674         {
1675             ssl->renego_records_seen++;
1676
1677             if( ssl->conf->renego_max_records >= 0 &&
1678                 ssl->renego_records_seen > ssl->conf->renego_max_records )
1679             {
1680                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, "
1681                                     "but not honored by server" ) );
1682                 return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
1683             }
1684
1685             MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-handshake message during renego" ) );
1686
1687             ssl->keep_current_message = 1;
1688             return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );
1689         }
1690 #endif /* MBEDTLS_SSL_RENEGOTIATION */
1691
1692         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1693         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1694                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
1695         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
1696     }
1697
1698 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1699     if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
1700     {
1701         if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )
1702         {
1703             MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) );
1704             MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
1705             return( ssl_parse_hello_verify_request( ssl ) );
1706         }
1707         else
1708         {
1709             /* We made it through the verification process */
1710             mbedtls_free( ssl->handshake->verify_cookie );
1711             ssl->handshake->verify_cookie = NULL;
1712             ssl->handshake->verify_cookie_len = 0;
1713         }
1714     }
1715 #endif /* MBEDTLS_SSL_PROTO_DTLS */
1716
1717     if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) ||
1718         buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO )
1719     {
1720         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1721         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1722                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1723         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1724     }
1725
1726     /*
1727      *  0   .  1    server_version
1728      *  2   . 33    random (maybe including 4 bytes of Unix time)
1729      * 34   . 34    session_id length = n
1730      * 35   . 34+n  session_id
1731      * 35+n . 36+n  cipher_suite
1732      * 37+n . 37+n  compression_method
1733      *
1734      * 38+n . 39+n  extensions length (optional)
1735      * 40+n .  ..   extensions
1736      */
1737     buf += mbedtls_ssl_hs_hdr_len( ssl );
1738
1739     MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 );
1740     mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,
1741                       ssl->conf->transport, buf + 0 );
1742
1743     if( ssl->major_ver < ssl->conf->min_major_ver ||
1744         ssl->minor_ver < ssl->conf->min_minor_ver ||
1745         ssl->major_ver > ssl->conf->max_major_ver ||
1746         ssl->minor_ver > ssl->conf->max_minor_ver )
1747     {
1748         MBEDTLS_SSL_DEBUG_MSG( 1, ( "server version out of bounds - "
1749                             " min: [%d:%d], server: [%d:%d], max: [%d:%d]",
1750                             ssl->conf->min_major_ver, ssl->conf->min_minor_ver,
1751                             ssl->major_ver, ssl->minor_ver,
1752                             ssl->conf->max_major_ver, ssl->conf->max_minor_ver ) );
1753
1754         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1755                                      MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );
1756
1757         return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );
1758     }
1759
1760     MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu",
1761                            ( (uint32_t) buf[2] << 24 ) |
1762                            ( (uint32_t) buf[3] << 16 ) |
1763                            ( (uint32_t) buf[4] <<  8 ) |
1764                            ( (uint32_t) buf[5]       ) ) );
1765
1766     memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 );
1767
1768     n = buf[34];
1769
1770     MBEDTLS_SSL_DEBUG_BUF( 3,   "server hello, random bytes", buf + 2, 32 );
1771
1772     if( n > 32 )
1773     {
1774         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1775         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1776                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1777         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1778     }
1779
1780     if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n )
1781     {
1782         ext_len = ( ( buf[38 + n] <<  8 )
1783                   | ( buf[39 + n]       ) );
1784
1785         if( ( ext_len > 0 && ext_len < 4 ) ||
1786             ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len )
1787         {
1788             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1789             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1790                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1791             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1792         }
1793     }
1794     else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n )
1795     {
1796         ext_len = 0;
1797     }
1798     else
1799     {
1800         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1801         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1802                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1803         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1804     }
1805
1806     /* ciphersuite (used later) */
1807     i = ( buf[35 + n] << 8 ) | buf[36 + n];
1808
1809     /*
1810      * Read and check compression
1811      */
1812     comp = buf[37 + n];
1813
1814 #if defined(MBEDTLS_ZLIB_SUPPORT)
1815     /* See comments in ssl_write_client_hello() */
1816 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1817     if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
1818         accept_comp = 0;
1819     else
1820 #endif
1821         accept_comp = 1;
1822
1823     if( comp != MBEDTLS_SSL_COMPRESS_NULL &&
1824         ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) )
1825 #else /* MBEDTLS_ZLIB_SUPPORT */
1826     if( comp != MBEDTLS_SSL_COMPRESS_NULL )
1827 #endif/* MBEDTLS_ZLIB_SUPPORT */
1828     {
1829         MBEDTLS_SSL_DEBUG_MSG( 1, ( "server hello, bad compression: %d", comp ) );
1830         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1831                                         MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
1832         return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
1833     }
1834
1835     /*
1836      * Initialize update checksum functions
1837      */
1838     ssl->handshake->ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( i );
1839     if( ssl->handshake->ciphersuite_info == NULL )
1840     {
1841         MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", i ) );
1842         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1843                                         MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
1844         return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
1845     }
1846
1847     mbedtls_ssl_optimize_checksum( ssl, ssl->handshake->ciphersuite_info );
1848
1849     MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
1850     MBEDTLS_SSL_DEBUG_BUF( 3,   "server hello, session id", buf + 35, n );
1851
1852     /*
1853      * Check if the session can be resumed
1854      */
1855     if( ssl->handshake->resume == 0 || n == 0 ||
1856 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1857         ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
1858 #endif
1859         ssl->session_negotiate->ciphersuite != i ||
1860         ssl->session_negotiate->compression != comp ||
1861         ssl->session_negotiate->id_len != n ||
1862         memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 )
1863     {
1864         ssl->state++;
1865         ssl->handshake->resume = 0;
1866 #if defined(MBEDTLS_HAVE_TIME)
1867         ssl->session_negotiate->start = mbedtls_time( NULL );
1868 #endif
1869         ssl->session_negotiate->ciphersuite = i;
1870         ssl->session_negotiate->compression = comp;
1871         ssl->session_negotiate->id_len = n;
1872         memcpy( ssl->session_negotiate->id, buf + 35, n );
1873     }
1874     else
1875     {
1876         ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
1877
1878         if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
1879         {
1880             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
1881             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1882                                             MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
1883             return( ret );
1884         }
1885     }
1886
1887     MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
1888                    ssl->handshake->resume ? "a" : "no" ) );
1889
1890     MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) );
1891     MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[37 + n] ) );
1892
1893     /*
1894      * Perform cipher suite validation in same way as in ssl_write_client_hello.
1895      */
1896     i = 0;
1897     while( 1 )
1898     {
1899         if( ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0 )
1900         {
1901             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1902             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1903                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
1904             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1905         }
1906
1907         if( ssl->conf->ciphersuite_list[ssl->minor_ver][i++] ==
1908             ssl->session_negotiate->ciphersuite )
1909         {
1910             break;
1911         }
1912     }
1913
1914     suite_info = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite );
1915     if( ssl_validate_ciphersuite( suite_info, ssl, ssl->minor_ver, ssl->minor_ver ) != 0 )
1916     {
1917         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1918         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1919                                         MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
1920         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1921     }
1922
1923     MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s", suite_info->name ) );
1924
1925 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
1926     if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA &&
1927         ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
1928     {
1929         ssl->handshake->ecrs_enabled = 1;
1930     }
1931 #endif
1932
1933     if( comp != MBEDTLS_SSL_COMPRESS_NULL
1934 #if defined(MBEDTLS_ZLIB_SUPPORT)
1935         && comp != MBEDTLS_SSL_COMPRESS_DEFLATE
1936 #endif
1937       )
1938     {
1939         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1940         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1941                                         MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
1942         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1943     }
1944     ssl->session_negotiate->compression = comp;
1945
1946     ext = buf + 40 + n;
1947
1948     MBEDTLS_SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) );
1949
1950     while( ext_len )
1951     {
1952         unsigned int ext_id   = ( ( ext[0] <<  8 )
1953                                 | ( ext[1]       ) );
1954         unsigned int ext_size = ( ( ext[2] <<  8 )
1955                                 | ( ext[3]       ) );
1956
1957         if( ext_size + 4 > ext_len )
1958         {
1959             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
1960             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1961                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
1962             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
1963         }
1964
1965         switch( ext_id )
1966         {
1967         case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
1968             MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) );
1969 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1970             renegotiation_info_seen = 1;
1971 #endif
1972
1973             if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4,
1974                                                       ext_size ) ) != 0 )
1975                 return( ret );
1976
1977             break;
1978
1979 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1980         case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
1981             MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) );
1982
1983             if( ( ret = ssl_parse_max_fragment_length_ext( ssl,
1984                             ext + 4, ext_size ) ) != 0 )
1985             {
1986                 return( ret );
1987             }
1988
1989             break;
1990 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
1991
1992 #if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
1993         case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:
1994             MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) );
1995
1996             if( ( ret = ssl_parse_truncated_hmac_ext( ssl,
1997                             ext + 4, ext_size ) ) != 0 )
1998             {
1999                 return( ret );
2000             }
2001
2002             break;
2003 #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */
2004
2005 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2006         case MBEDTLS_TLS_EXT_CID:
2007             MBEDTLS_SSL_DEBUG_MSG( 3, ( "found CID extension" ) );
2008
2009             if( ( ret = ssl_parse_cid_ext( ssl,
2010                                            ext + 4,
2011                                            ext_size ) ) != 0 )
2012             {
2013                 return( ret );
2014             }
2015
2016             break;
2017 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
2018
2019 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
2020         case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
2021             MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) );
2022
2023             if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl,
2024                             ext + 4, ext_size ) ) != 0 )
2025             {
2026                 return( ret );
2027             }
2028
2029             break;
2030 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
2031
2032 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2033         case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
2034             MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended_master_secret extension" ) );
2035
2036             if( ( ret = ssl_parse_extended_ms_ext( ssl,
2037                             ext + 4, ext_size ) ) != 0 )
2038             {
2039                 return( ret );
2040             }
2041
2042             break;
2043 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
2044
2045 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
2046         case MBEDTLS_TLS_EXT_SESSION_TICKET:
2047             MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) );
2048
2049             if( ( ret = ssl_parse_session_ticket_ext( ssl,
2050                             ext + 4, ext_size ) ) != 0 )
2051             {
2052                 return( ret );
2053             }
2054
2055             break;
2056 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
2057
2058 #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
2059     defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2060         case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
2061             MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) );
2062
2063             if( ( ret = ssl_parse_supported_point_formats_ext( ssl,
2064                             ext + 4, ext_size ) ) != 0 )
2065             {
2066                 return( ret );
2067             }
2068
2069             break;
2070 #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
2071           MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2072
2073 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2074         case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
2075             MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) );
2076
2077             if( ( ret = ssl_parse_ecjpake_kkpp( ssl,
2078                             ext + 4, ext_size ) ) != 0 )
2079             {
2080                 return( ret );
2081             }
2082
2083             break;
2084 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2085
2086 #if defined(MBEDTLS_SSL_ALPN)
2087         case MBEDTLS_TLS_EXT_ALPN:
2088             MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) );
2089
2090             if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )
2091                 return( ret );
2092
2093             break;
2094 #endif /* MBEDTLS_SSL_ALPN */
2095
2096         default:
2097             MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)",
2098                            ext_id ) );
2099         }
2100
2101         ext_len -= 4 + ext_size;
2102         ext += 4 + ext_size;
2103
2104         if( ext_len > 0 && ext_len < 4 )
2105         {
2106             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
2107             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
2108         }
2109     }
2110
2111     /*
2112      * Renegotiation security checks
2113      */
2114     if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
2115         ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )
2116     {
2117         MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) );
2118         handshake_failure = 1;
2119     }
2120 #if defined(MBEDTLS_SSL_RENEGOTIATION)
2121     else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2122              ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
2123              renegotiation_info_seen == 0 )
2124     {
2125         MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) );
2126         handshake_failure = 1;
2127     }
2128     else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2129              ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
2130              ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )
2131     {
2132         MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) );
2133         handshake_failure = 1;
2134     }
2135     else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
2136              ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
2137              renegotiation_info_seen == 1 )
2138     {
2139         MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) );
2140         handshake_failure = 1;
2141     }
2142 #endif /* MBEDTLS_SSL_RENEGOTIATION */
2143
2144     if( handshake_failure == 1 )
2145     {
2146         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2147                                         MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
2148         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );
2149     }
2150
2151     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
2152
2153     return( 0 );
2154 }
2155
2156 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \
2157     defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
2158 static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl, unsigned char **p,
2159                                        unsigned char *end )
2160 {
2161     int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
2162
2163     /*
2164      * Ephemeral DH parameters:
2165      *
2166      * struct {
2167      *     opaque dh_p<1..2^16-1>;
2168      *     opaque dh_g<1..2^16-1>;
2169      *     opaque dh_Ys<1..2^16-1>;
2170      * } ServerDHParams;
2171      */
2172     if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )
2173     {
2174         MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret );
2175         return( ret );
2176     }
2177
2178     if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen )
2179     {
2180         MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %d < %d",
2181                                     ssl->handshake->dhm_ctx.len * 8,
2182                                     ssl->conf->dhm_min_bitlen ) );
2183         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2184     }
2185
2186     MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P  );
2187     MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G  );
2188     MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY );
2189
2190     return( ret );
2191 }
2192 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2193           MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
2194
2195 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \
2196     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) ||                   \
2197     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) ||                     \
2198     defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||                      \
2199     defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2200 static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )
2201 {
2202     const mbedtls_ecp_curve_info *curve_info;
2203     mbedtls_ecp_group_id grp_id;
2204 #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
2205     grp_id = ssl->handshake->ecdh_ctx.grp.id;
2206 #else
2207     grp_id = ssl->handshake->ecdh_ctx.grp_id;
2208 #endif
2209
2210     curve_info = mbedtls_ecp_curve_info_from_grp_id( grp_id );
2211     if( curve_info == NULL )
2212     {
2213         MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2214         return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2215     }
2216
2217     MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) );
2218
2219 #if defined(MBEDTLS_ECP_C)
2220     if( mbedtls_ssl_check_curve( ssl, grp_id ) != 0 )
2221 #else
2222     if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||
2223         ssl->handshake->ecdh_ctx.grp.nbits > 521 )
2224 #endif
2225         return( -1 );
2226
2227     MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
2228                             MBEDTLS_DEBUG_ECDH_QP );
2229
2230     return( 0 );
2231 }
2232 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2233           MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2234           MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2235           MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2236           MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
2237
2238 #if defined(MBEDTLS_USE_PSA_CRYPTO) &&                           \
2239         ( defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||     \
2240           defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) )
2241 static int ssl_parse_server_ecdh_params_psa( mbedtls_ssl_context *ssl,
2242                                              unsigned char **p,
2243                                              unsigned char *end )
2244 {
2245     uint16_t tls_id;
2246     uint8_t ecpoint_len;
2247     mbedtls_ssl_handshake_params *handshake = ssl->handshake;
2248
2249     /*
2250      * Parse ECC group
2251      */
2252
2253     if( end - *p < 4 )
2254         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2255
2256     /* First byte is curve_type; only named_curve is handled */
2257     if( *(*p)++ != MBEDTLS_ECP_TLS_NAMED_CURVE )
2258         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2259
2260     /* Next two bytes are the namedcurve value */
2261     tls_id = *(*p)++;
2262     tls_id <<= 8;
2263     tls_id |= *(*p)++;
2264
2265     /* Convert EC group to PSA key type. */
2266     if( ( handshake->ecdh_psa_curve =
2267           mbedtls_psa_parse_tls_ecc_group( tls_id ) ) == 0 )
2268     {
2269         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2270     }
2271
2272     /*
2273      * Put peer's ECDH public key in the format understood by PSA.
2274      */
2275
2276     ecpoint_len = *(*p)++;
2277     if( (size_t)( end - *p ) < ecpoint_len )
2278         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2279
2280     if( mbedtls_psa_tls_ecpoint_to_psa_ec( handshake->ecdh_psa_curve,
2281                                     *p, ecpoint_len,
2282                                     handshake->ecdh_psa_peerkey,
2283                                     sizeof( handshake->ecdh_psa_peerkey ),
2284                                     &handshake->ecdh_psa_peerkey_len ) != 0 )
2285     {
2286         return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
2287     }
2288
2289     *p += ecpoint_len;
2290     return( 0 );
2291 }
2292 #endif /* MBEDTLS_USE_PSA_CRYPTO &&
2293             ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2294               MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */
2295
2296 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \
2297     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) ||                   \
2298     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2299 static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,
2300                                          unsigned char **p,
2301                                          unsigned char *end )
2302 {
2303     int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
2304
2305     /*
2306      * Ephemeral ECDH parameters:
2307      *
2308      * struct {
2309      *     ECParameters curve_params;
2310      *     ECPoint      public;
2311      * } ServerECDHParams;
2312      */
2313     if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx,
2314                                   (const unsigned char **) p, end ) ) != 0 )
2315     {
2316         MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret );
2317 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
2318         if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
2319             ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
2320 #endif
2321         return( ret );
2322     }
2323
2324     if( ssl_check_server_ecdh_params( ssl ) != 0 )
2325     {
2326         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDHE curve)" ) );
2327         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2328     }
2329
2330     return( ret );
2331 }
2332 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2333           MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2334           MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
2335
2336 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
2337 static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,
2338                                       unsigned char **p,
2339                                       unsigned char *end )
2340 {
2341     int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
2342     size_t  len;
2343     ((void) ssl);
2344
2345     /*
2346      * PSK parameters:
2347      *
2348      * opaque psk_identity_hint<0..2^16-1>;
2349      */
2350     if( end - (*p) < 2 )
2351     {
2352         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message "
2353                                     "(psk_identity_hint length)" ) );
2354         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2355     }
2356     len = (*p)[0] << 8 | (*p)[1];
2357     *p += 2;
2358
2359     if( end - (*p) < (int) len )
2360     {
2361         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message "
2362                                     "(psk_identity_hint length)" ) );
2363         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2364     }
2365
2366     /*
2367      * Note: we currently ignore the PKS identity hint, as we only allow one
2368      * PSK to be provisionned on the client. This could be changed later if
2369      * someone needs that feature.
2370      */
2371     *p += len;
2372     ret = 0;
2373
2374     return( ret );
2375 }
2376 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
2377
2378 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) ||                           \
2379     defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
2380 /*
2381  * Generate a pre-master secret and encrypt it with the server's RSA key
2382  */
2383 static int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl,
2384                                     size_t offset, size_t *olen,
2385                                     size_t pms_offset )
2386 {
2387     int ret;
2388     size_t len_bytes = ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2;
2389     unsigned char *p = ssl->handshake->premaster + pms_offset;
2390     mbedtls_pk_context * peer_pk;
2391
2392     if( offset + len_bytes > MBEDTLS_SSL_OUT_CONTENT_LEN )
2393     {
2394         MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) );
2395         return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
2396     }
2397
2398     /*
2399      * Generate (part of) the pre-master as
2400      *  struct {
2401      *      ProtocolVersion client_version;
2402      *      opaque random[46];
2403      *  } PreMasterSecret;
2404      */
2405     mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver,
2406                        ssl->conf->transport, p );
2407
2408     if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p + 2, 46 ) ) != 0 )
2409     {
2410         MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret );
2411         return( ret );
2412     }
2413
2414     ssl->handshake->pmslen = 48;
2415
2416 #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2417     peer_pk = &ssl->handshake->peer_pubkey;
2418 #else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2419     if( ssl->session_negotiate->peer_cert == NULL )
2420     {
2421         /* Should never happen */
2422         MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2423         return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2424     }
2425     peer_pk = &ssl->session_negotiate->peer_cert->pk;
2426 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2427
2428     /*
2429      * Now write it out, encrypted
2430      */
2431     if( ! mbedtls_pk_can_do( peer_pk, MBEDTLS_PK_RSA ) )
2432     {
2433         MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) );
2434         return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
2435     }
2436
2437     if( ( ret = mbedtls_pk_encrypt( peer_pk,
2438                             p, ssl->handshake->pmslen,
2439                             ssl->out_msg + offset + len_bytes, olen,
2440                             MBEDTLS_SSL_OUT_CONTENT_LEN - offset - len_bytes,
2441                             ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
2442     {
2443         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret );
2444         return( ret );
2445     }
2446
2447 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2448     defined(MBEDTLS_SSL_PROTO_TLS1_2)
2449     if( len_bytes == 2 )
2450     {
2451         ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 );
2452         ssl->out_msg[offset+1] = (unsigned char)( *olen      );
2453         *olen += 2;
2454     }
2455 #endif
2456
2457 #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2458     /* We don't need the peer's public key anymore. Free it. */
2459     mbedtls_pk_free( peer_pk );
2460 #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2461     return( 0 );
2462 }
2463 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
2464           MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
2465
2466 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2467 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \
2468     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \
2469     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
2470 static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl,
2471                                           unsigned char **p,
2472                                           unsigned char *end,
2473                                           mbedtls_md_type_t *md_alg,
2474                                           mbedtls_pk_type_t *pk_alg )
2475 {
2476     ((void) ssl);
2477     *md_alg = MBEDTLS_MD_NONE;
2478     *pk_alg = MBEDTLS_PK_NONE;
2479
2480     /* Only in TLS 1.2 */
2481     if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
2482     {
2483         return( 0 );
2484     }
2485
2486     if( (*p) + 2 > end )
2487         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2488
2489     /*
2490      * Get hash algorithm
2491      */
2492     if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) ) == MBEDTLS_MD_NONE )
2493     {
2494         MBEDTLS_SSL_DEBUG_MSG( 1, ( "Server used unsupported "
2495                             "HashAlgorithm %d", *(p)[0] ) );
2496         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2497     }
2498
2499     /*
2500      * Get signature algorithm
2501      */
2502     if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) ) == MBEDTLS_PK_NONE )
2503     {
2504         MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used unsupported "
2505                             "SignatureAlgorithm %d", (*p)[1] ) );
2506         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2507     }
2508
2509     /*
2510      * Check if the hash is acceptable
2511      */
2512     if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 )
2513     {
2514         MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used HashAlgorithm %d that was not offered",
2515                                     *(p)[0] ) );
2516         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2517     }
2518
2519     MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) );
2520     MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) );
2521     *p += 2;
2522
2523     return( 0 );
2524 }
2525 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2526           MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2527           MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
2528 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2529
2530 #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2531     defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2532 static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )
2533 {
2534     int ret;
2535     const mbedtls_ecp_keypair *peer_key;
2536     mbedtls_pk_context * peer_pk;
2537
2538 #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2539     peer_pk = &ssl->handshake->peer_pubkey;
2540 #else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2541     if( ssl->session_negotiate->peer_cert == NULL )
2542     {
2543         /* Should never happen */
2544         MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2545         return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2546     }
2547     peer_pk = &ssl->session_negotiate->peer_cert->pk;
2548 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2549
2550     if( ! mbedtls_pk_can_do( peer_pk, MBEDTLS_PK_ECKEY ) )
2551     {
2552         MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) );
2553         return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
2554     }
2555
2556     peer_key = mbedtls_pk_ec( *peer_pk );
2557
2558     if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,
2559                                  MBEDTLS_ECDH_THEIRS ) ) != 0 )
2560     {
2561         MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret );
2562         return( ret );
2563     }
2564
2565     if( ssl_check_server_ecdh_params( ssl ) != 0 )
2566     {
2567         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) );
2568         return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );
2569     }
2570
2571 #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2572     /* We don't need the peer's public key anymore. Free it,
2573      * so that more RAM is available for upcoming expensive
2574      * operations like ECDHE. */
2575     mbedtls_pk_free( peer_pk );
2576 #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2577
2578     return( ret );
2579 }
2580 #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2581           MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
2582
2583 static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )
2584 {
2585     int ret;
2586     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2587         ssl->handshake->ciphersuite_info;
2588     unsigned char *p = NULL, *end = NULL;
2589
2590     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
2591
2592 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
2593     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
2594     {
2595         MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
2596         ssl->state++;
2597         return( 0 );
2598     }
2599     ((void) p);
2600     ((void) end);
2601 #endif
2602
2603 #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2604     defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
2605     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
2606         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
2607     {
2608         if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 )
2609         {
2610             MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret );
2611             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2612                                             MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
2613             return( ret );
2614         }
2615
2616         MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
2617         ssl->state++;
2618         return( 0 );
2619     }
2620     ((void) p);
2621     ((void) end);
2622 #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2623           MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
2624
2625 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
2626     if( ssl->handshake->ecrs_enabled &&
2627         ssl->handshake->ecrs_state == ssl_ecrs_ske_start_processing )
2628     {
2629         goto start_processing;
2630     }
2631 #endif
2632
2633     if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
2634     {
2635         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
2636         return( ret );
2637     }
2638
2639     if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
2640     {
2641         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2642         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2643                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
2644         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2645     }
2646
2647     /*
2648      * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
2649      * doesn't use a psk_identity_hint
2650      */
2651     if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )
2652     {
2653         if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2654             ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2655         {
2656             /* Current message is probably either
2657              * CertificateRequest or ServerHelloDone */
2658             ssl->keep_current_message = 1;
2659             goto exit;
2660         }
2661
2662         MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key exchange message must "
2663                                     "not be skipped" ) );
2664         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2665                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
2666
2667         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
2668     }
2669
2670 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
2671     if( ssl->handshake->ecrs_enabled )
2672         ssl->handshake->ecrs_state = ssl_ecrs_ske_start_processing;
2673
2674 start_processing:
2675 #endif
2676     p   = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
2677     end = ssl->in_msg + ssl->in_hslen;
2678     MBEDTLS_SSL_DEBUG_BUF( 3,   "server key exchange", p, end - p );
2679
2680 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
2681     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2682         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
2683         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2684         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
2685     {
2686         if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )
2687         {
2688             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2689             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2690                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
2691             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2692         }
2693     } /* FALLTROUGH */
2694 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
2695
2696 #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) ||                       \
2697     defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
2698     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2699         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
2700         ; /* nothing more to do */
2701     else
2702 #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
2703           MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
2704 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \
2705     defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
2706     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
2707         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
2708     {
2709         if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )
2710         {
2711             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2712             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2713                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
2714             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2715         }
2716     }
2717     else
2718 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2719           MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
2720 #if defined(MBEDTLS_USE_PSA_CRYPTO) &&                           \
2721         ( defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||     \
2722           defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) )
2723     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
2724         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
2725     {
2726         if( ssl_parse_server_ecdh_params_psa( ssl, &p, end ) != 0 )
2727         {
2728             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2729             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2730                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
2731             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2732         }
2733     }
2734     else
2735 #endif /* MBEDTLS_USE_PSA_CRYPTO &&
2736             ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2737               MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */
2738 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \
2739     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) ||                     \
2740     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
2741     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
2742         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
2743         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
2744     {
2745         if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )
2746         {
2747             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2748             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2749                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
2750             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2751         }
2752     }
2753     else
2754 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2755           MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2756           MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
2757 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2758     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
2759     {
2760         ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,
2761                                               p, end - p );
2762         if( ret != 0 )
2763         {
2764             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret );
2765             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2766                                             MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
2767             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2768         }
2769     }
2770     else
2771 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2772     {
2773         MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2774         return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2775     }
2776
2777 #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)
2778     if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) )
2779     {
2780         size_t sig_len, hashlen;
2781         unsigned char hash[64];
2782         mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
2783         mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
2784         unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
2785         size_t params_len = p - params;
2786         void *rs_ctx = NULL;
2787
2788         mbedtls_pk_context * peer_pk;
2789
2790         /*
2791          * Handle the digitally-signed structure
2792          */
2793 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2794         if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
2795         {
2796             if( ssl_parse_signature_algorithm( ssl, &p, end,
2797                                                &md_alg, &pk_alg ) != 0 )
2798             {
2799                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2800                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2801                                                 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
2802                 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2803             }
2804
2805             if( pk_alg != mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )
2806             {
2807                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2808                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2809                                                 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );
2810                 return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2811             }
2812         }
2813         else
2814 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
2815 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2816     defined(MBEDTLS_SSL_PROTO_TLS1_1)
2817         if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )
2818         {
2819             pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );
2820
2821             /* Default hash for ECDSA is SHA-1 */
2822             if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE )
2823                 md_alg = MBEDTLS_MD_SHA1;
2824         }
2825         else
2826 #endif
2827         {
2828             MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2829             return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2830         }
2831
2832         /*
2833          * Read signature
2834          */
2835
2836         if( p > end - 2 )
2837         {
2838             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2839             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2840                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
2841             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2842         }
2843         sig_len = ( p[0] << 8 ) | p[1];
2844         p += 2;
2845
2846         if( p != end - sig_len )
2847         {
2848             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2849             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2850                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
2851             return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
2852         }
2853
2854         MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len );
2855
2856         /*
2857          * Compute the hash that has been signed
2858          */
2859 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
2860     defined(MBEDTLS_SSL_PROTO_TLS1_1)
2861         if( md_alg == MBEDTLS_MD_NONE )
2862         {
2863             hashlen = 36;
2864             ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash, params,
2865                                                            params_len );
2866             if( ret != 0 )
2867                 return( ret );
2868         }
2869         else
2870 #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
2871           MBEDTLS_SSL_PROTO_TLS1_1 */
2872 #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \
2873     defined(MBEDTLS_SSL_PROTO_TLS1_2)
2874         if( md_alg != MBEDTLS_MD_NONE )
2875         {
2876             ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, &hashlen,
2877                                                           params, params_len,
2878                                                           md_alg );
2879             if( ret != 0 )
2880                 return( ret );
2881         }
2882         else
2883 #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \
2884           MBEDTLS_SSL_PROTO_TLS1_2 */
2885         {
2886             MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2887             return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2888         }
2889
2890         MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen );
2891
2892 #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2893         peer_pk = &ssl->handshake->peer_pubkey;
2894 #else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2895         if( ssl->session_negotiate->peer_cert == NULL )
2896         {
2897             /* Should never happen */
2898             MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2899             return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2900         }
2901         peer_pk = &ssl->session_negotiate->peer_cert->pk;
2902 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2903
2904         /*
2905          * Verify signature
2906          */
2907         if( !mbedtls_pk_can_do( peer_pk, pk_alg ) )
2908         {
2909             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
2910             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2911                                             MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );
2912             return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );
2913         }
2914
2915 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
2916         if( ssl->handshake->ecrs_enabled )
2917             rs_ctx = &ssl->handshake->ecrs_ctx.pk;
2918 #endif
2919
2920         if( ( ret = mbedtls_pk_verify_restartable( peer_pk,
2921                         md_alg, hash, hashlen, p, sig_len, rs_ctx ) ) != 0 )
2922         {
2923 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
2924             if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS )
2925 #endif
2926                 mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2927                                                 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );
2928             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret );
2929 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
2930             if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
2931                 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
2932 #endif
2933             return( ret );
2934         }
2935
2936 #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2937         /* We don't need the peer's public key anymore. Free it,
2938          * so that more RAM is available for upcoming expensive
2939          * operations like ECDHE. */
2940         mbedtls_pk_free( peer_pk );
2941 #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2942     }
2943 #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */
2944
2945 exit:
2946     ssl->state++;
2947
2948     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
2949
2950     return( 0 );
2951 }
2952
2953 #if ! defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED)
2954 static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
2955 {
2956     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2957         ssl->handshake->ciphersuite_info;
2958
2959     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
2960
2961     if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
2962     {
2963         MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
2964         ssl->state++;
2965         return( 0 );
2966     }
2967
2968     MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
2969     return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
2970 }
2971 #else /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
2972 static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )
2973 {
2974     int ret;
2975     unsigned char *buf;
2976     size_t n = 0;
2977     size_t cert_type_len = 0, dn_len = 0;
2978     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2979         ssl->handshake->ciphersuite_info;
2980
2981     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
2982
2983     if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
2984     {
2985         MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) );
2986         ssl->state++;
2987         return( 0 );
2988     }
2989
2990     if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
2991     {
2992         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
2993         return( ret );
2994     }
2995
2996     if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
2997     {
2998         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
2999         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3000                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
3001         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3002     }
3003
3004     ssl->state++;
3005     ssl->client_auth = ( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST );
3006
3007     MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request",
3008                         ssl->client_auth ? "a" : "no" ) );
3009
3010     if( ssl->client_auth == 0 )
3011     {
3012         /* Current message is probably the ServerHelloDone */
3013         ssl->keep_current_message = 1;
3014         goto exit;
3015     }
3016
3017     /*
3018      *  struct {
3019      *      ClientCertificateType certificate_types<1..2^8-1>;
3020      *      SignatureAndHashAlgorithm
3021      *        supported_signature_algorithms<2^16-1>; -- TLS 1.2 only
3022      *      DistinguishedName certificate_authorities<0..2^16-1>;
3023      *  } CertificateRequest;
3024      *
3025      *  Since we only support a single certificate on clients, let's just
3026      *  ignore all the information that's supposed to help us pick a
3027      *  certificate.
3028      *
3029      *  We could check that our certificate matches the request, and bail out
3030      *  if it doesn't, but it's simpler to just send the certificate anyway,
3031      *  and give the server the opportunity to decide if it should terminate
3032      *  the connection when it doesn't like our certificate.
3033      *
3034      *  Same goes for the hash in TLS 1.2's signature_algorithms: at this
3035      *  point we only have one hash available (see comments in
3036      *  write_certificate_verify), so let's just use what we have.
3037      *
3038      *  However, we still minimally parse the message to check it is at least
3039      *  superficially sane.
3040      */
3041     buf = ssl->in_msg;
3042
3043     /* certificate_types */
3044     if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) )
3045     {
3046         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
3047         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3048                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
3049         return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
3050     }
3051     cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )];
3052     n = cert_type_len;
3053
3054     /*
3055      * In the subsequent code there are two paths that read from buf:
3056      *     * the length of the signature algorithms field (if minor version of
3057      *       SSL is 3),
3058      *     * distinguished name length otherwise.
3059      * Both reach at most the index:
3060      *    ...hdr_len + 2 + n,
3061      * therefore the buffer length at this point must be greater than that
3062      * regardless of the actual code path.
3063      */
3064     if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )
3065     {
3066         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
3067         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3068                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
3069         return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
3070     }
3071
3072     /* supported_signature_algorithms */
3073 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3074     if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
3075     {
3076         size_t sig_alg_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] <<  8 )
3077                              | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n]       ) );
3078 #if defined(MBEDTLS_DEBUG_C)
3079         unsigned char* sig_alg;
3080         size_t i;
3081 #endif
3082
3083         /*
3084          * The furthest access in buf is in the loop few lines below:
3085          *     sig_alg[i + 1],
3086          * where:
3087          *     sig_alg = buf + ...hdr_len + 3 + n,
3088          *     max(i) = sig_alg_len - 1.
3089          * Therefore the furthest access is:
3090          *     buf[...hdr_len + 3 + n + sig_alg_len - 1 + 1],
3091          * which reduces to:
3092          *     buf[...hdr_len + 3 + n + sig_alg_len],
3093          * which is one less than we need the buf to be.
3094          */
3095         if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n + sig_alg_len )
3096         {
3097             MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
3098             mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3099                                             MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
3100             return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
3101         }
3102
3103 #if defined(MBEDTLS_DEBUG_C)
3104         sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n;
3105         for( i = 0; i < sig_alg_len; i += 2 )
3106         {
3107             MBEDTLS_SSL_DEBUG_MSG( 3, ( "Supported Signature Algorithm found: %d"
3108                                         ",%d", sig_alg[i], sig_alg[i + 1]  ) );
3109         }
3110 #endif
3111
3112         n += 2 + sig_alg_len;
3113     }
3114 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3115
3116     /* certificate_authorities */
3117     dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] <<  8 )
3118              | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n]       ) );
3119
3120     n += dn_len;
3121     if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n )
3122     {
3123         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
3124         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3125                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
3126         return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );
3127     }
3128
3129 exit:
3130     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
3131
3132     return( 0 );
3133 }
3134 #endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
3135
3136 static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl )
3137 {
3138     int ret;
3139
3140     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
3141
3142     if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
3143     {
3144         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3145         return( ret );
3146     }
3147
3148     if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3149     {
3150         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
3151         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3152     }
3153
3154     if( ssl->in_hslen  != mbedtls_ssl_hs_hdr_len( ssl ) ||
3155         ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE )
3156     {
3157         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
3158         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3159                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
3160         return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
3161     }
3162
3163     ssl->state++;
3164
3165 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3166     if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
3167         mbedtls_ssl_recv_flight_completed( ssl );
3168 #endif
3169
3170     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
3171
3172     return( 0 );
3173 }
3174
3175 static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )
3176 {
3177     int ret;
3178
3179     size_t header_len;
3180     size_t content_len;
3181     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3182         ssl->handshake->ciphersuite_info;
3183
3184     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
3185
3186 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
3187     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )
3188     {
3189         /*
3190          * DHM key exchange -- send G^X mod P
3191          */
3192         content_len = ssl->handshake->dhm_ctx.len;
3193
3194         ssl->out_msg[4] = (unsigned char)( content_len >> 8 );
3195         ssl->out_msg[5] = (unsigned char)( content_len      );
3196         header_len = 6;
3197
3198         ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
3199                            (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
3200                            &ssl->out_msg[header_len], content_len,
3201                            ssl->conf->f_rng, ssl->conf->p_rng );
3202         if( ret != 0 )
3203         {
3204             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
3205             return( ret );
3206         }
3207
3208         MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X  );
3209         MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX );
3210
3211         if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,
3212                                    ssl->handshake->premaster,
3213                                    MBEDTLS_PREMASTER_SIZE,
3214                                    &ssl->handshake->pmslen,
3215                                    ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
3216         {
3217             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret );
3218             return( ret );
3219         }
3220
3221         MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K  );
3222     }
3223     else
3224 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
3225 #if defined(MBEDTLS_USE_PSA_CRYPTO) &&                           \
3226         ( defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||     \
3227           defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) )
3228     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3229         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )
3230     {
3231         psa_status_t status;
3232         psa_key_policy_t policy;
3233
3234         mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3235
3236         unsigned char own_pubkey[MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH];
3237         size_t own_pubkey_len;
3238         unsigned char *own_pubkey_ecpoint;
3239         size_t own_pubkey_ecpoint_len;
3240
3241         psa_crypto_generator_t generator = PSA_CRYPTO_GENERATOR_INIT;
3242
3243         header_len = 4;
3244
3245         MBEDTLS_SSL_DEBUG_MSG( 1, ( "Perform PSA-based ECDH computation." ) );
3246
3247         /*
3248          * Generate EC private key for ECDHE exchange.
3249          */
3250
3251         /* Allocate a new key slot for the private key. */
3252
3253         status = psa_allocate_key( &handshake->ecdh_psa_privkey );
3254         if( status != PSA_SUCCESS )
3255             return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3256
3257         /* The master secret is obtained from the shared ECDH secret by
3258          * applying the TLS 1.2 PRF with a specific salt and label. While
3259          * the PSA Crypto API encourages combining key agreement schemes
3260          * such as ECDH with fixed KDFs such as TLS 1.2 PRF, it does not
3261          * yet support the provisioning of salt + label to the KDF.
3262          * For the time being, we therefore need to split the computation
3263          * of the ECDH secret and the application of the TLS 1.2 PRF. */
3264         policy = psa_key_policy_init();
3265         psa_key_policy_set_usage( &policy,
3266                                   PSA_KEY_USAGE_DERIVE,
3267                                   PSA_ALG_ECDH( PSA_ALG_SELECT_RAW ) );
3268         status = psa_set_key_policy( handshake->ecdh_psa_privkey, &policy );
3269         if( status != PSA_SUCCESS )
3270             return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3271
3272         /* Generate ECDH private key. */
3273         status = psa_generate_key( handshake->ecdh_psa_privkey,
3274                           PSA_KEY_TYPE_ECC_KEYPAIR( handshake->ecdh_psa_curve ),
3275                           MBEDTLS_PSA_ECC_KEY_BITS_OF_CURVE( handshake->ecdh_psa_curve ),
3276                           NULL, 0 );
3277         if( status != PSA_SUCCESS )
3278             return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3279
3280         /* Export the public part of the ECDH private key from PSA
3281          * and convert it to ECPoint format used in ClientKeyExchange. */
3282         status = psa_export_public_key( handshake->ecdh_psa_privkey,
3283                                         own_pubkey, sizeof( own_pubkey ),
3284                                         &own_pubkey_len );
3285         if( status != PSA_SUCCESS )
3286             return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3287
3288         if( mbedtls_psa_tls_psa_ec_to_ecpoint( own_pubkey,
3289                                                own_pubkey_len,
3290                                                &own_pubkey_ecpoint,
3291                                                &own_pubkey_ecpoint_len ) != 0 )
3292         {
3293             return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3294         }
3295
3296         /* Copy ECPoint structure to outgoing message buffer. */
3297         ssl->out_msg[header_len] = (unsigned char) own_pubkey_ecpoint_len;
3298         memcpy( ssl->out_msg + header_len + 1,
3299                 own_pubkey_ecpoint, own_pubkey_ecpoint_len );
3300         content_len = own_pubkey_ecpoint_len + 1;
3301
3302         /* Compute ECDH shared secret. */
3303         status = psa_key_agreement( &generator,
3304                                     handshake->ecdh_psa_privkey,
3305                                     handshake->ecdh_psa_peerkey,
3306                                     handshake->ecdh_psa_peerkey_len,
3307                                     PSA_ALG_ECDH( PSA_ALG_SELECT_RAW ) );
3308         if( status != PSA_SUCCESS )
3309             return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3310
3311         /* The ECDH secret is the premaster secret used for key derivation. */
3312
3313         ssl->handshake->pmslen =
3314             MBEDTLS_PSA_ECC_KEY_BYTES_OF_CURVE( handshake->ecdh_psa_curve );
3315
3316         status = psa_generator_read( &generator,
3317                                      ssl->handshake->premaster,
3318                                      ssl->handshake->pmslen );
3319         if( status != PSA_SUCCESS )
3320         {
3321             psa_generator_abort( &generator );
3322             return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3323         }
3324
3325         status = psa_generator_abort( &generator );
3326         if( status != PSA_SUCCESS )
3327             return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3328
3329         status = psa_destroy_key( handshake->ecdh_psa_privkey );
3330         if( status != PSA_SUCCESS )
3331             return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );
3332         handshake->ecdh_psa_privkey = 0;
3333     }
3334     else
3335 #endif /* MBEDTLS_USE_PSA_CRYPTO &&
3336             ( MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3337               MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ) */
3338 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \
3339     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) ||                   \
3340     defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||                      \
3341     defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
3342     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3343         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3344         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
3345         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )
3346     {
3347         /*
3348          * ECDH key exchange -- send client public value
3349          */
3350         header_len = 4;
3351
3352 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3353         if( ssl->handshake->ecrs_enabled )
3354         {
3355             if( ssl->handshake->ecrs_state == ssl_ecrs_cke_ecdh_calc_secret )
3356                 goto ecdh_calc_secret;
3357
3358             mbedtls_ecdh_enable_restart( &ssl->handshake->ecdh_ctx );
3359         }
3360 #endif
3361
3362         ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
3363                                 &content_len,
3364                                 &ssl->out_msg[header_len], 1000,
3365                                 ssl->conf->f_rng, ssl->conf->p_rng );
3366         if( ret != 0 )
3367         {
3368             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
3369 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3370             if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3371                 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3372 #endif
3373             return( ret );
3374         }
3375
3376         MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3377                                 MBEDTLS_DEBUG_ECDH_Q );
3378
3379 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3380         if( ssl->handshake->ecrs_enabled )
3381         {
3382             ssl->handshake->ecrs_n = content_len;
3383             ssl->handshake->ecrs_state = ssl_ecrs_cke_ecdh_calc_secret;
3384         }
3385
3386 ecdh_calc_secret:
3387         if( ssl->handshake->ecrs_enabled )
3388             content_len = ssl->handshake->ecrs_n;
3389 #endif
3390         if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,
3391                                    &ssl->handshake->pmslen,
3392                                    ssl->handshake->premaster,
3393                                    MBEDTLS_MPI_MAX_SIZE,
3394                                    ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )
3395         {
3396             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret );
3397 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3398             if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3399                 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3400 #endif
3401             return( ret );
3402         }
3403
3404         MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3405                                 MBEDTLS_DEBUG_ECDH_Z );
3406     }
3407     else
3408 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3409           MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3410           MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3411           MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3412 #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)
3413     if( mbedtls_ssl_ciphersuite_uses_psk( ciphersuite_info ) )
3414     {
3415         /*
3416          * opaque psk_identity<0..2^16-1>;
3417          */
3418         if( ssl_conf_has_static_psk( ssl->conf ) == 0 )
3419         {
3420             /* We don't offer PSK suites if we don't have a PSK,
3421              * and we check that the server's choice is among the
3422              * ciphersuites we offered, so this should never happen. */
3423             return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3424         }
3425
3426         header_len = 4;
3427         content_len = ssl->conf->psk_identity_len;
3428
3429         if( header_len + 2 + content_len > MBEDTLS_SSL_OUT_CONTENT_LEN )
3430         {
3431             MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity too long or "
3432                                         "SSL buffer too short" ) );
3433             return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3434         }
3435
3436         ssl->out_msg[header_len++] = (unsigned char)( content_len >> 8 );
3437         ssl->out_msg[header_len++] = (unsigned char)( content_len      );
3438
3439         memcpy( ssl->out_msg + header_len,
3440                 ssl->conf->psk_identity,
3441                 ssl->conf->psk_identity_len );
3442         header_len += ssl->conf->psk_identity_len;
3443
3444 #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
3445         if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )
3446         {
3447             content_len = 0;
3448         }
3449         else
3450 #endif
3451 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
3452         if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )
3453         {
3454 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3455             /* Opaque PSKs are currently only supported for PSK-only suites. */
3456             if( ssl_conf_has_static_raw_psk( ssl->conf ) == 0 )
3457                 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3458 #endif /* MBEDTLS_USE_PSA_CRYPTO */
3459
3460             if( ( ret = ssl_write_encrypted_pms( ssl, header_len,
3461                                                  &content_len, 2 ) ) != 0 )
3462                 return( ret );
3463         }
3464         else
3465 #endif
3466 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3467         if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )
3468         {
3469 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3470             /* Opaque PSKs are currently only supported for PSK-only suites. */
3471             if( ssl_conf_has_static_raw_psk( ssl->conf ) == 0 )
3472                 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3473 #endif /* MBEDTLS_USE_PSA_CRYPTO */
3474
3475             /*
3476              * ClientDiffieHellmanPublic public (DHM send G^X mod P)
3477              */
3478             content_len = ssl->handshake->dhm_ctx.len;
3479
3480             if( header_len + 2 + content_len >
3481                 MBEDTLS_SSL_OUT_CONTENT_LEN )
3482             {
3483                 MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity or DHM size too long"
3484                                             " or SSL buffer too short" ) );
3485                 return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );
3486             }
3487
3488             ssl->out_msg[header_len++] = (unsigned char)( content_len >> 8 );
3489             ssl->out_msg[header_len++] = (unsigned char)( content_len      );
3490
3491             ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,
3492                     (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),
3493                     &ssl->out_msg[header_len], content_len,
3494                     ssl->conf->f_rng, ssl->conf->p_rng );
3495             if( ret != 0 )
3496             {
3497                 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret );
3498                 return( ret );
3499             }
3500         }
3501         else
3502 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
3503 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
3504         if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )
3505         {
3506 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3507             /* Opaque PSKs are currently only supported for PSK-only suites. */
3508             if( ssl_conf_has_static_raw_psk( ssl->conf ) == 0 )
3509                 return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );
3510 #endif /* MBEDTLS_USE_PSA_CRYPTO */
3511
3512             /*
3513              * ClientECDiffieHellmanPublic public;
3514              */
3515             ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,
3516                     &content_len,
3517                     &ssl->out_msg[header_len],
3518                     MBEDTLS_SSL_OUT_CONTENT_LEN - header_len,
3519                     ssl->conf->f_rng, ssl->conf->p_rng );
3520             if( ret != 0 )
3521             {
3522                 MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret );
3523                 return( ret );
3524             }
3525
3526             MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx,
3527                                     MBEDTLS_DEBUG_ECDH_Q );
3528         }
3529         else
3530 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
3531         {
3532             MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3533             return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3534         }
3535
3536 #if defined(MBEDTLS_USE_PSA_CRYPTO) &&          \
3537     defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
3538         if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK &&
3539             ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
3540             ssl_conf_has_static_raw_psk( ssl->conf ) == 0 )
3541         {
3542             MBEDTLS_SSL_DEBUG_MSG( 1, ( "skip PMS generation for opaque PSK" ) );
3543         }
3544         else
3545 #endif /* MBEDTLS_USE_PSA_CRYPTO &&
3546           MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3547         if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,
3548                         ciphersuite_info->key_exchange ) ) != 0 )
3549         {
3550             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret );
3551             return( ret );
3552         }
3553     }
3554     else
3555 #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */
3556 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
3557     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )
3558     {
3559         header_len = 4;
3560         if( ( ret = ssl_write_encrypted_pms( ssl, header_len,
3561                                              &content_len, 0 ) ) != 0 )
3562             return( ret );
3563     }
3564     else
3565 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
3566 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
3567     if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )
3568     {
3569         header_len = 4;
3570
3571         ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,
3572                 ssl->out_msg + header_len,
3573                 MBEDTLS_SSL_OUT_CONTENT_LEN - header_len,
3574                 &content_len,
3575                 ssl->conf->f_rng, ssl->conf->p_rng );
3576         if( ret != 0 )
3577         {
3578             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret );
3579             return( ret );
3580         }
3581
3582         ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,
3583                 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
3584                 ssl->conf->f_rng, ssl->conf->p_rng );
3585         if( ret != 0 )
3586         {
3587             MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret );
3588             return( ret );
3589         }
3590     }
3591     else
3592 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
3593     {
3594         ((void) ciphersuite_info);
3595         MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3596         return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3597     }
3598
3599     ssl->out_msglen  = header_len + content_len;
3600     ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3601     ssl->out_msg[0]  = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;
3602
3603     ssl->state++;
3604
3605     if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
3606     {
3607         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
3608         return( ret );
3609     }
3610
3611     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
3612
3613     return( 0 );
3614 }
3615
3616 #if !defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED)
3617 static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
3618 {
3619     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3620         ssl->handshake->ciphersuite_info;
3621     int ret;
3622
3623     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
3624
3625     if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
3626     {
3627         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
3628         return( ret );
3629     }
3630
3631     if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
3632     {
3633         MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
3634         ssl->state++;
3635         return( 0 );
3636     }
3637
3638     MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3639     return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3640 }
3641 #else /* !MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
3642 static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )
3643 {
3644     int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
3645     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3646         ssl->handshake->ciphersuite_info;
3647     size_t n = 0, offset = 0;
3648     unsigned char hash[48];
3649     unsigned char *hash_start = hash;
3650     mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
3651     unsigned int hashlen;
3652     void *rs_ctx = NULL;
3653
3654     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
3655
3656 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3657     if( ssl->handshake->ecrs_enabled &&
3658         ssl->handshake->ecrs_state == ssl_ecrs_crt_vrfy_sign )
3659     {
3660         goto sign;
3661     }
3662 #endif
3663
3664     if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )
3665     {
3666         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret );
3667         return( ret );
3668     }
3669
3670     if( !mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )
3671     {
3672         MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
3673         ssl->state++;
3674         return( 0 );
3675     }
3676
3677     if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL )
3678     {
3679         MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
3680         ssl->state++;
3681         return( 0 );
3682     }
3683
3684     if( mbedtls_ssl_own_key( ssl ) == NULL )
3685     {
3686         MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) );
3687         return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );
3688     }
3689
3690     /*
3691      * Make a signature of the handshake digests
3692      */
3693 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3694     if( ssl->handshake->ecrs_enabled )
3695         ssl->handshake->ecrs_state = ssl_ecrs_crt_vrfy_sign;
3696
3697 sign:
3698 #endif
3699
3700     ssl->handshake->calc_verify( ssl, hash );
3701
3702 #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \
3703     defined(MBEDTLS_SSL_PROTO_TLS1_1)
3704     if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )
3705     {
3706         /*
3707          * digitally-signed struct {
3708          *     opaque md5_hash[16];
3709          *     opaque sha_hash[20];
3710          * };
3711          *
3712          * md5_hash
3713          *     MD5(handshake_messages);
3714          *
3715          * sha_hash
3716          *     SHA(handshake_messages);
3717          */
3718         hashlen = 36;
3719         md_alg = MBEDTLS_MD_NONE;
3720
3721         /*
3722          * For ECDSA, default hash is SHA-1 only
3723          */
3724         if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) )
3725         {
3726             hash_start += 16;
3727             hashlen -= 16;
3728             md_alg = MBEDTLS_MD_SHA1;
3729         }
3730     }
3731     else
3732 #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \
3733           MBEDTLS_SSL_PROTO_TLS1_1 */
3734 #if defined(MBEDTLS_SSL_PROTO_TLS1_2)
3735     if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )
3736     {
3737         /*
3738          * digitally-signed struct {
3739          *     opaque handshake_messages[handshake_messages_length];
3740          * };
3741          *
3742          * Taking shortcut here. We assume that the server always allows the
3743          * PRF Hash function and has sent it in the allowed signature
3744          * algorithms list received in the Certificate Request message.
3745          *
3746          * Until we encounter a server that does not, we will take this
3747          * shortcut.
3748          *
3749          * Reason: Otherwise we should have running hashes for SHA512 and SHA224
3750          *         in order to satisfy 'weird' needs from the server side.
3751          */
3752         if( ssl->handshake->ciphersuite_info->mac == MBEDTLS_MD_SHA384 )
3753         {
3754             md_alg = MBEDTLS_MD_SHA384;
3755             ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;
3756         }
3757         else
3758         {
3759             md_alg = MBEDTLS_MD_SHA256;
3760             ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;
3761         }
3762         ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );
3763
3764         /* Info from md_alg will be used instead */
3765         hashlen = 0;
3766         offset = 2;
3767     }
3768     else
3769 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
3770     {
3771         MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) );
3772         return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );
3773     }
3774
3775 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3776     if( ssl->handshake->ecrs_enabled )
3777         rs_ctx = &ssl->handshake->ecrs_ctx.pk;
3778 #endif
3779
3780     if( ( ret = mbedtls_pk_sign_restartable( mbedtls_ssl_own_key( ssl ),
3781                          md_alg, hash_start, hashlen,
3782                          ssl->out_msg + 6 + offset, &n,
3783                          ssl->conf->f_rng, ssl->conf->p_rng, rs_ctx ) ) != 0 )
3784     {
3785         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret );
3786 #if defined(MBEDTLS_SSL__ECP_RESTARTABLE)
3787         if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS )
3788             ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
3789 #endif
3790         return( ret );
3791     }
3792
3793     ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );
3794     ssl->out_msg[5 + offset] = (unsigned char)( n      );
3795
3796     ssl->out_msglen  = 6 + n + offset;
3797     ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3798     ssl->out_msg[0]  = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;
3799
3800     ssl->state++;
3801
3802     if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 )
3803     {
3804         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret );
3805         return( ret );
3806     }
3807
3808     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
3809
3810     return( ret );
3811 }
3812 #endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */
3813
3814 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
3815 static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl )
3816 {
3817     int ret;
3818     uint32_t lifetime;
3819     size_t ticket_len;
3820     unsigned char *ticket;
3821     const unsigned char *msg;
3822
3823     MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) );
3824
3825     if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 )
3826     {
3827         MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret );
3828         return( ret );
3829     }
3830
3831     if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )
3832     {
3833         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
3834         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3835                                         MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );
3836         return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );
3837     }
3838
3839     /*
3840      * struct {
3841      *     uint32 ticket_lifetime_hint;
3842      *     opaque ticket<0..2^16-1>;
3843      * } NewSessionTicket;
3844      *
3845      * 0  .  3   ticket_lifetime_hint
3846      * 4  .  5   ticket_len (n)
3847      * 6  .  5+n ticket content
3848      */
3849     if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||
3850         ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) )
3851     {
3852         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
3853         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3854                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
3855         return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
3856     }
3857
3858     msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );
3859
3860     lifetime = ( ((uint32_t) msg[0]) << 24 ) | ( msg[1] << 16 ) |
3861                ( msg[2] << 8 ) | ( msg[3] );
3862
3863     ticket_len = ( msg[4] << 8 ) | ( msg[5] );
3864
3865     if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen )
3866     {
3867         MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) );
3868         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3869                                         MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );
3870         return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );
3871     }
3872
3873     MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) );
3874
3875     /* We're not waiting for a NewSessionTicket message any more */
3876     ssl->handshake->new_session_ticket = 0;
3877     ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
3878
3879     /*
3880      * Zero-length ticket means the server changed his mind and doesn't want
3881      * to send a ticket after all, so just forget it
3882      */
3883     if( ticket_len == 0 )
3884         return( 0 );
3885
3886     if( ssl->session != NULL && ssl->session->ticket != NULL )
3887     {
3888         mbedtls_platform_zeroize( ssl->session->ticket,
3889                                   ssl->session->ticket_len );
3890         mbedtls_free( ssl->session->ticket );
3891         ssl->session->ticket = NULL;
3892         ssl->session->ticket_len = 0;
3893     }
3894
3895     mbedtls_platform_zeroize( ssl->session_negotiate->ticket,
3896                               ssl->session_negotiate->ticket_len );
3897     mbedtls_free( ssl->session_negotiate->ticket );
3898     ssl->session_negotiate->ticket = NULL;
3899     ssl->session_negotiate->ticket_len = 0;
3900
3901     if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )
3902     {
3903         MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) );
3904         mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3905                                         MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );
3906         return( MBEDTLS_ERR_SSL_ALLOC_FAILED );
3907     }
3908
3909     memcpy( ticket, msg + 6, ticket_len );
3910
3911     ssl->session_negotiate->ticket = ticket;
3912     ssl->session_negotiate->ticket_len = ticket_len;
3913     ssl->session_negotiate->ticket_lifetime = lifetime;
3914
3915     /*
3916      * RFC 5077 section 3.4:
3917      * "If the client receives a session ticket from the server, then it
3918      * discards any Session ID that was sent in the ServerHello."
3919      */
3920     MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) );
3921     ssl->session_negotiate->id_len = 0;
3922
3923     MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) );
3924
3925     return( 0 );
3926 }
3927 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
3928
3929 /*
3930  * SSL handshake -- client side -- single step
3931  */
3932 int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )
3933 {
3934     int ret = 0;
3935
3936     if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )
3937         return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
3938
3939     MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
3940
3941     if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )
3942         return( ret );
3943
3944 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3945     if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3946         ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )
3947     {
3948         if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 )
3949             return( ret );
3950     }
3951 #endif /* MBEDTLS_SSL_PROTO_DTLS */
3952
3953     /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
3954      * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
3955 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
3956     if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
3957         ssl->handshake->new_session_ticket != 0 )
3958     {
3959         ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET;
3960     }
3961 #endif
3962
3963     switch( ssl->state )
3964     {
3965         case MBEDTLS_SSL_HELLO_REQUEST:
3966             ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
3967             break;
3968
3969        /*
3970         *  ==>   ClientHello
3971         */
3972        case MBEDTLS_SSL_CLIENT_HELLO:
3973            ret = ssl_write_client_hello( ssl );
3974            break;
3975
3976        /*
3977         *  <==   ServerHello
3978         *        Certificate
3979         *      ( ServerKeyExchange  )
3980         *      ( CertificateRequest )
3981         *        ServerHelloDone
3982         */
3983        case MBEDTLS_SSL_SERVER_HELLO:
3984            ret = ssl_parse_server_hello( ssl );
3985            break;
3986
3987        case MBEDTLS_SSL_SERVER_CERTIFICATE:
3988            ret = mbedtls_ssl_parse_certificate( ssl );
3989            break;
3990
3991        case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
3992            ret = ssl_parse_server_key_exchange( ssl );
3993            break;
3994
3995        case MBEDTLS_SSL_CERTIFICATE_REQUEST:
3996            ret = ssl_parse_certificate_request( ssl );
3997            break;
3998
3999        case MBEDTLS_SSL_SERVER_HELLO_DONE:
4000            ret = ssl_parse_server_hello_done( ssl );
4001            break;
4002
4003        /*
4004         *  ==> ( Certificate/Alert  )
4005         *        ClientKeyExchange
4006         *      ( CertificateVerify  )
4007         *        ChangeCipherSpec
4008         *        Finished
4009         */
4010        case MBEDTLS_SSL_CLIENT_CERTIFICATE:
4011            ret = mbedtls_ssl_write_certificate( ssl );
4012            break;
4013
4014        case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
4015            ret = ssl_write_client_key_exchange( ssl );
4016            break;
4017
4018        case MBEDTLS_SSL_CERTIFICATE_VERIFY:
4019            ret = ssl_write_certificate_verify( ssl );
4020            break;
4021
4022        case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
4023            ret = mbedtls_ssl_write_change_cipher_spec( ssl );
4024            break;
4025
4026        case MBEDTLS_SSL_CLIENT_FINISHED:
4027            ret = mbedtls_ssl_write_finished( ssl );
4028            break;
4029
4030        /*
4031         *  <==   ( NewSessionTicket )
4032         *        ChangeCipherSpec
4033         *        Finished
4034         */
4035 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
4036        case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:
4037            ret = ssl_parse_new_session_ticket( ssl );
4038            break;
4039 #endif
4040
4041        case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4042            ret = mbedtls_ssl_parse_change_cipher_spec( ssl );
4043            break;
4044
4045        case MBEDTLS_SSL_SERVER_FINISHED:
4046            ret = mbedtls_ssl_parse_finished( ssl );
4047            break;
4048
4049        case MBEDTLS_SSL_FLUSH_BUFFERS:
4050            MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
4051            ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
4052            break;
4053
4054        case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
4055            mbedtls_ssl_handshake_wrapup( ssl );
4056            break;
4057
4058        default:
4059            MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
4060            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );
4061    }
4062
4063     return( ret );
4064 }
4065 #endif /* MBEDTLS_SSL_CLI_C */