blob: 5a98165d0995601426ceddde2d08a0956f90f40e [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002 * TLS client-side functions
Paul Bakker5121ce52009-01-03 21:22:43 +00003 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02004 * Copyright The Mbed TLS Contributors
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * 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.
Paul Bakker5121ce52009-01-03 21:22:43 +000018 */
19
Gilles Peskinedb09ef62020-06-03 01:43:33 +020020#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000021
Jerry Yufb4b6472022-01-27 15:03:26 +080022#if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_PROTO_TLS1_2)
Jerry Yuc5aef882021-12-23 20:15:02 +080023
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000024#include "mbedtls/platform.h"
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +020025
SimonBd5800b72016-04-26 07:43:27 +010026#include "mbedtls/ssl.h"
Ronald Cron7320e642022-03-08 13:34:49 +010027#include "ssl_client.h"
Chris Jones84a773f2021-03-05 18:38:47 +000028#include "ssl_misc.h"
Janos Follath73c616b2019-12-18 15:07:04 +000029#include "mbedtls/debug.h"
30#include "mbedtls/error.h"
Gabor Mezei765862c2021-10-19 12:22:25 +020031#include "mbedtls/constant_time.h"
SimonBd5800b72016-04-26 07:43:27 +010032
Hanno Beckerbb89e272019-01-08 12:54:37 +000033#if defined(MBEDTLS_USE_PSA_CRYPTO)
Manuel Pégourié-Gonnard2be8c632023-06-07 13:07:21 +020034#include "psa_util_internal.h"
Ronald Cron69a63422021-10-18 09:47:58 +020035#include "psa/crypto.h"
Andrzej Kurek1c7a9982023-05-30 09:21:20 -040036#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Andrzej Kurek00644842023-05-30 05:45:00 -040037/* Define a local translating function to save code size by not using too many
38 * arguments in each translating place. */
39static int local_err_translation(psa_status_t status)
40{
41 return psa_status_to_mbedtls(status, psa_to_ssl_errors,
Andrzej Kurek1e4a0302023-05-30 09:45:17 -040042 ARRAY_LENGTH(psa_to_ssl_errors),
Andrzej Kurek00644842023-05-30 05:45:00 -040043 psa_generic_status_to_mbedtls);
44}
45#define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
Andrzej Kurek1c7a9982023-05-30 09:21:20 -040046#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Hanno Beckerbb89e272019-01-08 12:54:37 +000047#endif /* MBEDTLS_USE_PSA_CRYPTO */
48
SimonBd5800b72016-04-26 07:43:27 +010049#include <string.h>
50
Manuel Pégourié-Gonnard93866642015-06-22 19:21:23 +020051#include <stdint.h>
Paul Bakkerfa9b1002013-07-03 15:31:03 +020052
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#if defined(MBEDTLS_HAVE_TIME)
Simon Butcherb5b6af22016-07-13 14:46:18 +010054#include "mbedtls/platform_time.h"
Paul Bakkerfa9b1002013-07-03 15:31:03 +020055#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000056
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050058#include "mbedtls/platform_util.h"
Paul Bakker34617722014-06-13 17:20:13 +020059#endif
60
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020061#if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +020062MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +010063static int ssl_write_renegotiation_ext(mbedtls_ssl_context *ssl,
64 unsigned char *buf,
65 const unsigned char *end,
66 size_t *olen)
Paul Bakkerd3edc862013-03-20 16:07:17 +010067{
68 unsigned char *p = buf;
69
70 *olen = 0;
71
Tom Cosgrovece7f18c2022-07-28 05:50:56 +010072 /* We're always including a TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the
Hanno Becker40f8b512017-10-12 14:58:55 +010073 * initial ClientHello, in which case also adding the renegotiation
74 * info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */
Gilles Peskine449bd832023-01-11 14:50:10 +010075 if (ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
76 return 0;
77 }
Paul Bakkerd3edc862013-03-20 16:07:17 +010078
Gilles Peskine449bd832023-01-11 14:50:10 +010079 MBEDTLS_SSL_DEBUG_MSG(3,
80 ("client hello, adding renegotiation extension"));
Paul Bakkerd3edc862013-03-20 16:07:17 +010081
Gilles Peskine449bd832023-01-11 14:50:10 +010082 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 5 + ssl->verify_data_len);
Simon Butchered997662015-09-28 02:14:30 +010083
Paul Bakkerd3edc862013-03-20 16:07:17 +010084 /*
85 * Secure renegotiation
86 */
Gilles Peskine449bd832023-01-11 14:50:10 +010087 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RENEGOTIATION_INFO, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +010088 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +010089
90 *p++ = 0x00;
Gilles Peskine449bd832023-01-11 14:50:10 +010091 *p++ = MBEDTLS_BYTE_0(ssl->verify_data_len + 1);
92 *p++ = MBEDTLS_BYTE_0(ssl->verify_data_len);
Paul Bakkerd3edc862013-03-20 16:07:17 +010093
Gilles Peskine449bd832023-01-11 14:50:10 +010094 memcpy(p, ssl->own_verify_data, ssl->verify_data_len);
Paul Bakkerd3edc862013-03-20 16:07:17 +010095
96 *olen = 5 + ssl->verify_data_len;
Hanno Becker261602c2017-04-12 14:54:42 +010097
Gilles Peskine449bd832023-01-11 14:50:10 +010098 return 0;
Paul Bakkerd3edc862013-03-20 16:07:17 +010099}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200100#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100101
Manuel Pégourié-Gonnardf4721792015-09-15 10:53:51 +0200102#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100103 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100104
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200105MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100106static int ssl_write_supported_point_formats_ext(mbedtls_ssl_context *ssl,
107 unsigned char *buf,
108 const unsigned char *end,
109 size_t *olen)
Paul Bakkerd3edc862013-03-20 16:07:17 +0100110{
111 unsigned char *p = buf;
Hanno Becker261602c2017-04-12 14:54:42 +0100112 (void) ssl; /* ssl used for debugging only */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100113
114 *olen = 0;
115
Gilles Peskine449bd832023-01-11 14:50:10 +0100116 MBEDTLS_SSL_DEBUG_MSG(3,
117 ("client hello, adding supported_point_formats extension"));
118 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
Simon Butchered997662015-09-28 02:14:30 +0100119
Gilles Peskine449bd832023-01-11 14:50:10 +0100120 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100121 p += 2;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100122
123 *p++ = 0x00;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100124 *p++ = 2;
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200125
126 *p++ = 1;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200127 *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100128
Manuel Pégourié-Gonnard6b8846d2013-08-15 17:42:02 +0200129 *olen = 6;
Hanno Becker261602c2017-04-12 14:54:42 +0100130
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 return 0;
Paul Bakkerd3edc862013-03-20 16:07:17 +0100132}
Darryl Green11999bb2018-03-13 15:22:58 +0000133#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
Robert Cragieae8535d2015-10-06 17:11:18 +0100134 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd3edc862013-03-20 16:07:17 +0100135
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200136#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200137MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100138static int ssl_write_ecjpake_kkpp_ext(mbedtls_ssl_context *ssl,
139 unsigned char *buf,
140 const unsigned char *end,
141 size_t *olen)
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200142{
Janos Follath865b3eb2019-12-16 11:46:15 +0000143 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200144 unsigned char *p = buf;
Valerio Setti02c25b52022-11-15 14:08:42 +0100145 size_t kkpp_len = 0;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200146
147 *olen = 0;
148
149 /* Skip costly extension if we can't use EC J-PAKE anyway */
Neil Armstrongca7d5062022-05-31 14:43:23 +0200150#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100151 if (ssl->handshake->psa_pake_ctx_is_ok != 1) {
152 return 0;
153 }
Neil Armstrongca7d5062022-05-31 14:43:23 +0200154#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100155 if (mbedtls_ecjpake_check(&ssl->handshake->ecjpake_ctx) != 0) {
156 return 0;
157 }
Neil Armstrongca7d5062022-05-31 14:43:23 +0200158#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200159
Gilles Peskine449bd832023-01-11 14:50:10 +0100160 MBEDTLS_SSL_DEBUG_MSG(3,
161 ("client hello, adding ecjpake_kkpp extension"));
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200162
Gilles Peskine449bd832023-01-11 14:50:10 +0100163 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200164
Gilles Peskine449bd832023-01-11 14:50:10 +0100165 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ECJPAKE_KKPP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100166 p += 2;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200167
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200168 /*
169 * We may need to send ClientHello multiple times for Hello verification.
170 * We don't want to compute fresh values every time (both for performance
171 * and consistency reasons), so cache the extension content.
172 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100173 if (ssl->handshake->ecjpake_cache == NULL ||
174 ssl->handshake->ecjpake_cache_len == 0) {
175 MBEDTLS_SSL_DEBUG_MSG(3, ("generating new ecjpake parameters"));
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200176
Neil Armstrongca7d5062022-05-31 14:43:23 +0200177#if defined(MBEDTLS_USE_PSA_CRYPTO)
Valerio Setti6b3dab02022-11-17 17:14:54 +0100178 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
Gilles Peskine449bd832023-01-11 14:50:10 +0100179 p + 2, end - p - 2, &kkpp_len,
180 MBEDTLS_ECJPAKE_ROUND_ONE);
181 if (ret != 0) {
182 psa_destroy_key(ssl->handshake->psa_pake_password);
183 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
184 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
185 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200186 }
Neil Armstrongca7d5062022-05-31 14:43:23 +0200187#else
Gilles Peskine449bd832023-01-11 14:50:10 +0100188 ret = mbedtls_ecjpake_write_round_one(&ssl->handshake->ecjpake_ctx,
189 p + 2, end - p - 2, &kkpp_len,
190 ssl->conf->f_rng, ssl->conf->p_rng);
191 if (ret != 0) {
192 MBEDTLS_SSL_DEBUG_RET(1,
193 "mbedtls_ecjpake_write_round_one", ret);
194 return ret;
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200195 }
Neil Armstrongca7d5062022-05-31 14:43:23 +0200196#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200197
Gilles Peskine449bd832023-01-11 14:50:10 +0100198 ssl->handshake->ecjpake_cache = mbedtls_calloc(1, kkpp_len);
199 if (ssl->handshake->ecjpake_cache == NULL) {
200 MBEDTLS_SSL_DEBUG_MSG(1, ("allocation failed"));
201 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200202 }
203
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 memcpy(ssl->handshake->ecjpake_cache, p + 2, kkpp_len);
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200205 ssl->handshake->ecjpake_cache_len = kkpp_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100206 } else {
207 MBEDTLS_SSL_DEBUG_MSG(3, ("re-using cached ecjpake parameters"));
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200208
209 kkpp_len = ssl->handshake->ecjpake_cache_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 MBEDTLS_SSL_CHK_BUF_PTR(p + 2, end, kkpp_len);
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200211
Gilles Peskine449bd832023-01-11 14:50:10 +0100212 memcpy(p + 2, ssl->handshake->ecjpake_cache, kkpp_len);
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200213 }
214
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 MBEDTLS_PUT_UINT16_BE(kkpp_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100216 p += 2;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200217
218 *olen = kkpp_len + 4;
Hanno Becker261602c2017-04-12 14:54:42 +0100219
Gilles Peskine449bd832023-01-11 14:50:10 +0100220 return 0;
Manuel Pégourié-Gonnard294139b2015-09-15 16:55:05 +0200221}
Manuel Pégourié-Gonnardeef142d2015-09-16 10:05:04 +0200222#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerc3f177a2012-04-11 16:11:49 +0000223
Hanno Beckera0e20d02019-05-15 14:03:01 +0100224#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200225MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100226static int ssl_write_cid_ext(mbedtls_ssl_context *ssl,
227 unsigned char *buf,
228 const unsigned char *end,
229 size_t *olen)
Hanno Becker49770ff2019-04-25 16:55:15 +0100230{
231 unsigned char *p = buf;
232 size_t ext_len;
Hanno Becker49770ff2019-04-25 16:55:15 +0100233
234 /*
Hanno Becker49770ff2019-04-25 16:55:15 +0100235 * struct {
236 * opaque cid<0..2^8-1>;
237 * } ConnectionId;
Gilles Peskine449bd832023-01-11 14:50:10 +0100238 */
Hanno Becker49770ff2019-04-25 16:55:15 +0100239
240 *olen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
242 ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
243 return 0;
Hanno Becker49770ff2019-04-25 16:55:15 +0100244 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100245 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding CID extension"));
Hanno Becker49770ff2019-04-25 16:55:15 +0100246
247 /* ssl->own_cid_len is at most MBEDTLS_SSL_CID_IN_LEN_MAX
248 * which is at most 255, so the increment cannot overflow. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 MBEDTLS_SSL_CHK_BUF_PTR(p, end, (unsigned) (ssl->own_cid_len + 5));
Hanno Becker49770ff2019-04-25 16:55:15 +0100250
251 /* Add extension ID + size */
Gilles Peskine449bd832023-01-11 14:50:10 +0100252 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_CID, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100253 p += 2;
Hanno Becker49770ff2019-04-25 16:55:15 +0100254 ext_len = (size_t) ssl->own_cid_len + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100255 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100256 p += 2;
Hanno Becker49770ff2019-04-25 16:55:15 +0100257
258 *p++ = (uint8_t) ssl->own_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100259 memcpy(p, ssl->own_cid, ssl->own_cid_len);
Hanno Becker49770ff2019-04-25 16:55:15 +0100260
261 *olen = ssl->own_cid_len + 5;
Hanno Becker261602c2017-04-12 14:54:42 +0100262
Gilles Peskine449bd832023-01-11 14:50:10 +0100263 return 0;
Hanno Becker49770ff2019-04-25 16:55:15 +0100264}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100265#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker49770ff2019-04-25 16:55:15 +0100266
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200267#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200268MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100269static int ssl_write_max_fragment_length_ext(mbedtls_ssl_context *ssl,
270 unsigned char *buf,
271 const unsigned char *end,
272 size_t *olen)
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200273{
274 unsigned char *p = buf;
275
Simon Butcher0fc94e92015-09-28 20:52:04 +0100276 *olen = 0;
277
Gilles Peskine449bd832023-01-11 14:50:10 +0100278 if (ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE) {
279 return 0;
280 }
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200281
Gilles Peskine449bd832023-01-11 14:50:10 +0100282 MBEDTLS_SSL_DEBUG_MSG(3,
283 ("client hello, adding max_fragment_length extension"));
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200284
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 5);
Simon Butchered997662015-09-28 02:14:30 +0100286
Gilles Peskine449bd832023-01-11 14:50:10 +0100287 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100288 p += 2;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200289
290 *p++ = 0x00;
291 *p++ = 1;
292
Manuel Pégourié-Gonnard7ca4e4d2015-05-04 10:55:58 +0200293 *p++ = ssl->conf->mfl_code;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200294
295 *olen = 5;
Hanno Becker261602c2017-04-12 14:54:42 +0100296
Gilles Peskine449bd832023-01-11 14:50:10 +0100297 return 0;
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200298}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200299#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +0200300
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200301#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200302MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100303static int ssl_write_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
304 unsigned char *buf,
305 const unsigned char *end,
306 size_t *olen)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100307{
308 unsigned char *p = buf;
309
Simon Butcher0fc94e92015-09-28 20:52:04 +0100310 *olen = 0;
311
Gilles Peskine449bd832023-01-11 14:50:10 +0100312 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED) {
313 return 0;
314 }
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100315
Gilles Peskine449bd832023-01-11 14:50:10 +0100316 MBEDTLS_SSL_DEBUG_MSG(3,
317 ("client hello, adding encrypt_then_mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100318
Gilles Peskine449bd832023-01-11 14:50:10 +0100319 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
Simon Butchered997662015-09-28 02:14:30 +0100320
Gilles Peskine449bd832023-01-11 14:50:10 +0100321 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100322 p += 2;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100323
324 *p++ = 0x00;
325 *p++ = 0x00;
326
327 *olen = 4;
Hanno Becker261602c2017-04-12 14:54:42 +0100328
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100330}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200331#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100332
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200333#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200334MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100335static int ssl_write_extended_ms_ext(mbedtls_ssl_context *ssl,
336 unsigned char *buf,
337 const unsigned char *end,
338 size_t *olen)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200339{
340 unsigned char *p = buf;
341
Simon Butcher0fc94e92015-09-28 20:52:04 +0100342 *olen = 0;
343
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED) {
345 return 0;
346 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200347
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 MBEDTLS_SSL_DEBUG_MSG(3,
349 ("client hello, adding extended_master_secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200350
Gilles Peskine449bd832023-01-11 14:50:10 +0100351 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
Simon Butchered997662015-09-28 02:14:30 +0100352
Gilles Peskine449bd832023-01-11 14:50:10 +0100353 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100354 p += 2;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200355
356 *p++ = 0x00;
357 *p++ = 0x00;
358
359 *olen = 4;
Hanno Becker261602c2017-04-12 14:54:42 +0100360
Gilles Peskine449bd832023-01-11 14:50:10 +0100361 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200362}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200364
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200365#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200366MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100367static int ssl_write_session_ticket_ext(mbedtls_ssl_context *ssl,
368 unsigned char *buf,
369 const unsigned char *end,
370 size_t *olen)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200371{
372 unsigned char *p = buf;
373 size_t tlen = ssl->session_negotiate->ticket_len;
374
Simon Butcher0fc94e92015-09-28 20:52:04 +0100375 *olen = 0;
376
Gilles Peskine449bd832023-01-11 14:50:10 +0100377 if (ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED) {
378 return 0;
379 }
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200380
Gilles Peskine449bd832023-01-11 14:50:10 +0100381 MBEDTLS_SSL_DEBUG_MSG(3,
382 ("client hello, adding session ticket extension"));
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200383
Hanno Becker261602c2017-04-12 14:54:42 +0100384 /* The addition is safe here since the ticket length is 16 bit. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100385 MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4 + tlen);
Simon Butchered997662015-09-28 02:14:30 +0100386
Gilles Peskine449bd832023-01-11 14:50:10 +0100387 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_SESSION_TICKET, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100388 p += 2;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200389
Gilles Peskine449bd832023-01-11 14:50:10 +0100390 MBEDTLS_PUT_UINT16_BE(tlen, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100391 p += 2;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200392
393 *olen = 4;
394
Gilles Peskine449bd832023-01-11 14:50:10 +0100395 if (ssl->session_negotiate->ticket == NULL || tlen == 0) {
396 return 0;
397 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200398
Gilles Peskine449bd832023-01-11 14:50:10 +0100399 MBEDTLS_SSL_DEBUG_MSG(3,
400 ("sending session ticket of length %" MBEDTLS_PRINTF_SIZET, tlen));
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200401
Gilles Peskine449bd832023-01-11 14:50:10 +0100402 memcpy(p, ssl->session_negotiate->ticket, tlen);
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200403
404 *olen += tlen;
Hanno Becker261602c2017-04-12 14:54:42 +0100405
Gilles Peskine449bd832023-01-11 14:50:10 +0100406 return 0;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200407}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200408#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200409
Ron Eldora9788042018-12-05 11:04:31 +0200410#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200411MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100412static int ssl_write_use_srtp_ext(mbedtls_ssl_context *ssl,
413 unsigned char *buf,
414 const unsigned char *end,
415 size_t *olen)
Johan Pascalb62bb512015-12-03 21:56:45 +0100416{
417 unsigned char *p = buf;
Johan Pascalf6417ec2020-09-22 15:15:19 +0200418 size_t protection_profiles_index = 0, ext_len = 0;
419 uint16_t mki_len = 0, profile_value = 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100420
421 *olen = 0;
422
Gilles Peskine449bd832023-01-11 14:50:10 +0100423 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
424 (ssl->conf->dtls_srtp_profile_list == NULL) ||
425 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
426 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100427 }
428
Ron Eldora9788042018-12-05 11:04:31 +0200429 /* RFC 5764 section 4.1.1
Johan Pascalb62bb512015-12-03 21:56:45 +0100430 * uint8 SRTPProtectionProfile[2];
431 *
432 * struct {
433 * SRTPProtectionProfiles SRTPProtectionProfiles;
434 * opaque srtp_mki<0..255>;
435 * } UseSRTPData;
Johan Pascalb62bb512015-12-03 21:56:45 +0100436 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
Johan Pascalb62bb512015-12-03 21:56:45 +0100437 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100438 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +0200439 mki_len = ssl->dtls_srtp_info.mki_len;
440 }
Ron Eldoref72faf2018-07-12 11:54:20 +0300441 /* Extension length = 2 bytes for profiles length,
442 * ssl->conf->dtls_srtp_profile_list_len * 2 (each profile is 2 bytes length ),
443 * 1 byte for srtp_mki vector length and the mki_len value
444 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100445 ext_len = 2 + 2 * (ssl->conf->dtls_srtp_profile_list_len) + 1 + mki_len;
Ron Eldor089c9fe2018-12-06 17:12:49 +0200446
Gilles Peskine449bd832023-01-11 14:50:10 +0100447 MBEDTLS_SSL_DEBUG_MSG(3, ("client hello, adding use_srtp extension"));
Johan Pascal77696ee2020-09-22 21:49:40 +0200448
449 /* Check there is room in the buffer for the extension + 4 bytes
450 * - the extension tag (2 bytes)
451 * - the extension length (2 bytes)
452 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100453 MBEDTLS_SSL_CHK_BUF_PTR(p, end, ext_len + 4);
Johan Pascal77696ee2020-09-22 21:49:40 +0200454
Gilles Peskine449bd832023-01-11 14:50:10 +0100455 MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_USE_SRTP, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100456 p += 2;
Johan Pascal77696ee2020-09-22 21:49:40 +0200457
Gilles Peskine449bd832023-01-11 14:50:10 +0100458 MBEDTLS_PUT_UINT16_BE(ext_len, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100459 p += 2;
Johan Pascalb62bb512015-12-03 21:56:45 +0100460
Ron Eldor3adb9922017-12-21 10:15:08 +0200461 /* protection profile length: 2*(ssl->conf->dtls_srtp_profile_list_len) */
Johan Pascalaae4d222020-09-22 21:21:39 +0200462 /* micro-optimization:
463 * the list size is limited to MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH
464 * which is lower than 127, so the upper byte of the length is always 0
465 * For the documentation, the more generic code is left in comments
466 * *p++ = (unsigned char)( ( ( 2 * ssl->conf->dtls_srtp_profile_list_len )
467 * >> 8 ) & 0xFF );
468 */
469 *p++ = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +0100470 *p++ = MBEDTLS_BYTE_0(2 * ssl->conf->dtls_srtp_profile_list_len);
Johan Pascalb62bb512015-12-03 21:56:45 +0100471
Gilles Peskine449bd832023-01-11 14:50:10 +0100472 for (protection_profiles_index = 0;
Ron Eldoref72faf2018-07-12 11:54:20 +0300473 protection_profiles_index < ssl->conf->dtls_srtp_profile_list_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100474 protection_profiles_index++) {
Johan Pascal43f94902020-09-22 12:25:52 +0200475 profile_value = mbedtls_ssl_check_srtp_profile_value
Gilles Peskine449bd832023-01-11 14:50:10 +0100476 (ssl->conf->dtls_srtp_profile_list[protection_profiles_index]);
477 if (profile_value != MBEDTLS_TLS_SRTP_UNSET) {
478 MBEDTLS_SSL_DEBUG_MSG(3, ("ssl_write_use_srtp_ext, add profile: %04x",
479 profile_value));
480 MBEDTLS_PUT_UINT16_BE(profile_value, p, 0);
Joe Subbiani1f6c3ae2021-08-20 11:44:44 +0100481 p += 2;
Gilles Peskine449bd832023-01-11 14:50:10 +0100482 } else {
Ron Eldor089c9fe2018-12-06 17:12:49 +0200483 /*
484 * Note: we shall never arrive here as protection profiles
Johan Pascal76fdf1d2020-10-22 23:31:00 +0200485 * is checked by mbedtls_ssl_conf_dtls_srtp_protection_profiles function
Ron Eldor089c9fe2018-12-06 17:12:49 +0200486 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 MBEDTLS_SSL_DEBUG_MSG(3,
488 ("client hello, "
489 "illegal DTLS-SRTP protection profile %d",
490 ssl->conf->dtls_srtp_profile_list[protection_profiles_index]
491 ));
492 return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Johan Pascalb62bb512015-12-03 21:56:45 +0100493 }
494 }
495
Ron Eldor591f1622018-01-22 12:30:04 +0200496 *p++ = mki_len & 0xFF;
497
Gilles Peskine449bd832023-01-11 14:50:10 +0100498 if (mki_len != 0) {
499 memcpy(p, ssl->dtls_srtp_info.mki_value, mki_len);
Ron Eldor313d7b52018-12-10 14:56:21 +0200500 /*
501 * Increment p to point to the current position.
502 */
503 p += mki_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100504 MBEDTLS_SSL_DEBUG_BUF(3, "sending mki", ssl->dtls_srtp_info.mki_value,
505 ssl->dtls_srtp_info.mki_len);
Ron Eldor591f1622018-01-22 12:30:04 +0200506 }
507
Ron Eldoref72faf2018-07-12 11:54:20 +0300508 /*
509 * total extension length: extension type (2 bytes)
510 * + extension length (2 bytes)
511 * + protection profile length (2 bytes)
512 * + 2 * number of protection profiles
513 * + srtp_mki vector length(1 byte)
Ron Eldor313d7b52018-12-10 14:56:21 +0200514 * + mki value
Ron Eldoref72faf2018-07-12 11:54:20 +0300515 */
Ron Eldor313d7b52018-12-10 14:56:21 +0200516 *olen = p - buf;
Johan Pascal77696ee2020-09-22 21:49:40 +0200517
Gilles Peskine449bd832023-01-11 14:50:10 +0100518 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100519}
520#endif /* MBEDTLS_SSL_DTLS_SRTP */
521
Gilles Peskine449bd832023-01-11 14:50:10 +0100522int mbedtls_ssl_tls12_write_client_hello_exts(mbedtls_ssl_context *ssl,
523 unsigned char *buf,
524 const unsigned char *end,
525 int uses_ec,
526 size_t *out_len)
Ronald Cron12dcdf02022-02-16 15:28:22 +0100527{
528 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
529 unsigned char *p = buf;
530 size_t ext_len = 0;
531
532 (void) ssl;
533 (void) end;
534 (void) uses_ec;
535 (void) ret;
536 (void) ext_len;
537
538 *out_len = 0;
539
540 /* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added
541 * even if MBEDTLS_SSL_RENEGOTIATION is not defined. */
542#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100543 if ((ret = ssl_write_renegotiation_ext(ssl, p, end, &ext_len)) != 0) {
544 MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_renegotiation_ext", ret);
545 return ret;
Ronald Cron12dcdf02022-02-16 15:28:22 +0100546 }
547 p += ext_len;
548#endif
549
550#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
551 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100552 if (uses_ec) {
553 if ((ret = ssl_write_supported_point_formats_ext(ssl, p, end,
554 &ext_len)) != 0) {
555 MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_supported_point_formats_ext", ret);
556 return ret;
Ronald Cron12dcdf02022-02-16 15:28:22 +0100557 }
558 p += ext_len;
559 }
560#endif
561
562#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +0100563 if ((ret = ssl_write_ecjpake_kkpp_ext(ssl, p, end, &ext_len)) != 0) {
564 MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_ecjpake_kkpp_ext", ret);
565 return ret;
Ronald Cron12dcdf02022-02-16 15:28:22 +0100566 }
567 p += ext_len;
568#endif
569
570#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +0100571 if ((ret = ssl_write_cid_ext(ssl, p, end, &ext_len)) != 0) {
572 MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_cid_ext", ret);
573 return ret;
Ronald Cron12dcdf02022-02-16 15:28:22 +0100574 }
575 p += ext_len;
576#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
577
578#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +0100579 if ((ret = ssl_write_max_fragment_length_ext(ssl, p, end,
580 &ext_len)) != 0) {
581 MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_max_fragment_length_ext", ret);
582 return ret;
Ronald Cron12dcdf02022-02-16 15:28:22 +0100583 }
584 p += ext_len;
585#endif
586
587#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Gilles Peskine449bd832023-01-11 14:50:10 +0100588 if ((ret = ssl_write_encrypt_then_mac_ext(ssl, p, end, &ext_len)) != 0) {
589 MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_encrypt_then_mac_ext", ret);
590 return ret;
Ronald Cron12dcdf02022-02-16 15:28:22 +0100591 }
592 p += ext_len;
593#endif
594
595#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +0100596 if ((ret = ssl_write_extended_ms_ext(ssl, p, end, &ext_len)) != 0) {
597 MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_extended_ms_ext", ret);
598 return ret;
Ronald Cron12dcdf02022-02-16 15:28:22 +0100599 }
600 p += ext_len;
601#endif
602
603#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +0100604 if ((ret = ssl_write_use_srtp_ext(ssl, p, end, &ext_len)) != 0) {
605 MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_use_srtp_ext", ret);
606 return ret;
Ronald Cron12dcdf02022-02-16 15:28:22 +0100607 }
608 p += ext_len;
609#endif
610
611#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100612 if ((ret = ssl_write_session_ticket_ext(ssl, p, end, &ext_len)) != 0) {
613 MBEDTLS_SSL_DEBUG_RET(1, "ssl_write_session_ticket_ext", ret);
614 return ret;
Ronald Cron12dcdf02022-02-16 15:28:22 +0100615 }
616 p += ext_len;
617#endif
618
619 *out_len = p - buf;
620
Gilles Peskine449bd832023-01-11 14:50:10 +0100621 return 0;
Ronald Cron12dcdf02022-02-16 15:28:22 +0100622}
623
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200624MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100625static int ssl_parse_renegotiation_info(mbedtls_ssl_context *ssl,
626 const unsigned char *buf,
627 size_t len)
Paul Bakker48916f92012-09-16 19:57:18 +0000628{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200629#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +0100630 if (ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE) {
Manuel Pégourié-Gonnard31ff1d22013-10-28 13:46:11 +0100631 /* Check verify-data in constant-time. The length OTOH is no secret */
Gilles Peskine449bd832023-01-11 14:50:10 +0100632 if (len != 1 + ssl->verify_data_len * 2 ||
Paul Bakker48916f92012-09-16 19:57:18 +0000633 buf[0] != ssl->verify_data_len * 2 ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100634 mbedtls_ct_memcmp(buf + 1,
635 ssl->own_verify_data, ssl->verify_data_len) != 0 ||
636 mbedtls_ct_memcmp(buf + 1 + ssl->verify_data_len,
637 ssl->peer_verify_data, ssl->verify_data_len) != 0) {
638 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching renegotiation info"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100639 mbedtls_ssl_send_alert_message(
640 ssl,
641 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +0100642 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
643 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +0000644 }
Gilles Peskine449bd832023-01-11 14:50:10 +0100645 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200646#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100647 {
Gilles Peskine449bd832023-01-11 14:50:10 +0100648 if (len != 1 || buf[0] != 0x00) {
649 MBEDTLS_SSL_DEBUG_MSG(1,
650 ("non-zero length renegotiation info"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100651 mbedtls_ssl_send_alert_message(
652 ssl,
653 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +0100654 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
655 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100656 }
657
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200658 ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +0100659 }
Paul Bakker48916f92012-09-16 19:57:18 +0000660
Gilles Peskine449bd832023-01-11 14:50:10 +0100661 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +0000662}
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200663
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200664#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200665MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100666static int ssl_parse_max_fragment_length_ext(mbedtls_ssl_context *ssl,
667 const unsigned char *buf,
668 size_t len)
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200669{
670 /*
671 * server should use the extension only if we did,
672 * and if so the server's value should match ours (and len is always 1)
673 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100674 if (ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200675 len != 1 ||
Gilles Peskine449bd832023-01-11 14:50:10 +0100676 buf[0] != ssl->conf->mfl_code) {
677 MBEDTLS_SSL_DEBUG_MSG(1,
678 ("non-matching max fragment length extension"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100679 mbedtls_ssl_send_alert_message(
680 ssl,
681 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +0100682 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
683 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200684 }
685
Gilles Peskine449bd832023-01-11 14:50:10 +0100686 return 0;
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +0200687}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200688#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Paul Bakker48916f92012-09-16 19:57:18 +0000689
Hanno Beckera0e20d02019-05-15 14:03:01 +0100690#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200691MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100692static int ssl_parse_cid_ext(mbedtls_ssl_context *ssl,
693 const unsigned char *buf,
694 size_t len)
Hanno Beckera8373a12019-04-26 15:37:26 +0100695{
696 size_t peer_cid_len;
697
Gilles Peskine449bd832023-01-11 14:50:10 +0100698 if ( /* CID extension only makes sense in DTLS */
Hanno Beckera8373a12019-04-26 15:37:26 +0100699 ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
700 /* The server must only send the CID extension if we have offered it. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100701 ssl->negotiate_cid == MBEDTLS_SSL_CID_DISABLED) {
702 MBEDTLS_SSL_DEBUG_MSG(1, ("CID extension unexpected"));
703 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
704 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT);
705 return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
Hanno Becker22626482019-05-03 12:46:59 +0100706 }
707
Gilles Peskine449bd832023-01-11 14:50:10 +0100708 if (len == 0) {
709 MBEDTLS_SSL_DEBUG_MSG(1, ("CID extension invalid"));
710 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
711 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
712 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Beckera8373a12019-04-26 15:37:26 +0100713 }
714
715 peer_cid_len = *buf++;
716 len--;
717
Gilles Peskine449bd832023-01-11 14:50:10 +0100718 if (peer_cid_len > MBEDTLS_SSL_CID_OUT_LEN_MAX) {
719 MBEDTLS_SSL_DEBUG_MSG(1, ("CID extension invalid"));
720 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
721 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
722 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Hanno Beckera8373a12019-04-26 15:37:26 +0100723 }
724
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 if (len != peer_cid_len) {
726 MBEDTLS_SSL_DEBUG_MSG(1, ("CID extension invalid"));
727 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
728 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
729 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Hanno Beckera8373a12019-04-26 15:37:26 +0100730 }
731
Hanno Becker5a299902019-05-03 12:47:49 +0100732 ssl->handshake->cid_in_use = MBEDTLS_SSL_CID_ENABLED;
Hanno Beckera8373a12019-04-26 15:37:26 +0100733 ssl->handshake->peer_cid_len = (uint8_t) peer_cid_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100734 memcpy(ssl->handshake->peer_cid, buf, peer_cid_len);
Hanno Beckera8373a12019-04-26 15:37:26 +0100735
Gilles Peskine449bd832023-01-11 14:50:10 +0100736 MBEDTLS_SSL_DEBUG_MSG(3, ("Use of CID extension negotiated"));
737 MBEDTLS_SSL_DEBUG_BUF(3, "Server CID", buf, peer_cid_len);
Hanno Beckera8373a12019-04-26 15:37:26 +0100738
Gilles Peskine449bd832023-01-11 14:50:10 +0100739 return 0;
Hanno Beckera8373a12019-04-26 15:37:26 +0100740}
Hanno Beckera0e20d02019-05-15 14:03:01 +0100741#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera8373a12019-04-26 15:37:26 +0100742
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200743#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200744MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100745static int ssl_parse_encrypt_then_mac_ext(mbedtls_ssl_context *ssl,
746 const unsigned char *buf,
747 size_t len)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100748{
Gilles Peskine449bd832023-01-11 14:50:10 +0100749 if (ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||
750 len != 0) {
751 MBEDTLS_SSL_DEBUG_MSG(1,
752 ("non-matching encrypt-then-MAC extension"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100753 mbedtls_ssl_send_alert_message(
754 ssl,
755 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +0100756 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT);
757 return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100758 }
759
760 ((void) buf);
761
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200762 ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100763
Gilles Peskine449bd832023-01-11 14:50:10 +0100764 return 0;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100765}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200766#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +0100767
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200768#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200769MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100770static int ssl_parse_extended_ms_ext(mbedtls_ssl_context *ssl,
771 const unsigned char *buf,
772 size_t len)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200773{
Gilles Peskine449bd832023-01-11 14:50:10 +0100774 if (ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||
775 len != 0) {
776 MBEDTLS_SSL_DEBUG_MSG(1,
777 ("non-matching extended master secret extension"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100778 mbedtls_ssl_send_alert_message(
779 ssl,
780 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +0100781 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT);
782 return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200783 }
784
785 ((void) buf);
786
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200787 ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200788
Gilles Peskine449bd832023-01-11 14:50:10 +0100789 return 0;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200790}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200791#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +0200792
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200793#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200794MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100795static int ssl_parse_session_ticket_ext(mbedtls_ssl_context *ssl,
796 const unsigned char *buf,
797 size_t len)
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200798{
Gilles Peskine449bd832023-01-11 14:50:10 +0100799 if (ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||
800 len != 0) {
801 MBEDTLS_SSL_DEBUG_MSG(1,
802 ("non-matching session ticket extension"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100803 mbedtls_ssl_send_alert_message(
804 ssl,
805 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +0100806 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT);
807 return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +0200808 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200809
810 ((void) buf);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +0200811
812 ssl->handshake->new_session_ticket = 1;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200813
Gilles Peskine449bd832023-01-11 14:50:10 +0100814 return 0;
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200815}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200816#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +0200817
Robert Cragie136884c2015-10-02 13:34:31 +0100818#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Robert Cragieae8535d2015-10-06 17:11:18 +0100819 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200820MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100821static int ssl_parse_supported_point_formats_ext(mbedtls_ssl_context *ssl,
822 const unsigned char *buf,
823 size_t len)
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200824{
825 size_t list_size;
826 const unsigned char *p;
827
Gilles Peskine449bd832023-01-11 14:50:10 +0100828 if (len == 0 || (size_t) (buf[0] + 1) != len) {
829 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
830 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
831 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
832 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200833 }
Philippe Antoine747fd532018-05-30 09:13:21 +0200834 list_size = buf[0];
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200835
Manuel Pégourié-Gonnardfd35af12014-06-23 14:10:13 +0200836 p = buf + 1;
Gilles Peskine449bd832023-01-11 14:50:10 +0100837 while (list_size > 0) {
838 if (p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||
839 p[0] == MBEDTLS_ECP_PF_COMPRESSED) {
Valerio Setti46423162023-03-27 14:33:27 +0200840#if !defined(MBEDTLS_USE_PSA_CRYPTO) && defined(MBEDTLS_ECDH_C)
Manuel Pégourié-Gonnard5734b2d2013-08-15 19:04:02 +0200841 ssl->handshake->ecdh_ctx.point_format = p[0];
Valerio Setti77a904c2023-03-24 07:28:49 +0100842#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_ECDH_C */
Neil Armstrongca7d5062022-05-31 14:43:23 +0200843#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +0100844 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
845 mbedtls_ecjpake_set_point_format(&ssl->handshake->ecjpake_ctx,
846 p[0]);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200847#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +0100848 MBEDTLS_SSL_DEBUG_MSG(4, ("point format selected: %d", p[0]));
849 return 0;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200850 }
851
852 list_size--;
853 p++;
854 }
855
Gilles Peskine449bd832023-01-11 14:50:10 +0100856 MBEDTLS_SSL_DEBUG_MSG(1, ("no point format in common"));
857 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
858 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
859 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200860}
Darryl Green11999bb2018-03-13 15:22:58 +0000861#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
Robert Cragieae8535d2015-10-06 17:11:18 +0100862 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +0200863
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +0200864#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200865MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100866static int ssl_parse_ecjpake_kkpp(mbedtls_ssl_context *ssl,
867 const unsigned char *buf,
868 size_t len)
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +0200869{
Janos Follath865b3eb2019-12-16 11:46:15 +0000870 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +0200871
Gilles Peskine449bd832023-01-11 14:50:10 +0100872 if (ssl->handshake->ciphersuite_info->key_exchange !=
873 MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
874 MBEDTLS_SSL_DEBUG_MSG(3, ("skip ecjpake kkpp extension"));
875 return 0;
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +0200876 }
877
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200878 /* If we got here, we no longer need our cached extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100879 mbedtls_free(ssl->handshake->ecjpake_cache);
Manuel Pégourié-Gonnardd0d8cb32015-09-17 14:16:30 +0200880 ssl->handshake->ecjpake_cache = NULL;
881 ssl->handshake->ecjpake_cache_len = 0;
882
Neil Armstrongca7d5062022-05-31 14:43:23 +0200883#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +0100884 if ((ret = mbedtls_psa_ecjpake_read_round(
885 &ssl->handshake->psa_pake_ctx, buf, len,
886 MBEDTLS_ECJPAKE_ROUND_ONE)) != 0) {
887 psa_destroy_key(ssl->handshake->psa_pake_password);
888 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +0200889
Gilles Peskine449bd832023-01-11 14:50:10 +0100890 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round one", ret);
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100891 mbedtls_ssl_send_alert_message(
892 ssl,
893 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +0100894 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
895 return ret;
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +0200896 }
897
Gilles Peskine449bd832023-01-11 14:50:10 +0100898 return 0;
899#else
900 if ((ret = mbedtls_ecjpake_read_round_one(&ssl->handshake->ecjpake_ctx,
901 buf, len)) != 0) {
902 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_one", ret);
903 mbedtls_ssl_send_alert_message(
904 ssl,
905 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
906 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
907 return ret;
908 }
909
910 return 0;
Neil Armstrongca7d5062022-05-31 14:43:23 +0200911#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +0200912}
913#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard57c28522013-07-19 11:41:43 +0200914
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200915#if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200916MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100917static int ssl_parse_alpn_ext(mbedtls_ssl_context *ssl,
918 const unsigned char *buf, size_t len)
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200919{
920 size_t list_len, name_len;
921 const char **p;
922
923 /* If we didn't send it, the server shouldn't send it */
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 if (ssl->conf->alpn_list == NULL) {
925 MBEDTLS_SSL_DEBUG_MSG(1, ("non-matching ALPN extension"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +0100926 mbedtls_ssl_send_alert_message(
927 ssl,
928 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +0100929 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT);
930 return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200931 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200932
933 /*
934 * opaque ProtocolName<1..2^8-1>;
935 *
936 * struct {
937 * ProtocolName protocol_name_list<2..2^16-1>
938 * } ProtocolNameList;
939 *
940 * the "ProtocolNameList" MUST contain exactly one "ProtocolName"
941 */
942
943 /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */
Gilles Peskine449bd832023-01-11 14:50:10 +0100944 if (len < 4) {
945 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
946 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
947 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200948 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200949
Gilles Peskine449bd832023-01-11 14:50:10 +0100950 list_len = (buf[0] << 8) | buf[1];
951 if (list_len != len - 2) {
952 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
953 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
954 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200955 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200956
957 name_len = buf[2];
Gilles Peskine449bd832023-01-11 14:50:10 +0100958 if (name_len != list_len - 1) {
959 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
960 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
961 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Gilles Peskine1cc8e342017-05-03 16:28:34 +0200962 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200963
964 /* Check that the server chosen protocol was in our list and save it */
Gilles Peskine449bd832023-01-11 14:50:10 +0100965 for (p = ssl->conf->alpn_list; *p != NULL; p++) {
966 if (name_len == strlen(*p) &&
967 memcmp(buf + 3, *p, name_len) == 0) {
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200968 ssl->alpn_chosen = *p;
Gilles Peskine449bd832023-01-11 14:50:10 +0100969 return 0;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200970 }
971 }
972
Gilles Peskine449bd832023-01-11 14:50:10 +0100973 MBEDTLS_SSL_DEBUG_MSG(1, ("ALPN extension: no matching protocol"));
974 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
975 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
976 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200977}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200978#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +0200979
Johan Pascalb62bb512015-12-03 21:56:45 +0100980#if defined(MBEDTLS_SSL_DTLS_SRTP)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +0200981MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +0100982static int ssl_parse_use_srtp_ext(mbedtls_ssl_context *ssl,
983 const unsigned char *buf,
984 size_t len)
Johan Pascalb62bb512015-12-03 21:56:45 +0100985{
Johan Pascal43f94902020-09-22 12:25:52 +0200986 mbedtls_ssl_srtp_profile server_protection = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +0200987 size_t i, mki_len = 0;
Johan Pascalb62bb512015-12-03 21:56:45 +0100988 uint16_t server_protection_profile_value = 0;
989
990 /* If use_srtp is not configured, just ignore the extension */
Gilles Peskine449bd832023-01-11 14:50:10 +0100991 if ((ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) ||
992 (ssl->conf->dtls_srtp_profile_list == NULL) ||
993 (ssl->conf->dtls_srtp_profile_list_len == 0)) {
994 return 0;
995 }
Johan Pascalb62bb512015-12-03 21:56:45 +0100996
Ron Eldora9788042018-12-05 11:04:31 +0200997 /* RFC 5764 section 4.1.1
Johan Pascalb62bb512015-12-03 21:56:45 +0100998 * uint8 SRTPProtectionProfile[2];
999 *
1000 * struct {
1001 * SRTPProtectionProfiles SRTPProtectionProfiles;
1002 * opaque srtp_mki<0..255>;
1003 * } UseSRTPData;
1004
1005 * SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;
1006 *
Johan Pascalb62bb512015-12-03 21:56:45 +01001007 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001008 if (ssl->conf->dtls_srtp_mki_support == MBEDTLS_SSL_DTLS_SRTP_MKI_SUPPORTED) {
Ron Eldor591f1622018-01-22 12:30:04 +02001009 mki_len = ssl->dtls_srtp_info.mki_len;
1010 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001011
Ron Eldoref72faf2018-07-12 11:54:20 +03001012 /*
Johan Pascal76fdf1d2020-10-22 23:31:00 +02001013 * Length is 5 + optional mki_value : one protection profile length (2 bytes)
1014 * + protection profile (2 bytes)
1015 * + mki_len(1 byte)
Ron Eldor313d7b52018-12-10 14:56:21 +02001016 * and optional srtp_mki
Ron Eldoref72faf2018-07-12 11:54:20 +03001017 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001018 if ((len < 5) || (len != (buf[4] + 5u))) {
1019 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1020 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001021
1022 /*
1023 * get the server protection profile
1024 */
Ron Eldoref72faf2018-07-12 11:54:20 +03001025
1026 /*
1027 * protection profile length must be 0x0002 as we must have only
1028 * one protection profile in server Hello
1029 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001030 if ((buf[0] != 0) || (buf[1] != 2)) {
1031 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1032 }
Ron Eldor089c9fe2018-12-06 17:12:49 +02001033
Gilles Peskine449bd832023-01-11 14:50:10 +01001034 server_protection_profile_value = (buf[2] << 8) | buf[3];
Johan Pascal43f94902020-09-22 12:25:52 +02001035 server_protection = mbedtls_ssl_check_srtp_profile_value(
Gilles Peskine449bd832023-01-11 14:50:10 +01001036 server_protection_profile_value);
1037 if (server_protection != MBEDTLS_TLS_SRTP_UNSET) {
1038 MBEDTLS_SSL_DEBUG_MSG(3, ("found srtp profile: %s",
1039 mbedtls_ssl_get_srtp_profile_as_string(
1040 server_protection)));
Johan Pascalb62bb512015-12-03 21:56:45 +01001041 }
1042
Johan Pascal43f94902020-09-22 12:25:52 +02001043 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = MBEDTLS_TLS_SRTP_UNSET;
Ron Eldor591f1622018-01-22 12:30:04 +02001044
Johan Pascalb62bb512015-12-03 21:56:45 +01001045 /*
1046 * Check we have the server profile in our list
1047 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001048 for (i = 0; i < ssl->conf->dtls_srtp_profile_list_len; i++) {
1049 if (server_protection == ssl->conf->dtls_srtp_profile_list[i]) {
Ron Eldor3adb9922017-12-21 10:15:08 +02001050 ssl->dtls_srtp_info.chosen_dtls_srtp_profile = ssl->conf->dtls_srtp_profile_list[i];
Gilles Peskine449bd832023-01-11 14:50:10 +01001051 MBEDTLS_SSL_DEBUG_MSG(3, ("selected srtp profile: %s",
Johan Pascal43f94902020-09-22 12:25:52 +02001052 mbedtls_ssl_get_srtp_profile_as_string(
Gilles Peskine449bd832023-01-11 14:50:10 +01001053 server_protection)));
Ron Eldor591f1622018-01-22 12:30:04 +02001054 break;
Johan Pascalb62bb512015-12-03 21:56:45 +01001055 }
1056 }
1057
Ron Eldor591f1622018-01-22 12:30:04 +02001058 /* If no match was found : server problem, it shall never answer with incompatible profile */
Gilles Peskine449bd832023-01-11 14:50:10 +01001059 if (ssl->dtls_srtp_info.chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET) {
1060 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1061 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1062 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Ron Eldor591f1622018-01-22 12:30:04 +02001063 }
Johan Pascal20c7db32020-10-26 22:45:58 +01001064
1065 /* If server does not use mki in its reply, make sure the client won't keep
1066 * one as negotiated */
Gilles Peskine449bd832023-01-11 14:50:10 +01001067 if (len == 5) {
Johan Pascal20c7db32020-10-26 22:45:58 +01001068 ssl->dtls_srtp_info.mki_len = 0;
1069 }
1070
Ron Eldoref72faf2018-07-12 11:54:20 +03001071 /*
1072 * RFC5764:
Ron Eldor591f1622018-01-22 12:30:04 +02001073 * If the client detects a nonzero-length MKI in the server's response
1074 * that is different than the one the client offered, then the client
1075 * MUST abort the handshake and SHOULD send an invalid_parameter alert.
1076 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001077 if (len > 5 && (buf[4] != mki_len ||
1078 (memcmp(ssl->dtls_srtp_info.mki_value, &buf[5], mki_len)))) {
1079 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1080 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
1081 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Ron Eldor591f1622018-01-22 12:30:04 +02001082 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001083#if defined(MBEDTLS_DEBUG_C)
1084 if (len > 5) {
1085 MBEDTLS_SSL_DEBUG_BUF(3, "received mki", ssl->dtls_srtp_info.mki_value,
1086 ssl->dtls_srtp_info.mki_len);
Ron Eldorb4655392018-07-05 18:25:39 +03001087 }
1088#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001089 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +01001090}
1091#endif /* MBEDTLS_SSL_DTLS_SRTP */
1092
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001093/*
1094 * Parse HelloVerifyRequest. Only called after verifying the HS type.
1095 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001096#if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001097MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001098static int ssl_parse_hello_verify_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001099{
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001100 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Gilles Peskine449bd832023-01-11 14:50:10 +01001101 const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Glenn Strauss83158112022-04-13 14:59:34 -04001102 uint16_t dtls_legacy_version;
Jerry Yue01304f2022-04-07 10:51:55 +08001103
1104#if !defined(MBEDTLS_SSL_PROTO_TLS1_3)
1105 uint8_t cookie_len;
1106#else
1107 uint16_t cookie_len;
1108#endif
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001109
Gilles Peskine449bd832023-01-11 14:50:10 +01001110 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse hello verify request"));
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001111
Gilles Peskineb64bf062019-09-27 14:02:44 +02001112 /* Check that there is enough room for:
1113 * - 2 bytes of version
1114 * - 1 byte of cookie_len
1115 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001116 if (mbedtls_ssl_hs_hdr_len(ssl) + 3 > ssl->in_msglen) {
1117 MBEDTLS_SSL_DEBUG_MSG(1,
1118 ("incoming HelloVerifyRequest message is too short"));
1119 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1120 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1121 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Gilles Peskineb64bf062019-09-27 14:02:44 +02001122 }
1123
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001124 /*
1125 * struct {
1126 * ProtocolVersion server_version;
1127 * opaque cookie<0..2^8-1>;
1128 * } HelloVerifyRequest;
1129 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001130 MBEDTLS_SSL_DEBUG_BUF(3, "server version", p, 2);
1131 dtls_legacy_version = MBEDTLS_GET_UINT16_BE(p, 0);
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001132 p += 2;
1133
TRodziewicz2d8800e2021-05-13 19:14:19 +02001134 /*
Glenn Strauss83158112022-04-13 14:59:34 -04001135 * Since the RFC is not clear on this point, accept DTLS 1.0 (0xfeff)
1136 * The DTLS 1.3 (current draft) renames ProtocolVersion server_version to
1137 * legacy_version and locks the value of legacy_version to 0xfefd (DTLS 1.2)
TRodziewicz2d8800e2021-05-13 19:14:19 +02001138 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001139 if (dtls_legacy_version != 0xfefd && dtls_legacy_version != 0xfeff) {
1140 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server version"));
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001141
Gilles Peskine449bd832023-01-11 14:50:10 +01001142 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1143 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001144
Gilles Peskine449bd832023-01-11 14:50:10 +01001145 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001146 }
1147
1148 cookie_len = *p++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001149 if ((ssl->in_msg + ssl->in_msglen) - p < cookie_len) {
1150 MBEDTLS_SSL_DEBUG_MSG(1,
1151 ("cookie length does not match incoming message size"));
1152 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1153 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1154 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Andres AG5a87c932016-09-26 14:53:05 +01001155 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001156 MBEDTLS_SSL_DEBUG_BUF(3, "cookie", p, cookie_len);
Andres AG5a87c932016-09-26 14:53:05 +01001157
Gilles Peskine449bd832023-01-11 14:50:10 +01001158 mbedtls_free(ssl->handshake->cookie);
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001159
Gilles Peskine449bd832023-01-11 14:50:10 +01001160 ssl->handshake->cookie = mbedtls_calloc(1, cookie_len);
1161 if (ssl->handshake->cookie == NULL) {
1162 MBEDTLS_SSL_DEBUG_MSG(1, ("alloc failed (%d bytes)", cookie_len));
1163 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001164 }
1165
Gilles Peskine449bd832023-01-11 14:50:10 +01001166 memcpy(ssl->handshake->cookie, p, cookie_len);
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001167 ssl->handshake->cookie_len = cookie_len;
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001168
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02001169 /* Start over at ClientHello */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001170 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01001171 ret = mbedtls_ssl_reset_checksum(ssl);
1172 if (0 != ret) {
1173 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ssl_reset_checksum"), ret);
1174 return ret;
1175 }
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001176
Gilles Peskine449bd832023-01-11 14:50:10 +01001177 mbedtls_ssl_recv_flight_completed(ssl);
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02001178
Gilles Peskine449bd832023-01-11 14:50:10 +01001179 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse hello verify request"));
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001180
Gilles Peskine449bd832023-01-11 14:50:10 +01001181 return 0;
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001182}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001183#endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001184
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001185MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001186static int ssl_parse_server_hello(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00001187{
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001188 int ret, i;
Paul Bakker23986e52011-04-24 08:57:21 +00001189 size_t n;
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001190 size_t ext_len;
Paul Bakker48916f92012-09-16 19:57:18 +00001191 unsigned char *buf, *ext;
Manuel Pégourié-Gonnard1cf7b302015-06-24 22:28:19 +02001192 unsigned char comp;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001193#if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00001194 int renegotiation_info_seen = 0;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001195#endif
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001196 int handshake_failure = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001197 const mbedtls_ssl_ciphersuite_t *suite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001198
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001200
Gilles Peskine449bd832023-01-11 14:50:10 +01001201 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001202 /* No alert on a read error. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001203 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
1204 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001205 }
1206
Hanno Becker79594fd2019-05-08 09:38:41 +01001207 buf = ssl->in_msg;
1208
Gilles Peskine449bd832023-01-11 14:50:10 +01001209 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001210#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001211 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001212 ssl->renego_records_seen++;
1213
Gilles Peskine449bd832023-01-11 14:50:10 +01001214 if (ssl->conf->renego_max_records >= 0 &&
1215 ssl->renego_records_seen > ssl->conf->renego_max_records) {
1216 MBEDTLS_SSL_DEBUG_MSG(1,
1217 ("renegotiation requested, but not honored by server"));
1218 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnard44ade652014-08-19 13:58:40 +02001219 }
1220
Gilles Peskine449bd832023-01-11 14:50:10 +01001221 MBEDTLS_SSL_DEBUG_MSG(1,
1222 ("non-handshake message during renegotiation"));
Hanno Beckeraf0665d2017-05-24 09:16:26 +01001223
1224 ssl->keep_current_message = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001225 return MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO;
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001226 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001227#endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard65919622014-08-19 12:50:30 +02001228
Gilles Peskine449bd832023-01-11 14:50:10 +01001229 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001230 mbedtls_ssl_send_alert_message(
1231 ssl,
1232 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01001233 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
1234 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00001235 }
1236
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001237#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001238 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
1239 if (buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST) {
1240 MBEDTLS_SSL_DEBUG_MSG(2, ("received hello verify request"));
1241 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse server hello"));
1242 return ssl_parse_hello_verify_request(ssl);
1243 } else {
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001244 /* We made it through the verification process */
Gilles Peskine449bd832023-01-11 14:50:10 +01001245 mbedtls_free(ssl->handshake->cookie);
XiaokangQian9b93c0d2022-02-09 06:02:25 +00001246 ssl->handshake->cookie = NULL;
Jerry Yuac5ca5a2022-03-04 12:50:46 +08001247 ssl->handshake->cookie_len = 0;
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02001248 }
1249 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001250#endif /* MBEDTLS_SSL_PROTO_DTLS */
Paul Bakker5121ce52009-01-03 21:22:43 +00001251
Gilles Peskine449bd832023-01-11 14:50:10 +01001252 if (ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len(ssl) ||
1253 buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO) {
1254 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
1255 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1256 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1257 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00001258 }
1259
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001260 /*
1261 * 0 . 1 server_version
1262 * 2 . 33 random (maybe including 4 bytes of Unix time)
1263 * 34 . 34 session_id length = n
1264 * 35 . 34+n session_id
1265 * 35+n . 36+n cipher_suite
1266 * 37+n . 37+n compression_method
1267 *
1268 * 38+n . 39+n extensions length (optional)
1269 * 40+n . .. extensions
1270 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001271 buf += mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001272
Gilles Peskine449bd832023-01-11 14:50:10 +01001273 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, version", buf, 2);
1274 ssl->tls_version = mbedtls_ssl_read_version(buf, ssl->conf->transport);
Glenn Strauss60bfe602022-03-14 19:04:24 -04001275 ssl->session_negotiate->tls_version = ssl->tls_version;
Paul Bakker5121ce52009-01-03 21:22:43 +00001276
Gilles Peskine449bd832023-01-11 14:50:10 +01001277 if (ssl->tls_version < ssl->conf->min_tls_version ||
1278 ssl->tls_version > ssl->conf->max_tls_version) {
1279 MBEDTLS_SSL_DEBUG_MSG(1,
1280 (
1281 "server version out of bounds - min: [0x%x], server: [0x%x], max: [0x%x]",
1282 (unsigned) ssl->conf->min_tls_version,
1283 (unsigned) ssl->tls_version,
1284 (unsigned) ssl->conf->max_tls_version));
Paul Bakker1d29fb52012-09-28 13:28:45 +00001285
Gilles Peskine449bd832023-01-11 14:50:10 +01001286 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1287 MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION);
Paul Bakker1d29fb52012-09-28 13:28:45 +00001288
Gilles Peskine449bd832023-01-11 14:50:10 +01001289 return MBEDTLS_ERR_SSL_BAD_PROTOCOL_VERSION;
Paul Bakker1d29fb52012-09-28 13:28:45 +00001290 }
1291
Gilles Peskine449bd832023-01-11 14:50:10 +01001292 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, current time: %lu",
1293 ((unsigned long) buf[2] << 24) |
1294 ((unsigned long) buf[3] << 16) |
1295 ((unsigned long) buf[4] << 8) |
1296 ((unsigned long) buf[5])));
Paul Bakker5121ce52009-01-03 21:22:43 +00001297
Gilles Peskine449bd832023-01-11 14:50:10 +01001298 memcpy(ssl->handshake->randbytes + 32, buf + 2, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00001299
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001300 n = buf[34];
Paul Bakker5121ce52009-01-03 21:22:43 +00001301
Gilles Peskine449bd832023-01-11 14:50:10 +01001302 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, random bytes", buf + 2, 32);
Paul Bakker5121ce52009-01-03 21:22:43 +00001303
Gilles Peskine449bd832023-01-11 14:50:10 +01001304 if (n > 32) {
1305 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
1306 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1307 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1308 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48916f92012-09-16 19:57:18 +00001309 }
1310
Gilles Peskine449bd832023-01-11 14:50:10 +01001311 if (ssl->in_hslen > mbedtls_ssl_hs_hdr_len(ssl) + 39 + n) {
1312 ext_len = ((buf[38 + n] << 8)
1313 | (buf[39 + n]));
Paul Bakker5121ce52009-01-03 21:22:43 +00001314
Gilles Peskine449bd832023-01-11 14:50:10 +01001315 if ((ext_len > 0 && ext_len < 4) ||
1316 ssl->in_hslen != mbedtls_ssl_hs_hdr_len(ssl) + 40 + n + ext_len) {
1317 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001318 mbedtls_ssl_send_alert_message(
1319 ssl,
1320 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01001321 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1322 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48916f92012-09-16 19:57:18 +00001323 }
Gilles Peskine449bd832023-01-11 14:50:10 +01001324 } else if (ssl->in_hslen == mbedtls_ssl_hs_hdr_len(ssl) + 38 + n) {
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001325 ext_len = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001326 } else {
1327 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
1328 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1329 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1330 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnardf7cdbc02014-10-17 17:02:10 +02001331 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001332
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001333 /* ciphersuite (used later) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001334 i = (buf[35 + n] << 8) | buf[36 + n];
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001335
1336 /*
1337 * Read and check compression
1338 */
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001339 comp = buf[37 + n];
Paul Bakker5121ce52009-01-03 21:22:43 +00001340
Gilles Peskine449bd832023-01-11 14:50:10 +01001341 if (comp != MBEDTLS_SSL_COMPRESS_NULL) {
1342 MBEDTLS_SSL_DEBUG_MSG(1,
1343 ("server hello, bad compression: %d", comp));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001344 mbedtls_ssl_send_alert_message(
1345 ssl,
1346 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01001347 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
1348 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnarda0e16322014-07-14 17:38:41 +02001349 }
1350
Paul Bakker380da532012-04-18 16:10:25 +00001351 /*
1352 * Initialize update checksum functions
1353 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001354 ssl->handshake->ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(i);
1355 if (ssl->handshake->ciphersuite_info == NULL) {
1356 MBEDTLS_SSL_DEBUG_MSG(1,
1357 ("ciphersuite info for %04x not found", (unsigned int) i));
1358 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1359 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
1360 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker68884e32013-01-07 18:20:04 +01001361 }
Paul Bakker380da532012-04-18 16:10:25 +00001362
Gilles Peskine449bd832023-01-11 14:50:10 +01001363 mbedtls_ssl_optimize_checksum(ssl, ssl->handshake->ciphersuite_info);
Manuel Pégourié-Gonnard3c599f12014-03-10 13:25:07 +01001364
Gilles Peskine449bd832023-01-11 14:50:10 +01001365 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, session id len.: %" MBEDTLS_PRINTF_SIZET, n));
1366 MBEDTLS_SSL_DEBUG_BUF(3, "server hello, session id", buf + 35, n);
Paul Bakker5121ce52009-01-03 21:22:43 +00001367
1368 /*
1369 * Check if the session can be resumed
1370 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001371 if (ssl->handshake->resume == 0 || n == 0 ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001372#if defined(MBEDTLS_SSL_RENEGOTIATION)
1373 ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01001374#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001375 ssl->session_negotiate->ciphersuite != i ||
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001376 ssl->session_negotiate->id_len != n ||
Gilles Peskine449bd832023-01-11 14:50:10 +01001377 memcmp(ssl->session_negotiate->id, buf + 35, n) != 0) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001378 ssl->state++;
Paul Bakker0a597072012-09-25 21:55:46 +00001379 ssl->handshake->resume = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001380#if defined(MBEDTLS_HAVE_TIME)
Gilles Peskine449bd832023-01-11 14:50:10 +01001381 ssl->session_negotiate->start = mbedtls_time(NULL);
Paul Bakkerfa9b1002013-07-03 15:31:03 +02001382#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001383 ssl->session_negotiate->ciphersuite = i;
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02001384 ssl->session_negotiate->id_len = n;
Gilles Peskine449bd832023-01-11 14:50:10 +01001385 memcpy(ssl->session_negotiate->id, buf + 35, n);
1386 } else {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001387 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Paul Bakker5121ce52009-01-03 21:22:43 +00001388 }
1389
Gilles Peskine449bd832023-01-11 14:50:10 +01001390 MBEDTLS_SSL_DEBUG_MSG(3, ("%s session has been resumed",
1391 ssl->handshake->resume ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001392
Gilles Peskine449bd832023-01-11 14:50:10 +01001393 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, chosen ciphersuite: %04x", (unsigned) i));
1394 MBEDTLS_SSL_DEBUG_MSG(3, ("server hello, compress alg.: %d",
1395 buf[37 + n]));
Paul Bakker5121ce52009-01-03 21:22:43 +00001396
Andrzej Kurek03bac442018-04-25 05:06:07 -04001397 /*
1398 * Perform cipher suite validation in same way as in ssl_write_client_hello.
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001399 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001400 i = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01001401 while (1) {
1402 if (ssl->conf->ciphersuite_list[i] == 0) {
1403 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001404 mbedtls_ssl_send_alert_message(
1405 ssl,
1406 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01001407 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
1408 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Paul Bakker5121ce52009-01-03 21:22:43 +00001409 }
1410
Gilles Peskine449bd832023-01-11 14:50:10 +01001411 if (ssl->conf->ciphersuite_list[i++] ==
1412 ssl->session_negotiate->ciphersuite) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001413 break;
Paul Bakker8f4ddae2013-04-15 15:09:54 +02001414 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001415 }
1416
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001417 suite_info = mbedtls_ssl_ciphersuite_from_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01001418 ssl->session_negotiate->ciphersuite);
1419 if (mbedtls_ssl_validate_ciphersuite(ssl, suite_info, ssl->tls_version,
1420 ssl->tls_version) != 0) {
1421 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001422 mbedtls_ssl_send_alert_message(
1423 ssl,
1424 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01001425 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1426 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001427 }
1428
Gilles Peskine449bd832023-01-11 14:50:10 +01001429 MBEDTLS_SSL_DEBUG_MSG(3,
1430 ("server hello, chosen ciphersuite: %s", suite_info->name));
Mohammad Azim Khan1d3b5082018-04-18 19:35:00 +01001431
Gilles Peskineeccd8882020-03-10 12:19:08 +01001432#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001433 if (suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA &&
1434 ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_2) {
Manuel Pégourié-Gonnardda19f4c2018-06-12 12:40:54 +02001435 ssl->handshake->ecrs_enabled = 1;
1436 }
1437#endif
1438
Gilles Peskine449bd832023-01-11 14:50:10 +01001439 if (comp != MBEDTLS_SSL_COMPRESS_NULL) {
1440 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001441 mbedtls_ssl_send_alert_message(
1442 ssl,
1443 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01001444 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
1445 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Paul Bakker5121ce52009-01-03 21:22:43 +00001446 }
1447
Manuel Pégourié-Gonnard0b3400d2014-09-10 21:23:41 +02001448 ext = buf + 40 + n;
Paul Bakker48916f92012-09-16 19:57:18 +00001449
Gilles Peskine449bd832023-01-11 14:50:10 +01001450 MBEDTLS_SSL_DEBUG_MSG(2,
1451 ("server hello, total extension length: %" MBEDTLS_PRINTF_SIZET,
1452 ext_len));
Manuel Pégourié-Gonnarda0528492013-07-16 17:26:28 +02001453
Gilles Peskine449bd832023-01-11 14:50:10 +01001454 while (ext_len) {
1455 unsigned int ext_id = ((ext[0] << 8)
1456 | (ext[1]));
1457 unsigned int ext_size = ((ext[2] << 8)
1458 | (ext[3]));
Paul Bakker48916f92012-09-16 19:57:18 +00001459
Gilles Peskine449bd832023-01-11 14:50:10 +01001460 if (ext_size + 4 > ext_len) {
1461 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001462 mbedtls_ssl_send_alert_message(
1463 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01001464 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1465 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48916f92012-09-16 19:57:18 +00001466 }
1467
Gilles Peskine449bd832023-01-11 14:50:10 +01001468 switch (ext_id) {
1469 case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:
1470 MBEDTLS_SSL_DEBUG_MSG(3, ("found renegotiation extension"));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001471#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001472 renegotiation_info_seen = 1;
Manuel Pégourié-Gonnardeaecbd32014-11-06 02:38:02 +01001473#endif
Paul Bakker48916f92012-09-16 19:57:18 +00001474
Gilles Peskine449bd832023-01-11 14:50:10 +01001475 if ((ret = ssl_parse_renegotiation_info(ssl, ext + 4,
1476 ext_size)) != 0) {
1477 return ret;
1478 }
Paul Bakker48916f92012-09-16 19:57:18 +00001479
Gilles Peskine449bd832023-01-11 14:50:10 +01001480 break;
Paul Bakker48916f92012-09-16 19:57:18 +00001481
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001482#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01001483 case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:
1484 MBEDTLS_SSL_DEBUG_MSG(3,
1485 ("found max_fragment_length extension"));
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001486
Gilles Peskine449bd832023-01-11 14:50:10 +01001487 if ((ret = ssl_parse_max_fragment_length_ext(ssl,
1488 ext + 4, ext_size)) != 0) {
1489 return ret;
1490 }
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001491
Gilles Peskine449bd832023-01-11 14:50:10 +01001492 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001493#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnardde600e52013-07-17 10:14:38 +02001494
Hanno Beckera0e20d02019-05-15 14:03:01 +01001495#if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Gilles Peskine449bd832023-01-11 14:50:10 +01001496 case MBEDTLS_TLS_EXT_CID:
1497 MBEDTLS_SSL_DEBUG_MSG(3, ("found CID extension"));
Hanno Beckera8373a12019-04-26 15:37:26 +01001498
Gilles Peskine449bd832023-01-11 14:50:10 +01001499 if ((ret = ssl_parse_cid_ext(ssl,
1500 ext + 4,
1501 ext_size)) != 0) {
1502 return ret;
1503 }
Hanno Beckera8373a12019-04-26 15:37:26 +01001504
Gilles Peskine449bd832023-01-11 14:50:10 +01001505 break;
Hanno Beckera0e20d02019-05-15 14:03:01 +01001506#endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckera8373a12019-04-26 15:37:26 +01001507
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001508#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Gilles Peskine449bd832023-01-11 14:50:10 +01001509 case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:
1510 MBEDTLS_SSL_DEBUG_MSG(3, ("found encrypt_then_mac extension"));
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001511
Gilles Peskine449bd832023-01-11 14:50:10 +01001512 if ((ret = ssl_parse_encrypt_then_mac_ext(ssl,
1513 ext + 4, ext_size)) != 0) {
1514 return ret;
1515 }
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001516
Gilles Peskine449bd832023-01-11 14:50:10 +01001517 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001518#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01001519
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001520#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Gilles Peskine449bd832023-01-11 14:50:10 +01001521 case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:
1522 MBEDTLS_SSL_DEBUG_MSG(3,
1523 ("found extended_master_secret extension"));
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001524
Gilles Peskine449bd832023-01-11 14:50:10 +01001525 if ((ret = ssl_parse_extended_ms_ext(ssl,
1526 ext + 4, ext_size)) != 0) {
1527 return ret;
1528 }
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001529
Gilles Peskine449bd832023-01-11 14:50:10 +01001530 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001531#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02001532
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001533#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01001534 case MBEDTLS_TLS_EXT_SESSION_TICKET:
1535 MBEDTLS_SSL_DEBUG_MSG(3, ("found session_ticket extension"));
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001536
Gilles Peskine449bd832023-01-11 14:50:10 +01001537 if ((ret = ssl_parse_session_ticket_ext(ssl,
1538 ext + 4, ext_size)) != 0) {
1539 return ret;
1540 }
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001541
Gilles Peskine449bd832023-01-11 14:50:10 +01001542 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001543#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnard60182ef2013-08-02 14:44:54 +02001544
Robert Cragie136884c2015-10-02 13:34:31 +01001545#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
Gilles Peskine449bd832023-01-11 14:50:10 +01001546 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
1547 case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:
1548 MBEDTLS_SSL_DEBUG_MSG(3,
1549 ("found supported_point_formats extension"));
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001550
Gilles Peskine449bd832023-01-11 14:50:10 +01001551 if ((ret = ssl_parse_supported_point_formats_ext(ssl,
1552 ext + 4, ext_size)) != 0) {
1553 return ret;
1554 }
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001555
Gilles Peskine449bd832023-01-11 14:50:10 +01001556 break;
Robert Cragieae8535d2015-10-06 17:11:18 +01001557#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||
1558 MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7b19c162013-08-15 18:01:11 +02001559
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001560#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001561 case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:
1562 MBEDTLS_SSL_DEBUG_MSG(3, ("found ecjpake_kkpp extension"));
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001563
Gilles Peskine449bd832023-01-11 14:50:10 +01001564 if ((ret = ssl_parse_ecjpake_kkpp(ssl,
1565 ext + 4, ext_size)) != 0) {
1566 return ret;
1567 }
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001568
Gilles Peskine449bd832023-01-11 14:50:10 +01001569 break;
Manuel Pégourié-Gonnard0a1324a2015-09-16 16:01:00 +02001570#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001571
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001572#if defined(MBEDTLS_SSL_ALPN)
Gilles Peskine449bd832023-01-11 14:50:10 +01001573 case MBEDTLS_TLS_EXT_ALPN:
1574 MBEDTLS_SSL_DEBUG_MSG(3, ("found alpn extension"));
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001575
Gilles Peskine449bd832023-01-11 14:50:10 +01001576 if ((ret = ssl_parse_alpn_ext(ssl, ext + 4, ext_size)) != 0) {
1577 return ret;
1578 }
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001579
Gilles Peskine449bd832023-01-11 14:50:10 +01001580 break;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001581#endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02001582
Johan Pascalb62bb512015-12-03 21:56:45 +01001583#if defined(MBEDTLS_SSL_DTLS_SRTP)
Gilles Peskine449bd832023-01-11 14:50:10 +01001584 case MBEDTLS_TLS_EXT_USE_SRTP:
1585 MBEDTLS_SSL_DEBUG_MSG(3, ("found use_srtp extension"));
Johan Pascalb62bb512015-12-03 21:56:45 +01001586
Gilles Peskine449bd832023-01-11 14:50:10 +01001587 if ((ret = ssl_parse_use_srtp_ext(ssl, ext + 4, ext_size)) != 0) {
1588 return ret;
1589 }
Johan Pascalb62bb512015-12-03 21:56:45 +01001590
Gilles Peskine449bd832023-01-11 14:50:10 +01001591 break;
Johan Pascalb62bb512015-12-03 21:56:45 +01001592#endif /* MBEDTLS_SSL_DTLS_SRTP */
1593
Gilles Peskine449bd832023-01-11 14:50:10 +01001594 default:
1595 MBEDTLS_SSL_DEBUG_MSG(3,
1596 ("unknown extension found: %u (ignoring)", ext_id));
Paul Bakker48916f92012-09-16 19:57:18 +00001597 }
1598
1599 ext_len -= 4 + ext_size;
1600 ext += 4 + ext_size;
1601
Gilles Peskine449bd832023-01-11 14:50:10 +01001602 if (ext_len > 0 && ext_len < 4) {
1603 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello message"));
1604 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker48916f92012-09-16 19:57:18 +00001605 }
1606 }
1607
1608 /*
Andrzej Kurek21b50802022-07-06 03:26:55 -04001609 * mbedtls_ssl_derive_keys() has to be called after the parsing of the
1610 * extensions. It sets the transform data for the resumed session which in
1611 * case of DTLS includes the server CID extracted from the CID extension.
1612 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001613 if (ssl->handshake->resume) {
1614 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
1615 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
Andrzej Kurek7cf87252022-06-14 07:12:33 -04001616 mbedtls_ssl_send_alert_message(
1617 ssl,
1618 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01001619 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
1620 return ret;
Andrzej Kurek7cf87252022-06-14 07:12:33 -04001621 }
1622 }
1623
Paul Bakker48916f92012-09-16 19:57:18 +00001624 /*
1625 * Renegotiation security checks
1626 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001627 if (ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001628 ssl->conf->allow_legacy_renegotiation ==
Gilles Peskine449bd832023-01-11 14:50:10 +01001629 MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) {
1630 MBEDTLS_SSL_DEBUG_MSG(1,
1631 ("legacy renegotiation, breaking off handshake"));
Paul Bakker48916f92012-09-16 19:57:18 +00001632 handshake_failure = 1;
1633 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001634#if defined(MBEDTLS_SSL_RENEGOTIATION)
Gilles Peskine449bd832023-01-11 14:50:10 +01001635 else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001636 ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&
Gilles Peskine449bd832023-01-11 14:50:10 +01001637 renegotiation_info_seen == 0) {
1638 MBEDTLS_SSL_DEBUG_MSG(1,
1639 ("renegotiation_info extension missing (secure)"));
Paul Bakker48916f92012-09-16 19:57:18 +00001640 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001641 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1642 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1643 ssl->conf->allow_legacy_renegotiation ==
1644 MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) {
1645 MBEDTLS_SSL_DEBUG_MSG(1, ("legacy renegotiation not allowed"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001646 handshake_failure = 1;
Gilles Peskine449bd832023-01-11 14:50:10 +01001647 } else if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&
1648 ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&
1649 renegotiation_info_seen == 1) {
1650 MBEDTLS_SSL_DEBUG_MSG(1,
1651 ("renegotiation_info extension present (legacy)"));
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001652 handshake_failure = 1;
1653 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001654#endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakkerd0f6fa72012-09-17 09:18:12 +00001655
Gilles Peskine449bd832023-01-11 14:50:10 +01001656 if (handshake_failure == 1) {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01001657 mbedtls_ssl_send_alert_message(
1658 ssl,
1659 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01001660 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
1661 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker48916f92012-09-16 19:57:18 +00001662 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001663
Gilles Peskine449bd832023-01-11 14:50:10 +01001664 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse server hello"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001665
Gilles Peskine449bd832023-01-11 14:50:10 +01001666 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001667}
1668
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001669#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
1670 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001671MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001672static int ssl_parse_server_dh_params(mbedtls_ssl_context *ssl,
1673 unsigned char **p,
1674 unsigned char *end)
Paul Bakker29e1f122013-04-16 13:07:56 +02001675{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001676 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Gilles Peskinee8a2fc82020-12-08 22:46:11 +01001677 size_t dhm_actual_bitlen;
Paul Bakker29e1f122013-04-16 13:07:56 +02001678
Paul Bakker29e1f122013-04-16 13:07:56 +02001679 /*
1680 * Ephemeral DH parameters:
1681 *
1682 * struct {
1683 * opaque dh_p<1..2^16-1>;
1684 * opaque dh_g<1..2^16-1>;
1685 * opaque dh_Ys<1..2^16-1>;
1686 * } ServerDHParams;
1687 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001688 if ((ret = mbedtls_dhm_read_params(&ssl->handshake->dhm_ctx,
1689 p, end)) != 0) {
1690 MBEDTLS_SSL_DEBUG_RET(2, ("mbedtls_dhm_read_params"), ret);
1691 return ret;
Paul Bakker29e1f122013-04-16 13:07:56 +02001692 }
1693
Gilles Peskine449bd832023-01-11 14:50:10 +01001694 dhm_actual_bitlen = mbedtls_dhm_get_bitlen(&ssl->handshake->dhm_ctx);
1695 if (dhm_actual_bitlen < ssl->conf->dhm_min_bitlen) {
1696 MBEDTLS_SSL_DEBUG_MSG(1, ("DHM prime too short: %" MBEDTLS_PRINTF_SIZET " < %u",
1697 dhm_actual_bitlen,
1698 ssl->conf->dhm_min_bitlen));
1699 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker29e1f122013-04-16 13:07:56 +02001700 }
1701
Gilles Peskine449bd832023-01-11 14:50:10 +01001702 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: P ", &ssl->handshake->dhm_ctx.P);
1703 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: G ", &ssl->handshake->dhm_ctx.G);
1704 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GY", &ssl->handshake->dhm_ctx.GY);
Paul Bakker29e1f122013-04-16 13:07:56 +02001705
Gilles Peskine449bd832023-01-11 14:50:10 +01001706 return ret;
Paul Bakker29e1f122013-04-16 13:07:56 +02001707}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001708#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
1709 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001710
Neil Armstrongd8419ff2022-04-12 14:39:12 +02001711#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek468c5062022-10-24 10:30:14 -04001712#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1713 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
1714 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001715MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001716static int ssl_parse_server_ecdh_params(mbedtls_ssl_context *ssl,
1717 unsigned char **p,
1718 unsigned char *end)
Hanno Beckerbb89e272019-01-08 12:54:37 +00001719{
1720 uint16_t tls_id;
1721 uint8_t ecpoint_len;
1722 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02001723 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti40d9ca92023-01-04 16:08:04 +01001724 size_t ec_bits = 0;
Hanno Beckerbb89e272019-01-08 12:54:37 +00001725
1726 /*
Manuel Pégourié-Gonnarde5119892021-12-09 11:45:03 +01001727 * struct {
1728 * ECParameters curve_params;
1729 * ECPoint public;
1730 * } ServerECDHParams;
1731 *
Manuel Pégourié-Gonnard422370d2022-02-07 11:55:21 +01001732 * 1 curve_type (must be "named_curve")
Manuel Pégourié-Gonnarde5119892021-12-09 11:45:03 +01001733 * 2..3 NamedCurve
1734 * 4 ECPoint.len
1735 * 5+ ECPoint contents
Hanno Beckerbb89e272019-01-08 12:54:37 +00001736 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001737 if (end - *p < 4) {
1738 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1739 }
Hanno Beckerbb89e272019-01-08 12:54:37 +00001740
1741 /* First byte is curve_type; only named_curve is handled */
Gilles Peskine449bd832023-01-11 14:50:10 +01001742 if (*(*p)++ != MBEDTLS_ECP_TLS_NAMED_CURVE) {
1743 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1744 }
Hanno Beckerbb89e272019-01-08 12:54:37 +00001745
1746 /* Next two bytes are the namedcurve value */
1747 tls_id = *(*p)++;
1748 tls_id <<= 8;
1749 tls_id |= *(*p)++;
1750
Manuel Pégourié-Gonnard141be6c2022-01-25 11:46:19 +01001751 /* Check it's a curve we offered */
Gilles Peskine449bd832023-01-11 14:50:10 +01001752 if (mbedtls_ssl_check_curve_tls_id(ssl, tls_id) != 0) {
1753 MBEDTLS_SSL_DEBUG_MSG(2,
1754 ("bad server key exchange message (ECDHE curve): %u",
1755 (unsigned) tls_id));
1756 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnardff229cf2022-02-07 12:00:32 +01001757 }
Manuel Pégourié-Gonnard141be6c2022-01-25 11:46:19 +01001758
Valerio Setti40d9ca92023-01-04 16:08:04 +01001759 /* Convert EC's TLS ID to PSA key type. */
Przemek Stekielda4fba62023-06-02 14:52:28 +02001760 if (mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Gilles Peskine449bd832023-01-11 14:50:10 +01001761 &ec_bits) == PSA_ERROR_NOT_SUPPORTED) {
1762 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Hanno Beckerbb89e272019-01-08 12:54:37 +00001763 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001764 handshake->xxdh_psa_type = key_type;
1765 handshake->xxdh_bits = ec_bits;
Hanno Beckerbb89e272019-01-08 12:54:37 +00001766
Manuel Pégourié-Gonnard4a0ac1f2022-01-18 12:30:40 +01001767 /* Keep a copy of the peer's public key */
Hanno Beckerbb89e272019-01-08 12:54:37 +00001768 ecpoint_len = *(*p)++;
Gilles Peskine449bd832023-01-11 14:50:10 +01001769 if ((size_t) (end - *p) < ecpoint_len) {
1770 return MBEDTLS_ERR_SSL_DECODE_ERROR;
1771 }
Hanno Beckerbb89e272019-01-08 12:54:37 +00001772
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02001773 /* When FFDH is enabled, the array handshake->xxdh_psa_peer_key size takes into account
1774 the sizes of the FFDH keys which are at least 2048 bits.
1775 The size of the array is thus greater than 256 bytes which is greater than any
1776 possible value of ecpoint_len (type uint8_t) and the check below can be skipped.*/
Przemek Stekiel24e50d32023-05-19 10:21:38 +02001777#if !defined(PSA_WANT_ALG_FFDH)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001778 if (ecpoint_len > sizeof(handshake->xxdh_psa_peerkey)) {
Gilles Peskine449bd832023-01-11 14:50:10 +01001779 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
1780 }
Przemek Stekiel615cbcd2023-07-06 11:08:39 +02001781#else
Przemek Stekiel46b2d2b2023-07-07 09:34:17 +02001782 MBEDTLS_STATIC_ASSERT(sizeof(handshake->xxdh_psa_peerkey) >= UINT8_MAX,
1783 "peer key buffer too small");
Przemek Stekiel24e50d32023-05-19 10:21:38 +02001784#endif
Hanno Beckerbb89e272019-01-08 12:54:37 +00001785
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02001786 memcpy(handshake->xxdh_psa_peerkey, *p, ecpoint_len);
1787 handshake->xxdh_psa_peerkey_len = ecpoint_len;
Hanno Beckerbb89e272019-01-08 12:54:37 +00001788 *p += ecpoint_len;
Manuel Pégourié-Gonnard4a0ac1f2022-01-18 12:30:40 +01001789
Gilles Peskine449bd832023-01-11 14:50:10 +01001790 return 0;
Hanno Beckerbb89e272019-01-08 12:54:37 +00001791}
Andrzej Kurek468c5062022-10-24 10:30:14 -04001792#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
1793 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
1794 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Neil Armstrongd8419ff2022-04-12 14:39:12 +02001795#else
Andrzej Kurek468c5062022-10-24 10:30:14 -04001796#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1797 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
1798 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
1799 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
1800 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001801MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001802static int ssl_check_server_ecdh_params(const mbedtls_ssl_context *ssl)
Neil Armstrong1f198d82022-04-13 15:02:30 +02001803{
Valerio Setti18c9fed2022-12-30 17:44:24 +01001804 uint16_t tls_id;
Neil Armstrong1f198d82022-04-13 15:02:30 +02001805 mbedtls_ecp_group_id grp_id;
1806#if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
1807 grp_id = ssl->handshake->ecdh_ctx.grp.id;
1808#else
1809 grp_id = ssl->handshake->ecdh_ctx.grp_id;
1810#endif
Hanno Beckerbb89e272019-01-08 12:54:37 +00001811
Gilles Peskine449bd832023-01-11 14:50:10 +01001812 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
1813 if (tls_id == 0) {
1814 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
1815 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Neil Armstrong1f198d82022-04-13 15:02:30 +02001816 }
1817
Gilles Peskine449bd832023-01-11 14:50:10 +01001818 MBEDTLS_SSL_DEBUG_MSG(2, ("ECDH curve: %s",
1819 mbedtls_ssl_get_curve_name_from_tls_id(tls_id)));
Neil Armstrong1f198d82022-04-13 15:02:30 +02001820
Gilles Peskine449bd832023-01-11 14:50:10 +01001821 if (mbedtls_ssl_check_curve(ssl, grp_id) != 0) {
1822 return -1;
1823 }
Neil Armstrong1f198d82022-04-13 15:02:30 +02001824
Gilles Peskine449bd832023-01-11 14:50:10 +01001825 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
1826 MBEDTLS_DEBUG_ECDH_QP);
Neil Armstrong1f198d82022-04-13 15:02:30 +02001827
Gilles Peskine449bd832023-01-11 14:50:10 +01001828 return 0;
Neil Armstrong1f198d82022-04-13 15:02:30 +02001829}
1830
Andrzej Kurek468c5062022-10-24 10:30:14 -04001831#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
1832 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
1833 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
1834 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
1835 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
1836
1837#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
1838 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
1839 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001840MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001841static int ssl_parse_server_ecdh_params(mbedtls_ssl_context *ssl,
1842 unsigned char **p,
1843 unsigned char *end)
Paul Bakker29e1f122013-04-16 13:07:56 +02001844{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001845 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker29e1f122013-04-16 13:07:56 +02001846
Paul Bakker29e1f122013-04-16 13:07:56 +02001847 /*
1848 * Ephemeral ECDH parameters:
1849 *
1850 * struct {
1851 * ECParameters curve_params;
1852 * ECPoint public;
1853 * } ServerECDHParams;
1854 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001855 if ((ret = mbedtls_ecdh_read_params(&ssl->handshake->ecdh_ctx,
1856 (const unsigned char **) p, end)) != 0) {
1857 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_read_params"), ret);
Gilles Peskineeccd8882020-03-10 12:19:08 +01001858#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01001859 if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) {
Manuel Pégourié-Gonnard1c1c20e2018-09-12 10:34:43 +02001860 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
Gilles Peskine449bd832023-01-11 14:50:10 +01001861 }
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02001862#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01001863 return ret;
Paul Bakker29e1f122013-04-16 13:07:56 +02001864 }
1865
Gilles Peskine449bd832023-01-11 14:50:10 +01001866 if (ssl_check_server_ecdh_params(ssl) != 0) {
1867 MBEDTLS_SSL_DEBUG_MSG(1,
1868 ("bad server key exchange message (ECDHE curve)"));
1869 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker29e1f122013-04-16 13:07:56 +02001870 }
1871
Gilles Peskine449bd832023-01-11 14:50:10 +01001872 return ret;
Paul Bakker29e1f122013-04-16 13:07:56 +02001873}
Gilles Peskine449bd832023-01-11 14:50:10 +01001874#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || \
1875 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED || \
Andrzej Kurek468c5062022-10-24 10:30:14 -04001876 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
1877#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskineeccd8882020-03-10 12:19:08 +01001878#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001879MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001880static int ssl_parse_server_psk_hint(mbedtls_ssl_context *ssl,
1881 unsigned char **p,
1882 unsigned char *end)
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001883{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001884 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
irwir6527bd62019-09-21 18:51:25 +03001885 uint16_t len;
Paul Bakkerc5a79cc2013-06-26 15:08:35 +02001886 ((void) ssl);
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001887
1888 /*
1889 * PSK parameters:
1890 *
1891 * opaque psk_identity_hint<0..2^16-1>;
1892 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001893 if (end - (*p) < 2) {
1894 MBEDTLS_SSL_DEBUG_MSG(1,
1895 ("bad server key exchange message (psk_identity_hint length)"));
1896 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Krzysztof Stachowiak740b2182018-03-13 11:31:14 +01001897 }
Manuel Pégourié-Gonnard59b9fe22013-10-15 11:55:33 +02001898 len = (*p)[0] << 8 | (*p)[1];
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001899 *p += 2;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001900
Gilles Peskine449bd832023-01-11 14:50:10 +01001901 if (end - (*p) < len) {
1902 MBEDTLS_SSL_DEBUG_MSG(1,
1903 ("bad server key exchange message (psk_identity_hint length)"));
1904 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001905 }
1906
Manuel Pégourié-Gonnard9d624122016-02-22 11:10:14 +01001907 /*
Tom Cosgroveed4f59e2022-12-05 12:07:50 +00001908 * Note: we currently ignore the PSK identity hint, as we only allow one
Tom Cosgrove1797b052022-12-04 17:19:59 +00001909 * PSK to be provisioned on the client. This could be changed later if
Manuel Pégourié-Gonnard9d624122016-02-22 11:10:14 +01001910 * someone needs that feature.
1911 */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001912 *p += len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001913 ret = 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001914
Gilles Peskine449bd832023-01-11 14:50:10 +01001915 return ret;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001916}
Gilles Peskineeccd8882020-03-10 12:19:08 +01001917#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001918
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001919#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \
1920 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001921/*
1922 * Generate a pre-master secret and encrypt it with the server's RSA key
1923 */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02001924MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01001925static int ssl_write_encrypted_pms(mbedtls_ssl_context *ssl,
1926 size_t offset, size_t *olen,
1927 size_t pms_offset)
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001928{
Janos Follath865b3eb2019-12-16 11:46:15 +00001929 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01001930 size_t len_bytes = 2;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001931 unsigned char *p = ssl->handshake->premaster + pms_offset;
Gilles Peskine449bd832023-01-11 14:50:10 +01001932 mbedtls_pk_context *peer_pk;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001933
Gilles Peskine449bd832023-01-11 14:50:10 +01001934 if (offset + len_bytes > MBEDTLS_SSL_OUT_CONTENT_LEN) {
1935 MBEDTLS_SSL_DEBUG_MSG(1, ("buffer too small for encrypted pms"));
1936 return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02001937 }
1938
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001939 /*
1940 * Generate (part of) the pre-master as
1941 * struct {
1942 * ProtocolVersion client_version;
1943 * opaque random[46];
1944 * } PreMasterSecret;
1945 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001946 mbedtls_ssl_write_version(p, ssl->conf->transport,
1947 MBEDTLS_SSL_VERSION_TLS1_2);
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001948
Gilles Peskine449bd832023-01-11 14:50:10 +01001949 if ((ret = ssl->conf->f_rng(ssl->conf->p_rng, p + 2, 46)) != 0) {
1950 MBEDTLS_SSL_DEBUG_RET(1, "f_rng", ret);
1951 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001952 }
1953
1954 ssl->handshake->pmslen = 48;
1955
Hanno Beckerc7d7e292019-02-06 16:49:54 +00001956#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1957 peer_pk = &ssl->handshake->peer_pubkey;
1958#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001959 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Becker8273df82019-02-06 17:37:32 +00001960 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01001961 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
1962 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02001963 }
Hanno Beckerc7d7e292019-02-06 16:49:54 +00001964 peer_pk = &ssl->session_negotiate->peer_cert->pk;
1965#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02001966
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001967 /*
1968 * Now write it out, encrypted
1969 */
Gilles Peskine449bd832023-01-11 14:50:10 +01001970 if (!mbedtls_pk_can_do(peer_pk, MBEDTLS_PK_RSA)) {
1971 MBEDTLS_SSL_DEBUG_MSG(1, ("certificate key type mismatch"));
1972 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001973 }
1974
Gilles Peskine449bd832023-01-11 14:50:10 +01001975 if ((ret = mbedtls_pk_encrypt(peer_pk,
1976 p, ssl->handshake->pmslen,
1977 ssl->out_msg + offset + len_bytes, olen,
1978 MBEDTLS_SSL_OUT_CONTENT_LEN - offset - len_bytes,
1979 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
1980 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_rsa_pkcs1_encrypt", ret);
1981 return ret;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001982 }
1983
Gilles Peskine449bd832023-01-11 14:50:10 +01001984 if (len_bytes == 2) {
1985 MBEDTLS_PUT_UINT16_BE(*olen, ssl->out_msg, offset);
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001986 *olen += 2;
1987 }
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001988
Hanno Beckerae553dd2019-02-08 14:06:00 +00001989#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1990 /* We don't need the peer's public key anymore. Free it. */
Gilles Peskine449bd832023-01-11 14:50:10 +01001991 mbedtls_pk_free(peer_pk);
Hanno Beckerae553dd2019-02-08 14:06:00 +00001992#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001993 return 0;
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001994}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001995#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||
1996 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
Paul Bakker29e1f122013-04-16 13:07:56 +02001997
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001998#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
1999 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002000MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002001static int ssl_get_ecdh_params_from_cert(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002002{
Janos Follath865b3eb2019-12-16 11:46:15 +00002003 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Gilles Peskine449bd832023-01-11 14:50:10 +01002004 mbedtls_pk_context *peer_pk;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002005
Hanno Beckerbe7f5082019-02-06 17:44:07 +00002006#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2007 peer_pk = &ssl->handshake->peer_pubkey;
2008#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002009 if (ssl->session_negotiate->peer_cert == NULL) {
Hanno Becker8273df82019-02-06 17:37:32 +00002010 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01002011 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2012 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002013 }
Hanno Beckerbe7f5082019-02-06 17:44:07 +00002014 peer_pk = &ssl->session_negotiate->peer_cert->pk;
2015#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnard7f2f0622015-09-03 10:44:32 +02002016
Manuel Pégourié-Gonnard66b0d612022-06-17 10:49:29 +02002017 /* This is a public key, so it can't be opaque, so can_do() is a good
2018 * enough check to ensure pk_ec() is safe to use below. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002019 if (!mbedtls_pk_can_do(peer_pk, MBEDTLS_PK_ECKEY)) {
2020 MBEDTLS_SSL_DEBUG_MSG(1, ("server key not ECDH capable"));
2021 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002022 }
2023
Valerio Setti97207782023-05-18 18:59:06 +02002024#if defined(MBEDTLS_ECP_C)
2025 const mbedtls_ecp_keypair *peer_key = mbedtls_pk_ec_ro(*peer_pk);
2026#endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002027
Przemek Stekielea4000f2022-03-16 09:49:33 +01002028#if defined(MBEDTLS_USE_PSA_CRYPTO)
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002029 uint16_t tls_id = 0;
Przemek Stekiel75a5a9c2023-06-12 11:21:18 +02002030 psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
Valerio Setti97207782023-05-18 18:59:06 +02002031 mbedtls_ecp_group_id grp_id = mbedtls_pk_get_group_id(peer_pk);
Przemek Stekiel561a4232022-03-16 13:16:24 +01002032
Valerio Setti97207782023-05-18 18:59:06 +02002033 if (mbedtls_ssl_check_curve(ssl, grp_id) != 0) {
Gilles Peskine449bd832023-01-11 14:50:10 +01002034 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server certificate (ECDH curve)"));
2035 return MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
Przemek Stekiel561a4232022-03-16 13:16:24 +01002036 }
Przemek Stekielea4000f2022-03-16 09:49:33 +01002037
Valerio Setti97207782023-05-18 18:59:06 +02002038 tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01002039 if (tls_id == 0) {
2040 MBEDTLS_SSL_DEBUG_MSG(1, ("ECC group %u not suported",
Valerio Setti97207782023-05-18 18:59:06 +02002041 grp_id));
Gilles Peskine449bd832023-01-11 14:50:10 +01002042 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Przemek Stekielea4000f2022-03-16 09:49:33 +01002043 }
2044
Valerio Setti1e868cc2023-01-09 17:30:01 +01002045 /* If the above conversion to TLS ID was fine, then also this one will be,
2046 so there is no need to check the return value here */
Przemek Stekielda4fba62023-06-02 14:52:28 +02002047 mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id, &key_type,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002048 &ssl->handshake->xxdh_bits);
Valerio Setti2b5d3de2023-01-09 11:04:52 +01002049
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002050 ssl->handshake->xxdh_psa_type = key_type;
Przemek Stekielea4000f2022-03-16 09:49:33 +01002051
Przemek Stekielea4000f2022-03-16 09:49:33 +01002052 /* Store peer's public key in psa format. */
Valerio Settid7ca3952023-05-17 15:36:18 +02002053#if defined(MBEDTLS_PK_USE_PSA_EC_DATA)
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002054 memcpy(ssl->handshake->xxdh_psa_peerkey, peer_pk->pub_raw, peer_pk->pub_raw_len);
2055 ssl->handshake->xxdh_psa_peerkey_len = peer_pk->pub_raw_len;
Valerio Settid7ca3952023-05-17 15:36:18 +02002056 ret = 0;
Valerio Setti97207782023-05-18 18:59:06 +02002057#else /* MBEDTLS_PK_USE_PSA_EC_DATA */
Valerio Settid7ca3952023-05-17 15:36:18 +02002058 size_t olen = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01002059 ret = mbedtls_ecp_point_write_binary(&peer_key->grp, &peer_key->Q,
2060 MBEDTLS_ECP_PF_UNCOMPRESSED, &olen,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002061 ssl->handshake->xxdh_psa_peerkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002062 MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH);
Przemek Stekielea4000f2022-03-16 09:49:33 +01002063
Gilles Peskine449bd832023-01-11 14:50:10 +01002064 if (ret != 0) {
2065 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecp_point_write_binary"), ret);
2066 return ret;
Przemek Stekiel561a4232022-03-16 13:16:24 +01002067 }
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002068 ssl->handshake->xxdh_psa_peerkey_len = olen;
Valerio Setti97207782023-05-18 18:59:06 +02002069#endif /* MBEDTLS_PK_USE_PSA_EC_DATA */
2070#else /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01002071 if ((ret = mbedtls_ecdh_get_params(&ssl->handshake->ecdh_ctx, peer_key,
2072 MBEDTLS_ECDH_THEIRS)) != 0) {
2073 MBEDTLS_SSL_DEBUG_RET(1, ("mbedtls_ecdh_get_params"), ret);
2074 return ret;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002075 }
2076
Gilles Peskine449bd832023-01-11 14:50:10 +01002077 if (ssl_check_server_ecdh_params(ssl) != 0) {
2078 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server certificate (ECDH curve)"));
2079 return MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002080 }
Valerio Setti97207782023-05-18 18:59:06 +02002081#endif /* MBEDTLS_USE_PSA_CRYPTO */
Hanno Beckerae553dd2019-02-08 14:06:00 +00002082#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2083 /* We don't need the peer's public key anymore. Free it,
2084 * so that more RAM is available for upcoming expensive
2085 * operations like ECDHE. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002086 mbedtls_pk_free(peer_pk);
Hanno Beckerae553dd2019-02-08 14:06:00 +00002087#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2088
Gilles Peskine449bd832023-01-11 14:50:10 +01002089 return ret;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002090}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002091#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||
2092 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002093
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002094MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002095static int ssl_parse_server_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker41c83d32013-03-20 14:39:14 +01002096{
Janos Follath865b3eb2019-12-16 11:46:15 +00002097 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002098 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002099 ssl->handshake->ciphersuite_info;
Andres Amaya Garcia53c77cc2017-06-27 16:15:06 +01002100 unsigned char *p = NULL, *end = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00002101
Gilles Peskine449bd832023-01-11 14:50:10 +01002102 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse server key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002103
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002104#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002105 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
2106 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse server key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002107 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002108 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002109 }
Manuel Pégourié-Gonnardbac0e3b2013-10-15 11:54:47 +02002110 ((void) p);
2111 ((void) end);
2112#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002114#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2115 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002116 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
2117 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
2118 if ((ret = ssl_get_ecdh_params_from_cert(ssl)) != 0) {
2119 MBEDTLS_SSL_DEBUG_RET(1, "ssl_get_ecdh_params_from_cert", ret);
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002120 mbedtls_ssl_send_alert_message(
2121 ssl,
2122 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002123 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
2124 return ret;
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01002125 }
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002126
Gilles Peskine449bd832023-01-11 14:50:10 +01002127 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse server key exchange"));
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002128 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002129 return 0;
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002130 }
2131 ((void) p);
2132 ((void) end);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002133#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2134 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Manuel Pégourié-Gonnardd18cc572013-12-11 17:45:46 +01002135
Gilles Peskineeccd8882020-03-10 12:19:08 +01002136#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002137 if (ssl->handshake->ecrs_enabled &&
2138 ssl->handshake->ecrs_state == ssl_ecrs_ske_start_processing) {
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002139 goto start_processing;
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002140 }
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002141#endif
2142
Gilles Peskine449bd832023-01-11 14:50:10 +01002143 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
2144 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
2145 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002146 }
2147
Gilles Peskine449bd832023-01-11 14:50:10 +01002148 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
2149 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002150 mbedtls_ssl_send_alert_message(
2151 ssl,
2152 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002153 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
2154 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002155 }
2156
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002157 /*
2158 * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server
2159 * doesn't use a psk_identity_hint
2160 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002161 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE) {
2162 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2163 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002164 /* Current message is probably either
2165 * CertificateRequest or ServerHelloDone */
2166 ssl->keep_current_message = 1;
Paul Bakker188c8de2013-04-19 09:13:37 +02002167 goto exit;
2168 }
2169
Gilles Peskine449bd832023-01-11 14:50:10 +01002170 MBEDTLS_SSL_DEBUG_MSG(1,
2171 ("server key exchange message must not be skipped"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002172 mbedtls_ssl_send_alert_message(
2173 ssl,
2174 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002175 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002176
Gilles Peskine449bd832023-01-11 14:50:10 +01002177 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002178 }
2179
Gilles Peskineeccd8882020-03-10 12:19:08 +01002180#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002181 if (ssl->handshake->ecrs_enabled) {
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002182 ssl->handshake->ecrs_state = ssl_ecrs_ske_start_processing;
Gilles Peskine449bd832023-01-11 14:50:10 +01002183 }
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002184
2185start_processing:
2186#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002187 p = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002188 end = ssl->in_msg + ssl->in_hslen;
Gilles Peskine449bd832023-01-11 14:50:10 +01002189 MBEDTLS_SSL_DEBUG_BUF(3, "server key exchange", p, end - p);
Paul Bakker3b6a07b2013-03-21 11:56:50 +01002190
Gilles Peskineeccd8882020-03-10 12:19:08 +01002191#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002192 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002193 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||
2194 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||
Gilles Peskine449bd832023-01-11 14:50:10 +01002195 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
2196 if (ssl_parse_server_psk_hint(ssl, &p, end) != 0) {
2197 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002198 mbedtls_ssl_send_alert_message(
2199 ssl,
2200 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002201 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
2202 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002203 }
Shaun Case8b0ecbc2021-12-20 21:14:10 -08002204 } /* FALLTHROUGH */
Gilles Peskineeccd8882020-03-10 12:19:08 +01002205#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002206
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002207#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \
2208 defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002209 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||
2210 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
Manuel Pégourié-Gonnard09258b92013-10-15 10:43:36 +02002211 ; /* nothing more to do */
Gilles Peskine449bd832023-01-11 14:50:10 +01002212 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002213#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||
2214 MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
2215#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \
2216 defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002217 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||
2218 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
2219 if (ssl_parse_server_dh_params(ssl, &p, end) != 0) {
2220 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002221 mbedtls_ssl_send_alert_message(
2222 ssl,
2223 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002224 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
2225 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002226 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002227 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002228#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||
2229 MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd8419ff2022-04-12 14:39:12 +02002230#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2231 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002232 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002233 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002234 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||
Gilles Peskine449bd832023-01-11 14:50:10 +01002235 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA) {
2236 if (ssl_parse_server_ecdh_params(ssl, &p, end) != 0) {
2237 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002238 mbedtls_ssl_send_alert_message(
2239 ssl,
2240 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002241 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
2242 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Paul Bakker41c83d32013-03-20 14:39:14 +01002243 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002244 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002245#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2246 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||
2247 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002248#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002249 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Neil Armstrongca7d5062022-05-31 14:43:23 +02002250#if defined(MBEDTLS_USE_PSA_CRYPTO)
Valerio Setti9bed8ec2022-11-17 16:36:19 +01002251 /*
2252 * The first 3 bytes are:
2253 * [0] MBEDTLS_ECP_TLS_NAMED_CURVE
2254 * [1, 2] elliptic curve's TLS ID
2255 *
2256 * However since we only support secp256r1 for now, we check only
2257 * that TLS ID here
2258 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002259 uint16_t read_tls_id = MBEDTLS_GET_UINT16_BE(p, 1);
Valerio Setti18c9fed2022-12-30 17:44:24 +01002260 uint16_t exp_tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
Gilles Peskine449bd832023-01-11 14:50:10 +01002261 MBEDTLS_ECP_DP_SECP256R1);
Valerio Setti9bed8ec2022-11-17 16:36:19 +01002262
Gilles Peskine449bd832023-01-11 14:50:10 +01002263 if (exp_tls_id == 0) {
2264 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Valerio Setti9bed8ec2022-11-17 16:36:19 +01002265 }
2266
Gilles Peskine449bd832023-01-11 14:50:10 +01002267 if ((*p != MBEDTLS_ECP_TLS_NAMED_CURVE) ||
2268 (read_tls_id != exp_tls_id)) {
2269 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Valerio Setti5151bdf2022-11-21 14:30:02 +01002270 }
Valerio Setti9bed8ec2022-11-17 16:36:19 +01002271
2272 p += 3;
2273
Gilles Peskine449bd832023-01-11 14:50:10 +01002274 if ((ret = mbedtls_psa_ecjpake_read_round(
2275 &ssl->handshake->psa_pake_ctx, p, end - p,
2276 MBEDTLS_ECJPAKE_ROUND_TWO)) != 0) {
2277 psa_destroy_key(ssl->handshake->psa_pake_password);
2278 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
Neil Armstrongca7d5062022-05-31 14:43:23 +02002279
Gilles Peskine449bd832023-01-11 14:50:10 +01002280 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_input round two", ret);
Neil Armstrongca7d5062022-05-31 14:43:23 +02002281 mbedtls_ssl_send_alert_message(
2282 ssl,
2283 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002284 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
2285 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Neil Armstrongca7d5062022-05-31 14:43:23 +02002286 }
2287#else
Gilles Peskine449bd832023-01-11 14:50:10 +01002288 ret = mbedtls_ecjpake_read_round_two(&ssl->handshake->ecjpake_ctx,
2289 p, end - p);
2290 if (ret != 0) {
2291 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_read_round_two", ret);
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002292 mbedtls_ssl_send_alert_message(
2293 ssl,
2294 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002295 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
2296 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002297 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02002298#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01002299 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02002300#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Paul Bakker41c83d32013-03-20 14:39:14 +01002301 {
Gilles Peskine449bd832023-01-11 14:50:10 +01002302 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2303 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02002304 }
Paul Bakker1ef83d62012-04-11 12:09:53 +00002305
Gilles Peskineeccd8882020-03-10 12:19:08 +01002306#if defined(MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002307 if (mbedtls_ssl_ciphersuite_uses_server_signature(ciphersuite_info)) {
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00002308 size_t sig_len, hashlen;
Manuel Pégourié-Gonnard88579842023-03-28 11:20:23 +02002309 unsigned char hash[MBEDTLS_MD_MAX_SIZE];
Przemek Stekiel40afdd22022-09-06 13:08:28 +02002310
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002311 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
2312 mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;
Gilles Peskine449bd832023-01-11 14:50:10 +01002313 unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnardd92d6a12014-09-10 15:25:02 +00002314 size_t params_len = p - params;
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002315 void *rs_ctx = NULL;
Jerry Yu693a47a2022-06-23 14:02:28 +08002316 uint16_t sig_alg;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002317
Gilles Peskine449bd832023-01-11 14:50:10 +01002318 mbedtls_pk_context *peer_pk;
Hanno Beckera6899bb2019-02-06 18:26:03 +00002319
Jerry Yu693a47a2022-06-23 14:02:28 +08002320#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2321 peer_pk = &ssl->handshake->peer_pubkey;
2322#else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Gilles Peskine449bd832023-01-11 14:50:10 +01002323 if (ssl->session_negotiate->peer_cert == NULL) {
Jerry Yu693a47a2022-06-23 14:02:28 +08002324 /* Should never happen */
Gilles Peskine449bd832023-01-11 14:50:10 +01002325 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2326 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Jerry Yu693a47a2022-06-23 14:02:28 +08002327 }
2328 peer_pk = &ssl->session_negotiate->peer_cert->pk;
2329#endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
2330
Paul Bakker29e1f122013-04-16 13:07:56 +02002331 /*
2332 * Handle the digitally-signed structure
2333 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002334 MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
2335 sig_alg = MBEDTLS_GET_UINT16_BE(p, 0);
2336 if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
2337 sig_alg, &pk_alg, &md_alg) != 0 &&
2338 !mbedtls_ssl_sig_alg_is_offered(ssl, sig_alg) &&
2339 !mbedtls_ssl_sig_alg_is_supported(ssl, sig_alg)) {
2340 MBEDTLS_SSL_DEBUG_MSG(1,
2341 ("bad server key exchange message"));
Ronald Cron90915f22022-03-07 11:11:36 +01002342 mbedtls_ssl_send_alert_message(
2343 ssl,
2344 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002345 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
2346 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Paul Bakker29e1f122013-04-16 13:07:56 +02002347 }
Jerry Yu693a47a2022-06-23 14:02:28 +08002348 p += 2;
Ronald Cron90915f22022-03-07 11:11:36 +01002349
Gilles Peskine449bd832023-01-11 14:50:10 +01002350 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
2351 MBEDTLS_SSL_DEBUG_MSG(1,
2352 ("bad server key exchange message"));
Ronald Cron90915f22022-03-07 11:11:36 +01002353 mbedtls_ssl_send_alert_message(
2354 ssl,
2355 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002356 MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER);
2357 return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
Paul Bakker9659dae2013-08-28 16:21:34 +02002358 }
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02002359
2360 /*
2361 * Read signature
2362 */
Krzysztof Stachowiaka1098f82018-03-13 11:28:49 +01002363
Gilles Peskine449bd832023-01-11 14:50:10 +01002364 if (p > end - 2) {
2365 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002366 mbedtls_ssl_send_alert_message(
2367 ssl,
2368 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002369 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
2370 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Krzysztof Stachowiaka1098f82018-03-13 11:28:49 +01002371 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002372 sig_len = (p[0] << 8) | p[1];
Paul Bakker1ef83d62012-04-11 12:09:53 +00002373 p += 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002374
Gilles Peskine449bd832023-01-11 14:50:10 +01002375 if (p != end - sig_len) {
2376 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002377 mbedtls_ssl_send_alert_message(
2378 ssl,
2379 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002380 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
2381 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker41c83d32013-03-20 14:39:14 +01002382 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002383
Gilles Peskine449bd832023-01-11 14:50:10 +01002384 MBEDTLS_SSL_DEBUG_BUF(3, "signature", p, sig_len);
Manuel Pégourié-Gonnardff56da32013-07-11 10:46:21 +02002385
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002386 /*
2387 * Compute the hash that has been signed
2388 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002389 if (md_alg != MBEDTLS_MD_NONE) {
2390 ret = mbedtls_ssl_get_key_exchange_md_tls1_2(ssl, hash, &hashlen,
2391 params, params_len,
2392 md_alg);
2393 if (ret != 0) {
2394 return ret;
2395 }
2396 } else {
2397 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2398 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker577e0062013-08-28 11:57:20 +02002399 }
Paul Bakker29e1f122013-04-16 13:07:56 +02002400
Gilles Peskine449bd832023-01-11 14:50:10 +01002401 MBEDTLS_SSL_DEBUG_BUF(3, "parameters hash", hash, hashlen);
Paul Bakker29e1f122013-04-16 13:07:56 +02002402
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002403 /*
2404 * Verify signature
2405 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002406 if (!mbedtls_pk_can_do(peer_pk, pk_alg)) {
2407 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server key exchange message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002408 mbedtls_ssl_send_alert_message(
2409 ssl,
2410 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002411 MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE);
2412 return MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH;
Manuel Pégourié-Gonnardefebb0a2013-08-19 12:06:38 +02002413 }
2414
Gilles Peskineeccd8882020-03-10 12:19:08 +01002415#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002416 if (ssl->handshake->ecrs_enabled) {
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +02002417 rs_ctx = &ssl->handshake->ecrs_ctx.pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01002418 }
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002419#endif
2420
Jerry Yu693a47a2022-06-23 14:02:28 +08002421#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
Gilles Peskine449bd832023-01-11 14:50:10 +01002422 if (pk_alg == MBEDTLS_PK_RSASSA_PSS) {
Jerry Yu693a47a2022-06-23 14:02:28 +08002423 mbedtls_pk_rsassa_pss_options rsassa_pss_options;
2424 rsassa_pss_options.mgf1_hash_id = md_alg;
Andrzej Kurek0ce59212022-08-17 07:54:34 -04002425 rsassa_pss_options.expected_salt_len =
Manuel Pégourié-Gonnard9b41eb82023-03-28 11:14:24 +02002426 mbedtls_md_get_size_from_type(md_alg);
Gilles Peskine449bd832023-01-11 14:50:10 +01002427 if (rsassa_pss_options.expected_salt_len == 0) {
2428 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2429 }
Andrzej Kurek0ce59212022-08-17 07:54:34 -04002430
Gilles Peskine449bd832023-01-11 14:50:10 +01002431 ret = mbedtls_pk_verify_ext(pk_alg, &rsassa_pss_options,
2432 peer_pk,
2433 md_alg, hash, hashlen,
2434 p, sig_len);
2435 } else
Jerry Yu693a47a2022-06-23 14:02:28 +08002436#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
Gilles Peskine449bd832023-01-11 14:50:10 +01002437 ret = mbedtls_pk_verify_restartable(peer_pk,
2438 md_alg, hash, hashlen, p, sig_len, rs_ctx);
Jerry Yu693a47a2022-06-23 14:02:28 +08002439
Gilles Peskine449bd832023-01-11 14:50:10 +01002440 if (ret != 0) {
David Horstmannb21bbef2022-10-06 17:49:31 +01002441 int send_alert_msg = 1;
Gilles Peskineeccd8882020-03-10 12:19:08 +01002442#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002443 send_alert_msg = (ret != MBEDTLS_ERR_ECP_IN_PROGRESS);
Manuel Pégourié-Gonnard1f1f2a12017-05-18 11:27:06 +02002444#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002445 if (send_alert_msg) {
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002446 mbedtls_ssl_send_alert_message(
2447 ssl,
2448 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002449 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR);
2450 }
2451 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify", ret);
Gilles Peskineeccd8882020-03-10 12:19:08 +01002452#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002453 if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) {
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02002454 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
Gilles Peskine449bd832023-01-11 14:50:10 +01002455 }
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02002456#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002457 return ret;
Paul Bakkerc3f177a2012-04-11 16:11:49 +00002458 }
Hanno Beckerae553dd2019-02-08 14:06:00 +00002459
2460#if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2461 /* We don't need the peer's public key anymore. Free it,
2462 * so that more RAM is available for upcoming expensive
2463 * operations like ECDHE. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002464 mbedtls_pk_free(peer_pk);
Hanno Beckerae553dd2019-02-08 14:06:00 +00002465#endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakker5121ce52009-01-03 21:22:43 +00002466 }
Gilles Peskineeccd8882020-03-10 12:19:08 +01002467#endif /* MBEDTLS_KEY_EXCHANGE_WITH_SERVER_SIGNATURE_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002468
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002469exit:
Paul Bakker5121ce52009-01-03 21:22:43 +00002470 ssl->state++;
2471
Gilles Peskine449bd832023-01-11 14:50:10 +01002472 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse server key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002473
Gilles Peskine449bd832023-01-11 14:50:10 +01002474 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002475}
2476
Gilles Peskine449bd832023-01-11 14:50:10 +01002477#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002478MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002479static int ssl_parse_certificate_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002480{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002481 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002482 ssl->handshake->ciphersuite_info;
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002483
Gilles Peskine449bd832023-01-11 14:50:10 +01002484 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate request"));
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002485
Gilles Peskine449bd832023-01-11 14:50:10 +01002486 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2487 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate request"));
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002488 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002489 return 0;
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002490 }
2491
Gilles Peskine449bd832023-01-11 14:50:10 +01002492 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
2493 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002494}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002495#else /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002496MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002497static int ssl_parse_certificate_request(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002498{
Janos Follath865b3eb2019-12-16 11:46:15 +00002499 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002500 unsigned char *buf;
2501 size_t n = 0;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002502 size_t cert_type_len = 0, dn_len = 0;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002503 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002504 ssl->handshake->ciphersuite_info;
Ronald Cron90915f22022-03-07 11:11:36 +01002505 size_t sig_alg_len;
2506#if defined(MBEDTLS_DEBUG_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002507 unsigned char *sig_alg;
2508 unsigned char *dn;
Ronald Cron90915f22022-03-07 11:11:36 +01002509#endif
Paul Bakker5121ce52009-01-03 21:22:43 +00002510
Gilles Peskine449bd832023-01-11 14:50:10 +01002511 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002512
Gilles Peskine449bd832023-01-11 14:50:10 +01002513 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
2514 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate request"));
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002515 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01002516 return 0;
Manuel Pégourié-Gonnardda1ff382013-11-25 17:38:36 +01002517 }
2518
Gilles Peskine449bd832023-01-11 14:50:10 +01002519 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
2520 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
2521 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002522 }
2523
Gilles Peskine449bd832023-01-11 14:50:10 +01002524 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
2525 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01002526 mbedtls_ssl_send_alert_message(
2527 ssl,
2528 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002529 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
2530 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002531 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002532
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002533 ssl->state++;
Jerry Yufb28b882022-01-28 11:05:58 +08002534 ssl->handshake->client_auth =
Gilles Peskine449bd832023-01-11 14:50:10 +01002535 (ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST);
Paul Bakker5121ce52009-01-03 21:22:43 +00002536
Gilles Peskine449bd832023-01-11 14:50:10 +01002537 MBEDTLS_SSL_DEBUG_MSG(3, ("got %s certificate request",
2538 ssl->handshake->client_auth ? "a" : "no"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002539
Gilles Peskine449bd832023-01-11 14:50:10 +01002540 if (ssl->handshake->client_auth == 0) {
Johan Pascala89ca862020-08-25 10:03:19 +02002541 /* Current message is probably the ServerHelloDone */
2542 ssl->keep_current_message = 1;
Paul Bakker926af752012-11-23 13:38:07 +01002543 goto exit;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002544 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02002545
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02002546 /*
2547 * struct {
2548 * ClientCertificateType certificate_types<1..2^8-1>;
2549 * SignatureAndHashAlgorithm
2550 * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only
2551 * DistinguishedName certificate_authorities<0..2^16-1>;
2552 * } CertificateRequest;
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002553 *
2554 * Since we only support a single certificate on clients, let's just
2555 * ignore all the information that's supposed to help us pick a
2556 * certificate.
2557 *
2558 * We could check that our certificate matches the request, and bail out
2559 * if it doesn't, but it's simpler to just send the certificate anyway,
2560 * and give the server the opportunity to decide if it should terminate
2561 * the connection when it doesn't like our certificate.
2562 *
2563 * Same goes for the hash in TLS 1.2's signature_algorithms: at this
2564 * point we only have one hash available (see comments in
Simon Butcherc0957bd2016-03-01 13:16:57 +00002565 * write_certificate_verify), so let's just use what we have.
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002566 *
2567 * However, we still minimally parse the message to check it is at least
2568 * superficially sane.
Manuel Pégourié-Gonnard04c1b4e2014-09-10 19:25:43 +02002569 */
Paul Bakker926af752012-11-23 13:38:07 +01002570 buf = ssl->in_msg;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002571
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002572 /* certificate_types */
Gilles Peskine449bd832023-01-11 14:50:10 +01002573 if (ssl->in_hslen <= mbedtls_ssl_hs_hdr_len(ssl)) {
2574 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message"));
2575 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2576 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
2577 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Krzysztof Stachowiak73b183c2018-04-05 10:20:09 +02002578 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002579 cert_type_len = buf[mbedtls_ssl_hs_hdr_len(ssl)];
Paul Bakker926af752012-11-23 13:38:07 +01002580 n = cert_type_len;
2581
Krzysztof Stachowiakbc145f72018-03-20 11:19:50 +01002582 /*
Krzysztof Stachowiak94d49972018-04-05 14:48:55 +02002583 * In the subsequent code there are two paths that read from buf:
Krzysztof Stachowiakbc145f72018-03-20 11:19:50 +01002584 * * the length of the signature algorithms field (if minor version of
2585 * SSL is 3),
2586 * * distinguished name length otherwise.
2587 * Both reach at most the index:
2588 * ...hdr_len + 2 + n,
2589 * therefore the buffer length at this point must be greater than that
2590 * regardless of the actual code path.
2591 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002592 if (ssl->in_hslen <= mbedtls_ssl_hs_hdr_len(ssl) + 2 + n) {
2593 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message"));
2594 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2595 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
2596 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker926af752012-11-23 13:38:07 +01002597 }
2598
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002599 /* supported_signature_algorithms */
Gilles Peskine449bd832023-01-11 14:50:10 +01002600 sig_alg_len = ((buf[mbedtls_ssl_hs_hdr_len(ssl) + 1 + n] << 8)
2601 | (buf[mbedtls_ssl_hs_hdr_len(ssl) + 2 + n]));
Ronald Cron90915f22022-03-07 11:11:36 +01002602
2603 /*
2604 * The furthest access in buf is in the loop few lines below:
2605 * sig_alg[i + 1],
2606 * where:
2607 * sig_alg = buf + ...hdr_len + 3 + n,
2608 * max(i) = sig_alg_len - 1.
2609 * Therefore the furthest access is:
2610 * buf[...hdr_len + 3 + n + sig_alg_len - 1 + 1],
2611 * which reduces to:
2612 * buf[...hdr_len + 3 + n + sig_alg_len],
2613 * which is one less than we need the buf to be.
2614 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002615 if (ssl->in_hslen <= mbedtls_ssl_hs_hdr_len(ssl) + 3 + n + sig_alg_len) {
2616 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message"));
Ronald Cron90915f22022-03-07 11:11:36 +01002617 mbedtls_ssl_send_alert_message(
2618 ssl,
2619 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002620 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
2621 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakkerf7abd422013-04-16 13:15:56 +02002622 }
Paul Bakker926af752012-11-23 13:38:07 +01002623
Ronald Cron90915f22022-03-07 11:11:36 +01002624#if defined(MBEDTLS_DEBUG_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002625 sig_alg = buf + mbedtls_ssl_hs_hdr_len(ssl) + 3 + n;
2626 for (size_t i = 0; i < sig_alg_len; i += 2) {
2627 MBEDTLS_SSL_DEBUG_MSG(3,
2628 ("Supported Signature Algorithm found: %02x %02x",
2629 sig_alg[i], sig_alg[i + 1]));
Ronald Cron90915f22022-03-07 11:11:36 +01002630 }
2631#endif
2632
2633 n += 2 + sig_alg_len;
2634
Manuel Pégourié-Gonnardd1b7f2b2016-02-24 14:13:22 +00002635 /* certificate_authorities */
Gilles Peskine449bd832023-01-11 14:50:10 +01002636 dn_len = ((buf[mbedtls_ssl_hs_hdr_len(ssl) + 1 + n] << 8)
2637 | (buf[mbedtls_ssl_hs_hdr_len(ssl) + 2 + n]));
Paul Bakker926af752012-11-23 13:38:07 +01002638
2639 n += dn_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01002640 if (ssl->in_hslen != mbedtls_ssl_hs_hdr_len(ssl) + 3 + n) {
2641 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message"));
2642 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2643 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
2644 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker926af752012-11-23 13:38:07 +01002645 }
2646
Glenn Straussbd10c4e2022-06-25 03:15:48 -04002647#if defined(MBEDTLS_DEBUG_C)
Gilles Peskine449bd832023-01-11 14:50:10 +01002648 dn = buf + mbedtls_ssl_hs_hdr_len(ssl) + 3 + n - dn_len;
2649 for (size_t i = 0, dni_len = 0; i < dn_len; i += 2 + dni_len) {
Glenn Straussbd10c4e2022-06-25 03:15:48 -04002650 unsigned char *p = dn + i + 2;
2651 mbedtls_x509_name name;
Glenn Straussbd10c4e2022-06-25 03:15:48 -04002652 size_t asn1_len;
2653 char s[MBEDTLS_X509_MAX_DN_NAME_SIZE];
Gilles Peskine449bd832023-01-11 14:50:10 +01002654 memset(&name, 0, sizeof(name));
2655 dni_len = MBEDTLS_GET_UINT16_BE(dn + i, 0);
2656 if (dni_len > dn_len - i - 2 ||
2657 mbedtls_asn1_get_tag(&p, p + dni_len, &asn1_len,
2658 MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE) != 0 ||
2659 mbedtls_x509_get_name(&p, p + asn1_len, &name) != 0) {
2660 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate request message"));
Glenn Straussbd10c4e2022-06-25 03:15:48 -04002661 mbedtls_ssl_send_alert_message(
2662 ssl,
2663 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01002664 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
2665 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Glenn Straussbd10c4e2022-06-25 03:15:48 -04002666 }
Gilles Peskine449bd832023-01-11 14:50:10 +01002667 MBEDTLS_SSL_DEBUG_MSG(3,
2668 ("DN hint: %.*s",
2669 mbedtls_x509_dn_gets(s, sizeof(s), &name), s));
2670 mbedtls_asn1_free_named_data_list_shallow(name.next);
Glenn Straussbd10c4e2022-06-25 03:15:48 -04002671 }
2672#endif
2673
Paul Bakker926af752012-11-23 13:38:07 +01002674exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01002675 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate request"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002676
Gilles Peskine449bd832023-01-11 14:50:10 +01002677 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002678}
Gilles Peskineeccd8882020-03-10 12:19:08 +01002679#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002680
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002681MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002682static int ssl_parse_server_hello_done(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002683{
Janos Follath865b3eb2019-12-16 11:46:15 +00002684 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00002685
Gilles Peskine449bd832023-01-11 14:50:10 +01002686 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002687
Gilles Peskine449bd832023-01-11 14:50:10 +01002688 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
2689 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
2690 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002691 }
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002692
Gilles Peskine449bd832023-01-11 14:50:10 +01002693 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
2694 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello done message"));
2695 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01002696 }
Paul Bakker5121ce52009-01-03 21:22:43 +00002697
Gilles Peskine449bd832023-01-11 14:50:10 +01002698 if (ssl->in_hslen != mbedtls_ssl_hs_hdr_len(ssl) ||
2699 ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE) {
2700 MBEDTLS_SSL_DEBUG_MSG(1, ("bad server hello done message"));
2701 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2702 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
2703 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00002704 }
2705
2706 ssl->state++;
2707
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002708#if defined(MBEDTLS_SSL_PROTO_DTLS)
Gilles Peskine449bd832023-01-11 14:50:10 +01002709 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
2710 mbedtls_ssl_recv_flight_completed(ssl);
2711 }
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002712#endif
2713
Gilles Peskine449bd832023-01-11 14:50:10 +01002714 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse server hello done"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002715
Gilles Peskine449bd832023-01-11 14:50:10 +01002716 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002717}
2718
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02002719MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01002720static int ssl_write_client_key_exchange(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002721{
Janos Follath865b3eb2019-12-16 11:46:15 +00002722 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00002723
2724 size_t header_len;
2725 size_t content_len;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01002726 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00002727 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00002728
Gilles Peskine449bd832023-01-11 14:50:10 +01002729 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002730
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002731#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002732 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA) {
Paul Bakker5121ce52009-01-03 21:22:43 +00002733 /*
2734 * DHM key exchange -- send G^X mod P
2735 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002736 content_len = mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx);
Paul Bakker5121ce52009-01-03 21:22:43 +00002737
Gilles Peskine449bd832023-01-11 14:50:10 +01002738 MBEDTLS_PUT_UINT16_BE(content_len, ssl->out_msg, 4);
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00002739 header_len = 6;
Paul Bakker5121ce52009-01-03 21:22:43 +00002740
Gilles Peskine449bd832023-01-11 14:50:10 +01002741 ret = mbedtls_dhm_make_public(&ssl->handshake->dhm_ctx,
2742 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
2743 &ssl->out_msg[header_len], content_len,
2744 ssl->conf->f_rng, ssl->conf->p_rng);
2745 if (ret != 0) {
2746 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_public", ret);
2747 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002748 }
2749
Gilles Peskine449bd832023-01-11 14:50:10 +01002750 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: X ", &ssl->handshake->dhm_ctx.X);
2751 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: GX", &ssl->handshake->dhm_ctx.GX);
Paul Bakker5121ce52009-01-03 21:22:43 +00002752
Gilles Peskine449bd832023-01-11 14:50:10 +01002753 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
2754 ssl->handshake->premaster,
2755 MBEDTLS_PREMASTER_SIZE,
2756 &ssl->handshake->pmslen,
2757 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2758 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
2759 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002760 }
2761
Gilles Peskine449bd832023-01-11 14:50:10 +01002762 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
2763 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002764#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */
Neil Armstrongd8419ff2022-04-12 14:39:12 +02002765#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
2766 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \
2767 defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \
2768 defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002769 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||
Przemek Stekield905d332022-03-16 09:50:56 +01002770 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||
2771 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||
Gilles Peskine449bd832023-01-11 14:50:10 +01002772 ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA) {
Neil Armstrong11d49452022-04-13 15:03:43 +02002773#if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kureka0237f82022-02-24 13:24:52 -05002774 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2775 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
Janos Follath53b8ec22019-08-08 10:28:27 +01002776 psa_key_attributes_t key_attributes;
Hanno Becker4a63ed42019-01-08 11:39:35 +00002777
2778 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
2779
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00002780 header_len = 4;
Hanno Becker4a63ed42019-01-08 11:39:35 +00002781
Gilles Peskine449bd832023-01-11 14:50:10 +01002782 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Hanno Becker0a94a642019-01-11 14:35:30 +00002783
Hanno Becker4a63ed42019-01-08 11:39:35 +00002784 /*
2785 * Generate EC private key for ECDHE exchange.
2786 */
2787
Hanno Becker4a63ed42019-01-08 11:39:35 +00002788 /* The master secret is obtained from the shared ECDH secret by
2789 * applying the TLS 1.2 PRF with a specific salt and label. While
2790 * the PSA Crypto API encourages combining key agreement schemes
2791 * such as ECDH with fixed KDFs such as TLS 1.2 PRF, it does not
2792 * yet support the provisioning of salt + label to the KDF.
2793 * For the time being, we therefore need to split the computation
2794 * of the ECDH secret and the application of the TLS 1.2 PRF. */
Janos Follath53b8ec22019-08-08 10:28:27 +01002795 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002796 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2797 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002798 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
2799 psa_set_key_bits(&key_attributes, handshake->xxdh_bits);
Hanno Becker4a63ed42019-01-08 11:39:35 +00002800
2801 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002802 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002803 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002804 if (status != PSA_SUCCESS) {
2805 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
2806 }
Hanno Becker4a63ed42019-01-08 11:39:35 +00002807
Manuel Pégourié-Gonnard58d23832022-01-18 12:17:15 +01002808 /* Export the public part of the ECDH private key from PSA.
Manuel Pégourié-Gonnard5d6053f2022-02-08 10:26:19 +01002809 * The export format is an ECPoint structure as expected by TLS,
Manuel Pégourié-Gonnard58d23832022-01-18 12:17:15 +01002810 * but we just need to add a length byte before that. */
2811 unsigned char *own_pubkey = ssl->out_msg + header_len + 1;
2812 unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Gilles Peskine449bd832023-01-11 14:50:10 +01002813 size_t own_pubkey_max_len = (size_t) (end - own_pubkey);
Manuel Pégourié-Gonnard58d23832022-01-18 12:17:15 +01002814 size_t own_pubkey_len;
2815
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002816 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002817 own_pubkey, own_pubkey_max_len,
2818 &own_pubkey_len);
2819 if (status != PSA_SUCCESS) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002820 psa_destroy_key(handshake->xxdh_psa_privkey);
2821 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Gilles Peskine449bd832023-01-11 14:50:10 +01002822 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
Andrzej Kureka0237f82022-02-24 13:24:52 -05002823 }
Hanno Becker4a63ed42019-01-08 11:39:35 +00002824
Manuel Pégourié-Gonnard58d23832022-01-18 12:17:15 +01002825 ssl->out_msg[header_len] = (unsigned char) own_pubkey_len;
2826 content_len = own_pubkey_len + 1;
Hanno Becker4a63ed42019-01-08 11:39:35 +00002827
Hanno Becker4a63ed42019-01-08 11:39:35 +00002828 /* The ECDH secret is the premaster secret used for key derivation. */
2829
Janos Follathdf3b0892019-08-08 11:12:24 +01002830 /* Compute ECDH shared secret. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002831 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002832 handshake->xxdh_psa_privkey,
2833 handshake->xxdh_psa_peerkey,
2834 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01002835 ssl->handshake->premaster,
2836 sizeof(ssl->handshake->premaster),
2837 &ssl->handshake->pmslen);
Hanno Becker4a63ed42019-01-08 11:39:35 +00002838
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002839 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
2840 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Andrzej Kureka0237f82022-02-24 13:24:52 -05002841
Gilles Peskine449bd832023-01-11 14:50:10 +01002842 if (status != PSA_SUCCESS || destruction_status != PSA_SUCCESS) {
2843 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
2844 }
Neil Armstrongd8419ff2022-04-12 14:39:12 +02002845#else
Paul Bakker41c83d32013-03-20 14:39:14 +01002846 /*
2847 * ECDH key exchange -- send client public value
2848 */
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00002849 header_len = 4;
Paul Bakker41c83d32013-03-20 14:39:14 +01002850
Gilles Peskineeccd8882020-03-10 12:19:08 +01002851#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002852 if (ssl->handshake->ecrs_enabled) {
2853 if (ssl->handshake->ecrs_state == ssl_ecrs_cke_ecdh_calc_secret) {
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002854 goto ecdh_calc_secret;
Gilles Peskine449bd832023-01-11 14:50:10 +01002855 }
Manuel Pégourié-Gonnard23e41622017-05-18 12:35:37 +02002856
Gilles Peskine449bd832023-01-11 14:50:10 +01002857 mbedtls_ecdh_enable_restart(&ssl->handshake->ecdh_ctx);
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002858 }
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02002859#endif
2860
Gilles Peskine449bd832023-01-11 14:50:10 +01002861 ret = mbedtls_ecdh_make_public(&ssl->handshake->ecdh_ctx,
2862 &content_len,
2863 &ssl->out_msg[header_len], 1000,
2864 ssl->conf->f_rng, ssl->conf->p_rng);
2865 if (ret != 0) {
2866 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_public", ret);
Gilles Peskineeccd8882020-03-10 12:19:08 +01002867#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002868 if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) {
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02002869 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
Gilles Peskine449bd832023-01-11 14:50:10 +01002870 }
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02002871#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002872 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002873 }
2874
Gilles Peskine449bd832023-01-11 14:50:10 +01002875 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
2876 MBEDTLS_DEBUG_ECDH_Q);
Paul Bakker41c83d32013-03-20 14:39:14 +01002877
Gilles Peskineeccd8882020-03-10 12:19:08 +01002878#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002879 if (ssl->handshake->ecrs_enabled) {
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00002880 ssl->handshake->ecrs_n = content_len;
Manuel Pégourié-Gonnardc37423f2018-10-16 10:28:17 +02002881 ssl->handshake->ecrs_state = ssl_ecrs_cke_ecdh_calc_secret;
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02002882 }
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02002883
2884ecdh_calc_secret:
Gilles Peskine449bd832023-01-11 14:50:10 +01002885 if (ssl->handshake->ecrs_enabled) {
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00002886 content_len = ssl->handshake->ecrs_n;
Gilles Peskine449bd832023-01-11 14:50:10 +01002887 }
Manuel Pégourié-Gonnard2350b4e2017-05-16 09:26:48 +02002888#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002889 if ((ret = mbedtls_ecdh_calc_secret(&ssl->handshake->ecdh_ctx,
2890 &ssl->handshake->pmslen,
2891 ssl->handshake->premaster,
2892 MBEDTLS_MPI_MAX_SIZE,
2893 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
2894 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
Gilles Peskineeccd8882020-03-10 12:19:08 +01002895#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002896 if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) {
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02002897 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
Gilles Peskine449bd832023-01-11 14:50:10 +01002898 }
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02002899#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01002900 return ret;
Paul Bakker41c83d32013-03-20 14:39:14 +01002901 }
2902
Gilles Peskine449bd832023-01-11 14:50:10 +01002903 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
2904 MBEDTLS_DEBUG_ECDH_Z);
Neil Armstrong11d49452022-04-13 15:03:43 +02002905#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01002906 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002907#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||
2908 MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||
2909 MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||
2910 MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */
Neil Armstrong868af822022-03-09 10:26:25 +01002911#if defined(MBEDTLS_USE_PSA_CRYPTO) && \
2912 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01002913 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Neil Armstrong868af822022-03-09 10:26:25 +01002914 psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
2915 psa_status_t destruction_status = PSA_ERROR_CORRUPTION_DETECTED;
2916 psa_key_attributes_t key_attributes;
2917
2918 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
2919
2920 /*
2921 * opaque psk_identity<0..2^16-1>;
2922 */
Gilles Peskine449bd832023-01-11 14:50:10 +01002923 if (mbedtls_ssl_conf_has_static_psk(ssl->conf) == 0) {
Neil Armstrong868af822022-03-09 10:26:25 +01002924 /* We don't offer PSK suites if we don't have a PSK,
2925 * and we check that the server's choice is among the
2926 * ciphersuites we offered, so this should never happen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002927 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
2928 }
Neil Armstrong868af822022-03-09 10:26:25 +01002929
Neil Armstrongfc834f22022-03-23 17:54:38 +01002930 /* uint16 to store content length */
2931 const size_t content_len_size = 2;
2932
Neil Armstrong868af822022-03-09 10:26:25 +01002933 header_len = 4;
Neil Armstrong868af822022-03-09 10:26:25 +01002934
Gilles Peskine449bd832023-01-11 14:50:10 +01002935 if (header_len + content_len_size + ssl->conf->psk_identity_len
2936 > MBEDTLS_SSL_OUT_CONTENT_LEN) {
2937 MBEDTLS_SSL_DEBUG_MSG(1,
2938 ("psk identity too long or SSL buffer too short"));
2939 return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
Neil Armstrong868af822022-03-09 10:26:25 +01002940 }
2941
Neil Armstrongb7ca76b2022-04-04 18:27:15 +02002942 unsigned char *p = ssl->out_msg + header_len;
Neil Armstrong868af822022-03-09 10:26:25 +01002943
Gilles Peskine449bd832023-01-11 14:50:10 +01002944 *p++ = MBEDTLS_BYTE_1(ssl->conf->psk_identity_len);
2945 *p++ = MBEDTLS_BYTE_0(ssl->conf->psk_identity_len);
Neil Armstrongb7ca76b2022-04-04 18:27:15 +02002946 header_len += content_len_size;
2947
Gilles Peskine449bd832023-01-11 14:50:10 +01002948 memcpy(p, ssl->conf->psk_identity,
2949 ssl->conf->psk_identity_len);
Neil Armstrongb7ca76b2022-04-04 18:27:15 +02002950 p += ssl->conf->psk_identity_len;
2951
Neil Armstrong868af822022-03-09 10:26:25 +01002952 header_len += ssl->conf->psk_identity_len;
2953
Gilles Peskine449bd832023-01-11 14:50:10 +01002954 MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH computation."));
Neil Armstrong868af822022-03-09 10:26:25 +01002955
2956 /*
2957 * Generate EC private key for ECDHE exchange.
2958 */
2959
2960 /* The master secret is obtained from the shared ECDH secret by
2961 * applying the TLS 1.2 PRF with a specific salt and label. While
2962 * the PSA Crypto API encourages combining key agreement schemes
2963 * such as ECDH with fixed KDFs such as TLS 1.2 PRF, it does not
2964 * yet support the provisioning of salt + label to the KDF.
2965 * For the time being, we therefore need to split the computation
2966 * of the ECDH secret and the application of the TLS 1.2 PRF. */
2967 key_attributes = psa_key_attributes_init();
Gilles Peskine449bd832023-01-11 14:50:10 +01002968 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
2969 psa_set_key_algorithm(&key_attributes, PSA_ALG_ECDH);
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002970 psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
2971 psa_set_key_bits(&key_attributes, handshake->xxdh_bits);
Neil Armstrong868af822022-03-09 10:26:25 +01002972
2973 /* Generate ECDH private key. */
Gilles Peskine449bd832023-01-11 14:50:10 +01002974 status = psa_generate_key(&key_attributes,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002975 &handshake->xxdh_psa_privkey);
Gilles Peskine449bd832023-01-11 14:50:10 +01002976 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002977 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01002978 }
Neil Armstrong868af822022-03-09 10:26:25 +01002979
2980 /* Export the public part of the ECDH private key from PSA.
2981 * The export format is an ECPoint structure as expected by TLS,
2982 * but we just need to add a length byte before that. */
Neil Armstrongb7ca76b2022-04-04 18:27:15 +02002983 unsigned char *own_pubkey = p + 1;
Neil Armstrong868af822022-03-09 10:26:25 +01002984 unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN;
Gilles Peskine449bd832023-01-11 14:50:10 +01002985 size_t own_pubkey_max_len = (size_t) (end - own_pubkey);
Neil Armstrongbc5e8f92022-03-23 17:42:50 +01002986 size_t own_pubkey_len = 0;
Neil Armstrong868af822022-03-09 10:26:25 +01002987
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002988 status = psa_export_public_key(handshake->xxdh_psa_privkey,
Gilles Peskine449bd832023-01-11 14:50:10 +01002989 own_pubkey, own_pubkey_max_len,
2990 &own_pubkey_len);
2991 if (status != PSA_SUCCESS) {
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02002992 psa_destroy_key(handshake->xxdh_psa_privkey);
2993 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05002994 return PSA_TO_MBEDTLS_ERR(status);
Neil Armstrong868af822022-03-09 10:26:25 +01002995 }
2996
Neil Armstrongb7ca76b2022-04-04 18:27:15 +02002997 *p = (unsigned char) own_pubkey_len;
Neil Armstrong868af822022-03-09 10:26:25 +01002998 content_len = own_pubkey_len + 1;
2999
Neil Armstrong25400452022-03-23 17:44:07 +01003000 /* As RFC 5489 section 2, the premaster secret is formed as follows:
3001 * - a uint16 containing the length (in octets) of the ECDH computation
3002 * - the octet string produced by the ECDH computation
3003 * - a uint16 containing the length (in octets) of the PSK
3004 * - the PSK itself
3005 */
Neil Armstrongb7ca76b2022-04-04 18:27:15 +02003006 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003007 const unsigned char * const pms_end = pms +
3008 sizeof(ssl->handshake->premaster);
Neil Armstrong0bdb68a2022-03-23 17:46:32 +01003009 /* uint16 to store length (in octets) of the ECDH computation */
3010 const size_t zlen_size = 2;
Neil Armstrongbc5e8f92022-03-23 17:42:50 +01003011 size_t zlen = 0;
Neil Armstrong868af822022-03-09 10:26:25 +01003012
Neil Armstrong25400452022-03-23 17:44:07 +01003013 /* Perform ECDH computation after the uint16 reserved for the length */
Gilles Peskine449bd832023-01-11 14:50:10 +01003014 status = psa_raw_key_agreement(PSA_ALG_ECDH,
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003015 handshake->xxdh_psa_privkey,
3016 handshake->xxdh_psa_peerkey,
3017 handshake->xxdh_psa_peerkey_len,
Gilles Peskine449bd832023-01-11 14:50:10 +01003018 pms + zlen_size,
3019 pms_end - (pms + zlen_size),
3020 &zlen);
Neil Armstrong868af822022-03-09 10:26:25 +01003021
Przemek Stekiel7ac93be2023-07-04 10:02:38 +02003022 destruction_status = psa_destroy_key(handshake->xxdh_psa_privkey);
3023 handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
Neil Armstrong868af822022-03-09 10:26:25 +01003024
Gilles Peskine449bd832023-01-11 14:50:10 +01003025 if (status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003026 return PSA_TO_MBEDTLS_ERR(status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003027 } else if (destruction_status != PSA_SUCCESS) {
Andrzej Kurek8a045ce2022-12-23 11:00:06 -05003028 return PSA_TO_MBEDTLS_ERR(destruction_status);
Gilles Peskine449bd832023-01-11 14:50:10 +01003029 }
Neil Armstrong868af822022-03-09 10:26:25 +01003030
Neil Armstrong25400452022-03-23 17:44:07 +01003031 /* Write the ECDH computation length before the ECDH computation */
Gilles Peskine449bd832023-01-11 14:50:10 +01003032 MBEDTLS_PUT_UINT16_BE(zlen, pms, 0);
Neil Armstrongb7ca76b2022-04-04 18:27:15 +02003033 pms += zlen_size + zlen;
Gilles Peskine449bd832023-01-11 14:50:10 +01003034 } else
Neil Armstrong868af822022-03-09 10:26:25 +01003035#endif /* MBEDTLS_USE_PSA_CRYPTO &&
3036 MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003037#if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003038 if (mbedtls_ssl_ciphersuite_uses_psk(ciphersuite_info)) {
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003039 /*
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003040 * opaque psk_identity<0..2^16-1>;
3041 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003042 if (mbedtls_ssl_conf_has_static_psk(ssl->conf) == 0) {
Hanno Becker2e4f6162018-10-23 11:54:44 +01003043 /* We don't offer PSK suites if we don't have a PSK,
3044 * and we check that the server's choice is among the
3045 * ciphersuites we offered, so this should never happen. */
Gilles Peskine449bd832023-01-11 14:50:10 +01003046 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnardb4b19f32015-07-07 11:41:21 +02003047 }
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003048
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003049 header_len = 4;
3050 content_len = ssl->conf->psk_identity_len;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003051
Gilles Peskine449bd832023-01-11 14:50:10 +01003052 if (header_len + 2 + content_len > MBEDTLS_SSL_OUT_CONTENT_LEN) {
3053 MBEDTLS_SSL_DEBUG_MSG(1,
3054 ("psk identity too long or SSL buffer too short"));
3055 return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003056 }
3057
Gilles Peskine449bd832023-01-11 14:50:10 +01003058 ssl->out_msg[header_len++] = MBEDTLS_BYTE_1(content_len);
3059 ssl->out_msg[header_len++] = MBEDTLS_BYTE_0(content_len);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003060
Gilles Peskine449bd832023-01-11 14:50:10 +01003061 memcpy(ssl->out_msg + header_len,
3062 ssl->conf->psk_identity,
3063 ssl->conf->psk_identity_len);
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003064 header_len += ssl->conf->psk_identity_len;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003065
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003066#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003067 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK) {
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003068 content_len = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +01003069 } else
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003070#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003071#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003072 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
3073 if ((ret = ssl_write_encrypted_pms(ssl, header_len,
3074 &content_len, 2)) != 0) {
3075 return ret;
3076 }
3077 } else
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02003078#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003079#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003080 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003081 /*
3082 * ClientDiffieHellmanPublic public (DHM send G^X mod P)
3083 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003084 content_len = mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx);
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003085
Gilles Peskine449bd832023-01-11 14:50:10 +01003086 if (header_len + 2 + content_len >
3087 MBEDTLS_SSL_OUT_CONTENT_LEN) {
3088 MBEDTLS_SSL_DEBUG_MSG(1,
3089 ("psk identity or DHM size too long or SSL buffer too short"));
3090 return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003091 }
3092
Gilles Peskine449bd832023-01-11 14:50:10 +01003093 ssl->out_msg[header_len++] = MBEDTLS_BYTE_1(content_len);
3094 ssl->out_msg[header_len++] = MBEDTLS_BYTE_0(content_len);
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003095
Gilles Peskine449bd832023-01-11 14:50:10 +01003096 ret = mbedtls_dhm_make_public(&ssl->handshake->dhm_ctx,
3097 (int) mbedtls_dhm_get_len(&ssl->handshake->dhm_ctx),
3098 &ssl->out_msg[header_len], content_len,
3099 ssl->conf->f_rng, ssl->conf->p_rng);
3100 if (ret != 0) {
3101 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_make_public", ret);
3102 return ret;
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003103 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003104
3105#if defined(MBEDTLS_USE_PSA_CRYPTO)
3106 unsigned char *pms = ssl->handshake->premaster;
Gilles Peskine449bd832023-01-11 14:50:10 +01003107 unsigned char *pms_end = pms + sizeof(ssl->handshake->premaster);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003108 size_t pms_len;
3109
3110 /* Write length only when we know the actual value */
Gilles Peskine449bd832023-01-11 14:50:10 +01003111 if ((ret = mbedtls_dhm_calc_secret(&ssl->handshake->dhm_ctx,
3112 pms + 2, pms_end - (pms + 2), &pms_len,
3113 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
3114 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
3115 return ret;
Neil Armstrong80f6f322022-05-03 17:56:38 +02003116 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003117 MBEDTLS_PUT_UINT16_BE(pms_len, pms, 0);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003118 pms += 2 + pms_len;
3119
Gilles Peskine449bd832023-01-11 14:50:10 +01003120 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
Neil Armstrong80f6f322022-05-03 17:56:38 +02003121#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003122 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003123#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
Neil Armstrongd8419ff2022-04-12 14:39:12 +02003124#if !defined(MBEDTLS_USE_PSA_CRYPTO) && \
Gilles Peskine449bd832023-01-11 14:50:10 +01003125 defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
3126 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003127 /*
3128 * ClientECDiffieHellmanPublic public;
3129 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003130 ret = mbedtls_ecdh_make_public(&ssl->handshake->ecdh_ctx,
3131 &content_len,
3132 &ssl->out_msg[header_len],
3133 MBEDTLS_SSL_OUT_CONTENT_LEN - header_len,
3134 ssl->conf->f_rng, ssl->conf->p_rng);
3135 if (ret != 0) {
3136 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_make_public", ret);
3137 return ret;
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003138 }
Manuel Pégourié-Gonnard3ce3bbd2013-10-11 16:53:50 +02003139
Gilles Peskine449bd832023-01-11 14:50:10 +01003140 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
3141 MBEDTLS_DEBUG_ECDH_Q);
3142 } else
Neil Armstrongd8419ff2022-04-12 14:39:12 +02003143#endif /* !MBEDTLS_USE_PSA_CRYPTO && MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnard72fb62d2013-10-14 14:01:58 +02003144 {
Gilles Peskine449bd832023-01-11 14:50:10 +01003145 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3146 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003147 }
3148
Neil Armstrong80f6f322022-05-03 17:56:38 +02003149#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine449bd832023-01-11 14:50:10 +01003150 if ((ret = mbedtls_ssl_psk_derive_premaster(ssl,
3151 ciphersuite_info->key_exchange)) != 0) {
3152 MBEDTLS_SSL_DEBUG_RET(1,
3153 "mbedtls_ssl_psk_derive_premaster", ret);
3154 return ret;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003155 }
Neil Armstrong80f6f322022-05-03 17:56:38 +02003156#endif /* !MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003157 } else
Gilles Peskineeccd8882020-03-10 12:19:08 +01003158#endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003159#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003160 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA) {
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003161 header_len = 4;
Gilles Peskine449bd832023-01-11 14:50:10 +01003162 if ((ret = ssl_write_encrypted_pms(ssl, header_len,
3163 &content_len, 0)) != 0) {
3164 return ret;
3165 }
3166 } else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003167#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003168#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003169 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE) {
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003170 header_len = 4;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003171
Neil Armstrongca7d5062022-05-31 14:43:23 +02003172#if defined(MBEDTLS_USE_PSA_CRYPTO)
3173 unsigned char *out_p = ssl->out_msg + header_len;
3174 unsigned char *end_p = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN -
3175 header_len;
Gilles Peskine449bd832023-01-11 14:50:10 +01003176 ret = mbedtls_psa_ecjpake_write_round(&ssl->handshake->psa_pake_ctx,
3177 out_p, end_p - out_p, &content_len,
3178 MBEDTLS_ECJPAKE_ROUND_TWO);
3179 if (ret != 0) {
3180 psa_destroy_key(ssl->handshake->psa_pake_password);
3181 psa_pake_abort(&ssl->handshake->psa_pake_ctx);
3182 MBEDTLS_SSL_DEBUG_RET(1, "psa_pake_output", ret);
3183 return ret;
Neil Armstrongca7d5062022-05-31 14:43:23 +02003184 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02003185#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003186 ret = mbedtls_ecjpake_write_round_two(&ssl->handshake->ecjpake_ctx,
3187 ssl->out_msg + header_len,
3188 MBEDTLS_SSL_OUT_CONTENT_LEN - header_len,
3189 &content_len,
3190 ssl->conf->f_rng, ssl->conf->p_rng);
3191 if (ret != 0) {
3192 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_write_round_two", ret);
3193 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003194 }
3195
Gilles Peskine449bd832023-01-11 14:50:10 +01003196 ret = mbedtls_ecjpake_derive_secret(&ssl->handshake->ecjpake_ctx,
3197 ssl->handshake->premaster, 32, &ssl->handshake->pmslen,
3198 ssl->conf->f_rng, ssl->conf->p_rng);
3199 if (ret != 0) {
3200 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecjpake_derive_secret", ret);
3201 return ret;
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003202 }
Neil Armstrongca7d5062022-05-31 14:43:23 +02003203#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine449bd832023-01-11 14:50:10 +01003204 } else
Manuel Pégourié-Gonnard0f1660a2015-09-16 22:41:06 +02003205#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */
Paul Bakkered27a042013-04-18 22:46:23 +02003206 {
3207 ((void) ciphersuite_info);
Gilles Peskine449bd832023-01-11 14:50:10 +01003208 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3209 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakkered27a042013-04-18 22:46:23 +02003210 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003211
Hanno Beckerc14a3bb2019-01-14 09:41:16 +00003212 ssl->out_msglen = header_len + content_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003213 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3214 ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00003215
3216 ssl->state++;
3217
Gilles Peskine449bd832023-01-11 14:50:10 +01003218 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3219 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3220 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003221 }
3222
Gilles Peskine449bd832023-01-11 14:50:10 +01003223 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write client key exchange"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003224
Gilles Peskine449bd832023-01-11 14:50:10 +01003225 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003226}
3227
Gilles Peskineeccd8882020-03-10 12:19:08 +01003228#if !defined(MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003229MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003230static int ssl_write_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003231{
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003232 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003233 ssl->handshake->ciphersuite_info;
Janos Follath865b3eb2019-12-16 11:46:15 +00003234 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003235
Gilles Peskine449bd832023-01-11 14:50:10 +01003236 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003237
Gilles Peskine449bd832023-01-11 14:50:10 +01003238 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
3239 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
3240 return ret;
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003241 }
3242
Gilles Peskine449bd832023-01-11 14:50:10 +01003243 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3244 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate verify"));
Paul Bakkered27a042013-04-18 22:46:23 +02003245 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003246 return 0;
Paul Bakkered27a042013-04-18 22:46:23 +02003247 }
3248
Gilles Peskine449bd832023-01-11 14:50:10 +01003249 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
3250 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003251}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003252#else /* !MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003253MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003254static int ssl_write_certificate_verify(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003255{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003256 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker0d0cd4b2017-05-11 14:06:43 +01003257 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00003258 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003259 size_t n = 0, offset = 0;
3260 unsigned char hash[48];
Manuel Pégourié-Gonnard4bd12842013-08-27 13:31:28 +02003261 unsigned char *hash_start = hash;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003262 mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02003263 size_t hashlen;
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003264 void *rs_ctx = NULL;
Gilles Peskinef00f1522021-06-22 00:09:00 +02003265#if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Gilles Peskine449bd832023-01-11 14:50:10 +01003266 size_t out_buf_len = ssl->out_buf_len - (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02003267#else
Gilles Peskine449bd832023-01-11 14:50:10 +01003268 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN - (ssl->out_msg - ssl->out_buf);
Gilles Peskinef00f1522021-06-22 00:09:00 +02003269#endif
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003270
Gilles Peskine449bd832023-01-11 14:50:10 +01003271 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003272
Gilles Peskineeccd8882020-03-10 12:19:08 +01003273#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003274 if (ssl->handshake->ecrs_enabled &&
3275 ssl->handshake->ecrs_state == ssl_ecrs_crt_vrfy_sign) {
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003276 goto sign;
Manuel Pégourié-Gonnardd27d1a52017-08-15 11:49:08 +02003277 }
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003278#endif
3279
Gilles Peskine449bd832023-01-11 14:50:10 +01003280 if ((ret = mbedtls_ssl_derive_keys(ssl)) != 0) {
3281 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_derive_keys", ret);
3282 return ret;
Manuel Pégourié-Gonnardada30302014-10-20 20:33:10 +02003283 }
3284
Gilles Peskine449bd832023-01-11 14:50:10 +01003285 if (!mbedtls_ssl_ciphersuite_cert_req_allowed(ciphersuite_info)) {
3286 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate verify"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003287 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003288 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02003289 }
3290
Gilles Peskine449bd832023-01-11 14:50:10 +01003291 if (ssl->handshake->client_auth == 0 ||
3292 mbedtls_ssl_own_cert(ssl) == NULL) {
3293 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate verify"));
Johan Pascala89ca862020-08-25 10:03:19 +02003294 ssl->state++;
Gilles Peskine449bd832023-01-11 14:50:10 +01003295 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003296 }
3297
Gilles Peskine449bd832023-01-11 14:50:10 +01003298 if (mbedtls_ssl_own_key(ssl) == NULL) {
3299 MBEDTLS_SSL_DEBUG_MSG(1, ("got no private key for certificate"));
3300 return MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED;
Paul Bakker5121ce52009-01-03 21:22:43 +00003301 }
3302
3303 /*
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003304 * Make a signature of the handshake digests
Paul Bakker5121ce52009-01-03 21:22:43 +00003305 */
Gilles Peskineeccd8882020-03-10 12:19:08 +01003306#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003307 if (ssl->handshake->ecrs_enabled) {
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003308 ssl->handshake->ecrs_state = ssl_ecrs_crt_vrfy_sign;
Gilles Peskine449bd832023-01-11 14:50:10 +01003309 }
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02003310
3311sign:
3312#endif
3313
Manuel Pégourié-Gonnardb8b07aa2023-02-06 00:34:21 +01003314 ret = ssl->handshake->calc_verify(ssl, hash, &hashlen);
3315 if (0 != ret) {
3316 MBEDTLS_SSL_DEBUG_RET(1, ("calc_verify"), ret);
3317 return ret;
3318 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003319
Ronald Cron90915f22022-03-07 11:11:36 +01003320 /*
3321 * digitally-signed struct {
3322 * opaque handshake_messages[handshake_messages_length];
3323 * };
3324 *
3325 * Taking shortcut here. We assume that the server always allows the
3326 * PRF Hash function and has sent it in the allowed signature
3327 * algorithms list received in the Certificate Request message.
3328 *
3329 * Until we encounter a server that does not, we will take this
3330 * shortcut.
3331 *
3332 * Reason: Otherwise we should have running hashes for SHA512 and
3333 * SHA224 in order to satisfy 'weird' needs from the server
3334 * side.
3335 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003336 if (ssl->handshake->ciphersuite_info->mac == MBEDTLS_MD_SHA384) {
Ronald Cron90915f22022-03-07 11:11:36 +01003337 md_alg = MBEDTLS_MD_SHA384;
3338 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;
Gilles Peskine449bd832023-01-11 14:50:10 +01003339 } else {
Ronald Cron90915f22022-03-07 11:11:36 +01003340 md_alg = MBEDTLS_MD_SHA256;
3341 ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;
Paul Bakker577e0062013-08-28 11:57:20 +02003342 }
Gilles Peskine449bd832023-01-11 14:50:10 +01003343 ssl->out_msg[5] = mbedtls_ssl_sig_from_pk(mbedtls_ssl_own_key(ssl));
Ronald Cron90915f22022-03-07 11:11:36 +01003344
3345 /* Info from md_alg will be used instead */
3346 hashlen = 0;
3347 offset = 2;
Paul Bakker1ef83d62012-04-11 12:09:53 +00003348
Gilles Peskineeccd8882020-03-10 12:19:08 +01003349#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003350 if (ssl->handshake->ecrs_enabled) {
Manuel Pégourié-Gonnard15d7df22017-08-17 14:33:31 +02003351 rs_ctx = &ssl->handshake->ecrs_ctx.pk;
Gilles Peskine449bd832023-01-11 14:50:10 +01003352 }
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02003353#endif
3354
Gilles Peskine449bd832023-01-11 14:50:10 +01003355 if ((ret = mbedtls_pk_sign_restartable(mbedtls_ssl_own_key(ssl),
3356 md_alg, hash_start, hashlen,
3357 ssl->out_msg + 6 + offset,
3358 out_buf_len - 6 - offset,
3359 &n,
3360 ssl->conf->f_rng, ssl->conf->p_rng, rs_ctx)) != 0) {
3361 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_sign", ret);
Gilles Peskineeccd8882020-03-10 12:19:08 +01003362#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
Gilles Peskine449bd832023-01-11 14:50:10 +01003363 if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS) {
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003364 ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
Gilles Peskine449bd832023-01-11 14:50:10 +01003365 }
Manuel Pégourié-Gonnard558da9c2018-06-13 12:02:12 +02003366#endif
Gilles Peskine449bd832023-01-11 14:50:10 +01003367 return ret;
Manuel Pégourié-Gonnard76c18a12013-08-20 16:50:40 +02003368 }
Paul Bakker926af752012-11-23 13:38:07 +01003369
Gilles Peskine449bd832023-01-11 14:50:10 +01003370 MBEDTLS_PUT_UINT16_BE(n, ssl->out_msg, offset + 4);
Paul Bakker5121ce52009-01-03 21:22:43 +00003371
Paul Bakker1ef83d62012-04-11 12:09:53 +00003372 ssl->out_msglen = 6 + n + offset;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003373 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
3374 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;
Paul Bakker5121ce52009-01-03 21:22:43 +00003375
3376 ssl->state++;
3377
Gilles Peskine449bd832023-01-11 14:50:10 +01003378 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
3379 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
3380 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003381 }
3382
Gilles Peskine449bd832023-01-11 14:50:10 +01003383 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00003384
Gilles Peskine449bd832023-01-11 14:50:10 +01003385 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003386}
Gilles Peskineeccd8882020-03-10 12:19:08 +01003387#endif /* MBEDTLS_KEY_EXCHANGE_CERT_REQ_ALLOWED_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00003388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003389#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnarda3115dc2022-06-17 10:52:54 +02003390MBEDTLS_CHECK_RETURN_CRITICAL
Gilles Peskine449bd832023-01-11 14:50:10 +01003391static int ssl_parse_new_session_ticket(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003392{
Janos Follath865b3eb2019-12-16 11:46:15 +00003393 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003394 uint32_t lifetime;
3395 size_t ticket_len;
3396 unsigned char *ticket;
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003397 const unsigned char *msg;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003398
Gilles Peskine449bd832023-01-11 14:50:10 +01003399 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse new session ticket"));
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003400
Gilles Peskine449bd832023-01-11 14:50:10 +01003401 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
3402 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
3403 return ret;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003404 }
3405
Gilles Peskine449bd832023-01-11 14:50:10 +01003406 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
3407 MBEDTLS_SSL_DEBUG_MSG(1, ("bad new session ticket message"));
Hanno Beckerb2fff6d2017-05-08 11:06:19 +01003408 mbedtls_ssl_send_alert_message(
3409 ssl,
3410 MBEDTLS_SSL_ALERT_LEVEL_FATAL,
Gilles Peskine449bd832023-01-11 14:50:10 +01003411 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
3412 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003413 }
3414
3415 /*
3416 * struct {
3417 * uint32 ticket_lifetime_hint;
3418 * opaque ticket<0..2^16-1>;
3419 * } NewSessionTicket;
3420 *
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003421 * 0 . 3 ticket_lifetime_hint
3422 * 4 . 5 ticket_len (n)
3423 * 6 . 5+n ticket content
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003424 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003425 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||
3426 ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len(ssl)) {
3427 MBEDTLS_SSL_DEBUG_MSG(1, ("bad new session ticket message"));
3428 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3429 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
3430 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003431 }
3432
Gilles Peskine449bd832023-01-11 14:50:10 +01003433 msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003434
Gilles Peskine449bd832023-01-11 14:50:10 +01003435 lifetime = (((uint32_t) msg[0]) << 24) | (msg[1] << 16) |
3436 (msg[2] << 8) | (msg[3]);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003437
Gilles Peskine449bd832023-01-11 14:50:10 +01003438 ticket_len = (msg[4] << 8) | (msg[5]);
Manuel Pégourié-Gonnard000d5ae2014-09-10 21:52:12 +02003439
Gilles Peskine449bd832023-01-11 14:50:10 +01003440 if (ticket_len + 6 + mbedtls_ssl_hs_hdr_len(ssl) != ssl->in_hslen) {
3441 MBEDTLS_SSL_DEBUG_MSG(1, ("bad new session ticket message"));
3442 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3443 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
3444 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003445 }
3446
Gilles Peskine449bd832023-01-11 14:50:10 +01003447 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket length: %" MBEDTLS_PRINTF_SIZET, ticket_len));
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003448
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02003449 /* We're not waiting for a NewSessionTicket message any more */
3450 ssl->handshake->new_session_ticket = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003451 ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;
Manuel Pégourié-Gonnard7cd59242013-08-02 13:24:41 +02003452
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003453 /*
3454 * Zero-length ticket means the server changed his mind and doesn't want
3455 * to send a ticket after all, so just forget it
3456 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003457 if (ticket_len == 0) {
3458 return 0;
3459 }
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003460
Gilles Peskine449bd832023-01-11 14:50:10 +01003461 if (ssl->session != NULL && ssl->session->ticket != NULL) {
Tom Cosgroveca8c61b2023-07-17 15:17:40 +01003462 mbedtls_zeroize_and_free(ssl->session->ticket,
Gilles Peskine449bd832023-01-11 14:50:10 +01003463 ssl->session->ticket_len);
Hanno Beckerb2964cb2019-01-30 14:46:35 +00003464 ssl->session->ticket = NULL;
3465 ssl->session->ticket_len = 0;
3466 }
3467
Tom Cosgroveca8c61b2023-07-17 15:17:40 +01003468 mbedtls_zeroize_and_free(ssl->session_negotiate->ticket,
Gilles Peskine449bd832023-01-11 14:50:10 +01003469 ssl->session_negotiate->ticket_len);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003470 ssl->session_negotiate->ticket = NULL;
3471 ssl->session_negotiate->ticket_len = 0;
3472
Gilles Peskine449bd832023-01-11 14:50:10 +01003473 if ((ticket = mbedtls_calloc(1, ticket_len)) == NULL) {
3474 MBEDTLS_SSL_DEBUG_MSG(1, ("ticket alloc failed"));
3475 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
3476 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
3477 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003478 }
3479
Gilles Peskine449bd832023-01-11 14:50:10 +01003480 memcpy(ticket, msg + 6, ticket_len);
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003481
3482 ssl->session_negotiate->ticket = ticket;
3483 ssl->session_negotiate->ticket_len = ticket_len;
3484 ssl->session_negotiate->ticket_lifetime = lifetime;
3485
3486 /*
3487 * RFC 5077 section 3.4:
3488 * "If the client receives a session ticket from the server, then it
3489 * discards any Session ID that was sent in the ServerHello."
3490 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003491 MBEDTLS_SSL_DEBUG_MSG(3, ("ticket in use, discarding session id"));
Manuel Pégourié-Gonnard12ad7982015-06-18 15:50:37 +02003492 ssl->session_negotiate->id_len = 0;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003493
Gilles Peskine449bd832023-01-11 14:50:10 +01003494 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse new session ticket"));
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003495
Gilles Peskine449bd832023-01-11 14:50:10 +01003496 return 0;
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003497}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003498#endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnarda5cc6022013-07-31 12:58:16 +02003499
Paul Bakker5121ce52009-01-03 21:22:43 +00003500/*
Paul Bakker1961b702013-01-25 14:49:24 +01003501 * SSL handshake -- client side -- single step
Paul Bakker5121ce52009-01-03 21:22:43 +00003502 */
Gilles Peskine449bd832023-01-11 14:50:10 +01003503int mbedtls_ssl_handshake_client_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003504{
3505 int ret = 0;
3506
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003507 /* Change state now, so that it is right in mbedtls_ssl_read_record(), used
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003508 * by DTLS for dropping out-of-sequence ChangeCipherSpec records */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003509#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003510 if (ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&
3511 ssl->handshake->new_session_ticket != 0) {
Jerry Yua357cf42022-07-12 05:36:45 +00003512 ssl->state = MBEDTLS_SSL_NEW_SESSION_TICKET;
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003513 }
3514#endif
3515
Gilles Peskine449bd832023-01-11 14:50:10 +01003516 switch (ssl->state) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003517 case MBEDTLS_SSL_HELLO_REQUEST:
3518 ssl->state = MBEDTLS_SSL_CLIENT_HELLO;
Paul Bakker5121ce52009-01-03 21:22:43 +00003519 break;
3520
Gilles Peskine449bd832023-01-11 14:50:10 +01003521 /*
3522 * ==> ClientHello
3523 */
3524 case MBEDTLS_SSL_CLIENT_HELLO:
3525 ret = mbedtls_ssl_write_client_hello(ssl);
3526 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003527
Gilles Peskine449bd832023-01-11 14:50:10 +01003528 /*
3529 * <== ServerHello
3530 * Certificate
3531 * ( ServerKeyExchange )
3532 * ( CertificateRequest )
3533 * ServerHelloDone
3534 */
3535 case MBEDTLS_SSL_SERVER_HELLO:
3536 ret = ssl_parse_server_hello(ssl);
3537 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003538
Gilles Peskine449bd832023-01-11 14:50:10 +01003539 case MBEDTLS_SSL_SERVER_CERTIFICATE:
3540 ret = mbedtls_ssl_parse_certificate(ssl);
3541 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003542
Gilles Peskine449bd832023-01-11 14:50:10 +01003543 case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:
3544 ret = ssl_parse_server_key_exchange(ssl);
3545 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003546
Gilles Peskine449bd832023-01-11 14:50:10 +01003547 case MBEDTLS_SSL_CERTIFICATE_REQUEST:
3548 ret = ssl_parse_certificate_request(ssl);
3549 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003550
Gilles Peskine449bd832023-01-11 14:50:10 +01003551 case MBEDTLS_SSL_SERVER_HELLO_DONE:
3552 ret = ssl_parse_server_hello_done(ssl);
3553 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003554
Gilles Peskine449bd832023-01-11 14:50:10 +01003555 /*
3556 * ==> ( Certificate/Alert )
3557 * ClientKeyExchange
3558 * ( CertificateVerify )
3559 * ChangeCipherSpec
3560 * Finished
3561 */
3562 case MBEDTLS_SSL_CLIENT_CERTIFICATE:
3563 ret = mbedtls_ssl_write_certificate(ssl);
3564 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003565
Gilles Peskine449bd832023-01-11 14:50:10 +01003566 case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:
3567 ret = ssl_write_client_key_exchange(ssl);
3568 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003569
Gilles Peskine449bd832023-01-11 14:50:10 +01003570 case MBEDTLS_SSL_CERTIFICATE_VERIFY:
3571 ret = ssl_write_certificate_verify(ssl);
3572 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003573
Gilles Peskine449bd832023-01-11 14:50:10 +01003574 case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:
3575 ret = mbedtls_ssl_write_change_cipher_spec(ssl);
3576 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003577
Gilles Peskine449bd832023-01-11 14:50:10 +01003578 case MBEDTLS_SSL_CLIENT_FINISHED:
3579 ret = mbedtls_ssl_write_finished(ssl);
3580 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003581
Gilles Peskine449bd832023-01-11 14:50:10 +01003582 /*
3583 * <== ( NewSessionTicket )
3584 * ChangeCipherSpec
3585 * Finished
3586 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003587#if defined(MBEDTLS_SSL_SESSION_TICKETS)
Gilles Peskine449bd832023-01-11 14:50:10 +01003588 case MBEDTLS_SSL_NEW_SESSION_TICKET:
3589 ret = ssl_parse_new_session_ticket(ssl);
3590 break;
Paul Bakkera503a632013-08-14 13:48:06 +02003591#endif
Manuel Pégourié-Gonnardcd32a502014-09-20 13:54:12 +02003592
Gilles Peskine449bd832023-01-11 14:50:10 +01003593 case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:
3594 ret = mbedtls_ssl_parse_change_cipher_spec(ssl);
3595 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003596
Gilles Peskine449bd832023-01-11 14:50:10 +01003597 case MBEDTLS_SSL_SERVER_FINISHED:
3598 ret = mbedtls_ssl_parse_finished(ssl);
3599 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003600
Gilles Peskine449bd832023-01-11 14:50:10 +01003601 case MBEDTLS_SSL_FLUSH_BUFFERS:
3602 MBEDTLS_SSL_DEBUG_MSG(2, ("handshake: done"));
3603 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
3604 break;
Paul Bakker5121ce52009-01-03 21:22:43 +00003605
Gilles Peskine449bd832023-01-11 14:50:10 +01003606 case MBEDTLS_SSL_HANDSHAKE_WRAPUP:
3607 mbedtls_ssl_handshake_wrapup(ssl);
3608 break;
Paul Bakker48916f92012-09-16 19:57:18 +00003609
Gilles Peskine449bd832023-01-11 14:50:10 +01003610 default:
3611 MBEDTLS_SSL_DEBUG_MSG(1, ("invalid state %d", ssl->state));
3612 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3613 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003614
Gilles Peskine449bd832023-01-11 14:50:10 +01003615 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003616}
Jerry Yuc5aef882021-12-23 20:15:02 +08003617
Jerry Yufb4b6472022-01-27 15:03:26 +08003618#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_PROTO_TLS1_2 */