1 /*
2  *  TLS server-side functions
3  *
4  *  Copyright The Mbed TLS Contributors
5  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6  */
7 
8 #include "common.h"
9 
10 #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
11 
12 #include "mbedtls/platform.h"
13 
14 #include "mbedtls/ssl.h"
15 #include "ssl_misc.h"
16 #include "debug_internal.h"
17 #include "mbedtls/error.h"
18 #include "mbedtls/platform_util.h"
19 #include "constant_time_internal.h"
20 #include "mbedtls/constant_time.h"
21 
22 #include <string.h>
23 
24 #if defined(MBEDTLS_USE_PSA_CRYPTO)
25 /* Define a local translating function to save code size by not using too many
26  * arguments in each translating place. */
27 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED) || \
28     defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
local_err_translation(psa_status_t status)29 static int local_err_translation(psa_status_t status)
30 {
31     return psa_status_to_mbedtls(status, psa_to_ssl_errors,
32                                  ARRAY_LENGTH(psa_to_ssl_errors),
33                                  psa_generic_status_to_mbedtls);
34 }
35 #define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
36 #endif
37 #endif
38 
39 #if defined(MBEDTLS_ECP_C)
40 #include "mbedtls/ecp.h"
41 #endif
42 
43 #if defined(MBEDTLS_HAVE_TIME)
44 #include "mbedtls/platform_time.h"
45 #endif
46 
47 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context * ssl,const unsigned char * info,size_t ilen)48 int mbedtls_ssl_set_client_transport_id(mbedtls_ssl_context *ssl,
49                                         const unsigned char *info,
50                                         size_t ilen)
51 {
52     if (ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER) {
53         return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
54     }
55 
56     mbedtls_free(ssl->cli_id);
57 
58     if ((ssl->cli_id = mbedtls_calloc(1, ilen)) == NULL) {
59         return MBEDTLS_ERR_SSL_ALLOC_FAILED;
60     }
61 
62     memcpy(ssl->cli_id, info, ilen);
63     ssl->cli_id_len = ilen;
64 
65     return 0;
66 }
67 
mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config * conf,mbedtls_ssl_cookie_write_t * f_cookie_write,mbedtls_ssl_cookie_check_t * f_cookie_check,void * p_cookie)68 void mbedtls_ssl_conf_dtls_cookies(mbedtls_ssl_config *conf,
69                                    mbedtls_ssl_cookie_write_t *f_cookie_write,
70                                    mbedtls_ssl_cookie_check_t *f_cookie_check,
71                                    void *p_cookie)
72 {
73     conf->f_cookie_write = f_cookie_write;
74     conf->f_cookie_check = f_cookie_check;
75     conf->p_cookie       = p_cookie;
76 }
77 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
78 
79 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
80 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_conf_has_psk_or_cb(mbedtls_ssl_config const * conf)81 static int ssl_conf_has_psk_or_cb(mbedtls_ssl_config const *conf)
82 {
83     if (conf->f_psk != NULL) {
84         return 1;
85     }
86 
87     if (conf->psk_identity_len == 0 || conf->psk_identity == NULL) {
88         return 0;
89     }
90 
91 
92 #if defined(MBEDTLS_USE_PSA_CRYPTO)
93     if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
94         return 1;
95     }
96 #endif /* MBEDTLS_USE_PSA_CRYPTO */
97 
98     if (conf->psk != NULL && conf->psk_len != 0) {
99         return 1;
100     }
101 
102     return 0;
103 }
104 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
105 
106 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_renegotiation_info(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)107 static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
108                                         const unsigned char *buf,
109                                         size_t len)
110 {
111 #if defined(MBEDTLS_SSL_RENEGOTIATION)
112     if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
113         /* Check verify-data in constant-time. The length OTOH is no secret */
114         if (len    != 1 + ssl->verify_data_len ||
115             buf[0] !=     ssl->verify_data_len ||
116             mbedtls_ct_memcmp(buf + 1, ssl->peer_verify_data,
117                               ssl->verify_data_len) != 0) {
118             MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
119             mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
120                                            MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
121             return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
122         }
123     } else
124 #endif /* MBEDTLS_SSL_RENEGOTIATION */
125     {
126         if (len != 1 || buf[0] != 0x0) {
127             MBEDTLS_SSL_DEBUG_MSG(1, ("non-zero length renegotiation info"));
128             mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
129                                            MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
130             return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
131         }
132 
133         ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
134     }
135 
136     return 0;
137 }
138 
139 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
140     defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
141     defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
142 /*
143  * Function for parsing a supported groups (TLS 1.3) or supported elliptic
144  * curves (TLS 1.2) extension.
145  *
146  * The "extension_data" field of a supported groups extension contains a
147  * "NamedGroupList" value (TLS 1.3 RFC8446):
148  *      enum {
149  *          secp256r1(0x0017), secp384r1(0x0018), secp521r1(0x0019),
150  *          x25519(0x001D), x448(0x001E),
151  *          ffdhe2048(0x0100), ffdhe3072(0x0101), ffdhe4096(0x0102),
152  *          ffdhe6144(0x0103), ffdhe8192(0x0104),
153  *          ffdhe_private_use(0x01FC..0x01FF),
154  *          ecdhe_private_use(0xFE00..0xFEFF),
155  *          (0xFFFF)
156  *      } NamedGroup;
157  *      struct {
158  *          NamedGroup named_group_list<2..2^16-1>;
159  *      } NamedGroupList;
160  *
161  * The "extension_data" field of a supported elliptic curves extension contains
162  * a "NamedCurveList" value (TLS 1.2 RFC 8422):
163  * enum {
164  *      deprecated(1..22),
165  *      secp256r1 (23), secp384r1 (24), secp521r1 (25),
166  *      x25519(29), x448(30),
167  *      reserved (0xFE00..0xFEFF),
168  *      deprecated(0xFF01..0xFF02),
169  *      (0xFFFF)
170  *  } NamedCurve;
171  * struct {
172  *      NamedCurve named_curve_list<2..2^16-1>
173  *  } NamedCurveList;
174  *
175  * The TLS 1.3 supported groups extension was defined to be a compatible
176  * generalization of the TLS 1.2 supported elliptic curves extension. They both
177  * share the same extension identifier.
178  *
179  */
180 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_supported_groups_ext(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)181 static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
182                                           const unsigned char *buf,
183                                           size_t len)
184 {
185     size_t list_size, our_size;
186     const unsigned char *p;
187     uint16_t *curves_tls_id;
188 
189     if (len < 2) {
190         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
191         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
192                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
193         return MBEDTLS_ERR_SSL_DECODE_ERROR;
194     }
195     list_size = MBEDTLS_GET_UINT16_BE(buf, 0);
196     if (list_size + 2 != len ||
197         list_size % 2 != 0) {
198         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
199         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
200                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
201         return MBEDTLS_ERR_SSL_DECODE_ERROR;
202     }
203 
204     /* Should never happen unless client duplicates the extension */
205     if (ssl->handshake->curves_tls_id != NULL) {
206         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
207         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
208                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
209         return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
210     }
211 
212     /* Don't allow our peer to make us allocate too much memory,
213      * and leave room for a final 0 */
214     our_size = list_size / 2 + 1;
215     if (our_size > MBEDTLS_ECP_DP_MAX) {
216         our_size = MBEDTLS_ECP_DP_MAX;
217     }
218 
219     if ((curves_tls_id = mbedtls_calloc(our_size,
220                                         sizeof(*curves_tls_id))) == NULL) {
221         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
222                                        MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
223         return MBEDTLS_ERR_SSL_ALLOC_FAILED;
224     }
225 
226     ssl->handshake->curves_tls_id = curves_tls_id;
227 
228     p = buf + 2;
229     while (list_size > 0 && our_size > 1) {
230         uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
231 
232         if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
233             MBEDTLS_ECP_DP_NONE) {
234             *curves_tls_id++ = curr_tls_id;
235             our_size--;
236         }
237 
238         list_size -= 2;
239         p += 2;
240     }
241 
242     return 0;
243 }
244 
245 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_supported_point_formats(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)246 static int ssl_parse_supported_point_formats(mbedtls_ssl_context *ssl,
247                                              const unsigned char *buf,
248                                              size_t len)
249 {
250     size_t list_size;
251     const unsigned char *p;
252 
253     if (len == 0 || (size_t) (buf[0] + 1) != len) {
254         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
255         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
256                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
257         return MBEDTLS_ERR_SSL_DECODE_ERROR;
258     }
259     list_size = buf[0];
260 
261     p = buf + 1;
262     while (list_size > 0) {
263         if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
264             p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
265 #if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
266             defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED)
267             ssl->handshake->ecdh_ctx.point_format = p[0];
268 #endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED */
269 #if !defined(MBEDTLS_USE_PSA_CRYPTO) &&                             \
270             defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
271             mbedtls_ecjpake_set_point_format(&ssl->handshake->ecjpake_ctx,
272                                              p[0]);
273 #endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
274             MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
275             return 0;
276         }
277 
278         list_size--;
279         p++;
280     }
281 
282     return 0;
283 }
284 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
285           MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
286           MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
287 
288 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
289 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_ecjpake_kkpp(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)290 static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
291                                   const unsigned char *buf,
292                                   size_t len)
293 {
294     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
295 
296 #if defined(MBEDTLS_USE_PSA_CRYPTO)
297     if (ssl->handshake->psa_pake_ctx_is_ok != 1)
298 #else
299     if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0)
300 #endif /* MBEDTLS_USE_PSA_CRYPTO */
301     {
302         MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
303         return 0;
304     }
305 
306 #if defined(MBEDTLS_USE_PSA_CRYPTO)
307     if ((ret = mbedtls_psa_ecjpake_read_round(
308              &ssl->handshake->psa_pake_ctx, buf, len,
309              MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
310         psa_destroy_key(ssl->handshake->psa_pake_password);
311         psa_pake_abort(&ssl->handshake->psa_pake_ctx);
312 
313         MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
314         mbedtls_ssl_send_alert_message(
315             ssl,
316             MBEDTLS_SSL_ALERT_LEVEL_FATAL,
317             MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
318 
319         return ret;
320     }
321 #else
322     if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx,
323                                               buf, len)) != 0) {
324         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret);
325         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
326                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
327         return ret;
328     }
329 #endif /* MBEDTLS_USE_PSA_CRYPTO */
330 
331     /* Only mark the extension as OK when we're sure it is */
332     ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;
333 
334     return 0;
335 }
336 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
337 
338 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
339 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_max_fragment_length_ext(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)340 static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
341                                              const unsigned char *buf,
342                                              size_t len)
343 {
344     if (len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID) {
345         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
346         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
347                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
348         return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
349     }
350 
351     ssl->session_negotiate->mfl_code = buf[0];
352 
353     return 0;
354 }
355 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
356 
357 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
358 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_cid_ext(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)359 static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
360                              const unsigned char *buf,
361                              size_t len)
362 {
363     size_t peer_cid_len;
364 
365     /* CID extension only makes sense in DTLS */
366     if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
367         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
368         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
369                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
370         return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
371     }
372 
373     /*
374      *   struct {
375      *      opaque cid<0..2^8-1>;
376      *   } ConnectionId;
377      */
378 
379     if (len < 1) {
380         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
381         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
382                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
383         return MBEDTLS_ERR_SSL_DECODE_ERROR;
384     }
385 
386     peer_cid_len = *buf++;
387     len--;
388 
389     if (len != peer_cid_len) {
390         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
391         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
392                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
393         return MBEDTLS_ERR_SSL_DECODE_ERROR;
394     }
395 
396     /* Ignore CID if the user has disabled its use. */
397     if (ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
398         /* Leave ssl->handshake->cid_in_use in its default
399          * value of MBEDTLS_SSL_CID_DISABLED. */
400         MBEDTLS_SSL_DEBUG_MSG(3, ("Client sent CID extension, but CID disabled"));
401         return 0;
402     }
403 
404     if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
405         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
406         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
407                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
408         return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
409     }
410 
411     ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
412     ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
413     memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
414 
415     MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
416     MBEDTLS_SSL_DEBUG_BUF(3, "Client CID", buf, peer_cid_len);
417 
418     return 0;
419 }
420 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
421 
422 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
423 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)424 static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
425                                           const unsigned char *buf,
426                                           size_t len)
427 {
428     if (len != 0) {
429         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
430         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
431                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
432         return MBEDTLS_ERR_SSL_DECODE_ERROR;
433     }
434 
435     ((void) buf);
436 
437     if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
438         ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
439     }
440 
441     return 0;
442 }
443 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
444 
445 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
446 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_extended_ms_ext(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)447 static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
448                                      const unsigned char *buf,
449                                      size_t len)
450 {
451     if (len != 0) {
452         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
453         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
454                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
455         return MBEDTLS_ERR_SSL_DECODE_ERROR;
456     }
457 
458     ((void) buf);
459 
460     if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
461         ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
462     }
463 
464     return 0;
465 }
466 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
467 
468 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
469 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_session_ticket_ext(mbedtls_ssl_context * ssl,unsigned char * buf,size_t len)470 static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
471                                         unsigned char *buf,
472                                         size_t len)
473 {
474     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
475     mbedtls_ssl_session session;
476 
477     mbedtls_ssl_session_init(&session);
478 
479     if (ssl->conf->f_ticket_parse == NULL ||
480         ssl->conf->f_ticket_write == NULL) {
481         return 0;
482     }
483 
484     /* Remember the client asked us to send a new ticket */
485     ssl->handshake->new_session_ticket = 1;
486 
487     MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, len));
488 
489     if (len == 0) {
490         return 0;
491     }
492 
493 #if defined(MBEDTLS_SSL_RENEGOTIATION)
494     if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
495         MBEDTLS_SSL_DEBUG_MSG(3, ("ticket rejected: renegotiating"));
496         return 0;
497     }
498 #endif /* MBEDTLS_SSL_RENEGOTIATION */
499 
500     /*
501      * Failures are ok: just ignore the ticket and proceed.
502      */
503     if ((ret = ssl->conf->f_ticket_parse(ssl->conf->p_ticket, &session,
504                                          buf, len)) != 0) {
505         mbedtls_ssl_session_free(&session);
506 
507         if (ret == MBEDTLS_ERR_SSL_INVALID_MAC) {
508             MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is not authentic"));
509         } else if (ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) {
510             MBEDTLS_SSL_DEBUG_MSG(3, ("ticket is expired"));
511         } else {
512             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_parse", ret);
513         }
514 
515         return 0;
516     }
517 
518     /*
519      * Keep the session ID sent by the client, since we MUST send it back to
520      * inform them we're accepting the ticket  (RFC 5077 section 3.4)
521      */
522     session.id_len = ssl->session_negotiate->id_len;
523     memcpy(&session.id, ssl->session_negotiate->id, session.id_len);
524 
525     mbedtls_ssl_session_free(ssl->session_negotiate);
526     memcpy(ssl->session_negotiate, &session, sizeof(mbedtls_ssl_session));
527 
528     /* Zeroize instead of free as we copied the content */
529     mbedtls_platform_zeroize(&session, sizeof(mbedtls_ssl_session));
530 
531     MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from ticket"));
532 
533     ssl->handshake->resume = 1;
534 
535     /* Don't send a new ticket after all, this one is OK */
536     ssl->handshake->new_session_ticket = 0;
537 
538     return 0;
539 }
540 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
541 
542 #if defined(MBEDTLS_SSL_DTLS_SRTP)
543 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_use_srtp_ext(mbedtls_ssl_context * ssl,const unsigned char * buf,size_t len)544 static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
545                                   const unsigned char *buf,
546                                   size_t len)
547 {
548     mbedtls_ssl_srtp_profile client_protection = MBEDTLS_TLS_SRTP_UNSET;
549     size_t i, j;
550     size_t profile_length;
551     uint16_t mki_length;
552     /*! 2 bytes for profile length and 1 byte for mki len */
553     const size_t size_of_lengths = 3;
554 
555     /* If use_srtp is not configured, just ignore the extension */
556     if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
557         (ssl->conf->dtls_srtp_profile_list == NULL) ||
558         (ssl->conf->dtls_srtp_profile_list_len == 0)) {
559         return 0;
560     }
561 
562     /* RFC5764 section 4.1.1
563      * uint8 SRTPProtectionProfile[2];
564      *
565      * struct {
566      *   SRTPProtectionProfiles SRTPProtectionProfiles;
567      *   opaque srtp_mki<0..255>;
568      * } UseSRTPData;
569 
570      * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
571      */
572 
573     /*
574      * Min length is 5: at least one protection profile(2 bytes)
575      *                  and length(2 bytes) + srtp_mki length(1 byte)
576      * Check here that we have at least 2 bytes of protection profiles length
577      * and one of srtp_mki length
578      */
579     if (len < size_of_lengths) {
580         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
581                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
582         return MBEDTLS_ERR_SSL_DECODE_ERROR;
583     }
584 
585     ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
586 
587     /* first 2 bytes are protection profile length(in bytes) */
588     profile_length = (buf[0] << 8) | buf[1];
589     buf += 2;
590 
591     /* The profile length cannot be bigger than input buffer size - lengths fields */
592     if (profile_length > len - size_of_lengths ||
593         profile_length % 2 != 0) { /* profiles are 2 bytes long, so the length must be even */
594         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
595                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
596         return MBEDTLS_ERR_SSL_DECODE_ERROR;
597     }
598     /*
599      * parse the extension list values are defined in
600      * http://www.iana.org/assignments/srtp-protection/srtp-protection.xhtml
601      */
602     for (j = 0; j < profile_length; j += 2) {
603         uint16_t protection_profile_value = buf[j] << 8 | buf[j + 1];
604         client_protection = mbedtls_ssl_check_srtp_profile_value(protection_profile_value);
605 
606         if (client_protection != MBEDTLS_TLS_SRTP_UNSET) {
607             MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
608                                       mbedtls_ssl_get_srtp_profile_as_string(
609                                           client_protection)));
610         } else {
611             continue;
612         }
613         /* check if suggested profile is in our list */
614         for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
615             if (client_protection == ssl->conf->dtls_srtp_profile_list[i]) {
616                 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
617                 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
618                                           mbedtls_ssl_get_srtp_profile_as_string(
619                                               client_protection)));
620                 break;
621             }
622         }
623         if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile != MBEDTLS_TLS_SRTP_UNSET) {
624             break;
625         }
626     }
627     buf += profile_length; /* buf points to the mki length */
628     mki_length = *buf;
629     buf++;
630 
631     if (mki_length > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH ||
632         mki_length + profile_length + size_of_lengths != len) {
633         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
634                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
635         return MBEDTLS_ERR_SSL_DECODE_ERROR;
636     }
637 
638     /* Parse the mki only if present and mki is supported locally */
639     if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED &&
640         mki_length > 0) {
641         ssl->dtls_srtp_info.mki_len = mki_length;
642 
643         memcpy(ssl->dtls_srtp_info.mki_value, buf, mki_length);
644 
645         MBEDTLS_SSL_DEBUG_BUF(3, "using mki",  ssl->dtls_srtp_info.mki_value,
646                               ssl->dtls_srtp_info.mki_len);
647     }
648 
649     return 0;
650 }
651 #endif /* MBEDTLS_SSL_DTLS_SRTP */
652 
653 /*
654  * Auxiliary functions for ServerHello parsing and related actions
655  */
656 
657 #if defined(MBEDTLS_X509_CRT_PARSE_C)
658 /*
659  * Return 0 if the given key uses one of the acceptable curves, -1 otherwise
660  */
661 #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
662 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_check_key_curve(mbedtls_pk_context * pk,uint16_t * curves_tls_id)663 static int ssl_check_key_curve(mbedtls_pk_context *pk,
664                                uint16_t *curves_tls_id)
665 {
666     uint16_t *curr_tls_id = curves_tls_id;
667     mbedtls_ecp_group_id grp_id = mbedtls_pk_get_ec_group_id(pk);
668     mbedtls_ecp_group_id curr_grp_id;
669 
670     while (*curr_tls_id != 0) {
671         curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
672         if (curr_grp_id == grp_id) {
673             return 0;
674         }
675         curr_tls_id++;
676     }
677 
678     return -1;
679 }
680 #endif /* MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED */
681 
682 /*
683  * Try picking a certificate for this ciphersuite,
684  * return 0 on success and -1 on failure.
685  */
686 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_pick_cert(mbedtls_ssl_context * ssl,const mbedtls_ssl_ciphersuite_t * ciphersuite_info)687 static int ssl_pick_cert(mbedtls_ssl_context *ssl,
688                          const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
689 {
690     mbedtls_ssl_key_cert *cur, *list;
691 #if defined(MBEDTLS_USE_PSA_CRYPTO)
692     psa_algorithm_t pk_alg =
693         mbedtls_ssl_get_ciphersuite_sig_pk_psa_alg(ciphersuite_info);
694     psa_key_usage_t pk_usage =
695         mbedtls_ssl_get_ciphersuite_sig_pk_psa_usage(ciphersuite_info);
696 #else
697     mbedtls_pk_type_t pk_alg =
698         mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
699 #endif /* MBEDTLS_USE_PSA_CRYPTO */
700     uint32_t flags;
701 
702 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
703     if (ssl->handshake->sni_key_cert != NULL) {
704         list = ssl->handshake->sni_key_cert;
705     } else
706 #endif
707     list = ssl->conf->key_cert;
708 
709     int pk_alg_is_none = 0;
710 #if defined(MBEDTLS_USE_PSA_CRYPTO)
711     pk_alg_is_none = (pk_alg == PSA_ALG_NONE);
712 #else
713     pk_alg_is_none = (pk_alg == MBEDTLS_PK_NONE);
714 #endif /* MBEDTLS_USE_PSA_CRYPTO */
715     if (pk_alg_is_none) {
716         return 0;
717     }
718 
719     MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite requires certificate"));
720 
721     if (list == NULL) {
722         MBEDTLS_SSL_DEBUG_MSG(3, ("server has no certificate"));
723         return -1;
724     }
725 
726     for (cur = list; cur != NULL; cur = cur->next) {
727         flags = 0;
728         MBEDTLS_SSL_DEBUG_CRT(3, "candidate certificate chain, certificate",
729                               cur->cert);
730 
731         int key_type_matches = 0;
732 #if defined(MBEDTLS_USE_PSA_CRYPTO)
733 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
734         key_type_matches = ((ssl->conf->f_async_sign_start != NULL ||
735                              ssl->conf->f_async_decrypt_start != NULL ||
736                              mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage)) &&
737                             mbedtls_pk_can_do_ext(&cur->cert->pk, pk_alg, pk_usage));
738 #else
739         key_type_matches = (
740             mbedtls_pk_can_do_ext(cur->key, pk_alg, pk_usage));
741 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
742 #else
743         key_type_matches = mbedtls_pk_can_do(&cur->cert->pk, pk_alg);
744 #endif /* MBEDTLS_USE_PSA_CRYPTO */
745         if (!key_type_matches) {
746             MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: key type"));
747             continue;
748         }
749 
750         /*
751          * This avoids sending the client a cert it'll reject based on
752          * keyUsage or other extensions.
753          *
754          * It also allows the user to provision different certificates for
755          * different uses based on keyUsage, eg if they want to avoid signing
756          * and decrypting with the same RSA key.
757          */
758         if (mbedtls_ssl_check_cert_usage(cur->cert, ciphersuite_info,
759                                          MBEDTLS_SSL_IS_SERVER, &flags) != 0) {
760             MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: "
761                                       "(extended) key usage extension"));
762             continue;
763         }
764 
765 #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
766         if (pk_alg == MBEDTLS_PK_ECDSA &&
767             ssl_check_key_curve(&cur->cert->pk,
768                                 ssl->handshake->curves_tls_id) != 0) {
769             MBEDTLS_SSL_DEBUG_MSG(3, ("certificate mismatch: elliptic curve"));
770             continue;
771         }
772 #endif
773 
774         /* If we get there, we got a winner */
775         break;
776     }
777 
778     /* Do not update ssl->handshake->key_cert unless there is a match */
779     if (cur != NULL) {
780         ssl->handshake->key_cert = cur;
781         MBEDTLS_SSL_DEBUG_CRT(3, "selected certificate chain, certificate",
782                               ssl->handshake->key_cert->cert);
783         return 0;
784     }
785 
786     return -1;
787 }
788 #endif /* MBEDTLS_X509_CRT_PARSE_C */
789 
790 /*
791  * Check if a given ciphersuite is suitable for use with our config/keys/etc
792  * Sets ciphersuite_info only if the suite matches.
793  */
794 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_ciphersuite_match(mbedtls_ssl_context * ssl,int suite_id,const mbedtls_ssl_ciphersuite_t ** ciphersuite_info)795 static int ssl_ciphersuite_match(mbedtls_ssl_context *ssl, int suite_id,
796                                  const mbedtls_ssl_ciphersuite_t **ciphersuite_info)
797 {
798     const mbedtls_ssl_ciphersuite_t *suite_info;
799 
800 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
801     mbedtls_pk_type_t sig_type;
802 #endif
803 
804     suite_info = mbedtls_ssl_ciphersuite_from_id(suite_id);
805     if (suite_info == NULL) {
806         MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
807         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
808     }
809 
810     MBEDTLS_SSL_DEBUG_MSG(3, ("trying ciphersuite: %#04x (%s)",
811                               (unsigned int) suite_id, suite_info->name));
812 
813     if (suite_info->min_tls_version > ssl->tls_version ||
814         suite_info->max_tls_version < ssl->tls_version) {
815         MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: version"));
816         return 0;
817     }
818 
819 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
820     if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&
821         (ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK) == 0) {
822         MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: ecjpake "
823                                   "not configured or ext missing"));
824         return 0;
825     }
826 #endif
827 
828 
829 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
830     defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
831     if (mbedtls_ssl_ciphersuite_uses_ec(suite_info) &&
832         (ssl->handshake->curves_tls_id == NULL ||
833          ssl->handshake->curves_tls_id[0] == 0)) {
834         MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
835                                   "no common elliptic curve"));
836         return 0;
837     }
838 #endif
839 
840 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
841     /* If the ciphersuite requires a pre-shared key and we don't
842      * have one, skip it now rather than failing later */
843     if (mbedtls_ssl_ciphersuite_uses_psk(suite_info) &&
844         ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
845         MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no pre-shared key"));
846         return 0;
847     }
848 #endif
849 
850 #if defined(MBEDTLS_X509_CRT_PARSE_C)
851     /*
852      * Final check: if ciphersuite requires us to have a
853      * certificate/key of a particular type:
854      * - select the appropriate certificate if we have one, or
855      * - try the next ciphersuite if we don't
856      * This must be done last since we modify the key_cert list.
857      */
858     if (ssl_pick_cert(ssl, suite_info) != 0) {
859         MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: "
860                                   "no suitable certificate"));
861         return 0;
862     }
863 #endif
864 
865 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
866     /* If the ciphersuite requires signing, check whether
867      * a suitable hash algorithm is present. */
868     sig_type = mbedtls_ssl_get_ciphersuite_sig_alg(suite_info);
869     if (sig_type != MBEDTLS_PK_NONE &&
870         mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
871             ssl, mbedtls_ssl_sig_from_pk_alg(sig_type)) == MBEDTLS_SSL_HASH_NONE) {
872         MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite mismatch: no suitable hash algorithm "
873                                   "for signature algorithm %u", (unsigned) sig_type));
874         return 0;
875     }
876 
877 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
878 
879     *ciphersuite_info = suite_info;
880     return 0;
881 }
882 
883 /* This function doesn't alert on errors that happen early during
884    ClientHello parsing because they might indicate that the client is
885    not talking SSL/TLS at all and would not understand our alert. */
886 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_client_hello(mbedtls_ssl_context * ssl)887 static int ssl_parse_client_hello(mbedtls_ssl_context *ssl)
888 {
889     int ret, got_common_suite;
890     size_t i, j;
891     size_t ciph_offset, comp_offset, ext_offset;
892     size_t msg_len, ciph_len, sess_len, comp_len, ext_len;
893 #if defined(MBEDTLS_SSL_PROTO_DTLS)
894     size_t cookie_offset, cookie_len;
895 #endif
896     unsigned char *buf, *p, *ext;
897 #if defined(MBEDTLS_SSL_RENEGOTIATION)
898     int renegotiation_info_seen = 0;
899 #endif
900     int handshake_failure = 0;
901     const int *ciphersuites;
902     const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
903 
904     /* If there is no signature-algorithm extension present,
905      * we need to fall back to the default values for allowed
906      * signature-hash pairs. */
907 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
908     int sig_hash_alg_ext_present = 0;
909 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
910 
911     MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client hello"));
912 
913     int renegotiating;
914 
915 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
916 read_record_header:
917 #endif
918     /*
919      * If renegotiating, then the input was read with mbedtls_ssl_read_record(),
920      * otherwise read it ourselves manually in order to support SSLv2
921      * ClientHello, which doesn't use the same record layer format.
922      * Otherwise in a scenario of TLS 1.3/TLS 1.2 version negotiation, the
923      * ClientHello has been already fully fetched by the TLS 1.3 code and the
924      * flag ssl->keep_current_message is raised.
925      */
926     renegotiating = 0;
927 #if defined(MBEDTLS_SSL_RENEGOTIATION)
928     renegotiating = (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE);
929 #endif
930     if (!renegotiating && !ssl->keep_current_message) {
931         if ((ret = mbedtls_ssl_fetch_input(ssl, 5)) != 0) {
932             /* No alert on a read error. */
933             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
934             return ret;
935         }
936     }
937 
938     buf = ssl->in_hdr;
939 
940     MBEDTLS_SSL_DEBUG_BUF(4, "record header", buf, mbedtls_ssl_in_hdr_len(ssl));
941 
942     /*
943      * TLS Client Hello
944      *
945      * Record layer:
946      *     0  .   0   message type
947      *     1  .   2   protocol version
948      *     3  .   11  DTLS: epoch + record sequence number
949      *     3  .   4   message length
950      */
951     MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message type: %d",
952                               buf[0]));
953 
954     if (buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE) {
955         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
956         return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
957     }
958 
959     MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, message len.: %d",
960                               MBEDTLS_GET_UINT16_BE(ssl->in_len, 0)));
961 
962     MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, protocol version: [%d:%d]",
963                               buf[1], buf[2]));
964 
965     /* For DTLS if this is the initial handshake, remember the client sequence
966      * number to use it in our next message (RFC 6347 4.2.1) */
967 #if defined(MBEDTLS_SSL_PROTO_DTLS)
968     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM
969 #if defined(MBEDTLS_SSL_RENEGOTIATION)
970         && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
971 #endif
972         ) {
973         /* Epoch should be 0 for initial handshakes */
974         if (ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0) {
975             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
976             return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
977         }
978 
979         memcpy(&ssl->cur_out_ctr[2], ssl->in_ctr + 2,
980                sizeof(ssl->cur_out_ctr) - 2);
981 
982 #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
983         if (mbedtls_ssl_dtls_replay_check(ssl) != 0) {
984             MBEDTLS_SSL_DEBUG_MSG(1, ("replayed record, discarding"));
985             ssl->next_record_offset = 0;
986             ssl->in_left = 0;
987             goto read_record_header;
988         }
989 
990         /* No MAC to check yet, so we can update right now */
991         mbedtls_ssl_dtls_replay_update(ssl);
992 #endif
993     }
994 #endif /* MBEDTLS_SSL_PROTO_DTLS */
995 
996     msg_len = MBEDTLS_GET_UINT16_BE(ssl->in_len, 0);
997 
998 #if defined(MBEDTLS_SSL_RENEGOTIATION)
999     if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
1000         /* Set by mbedtls_ssl_read_record() */
1001         msg_len = ssl->in_hslen;
1002     } else
1003 #endif
1004     {
1005         if (ssl->keep_current_message) {
1006             ssl->keep_current_message = 0;
1007         } else {
1008             if (msg_len > MBEDTLS_SSL_IN_CONTENT_LEN) {
1009                 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1010                 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
1011             }
1012 
1013             if ((ret = mbedtls_ssl_fetch_input(ssl,
1014                                                mbedtls_ssl_in_hdr_len(ssl) + msg_len)) != 0) {
1015                 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_fetch_input", ret);
1016                 return ret;
1017             }
1018 
1019             /* Done reading this record, get ready for the next one */
1020 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1021             if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1022                 ssl->next_record_offset = msg_len + mbedtls_ssl_in_hdr_len(ssl);
1023             } else
1024 #endif
1025             ssl->in_left = 0;
1026         }
1027     }
1028 
1029     buf = ssl->in_msg;
1030 
1031     MBEDTLS_SSL_DEBUG_BUF(4, "record contents", buf, msg_len);
1032 
1033     ret = ssl->handshake->update_checksum(ssl, buf, msg_len);
1034     if (0 != ret) {
1035         MBEDTLS_SSL_DEBUG_RET(1, ("update_checksum"), ret);
1036         return ret;
1037     }
1038 
1039     /*
1040      * Handshake layer:
1041      *     0  .   0   handshake type
1042      *     1  .   3   handshake length
1043      *     4  .   5   DTLS only: message sequence number
1044      *     6  .   8   DTLS only: fragment offset
1045      *     9  .  11   DTLS only: fragment length
1046      */
1047     if (msg_len < mbedtls_ssl_hs_hdr_len(ssl)) {
1048         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1049         return MBEDTLS_ERR_SSL_DECODE_ERROR;
1050     }
1051 
1052     MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake type: %d", buf[0]));
1053 
1054     if (buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO) {
1055         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1056         return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
1057     }
1058     {
1059         size_t handshake_len = MBEDTLS_GET_UINT24_BE(buf, 1);
1060         MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, handshake len.: %u",
1061                                   (unsigned) handshake_len));
1062 
1063         /* The record layer has a record size limit of 2^14 - 1 and
1064          * fragmentation is not supported, so buf[1] should be zero. */
1065         if (buf[1] != 0) {
1066             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != 0",
1067                                       (unsigned) buf[1]));
1068             return MBEDTLS_ERR_SSL_DECODE_ERROR;
1069         }
1070 
1071         /* We don't support fragmentation of ClientHello (yet?) */
1072         if (msg_len != mbedtls_ssl_hs_hdr_len(ssl) + handshake_len) {
1073             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message: %u != %u + %u",
1074                                       (unsigned) msg_len,
1075                                       (unsigned) mbedtls_ssl_hs_hdr_len(ssl),
1076                                       (unsigned) handshake_len));
1077             return MBEDTLS_ERR_SSL_DECODE_ERROR;
1078         }
1079     }
1080 
1081 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1082     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1083         /*
1084          * Copy the client's handshake message_seq on initial handshakes,
1085          * check sequence number on renego.
1086          */
1087 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1088         if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1089             /* This couldn't be done in ssl_prepare_handshake_record() */
1090             unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
1091             if (cli_msg_seq != ssl->handshake->in_msg_seq) {
1092                 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message_seq: "
1093                                           "%u (expected %u)", cli_msg_seq,
1094                                           ssl->handshake->in_msg_seq));
1095                 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1096             }
1097 
1098             ssl->handshake->in_msg_seq++;
1099         } else
1100 #endif
1101         {
1102             unsigned int cli_msg_seq = (unsigned int) MBEDTLS_GET_UINT16_BE(ssl->in_msg, 4);
1103             ssl->handshake->out_msg_seq = cli_msg_seq;
1104             ssl->handshake->in_msg_seq  = cli_msg_seq + 1;
1105         }
1106         {
1107             /*
1108              * For now we don't support fragmentation, so make sure
1109              * fragment_offset == 0 and fragment_length == length
1110              */
1111             size_t fragment_offset, fragment_length, length;
1112             fragment_offset = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 6);
1113             fragment_length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 9);
1114             length = MBEDTLS_GET_UINT24_BE(ssl->in_msg, 1);
1115             MBEDTLS_SSL_DEBUG_MSG(
1116                 4, ("fragment_offset=%u fragment_length=%u length=%u",
1117                     (unsigned) fragment_offset, (unsigned) fragment_length,
1118                     (unsigned) length));
1119             if (fragment_offset != 0 || length != fragment_length) {
1120                 MBEDTLS_SSL_DEBUG_MSG(1, ("ClientHello fragmentation not supported"));
1121                 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
1122             }
1123         }
1124     }
1125 #endif /* MBEDTLS_SSL_PROTO_DTLS */
1126 
1127     buf += mbedtls_ssl_hs_hdr_len(ssl);
1128     msg_len -= mbedtls_ssl_hs_hdr_len(ssl);
1129 
1130     /*
1131      * ClientHello layout:
1132      *     0  .   1   protocol version
1133      *     2  .  33   random bytes (starting with 4 bytes of Unix time)
1134      *    34  .  34   session id length (1 byte)
1135      *    35  . 34+x  session id, where x = session id length from byte 34
1136      *   35+x . 35+x  DTLS only: cookie length (1 byte)
1137      *   36+x .  ..   DTLS only: cookie
1138      *    ..  .  ..   ciphersuite list length (2 bytes)
1139      *    ..  .  ..   ciphersuite list
1140      *    ..  .  ..   compression alg. list length (1 byte)
1141      *    ..  .  ..   compression alg. list
1142      *    ..  .  ..   extensions length (2 bytes, optional)
1143      *    ..  .  ..   extensions (optional)
1144      */
1145 
1146     /*
1147      * Minimal length (with everything empty and extensions omitted) is
1148      * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can
1149      * read at least up to session id length without worrying.
1150      */
1151     if (msg_len < 38) {
1152         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1153         return MBEDTLS_ERR_SSL_DECODE_ERROR;
1154     }
1155 
1156     /*
1157      * Check and save the protocol version
1158      */
1159     MBEDTLS_SSL_DEBUG_BUF(3, "client hello, version", buf, 2);
1160 
1161     ssl->tls_version = (mbedtls_ssl_protocol_version) mbedtls_ssl_read_version(buf,
1162                                                                                ssl->conf->transport);
1163     ssl->session_negotiate->tls_version = ssl->tls_version;
1164     ssl->session_negotiate->endpoint = ssl->conf->endpoint;
1165 
1166     if (ssl->tls_version != MBEDTLS_SSL_VERSION_TLS1_2) {
1167         MBEDTLS_SSL_DEBUG_MSG(1, ("server only supports TLS 1.2"));
1168         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1169                                        MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
1170         return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
1171     }
1172 
1173     /*
1174      * Save client random (inc. Unix time)
1175      */
1176     MBEDTLS_SSL_DEBUG_BUF(3, "client hello, random bytes", buf + 2, 32);
1177 
1178     memcpy(ssl->handshake->randbytes, buf + 2, 32);
1179 
1180     /*
1181      * Check the session ID length and save session ID
1182      */
1183     sess_len = buf[34];
1184 
1185     if (sess_len > sizeof(ssl->session_negotiate->id) ||
1186         sess_len + 34 + 2 > msg_len) { /* 2 for cipherlist length field */
1187         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1188         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1189                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1190         return MBEDTLS_ERR_SSL_DECODE_ERROR;
1191     }
1192 
1193     MBEDTLS_SSL_DEBUG_BUF(3, "client hello, session id", buf + 35, sess_len);
1194 
1195     ssl->session_negotiate->id_len = sess_len;
1196     memset(ssl->session_negotiate->id, 0,
1197            sizeof(ssl->session_negotiate->id));
1198     memcpy(ssl->session_negotiate->id, buf + 35,
1199            ssl->session_negotiate->id_len);
1200 
1201     /*
1202      * Check the cookie length and content
1203      */
1204 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1205     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1206         cookie_offset = 35 + sess_len;
1207         cookie_len = buf[cookie_offset];
1208 
1209         if (cookie_offset + 1 + cookie_len + 2 > msg_len) {
1210             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1211             mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1212                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1213             return MBEDTLS_ERR_SSL_DECODE_ERROR;
1214         }
1215 
1216         MBEDTLS_SSL_DEBUG_BUF(3, "client hello, cookie",
1217                               buf + cookie_offset + 1, cookie_len);
1218 
1219 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
1220         if (ssl->conf->f_cookie_check != NULL
1221 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1222             && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE
1223 #endif
1224             ) {
1225             if (ssl->conf->f_cookie_check(ssl->conf->p_cookie,
1226                                           buf + cookie_offset + 1, cookie_len,
1227                                           ssl->cli_id, ssl->cli_id_len) != 0) {
1228                 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification failed"));
1229                 ssl->handshake->cookie_verify_result = 1;
1230             } else {
1231                 MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification passed"));
1232                 ssl->handshake->cookie_verify_result = 0;
1233             }
1234         } else
1235 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
1236         {
1237             /* We know we didn't send a cookie, so it should be empty */
1238             if (cookie_len != 0) {
1239                 /* This may be an attacker's probe, so don't send an alert */
1240                 MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1241                 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1242             }
1243 
1244             MBEDTLS_SSL_DEBUG_MSG(2, ("cookie verification skipped"));
1245         }
1246 
1247         /*
1248          * Check the ciphersuitelist length (will be parsed later)
1249          */
1250         ciph_offset = cookie_offset + 1 + cookie_len;
1251     } else
1252 #endif /* MBEDTLS_SSL_PROTO_DTLS */
1253     ciph_offset = 35 + sess_len;
1254 
1255     ciph_len = MBEDTLS_GET_UINT16_BE(buf, ciph_offset);
1256 
1257     if (ciph_len < 2 ||
1258         ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */
1259         (ciph_len % 2) != 0) {
1260         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1261         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1262                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1263         return MBEDTLS_ERR_SSL_DECODE_ERROR;
1264     }
1265 
1266     MBEDTLS_SSL_DEBUG_BUF(3, "client hello, ciphersuitelist",
1267                           buf + ciph_offset + 2,  ciph_len);
1268 
1269     /*
1270      * Check the compression algorithm's length.
1271      * The list contents are ignored because implementing
1272      * MBEDTLS_SSL_COMPRESS_NULL is mandatory and is the only
1273      * option supported by Mbed TLS.
1274      */
1275     comp_offset = ciph_offset + 2 + ciph_len;
1276 
1277     comp_len = buf[comp_offset];
1278 
1279     if (comp_len < 1 ||
1280         comp_len > 16 ||
1281         comp_len + comp_offset + 1 > msg_len) {
1282         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1283         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1284                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1285         return MBEDTLS_ERR_SSL_DECODE_ERROR;
1286     }
1287 
1288     MBEDTLS_SSL_DEBUG_BUF(3, "client hello, compression",
1289                           buf + comp_offset + 1, comp_len);
1290 
1291     /*
1292      * Check the extension length
1293      */
1294     ext_offset = comp_offset + 1 + comp_len;
1295     if (msg_len > ext_offset) {
1296         if (msg_len < ext_offset + 2) {
1297             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1298             mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1299                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1300             return MBEDTLS_ERR_SSL_DECODE_ERROR;
1301         }
1302 
1303         ext_len = MBEDTLS_GET_UINT16_BE(buf, ext_offset);
1304 
1305         if (msg_len != ext_offset + 2 + ext_len) {
1306             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1307             mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1308                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1309             return MBEDTLS_ERR_SSL_DECODE_ERROR;
1310         }
1311     } else {
1312         ext_len = 0;
1313     }
1314 
1315     ext = buf + ext_offset + 2;
1316     MBEDTLS_SSL_DEBUG_BUF(3, "client hello extensions", ext, ext_len);
1317 
1318     while (ext_len != 0) {
1319         unsigned int ext_id;
1320         unsigned int ext_size;
1321         if (ext_len < 4) {
1322             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1323             mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1324                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1325             return MBEDTLS_ERR_SSL_DECODE_ERROR;
1326         }
1327         ext_id   = MBEDTLS_GET_UINT16_BE(ext, 0);
1328         ext_size = MBEDTLS_GET_UINT16_BE(ext, 2);
1329 
1330         if (ext_size + 4 > ext_len) {
1331             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client hello message"));
1332             mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1333                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1334             return MBEDTLS_ERR_SSL_DECODE_ERROR;
1335         }
1336         switch (ext_id) {
1337 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1338             case MBEDTLS_TLS_EXT_SERVERNAME:
1339                 MBEDTLS_SSL_DEBUG_MSG(3, ("found ServerName extension"));
1340                 ret = mbedtls_ssl_parse_server_name_ext(ssl, ext + 4,
1341                                                         ext + 4 + ext_size);
1342                 if (ret != 0) {
1343                     return ret;
1344                 }
1345                 break;
1346 #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
1347 
1348             case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
1349                 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
1350 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1351                 renegotiation_info_seen = 1;
1352 #endif
1353 
1354                 ret = ssl_parse_renegotiation_info(ssl, ext + 4, ext_size);
1355                 if (ret != 0) {
1356                     return ret;
1357                 }
1358                 break;
1359 
1360 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
1361             case MBEDTLS_TLS_EXT_SIG_ALG:
1362                 MBEDTLS_SSL_DEBUG_MSG(3, ("found signature_algorithms extension"));
1363 
1364                 ret = mbedtls_ssl_parse_sig_alg_ext(ssl, ext + 4, ext + 4 + ext_size);
1365                 if (ret != 0) {
1366                     return ret;
1367                 }
1368 
1369                 sig_hash_alg_ext_present = 1;
1370                 break;
1371 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
1372 
1373 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
1374                 defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
1375                 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1376             case MBEDTLS_TLS_EXT_SUPPORTED_GROUPS:
1377                 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported elliptic curves extension"));
1378 
1379                 ret = ssl_parse_supported_groups_ext(ssl, ext + 4, ext_size);
1380                 if (ret != 0) {
1381                     return ret;
1382                 }
1383                 break;
1384 
1385             case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
1386                 MBEDTLS_SSL_DEBUG_MSG(3, ("found supported point formats extension"));
1387                 ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;
1388 
1389                 ret = ssl_parse_supported_point_formats(ssl, ext + 4, ext_size);
1390                 if (ret != 0) {
1391                     return ret;
1392                 }
1393                 break;
1394 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED || \
1395           MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
1396           MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1397 
1398 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1399             case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
1400                 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake kkpp extension"));
1401 
1402                 ret = ssl_parse_ecjpake_kkpp(ssl, ext + 4, ext_size);
1403                 if (ret != 0) {
1404                     return ret;
1405                 }
1406                 break;
1407 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1408 
1409 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
1410             case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
1411                 MBEDTLS_SSL_DEBUG_MSG(3, ("found max fragment length extension"));
1412 
1413                 ret = ssl_parse_max_fragment_length_ext(ssl, ext + 4, ext_size);
1414                 if (ret != 0) {
1415                     return ret;
1416                 }
1417                 break;
1418 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
1419 
1420 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
1421             case MBEDTLS_TLS_EXT_CID:
1422                 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
1423 
1424                 ret = ssl_parse_cid_ext(ssl, ext + 4, ext_size);
1425                 if (ret != 0) {
1426                     return ret;
1427                 }
1428                 break;
1429 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1430 
1431 #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1432             case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
1433                 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt then mac extension"));
1434 
1435                 ret = ssl_parse_encrypt_then_mac_ext(ssl, ext + 4, ext_size);
1436                 if (ret != 0) {
1437                     return ret;
1438                 }
1439                 break;
1440 #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
1441 
1442 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1443             case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
1444                 MBEDTLS_SSL_DEBUG_MSG(3, ("found extended master secret extension"));
1445 
1446                 ret = ssl_parse_extended_ms_ext(ssl, ext + 4, ext_size);
1447                 if (ret != 0) {
1448                     return ret;
1449                 }
1450                 break;
1451 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
1452 
1453 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
1454             case MBEDTLS_TLS_EXT_SESSION_TICKET:
1455                 MBEDTLS_SSL_DEBUG_MSG(3, ("found session ticket extension"));
1456 
1457                 ret = ssl_parse_session_ticket_ext(ssl, ext + 4, ext_size);
1458                 if (ret != 0) {
1459                     return ret;
1460                 }
1461                 break;
1462 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
1463 
1464 #if defined(MBEDTLS_SSL_ALPN)
1465             case MBEDTLS_TLS_EXT_ALPN:
1466                 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
1467 
1468                 ret = mbedtls_ssl_parse_alpn_ext(ssl, ext + 4,
1469                                                  ext + 4 + ext_size);
1470                 if (ret != 0) {
1471                     return ret;
1472                 }
1473                 break;
1474 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
1475 
1476 #if defined(MBEDTLS_SSL_DTLS_SRTP)
1477             case MBEDTLS_TLS_EXT_USE_SRTP:
1478                 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
1479 
1480                 ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size);
1481                 if (ret != 0) {
1482                     return ret;
1483                 }
1484                 break;
1485 #endif /* MBEDTLS_SSL_DTLS_SRTP */
1486 
1487             default:
1488                 MBEDTLS_SSL_DEBUG_MSG(3, ("unknown extension found: %u (ignoring)",
1489                                           ext_id));
1490         }
1491 
1492         ext_len -= 4 + ext_size;
1493         ext += 4 + ext_size;
1494     }
1495 
1496 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
1497 
1498     /*
1499      * Try to fall back to default hash SHA1 if the client
1500      * hasn't provided any preferred signature-hash combinations.
1501      */
1502     if (!sig_hash_alg_ext_present) {
1503         uint16_t *received_sig_algs = ssl->handshake->received_sig_algs;
1504         const uint16_t default_sig_algs[] = {
1505 #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
1506             MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_ECDSA,
1507                                                MBEDTLS_SSL_HASH_SHA1),
1508 #endif
1509 #if defined(MBEDTLS_RSA_C)
1510             MBEDTLS_SSL_TLS12_SIG_AND_HASH_ALG(MBEDTLS_SSL_SIG_RSA,
1511                                                MBEDTLS_SSL_HASH_SHA1),
1512 #endif
1513             MBEDTLS_TLS_SIG_NONE
1514         };
1515 
1516         MBEDTLS_STATIC_ASSERT(sizeof(default_sig_algs) / sizeof(default_sig_algs[0])
1517                               <= MBEDTLS_RECEIVED_SIG_ALGS_SIZE,
1518                               "default_sig_algs is too big");
1519 
1520         memcpy(received_sig_algs, default_sig_algs, sizeof(default_sig_algs));
1521     }
1522 
1523 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
1524 
1525     /*
1526      * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV
1527      */
1528     for (i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2) {
1529         if (p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO) {
1530             MBEDTLS_SSL_DEBUG_MSG(3, ("received TLS_EMPTY_RENEGOTIATION_INFO "));
1531 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1532             if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
1533                 MBEDTLS_SSL_DEBUG_MSG(1, ("received RENEGOTIATION SCSV "
1534                                           "during renegotiation"));
1535                 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1536                                                MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1537                 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1538             }
1539 #endif
1540             ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
1541             break;
1542         }
1543     }
1544 
1545     /*
1546      * Renegotiation security checks
1547      */
1548     if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1549         ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1550         MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation, breaking off handshake"));
1551         handshake_failure = 1;
1552     }
1553 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1554     else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1555              ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
1556              renegotiation_info_seen == 0) {
1557         MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension missing (secure)"));
1558         handshake_failure = 1;
1559     } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1560                ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1561                ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1562         MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
1563         handshake_failure = 1;
1564     } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1565                ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1566                renegotiation_info_seen == 1) {
1567         MBEDTLS_SSL_DEBUG_MSG(1, ("renegotiation_info extension present (legacy)"));
1568         handshake_failure = 1;
1569     }
1570 #endif /* MBEDTLS_SSL_RENEGOTIATION */
1571 
1572     if (handshake_failure == 1) {
1573         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1574                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1575         return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1576     }
1577 
1578     /*
1579      * Server certification selection (after processing TLS extensions)
1580      */
1581     if (ssl->conf->f_cert_cb && (ret = ssl->conf->f_cert_cb(ssl)) != 0) {
1582         MBEDTLS_SSL_DEBUG_RET(1, "f_cert_cb", ret);
1583         return ret;
1584     }
1585 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1586     ssl->handshake->sni_name = NULL;
1587     ssl->handshake->sni_name_len = 0;
1588 #endif
1589 
1590     /*
1591      * Search for a matching ciphersuite
1592      * (At the end because we need information from the EC-based extensions
1593      * and certificate from the SNI callback triggered by the SNI extension
1594      * or certificate from server certificate selection callback.)
1595      */
1596     got_common_suite = 0;
1597     ciphersuites = ssl->conf->ciphersuite_list;
1598     ciphersuite_info = NULL;
1599 
1600     if (ssl->conf->respect_cli_pref == MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT) {
1601         for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1602             for (i = 0; ciphersuites[i] != 0; i++) {
1603                 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
1604                     continue;
1605                 }
1606 
1607                 got_common_suite = 1;
1608 
1609                 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1610                                                  &ciphersuite_info)) != 0) {
1611                     return ret;
1612                 }
1613 
1614                 if (ciphersuite_info != NULL) {
1615                     goto have_ciphersuite;
1616                 }
1617             }
1618         }
1619     } else {
1620         for (i = 0; ciphersuites[i] != 0; i++) {
1621             for (j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2) {
1622                 if (MBEDTLS_GET_UINT16_BE(p, 0) != ciphersuites[i]) {
1623                     continue;
1624                 }
1625 
1626                 got_common_suite = 1;
1627 
1628                 if ((ret = ssl_ciphersuite_match(ssl, ciphersuites[i],
1629                                                  &ciphersuite_info)) != 0) {
1630                     return ret;
1631                 }
1632 
1633                 if (ciphersuite_info != NULL) {
1634                     goto have_ciphersuite;
1635                 }
1636             }
1637         }
1638     }
1639 
1640     if (got_common_suite) {
1641         MBEDTLS_SSL_DEBUG_MSG(1, ("got ciphersuites in common, "
1642                                   "but none of them usable"));
1643         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1644                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1645         return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1646     } else {
1647         MBEDTLS_SSL_DEBUG_MSG(1, ("got no ciphersuites in common"));
1648         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1649                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1650         return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1651     }
1652 
1653 have_ciphersuite:
1654     MBEDTLS_SSL_DEBUG_MSG(2, ("selected ciphersuite: %s", ciphersuite_info->name));
1655 
1656     ssl->session_negotiate->ciphersuite = ciphersuites[i];
1657     ssl->handshake->ciphersuite_info = ciphersuite_info;
1658 
1659     ssl->state++;
1660 
1661 #if defined(MBEDTLS_SSL_PROTO_DTLS)
1662     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1663         mbedtls_ssl_recv_flight_completed(ssl);
1664     }
1665 #endif
1666 
1667     /* Debugging-only output for testsuite */
1668 #if defined(MBEDTLS_DEBUG_C)                         && \
1669     defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
1670     mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg(ciphersuite_info);
1671     if (sig_alg != MBEDTLS_PK_NONE) {
1672         unsigned int sig_hash = mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
1673             ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
1674         MBEDTLS_SSL_DEBUG_MSG(3, ("client hello v3, signature_algorithm ext: %u",
1675                                   sig_hash));
1676     } else {
1677         MBEDTLS_SSL_DEBUG_MSG(3, ("no hash algorithm for signature algorithm "
1678                                   "%u - should not happen", (unsigned) sig_alg));
1679     }
1680 #endif
1681 
1682     MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client hello"));
1683 
1684     return 0;
1685 }
1686 
1687 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
ssl_write_cid_ext(mbedtls_ssl_context * ssl,unsigned char * buf,size_t * olen)1688 static void ssl_write_cid_ext(mbedtls_ssl_context *ssl,
1689                               unsigned char *buf,
1690                               size_t *olen)
1691 {
1692     unsigned char *p = buf;
1693     size_t ext_len;
1694     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1695 
1696     *olen = 0;
1697 
1698     /* Skip writing the extension if we don't want to use it or if
1699      * the client hasn't offered it. */
1700     if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_DISABLED) {
1701         return;
1702     }
1703 
1704     /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
1705      * which is at most 255, so the increment cannot overflow. */
1706     if (end < p || (size_t) (end - p) < (unsigned) (ssl->own_cid_len + 5)) {
1707         MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1708         return;
1709     }
1710 
1711     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding CID extension"));
1712 
1713     /*
1714      *   struct {
1715      *      opaque cid<0..2^8-1>;
1716      *   } ConnectionId;
1717      */
1718     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
1719     p += 2;
1720     ext_len = (size_t) ssl->own_cid_len + 1;
1721     MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
1722     p += 2;
1723 
1724     *p++ = (uint8_t) ssl->own_cid_len;
1725     memcpy(p, ssl->own_cid, ssl->own_cid_len);
1726 
1727     *olen = ssl->own_cid_len + 5;
1728 }
1729 #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
1730 
1731 #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context * ssl,unsigned char * buf,size_t * olen)1732 static void ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
1733                                            unsigned char *buf,
1734                                            size_t *olen)
1735 {
1736     unsigned char *p = buf;
1737     const mbedtls_ssl_ciphersuite_t *suite = NULL;
1738 
1739     /*
1740      * RFC 7366: "If a server receives an encrypt-then-MAC request extension
1741      * from a client and then selects a stream or Authenticated Encryption
1742      * with Associated Data (AEAD) ciphersuite, it MUST NOT send an
1743      * encrypt-then-MAC response extension back to the client."
1744      */
1745     suite = mbedtls_ssl_ciphersuite_from_id(
1746         ssl->session_negotiate->ciphersuite);
1747     if (suite == NULL) {
1748         ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
1749     } else {
1750         mbedtls_ssl_mode_t ssl_mode =
1751             mbedtls_ssl_get_mode_from_ciphersuite(
1752                 ssl->session_negotiate->encrypt_then_mac,
1753                 suite);
1754 
1755         if (ssl_mode != MBEDTLS_SSL_MODE_CBC_ETM) {
1756             ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_DISABLED;
1757         }
1758     }
1759 
1760     if (ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
1761         *olen = 0;
1762         return;
1763     }
1764 
1765     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding encrypt then mac extension"));
1766 
1767     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
1768     p += 2;
1769 
1770     *p++ = 0x00;
1771     *p++ = 0x00;
1772 
1773     *olen = 4;
1774 }
1775 #endif /* MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM */
1776 
1777 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
ssl_write_extended_ms_ext(mbedtls_ssl_context * ssl,unsigned char * buf,size_t * olen)1778 static void ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
1779                                       unsigned char *buf,
1780                                       size_t *olen)
1781 {
1782     unsigned char *p = buf;
1783 
1784     if (ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
1785         *olen = 0;
1786         return;
1787     }
1788 
1789     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding extended master secret "
1790                               "extension"));
1791 
1792     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
1793     p += 2;
1794 
1795     *p++ = 0x00;
1796     *p++ = 0x00;
1797 
1798     *olen = 4;
1799 }
1800 #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
1801 
1802 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
ssl_write_session_ticket_ext(mbedtls_ssl_context * ssl,unsigned char * buf,size_t * olen)1803 static void ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
1804                                          unsigned char *buf,
1805                                          size_t *olen)
1806 {
1807     unsigned char *p = buf;
1808 
1809     if (ssl->handshake->new_session_ticket == 0) {
1810         *olen = 0;
1811         return;
1812     }
1813 
1814     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding session ticket extension"));
1815 
1816     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
1817     p += 2;
1818 
1819     *p++ = 0x00;
1820     *p++ = 0x00;
1821 
1822     *olen = 4;
1823 }
1824 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
1825 
ssl_write_renegotiation_ext(mbedtls_ssl_context * ssl,unsigned char * buf,size_t * olen)1826 static void ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
1827                                         unsigned char *buf,
1828                                         size_t *olen)
1829 {
1830     unsigned char *p = buf;
1831 
1832     if (ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION) {
1833         *olen = 0;
1834         return;
1835     }
1836 
1837     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, secure renegotiation extension"));
1838 
1839     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
1840     p += 2;
1841 
1842 #if defined(MBEDTLS_SSL_RENEGOTIATION)
1843     if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
1844         *p++ = 0x00;
1845         *p++ = (ssl->verify_data_len * 2 + 1) & 0xFF;
1846         *p++ = ssl->verify_data_len * 2 & 0xFF;
1847 
1848         memcpy(p, ssl->peer_verify_data, ssl->verify_data_len);
1849         p += ssl->verify_data_len;
1850         memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
1851         p += ssl->verify_data_len;
1852     } else
1853 #endif /* MBEDTLS_SSL_RENEGOTIATION */
1854     {
1855         *p++ = 0x00;
1856         *p++ = 0x01;
1857         *p++ = 0x00;
1858     }
1859 
1860     *olen = (size_t) (p - buf);
1861 }
1862 
1863 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
ssl_write_max_fragment_length_ext(mbedtls_ssl_context * ssl,unsigned char * buf,size_t * olen)1864 static void ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
1865                                               unsigned char *buf,
1866                                               size_t *olen)
1867 {
1868     unsigned char *p = buf;
1869 
1870     if (ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
1871         *olen = 0;
1872         return;
1873     }
1874 
1875     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, max_fragment_length extension"));
1876 
1877     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
1878     p += 2;
1879 
1880     *p++ = 0x00;
1881     *p++ = 1;
1882 
1883     *p++ = ssl->session_negotiate->mfl_code;
1884 
1885     *olen = 5;
1886 }
1887 #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
1888 
1889 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
1890     defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
1891     defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
ssl_write_supported_point_formats_ext(mbedtls_ssl_context * ssl,unsigned char * buf,size_t * olen)1892 static void ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
1893                                                   unsigned char *buf,
1894                                                   size_t *olen)
1895 {
1896     unsigned char *p = buf;
1897     ((void) ssl);
1898 
1899     if ((ssl->handshake->cli_exts &
1900          MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT) == 0) {
1901         *olen = 0;
1902         return;
1903     }
1904 
1905     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, supported_point_formats extension"));
1906 
1907     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
1908     p += 2;
1909 
1910     *p++ = 0x00;
1911     *p++ = 2;
1912 
1913     *p++ = 1;
1914     *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
1915 
1916     *olen = 6;
1917 }
1918 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED ||
1919           MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED ||
1920           MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1921 
1922 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context * ssl,unsigned char * buf,size_t * olen)1923 static void ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
1924                                        unsigned char *buf,
1925                                        size_t *olen)
1926 {
1927     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1928     unsigned char *p = buf;
1929     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1930     size_t kkpp_len;
1931 
1932     *olen = 0;
1933 
1934     /* Skip costly computation if not needed */
1935     if (ssl->handshake->ciphersuite_info->key_exchange !=
1936         MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
1937         return;
1938     }
1939 
1940     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, ecjpake kkpp extension"));
1941 
1942     if (end - p < 4) {
1943         MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
1944         return;
1945     }
1946 
1947     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
1948     p += 2;
1949 
1950 #if defined(MBEDTLS_USE_PSA_CRYPTO)
1951     ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
1952                                           p + 2, (size_t) (end - p - 2), &kkpp_len,
1953                                           MBEDTLS_ECJPAKE_ROUND_ONE);
1954     if (ret != 0) {
1955         psa_destroy_key(ssl->handshake->psa_pake_password);
1956         psa_pake_abort(&ssl->handshake->psa_pake_ctx);
1957         MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
1958         return;
1959     }
1960 #else
1961     ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
1962                                           p + 2, (size_t) (end - p - 2), &kkpp_len,
1963                                           ssl->conf->f_rng, ssl->conf->p_rng);
1964     if (ret != 0) {
1965         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_one", ret);
1966         return;
1967     }
1968 #endif /* MBEDTLS_USE_PSA_CRYPTO */
1969 
1970     MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
1971     p += 2;
1972 
1973     *olen = kkpp_len + 4;
1974 }
1975 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
1976 
1977 #if defined(MBEDTLS_SSL_DTLS_SRTP) && defined(MBEDTLS_SSL_PROTO_DTLS)
ssl_write_use_srtp_ext(mbedtls_ssl_context * ssl,unsigned char * buf,size_t * olen)1978 static void ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
1979                                    unsigned char *buf,
1980                                    size_t *olen)
1981 {
1982     size_t mki_len = 0, ext_len = 0;
1983     uint16_t profile_value = 0;
1984     const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
1985 
1986     *olen = 0;
1987 
1988     if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
1989         (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET)) {
1990         return;
1991     }
1992 
1993     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, adding use_srtp extension"));
1994 
1995     if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
1996         mki_len = ssl->dtls_srtp_info.mki_len;
1997     }
1998 
1999     /* The extension total size is 9 bytes :
2000      * - 2 bytes for the extension tag
2001      * - 2 bytes for the total size
2002      * - 2 bytes for the protection profile length
2003      * - 2 bytes for the protection profile
2004      * - 1 byte for the mki length
2005      * +  the actual mki length
2006      * Check we have enough room in the output buffer */
2007     if ((size_t) (end - buf) < mki_len + 9) {
2008         MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small"));
2009         return;
2010     }
2011 
2012     /* extension */
2013     MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, buf, 0);
2014     /*
2015      * total length 5 and mki value: only one profile(2 bytes)
2016      *              and length(2 bytes) and srtp_mki  )
2017      */
2018     ext_len = 5 + mki_len;
2019     MBEDTLS_PUT_UINT16_BE(ext_len, buf, 2);
2020 
2021     /* protection profile length: 2 */
2022     buf[4] = 0x00;
2023     buf[5] = 0x02;
2024     profile_value = mbedtls_ssl_check_srtp_profile_value(
2025         ssl->dtls_srtp_info.chosen_dtls_srtp_profile);
2026     if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
2027         MBEDTLS_PUT_UINT16_BE(profile_value, buf, 6);
2028     } else {
2029         MBEDTLS_SSL_DEBUG_MSG(1, ("use_srtp extension invalid profile"));
2030         return;
2031     }
2032 
2033     buf[8] = mki_len & 0xFF;
2034     memcpy(&buf[9], ssl->dtls_srtp_info.mki_value, mki_len);
2035 
2036     *olen = 9 + mki_len;
2037 }
2038 #endif /* MBEDTLS_SSL_DTLS_SRTP */
2039 
2040 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
2041 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_write_hello_verify_request(mbedtls_ssl_context * ssl)2042 static int ssl_write_hello_verify_request(mbedtls_ssl_context *ssl)
2043 {
2044     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2045     unsigned char *p = ssl->out_msg + 4;
2046     unsigned char *cookie_len_byte;
2047 
2048     MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello verify request"));
2049 
2050     /*
2051      * struct {
2052      *   ProtocolVersion server_version;
2053      *   opaque cookie<0..2^8-1>;
2054      * } HelloVerifyRequest;
2055      */
2056 
2057     /* The RFC is not clear on this point, but sending the actual negotiated
2058      * version looks like the most interoperable thing to do. */
2059     mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2060     MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
2061     p += 2;
2062 
2063     /* If we get here, f_cookie_check is not null */
2064     if (ssl->conf->f_cookie_write == NULL) {
2065         MBEDTLS_SSL_DEBUG_MSG(1, ("inconsistent cookie callbacks"));
2066         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2067     }
2068 
2069     /* Skip length byte until we know the length */
2070     cookie_len_byte = p++;
2071 
2072     if ((ret = ssl->conf->f_cookie_write(ssl->conf->p_cookie,
2073                                          &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN,
2074                                          ssl->cli_id, ssl->cli_id_len)) != 0) {
2075         MBEDTLS_SSL_DEBUG_RET(1, "f_cookie_write", ret);
2076         return ret;
2077     }
2078 
2079     *cookie_len_byte = (unsigned char) (p - (cookie_len_byte + 1));
2080 
2081     MBEDTLS_SSL_DEBUG_BUF(3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte);
2082 
2083     ssl->out_msglen  = (size_t) (p - ssl->out_msg);
2084     ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2085     ssl->out_msg[0]  = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;
2086 
2087     ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;
2088 
2089     if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2090         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2091         return ret;
2092     }
2093 
2094 #if defined(MBEDTLS_SSL_PROTO_DTLS)
2095     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2096         (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2097         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2098         return ret;
2099     }
2100 #endif /* MBEDTLS_SSL_PROTO_DTLS */
2101 
2102     MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello verify request"));
2103 
2104     return 0;
2105 }
2106 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
2107 
ssl_handle_id_based_session_resumption(mbedtls_ssl_context * ssl)2108 static void ssl_handle_id_based_session_resumption(mbedtls_ssl_context *ssl)
2109 {
2110     int ret;
2111     mbedtls_ssl_session session_tmp;
2112     mbedtls_ssl_session * const session = ssl->session_negotiate;
2113 
2114     /* Resume is 0  by default, see ssl_handshake_init().
2115      * It may be already set to 1 by ssl_parse_session_ticket_ext(). */
2116     if (ssl->handshake->resume == 1) {
2117         return;
2118     }
2119     if (session->id_len == 0) {
2120         return;
2121     }
2122     if (ssl->conf->f_get_cache == NULL) {
2123         return;
2124     }
2125 #if defined(MBEDTLS_SSL_RENEGOTIATION)
2126     if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
2127         return;
2128     }
2129 #endif
2130 
2131     mbedtls_ssl_session_init(&session_tmp);
2132 
2133     ret = ssl->conf->f_get_cache(ssl->conf->p_cache,
2134                                  session->id,
2135                                  session->id_len,
2136                                  &session_tmp);
2137     if (ret != 0) {
2138         goto exit;
2139     }
2140 
2141     if (session->ciphersuite != session_tmp.ciphersuite) {
2142         /* Mismatch between cached and negotiated session */
2143         goto exit;
2144     }
2145 
2146     /* Move semantics */
2147     mbedtls_ssl_session_free(session);
2148     *session = session_tmp;
2149     memset(&session_tmp, 0, sizeof(session_tmp));
2150 
2151     MBEDTLS_SSL_DEBUG_MSG(3, ("session successfully restored from cache"));
2152     ssl->handshake->resume = 1;
2153 
2154 exit:
2155 
2156     mbedtls_ssl_session_free(&session_tmp);
2157 }
2158 
2159 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_write_server_hello(mbedtls_ssl_context * ssl)2160 static int ssl_write_server_hello(mbedtls_ssl_context *ssl)
2161 {
2162 #if defined(MBEDTLS_HAVE_TIME)
2163     mbedtls_time_t t;
2164 #endif
2165     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2166     size_t olen, ext_len = 0, n;
2167     unsigned char *buf, *p;
2168 
2169     MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello"));
2170 
2171 #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)
2172     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2173         ssl->handshake->cookie_verify_result != 0) {
2174         MBEDTLS_SSL_DEBUG_MSG(2, ("client hello was not authenticated"));
2175         MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
2176 
2177         return ssl_write_hello_verify_request(ssl);
2178     }
2179 #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */
2180 
2181     /*
2182      *     0  .   0   handshake type
2183      *     1  .   3   handshake length
2184      *     4  .   5   protocol version
2185      *     6  .   9   UNIX time()
2186      *    10  .  37   random bytes
2187      */
2188     buf = ssl->out_msg;
2189     p = buf + 4;
2190 
2191     mbedtls_ssl_write_version(p, ssl->conf->transport, ssl->tls_version);
2192     p += 2;
2193 
2194     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen version: [%d:%d]",
2195                               buf[4], buf[5]));
2196 
2197 #if defined(MBEDTLS_HAVE_TIME)
2198     t = mbedtls_time(NULL);
2199     MBEDTLS_PUT_UINT32_BE(t, p, 0);
2200     p += 4;
2201 
2202     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %" MBEDTLS_PRINTF_LONGLONG,
2203                               (long long) t));
2204 #else
2205     if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 4)) != 0) {
2206         return ret;
2207     }
2208 
2209     p += 4;
2210 #endif /* MBEDTLS_HAVE_TIME */
2211 
2212     if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 20)) != 0) {
2213         return ret;
2214     }
2215     p += 20;
2216 
2217 #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
2218     /*
2219      * RFC 8446
2220      * TLS 1.3 has a downgrade protection mechanism embedded in the server's
2221      * random value. TLS 1.3 servers which negotiate TLS 1.2 or below in
2222      * response to a ClientHello MUST set the last 8 bytes of their Random
2223      * value specially in their ServerHello.
2224      */
2225     if (mbedtls_ssl_conf_is_tls13_enabled(ssl->conf)) {
2226         static const unsigned char magic_tls12_downgrade_string[] =
2227         { 'D', 'O', 'W', 'N', 'G', 'R', 'D', 1 };
2228 
2229         MBEDTLS_STATIC_ASSERT(
2230             sizeof(magic_tls12_downgrade_string) == 8,
2231             "magic_tls12_downgrade_string does not have the expected size");
2232 
2233         memcpy(p, magic_tls12_downgrade_string,
2234                sizeof(magic_tls12_downgrade_string));
2235     } else
2236 #endif
2237     {
2238         if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p, 8)) != 0) {
2239             return ret;
2240         }
2241     }
2242     p += 8;
2243 
2244     memcpy(ssl->handshake->randbytes + 32, buf + 6, 32);
2245 
2246     MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 6, 32);
2247 
2248     ssl_handle_id_based_session_resumption(ssl);
2249 
2250     if (ssl->handshake->resume == 0) {
2251         /*
2252          * New session, create a new session id,
2253          * unless we're about to issue a session ticket
2254          */
2255         ssl->state++;
2256 
2257 #if defined(MBEDTLS_HAVE_TIME)
2258         ssl->session_negotiate->start = mbedtls_time(NULL);
2259 #endif
2260 
2261 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
2262         if (ssl->handshake->new_session_ticket != 0) {
2263             ssl->session_negotiate->id_len = n = 0;
2264             memset(ssl->session_negotiate->id, 0, 32);
2265         } else
2266 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
2267         {
2268             ssl->session_negotiate->id_len = n = 32;
2269             if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, ssl->session_negotiate->id,
2270                                         n)) != 0) {
2271                 return ret;
2272             }
2273         }
2274     } else {
2275         /*
2276          * Resuming a session
2277          */
2278         n = ssl->session_negotiate->id_len;
2279         ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
2280 
2281         if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
2282             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
2283             return ret;
2284         }
2285     }
2286 
2287     /*
2288      *    38  .  38     session id length
2289      *    39  . 38+n    session id
2290      *   39+n . 40+n    chosen ciphersuite
2291      *   41+n . 41+n    chosen compression alg.
2292      *   42+n . 43+n    extensions length
2293      *   44+n . 43+n+m  extensions
2294      */
2295     *p++ = (unsigned char) ssl->session_negotiate->id_len;
2296     memcpy(p, ssl->session_negotiate->id, ssl->session_negotiate->id_len);
2297     p += ssl->session_negotiate->id_len;
2298 
2299     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
2300     MBEDTLS_SSL_DEBUG_BUF(3,   "server hello, session id", buf + 39, n);
2301     MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
2302                               ssl->handshake->resume ? "a" : "no"));
2303 
2304     MBEDTLS_PUT_UINT16_BE(ssl->session_negotiate->ciphersuite, p, 0);
2305     p += 2;
2306     *p++ = MBEDTLS_BYTE_0(MBEDTLS_SSL_COMPRESS_NULL);
2307 
2308     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %s",
2309                               mbedtls_ssl_get_ciphersuite_name(ssl->session_negotiate->ciphersuite)));
2310     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: 0x%02X",
2311                               (unsigned int) MBEDTLS_SSL_COMPRESS_NULL));
2312 
2313     /*
2314      *  First write extensions, then the total length
2315      */
2316     ssl_write_renegotiation_ext(ssl, p + 2 + ext_len, &olen);
2317     ext_len += olen;
2318 
2319 #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
2320     ssl_write_max_fragment_length_ext(ssl, p + 2 + ext_len, &olen);
2321     ext_len += olen;
2322 #endif
2323 
2324 #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
2325     ssl_write_cid_ext(ssl, p + 2 + ext_len, &olen);
2326     ext_len += olen;
2327 #endif
2328 
2329 #if defined(MBEDTLS_SSL_SOME_SUITES_USE_CBC_ETM)
2330     ssl_write_encrypt_then_mac_ext(ssl, p + 2 + ext_len, &olen);
2331     ext_len += olen;
2332 #endif
2333 
2334 #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
2335     ssl_write_extended_ms_ext(ssl, p + 2 + ext_len, &olen);
2336     ext_len += olen;
2337 #endif
2338 
2339 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
2340     ssl_write_session_ticket_ext(ssl, p + 2 + ext_len, &olen);
2341     ext_len += olen;
2342 #endif
2343 
2344 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_OR_ECDHE_1_2_ENABLED) || \
2345     defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED) || \
2346     defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2347     const mbedtls_ssl_ciphersuite_t *suite =
2348         mbedtls_ssl_ciphersuite_from_id(ssl->session_negotiate->ciphersuite);
2349     if (suite != NULL && mbedtls_ssl_ciphersuite_uses_ec(suite)) {
2350         ssl_write_supported_point_formats_ext(ssl, p + 2 + ext_len, &olen);
2351         ext_len += olen;
2352     }
2353 #endif
2354 
2355 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2356     ssl_write_ecjpake_kkpp_ext(ssl, p + 2 + ext_len, &olen);
2357     ext_len += olen;
2358 #endif
2359 
2360 #if defined(MBEDTLS_SSL_ALPN)
2361     unsigned char *end = buf + MBEDTLS_SSL_OUT_CONTENT_LEN - 4;
2362     if ((ret = mbedtls_ssl_write_alpn_ext(ssl, p + 2 + ext_len, end, &olen))
2363         != 0) {
2364         return ret;
2365     }
2366 
2367     ext_len += olen;
2368 #endif
2369 
2370 #if defined(MBEDTLS_SSL_DTLS_SRTP)
2371     ssl_write_use_srtp_ext(ssl, p + 2 + ext_len, &olen);
2372     ext_len += olen;
2373 #endif
2374 
2375     MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
2376                               ext_len));
2377 
2378     if (ext_len > 0) {
2379         MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
2380         p += 2 + ext_len;
2381     }
2382 
2383     ssl->out_msglen  = (size_t) (p - buf);
2384     ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2385     ssl->out_msg[0]  = MBEDTLS_SSL_HS_SERVER_HELLO;
2386 
2387     ret = mbedtls_ssl_write_handshake_msg(ssl);
2388 
2389     MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello"));
2390 
2391     return ret;
2392 }
2393 
2394 #if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2395 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_write_certificate_request(mbedtls_ssl_context * ssl)2396 static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
2397 {
2398     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2399         ssl->handshake->ciphersuite_info;
2400 
2401     MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
2402 
2403     if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2404         MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2405         ssl->state++;
2406         return 0;
2407     }
2408 
2409     MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2410     return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2411 }
2412 #else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
2413 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_write_certificate_request(mbedtls_ssl_context * ssl)2414 static int ssl_write_certificate_request(mbedtls_ssl_context *ssl)
2415 {
2416     int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
2417     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2418         ssl->handshake->ciphersuite_info;
2419     uint16_t dn_size, total_dn_size; /* excluding length bytes */
2420     size_t ct_len, sa_len; /* including length bytes */
2421     unsigned char *buf, *p;
2422     const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
2423     const mbedtls_x509_crt *crt;
2424     int authmode;
2425 
2426     MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate request"));
2427 
2428     ssl->state++;
2429 
2430 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2431     if (ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET) {
2432         authmode = ssl->handshake->sni_authmode;
2433     } else
2434 #endif
2435     authmode = ssl->conf->authmode;
2436 
2437     if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info) ||
2438         authmode == MBEDTLS_SSL_VERIFY_NONE) {
2439         MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate request"));
2440         return 0;
2441     }
2442 
2443     /*
2444      *     0  .   0   handshake type
2445      *     1  .   3   handshake length
2446      *     4  .   4   cert type count
2447      *     5  .. m-1  cert types
2448      *     m  .. m+1  sig alg length (TLS 1.2 only)
2449      *    m+1 .. n-1  SignatureAndHashAlgorithms (TLS 1.2 only)
2450      *     n  .. n+1  length of all DNs
2451      *    n+2 .. n+3  length of DN 1
2452      *    n+4 .. ...  Distinguished Name #1
2453      *    ... .. ...  length of DN 2, etc.
2454      */
2455     buf = ssl->out_msg;
2456     p = buf + 4;
2457 
2458     /*
2459      * Supported certificate types
2460      *
2461      *     ClientCertificateType certificate_types<1..2^8-1>;
2462      *     enum { (255) } ClientCertificateType;
2463      */
2464     ct_len = 0;
2465 
2466 #if defined(MBEDTLS_RSA_C)
2467     p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;
2468 #endif
2469 #if defined(MBEDTLS_KEY_EXCHANGE_ECDSA_CERT_REQ_ALLOWED_ENABLED)
2470     p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;
2471 #endif
2472 
2473     p[0] = (unsigned char) ct_len++;
2474     p += ct_len;
2475 
2476     sa_len = 0;
2477 
2478     /*
2479      * Add signature_algorithms for verify (TLS 1.2)
2480      *
2481      *     SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;
2482      *
2483      *     struct {
2484      *           HashAlgorithm hash;
2485      *           SignatureAlgorithm signature;
2486      *     } SignatureAndHashAlgorithm;
2487      *
2488      *     enum { (255) } HashAlgorithm;
2489      *     enum { (255) } SignatureAlgorithm;
2490      */
2491     const uint16_t *sig_alg = mbedtls_ssl_get_sig_algs(ssl);
2492     if (sig_alg == NULL) {
2493         return MBEDTLS_ERR_SSL_BAD_CONFIG;
2494     }
2495 
2496     for (; *sig_alg != MBEDTLS_TLS_SIG_NONE; sig_alg++) {
2497         unsigned char hash = MBEDTLS_BYTE_1(*sig_alg);
2498 
2499         if (mbedtls_ssl_set_calc_verify_md(ssl, hash)) {
2500             continue;
2501         }
2502         if (!mbedtls_ssl_sig_alg_is_supported(ssl, *sig_alg)) {
2503             continue;
2504         }
2505 
2506         /* Write elements at offsets starting from 1 (offset 0 is for the
2507          * length). Thus the offset of each element is the length of the
2508          * partial list including that element. */
2509         sa_len += 2;
2510         MBEDTLS_PUT_UINT16_BE(*sig_alg, p, sa_len);
2511 
2512     }
2513 
2514     /* Fill in list length. */
2515     MBEDTLS_PUT_UINT16_BE(sa_len, p, 0);
2516     sa_len += 2;
2517     p += sa_len;
2518 
2519     /*
2520      * DistinguishedName certificate_authorities<0..2^16-1>;
2521      * opaque DistinguishedName<1..2^16-1>;
2522      */
2523     p += 2;
2524 
2525     total_dn_size = 0;
2526 
2527     if (ssl->conf->cert_req_ca_list ==  MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED) {
2528         /* NOTE: If trusted certificates are provisioned
2529          *       via a CA callback (configured through
2530          *       `mbedtls_ssl_conf_ca_cb()`, then the
2531          *       CertificateRequest is currently left empty. */
2532 
2533 #if defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
2534 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2535         if (ssl->handshake->dn_hints != NULL) {
2536             crt = ssl->handshake->dn_hints;
2537         } else
2538 #endif
2539         if (ssl->conf->dn_hints != NULL) {
2540             crt = ssl->conf->dn_hints;
2541         } else
2542 #endif
2543 #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2544         if (ssl->handshake->sni_ca_chain != NULL) {
2545             crt = ssl->handshake->sni_ca_chain;
2546         } else
2547 #endif
2548         crt = ssl->conf->ca_chain;
2549 
2550         while (crt != NULL && crt->version != 0) {
2551             /* It follows from RFC 5280 A.1 that this length
2552              * can be represented in at most 11 bits. */
2553             dn_size = (uint16_t) crt->subject_raw.len;
2554 
2555             if (end < p || (size_t) (end - p) < 2 + (size_t) dn_size) {
2556                 MBEDTLS_SSL_DEBUG_MSG(1, ("skipping CAs: buffer too short"));
2557                 break;
2558             }
2559 
2560             MBEDTLS_PUT_UINT16_BE(dn_size, p, 0);
2561             p += 2;
2562             memcpy(p, crt->subject_raw.p, dn_size);
2563             p += dn_size;
2564 
2565             MBEDTLS_SSL_DEBUG_BUF(3, "requested DN", p - dn_size, dn_size);
2566 
2567             total_dn_size += (unsigned short) (2 + dn_size);
2568             crt = crt->next;
2569         }
2570     }
2571 
2572     ssl->out_msglen  = (size_t) (p - buf);
2573     ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
2574     ssl->out_msg[0]  = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;
2575     MBEDTLS_PUT_UINT16_BE(total_dn_size, ssl->out_msg, 4 + ct_len + sa_len);
2576 
2577     ret = mbedtls_ssl_write_handshake_msg(ssl);
2578 
2579     MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate request"));
2580 
2581     return ret;
2582 }
2583 #endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
2584 
2585 #if (defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2586     defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED))
2587 #if defined(MBEDTLS_USE_PSA_CRYPTO)
2588 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_get_ecdh_params_from_cert(mbedtls_ssl_context * ssl)2589 static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
2590 {
2591     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2592     psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2593     mbedtls_pk_context *pk;
2594     mbedtls_pk_type_t pk_type;
2595     psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
2596     unsigned char buf[PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS)];
2597     size_t key_len;
2598 #if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2599     uint16_t tls_id = 0;
2600     psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
2601     mbedtls_ecp_group_id grp_id;
2602     mbedtls_ecp_keypair *key;
2603 #endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
2604 
2605     pk = mbedtls_ssl_own_key(ssl);
2606 
2607     if (pk == NULL) {
2608         return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2609     }
2610 
2611     pk_type = mbedtls_pk_get_type(pk);
2612 
2613     switch (pk_type) {
2614         case MBEDTLS_PK_OPAQUE:
2615 #if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2616         case MBEDTLS_PK_ECKEY:
2617         case MBEDTLS_PK_ECKEY_DH:
2618         case MBEDTLS_PK_ECDSA:
2619 #endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2620             if (!mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY)) {
2621                 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2622             }
2623 
2624             /* Get the attributes of the key previously parsed by PK module in
2625              * order to extract its type and length (in bits). */
2626             status = psa_get_key_attributes(pk->priv_id, &key_attributes);
2627             if (status != PSA_SUCCESS) {
2628                 ret = PSA_TO_MBEDTLS_ERR(status);
2629                 goto exit;
2630             }
2631             ssl->handshake->xxdh_psa_type = psa_get_key_type(&key_attributes);
2632             ssl->handshake->xxdh_psa_bits = psa_get_key_bits(&key_attributes);
2633 
2634             if (pk_type == MBEDTLS_PK_OPAQUE) {
2635                 /* Opaque key is created by the user (externally from Mbed TLS)
2636                  * so we assume it already has the right algorithm and flags
2637                  * set. Just copy its ID as reference. */
2638                 ssl->handshake->xxdh_psa_privkey = pk->priv_id;
2639                 ssl->handshake->xxdh_psa_privkey_is_external = 1;
2640             } else {
2641                 /* PK_ECKEY[_DH] and PK_ECDSA instead as parsed from the PK
2642                  * module and only have ECDSA capabilities. Since we need
2643                  * them for ECDH later, we export and then re-import them with
2644                  * proper flags and algorithm. Of course We also set key's type
2645                  * and bits that we just got above. */
2646                 key_attributes = psa_key_attributes_init();
2647                 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2648                 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2649                 psa_set_key_type(&key_attributes,
2650                                  PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2651                 psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
2652 
2653                 status = psa_export_key(pk->priv_id, buf, sizeof(buf), &key_len);
2654                 if (status != PSA_SUCCESS) {
2655                     ret = PSA_TO_MBEDTLS_ERR(status);
2656                     goto exit;
2657                 }
2658                 status = psa_import_key(&key_attributes, buf, key_len,
2659                                         &ssl->handshake->xxdh_psa_privkey);
2660                 if (status != PSA_SUCCESS) {
2661                     ret = PSA_TO_MBEDTLS_ERR(status);
2662                     goto exit;
2663                 }
2664 
2665                 /* Set this key as owned by the TLS library: it will be its duty
2666                  * to clear it exit. */
2667                 ssl->handshake->xxdh_psa_privkey_is_external = 0;
2668             }
2669 
2670             ret = 0;
2671             break;
2672 #if !defined(MBEDTLS_PK_USE_PSA_EC_DATA)
2673         case MBEDTLS_PK_ECKEY:
2674         case MBEDTLS_PK_ECKEY_DH:
2675         case MBEDTLS_PK_ECDSA:
2676             key = mbedtls_pk_ec_rw(*pk);
2677             grp_id = mbedtls_pk_get_ec_group_id(pk);
2678             if (grp_id == MBEDTLS_ECP_DP_NONE) {
2679                 return MBEDTLS_ERR_ECP_BAD_INPUT_DATA;
2680             }
2681             tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
2682             if (tls_id == 0) {
2683                 /* This elliptic curve is not supported */
2684                 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2685             }
2686 
2687             /* If the above conversion to TLS ID was fine, then also this one will
2688                be, so there is no need to check the return value here */
2689             mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
2690                                                        &ssl->handshake->xxdh_psa_bits);
2691 
2692             ssl->handshake->xxdh_psa_type = key_type;
2693 
2694             key_attributes = psa_key_attributes_init();
2695             psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2696             psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
2697             psa_set_key_type(&key_attributes,
2698                              PSA_KEY_TYPE_ECC_KEY_PAIR(ssl->handshake->xxdh_psa_type));
2699             psa_set_key_bits(&key_attributes, ssl->handshake->xxdh_psa_bits);
2700 
2701             ret = mbedtls_ecp_write_key_ext(key, &key_len, buf, sizeof(buf));
2702             if (ret != 0) {
2703                 mbedtls_platform_zeroize(buf, sizeof(buf));
2704                 break;
2705             }
2706 
2707             status = psa_import_key(&key_attributes, buf, key_len,
2708                                     &ssl->handshake->xxdh_psa_privkey);
2709             if (status != PSA_SUCCESS) {
2710                 ret = PSA_TO_MBEDTLS_ERR(status);
2711                 mbedtls_platform_zeroize(buf, sizeof(buf));
2712                 break;
2713             }
2714 
2715             mbedtls_platform_zeroize(buf, sizeof(buf));
2716             ret = 0;
2717             break;
2718 #endif /* !MBEDTLS_PK_USE_PSA_EC_DATA */
2719         default:
2720             ret = MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2721     }
2722 
2723 exit:
2724     psa_reset_key_attributes(&key_attributes);
2725     mbedtls_platform_zeroize(buf, sizeof(buf));
2726 
2727     return ret;
2728 }
2729 #else /* MBEDTLS_USE_PSA_CRYPTO */
2730 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_get_ecdh_params_from_cert(mbedtls_ssl_context * ssl)2731 static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
2732 {
2733     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2734 
2735     const mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
2736     if (private_key == NULL) {
2737         MBEDTLS_SSL_DEBUG_MSG(1, ("got no server private key"));
2738         return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
2739     }
2740 
2741     if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_ECKEY)) {
2742         MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2743         return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
2744     }
2745 
2746     if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx,
2747                                        mbedtls_pk_ec_ro(*mbedtls_ssl_own_key(ssl)),
2748                                        MBEDTLS_ECDH_OURS)) != 0) {
2749         MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2750         return ret;
2751     }
2752 
2753     return 0;
2754 }
2755 #endif /* MBEDTLS_USE_PSA_CRYPTO */
2756 #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2757           MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
2758 
2759 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
2760     defined(MBEDTLS_SSL_ASYNC_PRIVATE)
2761 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_resume_server_key_exchange(mbedtls_ssl_context * ssl,size_t * signature_len)2762 static int ssl_resume_server_key_exchange(mbedtls_ssl_context *ssl,
2763                                           size_t *signature_len)
2764 {
2765     /* Append the signature to ssl->out_msg, leaving 2 bytes for the
2766      * signature length which will be added in ssl_write_server_key_exchange
2767      * after the call to ssl_prepare_server_key_exchange.
2768      * ssl_write_server_key_exchange also takes care of incrementing
2769      * ssl->out_msglen. */
2770     unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2;
2771     size_t sig_max_len = (ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN
2772                           - sig_start);
2773     int ret = ssl->conf->f_async_resume(ssl,
2774                                         sig_start, signature_len, sig_max_len);
2775     if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
2776         ssl->handshake->async_in_progress = 0;
2777         mbedtls_ssl_set_async_operation_data(ssl, NULL);
2778     }
2779     MBEDTLS_SSL_DEBUG_RET(2, "ssl_resume_server_key_exchange", ret);
2780     return ret;
2781 }
2782 #endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
2783           defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
2784 
2785 /* Prepare the ServerKeyExchange message, up to and including
2786  * calculating the signature if any, but excluding formatting the
2787  * signature and sending the message. */
2788 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_prepare_server_key_exchange(mbedtls_ssl_context * ssl,size_t * signature_len)2789 static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
2790                                            size_t *signature_len)
2791 {
2792     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
2793         ssl->handshake->ciphersuite_info;
2794 
2795 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED)
2796 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
2797     unsigned char *dig_signed = NULL;
2798 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
2799 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_PFS_ENABLED */
2800 
2801     (void) ciphersuite_info; /* unused in some configurations */
2802 #if !defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
2803     (void) signature_len;
2804 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
2805 
2806 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
2807 #if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
2808     size_t out_buf_len = ssl->out_buf_len - (size_t) (ssl->out_msg - ssl->out_buf);
2809 #else
2810     size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN - (size_t) (ssl->out_msg - ssl->out_buf);
2811 #endif
2812 #endif
2813 
2814     ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */
2815 
2816     /*
2817      *
2818      * Part 1: Provide key exchange parameters for chosen ciphersuite.
2819      *
2820      */
2821 
2822     /*
2823      * - ECJPAKE key exchanges
2824      */
2825 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2826     if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
2827         int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2828 #if defined(MBEDTLS_USE_PSA_CRYPTO)
2829         unsigned char *out_p = ssl->out_msg + ssl->out_msglen;
2830         unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
2831                                ssl->out_msglen;
2832         size_t output_offset = 0;
2833         size_t output_len = 0;
2834 
2835         /*
2836          * The first 3 bytes are:
2837          * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2838          * [1, 2] elliptic curve's TLS ID
2839          *
2840          * However since we only support secp256r1 for now, we hardcode its
2841          * TLS ID here
2842          */
2843         uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
2844             MBEDTLS_ECP_DP_SECP256R1);
2845         if (tls_id == 0) {
2846             return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
2847         }
2848         *out_p = MBEDTLS_ECP_TLS_NAMED_CURVE;
2849         MBEDTLS_PUT_UINT16_BE(tls_id, out_p, 1);
2850         output_offset += 3;
2851 
2852         ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
2853                                               out_p + output_offset,
2854                                               end_p - out_p - output_offset, &output_len,
2855                                               MBEDTLS_ECJPAKE_ROUND_TWO);
2856         if (ret != 0) {
2857             psa_destroy_key(ssl->handshake->psa_pake_password);
2858             psa_pake_abort(&ssl->handshake->psa_pake_ctx);
2859             MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
2860             return ret;
2861         }
2862 
2863         output_offset += output_len;
2864         ssl->out_msglen += output_offset;
2865 #else
2866         size_t len = 0;
2867 
2868         ret = mbedtls_ecjpake_write_round_two(
2869             &ssl->handshake->ecjpake_ctx,
2870             ssl->out_msg + ssl->out_msglen,
2871             MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len,
2872             ssl->conf->f_rng, ssl->conf->p_rng);
2873         if (ret != 0) {
2874             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
2875             return ret;
2876         }
2877 
2878         ssl->out_msglen += len;
2879 #endif /* MBEDTLS_USE_PSA_CRYPTO */
2880     }
2881 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
2882 
2883     /*
2884      * For (EC)DHE key exchanges with PSK, parameters are prefixed by support
2885      * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,
2886      * we use empty support identity hints here.
2887      **/
2888 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)   || \
2889     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
2890     if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
2891         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
2892         ssl->out_msg[ssl->out_msglen++] = 0x00;
2893         ssl->out_msg[ssl->out_msglen++] = 0x00;
2894     }
2895 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||
2896           MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
2897 
2898     /*
2899      * - DHE key exchanges
2900      */
2901 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED)
2902     if (mbedtls_ssl_ciphersuite_uses_dhe(ciphersuite_info)) {
2903         int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2904         size_t len = 0;
2905 
2906         if (ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL) {
2907             MBEDTLS_SSL_DEBUG_MSG(1, ("no DH parameters set"));
2908             return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
2909         }
2910 
2911         /*
2912          * Ephemeral DH parameters:
2913          *
2914          * struct {
2915          *     opaque dh_p<1..2^16-1>;
2916          *     opaque dh_g<1..2^16-1>;
2917          *     opaque dh_Ys<1..2^16-1>;
2918          * } ServerDHParams;
2919          */
2920         if ((ret = mbedtls_dhm_set_group(&ssl->handshake->dhm_ctx,
2921                                          &ssl->conf->dhm_P,
2922                                          &ssl->conf->dhm_G)) != 0) {
2923             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_set_group", ret);
2924             return ret;
2925         }
2926 
2927         if ((ret = mbedtls_dhm_make_params(
2928                  &ssl->handshake->dhm_ctx,
2929                  (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2930                  ssl->out_msg + ssl->out_msglen, &len,
2931                  ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2932             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_params", ret);
2933             return ret;
2934         }
2935 
2936 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
2937         dig_signed = ssl->out_msg + ssl->out_msglen;
2938 #endif
2939 
2940         ssl->out_msglen += len;
2941 
2942         MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2943         MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
2944         MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
2945         MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
2946     }
2947 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_DHE_ENABLED */
2948 
2949     /*
2950      * - ECDHE key exchanges
2951      */
2952 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED)
2953     if (mbedtls_ssl_ciphersuite_uses_ecdhe(ciphersuite_info)) {
2954         /*
2955          * Ephemeral ECDH parameters:
2956          *
2957          * struct {
2958          *     ECParameters curve_params;
2959          *     ECPoint      public;
2960          * } ServerECDHParams;
2961          */
2962         uint16_t *curr_tls_id = ssl->handshake->curves_tls_id;
2963         const uint16_t *group_list = mbedtls_ssl_get_groups(ssl);
2964         int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
2965         size_t len = 0;
2966 
2967         /* Match our preference list against the offered curves */
2968         if ((group_list == NULL) || (curr_tls_id == NULL)) {
2969             return MBEDTLS_ERR_SSL_BAD_CONFIG;
2970         }
2971         for (; *group_list != 0; group_list++) {
2972             for (curr_tls_id = ssl->handshake->curves_tls_id;
2973                  *curr_tls_id != 0; curr_tls_id++) {
2974                 if (*curr_tls_id == *group_list) {
2975                     goto curve_matching_done;
2976                 }
2977             }
2978         }
2979 
2980 curve_matching_done:
2981         if (*curr_tls_id == 0) {
2982             MBEDTLS_SSL_DEBUG_MSG(1, ("no matching curve for ECDHE"));
2983             return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
2984         }
2985 
2986         MBEDTLS_SSL_DEBUG_MSG(2, ("ECDHE curve: %s",
2987                                   mbedtls_ssl_get_curve_name_from_tls_id(*curr_tls_id)));
2988 
2989 #if defined(MBEDTLS_USE_PSA_CRYPTO)
2990         psa_status_t status = PSA_ERROR_GENERIC_ERROR;
2991         psa_key_attributes_t key_attributes;
2992         mbedtls_ssl_handshake_params *handshake = ssl->handshake;
2993         uint8_t *p = ssl->out_msg + ssl->out_msglen;
2994         const size_t header_size = 4; // curve_type(1), namedcurve(2),
2995                                       // data length(1)
2996         const size_t data_length_size = 1;
2997         psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
2998         size_t ec_bits = 0;
2999 
3000         MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
3001 
3002         /* Convert EC's TLS ID to PSA key type. */
3003         if (mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
3004                                                        &key_type,
3005                                                        &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
3006             MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid ecc group parse."));
3007             return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
3008         }
3009         handshake->xxdh_psa_type = key_type;
3010         handshake->xxdh_psa_bits = ec_bits;
3011 
3012         key_attributes = psa_key_attributes_init();
3013         psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
3014         psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
3015         psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
3016         psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
3017 
3018         /*
3019          * ECParameters curve_params
3020          *
3021          * First byte is curve_type, always named_curve
3022          */
3023         *p++ = MBEDTLS_ECP_TLS_NAMED_CURVE;
3024 
3025         /*
3026          * Next two bytes are the namedcurve value
3027          */
3028         MBEDTLS_PUT_UINT16_BE(*curr_tls_id, p, 0);
3029         p += 2;
3030 
3031         /* Generate ECDH private key. */
3032         status = psa_generate_key(&key_attributes,
3033                                   &handshake->xxdh_psa_privkey);
3034         if (status != PSA_SUCCESS) {
3035             ret = PSA_TO_MBEDTLS_ERR(status);
3036             MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
3037             return ret;
3038         }
3039 
3040         /*
3041          * ECPoint  public
3042          *
3043          * First byte is data length.
3044          * It will be filled later. p holds now the data length location.
3045          */
3046 
3047         /* Export the public part of the ECDH private key from PSA.
3048          * Make one byte space for the length.
3049          */
3050         unsigned char *own_pubkey = p + data_length_size;
3051 
3052         size_t own_pubkey_max_len = (size_t) (MBEDTLS_SSL_OUT_CONTENT_LEN
3053                                               - (own_pubkey - ssl->out_msg));
3054 
3055         status = psa_export_public_key(handshake->xxdh_psa_privkey,
3056                                        own_pubkey, own_pubkey_max_len,
3057                                        &len);
3058         if (status != PSA_SUCCESS) {
3059             ret = PSA_TO_MBEDTLS_ERR(status);
3060             MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
3061             (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3062             handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
3063             return ret;
3064         }
3065 
3066         /* Store the length of the exported public key. */
3067         *p = (uint8_t) len;
3068 
3069         /* Determine full message length. */
3070         len += header_size;
3071 #else
3072         mbedtls_ecp_group_id curr_grp_id =
3073             mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
3074 
3075         if ((ret = mbedtls_ecdh_setup(&ssl->handshake->ecdh_ctx,
3076                                       curr_grp_id)) != 0) {
3077             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecp_group_load", ret);
3078             return ret;
3079         }
3080 
3081         if ((ret = mbedtls_ecdh_make_params(
3082                  &ssl->handshake->ecdh_ctx, &len,
3083                  ssl->out_msg + ssl->out_msglen,
3084                  MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen,
3085                  ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3086             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_params", ret);
3087             return ret;
3088         }
3089 
3090         MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3091                                MBEDTLS_DEBUG_ECDH_Q);
3092 #endif /* MBEDTLS_USE_PSA_CRYPTO */
3093 
3094 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
3095         dig_signed = ssl->out_msg + ssl->out_msglen;
3096 #endif
3097 
3098         ssl->out_msglen += len;
3099     }
3100 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDHE_ENABLED */
3101 
3102     /*
3103      *
3104      * Part 2: For key exchanges involving the server signing the
3105      *         exchange parameters, compute and add the signature here.
3106      *
3107      */
3108 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
3109     if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
3110         if (dig_signed == NULL) {
3111             MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3112             return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
3113         }
3114 
3115         size_t dig_signed_len = (size_t) (ssl->out_msg + ssl->out_msglen - dig_signed);
3116         size_t hashlen = 0;
3117         unsigned char hash[MBEDTLS_MD_MAX_SIZE];
3118 
3119         int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3120 
3121         /*
3122          * 2.1: Choose hash algorithm:
3123          *      For TLS 1.2, obey signature-hash-algorithm extension
3124          *      to choose appropriate hash.
3125          */
3126 
3127         mbedtls_pk_type_t sig_alg =
3128             mbedtls_ssl_get_ciphersuite_sig_pk_alg(ciphersuite_info);
3129 
3130         unsigned char sig_hash =
3131             (unsigned char) mbedtls_ssl_tls12_get_preferred_hash_for_sig_alg(
3132                 ssl, mbedtls_ssl_sig_from_pk_alg(sig_alg));
3133 
3134         mbedtls_md_type_t md_alg = mbedtls_ssl_md_alg_from_hash(sig_hash);
3135 
3136         /*    For TLS 1.2, obey signature-hash-algorithm extension
3137          *    (RFC 5246, Sec. 7.4.1.4.1). */
3138         if (sig_alg == MBEDTLS_PK_NONE || md_alg == MBEDTLS_MD_NONE) {
3139             MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3140             /* (... because we choose a cipher suite
3141              *      only if there is a matching hash.) */
3142             return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
3143         }
3144 
3145         MBEDTLS_SSL_DEBUG_MSG(3, ("pick hash algorithm %u for signing", (unsigned) md_alg));
3146 
3147         /*
3148          * 2.2: Compute the hash to be signed
3149          */
3150         if (md_alg != MBEDTLS_MD_NONE) {
3151             ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
3152                                                          dig_signed,
3153                                                          dig_signed_len,
3154                                                          md_alg);
3155             if (ret != 0) {
3156                 return ret;
3157             }
3158         } else {
3159             MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3160             return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
3161         }
3162 
3163         MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
3164 
3165         /*
3166          * 2.3: Compute and add the signature
3167          */
3168         /*
3169          * We need to specify signature and hash algorithm explicitly through
3170          * a prefix to the signature.
3171          *
3172          * struct {
3173          *    HashAlgorithm hash;
3174          *    SignatureAlgorithm signature;
3175          * } SignatureAndHashAlgorithm;
3176          *
3177          * struct {
3178          *    SignatureAndHashAlgorithm algorithm;
3179          *    opaque signature<0..2^16-1>;
3180          * } DigitallySigned;
3181          *
3182          */
3183 
3184         ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg(md_alg);
3185         ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg(sig_alg);
3186 
3187 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3188         if (ssl->conf->f_async_sign_start != NULL) {
3189             ret = ssl->conf->f_async_sign_start(ssl,
3190                                                 mbedtls_ssl_own_cert(ssl),
3191                                                 md_alg, hash, hashlen);
3192             switch (ret) {
3193                 case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3194                     /* act as if f_async_sign was null */
3195                     break;
3196                 case 0:
3197                     ssl->handshake->async_in_progress = 1;
3198                     return ssl_resume_server_key_exchange(ssl, signature_len);
3199                 case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3200                     ssl->handshake->async_in_progress = 1;
3201                     return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3202                 default:
3203                     MBEDTLS_SSL_DEBUG_RET(1, "f_async_sign_start", ret);
3204                     return ret;
3205             }
3206         }
3207 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3208 
3209         if (mbedtls_ssl_own_key(ssl) == NULL) {
3210             MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key"));
3211             return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
3212         }
3213 
3214         /* Append the signature to ssl->out_msg, leaving 2 bytes for the
3215          * signature length which will be added in ssl_write_server_key_exchange
3216          * after the call to ssl_prepare_server_key_exchange.
3217          * ssl_write_server_key_exchange also takes care of incrementing
3218          * ssl->out_msglen. */
3219         if ((ret = mbedtls_pk_sign(mbedtls_ssl_own_key(ssl),
3220                                    md_alg, hash, hashlen,
3221                                    ssl->out_msg + ssl->out_msglen + 2,
3222                                    out_buf_len - ssl->out_msglen - 2,
3223                                    signature_len,
3224                                    ssl->conf->f_rng,
3225                                    ssl->conf->p_rng)) != 0) {
3226             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
3227             return ret;
3228         }
3229     }
3230 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
3231 
3232     return 0;
3233 }
3234 
3235 /* Prepare the ServerKeyExchange message and send it. For ciphersuites
3236  * that do not include a ServerKeyExchange message, do nothing. Either
3237  * way, if successful, move on to the next step in the SSL state
3238  * machine. */
3239 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_write_server_key_exchange(mbedtls_ssl_context * ssl)3240 static int ssl_write_server_key_exchange(mbedtls_ssl_context *ssl)
3241 {
3242     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3243     size_t signature_len = 0;
3244 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
3245     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
3246         ssl->handshake->ciphersuite_info;
3247 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
3248 
3249     MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server key exchange"));
3250 
3251 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED)
3252     /* Extract static ECDH parameters and abort if ServerKeyExchange
3253      * is not needed. */
3254     if (mbedtls_ssl_ciphersuite_no_pfs(ciphersuite_info)) {
3255         /* For suites involving ECDH, extract DH parameters
3256          * from certificate at this point. */
3257 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED)
3258         if (mbedtls_ssl_ciphersuite_uses_ecdh(ciphersuite_info)) {
3259             ret = ssl_get_ecdh_params_from_cert(ssl);
3260             if (ret != 0) {
3261                 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
3262                 return ret;
3263             }
3264         }
3265 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_ECDH_ENABLED */
3266 
3267         /* Key exchanges not involving ephemeral keys don't use
3268          * ServerKeyExchange, so end here. */
3269         MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write server key exchange"));
3270         ssl->state++;
3271         return 0;
3272     }
3273 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_NON_PFS_ENABLED */
3274 
3275 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) && \
3276     defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3277     /* If we have already prepared the message and there is an ongoing
3278      * signature operation, resume signing. */
3279     if (ssl->handshake->async_in_progress != 0) {
3280         MBEDTLS_SSL_DEBUG_MSG(2, ("resuming signature operation"));
3281         ret = ssl_resume_server_key_exchange(ssl, &signature_len);
3282     } else
3283 #endif /* defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED) &&
3284           defined(MBEDTLS_SSL_ASYNC_PRIVATE) */
3285     {
3286         /* ServerKeyExchange is needed. Prepare the message. */
3287         ret = ssl_prepare_server_key_exchange(ssl, &signature_len);
3288     }
3289 
3290     if (ret != 0) {
3291         /* If we're starting to write a new message, set ssl->out_msglen
3292          * to 0. But if we're resuming after an asynchronous message,
3293          * out_msglen is the amount of data written so far and mst be
3294          * preserved. */
3295         if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3296             MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange (pending)"));
3297         } else {
3298             ssl->out_msglen = 0;
3299         }
3300         return ret;
3301     }
3302 
3303     /* If there is a signature, write its length.
3304      * ssl_prepare_server_key_exchange already wrote the signature
3305      * itself at its proper place in the output buffer. */
3306 #if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
3307     if (signature_len != 0) {
3308         ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_1(signature_len);
3309         ssl->out_msg[ssl->out_msglen++] = MBEDTLS_BYTE_0(signature_len);
3310 
3311         MBEDTLS_SSL_DEBUG_BUF(3, "my signature",
3312                               ssl->out_msg + ssl->out_msglen,
3313                               signature_len);
3314 
3315         /* Skip over the already-written signature */
3316         ssl->out_msglen += signature_len;
3317     }
3318 #endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
3319 
3320     /* Add header and send. */
3321     ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3322     ssl->out_msg[0]  = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;
3323 
3324     ssl->state++;
3325 
3326     if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3327         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3328         return ret;
3329     }
3330 
3331     MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server key exchange"));
3332     return 0;
3333 }
3334 
3335 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_write_server_hello_done(mbedtls_ssl_context * ssl)3336 static int ssl_write_server_hello_done(mbedtls_ssl_context *ssl)
3337 {
3338     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3339 
3340     MBEDTLS_SSL_DEBUG_MSG(2, ("=> write server hello done"));
3341 
3342     ssl->out_msglen  = 4;
3343     ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3344     ssl->out_msg[0]  = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;
3345 
3346     ssl->state++;
3347 
3348 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3349     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
3350         mbedtls_ssl_send_flight_completed(ssl);
3351     }
3352 #endif
3353 
3354     if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3355         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3356         return ret;
3357     }
3358 
3359 #if defined(MBEDTLS_SSL_PROTO_DTLS)
3360     if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
3361         (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
3362         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
3363         return ret;
3364     }
3365 #endif /* MBEDTLS_SSL_PROTO_DTLS */
3366 
3367     MBEDTLS_SSL_DEBUG_MSG(2, ("<= write server hello done"));
3368 
3369     return 0;
3370 }
3371 
3372 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \
3373     defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3374 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_client_dh_public(mbedtls_ssl_context * ssl,unsigned char ** p,const unsigned char * end)3375 static int ssl_parse_client_dh_public(mbedtls_ssl_context *ssl, unsigned char **p,
3376                                       const unsigned char *end)
3377 {
3378     int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
3379     size_t n;
3380 
3381     /*
3382      * Receive G^Y mod P, premaster = (G^Y)^X mod P
3383      */
3384     if (*p + 2 > end) {
3385         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3386         return MBEDTLS_ERR_SSL_DECODE_ERROR;
3387     }
3388 
3389     n = MBEDTLS_GET_UINT16_BE(*p, 0);
3390     *p += 2;
3391 
3392     if (*p + n > end) {
3393         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3394         return MBEDTLS_ERR_SSL_DECODE_ERROR;
3395     }
3396 
3397     if ((ret = mbedtls_dhm_read_public(&ssl->handshake->dhm_ctx, *p, n)) != 0) {
3398         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_read_public", ret);
3399         return MBEDTLS_ERR_SSL_DECODE_ERROR;
3400     }
3401 
3402     *p += n;
3403 
3404     MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
3405 
3406     return ret;
3407 }
3408 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
3409           MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
3410 
3411 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) ||                           \
3412     defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
3413 
3414 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3415 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_resume_decrypt_pms(mbedtls_ssl_context * ssl,unsigned char * peer_pms,size_t * peer_pmslen,size_t peer_pmssize)3416 static int ssl_resume_decrypt_pms(mbedtls_ssl_context *ssl,
3417                                   unsigned char *peer_pms,
3418                                   size_t *peer_pmslen,
3419                                   size_t peer_pmssize)
3420 {
3421     int ret = ssl->conf->f_async_resume(ssl,
3422                                         peer_pms, peer_pmslen, peer_pmssize);
3423     if (ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3424         ssl->handshake->async_in_progress = 0;
3425         mbedtls_ssl_set_async_operation_data(ssl, NULL);
3426     }
3427     MBEDTLS_SSL_DEBUG_RET(2, "ssl_decrypt_encrypted_pms", ret);
3428     return ret;
3429 }
3430 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3431 
3432 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_decrypt_encrypted_pms(mbedtls_ssl_context * ssl,const unsigned char * p,const unsigned char * end,unsigned char * peer_pms,size_t * peer_pmslen,size_t peer_pmssize)3433 static int ssl_decrypt_encrypted_pms(mbedtls_ssl_context *ssl,
3434                                      const unsigned char *p,
3435                                      const unsigned char *end,
3436                                      unsigned char *peer_pms,
3437                                      size_t *peer_pmslen,
3438                                      size_t peer_pmssize)
3439 {
3440     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3441 
3442     mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert(ssl);
3443     if (own_cert == NULL) {
3444         MBEDTLS_SSL_DEBUG_MSG(1, ("got no local certificate"));
3445         return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
3446     }
3447     mbedtls_pk_context *public_key = &own_cert->pk;
3448     mbedtls_pk_context *private_key = mbedtls_ssl_own_key(ssl);
3449     size_t len = mbedtls_pk_get_len(public_key);
3450 
3451 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3452     /* If we have already started decoding the message and there is an ongoing
3453      * decryption operation, resume signing. */
3454     if (ssl->handshake->async_in_progress != 0) {
3455         MBEDTLS_SSL_DEBUG_MSG(2, ("resuming decryption operation"));
3456         return ssl_resume_decrypt_pms(ssl,
3457                                       peer_pms, peer_pmslen, peer_pmssize);
3458     }
3459 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3460 
3461     /*
3462      * Prepare to decrypt the premaster using own private RSA key
3463      */
3464     if (p + 2 > end) {
3465         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3466         return MBEDTLS_ERR_SSL_DECODE_ERROR;
3467     }
3468     if (*p++ != MBEDTLS_BYTE_1(len) ||
3469         *p++ != MBEDTLS_BYTE_0(len)) {
3470         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3471         return MBEDTLS_ERR_SSL_DECODE_ERROR;
3472     }
3473 
3474     if (p + len != end) {
3475         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3476         return MBEDTLS_ERR_SSL_DECODE_ERROR;
3477     }
3478 
3479     /*
3480      * Decrypt the premaster secret
3481      */
3482 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3483     if (ssl->conf->f_async_decrypt_start != NULL) {
3484         ret = ssl->conf->f_async_decrypt_start(ssl,
3485                                                mbedtls_ssl_own_cert(ssl),
3486                                                p, len);
3487         switch (ret) {
3488             case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH:
3489                 /* act as if f_async_decrypt_start was null */
3490                 break;
3491             case 0:
3492                 ssl->handshake->async_in_progress = 1;
3493                 return ssl_resume_decrypt_pms(ssl,
3494                                               peer_pms,
3495                                               peer_pmslen,
3496                                               peer_pmssize);
3497             case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS:
3498                 ssl->handshake->async_in_progress = 1;
3499                 return MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS;
3500             default:
3501                 MBEDTLS_SSL_DEBUG_RET(1, "f_async_decrypt_start", ret);
3502                 return ret;
3503         }
3504     }
3505 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3506 
3507     if (!mbedtls_pk_can_do(private_key, MBEDTLS_PK_RSA)) {
3508         MBEDTLS_SSL_DEBUG_MSG(1, ("got no RSA private key"));
3509         return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
3510     }
3511 
3512     ret = mbedtls_pk_decrypt(private_key, p, len,
3513                              peer_pms, peer_pmslen, peer_pmssize,
3514                              ssl->conf->f_rng, ssl->conf->p_rng);
3515     return ret;
3516 }
3517 
3518 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_encrypted_pms(mbedtls_ssl_context * ssl,const unsigned char * p,const unsigned char * end,size_t pms_offset)3519 static int ssl_parse_encrypted_pms(mbedtls_ssl_context *ssl,
3520                                    const unsigned char *p,
3521                                    const unsigned char *end,
3522                                    size_t pms_offset)
3523 {
3524     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3525     unsigned char *pms = ssl->handshake->premaster + pms_offset;
3526     unsigned char ver[2];
3527     unsigned char fake_pms[48], peer_pms[48];
3528     size_t peer_pmslen;
3529     mbedtls_ct_condition_t diff;
3530 
3531     /* In case of a failure in decryption, the decryption may write less than
3532      * 2 bytes of output, but we always read the first two bytes. It doesn't
3533      * matter in the end because diff will be nonzero in that case due to
3534      * ret being nonzero, and we only care whether diff is 0.
3535      * But do initialize peer_pms and peer_pmslen for robustness anyway. This
3536      * also makes memory analyzers happy (don't access uninitialized memory,
3537      * even if it's an unsigned char). */
3538     peer_pms[0] = peer_pms[1] = ~0;
3539     peer_pmslen = 0;
3540 
3541     ret = ssl_decrypt_encrypted_pms(ssl, p, end,
3542                                     peer_pms,
3543                                     &peer_pmslen,
3544                                     sizeof(peer_pms));
3545 
3546 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3547     if (ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) {
3548         return ret;
3549     }
3550 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3551 
3552     mbedtls_ssl_write_version(ver, ssl->conf->transport,
3553                               ssl->session_negotiate->tls_version);
3554 
3555     /* Avoid data-dependent branches while checking for invalid
3556      * padding, to protect against timing-based Bleichenbacher-type
3557      * attacks. */
3558     diff = mbedtls_ct_bool(ret);
3559     diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pmslen, 48));
3560     diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[0], ver[0]));
3561     diff = mbedtls_ct_bool_or(diff, mbedtls_ct_uint_ne(peer_pms[1], ver[1]));
3562 
3563     /*
3564      * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding
3565      * must not cause the connection to end immediately; instead, send a
3566      * bad_record_mac later in the handshake.
3567      * To protect against timing-based variants of the attack, we must
3568      * not have any branch that depends on whether the decryption was
3569      * successful. In particular, always generate the fake premaster secret,
3570      * regardless of whether it will ultimately influence the output or not.
3571      */
3572     ret = ssl->conf->f_rng(ssl->conf->p_rng, fake_pms, sizeof(fake_pms));
3573     if (ret != 0) {
3574         /* It's ok to abort on an RNG failure, since this does not reveal
3575          * anything about the RSA decryption. */
3576         return ret;
3577     }
3578 
3579 #if defined(MBEDTLS_SSL_DEBUG_ALL)
3580     if (diff != MBEDTLS_CT_FALSE) {
3581         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3582     }
3583 #endif
3584 
3585     if (sizeof(ssl->handshake->premaster) < pms_offset ||
3586         sizeof(ssl->handshake->premaster) - pms_offset < 48) {
3587         MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3588         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
3589     }
3590     ssl->handshake->pmslen = 48;
3591 
3592     /* Set pms to either the true or the fake PMS, without
3593      * data-dependent branches. */
3594     mbedtls_ct_memcpy_if(diff, pms, fake_pms, peer_pms, ssl->handshake->pmslen);
3595 
3596     return 0;
3597 }
3598 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
3599           MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3600 
3601 #if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
3602 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_client_psk_identity(mbedtls_ssl_context * ssl,unsigned char ** p,const unsigned char * end)3603 static int ssl_parse_client_psk_identity(mbedtls_ssl_context *ssl, unsigned char **p,
3604                                          const unsigned char *end)
3605 {
3606     int ret = 0;
3607     uint16_t n;
3608 
3609     if (ssl_conf_has_psk_or_cb(ssl->conf) == 0) {
3610         MBEDTLS_SSL_DEBUG_MSG(1, ("got no pre-shared key"));
3611         return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
3612     }
3613 
3614     /*
3615      * Receive client pre-shared key identity name
3616      */
3617     if (end - *p < 2) {
3618         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3619         return MBEDTLS_ERR_SSL_DECODE_ERROR;
3620     }
3621 
3622     n = MBEDTLS_GET_UINT16_BE(*p, 0);
3623     *p += 2;
3624 
3625     if (n == 0 || n > end - *p) {
3626         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3627         return MBEDTLS_ERR_SSL_DECODE_ERROR;
3628     }
3629 
3630     if (ssl->conf->f_psk != NULL) {
3631         if (ssl->conf->f_psk(ssl->conf->p_psk, ssl, *p, n) != 0) {
3632             ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
3633         }
3634     } else {
3635         /* Identity is not a big secret since clients send it in the clear,
3636          * but treat it carefully anyway, just in case */
3637         if (n != ssl->conf->psk_identity_len ||
3638             mbedtls_ct_memcmp(ssl->conf->psk_identity, *p, n) != 0) {
3639             ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
3640         }
3641     }
3642 
3643     if (ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) {
3644         MBEDTLS_SSL_DEBUG_BUF(3, "Unknown PSK identity", *p, n);
3645         mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3646                                        MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY);
3647         return MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;
3648     }
3649 
3650     *p += n;
3651 
3652     return 0;
3653 }
3654 #endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
3655 
3656 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_client_key_exchange(mbedtls_ssl_context * ssl)3657 static int ssl_parse_client_key_exchange(mbedtls_ssl_context *ssl)
3658 {
3659     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
3660     const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
3661     unsigned char *p, *end;
3662 
3663     ciphersuite_info = ssl->handshake->ciphersuite_info;
3664 
3665     MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse client key exchange"));
3666 
3667 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \
3668     (defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
3669     defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED))
3670     if ((ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
3671          ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) &&
3672         (ssl->handshake->async_in_progress != 0)) {
3673         /* We've already read a record and there is an asynchronous
3674          * operation in progress to decrypt it. So skip reading the
3675          * record. */
3676         MBEDTLS_SSL_DEBUG_MSG(3, ("will resume decryption of previously-read record"));
3677     } else
3678 #endif
3679     if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3680         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3681         return ret;
3682     }
3683 
3684     p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
3685     end = ssl->in_msg + ssl->in_hslen;
3686 
3687     if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3688         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3689         return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
3690     }
3691 
3692     if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE) {
3693         MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange message"));
3694         return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
3695     }
3696 
3697 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
3698     if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
3699         if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3700             MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3701             return ret;
3702         }
3703 
3704         if (p != end) {
3705             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3706             return MBEDTLS_ERR_SSL_DECODE_ERROR;
3707         }
3708 
3709         if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3710                                            ssl->handshake->premaster,
3711                                            MBEDTLS_PREMASTER_SIZE,
3712                                            &ssl->handshake->pmslen,
3713                                            ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3714             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3715             return MBEDTLS_ERR_SSL_DECODE_ERROR;
3716         }
3717 
3718         MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3719     } else
3720 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
3721 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \
3722     defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) ||                   \
3723     defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||                      \
3724     defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
3725     if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
3726         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
3727         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
3728         ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
3729 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3730         size_t data_len = (size_t) (*p++);
3731         size_t buf_len = (size_t) (end - p);
3732         psa_status_t status = PSA_ERROR_GENERIC_ERROR;
3733         mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3734 
3735         MBEDTLS_SSL_DEBUG_MSG(3, ("Read the peer's public key."));
3736 
3737         /*
3738          * We must have at least two bytes (1 for length, at least 1 for data)
3739          */
3740         if (buf_len < 2) {
3741             MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid buffer length: %" MBEDTLS_PRINTF_SIZET,
3742                                       buf_len));
3743             return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3744         }
3745 
3746         if (data_len < 1 || data_len > buf_len) {
3747             MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid data length: %" MBEDTLS_PRINTF_SIZET
3748                                       " > %" MBEDTLS_PRINTF_SIZET,
3749                                       data_len, buf_len));
3750             return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3751         }
3752 
3753         /* Store peer's ECDH public key. */
3754         if (data_len > sizeof(handshake->xxdh_psa_peerkey)) {
3755             MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %" MBEDTLS_PRINTF_SIZET
3756                                       " > %" MBEDTLS_PRINTF_SIZET,
3757                                       data_len,
3758                                       sizeof(handshake->xxdh_psa_peerkey)));
3759             return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3760         }
3761         memcpy(handshake->xxdh_psa_peerkey, p, data_len);
3762         handshake->xxdh_psa_peerkey_len = data_len;
3763 
3764         /* Compute ECDH shared secret. */
3765         status = psa_raw_key_agreement(
3766             PSA_ALG_ECDH, handshake->xxdh_psa_privkey,
3767             handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
3768             handshake->premaster, sizeof(handshake->premaster),
3769             &handshake->pmslen);
3770         if (status != PSA_SUCCESS) {
3771             ret = PSA_TO_MBEDTLS_ERR(status);
3772             MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
3773             if (handshake->xxdh_psa_privkey_is_external == 0) {
3774                 (void) psa_destroy_key(handshake->xxdh_psa_privkey);
3775             }
3776             handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
3777             return ret;
3778         }
3779 
3780         if (handshake->xxdh_psa_privkey_is_external == 0) {
3781             status = psa_destroy_key(handshake->xxdh_psa_privkey);
3782 
3783             if (status != PSA_SUCCESS) {
3784                 ret = PSA_TO_MBEDTLS_ERR(status);
3785                 MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
3786                 return ret;
3787             }
3788         }
3789         handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
3790 #else
3791         if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
3792                                             p, (size_t) (end - p))) != 0) {
3793             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
3794             return MBEDTLS_ERR_SSL_DECODE_ERROR;
3795         }
3796 
3797         MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3798                                MBEDTLS_DEBUG_ECDH_QP);
3799 
3800         if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
3801                                             &ssl->handshake->pmslen,
3802                                             ssl->handshake->premaster,
3803                                             MBEDTLS_MPI_MAX_SIZE,
3804                                             ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3805             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
3806             return MBEDTLS_ERR_SSL_DECODE_ERROR;
3807         }
3808 
3809         MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3810                                MBEDTLS_DEBUG_ECDH_Z);
3811 #endif /* MBEDTLS_USE_PSA_CRYPTO */
3812     } else
3813 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
3814           MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
3815           MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
3816           MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
3817 #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
3818     if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
3819         if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3820             MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3821             return ret;
3822         }
3823 
3824         if (p != end) {
3825             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3826             return MBEDTLS_ERR_SSL_DECODE_ERROR;
3827         }
3828 
3829 #if !defined(MBEDTLS_USE_PSA_CRYPTO)
3830         if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3831                                                     (mbedtls_key_exchange_type_t) ciphersuite_info->
3832                                                     key_exchange)) != 0) {
3833             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3834             return ret;
3835         }
3836 #endif /* !MBEDTLS_USE_PSA_CRYPTO */
3837     } else
3838 #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
3839 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
3840     if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
3841 #if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
3842         if (ssl->handshake->async_in_progress != 0) {
3843             /* There is an asynchronous operation in progress to
3844              * decrypt the encrypted premaster secret, so skip
3845              * directly to resuming this operation. */
3846             MBEDTLS_SSL_DEBUG_MSG(3, ("PSK identity already parsed"));
3847             /* Update p to skip the PSK identity. ssl_parse_encrypted_pms
3848              * won't actually use it, but maintain p anyway for robustness. */
3849             p += ssl->conf->psk_identity_len + 2;
3850         } else
3851 #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
3852         if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3853             MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3854             return ret;
3855         }
3856 
3857         if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 2)) != 0) {
3858             MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_encrypted_pms"), ret);
3859             return ret;
3860         }
3861 
3862 #if !defined(MBEDTLS_USE_PSA_CRYPTO)
3863         if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3864                                                     (mbedtls_key_exchange_type_t) ciphersuite_info->
3865                                                     key_exchange)) != 0) {
3866             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3867             return ret;
3868         }
3869 #endif /* !MBEDTLS_USE_PSA_CRYPTO */
3870     } else
3871 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
3872 #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
3873     if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
3874         if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3875             MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3876             return ret;
3877         }
3878         if ((ret = ssl_parse_client_dh_public(ssl, &p, end)) != 0) {
3879             MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_dh_public"), ret);
3880             return ret;
3881         }
3882 
3883         if (p != end) {
3884             MBEDTLS_SSL_DEBUG_MSG(1, ("bad client key exchange"));
3885             return MBEDTLS_ERR_SSL_DECODE_ERROR;
3886         }
3887 
3888 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3889         unsigned char *pms = ssl->handshake->premaster;
3890         unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
3891         size_t pms_len;
3892 
3893         /* Write length only when we know the actual value */
3894         if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3895                                            pms + 2, pms_end - (pms + 2), &pms_len,
3896                                            ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3897             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3898             return ret;
3899         }
3900         MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
3901         pms += 2 + pms_len;
3902 
3903         MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
3904 #else
3905         if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3906                                                     (mbedtls_key_exchange_type_t) ciphersuite_info->
3907                                                     key_exchange)) != 0) {
3908             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
3909             return ret;
3910         }
3911 #endif /* MBEDTLS_USE_PSA_CRYPTO */
3912     } else
3913 #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
3914 #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
3915     if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
3916 #if defined(MBEDTLS_USE_PSA_CRYPTO)
3917         psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
3918         psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
3919         uint8_t ecpoint_len;
3920 
3921         mbedtls_ssl_handshake_params *handshake = ssl->handshake;
3922 
3923         if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
3924             MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
3925             psa_destroy_key(handshake->xxdh_psa_privkey);
3926             handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
3927             return ret;
3928         }
3929 
3930         /* Keep a copy of the peer's public key */
3931         if (p >= end) {
3932             psa_destroy_key(handshake->xxdh_psa_privkey);
3933             handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
3934             return MBEDTLS_ERR_SSL_DECODE_ERROR;
3935         }
3936 
3937         ecpoint_len = *(p++);
3938         if ((size_t) (end - p) < ecpoint_len) {
3939             psa_destroy_key(handshake->xxdh_psa_privkey);
3940             handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
3941             return MBEDTLS_ERR_SSL_DECODE_ERROR;
3942         }
3943 
3944         /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
3945            the sizes of the FFDH keys which are at least 2048 bits.
3946            The size of the array is thus greater than 256 bytes which is greater than any
3947            possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
3948 #if !defined(PSA_WANT_ALG_FFDH)
3949         if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
3950             psa_destroy_key(handshake->xxdh_psa_privkey);
3951             handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
3952             return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
3953         }
3954 #else
3955         MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
3956                               "peer key buffer too small");
3957 #endif
3958 
3959         memcpy(handshake->xxdh_psa_peerkey, p, ecpoint_len);
3960         handshake->xxdh_psa_peerkey_len = ecpoint_len;
3961         p += ecpoint_len;
3962 
3963         /* As RFC 5489 section 2, the premaster secret is formed as follows:
3964          * - a uint16 containing the length (in octets) of the ECDH computation
3965          * - the octet string produced by the ECDH computation
3966          * - a uint16 containing the length (in octets) of the PSK
3967          * - the PSK itself
3968          */
3969         unsigned char *psm = ssl->handshake->premaster;
3970         const unsigned char * const psm_end =
3971             psm + sizeof(ssl->handshake->premaster);
3972         /* uint16 to store length (in octets) of the ECDH computation */
3973         const size_t zlen_size = 2;
3974         size_t zlen = 0;
3975 
3976         /* Compute ECDH shared secret. */
3977         status = psa_raw_key_agreement(PSA_ALG_ECDH,
3978                                        handshake->xxdh_psa_privkey,
3979                                        handshake->xxdh_psa_peerkey,
3980                                        handshake->xxdh_psa_peerkey_len,
3981                                        psm + zlen_size,
3982                                        psm_end - (psm + zlen_size),
3983                                        &zlen);
3984 
3985         destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3986         handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
3987 
3988         if (status != PSA_SUCCESS) {
3989             return PSA_TO_MBEDTLS_ERR(status);
3990         } else if (destruction_status != PSA_SUCCESS) {
3991             return PSA_TO_MBEDTLS_ERR(destruction_status);
3992         }
3993 
3994         /* Write the ECDH computation length before the ECDH computation */
3995         MBEDTLS_PUT_UINT16_BE(zlen, psm, 0);
3996         psm += zlen_size + zlen;
3997 
3998 #else /* MBEDTLS_USE_PSA_CRYPTO */
3999         if ((ret = ssl_parse_client_psk_identity(ssl, &p, end)) != 0) {
4000             MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_client_psk_identity"), ret);
4001             return ret;
4002         }
4003 
4004         if ((ret = mbedtls_ecdh_read_public(&ssl->handshake->ecdh_ctx,
4005                                             p, (size_t) (end - p))) != 0) {
4006             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_read_public", ret);
4007             return MBEDTLS_ERR_SSL_DECODE_ERROR;
4008         }
4009 
4010         MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
4011                                MBEDTLS_DEBUG_ECDH_QP);
4012 
4013         if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
4014                                                     (mbedtls_key_exchange_type_t) ciphersuite_info->
4015                                                     key_exchange)) != 0) {
4016             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_psk_derive_premaster", ret);
4017             return ret;
4018         }
4019 #endif /* MBEDTLS_USE_PSA_CRYPTO */
4020     } else
4021 #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
4022 #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
4023     if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
4024         if ((ret = ssl_parse_encrypted_pms(ssl, p, end, 0)) != 0) {
4025             MBEDTLS_SSL_DEBUG_RET(1, ("ssl_parse_parse_encrypted_pms_secret"), ret);
4026             return ret;
4027         }
4028     } else
4029 #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
4030 #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
4031     if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
4032 #if defined(MBEDTLS_USE_PSA_CRYPTO)
4033         if ((ret = mbedtls_psa_ecjpake_read_round(
4034                  &ssl->handshake->psa_pake_ctx, p, (size_t) (end - p),
4035                  MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
4036             psa_destroy_key(ssl->handshake->psa_pake_password);
4037             psa_pake_abort(&ssl->handshake->psa_pake_ctx);
4038 
4039             MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
4040             return ret;
4041         }
4042 #else
4043         ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
4044                                              p, (size_t) (end - p));
4045         if (ret != 0) {
4046             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
4047             return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
4048         }
4049 
4050         ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
4051                                             ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
4052                                             ssl->conf->f_rng, ssl->conf->p_rng);
4053         if (ret != 0) {
4054             MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
4055             return ret;
4056         }
4057 #endif /* MBEDTLS_USE_PSA_CRYPTO */
4058     } else
4059 #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
4060     {
4061         MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4062         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
4063     }
4064 
4065     if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
4066         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
4067         return ret;
4068     }
4069 
4070     ssl->state++;
4071 
4072     MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse client key exchange"));
4073 
4074     return 0;
4075 }
4076 
4077 #if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
4078 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_certificate_verify(mbedtls_ssl_context * ssl)4079 static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
4080 {
4081     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
4082         ssl->handshake->ciphersuite_info;
4083 
4084     MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
4085 
4086     if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4087         MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
4088         ssl->state++;
4089         return 0;
4090     }
4091 
4092     MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
4093     return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
4094 }
4095 #else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
4096 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_parse_certificate_verify(mbedtls_ssl_context * ssl)4097 static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl)
4098 {
4099     int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
4100     size_t i, sig_len;
4101     unsigned char hash[48];
4102     unsigned char *hash_start = hash;
4103     size_t hashlen;
4104     mbedtls_pk_type_t pk_alg;
4105     mbedtls_md_type_t md_alg;
4106     const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
4107         ssl->handshake->ciphersuite_info;
4108     mbedtls_pk_context *peer_pk;
4109 
4110     MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
4111 
4112     if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
4113         MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
4114         ssl->state++;
4115         return 0;
4116     }
4117 
4118 #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4119     if (ssl->session_negotiate->peer_cert == NULL) {
4120         MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
4121         ssl->state++;
4122         return 0;
4123     }
4124 #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4125     if (ssl->session_negotiate->peer_cert_digest == NULL) {
4126         MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate verify"));
4127         ssl->state++;
4128         return 0;
4129     }
4130 #endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4131 
4132     /* Read the message without adding it to the checksum */
4133     ret = mbedtls_ssl_read_record(ssl, 0 /* no checksum update */);
4134     if (0 != ret) {
4135         MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_read_record"), ret);
4136         return ret;
4137     }
4138 
4139     ssl->state++;
4140 
4141     /* Process the message contents */
4142     if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
4143         ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY) {
4144         MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4145         return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
4146     }
4147 
4148     i = mbedtls_ssl_hs_hdr_len(ssl);
4149 
4150 #if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4151     peer_pk = &ssl->handshake->peer_pubkey;
4152 #else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4153     if (ssl->session_negotiate->peer_cert == NULL) {
4154         /* Should never happen */
4155         return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
4156     }
4157     peer_pk = &ssl->session_negotiate->peer_cert->pk;
4158 #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4159 
4160     /*
4161      *  struct {
4162      *     SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only
4163      *     opaque signature<0..2^16-1>;
4164      *  } DigitallySigned;
4165      */
4166     if (i + 2 > ssl->in_hslen) {
4167         MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4168         return MBEDTLS_ERR_SSL_DECODE_ERROR;
4169     }
4170 
4171     /*
4172      * Hash
4173      */
4174     md_alg = mbedtls_ssl_md_alg_from_hash(ssl->in_msg[i]);
4175 
4176     if (md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md(ssl, ssl->in_msg[i])) {
4177         MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4178                                   " for verify message"));
4179         return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
4180     }
4181 
4182 #if !defined(MBEDTLS_MD_SHA1)
4183     if (MBEDTLS_MD_SHA1 == md_alg) {
4184         hash_start += 16;
4185     }
4186 #endif
4187 
4188     /* Info from md_alg will be used instead */
4189     hashlen = 0;
4190 
4191     i++;
4192 
4193     /*
4194      * Signature
4195      */
4196     if ((pk_alg = mbedtls_ssl_pk_alg_from_sig(ssl->in_msg[i]))
4197         == MBEDTLS_PK_NONE) {
4198         MBEDTLS_SSL_DEBUG_MSG(1, ("peer not adhering to requested sig_alg"
4199                                   " for verify message"));
4200         return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
4201     }
4202 
4203     /*
4204      * Check the certificate's key type matches the signature alg
4205      */
4206     if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
4207         MBEDTLS_SSL_DEBUG_MSG(1, ("sig_alg doesn't match cert key"));
4208         return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
4209     }
4210 
4211     i++;
4212 
4213     if (i + 2 > ssl->in_hslen) {
4214         MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4215         return MBEDTLS_ERR_SSL_DECODE_ERROR;
4216     }
4217 
4218     sig_len = MBEDTLS_GET_UINT16_BE(ssl->in_msg, i);
4219     i += 2;
4220 
4221     if (i + sig_len != ssl->in_hslen) {
4222         MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate verify message"));
4223         return MBEDTLS_ERR_SSL_DECODE_ERROR;
4224     }
4225 
4226     /* Calculate hash and verify signature */
4227     {
4228         size_t dummy_hlen;
4229         ret = ssl->handshake->calc_verify(ssl, hash, &dummy_hlen);
4230         if (0 != ret) {
4231             MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
4232             return ret;
4233         }
4234     }
4235 
4236     if ((ret = mbedtls_pk_verify(peer_pk,
4237                                  md_alg, hash_start, hashlen,
4238                                  ssl->in_msg + i, sig_len)) != 0) {
4239         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
4240         return ret;
4241     }
4242 
4243     ret = mbedtls_ssl_update_handshake_status(ssl);
4244     if (0 != ret) {
4245         MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_update_handshake_status"), ret);
4246         return ret;
4247     }
4248 
4249     MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
4250 
4251     return ret;
4252 }
4253 #endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
4254 
4255 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
4256 MBEDTLS_CHECK_RETURN_CRITICAL
ssl_write_new_session_ticket(mbedtls_ssl_context * ssl)4257 static int ssl_write_new_session_ticket(mbedtls_ssl_context *ssl)
4258 {
4259     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
4260     size_t tlen;
4261     uint32_t lifetime;
4262 
4263     MBEDTLS_SSL_DEBUG_MSG(2, ("=> write new session ticket"));
4264 
4265     ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
4266     ssl->out_msg[0]  = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;
4267 
4268     /*
4269      * struct {
4270      *     uint32 ticket_lifetime_hint;
4271      *     opaque ticket<0..2^16-1>;
4272      * } NewSessionTicket;
4273      *
4274      * 4  .  7   ticket_lifetime_hint (0 = unspecified)
4275      * 8  .  9   ticket_len (n)
4276      * 10 .  9+n ticket content
4277      */
4278 
4279 #if defined(MBEDTLS_HAVE_TIME)
4280     ssl->session_negotiate->ticket_creation_time = mbedtls_ms_time();
4281 #endif
4282     if ((ret = ssl->conf->f_ticket_write(ssl->conf->p_ticket,
4283                                          ssl->session_negotiate,
4284                                          ssl->out_msg + 10,
4285                                          ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
4286                                          &tlen, &lifetime)) != 0) {
4287         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_ticket_write", ret);
4288         tlen = 0;
4289     }
4290 
4291     MBEDTLS_PUT_UINT32_BE(lifetime, ssl->out_msg, 4);
4292     MBEDTLS_PUT_UINT16_BE(tlen, ssl->out_msg, 8);
4293     ssl->out_msglen = 10 + tlen;
4294 
4295     /*
4296      * Morally equivalent to updating ssl->state, but NewSessionTicket and
4297      * ChangeCipherSpec share the same state.
4298      */
4299     ssl->handshake->new_session_ticket = 0;
4300 
4301     if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4302         MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4303         return ret;
4304     }
4305 
4306     MBEDTLS_SSL_DEBUG_MSG(2, ("<= write new session ticket"));
4307 
4308     return 0;
4309 }
4310 #endif /* MBEDTLS_SSL_SESSION_TICKETS */
4311 
4312 /*
4313  * SSL handshake -- server side -- single step
4314  */
mbedtls_ssl_handshake_server_step(mbedtls_ssl_context * ssl)4315 int mbedtls_ssl_handshake_server_step(mbedtls_ssl_context *ssl)
4316 {
4317     int ret = 0;
4318 
4319     MBEDTLS_SSL_DEBUG_MSG(2, ("server state: %d", ssl->state));
4320 
4321     switch (ssl->state) {
4322         case MBEDTLS_SSL_HELLO_REQUEST:
4323             ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
4324             break;
4325 
4326         /*
4327          *  <==   ClientHello
4328          */
4329         case MBEDTLS_SSL_CLIENT_HELLO:
4330             ret = ssl_parse_client_hello(ssl);
4331             break;
4332 
4333 #if defined(MBEDTLS_SSL_PROTO_DTLS)
4334         case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:
4335             return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED;
4336 #endif
4337 
4338         /*
4339          *  ==>   ServerHello
4340          *        Certificate
4341          *      ( ServerKeyExchange  )
4342          *      ( CertificateRequest )
4343          *        ServerHelloDone
4344          */
4345         case MBEDTLS_SSL_SERVER_HELLO:
4346             ret = ssl_write_server_hello(ssl);
4347             break;
4348 
4349         case MBEDTLS_SSL_SERVER_CERTIFICATE:
4350             ret = mbedtls_ssl_write_certificate(ssl);
4351             break;
4352 
4353         case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
4354             ret = ssl_write_server_key_exchange(ssl);
4355             break;
4356 
4357         case MBEDTLS_SSL_CERTIFICATE_REQUEST:
4358             ret = ssl_write_certificate_request(ssl);
4359             break;
4360 
4361         case MBEDTLS_SSL_SERVER_HELLO_DONE:
4362             ret = ssl_write_server_hello_done(ssl);
4363             break;
4364 
4365         /*
4366          *  <== ( Certificate/Alert  )
4367          *        ClientKeyExchange
4368          *      ( CertificateVerify  )
4369          *        ChangeCipherSpec
4370          *        Finished
4371          */
4372         case MBEDTLS_SSL_CLIENT_CERTIFICATE:
4373             ret = mbedtls_ssl_parse_certificate(ssl);
4374             break;
4375 
4376         case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
4377             ret = ssl_parse_client_key_exchange(ssl);
4378             break;
4379 
4380         case MBEDTLS_SSL_CERTIFICATE_VERIFY:
4381             ret = ssl_parse_certificate_verify(ssl);
4382             break;
4383 
4384         case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
4385             ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
4386             break;
4387 
4388         case MBEDTLS_SSL_CLIENT_FINISHED:
4389             ret = mbedtls_ssl_parse_finished(ssl);
4390             break;
4391 
4392         /*
4393          *  ==> ( NewSessionTicket )
4394          *        ChangeCipherSpec
4395          *        Finished
4396          */
4397         case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
4398 #if defined(MBEDTLS_SSL_SESSION_TICKETS)
4399             if (ssl->handshake->new_session_ticket != 0) {
4400                 ret = ssl_write_new_session_ticket(ssl);
4401             } else
4402 #endif
4403             ret = mbedtls_ssl_write_change_cipher_spec(ssl);
4404             break;
4405 
4406         case MBEDTLS_SSL_SERVER_FINISHED:
4407             ret = mbedtls_ssl_write_finished(ssl);
4408             break;
4409 
4410         case MBEDTLS_SSL_FLUSH_BUFFERS:
4411             MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
4412             ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
4413             break;
4414 
4415         case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
4416             mbedtls_ssl_handshake_wrapup(ssl);
4417             break;
4418 
4419         default:
4420             MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
4421             return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4422     }
4423 
4424     return ret;
4425 }
4426 
mbedtls_ssl_conf_preference_order(mbedtls_ssl_config * conf,int order)4427 void mbedtls_ssl_conf_preference_order(mbedtls_ssl_config *conf, int order)
4428 {
4429     conf->respect_cli_pref = order;
4430 }
4431 
4432 #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_TLS1_2 */
4433