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