blob: 606ff63ccec7c848d6436b1403cda78775dc49cf [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002 * TLS shared 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/*
Paul Bakker5121ce52009-01-03 21:22:43 +000020 * http://www.ietf.org/rfc/rfc2246.txt
21 * http://www.ietf.org/rfc/rfc4346.txt
22 */
23
Gilles Peskinedb09ef62020-06-03 01:43:33 +020024#include "common.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000025
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020026#if defined(MBEDTLS_SSL_TLS_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000027
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020028# if defined(MBEDTLS_PLATFORM_C)
29# include "mbedtls/platform.h"
30# else
31# include <stdlib.h>
32# define mbedtls_calloc calloc
33# define mbedtls_free free
34# endif
SimonBd5800b72016-04-26 07:43:27 +010035
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020036# include "mbedtls/ssl.h"
37# include "ssl_misc.h"
38# include "mbedtls/debug.h"
39# include "mbedtls/error.h"
40# include "mbedtls/platform_util.h"
41# include "mbedtls/version.h"
Paul Bakker0be444a2013-08-27 21:55:01 +020042
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020043# include <string.h>
Rich Evans00ab4702015-02-06 13:43:58 +000044
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020045# if defined(MBEDTLS_USE_PSA_CRYPTO)
46# include "mbedtls/psa_util.h"
47# include "psa/crypto.h"
48# endif
Andrzej Kurekd6db9be2019-01-10 05:27:10 -050049
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020050# if defined(MBEDTLS_X509_CRT_PARSE_C)
51# include "mbedtls/oid.h"
52# endif
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +020053
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020054# if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker2b1e3542018-08-06 11:19:13 +010055
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020056# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Beckerf8542cf2019-04-09 15:22:03 +010057/* Top-level Connection ID API */
58
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020059int mbedtls_ssl_conf_cid(mbedtls_ssl_config *conf,
60 size_t len,
61 int ignore_other_cid)
Hanno Beckerad4a1372019-05-03 13:06:44 +010062{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020063 if (len > MBEDTLS_SSL_CID_IN_LEN_MAX)
64 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Beckerad4a1372019-05-03 13:06:44 +010065
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020066 if (ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_FAIL &&
67 ignore_other_cid != MBEDTLS_SSL_UNEXPECTED_CID_IGNORE) {
68 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Becker611ac772019-05-14 11:45:26 +010069 }
70
71 conf->ignore_unexpected_cid = ignore_other_cid;
Hanno Beckerad4a1372019-05-03 13:06:44 +010072 conf->cid_len = len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020073 return 0;
Hanno Beckerad4a1372019-05-03 13:06:44 +010074}
75
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020076int mbedtls_ssl_set_cid(mbedtls_ssl_context *ssl,
77 int enable,
78 unsigned char const *own_cid,
79 size_t own_cid_len)
Hanno Beckerf8542cf2019-04-09 15:22:03 +010080{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020081 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM)
82 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Becker76a79ab2019-05-03 14:38:32 +010083
Hanno Beckerca092242019-04-25 16:01:49 +010084 ssl->negotiate_cid = enable;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020085 if (enable == MBEDTLS_SSL_CID_DISABLED) {
86 MBEDTLS_SSL_DEBUG_MSG(3, ("Disable use of CID extension."));
87 return 0;
Hanno Beckerca092242019-04-25 16:01:49 +010088 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020089 MBEDTLS_SSL_DEBUG_MSG(3, ("Enable use of CID extension."));
90 MBEDTLS_SSL_DEBUG_BUF(3, "Own CID", own_cid, own_cid_len);
Hanno Beckerca092242019-04-25 16:01:49 +010091
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020092 if (own_cid_len != ssl->conf->cid_len) {
93 MBEDTLS_SSL_DEBUG_MSG(
94 3, ("CID length %u does not match CID length %u in config",
95 (unsigned)own_cid_len, (unsigned)ssl->conf->cid_len));
96 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Beckerca092242019-04-25 16:01:49 +010097 }
98
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020099 memcpy(ssl->own_cid, own_cid, own_cid_len);
Hanno Beckerb7ee0cf2019-04-30 14:07:31 +0100100 /* Truncation is not an issue here because
101 * MBEDTLS_SSL_CID_IN_LEN_MAX at most 255. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200102 ssl->own_cid_len = (uint8_t)own_cid_len;
Hanno Beckerca092242019-04-25 16:01:49 +0100103
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200104 return 0;
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100105}
106
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200107int mbedtls_ssl_get_peer_cid(mbedtls_ssl_context *ssl,
108 int *enabled,
109 unsigned char peer_cid[MBEDTLS_SSL_CID_OUT_LEN_MAX],
110 size_t *peer_cid_len)
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100111{
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100112 *enabled = MBEDTLS_SSL_CID_DISABLED;
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100113
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200114 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
115 ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) {
116 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Becker76a79ab2019-05-03 14:38:32 +0100117 }
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100118
Hanno Beckerc5f24222019-05-03 12:54:52 +0100119 /* We report MBEDTLS_SSL_CID_DISABLED in case the CID extensions
120 * were used, but client and server requested the empty CID.
121 * This is indistinguishable from not using the CID extension
122 * in the first place. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200123 if (ssl->transform_in->in_cid_len == 0 &&
124 ssl->transform_in->out_cid_len == 0) {
125 return 0;
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100126 }
127
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200128 if (peer_cid_len != NULL) {
Hanno Becker615ef172019-05-22 16:50:35 +0100129 *peer_cid_len = ssl->transform_in->out_cid_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200130 if (peer_cid != NULL) {
131 memcpy(peer_cid, ssl->transform_in->out_cid,
132 ssl->transform_in->out_cid_len);
Hanno Becker615ef172019-05-22 16:50:35 +0100133 }
134 }
Hanno Beckerb1f89cd2019-04-26 17:08:02 +0100135
136 *enabled = MBEDTLS_SSL_CID_ENABLED;
137
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200138 return 0;
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100139}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200140# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Beckerf8542cf2019-04-09 15:22:03 +0100141
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200142# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard0ac247f2014-09-30 22:21:31 +0200143
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200144# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200145/*
146 * Convert max_fragment_length codes to length.
147 * RFC 6066 says:
148 * enum{
149 * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)
150 * } MaxFragmentLength;
151 * and we add 0 -> extension unused
152 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200153static unsigned int ssl_mfl_code_to_length(int mfl)
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200154{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200155 switch (mfl) {
156 case MBEDTLS_SSL_MAX_FRAG_LEN_NONE:
157 return MBEDTLS_TLS_EXT_ADV_CONTENT_LEN;
158 case MBEDTLS_SSL_MAX_FRAG_LEN_512:
159 return 512;
160 case MBEDTLS_SSL_MAX_FRAG_LEN_1024:
161 return 1024;
162 case MBEDTLS_SSL_MAX_FRAG_LEN_2048:
163 return 2048;
164 case MBEDTLS_SSL_MAX_FRAG_LEN_4096:
165 return 4096;
166 default:
167 return MBEDTLS_TLS_EXT_ADV_CONTENT_LEN;
Angus Grattond8213d02016-05-25 20:56:48 +1000168 }
169}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200170# endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard581e6b62013-07-18 12:32:27 +0200171
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200172int mbedtls_ssl_session_copy(mbedtls_ssl_session *dst,
173 const mbedtls_ssl_session *src)
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200174{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200175 mbedtls_ssl_session_free(dst);
176 memcpy(dst, src, sizeof(mbedtls_ssl_session));
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200177
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200178# if defined(MBEDTLS_X509_CRT_PARSE_C)
Hanno Becker6d1986e2019-02-07 12:27:42 +0000179
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200180# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
181 if (src->peer_cert != NULL) {
Janos Follath865b3eb2019-12-16 11:46:15 +0000182 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker2292d1f2013-09-15 17:06:49 +0200183
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200184 dst->peer_cert = mbedtls_calloc(1, sizeof(mbedtls_x509_crt));
185 if (dst->peer_cert == NULL)
186 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200187
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200188 mbedtls_x509_crt_init(dst->peer_cert);
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200189
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200190 if ((ret = mbedtls_x509_crt_parse_der(dst->peer_cert,
191 src->peer_cert->raw.p,
192 src->peer_cert->raw.len)) != 0) {
193 mbedtls_free(dst->peer_cert);
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200194 dst->peer_cert = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200195 return ret;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200196 }
197 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200198# else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
199 if (src->peer_cert_digest != NULL) {
200 dst->peer_cert_digest = mbedtls_calloc(1, src->peer_cert_digest_len);
201 if (dst->peer_cert_digest == NULL)
202 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Hanno Becker9198ad12019-02-05 17:00:50 +0000203
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200204 memcpy(dst->peer_cert_digest, src->peer_cert_digest,
205 src->peer_cert_digest_len);
Hanno Becker9198ad12019-02-05 17:00:50 +0000206 dst->peer_cert_digest_type = src->peer_cert_digest_type;
Hanno Beckeraccc5992019-02-25 10:06:59 +0000207 dst->peer_cert_digest_len = src->peer_cert_digest_len;
Hanno Becker9198ad12019-02-05 17:00:50 +0000208 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200209# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker9198ad12019-02-05 17:00:50 +0000210
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200211# endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200212
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200213# if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
214 if (src->ticket != NULL) {
215 dst->ticket = mbedtls_calloc(1, src->ticket_len);
216 if (dst->ticket == NULL)
217 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200218
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200219 memcpy(dst->ticket, src->ticket, src->ticket_len);
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200220 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200221# endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200222
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200223 return 0;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +0200224}
225
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200226# if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
227static int
228resize_buffer(unsigned char **buffer, size_t len_new, size_t *len_old)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500229{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200230 unsigned char *resized_buffer = mbedtls_calloc(1, len_new);
231 if (resized_buffer == NULL)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500232 return -1;
233
234 /* We want to copy len_new bytes when downsizing the buffer, and
235 * len_old bytes when upsizing, so we choose the smaller of two sizes,
236 * to fit one buffer into another. Size checks, ensuring that no data is
237 * lost, are done outside of this function. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200238 memcpy(resized_buffer, *buffer, (len_new < *len_old) ? len_new : *len_old);
239 mbedtls_platform_zeroize(*buffer, *len_old);
240 mbedtls_free(*buffer);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500241
242 *buffer = resized_buffer;
243 *len_old = len_new;
244
245 return 0;
246}
Andrzej Kurek4a063792020-10-21 15:08:44 +0200247
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200248static void handle_buffer_resizing(mbedtls_ssl_context *ssl,
249 int downsizing,
250 size_t in_buf_new_len,
251 size_t out_buf_new_len)
Andrzej Kurek4a063792020-10-21 15:08:44 +0200252{
253 int modified = 0;
254 size_t written_in = 0, iv_offset_in = 0, len_offset_in = 0;
255 size_t written_out = 0, iv_offset_out = 0, len_offset_out = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200256 if (ssl->in_buf != NULL) {
Andrzej Kurek4a063792020-10-21 15:08:44 +0200257 written_in = ssl->in_msg - ssl->in_buf;
258 iv_offset_in = ssl->in_iv - ssl->in_buf;
259 len_offset_in = ssl->in_len - ssl->in_buf;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200260 if (downsizing ? ssl->in_buf_len > in_buf_new_len &&
261 ssl->in_left < in_buf_new_len :
262 ssl->in_buf_len < in_buf_new_len) {
263 if (resize_buffer(&ssl->in_buf, in_buf_new_len, &ssl->in_buf_len) !=
264 0) {
265 MBEDTLS_SSL_DEBUG_MSG(
266 1, ("input buffer resizing failed - out of memory"));
267 } else {
268 MBEDTLS_SSL_DEBUG_MSG(
269 2, ("Reallocating in_buf to %" MBEDTLS_PRINTF_SIZET,
270 in_buf_new_len));
Andrzej Kurek4a063792020-10-21 15:08:44 +0200271 modified = 1;
272 }
273 }
274 }
275
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200276 if (ssl->out_buf != NULL) {
Andrzej Kurek4a063792020-10-21 15:08:44 +0200277 written_out = ssl->out_msg - ssl->out_buf;
278 iv_offset_out = ssl->out_iv - ssl->out_buf;
279 len_offset_out = ssl->out_len - ssl->out_buf;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200280 if (downsizing ? ssl->out_buf_len > out_buf_new_len &&
281 ssl->out_left < out_buf_new_len :
282 ssl->out_buf_len < out_buf_new_len) {
283 if (resize_buffer(&ssl->out_buf, out_buf_new_len,
284 &ssl->out_buf_len) != 0) {
285 MBEDTLS_SSL_DEBUG_MSG(
286 1, ("output buffer resizing failed - out of memory"));
287 } else {
288 MBEDTLS_SSL_DEBUG_MSG(
289 2, ("Reallocating out_buf to %" MBEDTLS_PRINTF_SIZET,
290 out_buf_new_len));
Andrzej Kurek4a063792020-10-21 15:08:44 +0200291 modified = 1;
292 }
293 }
294 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200295 if (modified) {
Andrzej Kurek4a063792020-10-21 15:08:44 +0200296 /* Update pointers here to avoid doing it twice. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200297 mbedtls_ssl_reset_in_out_pointers(ssl);
Andrzej Kurek4a063792020-10-21 15:08:44 +0200298 /* Fields below might not be properly updated with record
299 * splitting or with CID, so they are manually updated here. */
300 ssl->out_msg = ssl->out_buf + written_out;
301 ssl->out_len = ssl->out_buf + len_offset_out;
302 ssl->out_iv = ssl->out_buf + iv_offset_out;
303
304 ssl->in_msg = ssl->in_buf + written_in;
305 ssl->in_len = ssl->in_buf + len_offset_in;
306 ssl->in_iv = ssl->in_buf + iv_offset_in;
307 }
308}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200309# endif /* MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH */
Andrzej Kurek0afa2a12020-03-03 10:39:58 -0500310
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200311# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
312# if defined(MBEDTLS_USE_PSA_CRYPTO)
k-stachowiak81053a52019-08-17 10:30:28 +0200313
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200314static psa_status_t
315setup_psa_key_derivation(psa_key_derivation_operation_t *derivation,
316 psa_key_id_t key,
317 psa_algorithm_t alg,
318 const unsigned char *seed,
319 size_t seed_length,
320 const unsigned char *label,
321 size_t label_length,
322 size_t capacity)
k-stachowiak81053a52019-08-17 10:30:28 +0200323{
324 psa_status_t status;
325
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200326 status = psa_key_derivation_setup(derivation, alg);
327 if (status != PSA_SUCCESS)
328 return status;
k-stachowiak81053a52019-08-17 10:30:28 +0200329
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200330 if (PSA_ALG_IS_TLS12_PRF(alg) || PSA_ALG_IS_TLS12_PSK_TO_MS(alg)) {
331 status = psa_key_derivation_input_bytes(
332 derivation, PSA_KEY_DERIVATION_INPUT_SEED, seed, seed_length);
333 if (status != PSA_SUCCESS)
334 return status;
k-stachowiak81053a52019-08-17 10:30:28 +0200335
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200336 if (mbedtls_svc_key_id_is_null(key)) {
Gilles Peskine311f54d2019-09-23 18:19:22 +0200337 status = psa_key_derivation_input_bytes(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200338 derivation, PSA_KEY_DERIVATION_INPUT_SECRET, NULL, 0);
339 } else {
Gilles Peskine311f54d2019-09-23 18:19:22 +0200340 status = psa_key_derivation_input_key(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200341 derivation, PSA_KEY_DERIVATION_INPUT_SECRET, key);
Gilles Peskine311f54d2019-09-23 18:19:22 +0200342 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200343 if (status != PSA_SUCCESS)
344 return status;
k-stachowiak81053a52019-08-17 10:30:28 +0200345
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200346 status = psa_key_derivation_input_bytes(
347 derivation, PSA_KEY_DERIVATION_INPUT_LABEL, label, label_length);
348 if (status != PSA_SUCCESS)
349 return status;
350 } else {
351 return PSA_ERROR_NOT_SUPPORTED;
k-stachowiak81053a52019-08-17 10:30:28 +0200352 }
353
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200354 status = psa_key_derivation_set_capacity(derivation, capacity);
355 if (status != PSA_SUCCESS)
356 return status;
k-stachowiak81053a52019-08-17 10:30:28 +0200357
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200358 return PSA_SUCCESS;
k-stachowiak81053a52019-08-17 10:30:28 +0200359}
360
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200361static int tls_prf_generic(mbedtls_md_type_t md_type,
362 const unsigned char *secret,
363 size_t slen,
364 const char *label,
365 const unsigned char *random,
366 size_t rlen,
367 unsigned char *dstbuf,
368 size_t dlen)
Andrzej Kurekc929a822019-01-14 03:51:11 -0500369{
370 psa_status_t status;
371 psa_algorithm_t alg;
Ronald Croncf56a0a2020-08-04 09:51:30 +0200372 psa_key_id_t master_key = MBEDTLS_SVC_KEY_ID_INIT;
Janos Follathda6ac012019-08-16 13:47:29 +0100373 psa_key_derivation_operation_t derivation =
Janos Follath8dee8772019-07-30 12:53:32 +0100374 PSA_KEY_DERIVATION_OPERATION_INIT;
Andrzej Kurekc929a822019-01-14 03:51:11 -0500375
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200376 if (md_type == MBEDTLS_MD_SHA384)
Andrzej Kurekc929a822019-01-14 03:51:11 -0500377 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_384);
378 else
379 alg = PSA_ALG_TLS12_PRF(PSA_ALG_SHA_256);
380
Gilles Peskine311f54d2019-09-23 18:19:22 +0200381 /* Normally a "secret" should be long enough to be impossible to
382 * find by brute force, and in particular should not be empty. But
383 * this PRF is also used to derive an IV, in particular in EAP-TLS,
384 * and for this use case it makes sense to have a 0-length "secret".
385 * Since the key API doesn't allow importing a key of length 0,
Ronald Croncf56a0a2020-08-04 09:51:30 +0200386 * keep master_key=0, which setup_psa_key_derivation() understands
Gilles Peskine311f54d2019-09-23 18:19:22 +0200387 * to mean a 0-length "secret" input. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200388 if (slen != 0) {
Gilles Peskine311f54d2019-09-23 18:19:22 +0200389 psa_key_attributes_t key_attributes = psa_key_attributes_init();
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200390 psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
391 psa_set_key_algorithm(&key_attributes, alg);
392 psa_set_key_type(&key_attributes, PSA_KEY_TYPE_DERIVE);
Andrzej Kurekc929a822019-01-14 03:51:11 -0500393
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200394 status = psa_import_key(&key_attributes, secret, slen, &master_key);
395 if (status != PSA_SUCCESS)
396 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
Gilles Peskine311f54d2019-09-23 18:19:22 +0200397 }
Andrzej Kurekc929a822019-01-14 03:51:11 -0500398
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200399 status = setup_psa_key_derivation(&derivation, master_key, alg, random,
400 rlen, (unsigned char const *)label,
401 (size_t)strlen(label), dlen);
402 if (status != PSA_SUCCESS) {
403 psa_key_derivation_abort(&derivation);
404 psa_destroy_key(master_key);
405 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
Andrzej Kurekc929a822019-01-14 03:51:11 -0500406 }
407
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200408 status = psa_key_derivation_output_bytes(&derivation, dstbuf, dlen);
409 if (status != PSA_SUCCESS) {
410 psa_key_derivation_abort(&derivation);
411 psa_destroy_key(master_key);
412 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
Andrzej Kurekc929a822019-01-14 03:51:11 -0500413 }
414
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200415 status = psa_key_derivation_abort(&derivation);
416 if (status != PSA_SUCCESS) {
417 psa_destroy_key(master_key);
418 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
Andrzej Kurek70737ca2019-01-14 05:37:13 -0500419 }
Andrzej Kurekc929a822019-01-14 03:51:11 -0500420
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200421 if (!mbedtls_svc_key_id_is_null(master_key))
422 status = psa_destroy_key(master_key);
423 if (status != PSA_SUCCESS)
424 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
Andrzej Kurekc929a822019-01-14 03:51:11 -0500425
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200426 return 0;
Andrzej Kurekc929a822019-01-14 03:51:11 -0500427}
428
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200429# else /* MBEDTLS_USE_PSA_CRYPTO */
Andrzej Kurekc929a822019-01-14 03:51:11 -0500430
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200431static int tls_prf_generic(mbedtls_md_type_t md_type,
432 const unsigned char *secret,
433 size_t slen,
434 const char *label,
435 const unsigned char *random,
436 size_t rlen,
437 unsigned char *dstbuf,
438 size_t dlen)
Paul Bakker1ef83d62012-04-11 12:09:53 +0000439{
440 size_t nb;
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100441 size_t i, j, k, md_len;
Ron Eldor3b350852019-05-07 18:31:49 +0300442 unsigned char *tmp;
443 size_t tmp_len = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200444 unsigned char h_i[MBEDTLS_MD_MAX_SIZE];
445 const mbedtls_md_info_t *md_info;
446 mbedtls_md_context_t md_ctx;
Janos Follath865b3eb2019-12-16 11:46:15 +0000447 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100448
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200449 mbedtls_md_init(&md_ctx);
Paul Bakker1ef83d62012-04-11 12:09:53 +0000450
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200451 if ((md_info = mbedtls_md_info_from_type(md_type)) == NULL)
452 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100453
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200454 md_len = mbedtls_md_get_size(md_info);
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100455
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200456 tmp_len = md_len + strlen(label) + rlen;
457 tmp = mbedtls_calloc(1, tmp_len);
458 if (tmp == NULL) {
Ron Eldor3b350852019-05-07 18:31:49 +0300459 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
460 goto exit;
461 }
Paul Bakker1ef83d62012-04-11 12:09:53 +0000462
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200463 nb = strlen(label);
464 memcpy(tmp + md_len, label, nb);
465 memcpy(tmp + md_len + nb, random, rlen);
Paul Bakker1ef83d62012-04-11 12:09:53 +0000466 nb += rlen;
467
468 /*
469 * Compute P_<hash>(secret, label + random)[0..dlen]
470 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200471 if ((ret = mbedtls_md_setup(&md_ctx, md_info, 1)) != 0)
Ron Eldor3b350852019-05-07 18:31:49 +0300472 goto exit;
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100473
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200474 mbedtls_md_hmac_starts(&md_ctx, secret, slen);
475 mbedtls_md_hmac_update(&md_ctx, tmp + md_len, nb);
476 mbedtls_md_hmac_finish(&md_ctx, tmp);
Manuel Pégourié-Gonnard7da726b2015-03-24 18:08:19 +0100477
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200478 for (i = 0; i < dlen; i += md_len) {
479 mbedtls_md_hmac_reset(&md_ctx);
480 mbedtls_md_hmac_update(&md_ctx, tmp, md_len + nb);
481 mbedtls_md_hmac_finish(&md_ctx, h_i);
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100482
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200483 mbedtls_md_hmac_reset(&md_ctx);
484 mbedtls_md_hmac_update(&md_ctx, tmp, md_len);
485 mbedtls_md_hmac_finish(&md_ctx, tmp);
Paul Bakker1ef83d62012-04-11 12:09:53 +0000486
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200487 k = (i + md_len > dlen) ? dlen % md_len : md_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000488
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200489 for (j = 0; j < k; j++)
490 dstbuf[i + j] = h_i[j];
Paul Bakker1ef83d62012-04-11 12:09:53 +0000491 }
492
Ron Eldor3b350852019-05-07 18:31:49 +0300493exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200494 mbedtls_md_free(&md_ctx);
Manuel Pégourié-Gonnardb7fcca32015-03-26 11:41:28 +0100495
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200496 mbedtls_platform_zeroize(tmp, tmp_len);
497 mbedtls_platform_zeroize(h_i, sizeof(h_i));
Paul Bakker1ef83d62012-04-11 12:09:53 +0000498
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200499 mbedtls_free(tmp);
Ron Eldor3b350852019-05-07 18:31:49 +0300500
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200501 return ret;
Paul Bakker1ef83d62012-04-11 12:09:53 +0000502}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200503# endif /* MBEDTLS_USE_PSA_CRYPTO */
504# if defined(MBEDTLS_SHA256_C)
505static int tls_prf_sha256(const unsigned char *secret,
506 size_t slen,
507 const char *label,
508 const unsigned char *random,
509 size_t rlen,
510 unsigned char *dstbuf,
511 size_t dlen)
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100512{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200513 return (tls_prf_generic(MBEDTLS_MD_SHA256, secret, slen, label, random,
514 rlen, dstbuf, dlen));
Manuel Pégourié-Gonnard6890c6b2015-03-26 11:11:49 +0100515}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200516# endif /* MBEDTLS_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000517
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200518# if defined(MBEDTLS_SHA384_C)
519static int tls_prf_sha384(const unsigned char *secret,
520 size_t slen,
521 const char *label,
522 const unsigned char *random,
523 size_t rlen,
524 unsigned char *dstbuf,
525 size_t dlen)
Paul Bakkerca4ab492012-04-18 14:23:57 +0000526{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200527 return (tls_prf_generic(MBEDTLS_MD_SHA384, secret, slen, label, random,
528 rlen, dstbuf, dlen));
Paul Bakkerca4ab492012-04-18 14:23:57 +0000529}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200530# endif /* MBEDTLS_SHA384_C */
531# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +0000532
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200533static void
534ssl_update_checksum_start(mbedtls_ssl_context *, const unsigned char *, size_t);
Paul Bakkerd2f068e2013-08-27 21:19:20 +0200535
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200536# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
537# if defined(MBEDTLS_SHA256_C)
538static void ssl_update_checksum_sha256(mbedtls_ssl_context *,
539 const unsigned char *,
540 size_t);
541static void ssl_calc_verify_tls_sha256(const mbedtls_ssl_context *,
542 unsigned char *,
543 size_t *);
544static void
545ssl_calc_finished_tls_sha256(mbedtls_ssl_context *, unsigned char *, int);
546# endif
Paul Bakker769075d2012-11-24 11:26:46 +0100547
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200548# if defined(MBEDTLS_SHA384_C)
549static void ssl_update_checksum_sha384(mbedtls_ssl_context *,
550 const unsigned char *,
551 size_t);
552static void ssl_calc_verify_tls_sha384(const mbedtls_ssl_context *,
553 unsigned char *,
554 size_t *);
555static void
556ssl_calc_finished_tls_sha384(mbedtls_ssl_context *, unsigned char *, int);
557# endif
558# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker1ef83d62012-04-11 12:09:53 +0000559
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200560# if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) && \
561 defined(MBEDTLS_USE_PSA_CRYPTO)
562static int ssl_use_opaque_psk(mbedtls_ssl_context const *ssl)
Hanno Becker7d0a5692018-10-23 15:26:22 +0100563{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200564 if (ssl->conf->f_psk != NULL) {
Hanno Becker7d0a5692018-10-23 15:26:22 +0100565 /* If we've used a callback to select the PSK,
566 * the static configuration is irrelevant. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200567 if (!mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque))
568 return 1;
Hanno Becker7d0a5692018-10-23 15:26:22 +0100569
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200570 return 0;
Hanno Becker7d0a5692018-10-23 15:26:22 +0100571 }
572
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200573 if (!mbedtls_svc_key_id_is_null(ssl->conf->psk_opaque))
574 return 1;
Hanno Becker7d0a5692018-10-23 15:26:22 +0100575
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200576 return 0;
Hanno Becker7d0a5692018-10-23 15:26:22 +0100577}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200578# endif /* MBEDTLS_USE_PSA_CRYPTO && \
579 MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
Hanno Becker7d0a5692018-10-23 15:26:22 +0100580
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200581# if defined(MBEDTLS_SSL_EXPORT_KEYS)
582static mbedtls_tls_prf_types tls_prf_get_type(mbedtls_ssl_tls_prf_cb *tls_prf)
Ron Eldorcf280092019-05-14 20:19:13 +0300583{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200584# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
585# if defined(MBEDTLS_SHA384_C)
586 if (tls_prf == tls_prf_sha384) {
587 return MBEDTLS_SSL_TLS_PRF_SHA384;
588 } else
589# endif
590# if defined(MBEDTLS_SHA256_C)
591 if (tls_prf == tls_prf_sha256) {
592 return MBEDTLS_SSL_TLS_PRF_SHA256;
593 } else
594# endif
595# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
596 return MBEDTLS_SSL_TLS_PRF_NONE;
Ron Eldorcf280092019-05-14 20:19:13 +0300597}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200598# endif /* MBEDTLS_SSL_EXPORT_KEYS */
Ron Eldorcf280092019-05-14 20:19:13 +0300599
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200600int mbedtls_ssl_tls_prf(const mbedtls_tls_prf_types prf,
601 const unsigned char *secret,
602 size_t slen,
603 const char *label,
604 const unsigned char *random,
605 size_t rlen,
606 unsigned char *dstbuf,
607 size_t dlen)
Ron Eldor51d3ab52019-05-12 14:54:30 +0300608{
609 mbedtls_ssl_tls_prf_cb *tls_prf = NULL;
610
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200611 switch (prf) {
612# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
613# if defined(MBEDTLS_SHA384_C)
Ron Eldor51d3ab52019-05-12 14:54:30 +0300614 case MBEDTLS_SSL_TLS_PRF_SHA384:
615 tls_prf = tls_prf_sha384;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200616 break;
617# endif /* MBEDTLS_SHA384_C */
618# if defined(MBEDTLS_SHA256_C)
Ron Eldor51d3ab52019-05-12 14:54:30 +0300619 case MBEDTLS_SSL_TLS_PRF_SHA256:
620 tls_prf = tls_prf_sha256;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200621 break;
622# endif /* MBEDTLS_SHA256_C */
623# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
624 default:
625 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Ron Eldor51d3ab52019-05-12 14:54:30 +0300626 }
627
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200628 return tls_prf(secret, slen, label, random, rlen, dstbuf, dlen);
Ron Eldor51d3ab52019-05-12 14:54:30 +0300629}
630
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200631/* Type for the TLS PRF */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200632typedef int ssl_tls_prf_t(const unsigned char *,
633 size_t,
634 const char *,
635 const unsigned char *,
636 size_t,
637 unsigned char *,
638 size_t);
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200639
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200640/*
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +0200641 * Populate a transform structure with session keys and all the other
642 * necessary information.
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200643 *
Manuel Pégourié-Gonnardcba40d92019-05-06 12:55:40 +0200644 * Parameters:
645 * - [in/out]: transform: structure to populate
646 * [in] must be just initialised with mbedtls_ssl_transform_init()
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200647 * [out] fully populated, ready for use by mbedtls_ssl_{en,de}crypt_buf()
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200648 * - [in] ciphersuite
649 * - [in] master
650 * - [in] encrypt_then_mac
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200651 * - [in] compression
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200652 * - [in] tls_prf: pointer to PRF to use for key derivation
653 * - [in] randbytes: buffer holding ServerHello.random + ClientHello.random
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200654 * - [in] minor_ver: SSL/TLS minor version
655 * - [in] endpoint: client or server
656 * - [in] ssl: optionally used for:
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200657 * - MBEDTLS_SSL_EXPORT_KEYS: ssl->conf->{f,p}_export_keys
658 * - MBEDTLS_DEBUG_C: ssl->conf->{f,p}_dbg
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +0200659 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200660static int ssl_populate_transform(mbedtls_ssl_transform *transform,
661 int ciphersuite,
662 const unsigned char master[48],
663# if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
664# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
665 int encrypt_then_mac,
666# endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
667# endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
668 ssl_tls_prf_t tls_prf,
669 const unsigned char randbytes[64],
670 int minor_ver,
671 unsigned endpoint,
672 const mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +0000673{
Paul Bakkerda02a7f2013-08-31 17:25:14 +0200674 int ret = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200675# if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckercb1cc802018-11-17 22:27:38 +0000676 int psa_fallthrough;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200677# endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker5121ce52009-01-03 21:22:43 +0000678 unsigned char keyblk[256];
679 unsigned char *key1;
680 unsigned char *key2;
Paul Bakker68884e32013-01-07 18:20:04 +0100681 unsigned char *mac_enc;
682 unsigned char *mac_dec;
sander-visser3888b032020-05-06 21:49:46 +0200683 size_t mac_key_len = 0;
Paul Bakkerb9cfaa02013-10-11 18:58:55 +0200684 size_t iv_copy_len;
Hanno Becker88aaf652017-12-27 08:17:40 +0000685 unsigned keylen;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000686 const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200687 const mbedtls_cipher_info_t *cipher_info;
688 const mbedtls_md_info_t *md_info;
Paul Bakker68884e32013-01-07 18:20:04 +0100689
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200690# if !defined(MBEDTLS_SSL_EXPORT_KEYS) && !defined(MBEDTLS_DEBUG_C)
Manuel Pégourié-Gonnarda7505d12019-05-07 10:17:56 +0200691 ssl = NULL; /* make sure we don't use it except for those cases */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200692 (void)ssl;
693# endif
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200694
Manuel Pégourié-Gonnard96fb0ee2019-07-09 12:54:17 +0200695 /*
696 * Some data just needs copying into the structure
697 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200698# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \
699 defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
Manuel Pégourié-Gonnard6fa57bf2019-05-10 10:50:04 +0200700 transform->encrypt_then_mac = encrypt_then_mac;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200701# endif
Manuel Pégourié-Gonnardc864f6a2019-05-06 13:48:22 +0200702 transform->minor_ver = minor_ver;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000703
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200704# if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
705 memcpy(transform->randbytes, randbytes, sizeof(transform->randbytes));
706# endif
Manuel Pégourié-Gonnard96fb0ee2019-07-09 12:54:17 +0200707
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200708 /*
709 * Get various info structures
710 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200711 ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite);
712 if (ciphersuite_info == NULL) {
713 MBEDTLS_SSL_DEBUG_MSG(1, ("ciphersuite info for %d not found",
714 ciphersuite));
715 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200716 }
717
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200718 cipher_info = mbedtls_cipher_info_from_type(ciphersuite_info->cipher);
719 if (cipher_info == NULL) {
720 MBEDTLS_SSL_DEBUG_MSG(1, ("cipher info for %u not found",
721 ciphersuite_info->cipher));
722 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker68884e32013-01-07 18:20:04 +0100723 }
724
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200725 md_info = mbedtls_md_info_from_type(ciphersuite_info->mac);
726 if (md_info == NULL) {
727 MBEDTLS_SSL_DEBUG_MSG(1, ("mbedtls_md info for %u not found",
728 (unsigned)ciphersuite_info->mac));
729 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Paul Bakker68884e32013-01-07 18:20:04 +0100730 }
731
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200732# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Hanno Becker4bf74652019-04-26 16:22:27 +0100733 /* Copy own and peer's CID if the use of the CID
734 * extension has been negotiated. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200735 if (ssl->handshake->cid_in_use == MBEDTLS_SSL_CID_ENABLED) {
736 MBEDTLS_SSL_DEBUG_MSG(3, ("Copy CIDs into SSL transform"));
Hanno Becker8a7f9722019-04-30 13:52:29 +0100737
Hanno Becker05154c32019-05-03 15:23:51 +0100738 transform->in_cid_len = ssl->own_cid_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200739 memcpy(transform->in_cid, ssl->own_cid, ssl->own_cid_len);
740 MBEDTLS_SSL_DEBUG_BUF(3, "Incoming CID", transform->in_cid,
741 transform->in_cid_len);
Hanno Beckerd1f20352019-05-15 10:21:55 +0100742
743 transform->out_cid_len = ssl->handshake->peer_cid_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200744 memcpy(transform->out_cid, ssl->handshake->peer_cid,
745 ssl->handshake->peer_cid_len);
746 MBEDTLS_SSL_DEBUG_BUF(3, "Outgoing CID", transform->out_cid,
747 transform->out_cid_len);
Hanno Becker4bf74652019-04-26 16:22:27 +0100748 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200749# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Hanno Becker4bf74652019-04-26 16:22:27 +0100750
Paul Bakker5121ce52009-01-03 21:22:43 +0000751 /*
Manuel Pégourié-Gonnard9b108c22019-05-06 13:32:17 +0200752 * Compute key block using the PRF
Paul Bakker5121ce52009-01-03 21:22:43 +0000753 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200754 ret = tls_prf(master, 48, "key expansion", randbytes, 64, keyblk, 256);
755 if (ret != 0) {
756 MBEDTLS_SSL_DEBUG_RET(1, "prf", ret);
757 return ret;
Manuel Pégourié-Gonnarde9608182015-03-26 11:47:47 +0100758 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000759
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200760 MBEDTLS_SSL_DEBUG_MSG(3, ("ciphersuite = %s",
761 mbedtls_ssl_get_ciphersuite_name(ciphersuite)));
762 MBEDTLS_SSL_DEBUG_BUF(3, "master secret", master, 48);
763 MBEDTLS_SSL_DEBUG_BUF(4, "random bytes", randbytes, 64);
764 MBEDTLS_SSL_DEBUG_BUF(4, "key block", keyblk, 256);
Paul Bakker5121ce52009-01-03 21:22:43 +0000765
Paul Bakker5121ce52009-01-03 21:22:43 +0000766 /*
767 * Determine the appropriate key, IV and MAC length.
768 */
Paul Bakker68884e32013-01-07 18:20:04 +0100769
Hanno Becker88aaf652017-12-27 08:17:40 +0000770 keylen = cipher_info->key_bitlen / 8;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200771
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200772# if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || \
773 defined(MBEDTLS_CHACHAPOLY_C)
774 if (cipher_info->mode == MBEDTLS_MODE_GCM ||
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200775 cipher_info->mode == MBEDTLS_MODE_CCM ||
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200776 cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY) {
Hanno Beckerf704bef2018-11-16 15:21:18 +0000777 size_t explicit_ivlen;
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200778
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200779 transform->maclen = 0;
Hanno Becker81c7b182017-11-09 18:39:33 +0000780 mac_key_len = 0;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000781 transform->taglen =
782 ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200783
Hanno Becker447558d2020-05-28 07:36:33 +0100784 /* All modes haves 96-bit IVs, but the length of the static parts vary
785 * with mode and version:
786 * - For GCM and CCM in TLS 1.2, there's a static IV of 4 Bytes
787 * (to be concatenated with a dynamically chosen IV of 8 Bytes)
Hanno Beckerf93c2d72020-05-28 07:39:43 +0100788 * - For ChaChaPoly in TLS 1.2, and all modes in TLS 1.3, there's
789 * a static IV of 12 Bytes (to be XOR'ed with the 8 Byte record
790 * sequence number).
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200791 */
Paul Bakker68884e32013-01-07 18:20:04 +0100792 transform->ivlen = 12;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200793# if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL)
794 if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_4) {
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200795 transform->fixed_ivlen = 12;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200796 } else
797# endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */
Hanno Beckerf93c2d72020-05-28 07:39:43 +0100798 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200799 if (cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY)
Hanno Beckerf93c2d72020-05-28 07:39:43 +0100800 transform->fixed_ivlen = 12;
801 else
802 transform->fixed_ivlen = 4;
803 }
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200804
Manuel Pégourié-Gonnard2e58e8e2018-06-18 11:16:43 +0200805 /* Minimum length of encrypted record */
806 explicit_ivlen = transform->ivlen - transform->fixed_ivlen;
Hanno Beckere694c3e2017-12-27 21:34:08 +0000807 transform->minlen = explicit_ivlen + transform->taglen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200808 } else
809# endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C */
810# if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
811 if (cipher_info->mode == MBEDTLS_MODE_STREAM ||
812 cipher_info->mode == MBEDTLS_MODE_CBC) {
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200813 /* Initialize HMAC contexts */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200814 if ((ret = mbedtls_md_setup(&transform->md_ctx_enc, md_info, 1)) != 0 ||
815 (ret = mbedtls_md_setup(&transform->md_ctx_dec, md_info, 1)) != 0) {
816 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_setup", ret);
Ron Eldore6992702019-05-07 18:27:13 +0300817 goto end;
Paul Bakker68884e32013-01-07 18:20:04 +0100818 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000819
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200820 /* Get MAC length */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200821 mac_key_len = mbedtls_md_get_size(md_info);
Hanno Becker81c7b182017-11-09 18:39:33 +0000822 transform->maclen = mac_key_len;
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200823
Manuel Pégourié-Gonnarde800cd82014-06-18 15:34:40 +0200824 /* IV length */
Paul Bakker68884e32013-01-07 18:20:04 +0100825 transform->ivlen = cipher_info->iv_size;
Paul Bakker5121ce52009-01-03 21:22:43 +0000826
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200827 /* Minimum length */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200828 if (cipher_info->mode == MBEDTLS_MODE_STREAM)
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200829 transform->minlen = transform->maclen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200830 else {
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200831 /*
832 * GenericBlockCipher:
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +0100833 * 1. if EtM is in use: one block plus MAC
834 * otherwise: * first multiple of blocklen greater than maclen
TRodziewicz2abf03c2021-06-25 14:40:09 +0200835 * 2. IV
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200836 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200837# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
838 if (encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED) {
839 transform->minlen = transform->maclen + cipher_info->block_size;
840 } else
841# endif
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +0100842 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200843 transform->minlen = transform->maclen +
844 cipher_info->block_size -
845 transform->maclen % cipher_info->block_size;
Manuel Pégourié-Gonnard169dd6a2014-11-04 16:15:39 +0100846 }
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200847
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200848# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
849 if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) {
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200850 transform->minlen += transform->ivlen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200851 } else
852# endif
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200853 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200854 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ron Eldore6992702019-05-07 18:27:13 +0300855 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
856 goto end;
Manuel Pégourié-Gonnardeaa76f72014-06-18 16:06:02 +0200857 }
Paul Bakker68884e32013-01-07 18:20:04 +0100858 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200859 } else
860# endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
Hanno Becker8031d062018-01-03 15:32:31 +0000861 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200862 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
863 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Becker8031d062018-01-03 15:32:31 +0000864 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000865
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200866 MBEDTLS_SSL_DEBUG_MSG(3, ("keylen: %u, minlen: %u, ivlen: %u, maclen: %u",
867 (unsigned)keylen, (unsigned)transform->minlen,
868 (unsigned)transform->ivlen,
869 (unsigned)transform->maclen));
Paul Bakker5121ce52009-01-03 21:22:43 +0000870
871 /*
872 * Finally setup the cipher contexts, IVs and MAC secrets.
873 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200874# if defined(MBEDTLS_SSL_CLI_C)
875 if (endpoint == MBEDTLS_SSL_IS_CLIENT) {
Hanno Becker81c7b182017-11-09 18:39:33 +0000876 key1 = keyblk + mac_key_len * 2;
Hanno Becker88aaf652017-12-27 08:17:40 +0000877 key2 = keyblk + mac_key_len * 2 + keylen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000878
Paul Bakker68884e32013-01-07 18:20:04 +0100879 mac_enc = keyblk;
Hanno Becker81c7b182017-11-09 18:39:33 +0000880 mac_dec = keyblk + mac_key_len;
Paul Bakker5121ce52009-01-03 21:22:43 +0000881
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000882 /*
883 * This is not used in TLS v1.1.
884 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200885 iv_copy_len = (transform->fixed_ivlen) ? transform->fixed_ivlen :
886 transform->ivlen;
887 memcpy(transform->iv_enc, key2 + keylen, iv_copy_len);
888 memcpy(transform->iv_dec, key2 + keylen + iv_copy_len, iv_copy_len);
889 } else
890# endif /* MBEDTLS_SSL_CLI_C */
891# if defined(MBEDTLS_SSL_SRV_C)
892 if (endpoint == MBEDTLS_SSL_IS_SERVER) {
Hanno Becker88aaf652017-12-27 08:17:40 +0000893 key1 = keyblk + mac_key_len * 2 + keylen;
Hanno Becker81c7b182017-11-09 18:39:33 +0000894 key2 = keyblk + mac_key_len * 2;
Paul Bakker5121ce52009-01-03 21:22:43 +0000895
Hanno Becker81c7b182017-11-09 18:39:33 +0000896 mac_enc = keyblk + mac_key_len;
Paul Bakker68884e32013-01-07 18:20:04 +0100897 mac_dec = keyblk;
Paul Bakker5121ce52009-01-03 21:22:43 +0000898
Paul Bakker2e11f7d2010-07-25 14:24:53 +0000899 /*
900 * This is not used in TLS v1.1.
901 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200902 iv_copy_len = (transform->fixed_ivlen) ? transform->fixed_ivlen :
903 transform->ivlen;
904 memcpy(transform->iv_dec, key1 + keylen, iv_copy_len);
905 memcpy(transform->iv_enc, key1 + keylen + iv_copy_len, iv_copy_len);
906 } else
907# endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +0100908 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200909 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Ron Eldore6992702019-05-07 18:27:13 +0300910 ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
911 goto end;
Manuel Pégourié-Gonnardd16d1cb2014-11-20 18:15:05 +0100912 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000913
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200914# if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
915# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
TRodziewicz345165c2021-07-06 13:42:11 +0200916 /* For HMAC-based ciphersuites, initialize the HMAC transforms.
917 For AEAD-based ciphersuites, there is nothing to do here. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200918 if (mac_key_len != 0) {
919 mbedtls_md_hmac_starts(&transform->md_ctx_enc, mac_enc, mac_key_len);
920 mbedtls_md_hmac_starts(&transform->md_ctx_dec, mac_dec, mac_key_len);
Paul Bakker68884e32013-01-07 18:20:04 +0100921 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200922# endif
923# endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
Paul Bakker68884e32013-01-07 18:20:04 +0100924
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200925 ((void)mac_dec);
926 ((void)mac_enc);
Paul Bakker05ef8352012-05-08 09:17:57 +0000927
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200928# if defined(MBEDTLS_SSL_EXPORT_KEYS)
929 if (ssl->f_export_keys != NULL) {
930 ssl->f_export_keys(ssl->p_export_keys,
931 MBEDTLS_SSL_KEY_EXPORT_TLS12_MASTER_SECRET, master,
932 48, randbytes + 32, randbytes,
933 tls_prf_get_type(tls_prf));
Ron Eldorf5cc10d2019-05-07 18:33:40 +0300934 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200935# endif
Robert Cragie4feb7ae2015-10-02 13:33:37 +0100936
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200937# if defined(MBEDTLS_USE_PSA_CRYPTO)
Hanno Beckercb1cc802018-11-17 22:27:38 +0000938
939 /* Only use PSA-based ciphers for TLS-1.2.
940 * That's relevant at least for TLS-1.0, where
941 * we assume that mbedtls_cipher_crypt() updates
942 * the structure field for the IV, which the PSA-based
943 * implementation currently doesn't. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200944# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
945 if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) {
946 ret = mbedtls_cipher_setup_psa(&transform->cipher_ctx_enc, cipher_info,
947 transform->taglen);
948 if (ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) {
949 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup_psa", ret);
Ron Eldore6992702019-05-07 18:27:13 +0300950 goto end;
Hanno Beckercb1cc802018-11-17 22:27:38 +0000951 }
952
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200953 if (ret == 0) {
954 MBEDTLS_SSL_DEBUG_MSG(
955 3, ("Successfully setup PSA-based encryption cipher context"));
Hanno Beckercb1cc802018-11-17 22:27:38 +0000956 psa_fallthrough = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200957 } else {
958 MBEDTLS_SSL_DEBUG_MSG(
959 1,
960 ("Failed to setup PSA-based cipher context for record encryption - fall through to default setup."));
Hanno Beckercb1cc802018-11-17 22:27:38 +0000961 psa_fallthrough = 1;
962 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200963 } else
Hanno Beckercb1cc802018-11-17 22:27:38 +0000964 psa_fallthrough = 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200965# else
Hanno Beckercb1cc802018-11-17 22:27:38 +0000966 psa_fallthrough = 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200967# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Beckerf704bef2018-11-16 15:21:18 +0000968
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200969 if (psa_fallthrough == 1)
970# endif /* MBEDTLS_USE_PSA_CRYPTO */
971 if ((ret = mbedtls_cipher_setup(&transform->cipher_ctx_enc,
972 cipher_info)) != 0) {
973 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup", ret);
Ron Eldore6992702019-05-07 18:27:13 +0300974 goto end;
Hanno Beckercb1cc802018-11-17 22:27:38 +0000975 }
976
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200977# if defined(MBEDTLS_USE_PSA_CRYPTO)
978 /* Only use PSA-based ciphers for TLS-1.2.
979 * That's relevant at least for TLS-1.0, where
980 * we assume that mbedtls_cipher_crypt() updates
981 * the structure field for the IV, which the PSA-based
982 * implementation currently doesn't. */
983# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
984 if (ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) {
985 ret = mbedtls_cipher_setup_psa(&transform->cipher_ctx_dec, cipher_info,
986 transform->taglen);
987 if (ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) {
988 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup_psa", ret);
989 goto end;
Hanno Beckercb1cc802018-11-17 22:27:38 +0000990 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200991
992 if (ret == 0) {
993 MBEDTLS_SSL_DEBUG_MSG(
994 3, ("Successfully setup PSA-based decryption cipher context"));
995 psa_fallthrough = 0;
996 } else {
997 MBEDTLS_SSL_DEBUG_MSG(
998 1,
999 ("Failed to setup PSA-based cipher context for record decryption - fall through to default setup."));
Hanno Beckercb1cc802018-11-17 22:27:38 +00001000 psa_fallthrough = 1;
1001 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001002 } else
Hanno Beckercb1cc802018-11-17 22:27:38 +00001003 psa_fallthrough = 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001004# else
Hanno Beckercb1cc802018-11-17 22:27:38 +00001005 psa_fallthrough = 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001006# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Beckerf704bef2018-11-16 15:21:18 +00001007
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001008 if (psa_fallthrough == 1)
1009# endif /* MBEDTLS_USE_PSA_CRYPTO */
1010 if ((ret = mbedtls_cipher_setup(&transform->cipher_ctx_dec,
1011 cipher_info)) != 0) {
1012 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup", ret);
Ron Eldore6992702019-05-07 18:27:13 +03001013 goto end;
Manuel Pégourié-Gonnard126a66f2013-10-25 18:33:32 +02001014 }
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001015
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001016 if ((ret = mbedtls_cipher_setkey(&transform->cipher_ctx_enc, key1,
1017 cipher_info->key_bitlen,
1018 MBEDTLS_ENCRYPT)) != 0) {
1019 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setkey", ret);
1020 goto end;
1021 }
1022
1023 if ((ret = mbedtls_cipher_setkey(&transform->cipher_ctx_dec, key2,
1024 cipher_info->key_bitlen,
1025 MBEDTLS_DECRYPT)) != 0) {
1026 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setkey", ret);
1027 goto end;
1028 }
1029
1030# if defined(MBEDTLS_CIPHER_MODE_CBC)
1031 if (cipher_info->mode == MBEDTLS_MODE_CBC) {
1032 if ((ret = mbedtls_cipher_set_padding_mode(
1033 &transform->cipher_ctx_enc, MBEDTLS_PADDING_NONE)) != 0) {
1034 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_set_padding_mode", ret);
1035 goto end;
1036 }
1037
1038 if ((ret = mbedtls_cipher_set_padding_mode(
1039 &transform->cipher_ctx_dec, MBEDTLS_PADDING_NONE)) != 0) {
1040 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_set_padding_mode", ret);
Ron Eldore6992702019-05-07 18:27:13 +03001041 goto end;
Manuel Pégourié-Gonnard88665912013-10-25 18:42:44 +02001042 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001043 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001044# endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001045
Ron Eldore6992702019-05-07 18:27:13 +03001046end:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001047 mbedtls_platform_zeroize(keyblk, sizeof(keyblk));
1048 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001049}
1050
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001051/*
TRodziewicz0f82ec62021-05-12 17:49:18 +02001052 * Set appropriate PRF function and other SSL / TLS1.2 functions
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001053 *
1054 * Inputs:
1055 * - SSL/TLS minor version
1056 * - hash associated with the ciphersuite (only used by TLS 1.2)
1057 *
Manuel Pégourié-Gonnard31d3ef12019-05-10 10:25:00 +02001058 * Outputs:
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001059 * - the tls_prf, calc_verify and calc_finished members of handshake structure
1060 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001061static int ssl_set_handshake_prfs(mbedtls_ssl_handshake_params *handshake,
1062 int minor_ver,
1063 mbedtls_md_type_t hash)
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001064{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001065# if !defined(MBEDTLS_SSL_PROTO_TLS1_2) || !defined(MBEDTLS_SHA384_C)
1066 (void)hash;
1067# endif
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001068
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001069# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1070# if defined(MBEDTLS_SHA384_C)
1071 if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 && hash == MBEDTLS_MD_SHA384) {
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001072 handshake->tls_prf = tls_prf_sha384;
1073 handshake->calc_verify = ssl_calc_verify_tls_sha384;
1074 handshake->calc_finished = ssl_calc_finished_tls_sha384;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001075 } else
1076# endif
1077# if defined(MBEDTLS_SHA256_C)
1078 if (minor_ver == MBEDTLS_SSL_MINOR_VERSION_3) {
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001079 handshake->tls_prf = tls_prf_sha256;
1080 handshake->calc_verify = ssl_calc_verify_tls_sha256;
1081 handshake->calc_finished = ssl_calc_finished_tls_sha256;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001082 } else
1083# endif
1084# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001085 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001086 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001087 }
1088
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001089 return 0;
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001090}
1091
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001092/*
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001093 * Compute master secret if needed
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001094 *
1095 * Parameters:
1096 * [in/out] handshake
1097 * [in] resume, premaster, extended_ms, calc_verify, tls_prf
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001098 * (PSA-PSK) ciphersuite_info, psk_opaque
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001099 * [out] premaster (cleared)
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001100 * [out] master
1101 * [in] ssl: optionally used for debugging, EMS and PSA-PSK
1102 * debug: conf->f_dbg, conf->p_dbg
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01001103 * EMS: passed to calc_verify (debug + session_negotiate)
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001104 * PSA-PSA: minor_ver, conf
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001105 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001106static int ssl_compute_master(mbedtls_ssl_handshake_params *handshake,
1107 unsigned char *master,
1108 const mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001109{
Janos Follath865b3eb2019-12-16 11:46:15 +00001110 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001111
1112 /* cf. RFC 5246, Section 8.1:
1113 * "The master secret is always exactly 48 bytes in length." */
1114 size_t const master_secret_len = 48;
1115
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001116# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001117 unsigned char session_hash[48];
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001118# endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001119
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001120 /* The label for the KDF used for key expansion.
1121 * This is either "master secret" or "extended master secret"
1122 * depending on whether the Extended Master Secret extension
1123 * is used. */
1124 char const *lbl = "master secret";
1125
1126 /* The salt for the KDF used for key expansion.
1127 * - If the Extended Master Secret extension is not used,
1128 * this is ClientHello.Random + ServerHello.Random
1129 * (see Sect. 8.1 in RFC 5246).
1130 * - If the Extended Master Secret extension is used,
1131 * this is the transcript of the handshake so far.
1132 * (see Sect. 4 in RFC 7627). */
1133 unsigned char const *salt = handshake->randbytes;
1134 size_t salt_len = 64;
1135
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001136# if !defined(MBEDTLS_DEBUG_C) && \
1137 !defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \
1138 !(defined(MBEDTLS_USE_PSA_CRYPTO) && \
1139 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED))
Manuel Pégourié-Gonnarda7505d12019-05-07 10:17:56 +02001140 ssl = NULL; /* make sure we don't use it except for those cases */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001141 (void)ssl;
1142# endif
Manuel Pégourié-Gonnardde047ad2019-05-03 09:46:14 +02001143
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001144 if (handshake->resume != 0) {
1145 MBEDTLS_SSL_DEBUG_MSG(3, ("no premaster (session resumed)"));
1146 return 0;
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001147 }
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001148
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001149# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
1150 if (handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED) {
1151 lbl = "extended master secret";
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001152 salt = session_hash;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001153 handshake->calc_verify(ssl, session_hash, &salt_len);
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001154
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001155 MBEDTLS_SSL_DEBUG_BUF(3, "session hash for extended master secret",
1156 session_hash, salt_len);
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001157 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001158# endif /* MBEDTLS_SSL_EXTENDED_MS_ENABLED */
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001159
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001160# if defined(MBEDTLS_USE_PSA_CRYPTO) && \
1161 defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
1162 if (handshake->ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK &&
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001163 ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001164 ssl_use_opaque_psk(ssl) == 1) {
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001165 /* Perform PSK-to-MS expansion in a single step. */
1166 psa_status_t status;
1167 psa_algorithm_t alg;
Ronald Croncf56a0a2020-08-04 09:51:30 +02001168 psa_key_id_t psk;
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001169 psa_key_derivation_operation_t derivation =
1170 PSA_KEY_DERIVATION_OPERATION_INIT;
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001171 mbedtls_md_type_t hash_alg = handshake->ciphersuite_info->mac;
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001172
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001173 MBEDTLS_SSL_DEBUG_MSG(2, ("perform PSA-based PSK-to-MS expansion"));
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001174
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001175 psk = mbedtls_ssl_get_opaque_psk(ssl);
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001176
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001177 if (hash_alg == MBEDTLS_MD_SHA384)
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001178 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_384);
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001179 else
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001180 alg = PSA_ALG_TLS12_PSK_TO_MS(PSA_ALG_SHA_256);
1181
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001182 status = setup_psa_key_derivation(&derivation, psk, alg, salt, salt_len,
1183 (unsigned char const *)lbl,
1184 (size_t)strlen(lbl),
1185 master_secret_len);
1186 if (status != PSA_SUCCESS) {
1187 psa_key_derivation_abort(&derivation);
1188 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001189 }
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001190
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001191 status = psa_key_derivation_output_bytes(&derivation, master,
1192 master_secret_len);
1193 if (status != PSA_SUCCESS) {
1194 psa_key_derivation_abort(&derivation);
1195 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001196 }
1197
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001198 status = psa_key_derivation_abort(&derivation);
1199 if (status != PSA_SUCCESS)
1200 return MBEDTLS_ERR_SSL_HW_ACCEL_FAILED;
1201 } else
1202# endif
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001203 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001204 ret = handshake->tls_prf(handshake->premaster, handshake->pmslen, lbl,
1205 salt, salt_len, master, master_secret_len);
1206 if (ret != 0) {
1207 MBEDTLS_SSL_DEBUG_RET(1, "prf", ret);
1208 return ret;
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001209 }
1210
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001211 MBEDTLS_SSL_DEBUG_BUF(3, "premaster secret", handshake->premaster,
1212 handshake->pmslen);
Manuel Pégourié-Gonnard85680c42019-05-03 09:16:16 +02001213
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001214 mbedtls_platform_zeroize(handshake->premaster,
1215 sizeof(handshake->premaster));
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001216 }
1217
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001218 return 0;
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001219}
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001220
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001221int mbedtls_ssl_derive_keys(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +02001222{
Janos Follath865b3eb2019-12-16 11:46:15 +00001223 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001224 const mbedtls_ssl_ciphersuite_t *const ciphersuite_info =
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001225 ssl->handshake->ciphersuite_info;
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001226
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001227 MBEDTLS_SSL_DEBUG_MSG(2, ("=> derive keys"));
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001228
1229 /* Set PRF, calc_verify and calc_finished function pointers */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001230 ret = ssl_set_handshake_prfs(ssl->handshake, ssl->minor_ver,
1231 ciphersuite_info->mac);
1232 if (ret != 0) {
1233 MBEDTLS_SSL_DEBUG_RET(1, "ssl_set_handshake_prfs", ret);
1234 return ret;
Manuel Pégourié-Gonnard8d2805c2019-04-30 12:08:59 +02001235 }
Manuel Pégourié-Gonnard1b00c4f2019-04-30 11:54:22 +02001236
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001237 /* Compute master secret if needed */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001238 ret =
1239 ssl_compute_master(ssl->handshake, ssl->session_negotiate->master, ssl);
1240 if (ret != 0) {
1241 MBEDTLS_SSL_DEBUG_RET(1, "ssl_compute_master", ret);
1242 return ret;
Manuel Pégourié-Gonnard9951b712019-04-30 12:08:59 +02001243 }
1244
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001245 /* Swap the client and server random values:
1246 * - MS derivation wanted client+server (RFC 5246 8.1)
1247 * - key derivation wants server+client (RFC 5246 6.3) */
1248 {
1249 unsigned char tmp[64];
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001250 memcpy(tmp, ssl->handshake->randbytes, 64);
1251 memcpy(ssl->handshake->randbytes, tmp + 32, 32);
1252 memcpy(ssl->handshake->randbytes + 32, tmp, 32);
1253 mbedtls_platform_zeroize(tmp, sizeof(tmp));
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001254 }
1255
1256 /* Populate transform structure */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001257 ret = ssl_populate_transform(ssl->transform_negotiate,
1258 ssl->session_negotiate->ciphersuite,
1259 ssl->session_negotiate->master,
1260# if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
1261# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
1262 ssl->session_negotiate->encrypt_then_mac,
1263# endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
1264# endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
1265 ssl->handshake->tls_prf,
1266 ssl->handshake->randbytes, ssl->minor_ver,
1267 ssl->conf->endpoint, ssl);
1268 if (ret != 0) {
1269 MBEDTLS_SSL_DEBUG_RET(1, "ssl_populate_transform", ret);
1270 return ret;
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001271 }
1272
1273 /* We no longer need Server/ClientHello.random values */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001274 mbedtls_platform_zeroize(ssl->handshake->randbytes,
1275 sizeof(ssl->handshake->randbytes));
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001276
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001277 MBEDTLS_SSL_DEBUG_MSG(2, ("<= derive keys"));
Manuel Pégourié-Gonnard040a9512019-05-06 12:05:58 +02001278
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001279 return 0;
Manuel Pégourié-Gonnarde59ae232019-04-30 11:41:40 +02001280}
1281
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001282# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1283# if defined(MBEDTLS_SHA256_C)
1284void ssl_calc_verify_tls_sha256(const mbedtls_ssl_context *ssl,
1285 unsigned char *hash,
1286 size_t *hlen)
Paul Bakker380da532012-04-18 16:10:25 +00001287{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001288# if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurekeb342242019-01-29 09:14:33 -05001289 size_t hash_size;
1290 psa_status_t status;
1291 psa_hash_operation_t sha256_psa = psa_hash_operation_init();
1292
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001293 MBEDTLS_SSL_DEBUG_MSG(2, ("=> PSA calc verify sha256"));
1294 status = psa_hash_clone(&ssl->handshake->fin_sha256_psa, &sha256_psa);
1295 if (status != PSA_SUCCESS) {
1296 MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash clone failed"));
Andrzej Kurekeb342242019-01-29 09:14:33 -05001297 return;
1298 }
1299
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001300 status = psa_hash_finish(&sha256_psa, hash, 32, &hash_size);
1301 if (status != PSA_SUCCESS) {
1302 MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash finish failed"));
Andrzej Kurekeb342242019-01-29 09:14:33 -05001303 return;
1304 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001305
1306 *hlen = 32;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001307 MBEDTLS_SSL_DEBUG_BUF(3, "PSA calculated verify result", hash, *hlen);
1308 MBEDTLS_SSL_DEBUG_MSG(2, ("<= PSA calc verify"));
1309# else
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001310 mbedtls_sha256_context sha256;
Paul Bakker380da532012-04-18 16:10:25 +00001311
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001312 mbedtls_sha256_init(&sha256);
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001313
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001314 MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc verify sha256"));
Paul Bakker380da532012-04-18 16:10:25 +00001315
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001316 mbedtls_sha256_clone(&sha256, &ssl->handshake->fin_sha256);
1317 mbedtls_sha256_finish(&sha256, hash);
Paul Bakker380da532012-04-18 16:10:25 +00001318
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001319 *hlen = 32;
1320
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001321 MBEDTLS_SSL_DEBUG_BUF(3, "calculated verify result", hash, *hlen);
1322 MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc verify"));
Paul Bakker380da532012-04-18 16:10:25 +00001323
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001324 mbedtls_sha256_free(&sha256);
1325# endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker380da532012-04-18 16:10:25 +00001326 return;
1327}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001328# endif /* MBEDTLS_SHA256_C */
Paul Bakker380da532012-04-18 16:10:25 +00001329
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001330# if defined(MBEDTLS_SHA384_C)
1331void ssl_calc_verify_tls_sha384(const mbedtls_ssl_context *ssl,
1332 unsigned char *hash,
1333 size_t *hlen)
Paul Bakker380da532012-04-18 16:10:25 +00001334{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001335# if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurekeb342242019-01-29 09:14:33 -05001336 size_t hash_size;
1337 psa_status_t status;
Andrzej Kurek972fba52019-01-30 03:29:12 -05001338 psa_hash_operation_t sha384_psa = psa_hash_operation_init();
Andrzej Kurekeb342242019-01-29 09:14:33 -05001339
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001340 MBEDTLS_SSL_DEBUG_MSG(2, ("=> PSA calc verify sha384"));
1341 status = psa_hash_clone(&ssl->handshake->fin_sha384_psa, &sha384_psa);
1342 if (status != PSA_SUCCESS) {
1343 MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash clone failed"));
Andrzej Kurekeb342242019-01-29 09:14:33 -05001344 return;
1345 }
1346
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001347 status = psa_hash_finish(&sha384_psa, hash, 48, &hash_size);
1348 if (status != PSA_SUCCESS) {
1349 MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash finish failed"));
Andrzej Kurekeb342242019-01-29 09:14:33 -05001350 return;
1351 }
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001352
1353 *hlen = 48;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001354 MBEDTLS_SSL_DEBUG_BUF(3, "PSA calculated verify result", hash, *hlen);
1355 MBEDTLS_SSL_DEBUG_MSG(2, ("<= PSA calc verify"));
1356# else
Manuel Pégourié-Gonnardc0bf01e2015-07-06 16:11:18 +02001357 mbedtls_sha512_context sha512;
Paul Bakker380da532012-04-18 16:10:25 +00001358
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001359 mbedtls_sha512_init(&sha512);
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02001360
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001361 MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc verify sha384"));
Paul Bakker380da532012-04-18 16:10:25 +00001362
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001363 mbedtls_sha512_clone(&sha512, &ssl->handshake->fin_sha512);
1364 mbedtls_sha512_finish(&sha512, hash);
Paul Bakker5121ce52009-01-03 21:22:43 +00001365
Manuel Pégourié-Gonnardde718b92019-05-03 11:43:28 +02001366 *hlen = 48;
1367
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001368 MBEDTLS_SSL_DEBUG_BUF(3, "calculated verify result", hash, *hlen);
1369 MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc verify"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001370
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001371 mbedtls_sha512_free(&sha512);
1372# endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker5121ce52009-01-03 21:22:43 +00001373 return;
1374}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001375# endif /* MBEDTLS_SHA384_C */
1376# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker5121ce52009-01-03 21:22:43 +00001377
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001378# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
1379int mbedtls_ssl_psk_derive_premaster(mbedtls_ssl_context *ssl,
1380 mbedtls_key_exchange_type_t key_ex)
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001381{
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001382 unsigned char *p = ssl->handshake->premaster;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001383 unsigned char *end = p + sizeof(ssl->handshake->premaster);
Guilhem Bryantb5f04e42020-04-01 11:23:58 +01001384 const unsigned char *psk = NULL;
Guilhem Bryant61b0fe62020-03-27 11:12:12 +00001385 size_t psk_len = 0;
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001386
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001387 if (mbedtls_ssl_get_psk(ssl, &psk, &psk_len) ==
1388 MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED) {
Guilhem Bryantc5285d82020-03-25 17:08:15 +00001389 /*
1390 * This should never happen because the existence of a PSK is always
1391 * checked before calling this function
1392 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001393 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
1394 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001395 }
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001396
1397 /*
1398 * PMS = struct {
1399 * opaque other_secret<0..2^16-1>;
1400 * opaque psk<0..2^16-1>;
1401 * };
1402 * with "other_secret" depending on the particular key exchange
1403 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001404# if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
1405 if (key_ex == MBEDTLS_KEY_EXCHANGE_PSK) {
1406 if (end - p < 2)
1407 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001408
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001409 *(p++) = (unsigned char)(psk_len >> 8);
1410 *(p++) = (unsigned char)(psk_len);
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001411
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001412 if (end < p || (size_t)(end - p) < psk_len)
1413 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001414
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001415 memset(p, 0, psk_len);
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001416 p += psk_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001417 } else
1418# endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */
1419# if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)
1420 if (key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK) {
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001421 /*
1422 * other_secret already set by the ClientKeyExchange message,
1423 * and is 48 bytes long
1424 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001425 if (end - p < 2)
1426 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Philippe Antoine747fd532018-05-30 09:13:21 +02001427
Manuel Pégourié-Gonnard0fae60b2013-10-14 17:39:48 +02001428 *p++ = 0;
1429 *p++ = 48;
1430 p += 48;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001431 } else
1432# endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */
1433# if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)
1434 if (key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK) {
Janos Follath865b3eb2019-12-16 11:46:15 +00001435 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +01001436 size_t len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001437
Manuel Pégourié-Gonnard8df68632014-06-23 17:56:08 +02001438 /* Write length only when we know the actual value */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001439 if ((ret = mbedtls_dhm_calc_secret(
1440 &ssl->handshake->dhm_ctx, p + 2, end - (p + 2), &len,
1441 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
1442 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_dhm_calc_secret", ret);
1443 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001444 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001445 *(p++) = (unsigned char)(len >> 8);
1446 *(p++) = (unsigned char)(len);
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001447 p += len;
1448
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001449 MBEDTLS_SSL_DEBUG_MPI(3, "DHM: K ", &ssl->handshake->dhm_ctx.K);
1450 } else
1451# endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */
1452# if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
1453 if (key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK) {
Janos Follath865b3eb2019-12-16 11:46:15 +00001454 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001455 size_t zlen;
1456
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001457 if ((ret = mbedtls_ecdh_calc_secret(
1458 &ssl->handshake->ecdh_ctx, &zlen, p + 2, end - (p + 2),
1459 ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
1460 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ecdh_calc_secret", ret);
1461 return ret;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001462 }
1463
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001464 *(p++) = (unsigned char)(zlen >> 8);
1465 *(p++) = (unsigned char)(zlen);
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001466 p += zlen;
1467
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001468 MBEDTLS_SSL_DEBUG_ECDH(3, &ssl->handshake->ecdh_ctx,
1469 MBEDTLS_DEBUG_ECDH_Z);
1470 } else
1471# endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001472 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001473 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
1474 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001475 }
1476
1477 /* opaque psk<0..2^16-1>; */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001478 if (end - p < 2)
1479 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardb2bf5a12014-03-25 16:28:12 +01001480
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001481 *(p++) = (unsigned char)(psk_len >> 8);
1482 *(p++) = (unsigned char)(psk_len);
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001483
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001484 if (end < p || (size_t)(end - p) < psk_len)
1485 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardbc5e5082015-10-21 12:35:29 +02001486
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001487 memcpy(p, psk, psk_len);
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01001488 p += psk_len;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001489
1490 ssl->handshake->pmslen = p - ssl->handshake->premaster;
1491
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001492 return 0;
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001493}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001494# endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Manuel Pégourié-Gonnardbd1ae242013-10-14 13:09:25 +02001495
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001496# if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)
1497static int ssl_write_hello_request(mbedtls_ssl_context *ssl);
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02001498
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001499# if defined(MBEDTLS_SSL_PROTO_DTLS)
1500int mbedtls_ssl_resend_hello_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02001501{
1502 /* If renegotiation is not enforced, retransmit until we would reach max
1503 * timeout if we were using the usual handshake doubling scheme */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001504 if (ssl->conf->renego_max_records < 0) {
1505 uint32_t ratio =
1506 ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1;
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02001507 unsigned char doublings = 1;
1508
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001509 while (ratio != 0) {
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02001510 ++doublings;
1511 ratio >>= 1;
1512 }
1513
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001514 if (++ssl->renego_records_seen > doublings) {
1515 MBEDTLS_SSL_DEBUG_MSG(2,
1516 ("no longer retransmitting hello request"));
1517 return 0;
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02001518 }
1519 }
1520
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001521 return ssl_write_hello_request(ssl);
Manuel Pégourié-Gonnarddf3acd82014-10-15 15:07:45 +02001522}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001523# endif
1524# endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard26a4cf62014-10-15 13:52:48 +02001525
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001526# if defined(MBEDTLS_X509_CRT_PARSE_C)
1527static void ssl_clear_peer_cert(mbedtls_ssl_session *session)
Hanno Beckerb9d44792019-02-08 07:19:04 +00001528{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001529# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1530 if (session->peer_cert != NULL) {
1531 mbedtls_x509_crt_free(session->peer_cert);
1532 mbedtls_free(session->peer_cert);
Hanno Beckerb9d44792019-02-08 07:19:04 +00001533 session->peer_cert = NULL;
1534 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001535# else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1536 if (session->peer_cert_digest != NULL) {
Hanno Beckerb9d44792019-02-08 07:19:04 +00001537 /* Zeroization is not necessary. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001538 mbedtls_free(session->peer_cert_digest);
1539 session->peer_cert_digest = NULL;
Hanno Beckerb9d44792019-02-08 07:19:04 +00001540 session->peer_cert_digest_type = MBEDTLS_MD_NONE;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001541 session->peer_cert_digest_len = 0;
Hanno Beckerb9d44792019-02-08 07:19:04 +00001542 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001543# endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Beckerb9d44792019-02-08 07:19:04 +00001544}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001545# endif /* MBEDTLS_X509_CRT_PARSE_C */
Hanno Beckerb9d44792019-02-08 07:19:04 +00001546
Paul Bakker5121ce52009-01-03 21:22:43 +00001547/*
1548 * Handshake functions
1549 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001550# if !defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskinef9828522017-05-03 12:28:43 +02001551/* No certificate support -> dummy functions */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001552int mbedtls_ssl_write_certificate(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00001553{
Hanno Beckere694c3e2017-12-27 21:34:08 +00001554 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
1555 ssl->handshake->ciphersuite_info;
Paul Bakker5121ce52009-01-03 21:22:43 +00001556
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001557 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001558
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001559 if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) {
1560 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate"));
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001561 ssl->state++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001562 return 0;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02001563 }
1564
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001565 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
1566 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001567}
1568
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001569int mbedtls_ssl_parse_certificate(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001570{
Hanno Beckere694c3e2017-12-27 21:34:08 +00001571 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
1572 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001573
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001574 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001575
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001576 if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) {
1577 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001578 ssl->state++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001579 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001580 }
1581
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001582 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
1583 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001584}
Gilles Peskinef9828522017-05-03 12:28:43 +02001585
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001586# else /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Gilles Peskinef9828522017-05-03 12:28:43 +02001587/* Some certificate support -> implement write and parse */
1588
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001589int mbedtls_ssl_write_certificate(mbedtls_ssl_context *ssl)
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001590{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001591 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001592 size_t i, n;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001593 const mbedtls_x509_crt *crt;
Hanno Beckere694c3e2017-12-27 21:34:08 +00001594 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
1595 ssl->handshake->ciphersuite_info;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001596
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001597 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate"));
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001598
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001599 if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info)) {
1600 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate"));
Johan Pascal4f099262020-09-22 10:59:26 +02001601 ssl->state++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001602 return 0;
Paul Bakker48f7a5d2013-04-19 14:30:58 +02001603 }
1604
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001605# if defined(MBEDTLS_SSL_CLI_C)
1606 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
1607 if (ssl->client_auth == 0) {
1608 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip write certificate"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001609 ssl->state++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001610 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00001611 }
Paul Bakker5121ce52009-01-03 21:22:43 +00001612 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001613# endif /* MBEDTLS_SSL_CLI_C */
1614# if defined(MBEDTLS_SSL_SRV_C)
1615 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
1616 if (mbedtls_ssl_own_cert(ssl) == NULL) {
Hanno Becker9cfe6e92021-04-30 05:38:24 +01001617 /* Should never happen because we shouldn't have picked the
1618 * ciphersuite if we don't have a certificate. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001619 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00001620 }
1621 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001622# endif
Paul Bakker5121ce52009-01-03 21:22:43 +00001623
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001624 MBEDTLS_SSL_DEBUG_CRT(3, "own certificate", mbedtls_ssl_own_cert(ssl));
Paul Bakker5121ce52009-01-03 21:22:43 +00001625
1626 /*
1627 * 0 . 0 handshake type
1628 * 1 . 3 handshake length
1629 * 4 . 6 length of all certs
1630 * 7 . 9 length of cert. 1
1631 * 10 . n-1 peer certificate
1632 * n . n+2 length of cert. 2
1633 * n+3 . ... upper level cert, etc.
1634 */
1635 i = 7;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001636 crt = mbedtls_ssl_own_cert(ssl);
Paul Bakker5121ce52009-01-03 21:22:43 +00001637
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001638 while (crt != NULL) {
Paul Bakker5121ce52009-01-03 21:22:43 +00001639 n = crt->raw.len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001640 if (n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i) {
1641 MBEDTLS_SSL_DEBUG_MSG(
1642 1, ("certificate too large, %" MBEDTLS_PRINTF_SIZET
1643 " > %" MBEDTLS_PRINTF_SIZET,
1644 i + 3 + n, (size_t)MBEDTLS_SSL_OUT_CONTENT_LEN));
1645 return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
Paul Bakker5121ce52009-01-03 21:22:43 +00001646 }
1647
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001648 ssl->out_msg[i] = (unsigned char)(n >> 16);
1649 ssl->out_msg[i + 1] = (unsigned char)(n >> 8);
1650 ssl->out_msg[i + 2] = (unsigned char)(n);
Paul Bakker5121ce52009-01-03 21:22:43 +00001651
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001652 i += 3;
1653 memcpy(ssl->out_msg + i, crt->raw.p, n);
1654 i += n;
1655 crt = crt->next;
Paul Bakker5121ce52009-01-03 21:22:43 +00001656 }
1657
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001658 ssl->out_msg[4] = (unsigned char)((i - 7) >> 16);
1659 ssl->out_msg[5] = (unsigned char)((i - 7) >> 8);
1660 ssl->out_msg[6] = (unsigned char)((i - 7));
Paul Bakker5121ce52009-01-03 21:22:43 +00001661
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001662 ssl->out_msglen = i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001663 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001664 ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE;
Paul Bakker5121ce52009-01-03 21:22:43 +00001665
Paul Bakker5121ce52009-01-03 21:22:43 +00001666 ssl->state++;
1667
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001668 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
1669 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
1670 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001671 }
1672
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001673 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate"));
Paul Bakker5121ce52009-01-03 21:22:43 +00001674
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001675 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001676}
1677
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001678# if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
Hanno Becker177475a2019-02-05 17:02:46 +00001679
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001680# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1681static int ssl_check_peer_crt_unchanged(mbedtls_ssl_context *ssl,
1682 unsigned char *crt_buf,
1683 size_t crt_buf_len)
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001684{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001685 mbedtls_x509_crt const *const peer_crt = ssl->session->peer_cert;
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001686
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001687 if (peer_crt == NULL)
1688 return -1;
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001689
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001690 if (peer_crt->raw.len != crt_buf_len)
1691 return -1;
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001692
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001693 return memcmp(peer_crt->raw.p, crt_buf, peer_crt->raw.len);
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001694}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001695# else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1696static int ssl_check_peer_crt_unchanged(mbedtls_ssl_context *ssl,
1697 unsigned char *crt_buf,
1698 size_t crt_buf_len)
Hanno Becker177475a2019-02-05 17:02:46 +00001699{
Janos Follath865b3eb2019-12-16 11:46:15 +00001700 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001701 unsigned char const *const peer_cert_digest =
Hanno Becker177475a2019-02-05 17:02:46 +00001702 ssl->session->peer_cert_digest;
1703 mbedtls_md_type_t const peer_cert_digest_type =
1704 ssl->session->peer_cert_digest_type;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001705 mbedtls_md_info_t const *const digest_info =
1706 mbedtls_md_info_from_type(peer_cert_digest_type);
Hanno Becker177475a2019-02-05 17:02:46 +00001707 unsigned char tmp_digest[MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN];
1708 size_t digest_len;
1709
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001710 if (peer_cert_digest == NULL || digest_info == NULL)
1711 return -1;
Hanno Becker177475a2019-02-05 17:02:46 +00001712
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001713 digest_len = mbedtls_md_get_size(digest_info);
1714 if (digest_len > MBEDTLS_SSL_PEER_CERT_DIGEST_MAX_LEN)
1715 return -1;
Hanno Becker177475a2019-02-05 17:02:46 +00001716
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001717 ret = mbedtls_md(digest_info, crt_buf, crt_buf_len, tmp_digest);
1718 if (ret != 0)
1719 return -1;
Hanno Becker177475a2019-02-05 17:02:46 +00001720
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001721 return memcmp(tmp_digest, peer_cert_digest, digest_len);
Hanno Becker177475a2019-02-05 17:02:46 +00001722}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001723# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1724# endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001725
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02001726/*
1727 * Once the certificate message is read, parse it into a cert chain and
1728 * perform basic checks, but leave actual verification to the caller
1729 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001730static int ssl_parse_certificate_chain(mbedtls_ssl_context *ssl,
1731 mbedtls_x509_crt *chain)
Paul Bakker5121ce52009-01-03 21:22:43 +00001732{
Janos Follath865b3eb2019-12-16 11:46:15 +00001733 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001734# if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
1735 int crt_cnt = 0;
1736# endif
Paul Bakker23986e52011-04-24 08:57:21 +00001737 size_t i, n;
Gilles Peskine064a85c2017-05-10 10:46:40 +02001738 uint8_t alert;
Paul Bakker5121ce52009-01-03 21:22:43 +00001739
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001740 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
1741 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
1742 mbedtls_ssl_send_alert_message(
1743 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1744 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
1745 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00001746 }
1747
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001748 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE) {
1749 mbedtls_ssl_send_alert_message(
1750 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1751 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
1752 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Hanno Becker9ed1ba52021-06-24 11:03:13 +01001753 }
1754
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001755 if (ssl->in_hslen < mbedtls_ssl_hs_hdr_len(ssl) + 3 + 3) {
1756 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
1757 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1758 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1759 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00001760 }
1761
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001762 i = mbedtls_ssl_hs_hdr_len(ssl);
Manuel Pégourié-Gonnardf49a7da2014-09-10 13:30:43 +00001763
Paul Bakker5121ce52009-01-03 21:22:43 +00001764 /*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001765 * Same message structure as in mbedtls_ssl_write_certificate()
Paul Bakker5121ce52009-01-03 21:22:43 +00001766 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001767 n = (ssl->in_msg[i + 1] << 8) | ssl->in_msg[i + 2];
Paul Bakker5121ce52009-01-03 21:22:43 +00001768
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001769 if (ssl->in_msg[i] != 0 ||
1770 ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len(ssl)) {
1771 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
1772 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1773 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1774 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00001775 }
1776
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001777 /* Make &ssl->in_msg[i] point to the beginning of the CRT chain. */
1778 i += 3;
1779
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001780 /* Iterate through and parse the CRTs in the provided chain. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001781 while (i < ssl->in_hslen) {
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001782 /* Check that there's room for the next CRT's length fields. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001783 if (i + 3 > ssl->in_hslen) {
1784 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
1785 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1786 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1787 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Philippe Antoine747fd532018-05-30 09:13:21 +02001788 }
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001789 /* In theory, the CRT can be up to 2**24 Bytes, but we don't support
1790 * anything beyond 2**16 ~ 64K. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001791 if (ssl->in_msg[i] != 0) {
1792 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
1793 mbedtls_ssl_send_alert_message(
1794 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1795 MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT);
1796 return MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
Paul Bakker5121ce52009-01-03 21:22:43 +00001797 }
1798
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001799 /* Read length of the next CRT in the chain. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001800 n = ((unsigned int)ssl->in_msg[i + 1] << 8) |
1801 (unsigned int)ssl->in_msg[i + 2];
Paul Bakker5121ce52009-01-03 21:22:43 +00001802 i += 3;
1803
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001804 if (n < 128 || i + n > ssl->in_hslen) {
1805 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
1806 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1807 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
1808 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00001809 }
1810
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001811 /* Check if we're handling the first CRT in the chain. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001812# if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)
1813 if (crt_cnt++ == 0 && ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
1814 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
Hanno Becker46f34d02019-02-08 14:00:04 +00001815 /* During client-side renegotiation, check that the server's
1816 * end-CRTs hasn't changed compared to the initial handshake,
1817 * mitigating the triple handshake attack. On success, reuse
1818 * the original end-CRT instead of parsing it again. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001819 MBEDTLS_SSL_DEBUG_MSG(
1820 3, ("Check that peer CRT hasn't changed during renegotiation"));
1821 if (ssl_check_peer_crt_unchanged(ssl, &ssl->in_msg[i], n) != 0) {
1822 MBEDTLS_SSL_DEBUG_MSG(1,
1823 ("new server cert during renegotiation"));
1824 mbedtls_ssl_send_alert_message(
1825 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
1826 MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED);
1827 return MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001828 }
Hanno Beckerc7bd7802019-02-05 15:37:23 +00001829
1830 /* Now we can safely free the original chain. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001831 ssl_clear_peer_cert(ssl->session);
Hanno Beckerc7bd7802019-02-05 15:37:23 +00001832 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001833# endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001834
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001835 /* Parse the next certificate in the chain. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001836# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
1837 ret = mbedtls_x509_crt_parse_der(chain, ssl->in_msg + i, n);
1838# else
Hanno Becker353a6f02019-02-26 11:51:34 +00001839 /* If we don't need to store the CRT chain permanently, parse
Hanno Becker0056eab2019-02-08 14:39:16 +00001840 * it in-place from the input buffer instead of making a copy. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001841 ret = mbedtls_x509_crt_parse_der_nocopy(chain, ssl->in_msg + i, n);
1842# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
1843 switch (ret) {
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001844 case 0: /*ok*/
1845 case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
1846 /* Ignore certificate with an unknown algorithm: maybe a
1847 prior certificate was already trusted. */
1848 break;
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001849
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001850 case MBEDTLS_ERR_X509_ALLOC_FAILED:
1851 alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR;
1852 goto crt_parse_der_failed;
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001853
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001854 case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
1855 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
1856 goto crt_parse_der_failed;
Gilles Peskine1cc8e342017-05-03 16:28:34 +02001857
Hanno Beckerdef9bdc2019-01-30 14:46:46 +00001858 default:
1859 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001860crt_parse_der_failed:
1861 mbedtls_ssl_send_alert_message(
1862 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert);
1863 MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
1864 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00001865 }
1866
1867 i += n;
1868 }
1869
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001870 MBEDTLS_SSL_DEBUG_CRT(3, "peer certificate", chain);
1871 return 0;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02001872}
1873
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001874# if defined(MBEDTLS_SSL_SRV_C)
1875static int ssl_srv_check_client_no_crt_notification(mbedtls_ssl_context *ssl)
Hanno Becker4a55f632019-02-05 12:49:06 +00001876{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001877 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT)
1878 return -1;
Hanno Becker4a55f632019-02-05 12:49:06 +00001879
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001880# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
1881 if (ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len(ssl) &&
1882 ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&
1883 ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE &&
1884 memcmp(ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl), "\0\0\0", 3) == 0) {
1885 MBEDTLS_SSL_DEBUG_MSG(1, ("TLSv1 client has no certificate"));
1886 return 0;
Hanno Becker4a55f632019-02-05 12:49:06 +00001887 }
1888
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001889 return -1;
1890# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Becker4a55f632019-02-05 12:49:06 +00001891}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001892# endif /* MBEDTLS_SSL_SRV_C */
Hanno Becker4a55f632019-02-05 12:49:06 +00001893
Hanno Becker28f2fcd2019-02-07 10:11:07 +00001894/* Check if a certificate message is expected.
1895 * Return either
1896 * - SSL_CERTIFICATE_EXPECTED, or
1897 * - SSL_CERTIFICATE_SKIP
1898 * indicating whether a Certificate message is expected or not.
1899 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001900# define SSL_CERTIFICATE_EXPECTED 0
1901# define SSL_CERTIFICATE_SKIP 1
1902static int ssl_parse_certificate_coordinate(mbedtls_ssl_context *ssl,
1903 int authmode)
Hanno Becker28f2fcd2019-02-07 10:11:07 +00001904{
1905 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00001906 ssl->handshake->ciphersuite_info;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00001907
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001908 if (!mbedtls_ssl_ciphersuite_uses_srv_cert(ciphersuite_info))
1909 return SSL_CERTIFICATE_SKIP;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00001910
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001911# if defined(MBEDTLS_SSL_SRV_C)
1912 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
1913 if (ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK)
1914 return SSL_CERTIFICATE_SKIP;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00001915
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001916 if (authmode == MBEDTLS_SSL_VERIFY_NONE) {
Hanno Becker28f2fcd2019-02-07 10:11:07 +00001917 ssl->session_negotiate->verify_result =
1918 MBEDTLS_X509_BADCERT_SKIP_VERIFY;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001919 return SSL_CERTIFICATE_SKIP;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00001920 }
1921 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001922# else
1923 ((void)authmode);
1924# endif /* MBEDTLS_SSL_SRV_C */
Hanno Becker28f2fcd2019-02-07 10:11:07 +00001925
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001926 return SSL_CERTIFICATE_EXPECTED;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00001927}
1928
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001929static int ssl_parse_certificate_verify(mbedtls_ssl_context *ssl,
1930 int authmode,
1931 mbedtls_x509_crt *chain,
1932 void *rs_ctx)
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02001933{
Hanno Becker6bdfab22019-02-05 13:11:17 +00001934 int ret = 0;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00001935 const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
Hanno Beckere694c3e2017-12-27 21:34:08 +00001936 ssl->handshake->ciphersuite_info;
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00001937 int have_ca_chain = 0;
Hanno Becker68636192019-02-05 14:36:34 +00001938
Hanno Becker8927c832019-04-03 12:52:50 +01001939 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *);
1940 void *p_vrfy;
1941
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001942 if (authmode == MBEDTLS_SSL_VERIFY_NONE)
1943 return 0;
Hanno Becker68636192019-02-05 14:36:34 +00001944
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001945 if (ssl->f_vrfy != NULL) {
1946 MBEDTLS_SSL_DEBUG_MSG(3,
1947 ("Use context-specific verification callback"));
Hanno Becker8927c832019-04-03 12:52:50 +01001948 f_vrfy = ssl->f_vrfy;
1949 p_vrfy = ssl->p_vrfy;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001950 } else {
1951 MBEDTLS_SSL_DEBUG_MSG(
1952 3, ("Use configuration-specific verification callback"));
Hanno Becker8927c832019-04-03 12:52:50 +01001953 f_vrfy = ssl->conf->f_vrfy;
1954 p_vrfy = ssl->conf->p_vrfy;
1955 }
1956
Hanno Becker68636192019-02-05 14:36:34 +00001957 /*
1958 * Main check: verify certificate
1959 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001960# if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
1961 if (ssl->conf->f_ca_cb != NULL) {
1962 ((void)rs_ctx);
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00001963 have_ca_chain = 1;
1964
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001965 MBEDTLS_SSL_DEBUG_MSG(3,
1966 ("use CA callback for X.509 CRT verification"));
Jarno Lamsa9822c0d2019-04-01 16:59:48 +03001967 ret = mbedtls_x509_crt_verify_with_ca_cb(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001968 chain, ssl->conf->f_ca_cb, ssl->conf->p_ca_cb,
1969 ssl->conf->cert_profile, ssl->hostname,
1970 &ssl->session_negotiate->verify_result, f_vrfy, p_vrfy);
1971 } else
1972# endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00001973 {
1974 mbedtls_x509_crt *ca_chain;
1975 mbedtls_x509_crl *ca_crl;
1976
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001977# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
1978 if (ssl->handshake->sni_ca_chain != NULL) {
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00001979 ca_chain = ssl->handshake->sni_ca_chain;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001980 ca_crl = ssl->handshake->sni_ca_crl;
1981 } else
1982# endif
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00001983 {
1984 ca_chain = ssl->conf->ca_chain;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001985 ca_crl = ssl->conf->ca_crl;
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00001986 }
1987
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001988 if (ca_chain != NULL)
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00001989 have_ca_chain = 1;
1990
1991 ret = mbedtls_x509_crt_verify_restartable(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001992 chain, ca_chain, ca_crl, ssl->conf->cert_profile, ssl->hostname,
1993 &ssl->session_negotiate->verify_result, f_vrfy, p_vrfy, rs_ctx);
Hanno Beckerafd0b0a2019-03-27 16:55:01 +00001994 }
Hanno Becker68636192019-02-05 14:36:34 +00001995
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001996 if (ret != 0) {
1997 MBEDTLS_SSL_DEBUG_RET(1, "x509_verify_cert", ret);
Hanno Becker68636192019-02-05 14:36:34 +00001998 }
1999
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002000# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2001 if (ret == MBEDTLS_ERR_ECP_IN_PROGRESS)
2002 return MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS;
2003# endif
Hanno Becker68636192019-02-05 14:36:34 +00002004
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002005 /*
2006 * Secondary checks: always done, but change 'ret' only if it was 0
2007 */
Hanno Becker68636192019-02-05 14:36:34 +00002008
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002009# if defined(MBEDTLS_ECP_C)
Hanno Becker68636192019-02-05 14:36:34 +00002010 {
2011 const mbedtls_pk_context *pk = &chain->pk;
2012
2013 /* If certificate uses an EC key, make sure the curve is OK */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002014 if (mbedtls_pk_can_do(pk, MBEDTLS_PK_ECKEY) &&
2015 mbedtls_ssl_check_curve(ssl, mbedtls_pk_ec(*pk)->grp.id) != 0) {
2016 ssl->session_negotiate->verify_result |=
2017 MBEDTLS_X509_BADCERT_BAD_KEY;
Hanno Becker68636192019-02-05 14:36:34 +00002018
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002019 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate (EC key curve)"));
2020 if (ret == 0)
Hanno Becker9ed1ba52021-06-24 11:03:13 +01002021 ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
Hanno Becker68636192019-02-05 14:36:34 +00002022 }
2023 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002024# endif /* MBEDTLS_ECP_C */
Hanno Becker68636192019-02-05 14:36:34 +00002025
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002026 if (mbedtls_ssl_check_cert_usage(
2027 chain, ciphersuite_info, !ssl->conf->endpoint,
2028 &ssl->session_negotiate->verify_result) != 0) {
2029 MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate (usage extensions)"));
2030 if (ret == 0)
Hanno Becker9ed1ba52021-06-24 11:03:13 +01002031 ret = MBEDTLS_ERR_SSL_BAD_CERTIFICATE;
Hanno Becker68636192019-02-05 14:36:34 +00002032 }
2033
2034 /* mbedtls_x509_crt_verify_with_profile is supposed to report a
2035 * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,
2036 * with details encoded in the verification flags. All other kinds
2037 * of error codes, including those from the user provided f_vrfy
2038 * functions, are treated as fatal and lead to a failure of
2039 * ssl_parse_certificate even if verification was optional. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002040 if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&
2041 (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||
2042 ret == MBEDTLS_ERR_SSL_BAD_CERTIFICATE)) {
Hanno Becker68636192019-02-05 14:36:34 +00002043 ret = 0;
2044 }
2045
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002046 if (have_ca_chain == 0 && authmode == MBEDTLS_SSL_VERIFY_REQUIRED) {
2047 MBEDTLS_SSL_DEBUG_MSG(1, ("got no CA chain"));
Hanno Becker68636192019-02-05 14:36:34 +00002048 ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
2049 }
2050
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002051 if (ret != 0) {
Hanno Becker68636192019-02-05 14:36:34 +00002052 uint8_t alert;
2053
2054 /* The certificate may have been rejected for several reasons.
2055 Pick one and send the corresponding alert. Which alert to send
2056 may be a subject of debate in some cases. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002057 if (ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER)
Hanno Becker68636192019-02-05 14:36:34 +00002058 alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002059 else if (ssl->session_negotiate->verify_result &
2060 MBEDTLS_X509_BADCERT_CN_MISMATCH)
Hanno Becker68636192019-02-05 14:36:34 +00002061 alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002062 else if (ssl->session_negotiate->verify_result &
2063 MBEDTLS_X509_BADCERT_KEY_USAGE)
Hanno Becker68636192019-02-05 14:36:34 +00002064 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002065 else if (ssl->session_negotiate->verify_result &
2066 MBEDTLS_X509_BADCERT_EXT_KEY_USAGE)
Hanno Becker68636192019-02-05 14:36:34 +00002067 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002068 else if (ssl->session_negotiate->verify_result &
2069 MBEDTLS_X509_BADCERT_NS_CERT_TYPE)
Hanno Becker68636192019-02-05 14:36:34 +00002070 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002071 else if (ssl->session_negotiate->verify_result &
2072 MBEDTLS_X509_BADCERT_BAD_PK)
Hanno Becker68636192019-02-05 14:36:34 +00002073 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002074 else if (ssl->session_negotiate->verify_result &
2075 MBEDTLS_X509_BADCERT_BAD_KEY)
Hanno Becker68636192019-02-05 14:36:34 +00002076 alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002077 else if (ssl->session_negotiate->verify_result &
2078 MBEDTLS_X509_BADCERT_EXPIRED)
Hanno Becker68636192019-02-05 14:36:34 +00002079 alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002080 else if (ssl->session_negotiate->verify_result &
2081 MBEDTLS_X509_BADCERT_REVOKED)
Hanno Becker68636192019-02-05 14:36:34 +00002082 alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002083 else if (ssl->session_negotiate->verify_result &
2084 MBEDTLS_X509_BADCERT_NOT_TRUSTED)
Hanno Becker68636192019-02-05 14:36:34 +00002085 alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA;
2086 else
2087 alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002088 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2089 alert);
Hanno Becker68636192019-02-05 14:36:34 +00002090 }
2091
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002092# if defined(MBEDTLS_DEBUG_C)
2093 if (ssl->session_negotiate->verify_result != 0) {
2094 MBEDTLS_SSL_DEBUG_MSG(
2095 3, ("! Certificate verification flags %08x",
2096 (unsigned int)ssl->session_negotiate->verify_result));
2097 } else {
2098 MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate verification flags clear"));
Hanno Becker68636192019-02-05 14:36:34 +00002099 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002100# endif /* MBEDTLS_DEBUG_C */
Hanno Becker68636192019-02-05 14:36:34 +00002101
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002102 return ret;
Hanno Becker68636192019-02-05 14:36:34 +00002103}
2104
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002105# if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2106static int ssl_remember_peer_crt_digest(mbedtls_ssl_context *ssl,
2107 unsigned char *start,
2108 size_t len)
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002109{
Janos Follath865b3eb2019-12-16 11:46:15 +00002110 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002111 /* Remember digest of the peer's end-CRT. */
2112 ssl->session_negotiate->peer_cert_digest =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002113 mbedtls_calloc(1, MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN);
2114 if (ssl->session_negotiate->peer_cert_digest == NULL) {
2115 MBEDTLS_SSL_DEBUG_MSG(1, ("alloc(%d bytes) failed",
2116 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN));
2117 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2118 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002119
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002120 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002121 }
2122
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002123 ret = mbedtls_md(
2124 mbedtls_md_info_from_type(MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE), start,
2125 len, ssl->session_negotiate->peer_cert_digest);
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002126
2127 ssl->session_negotiate->peer_cert_digest_type =
2128 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_TYPE;
2129 ssl->session_negotiate->peer_cert_digest_len =
2130 MBEDTLS_SSL_PEER_CERT_DIGEST_DFL_LEN;
2131
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002132 return ret;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002133}
2134
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002135static int ssl_remember_peer_pubkey(mbedtls_ssl_context *ssl,
2136 unsigned char *start,
2137 size_t len)
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002138{
2139 unsigned char *end = start + len;
Janos Follath865b3eb2019-12-16 11:46:15 +00002140 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002141
2142 /* Make a copy of the peer's raw public key. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002143 mbedtls_pk_init(&ssl->handshake->peer_pubkey);
2144 ret = mbedtls_pk_parse_subpubkey(&start, end, &ssl->handshake->peer_pubkey);
2145 if (ret != 0) {
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002146 /* We should have parsed the public key before. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002147 return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002148 }
2149
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002150 return 0;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002151}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002152# endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002153
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002154int mbedtls_ssl_parse_certificate(mbedtls_ssl_context *ssl)
Hanno Becker68636192019-02-05 14:36:34 +00002155{
2156 int ret = 0;
Hanno Becker28f2fcd2019-02-07 10:11:07 +00002157 int crt_expected;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002158# if defined(MBEDTLS_SSL_SRV_C) && \
2159 defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
2160 const int authmode = ssl->handshake->sni_authmode !=
2161 MBEDTLS_SSL_VERIFY_UNSET ?
2162 ssl->handshake->sni_authmode :
2163 ssl->conf->authmode;
2164# else
Johan Pascal4f099262020-09-22 10:59:26 +02002165 const int authmode = ssl->conf->authmode;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002166# endif
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002167 void *rs_ctx = NULL;
Hanno Becker3dad3112019-02-05 17:19:52 +00002168 mbedtls_x509_crt *chain = NULL;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002169
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002170 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate"));
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002171
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002172 crt_expected = ssl_parse_certificate_coordinate(ssl, authmode);
2173 if (crt_expected == SSL_CERTIFICATE_SKIP) {
2174 MBEDTLS_SSL_DEBUG_MSG(2, ("<= skip parse certificate"));
Hanno Becker6bdfab22019-02-05 13:11:17 +00002175 goto exit;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002176 }
2177
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002178# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2179 if (ssl->handshake->ecrs_enabled &&
2180 ssl->handshake->ecrs_state == ssl_ecrs_crt_verify) {
Hanno Becker3dad3112019-02-05 17:19:52 +00002181 chain = ssl->handshake->ecrs_peer_cert;
2182 ssl->handshake->ecrs_peer_cert = NULL;
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002183 goto crt_verify;
2184 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002185# endif
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002186
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002187 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002188 /* mbedtls_ssl_read_record may have sent an alert already. We
2189 let it decide whether to alert. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002190 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
Hanno Becker3dad3112019-02-05 17:19:52 +00002191 goto exit;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002192 }
2193
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002194# if defined(MBEDTLS_SSL_SRV_C)
2195 if (ssl_srv_check_client_no_crt_notification(ssl) == 0) {
Hanno Becker4a55f632019-02-05 12:49:06 +00002196 ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
Hanno Becker4a55f632019-02-05 12:49:06 +00002197
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002198 if (authmode != MBEDTLS_SSL_VERIFY_OPTIONAL)
Hanno Becker6bdfab22019-02-05 13:11:17 +00002199 ret = MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
Hanno Becker4a55f632019-02-05 12:49:06 +00002200
Hanno Becker6bdfab22019-02-05 13:11:17 +00002201 goto exit;
Hanno Becker4a55f632019-02-05 12:49:06 +00002202 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002203# endif /* MBEDTLS_SSL_SRV_C */
Hanno Becker4a55f632019-02-05 12:49:06 +00002204
Hanno Beckerc7bd7802019-02-05 15:37:23 +00002205 /* Clear existing peer CRT structure in case we tried to
2206 * reuse a session but it failed, and allocate a new one. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002207 ssl_clear_peer_cert(ssl->session_negotiate);
Hanno Becker3dad3112019-02-05 17:19:52 +00002208
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002209 chain = mbedtls_calloc(1, sizeof(mbedtls_x509_crt));
2210 if (chain == NULL) {
2211 MBEDTLS_SSL_DEBUG_MSG(1,
2212 ("alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed",
2213 sizeof(mbedtls_x509_crt)));
2214 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2215 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
Hanno Becker7a955a02019-02-05 13:08:01 +00002216
Hanno Becker3dad3112019-02-05 17:19:52 +00002217 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
2218 goto exit;
2219 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002220 mbedtls_x509_crt_init(chain);
Hanno Becker3dad3112019-02-05 17:19:52 +00002221
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002222 ret = ssl_parse_certificate_chain(ssl, chain);
2223 if (ret != 0)
Hanno Becker3dad3112019-02-05 17:19:52 +00002224 goto exit;
Manuel Pégourié-Gonnardfed37ed2017-08-15 13:27:41 +02002225
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002226# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2227 if (ssl->handshake->ecrs_enabled)
Manuel Pégourié-Gonnard0b23f162017-08-24 12:08:33 +02002228 ssl->handshake->ecrs_state = ssl_ecrs_crt_verify;
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002229
2230crt_verify:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002231 if (ssl->handshake->ecrs_enabled)
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002232 rs_ctx = &ssl->handshake->ecrs_ctx;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002233# endif
Manuel Pégourié-Gonnard3bf49c42017-08-15 13:47:06 +02002234
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002235 ret = ssl_parse_certificate_verify(ssl, authmode, chain, rs_ctx);
2236 if (ret != 0)
Hanno Becker3dad3112019-02-05 17:19:52 +00002237 goto exit;
Paul Bakker5121ce52009-01-03 21:22:43 +00002238
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002239# if !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002240 {
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002241 unsigned char *crt_start, *pk_start;
2242 size_t crt_len, pk_len;
Hanno Becker3dad3112019-02-05 17:19:52 +00002243
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002244 /* We parse the CRT chain without copying, so
2245 * these pointers point into the input buffer,
2246 * and are hence still valid after freeing the
2247 * CRT chain. */
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002248
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002249 crt_start = chain->raw.p;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002250 crt_len = chain->raw.len;
Hanno Becker6bbd94c2019-02-05 17:02:28 +00002251
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002252 pk_start = chain->pk_raw.p;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002253 pk_len = chain->pk_raw.len;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002254
2255 /* Free the CRT structures before computing
2256 * digest and copying the peer's public key. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002257 mbedtls_x509_crt_free(chain);
2258 mbedtls_free(chain);
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002259 chain = NULL;
2260
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002261 ret = ssl_remember_peer_crt_digest(ssl, crt_start, crt_len);
2262 if (ret != 0)
Hanno Beckera2747532019-02-06 16:19:04 +00002263 goto exit;
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002264
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002265 ret = ssl_remember_peer_pubkey(ssl, pk_start, pk_len);
2266 if (ret != 0)
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002267 goto exit;
Hanno Beckera2747532019-02-06 16:19:04 +00002268 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002269# else /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker6b8fbab2019-02-08 14:59:05 +00002270 /* Pass ownership to session structure. */
Hanno Becker3dad3112019-02-05 17:19:52 +00002271 ssl->session_negotiate->peer_cert = chain;
2272 chain = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002273# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Hanno Becker3dad3112019-02-05 17:19:52 +00002274
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002275 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002276
Hanno Becker6bdfab22019-02-05 13:11:17 +00002277exit:
2278
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002279 if (ret == 0)
Hanno Becker3dad3112019-02-05 17:19:52 +00002280 ssl->state++;
2281
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002282# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2283 if (ret == MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) {
Hanno Becker3dad3112019-02-05 17:19:52 +00002284 ssl->handshake->ecrs_peer_cert = chain;
2285 chain = NULL;
2286 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002287# endif
Hanno Becker3dad3112019-02-05 17:19:52 +00002288
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002289 if (chain != NULL) {
2290 mbedtls_x509_crt_free(chain);
2291 mbedtls_free(chain);
Hanno Becker3dad3112019-02-05 17:19:52 +00002292 }
2293
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002294 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002295}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002296# endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Paul Bakker5121ce52009-01-03 21:22:43 +00002297
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002298void mbedtls_ssl_optimize_checksum(
2299 mbedtls_ssl_context *ssl,
2300 const mbedtls_ssl_ciphersuite_t *ciphersuite_info)
Paul Bakker380da532012-04-18 16:10:25 +00002301{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002302 ((void)ciphersuite_info);
Paul Bakker769075d2012-11-24 11:26:46 +01002303
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002304# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2305# if defined(MBEDTLS_SHA384_C)
2306 if (ciphersuite_info->mac == MBEDTLS_MD_SHA384)
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002307 ssl->handshake->update_checksum = ssl_update_checksum_sha384;
2308 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002309# endif
2310# if defined(MBEDTLS_SHA256_C)
2311 if (ciphersuite_info->mac != MBEDTLS_MD_SHA384)
Paul Bakker48916f92012-09-16 19:57:18 +00002312 ssl->handshake->update_checksum = ssl_update_checksum_sha256;
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002313 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002314# endif
2315# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02002316 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002317 MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
Paul Bakkerd2f068e2013-08-27 21:19:20 +02002318 return;
Manuel Pégourié-Gonnard61edffe2014-04-11 17:07:31 +02002319 }
Paul Bakker380da532012-04-18 16:10:25 +00002320}
Paul Bakkerf7abd422013-04-16 13:15:56 +02002321
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002322void mbedtls_ssl_reset_checksum(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02002323{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002324# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2325# if defined(MBEDTLS_SHA256_C)
2326# if defined(MBEDTLS_USE_PSA_CRYPTO)
2327 psa_hash_abort(&ssl->handshake->fin_sha256_psa);
2328 psa_hash_setup(&ssl->handshake->fin_sha256_psa, PSA_ALG_SHA_256);
2329# else
2330 mbedtls_sha256_starts(&ssl->handshake->fin_sha256, 0);
2331# endif
2332# endif
2333# if defined(MBEDTLS_SHA384_C)
2334# if defined(MBEDTLS_USE_PSA_CRYPTO)
2335 psa_hash_abort(&ssl->handshake->fin_sha384_psa);
2336 psa_hash_setup(&ssl->handshake->fin_sha384_psa, PSA_ALG_SHA_384);
2337# else
2338 mbedtls_sha512_starts(&ssl->handshake->fin_sha512, 1);
2339# endif
2340# endif
2341# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard67427c02014-07-11 13:45:34 +02002342}
2343
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002344static void ssl_update_checksum_start(mbedtls_ssl_context *ssl,
2345 const unsigned char *buf,
2346 size_t len)
Paul Bakker380da532012-04-18 16:10:25 +00002347{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002348# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2349# if defined(MBEDTLS_SHA256_C)
2350# if defined(MBEDTLS_USE_PSA_CRYPTO)
2351 psa_hash_update(&ssl->handshake->fin_sha256_psa, buf, len);
2352# else
2353 mbedtls_sha256_update(&ssl->handshake->fin_sha256, buf, len);
2354# endif
2355# endif
2356# if defined(MBEDTLS_SHA384_C)
2357# if defined(MBEDTLS_USE_PSA_CRYPTO)
2358 psa_hash_update(&ssl->handshake->fin_sha384_psa, buf, len);
2359# else
2360 mbedtls_sha512_update(&ssl->handshake->fin_sha512, buf, len);
2361# endif
2362# endif
2363# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00002364}
2365
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002366# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2367# if defined(MBEDTLS_SHA256_C)
2368static void ssl_update_checksum_sha256(mbedtls_ssl_context *ssl,
2369 const unsigned char *buf,
2370 size_t len)
Paul Bakker380da532012-04-18 16:10:25 +00002371{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002372# if defined(MBEDTLS_USE_PSA_CRYPTO)
2373 psa_hash_update(&ssl->handshake->fin_sha256_psa, buf, len);
2374# else
2375 mbedtls_sha256_update(&ssl->handshake->fin_sha256, buf, len);
2376# endif
Paul Bakker380da532012-04-18 16:10:25 +00002377}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002378# endif
Paul Bakker380da532012-04-18 16:10:25 +00002379
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002380# if defined(MBEDTLS_SHA384_C)
2381static void ssl_update_checksum_sha384(mbedtls_ssl_context *ssl,
2382 const unsigned char *buf,
2383 size_t len)
Paul Bakker380da532012-04-18 16:10:25 +00002384{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002385# if defined(MBEDTLS_USE_PSA_CRYPTO)
2386 psa_hash_update(&ssl->handshake->fin_sha384_psa, buf, len);
2387# else
2388 mbedtls_sha512_update(&ssl->handshake->fin_sha512, buf, len);
2389# endif
Paul Bakker380da532012-04-18 16:10:25 +00002390}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002391# endif
2392# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakker380da532012-04-18 16:10:25 +00002393
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002394# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2395# if defined(MBEDTLS_SHA256_C)
2396static void ssl_calc_finished_tls_sha256(mbedtls_ssl_context *ssl,
2397 unsigned char *buf,
2398 int from)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002399{
2400 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002401 const char *sender;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002402 unsigned char padbuf[32];
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002403# if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurekeb342242019-01-29 09:14:33 -05002404 size_t hash_size;
Jaeden Amero34973232019-02-20 10:32:28 +00002405 psa_hash_operation_t sha256_psa = PSA_HASH_OPERATION_INIT;
Andrzej Kurekeb342242019-01-29 09:14:33 -05002406 psa_status_t status;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002407# else
Andrzej Kurekeb342242019-01-29 09:14:33 -05002408 mbedtls_sha256_context sha256;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002409# endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002410
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002411 mbedtls_ssl_session *session = ssl->session_negotiate;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002412 if (!session)
Paul Bakker48916f92012-09-16 19:57:18 +00002413 session = ssl->session;
2414
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002415 sender = (from == MBEDTLS_SSL_IS_CLIENT) ? "client finished" :
2416 "server finished";
Andrzej Kurekeb342242019-01-29 09:14:33 -05002417
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002418# if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurekeb342242019-01-29 09:14:33 -05002419 sha256_psa = psa_hash_operation_init();
2420
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002421 MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc PSA finished tls sha256"));
Andrzej Kurekeb342242019-01-29 09:14:33 -05002422
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002423 status = psa_hash_clone(&ssl->handshake->fin_sha256_psa, &sha256_psa);
2424 if (status != PSA_SUCCESS) {
2425 MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash clone failed"));
Andrzej Kurekeb342242019-01-29 09:14:33 -05002426 return;
2427 }
2428
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002429 status = psa_hash_finish(&sha256_psa, padbuf, sizeof(padbuf), &hash_size);
2430 if (status != PSA_SUCCESS) {
2431 MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash finish failed"));
Andrzej Kurekeb342242019-01-29 09:14:33 -05002432 return;
2433 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002434 MBEDTLS_SSL_DEBUG_BUF(3, "PSA calculated padbuf", padbuf, 32);
2435# else
Andrzej Kurekeb342242019-01-29 09:14:33 -05002436
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002437 mbedtls_sha256_init(&sha256);
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02002438
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002439 MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc finished tls sha256"));
Paul Bakker1ef83d62012-04-11 12:09:53 +00002440
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002441 mbedtls_sha256_clone(&sha256, &ssl->handshake->fin_sha256);
Paul Bakker1ef83d62012-04-11 12:09:53 +00002442
2443 /*
2444 * TLSv1.2:
2445 * hash = PRF( master, finished_label,
2446 * Hash( handshake ) )[0.11]
2447 */
2448
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002449# if !defined(MBEDTLS_SHA256_ALT)
2450 MBEDTLS_SSL_DEBUG_BUF(4, "finished sha2 state",
2451 (unsigned char *)sha256.state, sizeof(sha256.state));
2452# endif
Paul Bakker1ef83d62012-04-11 12:09:53 +00002453
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002454 mbedtls_sha256_finish(&sha256, padbuf);
2455 mbedtls_sha256_free(&sha256);
2456# endif /* MBEDTLS_USE_PSA_CRYPTO */
Paul Bakker1ef83d62012-04-11 12:09:53 +00002457
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002458 ssl->handshake->tls_prf(session->master, 48, sender, padbuf, 32, buf, len);
Paul Bakker1ef83d62012-04-11 12:09:53 +00002459
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002460 MBEDTLS_SSL_DEBUG_BUF(3, "calc finished result", buf, len);
Paul Bakker1ef83d62012-04-11 12:09:53 +00002461
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002462 mbedtls_platform_zeroize(padbuf, sizeof(padbuf));
Paul Bakker1ef83d62012-04-11 12:09:53 +00002463
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002464 MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc finished"));
Paul Bakker1ef83d62012-04-11 12:09:53 +00002465}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002466# endif /* MBEDTLS_SHA256_C */
Paul Bakker1ef83d62012-04-11 12:09:53 +00002467
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002468# if defined(MBEDTLS_SHA384_C)
Rodrigo Dias Corread596ca82020-11-25 00:42:28 -03002469
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002470static void ssl_calc_finished_tls_sha384(mbedtls_ssl_context *ssl,
2471 unsigned char *buf,
2472 int from)
Paul Bakkerca4ab492012-04-18 14:23:57 +00002473{
2474 int len = 12;
Paul Bakker3c2122f2013-06-24 19:03:14 +02002475 const char *sender;
Rodrigo Dias Corread596ca82020-11-25 00:42:28 -03002476 unsigned char padbuf[48];
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002477# if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurekeb342242019-01-29 09:14:33 -05002478 size_t hash_size;
Jaeden Amero34973232019-02-20 10:32:28 +00002479 psa_hash_operation_t sha384_psa = PSA_HASH_OPERATION_INIT;
Andrzej Kurekeb342242019-01-29 09:14:33 -05002480 psa_status_t status;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002481# else
Andrzej Kurekeb342242019-01-29 09:14:33 -05002482 mbedtls_sha512_context sha512;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002483# endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002484
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002485 mbedtls_ssl_session *session = ssl->session_negotiate;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002486 if (!session)
Paul Bakker48916f92012-09-16 19:57:18 +00002487 session = ssl->session;
2488
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002489 sender = (from == MBEDTLS_SSL_IS_CLIENT) ? "client finished" :
2490 "server finished";
Andrzej Kurekeb342242019-01-29 09:14:33 -05002491
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002492# if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05002493 sha384_psa = psa_hash_operation_init();
Andrzej Kurekeb342242019-01-29 09:14:33 -05002494
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002495 MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc PSA finished tls sha384"));
Andrzej Kurekeb342242019-01-29 09:14:33 -05002496
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002497 status = psa_hash_clone(&ssl->handshake->fin_sha384_psa, &sha384_psa);
2498 if (status != PSA_SUCCESS) {
2499 MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash clone failed"));
Andrzej Kurekeb342242019-01-29 09:14:33 -05002500 return;
2501 }
2502
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002503 status = psa_hash_finish(&sha384_psa, padbuf, sizeof(padbuf), &hash_size);
2504 if (status != PSA_SUCCESS) {
2505 MBEDTLS_SSL_DEBUG_MSG(2, ("PSA hash finish failed"));
Andrzej Kurekeb342242019-01-29 09:14:33 -05002506 return;
2507 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002508 MBEDTLS_SSL_DEBUG_BUF(3, "PSA calculated padbuf", padbuf, 48);
2509# else
2510 mbedtls_sha512_init(&sha512);
Manuel Pégourié-Gonnard001f2b62015-07-06 16:21:13 +02002511
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002512 MBEDTLS_SSL_DEBUG_MSG(2, ("=> calc finished tls sha384"));
Paul Bakkerca4ab492012-04-18 14:23:57 +00002513
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002514 mbedtls_sha512_clone(&sha512, &ssl->handshake->fin_sha512);
Paul Bakkerca4ab492012-04-18 14:23:57 +00002515
2516 /*
2517 * TLSv1.2:
2518 * hash = PRF( master, finished_label,
2519 * Hash( handshake ) )[0.11]
2520 */
2521
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002522# if !defined(MBEDTLS_SHA512_ALT)
2523 MBEDTLS_SSL_DEBUG_BUF(4, "finished sha512 state",
2524 (unsigned char *)sha512.state, sizeof(sha512.state));
2525# endif
2526 mbedtls_sha512_finish(&sha512, padbuf);
Paul Bakkerca4ab492012-04-18 14:23:57 +00002527
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002528 mbedtls_sha512_free(&sha512);
2529# endif
Paul Bakkerca4ab492012-04-18 14:23:57 +00002530
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002531 ssl->handshake->tls_prf(session->master, 48, sender, padbuf, 48, buf, len);
Paul Bakkerca4ab492012-04-18 14:23:57 +00002532
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002533 MBEDTLS_SSL_DEBUG_BUF(3, "calc finished result", buf, len);
Paul Bakkerca4ab492012-04-18 14:23:57 +00002534
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002535 mbedtls_platform_zeroize(padbuf, sizeof(padbuf));
Paul Bakkerca4ab492012-04-18 14:23:57 +00002536
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002537 MBEDTLS_SSL_DEBUG_MSG(2, ("<= calc finished"));
Paul Bakkerca4ab492012-04-18 14:23:57 +00002538}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002539# endif /* MBEDTLS_SHA384_C */
2540# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkerca4ab492012-04-18 14:23:57 +00002541
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002542void mbedtls_ssl_handshake_wrapup_free_hs_transform(mbedtls_ssl_context *ssl)
Paul Bakker48916f92012-09-16 19:57:18 +00002543{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002544 MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup: final free"));
Paul Bakker48916f92012-09-16 19:57:18 +00002545
2546 /*
2547 * Free our handshake params
2548 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002549 mbedtls_ssl_handshake_free(ssl);
2550 mbedtls_free(ssl->handshake);
Paul Bakker48916f92012-09-16 19:57:18 +00002551 ssl->handshake = NULL;
2552
2553 /*
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02002554 * Free the previous transform and swith in the current one
Paul Bakker48916f92012-09-16 19:57:18 +00002555 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002556 if (ssl->transform) {
2557 mbedtls_ssl_transform_free(ssl->transform);
2558 mbedtls_free(ssl->transform);
Paul Bakker48916f92012-09-16 19:57:18 +00002559 }
2560 ssl->transform = ssl->transform_negotiate;
2561 ssl->transform_negotiate = NULL;
2562
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002563 MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup: final free"));
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02002564}
2565
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002566void mbedtls_ssl_handshake_wrapup(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02002567{
2568 int resume = ssl->handshake->resume;
2569
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002570 MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup"));
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02002571
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002572# if defined(MBEDTLS_SSL_RENEGOTIATION)
2573 if (ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
2574 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE;
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02002575 ssl->renego_records_seen = 0;
2576 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002577# endif
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02002578
2579 /*
2580 * Free the previous session and switch in the current one
2581 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002582 if (ssl->session) {
2583# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnard1a034732014-11-04 17:36:18 +01002584 /* RFC 7366 3.1: keep the EtM state */
2585 ssl->session_negotiate->encrypt_then_mac =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002586 ssl->session->encrypt_then_mac;
2587# endif
Manuel Pégourié-Gonnard1a034732014-11-04 17:36:18 +01002588
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002589 mbedtls_ssl_session_free(ssl->session);
2590 mbedtls_free(ssl->session);
Paul Bakker0a597072012-09-25 21:55:46 +00002591 }
2592 ssl->session = ssl->session_negotiate;
Paul Bakker48916f92012-09-16 19:57:18 +00002593 ssl->session_negotiate = NULL;
2594
Paul Bakker0a597072012-09-25 21:55:46 +00002595 /*
2596 * Add cache entry
2597 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002598 if (ssl->conf->f_set_cache != NULL && ssl->session->id_len != 0 &&
2599 resume == 0) {
2600 if (ssl->conf->f_set_cache(ssl->conf->p_cache, ssl->session->id,
2601 ssl->session->id_len, ssl->session) != 0)
2602 MBEDTLS_SSL_DEBUG_MSG(1, ("cache did not store session"));
Manuel Pégourié-Gonnardc086cce2013-08-02 14:13:02 +02002603 }
Paul Bakker0a597072012-09-25 21:55:46 +00002604
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002605# if defined(MBEDTLS_SSL_PROTO_DTLS)
2606 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2607 ssl->handshake->flight != NULL) {
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02002608 /* Cancel handshake timer */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002609 mbedtls_ssl_set_timer(ssl, 0);
Manuel Pégourié-Gonnard6b651412014-10-01 18:29:03 +02002610
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02002611 /* Keep last flight around in case we need to resend it:
2612 * we need the handshake and transform structures for that */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002613 MBEDTLS_SSL_DEBUG_MSG(3, ("skip freeing handshake and transform"));
2614 } else
2615# endif
2616 mbedtls_ssl_handshake_wrapup_free_hs_transform(ssl);
Manuel Pégourié-Gonnardabf16242014-09-23 09:42:16 +02002617
Paul Bakker48916f92012-09-16 19:57:18 +00002618 ssl->state++;
2619
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002620 MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup"));
Paul Bakker48916f92012-09-16 19:57:18 +00002621}
2622
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002623int mbedtls_ssl_write_finished(mbedtls_ssl_context *ssl)
Paul Bakker1ef83d62012-04-11 12:09:53 +00002624{
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02002625 int ret, hash_len;
Paul Bakker1ef83d62012-04-11 12:09:53 +00002626
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002627 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write finished"));
Paul Bakker1ef83d62012-04-11 12:09:53 +00002628
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002629 mbedtls_ssl_update_out_pointers(ssl, ssl->transform_negotiate);
Paul Bakker92be97b2013-01-02 17:30:03 +01002630
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002631 ssl->handshake->calc_finished(ssl, ssl->out_msg + 4, ssl->conf->endpoint);
Paul Bakker1ef83d62012-04-11 12:09:53 +00002632
Manuel Pégourié-Gonnard214a8482016-02-22 11:27:26 +01002633 /*
2634 * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites
2635 * may define some other value. Currently (early 2016), no defined
2636 * ciphersuite does this (and this is unlikely to change as activity has
2637 * moved to TLS 1.3 now) so we can keep the hardcoded 12 here.
2638 */
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002639 hash_len = 12;
Paul Bakker5121ce52009-01-03 21:22:43 +00002640
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002641# if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00002642 ssl->verify_data_len = hash_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002643 memcpy(ssl->own_verify_data, ssl->out_msg + 4, hash_len);
2644# endif
Paul Bakker48916f92012-09-16 19:57:18 +00002645
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002646 ssl->out_msglen = 4 + hash_len;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002647 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002648 ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED;
Paul Bakker5121ce52009-01-03 21:22:43 +00002649
2650 /*
2651 * In case of session resuming, invert the client and server
2652 * ChangeCipherSpec messages order.
2653 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002654 if (ssl->handshake->resume != 0) {
2655# if defined(MBEDTLS_SSL_CLI_C)
2656 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002657 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002658# endif
2659# if defined(MBEDTLS_SSL_SRV_C)
2660 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002661 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002662# endif
2663 } else
Paul Bakker5121ce52009-01-03 21:22:43 +00002664 ssl->state++;
2665
Paul Bakker48916f92012-09-16 19:57:18 +00002666 /*
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02002667 * Switch to our negotiated transform and session parameters for outbound
2668 * data.
Paul Bakker48916f92012-09-16 19:57:18 +00002669 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002670 MBEDTLS_SSL_DEBUG_MSG(
2671 3, ("switching to new transform spec for outbound data"));
Manuel Pégourié-Gonnard5afb1672014-02-16 18:33:22 +01002672
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002673# if defined(MBEDTLS_SSL_PROTO_DTLS)
2674 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02002675 unsigned char i;
2676
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002677 /* Remember current epoch settings for resending */
2678 ssl->handshake->alt_transform_out = ssl->transform_out;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002679 memcpy(ssl->handshake->alt_out_ctr, ssl->cur_out_ctr, 8);
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002680
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02002681 /* Set sequence_number to zero */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002682 memset(ssl->cur_out_ctr + 2, 0, 6);
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02002683
2684 /* Increment epoch */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002685 for (i = 2; i > 0; i--)
2686 if (++ssl->cur_out_ctr[i - 1] != 0)
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02002687 break;
2688
2689 /* The loop goes to its end iff the counter is wrapping */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002690 if (i == 0) {
2691 MBEDTLS_SSL_DEBUG_MSG(1, ("DTLS epoch would wrap"));
2692 return MBEDTLS_ERR_SSL_COUNTER_WRAPPING;
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02002693 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002694 } else
2695# endif /* MBEDTLS_SSL_PROTO_DTLS */
2696 memset(ssl->cur_out_ctr, 0, 8);
Paul Bakker5121ce52009-01-03 21:22:43 +00002697
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002698 ssl->transform_out = ssl->transform_negotiate;
2699 ssl->session_out = ssl->session_negotiate;
2700
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002701# if defined(MBEDTLS_SSL_PROTO_DTLS)
2702 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM)
2703 mbedtls_ssl_send_flight_completed(ssl);
2704# endif
Manuel Pégourié-Gonnard7de3c9e2014-09-29 15:29:48 +02002705
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002706 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
2707 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
2708 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002709 }
2710
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002711# if defined(MBEDTLS_SSL_PROTO_DTLS)
2712 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
2713 (ret = mbedtls_ssl_flight_transmit(ssl)) != 0) {
2714 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_flight_transmit", ret);
2715 return ret;
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002716 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002717# endif
Manuel Pégourié-Gonnard87a346f2017-09-13 12:45:21 +02002718
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002719 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write finished"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002720
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002721 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002722}
2723
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002724# define SSL_MAX_HASH_LEN 12
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00002725
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002726int mbedtls_ssl_parse_finished(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00002727{
Janos Follath865b3eb2019-12-16 11:46:15 +00002728 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard879a4f92014-07-11 22:31:12 +02002729 unsigned int hash_len;
Manuel Pégourié-Gonnardca6440b2014-09-10 12:39:54 +00002730 unsigned char buf[SSL_MAX_HASH_LEN];
Paul Bakker5121ce52009-01-03 21:22:43 +00002731
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002732 MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse finished"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002733
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002734 ssl->handshake->calc_finished(ssl, buf, ssl->conf->endpoint ^ 1);
Paul Bakker5121ce52009-01-03 21:22:43 +00002735
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002736 if ((ret = mbedtls_ssl_read_record(ssl, 1)) != 0) {
2737 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
2738 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00002739 }
2740
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002741 if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE) {
2742 MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
2743 mbedtls_ssl_send_alert_message(
2744 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2745 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
2746 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002747 }
2748
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01002749 hash_len = 12;
Paul Bakker5121ce52009-01-03 21:22:43 +00002750
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002751 if (ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED) {
2752 mbedtls_ssl_send_alert_message(
2753 ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2754 MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE);
2755 return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
Hanno Beckera0ca87e2021-06-24 10:27:37 +01002756 }
2757
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002758 if (ssl->in_hslen != mbedtls_ssl_hs_hdr_len(ssl) + hash_len) {
2759 MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
2760 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2761 MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR);
2762 return MBEDTLS_ERR_SSL_DECODE_ERROR;
Paul Bakker5121ce52009-01-03 21:22:43 +00002763 }
2764
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002765 if (mbedtls_ssl_safer_memcmp(ssl->in_msg + mbedtls_ssl_hs_hdr_len(ssl), buf,
2766 hash_len) != 0) {
2767 MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
2768 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
2769 MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR);
2770 return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
Paul Bakker5121ce52009-01-03 21:22:43 +00002771 }
2772
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002773# if defined(MBEDTLS_SSL_RENEGOTIATION)
Paul Bakker48916f92012-09-16 19:57:18 +00002774 ssl->verify_data_len = hash_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002775 memcpy(ssl->peer_verify_data, buf, hash_len);
2776# endif
Paul Bakker48916f92012-09-16 19:57:18 +00002777
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002778 if (ssl->handshake->resume != 0) {
2779# if defined(MBEDTLS_SSL_CLI_C)
2780 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002781 ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002782# endif
2783# if defined(MBEDTLS_SSL_SRV_C)
2784 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02002785 ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002786# endif
2787 } else
Paul Bakker5121ce52009-01-03 21:22:43 +00002788 ssl->state++;
2789
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002790# if defined(MBEDTLS_SSL_PROTO_DTLS)
2791 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM)
2792 mbedtls_ssl_recv_flight_completed(ssl);
2793# endif
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002794
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002795 MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse finished"));
Paul Bakker5121ce52009-01-03 21:22:43 +00002796
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002797 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00002798}
2799
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002800static void ssl_handshake_params_init(mbedtls_ssl_handshake_params *handshake)
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002801{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002802 memset(handshake, 0, sizeof(mbedtls_ssl_handshake_params));
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002803
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002804# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
2805# if defined(MBEDTLS_SHA256_C)
2806# if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurekeb342242019-01-29 09:14:33 -05002807 handshake->fin_sha256_psa = psa_hash_operation_init();
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002808 psa_hash_setup(&handshake->fin_sha256_psa, PSA_ALG_SHA_256);
2809# else
2810 mbedtls_sha256_init(&handshake->fin_sha256);
2811 mbedtls_sha256_starts(&handshake->fin_sha256, 0);
2812# endif
2813# endif
2814# if defined(MBEDTLS_SHA384_C)
2815# if defined(MBEDTLS_USE_PSA_CRYPTO)
Andrzej Kurek972fba52019-01-30 03:29:12 -05002816 handshake->fin_sha384_psa = psa_hash_operation_init();
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002817 psa_hash_setup(&handshake->fin_sha384_psa, PSA_ALG_SHA_384);
2818# else
2819 mbedtls_sha512_init(&handshake->fin_sha512);
2820 mbedtls_sha512_starts(&handshake->fin_sha512, 1);
2821# endif
2822# endif
2823# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002824
2825 handshake->update_checksum = ssl_update_checksum_start;
Hanno Becker7e5437a2017-04-28 17:15:26 +01002826
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002827# if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
2828 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
2829 mbedtls_ssl_sig_hash_set_init(&handshake->hash_algs);
2830# endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002831
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002832# if defined(MBEDTLS_DHM_C)
2833 mbedtls_dhm_init(&handshake->dhm_ctx);
2834# endif
2835# if defined(MBEDTLS_ECDH_C)
2836 mbedtls_ecdh_init(&handshake->ecdh_ctx);
2837# endif
2838# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
2839 mbedtls_ecjpake_init(&handshake->ecjpake_ctx);
2840# if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02002841 handshake->ecjpake_cache = NULL;
2842 handshake->ecjpake_cache_len = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002843# endif
2844# endif
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002845
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002846# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
2847 mbedtls_x509_crt_restart_init(&handshake->ecrs_ctx);
2848# endif
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02002849
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002850# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02002851 handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002852# endif
Hanno Becker75173122019-02-06 16:18:31 +00002853
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002854# if defined(MBEDTLS_X509_CRT_PARSE_C) && \
2855 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
2856 mbedtls_pk_init(&handshake->peer_pubkey);
2857# endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002858}
2859
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002860void mbedtls_ssl_transform_init(mbedtls_ssl_transform *transform)
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002861{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002862 memset(transform, 0, sizeof(mbedtls_ssl_transform));
Paul Bakker84bbeb52014-07-01 14:53:22 +02002863
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002864 mbedtls_cipher_init(&transform->cipher_ctx_enc);
2865 mbedtls_cipher_init(&transform->cipher_ctx_dec);
Paul Bakker84bbeb52014-07-01 14:53:22 +02002866
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002867# if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
2868 mbedtls_md_init(&transform->md_ctx_enc);
2869 mbedtls_md_init(&transform->md_ctx_dec);
2870# endif
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002871}
2872
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002873void mbedtls_ssl_session_init(mbedtls_ssl_session *session)
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002874{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002875 memset(session, 0, sizeof(mbedtls_ssl_session));
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002876}
2877
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002878static int ssl_handshake_init(mbedtls_ssl_context *ssl)
Paul Bakker48916f92012-09-16 19:57:18 +00002879{
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002880 /* Clear old handshake information if present */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002881 if (ssl->transform_negotiate)
2882 mbedtls_ssl_transform_free(ssl->transform_negotiate);
2883 if (ssl->session_negotiate)
2884 mbedtls_ssl_session_free(ssl->session_negotiate);
2885 if (ssl->handshake)
2886 mbedtls_ssl_handshake_free(ssl);
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002887
2888 /*
2889 * Either the pointers are now NULL or cleared properly and can be freed.
2890 * Now allocate missing structures.
2891 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002892 if (ssl->transform_negotiate == NULL) {
2893 ssl->transform_negotiate =
2894 mbedtls_calloc(1, sizeof(mbedtls_ssl_transform));
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002895 }
Paul Bakker48916f92012-09-16 19:57:18 +00002896
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002897 if (ssl->session_negotiate == NULL) {
2898 ssl->session_negotiate = mbedtls_calloc(1, sizeof(mbedtls_ssl_session));
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002899 }
Paul Bakker48916f92012-09-16 19:57:18 +00002900
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002901 if (ssl->handshake == NULL) {
2902 ssl->handshake =
2903 mbedtls_calloc(1, sizeof(mbedtls_ssl_handshake_params));
Paul Bakkerb9cfaa02013-10-11 18:58:55 +02002904 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002905# if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05002906 /* If the buffers are too small - reallocate */
Andrzej Kurek8ea68722020-04-03 06:40:47 -04002907
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002908 handle_buffer_resizing(ssl, 0, MBEDTLS_SSL_IN_BUFFER_LEN,
2909 MBEDTLS_SSL_OUT_BUFFER_LEN);
2910# endif
Paul Bakker48916f92012-09-16 19:57:18 +00002911
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002912 /* All pointers should exist and can be directly freed without issue */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002913 if (ssl->handshake == NULL || ssl->transform_negotiate == NULL ||
2914 ssl->session_negotiate == NULL) {
2915 MBEDTLS_SSL_DEBUG_MSG(1, ("alloc() of ssl sub-contexts failed"));
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002916
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002917 mbedtls_free(ssl->handshake);
2918 mbedtls_free(ssl->transform_negotiate);
2919 mbedtls_free(ssl->session_negotiate);
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002920
2921 ssl->handshake = NULL;
2922 ssl->transform_negotiate = NULL;
2923 ssl->session_negotiate = NULL;
2924
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002925 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Paul Bakker48916f92012-09-16 19:57:18 +00002926 }
2927
Paul Bakkeraccaffe2014-06-26 13:37:14 +02002928 /* Initialize structures */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002929 mbedtls_ssl_session_init(ssl->session_negotiate);
2930 mbedtls_ssl_transform_init(ssl->transform_negotiate);
2931 ssl_handshake_params_init(ssl->handshake);
Paul Bakker968afaa2014-07-09 11:09:24 +02002932
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002933# if defined(MBEDTLS_SSL_PROTO_DTLS)
2934 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02002935 ssl->handshake->alt_transform_out = ssl->transform_out;
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002936
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002937 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT)
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02002938 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;
2939 else
2940 ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02002941
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002942 mbedtls_ssl_set_timer(ssl, 0);
Manuel Pégourié-Gonnard06939ce2015-05-11 11:25:46 +02002943 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002944# endif
Manuel Pégourié-Gonnard5d8ba532014-09-19 15:09:21 +02002945
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002946 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +00002947}
2948
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002949# if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002950/* Dummy cookie callbacks for defaults */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002951static int ssl_cookie_write_dummy(void *ctx,
2952 unsigned char **p,
2953 unsigned char *end,
2954 const unsigned char *cli_id,
2955 size_t cli_id_len)
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002956{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002957 ((void)ctx);
2958 ((void)p);
2959 ((void)end);
2960 ((void)cli_id);
2961 ((void)cli_id_len);
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002962
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002963 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002964}
2965
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002966static int ssl_cookie_check_dummy(void *ctx,
2967 const unsigned char *cookie,
2968 size_t cookie_len,
2969 const unsigned char *cli_id,
2970 size_t cli_id_len)
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002971{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002972 ((void)ctx);
2973 ((void)cookie);
2974 ((void)cookie_len);
2975 ((void)cli_id);
2976 ((void)cli_id_len);
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002977
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002978 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002979}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002980# endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard7d38d212014-07-23 17:52:09 +02002981
Paul Bakker5121ce52009-01-03 21:22:43 +00002982/*
2983 * Initialize an SSL context
2984 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002985void mbedtls_ssl_init(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002986{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002987 memset(ssl, 0, sizeof(mbedtls_ssl_context));
Manuel Pégourié-Gonnard41d479e2015-04-29 00:48:22 +02002988}
2989
2990/*
2991 * Setup an SSL context
2992 */
Hanno Becker2a43f6f2018-08-10 11:12:52 +01002993
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02002994int mbedtls_ssl_setup(mbedtls_ssl_context *ssl, const mbedtls_ssl_config *conf)
Paul Bakker5121ce52009-01-03 21:22:43 +00002995{
Janos Follath865b3eb2019-12-16 11:46:15 +00002996 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Darryl Greenb33cc762019-11-28 14:29:44 +00002997 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
2998 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
Paul Bakker5121ce52009-01-03 21:22:43 +00002999
Manuel Pégourié-Gonnarddef0bbe2015-05-04 14:56:36 +02003000 ssl->conf = conf;
Paul Bakker62f2dee2012-09-28 07:31:51 +00003001
3002 /*
Manuel Pégourié-Gonnard06193482014-02-14 08:39:32 +01003003 * Prepare base structures
Paul Bakker62f2dee2012-09-28 07:31:51 +00003004 */
k-stachowiakc9a5f022018-07-24 13:53:31 +02003005
3006 /* Set to NULL in case of an error condition */
3007 ssl->out_buf = NULL;
k-stachowiaka47911c2018-07-04 17:41:58 +02003008
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003009# if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Darryl Greenb33cc762019-11-28 14:29:44 +00003010 ssl->in_buf_len = in_buf_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003011# endif
3012 ssl->in_buf = mbedtls_calloc(1, in_buf_len);
3013 if (ssl->in_buf == NULL) {
3014 MBEDTLS_SSL_DEBUG_MSG(
3015 1, ("alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", in_buf_len));
k-stachowiak9f7798e2018-07-31 16:52:32 +02003016 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02003017 goto error;
Angus Grattond8213d02016-05-25 20:56:48 +10003018 }
3019
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003020# if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Darryl Greenb33cc762019-11-28 14:29:44 +00003021 ssl->out_buf_len = out_buf_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003022# endif
3023 ssl->out_buf = mbedtls_calloc(1, out_buf_len);
3024 if (ssl->out_buf == NULL) {
3025 MBEDTLS_SSL_DEBUG_MSG(
3026 1, ("alloc(%" MBEDTLS_PRINTF_SIZET " bytes) failed", out_buf_len));
k-stachowiak9f7798e2018-07-31 16:52:32 +02003027 ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
k-stachowiaka47911c2018-07-04 17:41:58 +02003028 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00003029 }
3030
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003031 mbedtls_ssl_reset_in_out_pointers(ssl);
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02003032
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003033# if defined(MBEDTLS_SSL_DTLS_SRTP)
3034 memset(&ssl->dtls_srtp_info, 0, sizeof(ssl->dtls_srtp_info));
3035# endif
Johan Pascalb62bb512015-12-03 21:56:45 +01003036
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003037 if ((ret = ssl_handshake_init(ssl)) != 0)
k-stachowiaka47911c2018-07-04 17:41:58 +02003038 goto error;
Paul Bakker5121ce52009-01-03 21:22:43 +00003039
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003040 return 0;
k-stachowiaka47911c2018-07-04 17:41:58 +02003041
3042error:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003043 mbedtls_free(ssl->in_buf);
3044 mbedtls_free(ssl->out_buf);
k-stachowiaka47911c2018-07-04 17:41:58 +02003045
3046 ssl->conf = NULL;
3047
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003048# if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Darryl Greenb33cc762019-11-28 14:29:44 +00003049 ssl->in_buf_len = 0;
3050 ssl->out_buf_len = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003051# endif
k-stachowiaka47911c2018-07-04 17:41:58 +02003052 ssl->in_buf = NULL;
3053 ssl->out_buf = NULL;
3054
3055 ssl->in_hdr = NULL;
3056 ssl->in_ctr = NULL;
3057 ssl->in_len = NULL;
3058 ssl->in_iv = NULL;
3059 ssl->in_msg = NULL;
3060
3061 ssl->out_hdr = NULL;
3062 ssl->out_ctr = NULL;
3063 ssl->out_len = NULL;
3064 ssl->out_iv = NULL;
3065 ssl->out_msg = NULL;
3066
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003067 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00003068}
3069
3070/*
Paul Bakker7eb013f2011-10-06 12:37:39 +00003071 * Reset an initialized and used SSL context for re-use while retaining
3072 * all application-set variables, function pointers and data.
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02003073 *
3074 * If partial is non-zero, keep data in the input buffer and client ID.
3075 * (Use when a DTLS client reconnects from the same port.)
Paul Bakker7eb013f2011-10-06 12:37:39 +00003076 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003077int mbedtls_ssl_session_reset_int(mbedtls_ssl_context *ssl, int partial)
Paul Bakker7eb013f2011-10-06 12:37:39 +00003078{
Janos Follath865b3eb2019-12-16 11:46:15 +00003079 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003080# if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Darryl Greenb33cc762019-11-28 14:29:44 +00003081 size_t in_buf_len = ssl->in_buf_len;
3082 size_t out_buf_len = ssl->out_buf_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003083# else
Darryl Greenb33cc762019-11-28 14:29:44 +00003084 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
3085 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003086# endif
Paul Bakker48916f92012-09-16 19:57:18 +00003087
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003088# if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || \
3089 !defined(MBEDTLS_SSL_SRV_C)
3090 ((void)partial);
3091# endif
Hanno Becker7e772132018-08-10 12:38:21 +01003092
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003093 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003094
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02003095 /* Cancel any possibly running timer */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003096 mbedtls_ssl_set_timer(ssl, 0);
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02003097
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003098# if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003099 ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003100 ssl->renego_records_seen = 0;
Paul Bakker48916f92012-09-16 19:57:18 +00003101
3102 ssl->verify_data_len = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003103 memset(ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN);
3104 memset(ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN);
3105# endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02003106 ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION;
Paul Bakker48916f92012-09-16 19:57:18 +00003107
Paul Bakker7eb013f2011-10-06 12:37:39 +00003108 ssl->in_offt = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003109 mbedtls_ssl_reset_in_out_pointers(ssl);
Paul Bakker7eb013f2011-10-06 12:37:39 +00003110
3111 ssl->in_msgtype = 0;
3112 ssl->in_msglen = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003113# if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnardb2f3be82014-07-10 17:54:52 +02003114 ssl->next_record_offset = 0;
Manuel Pégourié-Gonnard246c13a2014-09-24 13:56:09 +02003115 ssl->in_epoch = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003116# endif
3117# if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
3118 mbedtls_ssl_dtls_replay_reset(ssl);
3119# endif
Paul Bakker7eb013f2011-10-06 12:37:39 +00003120
3121 ssl->in_hslen = 0;
3122 ssl->nb_zero = 0;
Hanno Beckeraf0665d2017-05-24 09:16:26 +01003123
3124 ssl->keep_current_message = 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003125
3126 ssl->out_msgtype = 0;
3127 ssl->out_msglen = 0;
3128 ssl->out_left = 0;
3129
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003130 memset(ssl->cur_out_ctr, 0, sizeof(ssl->cur_out_ctr));
Hanno Becker19859472018-08-06 09:40:20 +01003131
Paul Bakker48916f92012-09-16 19:57:18 +00003132 ssl->transform_in = NULL;
3133 ssl->transform_out = NULL;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003134
Hanno Becker78640902018-08-13 16:35:15 +01003135 ssl->session_in = NULL;
3136 ssl->session_out = NULL;
3137
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003138 memset(ssl->out_buf, 0, out_buf_len);
Hanno Becker4ccbf062018-08-10 11:20:38 +01003139
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003140# if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && \
3141 defined(MBEDTLS_SSL_SRV_C)
3142 if (partial == 0)
3143# endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */
Hanno Becker4ccbf062018-08-10 11:20:38 +01003144 {
3145 ssl->in_left = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003146 memset(ssl->in_buf, 0, in_buf_len);
Hanno Becker4ccbf062018-08-10 11:20:38 +01003147 }
Paul Bakker05ef8352012-05-08 09:17:57 +00003148
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003149 if (ssl->transform) {
3150 mbedtls_ssl_transform_free(ssl->transform);
3151 mbedtls_free(ssl->transform);
Paul Bakker48916f92012-09-16 19:57:18 +00003152 ssl->transform = NULL;
Paul Bakker2770fbd2012-07-03 13:30:23 +00003153 }
Paul Bakker48916f92012-09-16 19:57:18 +00003154
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003155 if (ssl->session) {
3156 mbedtls_ssl_session_free(ssl->session);
3157 mbedtls_free(ssl->session);
Paul Bakkerc0463502013-02-14 11:19:38 +01003158 ssl->session = NULL;
3159 }
3160
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003161# if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02003162 ssl->alpn_chosen = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003163# endif
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02003164
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003165# if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
3166# if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE)
3167 if (partial == 0)
3168# endif
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02003169 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003170 mbedtls_free(ssl->cli_id);
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02003171 ssl->cli_id = NULL;
3172 ssl->cli_id_len = 0;
3173 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003174# endif
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02003175
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003176 if ((ret = ssl_handshake_init(ssl)) != 0)
3177 return ret;
Paul Bakker2770fbd2012-07-03 13:30:23 +00003178
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003179 return 0;
Paul Bakker7eb013f2011-10-06 12:37:39 +00003180}
3181
Manuel Pégourié-Gonnard779e4292013-08-03 13:50:48 +02003182/*
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02003183 * Reset an initialized and used SSL context for re-use while retaining
3184 * all application-set variables, function pointers and data.
3185 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003186int mbedtls_ssl_session_reset(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02003187{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003188 return mbedtls_ssl_session_reset_int(ssl, 0);
Manuel Pégourié-Gonnard3f09b6d2015-09-08 11:58:14 +02003189}
3190
3191/*
Paul Bakker5121ce52009-01-03 21:22:43 +00003192 * SSL set accessors
3193 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003194void mbedtls_ssl_conf_endpoint(mbedtls_ssl_config *conf, int endpoint)
Paul Bakker5121ce52009-01-03 21:22:43 +00003195{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003196 conf->endpoint = endpoint;
Paul Bakker5121ce52009-01-03 21:22:43 +00003197}
3198
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003199void mbedtls_ssl_conf_transport(mbedtls_ssl_config *conf, int transport)
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01003200{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003201 conf->transport = transport;
Manuel Pégourié-Gonnard0b1ff292014-02-06 13:04:16 +01003202}
3203
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003204# if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
3205void mbedtls_ssl_conf_dtls_anti_replay(mbedtls_ssl_config *conf, char mode)
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02003206{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003207 conf->anti_replay = mode;
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02003208}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003209# endif
Manuel Pégourié-Gonnard27393132014-09-24 14:41:11 +02003210
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003211void mbedtls_ssl_conf_dtls_badmac_limit(mbedtls_ssl_config *conf,
3212 unsigned limit)
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02003213{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003214 conf->badmac_limit = limit;
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02003215}
Manuel Pégourié-Gonnardb0643d12014-10-14 18:30:36 +02003216
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003217# if defined(MBEDTLS_SSL_PROTO_DTLS)
Hanno Becker04da1892018-08-14 13:22:10 +01003218
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003219void mbedtls_ssl_set_datagram_packing(mbedtls_ssl_context *ssl,
3220 unsigned allow_packing)
Hanno Becker04da1892018-08-14 13:22:10 +01003221{
3222 ssl->disable_datagram_packing = !allow_packing;
3223}
3224
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003225void mbedtls_ssl_conf_handshake_timeout(mbedtls_ssl_config *conf,
3226 uint32_t min,
3227 uint32_t max)
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02003228{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003229 conf->hs_timeout_min = min;
3230 conf->hs_timeout_max = max;
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02003231}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003232# endif
Manuel Pégourié-Gonnard905dd242014-10-01 12:03:55 +02003233
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003234void mbedtls_ssl_conf_authmode(mbedtls_ssl_config *conf, int authmode)
Paul Bakker5121ce52009-01-03 21:22:43 +00003235{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003236 conf->authmode = authmode;
Paul Bakker5121ce52009-01-03 21:22:43 +00003237}
3238
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003239# if defined(MBEDTLS_X509_CRT_PARSE_C)
3240void mbedtls_ssl_conf_verify(
3241 mbedtls_ssl_config *conf,
3242 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
3243 void *p_vrfy)
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003244{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003245 conf->f_vrfy = f_vrfy;
3246 conf->p_vrfy = p_vrfy;
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003247}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003248# endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb63b0af2011-01-13 17:54:59 +00003249
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003250void mbedtls_ssl_conf_rng(mbedtls_ssl_config *conf,
3251 int (*f_rng)(void *, unsigned char *, size_t),
3252 void *p_rng)
Paul Bakker5121ce52009-01-03 21:22:43 +00003253{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003254 conf->f_rng = f_rng;
3255 conf->p_rng = p_rng;
Paul Bakker5121ce52009-01-03 21:22:43 +00003256}
3257
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003258void mbedtls_ssl_conf_dbg(
3259 mbedtls_ssl_config *conf,
3260 void (*f_dbg)(void *, int, const char *, int, const char *),
3261 void *p_dbg)
Paul Bakker5121ce52009-01-03 21:22:43 +00003262{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003263 conf->f_dbg = f_dbg;
3264 conf->p_dbg = p_dbg;
Paul Bakker5121ce52009-01-03 21:22:43 +00003265}
3266
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003267void mbedtls_ssl_set_bio(mbedtls_ssl_context *ssl,
3268 void *p_bio,
3269 mbedtls_ssl_send_t *f_send,
3270 mbedtls_ssl_recv_t *f_recv,
3271 mbedtls_ssl_recv_timeout_t *f_recv_timeout)
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02003272{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003273 ssl->p_bio = p_bio;
3274 ssl->f_send = f_send;
3275 ssl->f_recv = f_recv;
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02003276 ssl->f_recv_timeout = f_recv_timeout;
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01003277}
3278
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003279# if defined(MBEDTLS_SSL_PROTO_DTLS)
3280void mbedtls_ssl_set_mtu(mbedtls_ssl_context *ssl, uint16_t mtu)
Manuel Pégourié-Gonnard6e7aaca2018-08-20 10:37:23 +02003281{
3282 ssl->mtu = mtu;
3283}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003284# endif
Manuel Pégourié-Gonnard6e7aaca2018-08-20 10:37:23 +02003285
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003286void mbedtls_ssl_conf_read_timeout(mbedtls_ssl_config *conf, uint32_t timeout)
Manuel Pégourié-Gonnard97fd52c2015-05-06 15:38:52 +01003287{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003288 conf->read_timeout = timeout;
Manuel Pégourié-Gonnard8fa6dfd2014-09-17 10:47:43 +02003289}
3290
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003291void mbedtls_ssl_set_timer_cb(mbedtls_ssl_context *ssl,
3292 void *p_timer,
3293 mbedtls_ssl_set_timer_t *f_set_timer,
3294 mbedtls_ssl_get_timer_t *f_get_timer)
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02003295{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003296 ssl->p_timer = p_timer;
3297 ssl->f_set_timer = f_set_timer;
3298 ssl->f_get_timer = f_get_timer;
Manuel Pégourié-Gonnard286a1362015-05-13 16:22:05 +02003299
3300 /* Make sure we start with no timer running */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003301 mbedtls_ssl_set_timer(ssl, 0);
Manuel Pégourié-Gonnard2e012912015-05-12 20:55:41 +02003302}
3303
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003304# if defined(MBEDTLS_SSL_SRV_C)
3305void mbedtls_ssl_conf_session_cache(mbedtls_ssl_config *conf,
3306 void *p_cache,
3307 mbedtls_ssl_cache_get_t *f_get_cache,
3308 mbedtls_ssl_cache_set_t *f_set_cache)
Paul Bakker5121ce52009-01-03 21:22:43 +00003309{
Manuel Pégourié-Gonnard5cb33082015-05-06 18:06:26 +01003310 conf->p_cache = p_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003311 conf->f_get_cache = f_get_cache;
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003312 conf->f_set_cache = f_set_cache;
Paul Bakker5121ce52009-01-03 21:22:43 +00003313}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003314# endif /* MBEDTLS_SSL_SRV_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00003315
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003316# if defined(MBEDTLS_SSL_CLI_C)
3317int mbedtls_ssl_set_session(mbedtls_ssl_context *ssl,
3318 const mbedtls_ssl_session *session)
Paul Bakker5121ce52009-01-03 21:22:43 +00003319{
Janos Follath865b3eb2019-12-16 11:46:15 +00003320 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003321
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003322 if (ssl == NULL || session == NULL || ssl->session_negotiate == NULL ||
3323 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT) {
3324 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003325 }
3326
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003327 if (ssl->handshake->resume == 1)
3328 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Beckere810bbc2021-05-14 16:01:05 +01003329
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003330 if ((ret = mbedtls_ssl_session_copy(ssl->session_negotiate, session)) != 0)
3331 return ret;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003332
Paul Bakker0a597072012-09-25 21:55:46 +00003333 ssl->handshake->resume = 1;
Manuel Pégourié-Gonnard06650f62013-08-02 15:34:52 +02003334
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003335 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003336}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003337# endif /* MBEDTLS_SSL_CLI_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00003338
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003339void mbedtls_ssl_conf_ciphersuites(mbedtls_ssl_config *conf,
3340 const int *ciphersuites)
Mateusz Starzyk06b07fb2021-02-18 13:55:21 +01003341{
Hanno Beckerd60b6c62021-04-29 12:04:11 +01003342 conf->ciphersuite_list = ciphersuites;
Paul Bakker5121ce52009-01-03 21:22:43 +00003343}
3344
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003345# if defined(MBEDTLS_X509_CRT_PARSE_C)
3346void mbedtls_ssl_conf_cert_profile(mbedtls_ssl_config *conf,
3347 const mbedtls_x509_crt_profile *profile)
Manuel Pégourié-Gonnard6e3ee3a2015-06-17 10:58:20 +02003348{
3349 conf->cert_profile = profile;
3350}
3351
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02003352/* Append a new keycert entry to a (possibly empty) list */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003353static int ssl_append_key_cert(mbedtls_ssl_key_cert **head,
3354 mbedtls_x509_crt *cert,
3355 mbedtls_pk_context *key)
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003356{
niisato8ee24222018-06-25 19:05:48 +09003357 mbedtls_ssl_key_cert *new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003358
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003359 new_cert = mbedtls_calloc(1, sizeof(mbedtls_ssl_key_cert));
3360 if (new_cert == NULL)
3361 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003362
niisato8ee24222018-06-25 19:05:48 +09003363 new_cert->cert = cert;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003364 new_cert->key = key;
niisato8ee24222018-06-25 19:05:48 +09003365 new_cert->next = NULL;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003366
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02003367 /* Update head is the list was null, else add to the end */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003368 if (*head == NULL) {
niisato8ee24222018-06-25 19:05:48 +09003369 *head = new_cert;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003370 } else {
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02003371 mbedtls_ssl_key_cert *cur = *head;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003372 while (cur->next != NULL)
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02003373 cur = cur->next;
niisato8ee24222018-06-25 19:05:48 +09003374 cur->next = new_cert;
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003375 }
3376
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003377 return 0;
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02003378}
3379
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003380int mbedtls_ssl_conf_own_cert(mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02003381 mbedtls_x509_crt *own_cert,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003382 mbedtls_pk_context *pk_key)
Manuel Pégourié-Gonnard8f618a82015-05-10 21:13:36 +02003383{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003384 return ssl_append_key_cert(&conf->key_cert, own_cert, pk_key);
Manuel Pégourié-Gonnard834ea852013-09-23 14:46:13 +02003385}
3386
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003387void mbedtls_ssl_conf_ca_chain(mbedtls_ssl_config *conf,
Manuel Pégourié-Gonnardbc2b7712015-05-06 11:14:19 +01003388 mbedtls_x509_crt *ca_chain,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003389 mbedtls_x509_crl *ca_crl)
Paul Bakker5121ce52009-01-03 21:22:43 +00003390{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003391 conf->ca_chain = ca_chain;
3392 conf->ca_crl = ca_crl;
Hanno Becker5adaad92019-03-27 16:54:37 +00003393
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003394# if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
Hanno Becker5adaad92019-03-27 16:54:37 +00003395 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
3396 * cannot be used together. */
3397 conf->f_ca_cb = NULL;
3398 conf->p_ca_cb = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003399# endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
Paul Bakker5121ce52009-01-03 21:22:43 +00003400}
Hanno Becker5adaad92019-03-27 16:54:37 +00003401
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003402# if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
3403void mbedtls_ssl_conf_ca_cb(mbedtls_ssl_config *conf,
3404 mbedtls_x509_crt_ca_cb_t f_ca_cb,
3405 void *p_ca_cb)
Hanno Becker5adaad92019-03-27 16:54:37 +00003406{
3407 conf->f_ca_cb = f_ca_cb;
3408 conf->p_ca_cb = p_ca_cb;
3409
3410 /* mbedtls_ssl_conf_ca_chain() and mbedtls_ssl_conf_ca_cb()
3411 * cannot be used together. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003412 conf->ca_chain = NULL;
3413 conf->ca_crl = NULL;
Hanno Becker5adaad92019-03-27 16:54:37 +00003414}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003415# endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
3416# endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkereb2c6582012-09-27 19:15:01 +00003417
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003418# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
3419int mbedtls_ssl_set_hs_own_cert(mbedtls_ssl_context *ssl,
3420 mbedtls_x509_crt *own_cert,
3421 mbedtls_pk_context *pk_key)
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02003422{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003423 return (
3424 ssl_append_key_cert(&ssl->handshake->sni_key_cert, own_cert, pk_key));
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02003425}
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02003426
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003427void mbedtls_ssl_set_hs_ca_chain(mbedtls_ssl_context *ssl,
3428 mbedtls_x509_crt *ca_chain,
3429 mbedtls_x509_crl *ca_crl)
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02003430{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003431 ssl->handshake->sni_ca_chain = ca_chain;
3432 ssl->handshake->sni_ca_crl = ca_crl;
Manuel Pégourié-Gonnard22bfa4b2015-05-11 08:46:37 +02003433}
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02003434
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003435void mbedtls_ssl_set_hs_authmode(mbedtls_ssl_context *ssl, int authmode)
Manuel Pégourié-Gonnardcdc26ae2015-06-19 12:16:31 +02003436{
3437 ssl->handshake->sni_authmode = authmode;
3438}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003439# endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Manuel Pégourié-Gonnard1af6c852015-05-10 23:10:37 +02003440
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003441# if defined(MBEDTLS_X509_CRT_PARSE_C)
3442void mbedtls_ssl_set_verify(
3443 mbedtls_ssl_context *ssl,
3444 int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
3445 void *p_vrfy)
Hanno Becker8927c832019-04-03 12:52:50 +01003446{
3447 ssl->f_vrfy = f_vrfy;
3448 ssl->p_vrfy = p_vrfy;
3449}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003450# endif
Hanno Becker8927c832019-04-03 12:52:50 +01003451
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003452# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02003453/*
3454 * Set EC J-PAKE password for current handshake
3455 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003456int mbedtls_ssl_set_hs_ecjpake_password(mbedtls_ssl_context *ssl,
3457 const unsigned char *pw,
3458 size_t pw_len)
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02003459{
3460 mbedtls_ecjpake_role role;
3461
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003462 if (ssl->handshake == NULL || ssl->conf == NULL)
3463 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02003464
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003465 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER)
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02003466 role = MBEDTLS_ECJPAKE_SERVER;
3467 else
3468 role = MBEDTLS_ECJPAKE_CLIENT;
3469
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003470 return (mbedtls_ecjpake_setup(&ssl->handshake->ecjpake_ctx, role,
3471 MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1,
3472 pw, pw_len));
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02003473}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003474# endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */
Manuel Pégourié-Gonnard7002f4a2015-09-15 12:43:43 +02003475
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003476# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003477
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003478static int ssl_conf_psk_is_configured(mbedtls_ssl_config const *conf)
Hanno Becker2ed3dce2021-04-19 21:59:14 +01003479{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003480# if defined(MBEDTLS_USE_PSA_CRYPTO)
3481 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque))
3482 return 1;
3483# endif /* MBEDTLS_USE_PSA_CRYPTO */
Hanno Becker2ed3dce2021-04-19 21:59:14 +01003484
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003485 if (conf->psk != NULL)
3486 return 1;
Hanno Becker2ed3dce2021-04-19 21:59:14 +01003487
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003488 return 0;
Hanno Becker2ed3dce2021-04-19 21:59:14 +01003489}
3490
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003491static void ssl_conf_remove_psk(mbedtls_ssl_config *conf)
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003492{
3493 /* Remove reference to existing PSK, if any. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003494# if defined(MBEDTLS_USE_PSA_CRYPTO)
3495 if (!mbedtls_svc_key_id_is_null(conf->psk_opaque)) {
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003496 /* The maintenance of the PSK key slot is the
3497 * user's responsibility. */
Ronald Croncf56a0a2020-08-04 09:51:30 +02003498 conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003499 }
Hanno Beckera63ac3f2018-11-05 12:47:16 +00003500 /* This and the following branch should never
3501 * be taken simultaenously as we maintain the
3502 * invariant that raw and opaque PSKs are never
3503 * configured simultaneously. As a safeguard,
3504 * though, `else` is omitted here. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003505# endif /* MBEDTLS_USE_PSA_CRYPTO */
3506 if (conf->psk != NULL) {
3507 mbedtls_platform_zeroize(conf->psk, conf->psk_len);
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003508
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003509 mbedtls_free(conf->psk);
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003510 conf->psk = NULL;
3511 conf->psk_len = 0;
3512 }
3513
3514 /* Remove reference to PSK identity, if any. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003515 if (conf->psk_identity != NULL) {
3516 mbedtls_free(conf->psk_identity);
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003517 conf->psk_identity = NULL;
3518 conf->psk_identity_len = 0;
3519 }
3520}
3521
Hanno Becker7390c712018-11-15 13:33:04 +00003522/* This function assumes that PSK identity in the SSL config is unset.
3523 * It checks that the provided identity is well-formed and attempts
3524 * to make a copy of it in the SSL config.
3525 * On failure, the PSK identity in the config remains unset. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003526static int ssl_conf_set_psk_identity(mbedtls_ssl_config *conf,
3527 unsigned char const *psk_identity,
3528 size_t psk_identity_len)
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003529{
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003530 /* Identity len will be encoded on two bytes */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003531 if (psk_identity == NULL || (psk_identity_len >> 16) != 0 ||
3532 psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN) {
3533 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc6b5d832015-08-27 16:37:35 +02003534 }
3535
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003536 conf->psk_identity = mbedtls_calloc(1, psk_identity_len);
3537 if (conf->psk_identity == NULL)
3538 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Paul Bakker6db455e2013-09-18 17:29:31 +02003539
Manuel Pégourié-Gonnard120fdbd2015-05-07 17:07:50 +01003540 conf->psk_identity_len = psk_identity_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003541 memcpy(conf->psk_identity, psk_identity, conf->psk_identity_len);
Paul Bakker5ad403f2013-09-18 21:21:30 +02003542
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003543 return 0;
Paul Bakker6db455e2013-09-18 17:29:31 +02003544}
3545
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003546int mbedtls_ssl_conf_psk(mbedtls_ssl_config *conf,
3547 const unsigned char *psk,
3548 size_t psk_len,
3549 const unsigned char *psk_identity,
3550 size_t psk_identity_len)
Hanno Becker7390c712018-11-15 13:33:04 +00003551{
Janos Follath865b3eb2019-12-16 11:46:15 +00003552 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker2ed3dce2021-04-19 21:59:14 +01003553
3554 /* We currently only support one PSK, raw or opaque. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003555 if (ssl_conf_psk_is_configured(conf))
3556 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Becker7390c712018-11-15 13:33:04 +00003557
3558 /* Check and set raw PSK */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003559 if (psk == NULL)
3560 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3561 if (psk_len == 0)
3562 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
3563 if (psk_len > MBEDTLS_PSK_MAX_LEN)
3564 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Piotr Nowicki9926eaf2019-11-20 14:54:36 +01003565
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003566 if ((conf->psk = mbedtls_calloc(1, psk_len)) == NULL)
3567 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Hanno Becker7390c712018-11-15 13:33:04 +00003568 conf->psk_len = psk_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003569 memcpy(conf->psk, psk, conf->psk_len);
Hanno Becker7390c712018-11-15 13:33:04 +00003570
3571 /* Check and set PSK Identity */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003572 ret = ssl_conf_set_psk_identity(conf, psk_identity, psk_identity_len);
3573 if (ret != 0)
3574 ssl_conf_remove_psk(conf);
Hanno Becker7390c712018-11-15 13:33:04 +00003575
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003576 return ret;
Hanno Becker7390c712018-11-15 13:33:04 +00003577}
3578
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003579static void ssl_remove_psk(mbedtls_ssl_context *ssl)
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003580{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003581# if defined(MBEDTLS_USE_PSA_CRYPTO)
3582 if (!mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque)) {
Ronald Croncf56a0a2020-08-04 09:51:30 +02003583 ssl->handshake->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003584 } else
3585# endif /* MBEDTLS_USE_PSA_CRYPTO */
3586 if (ssl->handshake->psk != NULL) {
3587 mbedtls_platform_zeroize(ssl->handshake->psk, ssl->handshake->psk_len);
3588 mbedtls_free(ssl->handshake->psk);
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003589 ssl->handshake->psk_len = 0;
3590 }
3591}
3592
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003593int mbedtls_ssl_set_hs_psk(mbedtls_ssl_context *ssl,
3594 const unsigned char *psk,
3595 size_t psk_len)
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01003596{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003597 if (psk == NULL || ssl->handshake == NULL)
3598 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01003599
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003600 if (psk_len > MBEDTLS_PSK_MAX_LEN)
3601 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01003602
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003603 ssl_remove_psk(ssl);
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01003604
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003605 if ((ssl->handshake->psk = mbedtls_calloc(1, psk_len)) == NULL)
3606 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01003607
3608 ssl->handshake->psk_len = psk_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003609 memcpy(ssl->handshake->psk, psk, ssl->handshake->psk_len);
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01003610
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003611 return 0;
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01003612}
3613
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003614# if defined(MBEDTLS_USE_PSA_CRYPTO)
3615int mbedtls_ssl_conf_psk_opaque(mbedtls_ssl_config *conf,
3616 psa_key_id_t psk,
3617 const unsigned char *psk_identity,
3618 size_t psk_identity_len)
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003619{
Janos Follath865b3eb2019-12-16 11:46:15 +00003620 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker2ed3dce2021-04-19 21:59:14 +01003621
3622 /* We currently only support one PSK, raw or opaque. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003623 if (ssl_conf_psk_is_configured(conf))
3624 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003625
Hanno Becker7390c712018-11-15 13:33:04 +00003626 /* Check and set opaque PSK */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003627 if (mbedtls_svc_key_id_is_null(psk))
3628 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Ronald Croncf56a0a2020-08-04 09:51:30 +02003629 conf->psk_opaque = psk;
Hanno Becker7390c712018-11-15 13:33:04 +00003630
3631 /* Check and set PSK Identity */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003632 ret = ssl_conf_set_psk_identity(conf, psk_identity, psk_identity_len);
3633 if (ret != 0)
3634 ssl_conf_remove_psk(conf);
Hanno Becker7390c712018-11-15 13:33:04 +00003635
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003636 return ret;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003637}
3638
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003639int mbedtls_ssl_set_hs_psk_opaque(mbedtls_ssl_context *ssl, psa_key_id_t psk)
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003640{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003641 if ((mbedtls_svc_key_id_is_null(psk)) || (ssl->handshake == NULL))
3642 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003643
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003644 ssl_remove_psk(ssl);
Ronald Croncf56a0a2020-08-04 09:51:30 +02003645 ssl->handshake->psk_opaque = psk;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003646 return 0;
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003647}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003648# endif /* MBEDTLS_USE_PSA_CRYPTO */
Hanno Beckerd20a8ca2018-10-22 15:31:26 +01003649
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003650void mbedtls_ssl_conf_psk_cb(
3651 mbedtls_ssl_config *conf,
3652 int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t),
3653 void *p_psk)
Paul Bakker6db455e2013-09-18 17:29:31 +02003654{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003655 conf->f_psk = f_psk;
3656 conf->p_psk = p_psk;
Paul Bakkerd4a56ec2013-04-16 18:05:29 +02003657}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003658# endif /* MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED */
Paul Bakker43b7e352011-01-18 15:27:19 +00003659
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003660# if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
3661int mbedtls_ssl_conf_dh_param_bin(mbedtls_ssl_config *conf,
3662 const unsigned char *dhm_P,
3663 size_t P_len,
3664 const unsigned char *dhm_G,
3665 size_t G_len)
Hanno Beckera90658f2017-10-04 15:29:08 +01003666{
Janos Follath865b3eb2019-12-16 11:46:15 +00003667 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Beckera90658f2017-10-04 15:29:08 +01003668
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003669 if ((ret = mbedtls_mpi_read_binary(&conf->dhm_P, dhm_P, P_len)) != 0 ||
3670 (ret = mbedtls_mpi_read_binary(&conf->dhm_G, dhm_G, G_len)) != 0) {
3671 mbedtls_mpi_free(&conf->dhm_P);
3672 mbedtls_mpi_free(&conf->dhm_G);
3673 return ret;
Hanno Beckera90658f2017-10-04 15:29:08 +01003674 }
3675
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003676 return 0;
Hanno Beckera90658f2017-10-04 15:29:08 +01003677}
Paul Bakker5121ce52009-01-03 21:22:43 +00003678
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003679int mbedtls_ssl_conf_dh_param_ctx(mbedtls_ssl_config *conf,
3680 mbedtls_dhm_context *dhm_ctx)
Paul Bakker1b57b062011-01-06 15:48:19 +00003681{
Janos Follath865b3eb2019-12-16 11:46:15 +00003682 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker1b57b062011-01-06 15:48:19 +00003683
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003684 if ((ret = mbedtls_dhm_get_value(dhm_ctx, MBEDTLS_DHM_PARAM_P,
3685 &conf->dhm_P)) != 0 ||
3686 (ret = mbedtls_dhm_get_value(dhm_ctx, MBEDTLS_DHM_PARAM_G,
3687 &conf->dhm_G)) != 0) {
3688 mbedtls_mpi_free(&conf->dhm_P);
3689 mbedtls_mpi_free(&conf->dhm_G);
3690 return ret;
Manuel Pégourié-Gonnard1028b742015-05-06 17:33:07 +01003691 }
Paul Bakker1b57b062011-01-06 15:48:19 +00003692
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003693 return 0;
Paul Bakker1b57b062011-01-06 15:48:19 +00003694}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003695# endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */
Paul Bakker1b57b062011-01-06 15:48:19 +00003696
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003697# if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02003698/*
3699 * Set the minimum length for Diffie-Hellman parameters
3700 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003701void mbedtls_ssl_conf_dhm_min_bitlen(mbedtls_ssl_config *conf,
3702 unsigned int bitlen)
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02003703{
3704 conf->dhm_min_bitlen = bitlen;
3705}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003706# endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02003707
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003708# if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02003709/*
3710 * Set allowed/preferred hashes for handshake signatures
3711 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003712void mbedtls_ssl_conf_sig_hashes(mbedtls_ssl_config *conf, const int *hashes)
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02003713{
3714 conf->sig_hashes = hashes;
3715}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003716# endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnard36a8b572015-06-17 12:43:26 +02003717
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003718# if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01003719/*
3720 * Set the allowed elliptic curves
3721 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003722void mbedtls_ssl_conf_curves(mbedtls_ssl_config *conf,
3723 const mbedtls_ecp_group_id *curve_list)
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01003724{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003725 conf->curve_list = curve_list;
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01003726}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003727# endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f38ed02014-02-04 15:52:33 +01003728
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003729# if defined(MBEDTLS_X509_CRT_PARSE_C)
3730int mbedtls_ssl_set_hostname(mbedtls_ssl_context *ssl, const char *hostname)
Paul Bakker5121ce52009-01-03 21:22:43 +00003731{
Hanno Becker947194e2017-04-07 13:25:49 +01003732 /* Initialize to suppress unnecessary compiler warning */
3733 size_t hostname_len = 0;
3734
3735 /* Check if new hostname is valid before
3736 * making any change to current one */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003737 if (hostname != NULL) {
3738 hostname_len = strlen(hostname);
Hanno Becker947194e2017-04-07 13:25:49 +01003739
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003740 if (hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN)
3741 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Becker947194e2017-04-07 13:25:49 +01003742 }
3743
3744 /* Now it's clear that we will overwrite the old hostname,
3745 * so we can free it safely */
3746
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003747 if (ssl->hostname != NULL) {
3748 mbedtls_platform_zeroize(ssl->hostname, strlen(ssl->hostname));
3749 mbedtls_free(ssl->hostname);
Hanno Becker947194e2017-04-07 13:25:49 +01003750 }
3751
3752 /* Passing NULL as hostname shall clear the old one */
Manuel Pégourié-Gonnardba26c242015-05-06 10:47:06 +01003753
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003754 if (hostname == NULL) {
Hanno Becker947194e2017-04-07 13:25:49 +01003755 ssl->hostname = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003756 } else {
3757 ssl->hostname = mbedtls_calloc(1, hostname_len + 1);
3758 if (ssl->hostname == NULL)
3759 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Paul Bakker75c1a6f2013-08-19 14:25:29 +02003760
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003761 memcpy(ssl->hostname, hostname, hostname_len);
Paul Bakker75c1a6f2013-08-19 14:25:29 +02003762
Hanno Becker947194e2017-04-07 13:25:49 +01003763 ssl->hostname[hostname_len] = '\0';
3764 }
Paul Bakker5121ce52009-01-03 21:22:43 +00003765
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003766 return 0;
Paul Bakker5121ce52009-01-03 21:22:43 +00003767}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003768# endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakker5121ce52009-01-03 21:22:43 +00003769
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003770# if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
3771void mbedtls_ssl_conf_sni(
3772 mbedtls_ssl_config *conf,
3773 int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t),
3774 void *p_sni)
Paul Bakker5701cdc2012-09-27 21:49:42 +00003775{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003776 conf->f_sni = f_sni;
3777 conf->p_sni = p_sni;
Paul Bakker5701cdc2012-09-27 21:49:42 +00003778}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003779# endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */
Paul Bakker5701cdc2012-09-27 21:49:42 +00003780
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003781# if defined(MBEDTLS_SSL_ALPN)
3782int mbedtls_ssl_conf_alpn_protocols(mbedtls_ssl_config *conf,
3783 const char **protos)
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02003784{
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02003785 size_t cur_len, tot_len;
3786 const char **p;
3787
3788 /*
Brian J Murray1903fb32016-11-06 04:45:15 -08003789 * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings
3790 * MUST NOT be truncated."
3791 * We check lengths now rather than later.
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02003792 */
3793 tot_len = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003794 for (p = protos; *p != NULL; p++) {
3795 cur_len = strlen(*p);
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02003796 tot_len += cur_len;
3797
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003798 if ((cur_len == 0) || (cur_len > MBEDTLS_SSL_MAX_ALPN_NAME_LEN) ||
3799 (tot_len > MBEDTLS_SSL_MAX_ALPN_LIST_LEN))
3800 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02003801 }
3802
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003803 conf->alpn_list = protos;
Manuel Pégourié-Gonnard0b874dc2014-04-07 10:57:45 +02003804
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003805 return 0;
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02003806}
3807
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003808const char *mbedtls_ssl_get_alpn_protocol(const mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02003809{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003810 return ssl->alpn_chosen;
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02003811}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003812# endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard7e250d42014-04-04 16:08:41 +02003813
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003814# if defined(MBEDTLS_SSL_DTLS_SRTP)
3815void mbedtls_ssl_conf_srtp_mki_value_supported(mbedtls_ssl_config *conf,
3816 int support_mki_value)
Ron Eldor591f1622018-01-22 12:30:04 +02003817{
3818 conf->dtls_srtp_mki_support = support_mki_value;
3819}
3820
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003821int mbedtls_ssl_dtls_srtp_set_mki_value(mbedtls_ssl_context *ssl,
3822 unsigned char *mki_value,
3823 uint16_t mki_len)
Ron Eldor591f1622018-01-22 12:30:04 +02003824{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003825 if (mki_len > MBEDTLS_TLS_SRTP_MAX_MKI_LENGTH) {
3826 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Ron Eldora9788042018-12-05 11:04:31 +02003827 }
Ron Eldor591f1622018-01-22 12:30:04 +02003828
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003829 if (ssl->conf->dtls_srtp_mki_support ==
3830 MBEDTLS_SSL_DTLS_SRTP_MKI_UNSUPPORTED) {
3831 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Ron Eldora9788042018-12-05 11:04:31 +02003832 }
Ron Eldor591f1622018-01-22 12:30:04 +02003833
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003834 memcpy(ssl->dtls_srtp_info.mki_value, mki_value, mki_len);
Ron Eldor591f1622018-01-22 12:30:04 +02003835 ssl->dtls_srtp_info.mki_len = mki_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003836 return 0;
Ron Eldor591f1622018-01-22 12:30:04 +02003837}
3838
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003839int mbedtls_ssl_conf_dtls_srtp_protection_profiles(
3840 mbedtls_ssl_config *conf,
3841 const mbedtls_ssl_srtp_profile *profiles)
Johan Pascalb62bb512015-12-03 21:56:45 +01003842{
Johan Pascal253d0262020-09-22 13:04:45 +02003843 const mbedtls_ssl_srtp_profile *p;
3844 size_t list_size = 0;
Johan Pascalb62bb512015-12-03 21:56:45 +01003845
Johan Pascal253d0262020-09-22 13:04:45 +02003846 /* check the profiles list: all entry must be valid,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003847 * its size cannot be more than the total number of supported profiles,
3848 * currently 4 */
3849 for (p = profiles; *p != MBEDTLS_TLS_SRTP_UNSET &&
Johan Pascald387aa02020-09-23 18:47:56 +02003850 list_size <= MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003851 p++) {
3852 if (mbedtls_ssl_check_srtp_profile_value(*p) !=
3853 MBEDTLS_TLS_SRTP_UNSET) {
Johan Pascal76fdf1d2020-10-22 23:31:00 +02003854 list_size++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003855 } else {
3856 /* unsupported value, stop parsing and set the size to an error
3857 * value */
Johan Pascal76fdf1d2020-10-22 23:31:00 +02003858 list_size = MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH + 1;
Johan Pascalb62bb512015-12-03 21:56:45 +01003859 }
3860 }
3861
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003862 if (list_size > MBEDTLS_TLS_SRTP_MAX_PROFILE_LIST_LENGTH) {
3863 conf->dtls_srtp_profile_list = NULL;
3864 conf->dtls_srtp_profile_list_len = 0;
3865 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Johan Pascal253d0262020-09-22 13:04:45 +02003866 }
3867
Johan Pascal9bc97ca2020-09-21 23:44:45 +02003868 conf->dtls_srtp_profile_list = profiles;
Johan Pascal253d0262020-09-22 13:04:45 +02003869 conf->dtls_srtp_profile_list_len = list_size;
Johan Pascalb62bb512015-12-03 21:56:45 +01003870
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003871 return 0;
Johan Pascalb62bb512015-12-03 21:56:45 +01003872}
3873
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003874void mbedtls_ssl_get_dtls_srtp_negotiation_result(
3875 const mbedtls_ssl_context *ssl,
3876 mbedtls_dtls_srtp_info *dtls_srtp_info)
Johan Pascalb62bb512015-12-03 21:56:45 +01003877{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003878 dtls_srtp_info->chosen_dtls_srtp_profile =
3879 ssl->dtls_srtp_info.chosen_dtls_srtp_profile;
Johan Pascal2258a4f2020-10-28 13:53:09 +01003880 /* do not copy the mki value if there is no chosen profile */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003881 if (dtls_srtp_info->chosen_dtls_srtp_profile == MBEDTLS_TLS_SRTP_UNSET) {
Johan Pascal2258a4f2020-10-28 13:53:09 +01003882 dtls_srtp_info->mki_len = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003883 } else {
Johan Pascal2258a4f2020-10-28 13:53:09 +01003884 dtls_srtp_info->mki_len = ssl->dtls_srtp_info.mki_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003885 memcpy(dtls_srtp_info->mki_value, ssl->dtls_srtp_info.mki_value,
3886 ssl->dtls_srtp_info.mki_len);
Johan Pascal2258a4f2020-10-28 13:53:09 +01003887 }
Johan Pascalb62bb512015-12-03 21:56:45 +01003888}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003889# endif /* MBEDTLS_SSL_DTLS_SRTP */
Johan Pascalb62bb512015-12-03 21:56:45 +01003890
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003891void mbedtls_ssl_conf_max_version(mbedtls_ssl_config *conf,
3892 int major,
3893 int minor)
Paul Bakker490ecc82011-10-06 13:04:09 +00003894{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003895 conf->max_major_ver = major;
3896 conf->max_minor_ver = minor;
Paul Bakker490ecc82011-10-06 13:04:09 +00003897}
3898
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003899void mbedtls_ssl_conf_min_version(mbedtls_ssl_config *conf,
3900 int major,
3901 int minor)
Paul Bakker1d29fb52012-09-28 13:28:45 +00003902{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003903 conf->min_major_ver = major;
3904 conf->min_minor_ver = minor;
Paul Bakker1d29fb52012-09-28 13:28:45 +00003905}
3906
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003907# if defined(MBEDTLS_SSL_SRV_C)
3908void mbedtls_ssl_conf_cert_req_ca_list(mbedtls_ssl_config *conf,
3909 char cert_req_ca_list)
Janos Follath088ce432017-04-10 12:42:31 +01003910{
3911 conf->cert_req_ca_list = cert_req_ca_list;
3912}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003913# endif
Janos Follath088ce432017-04-10 12:42:31 +01003914
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003915# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
3916void mbedtls_ssl_conf_encrypt_then_mac(mbedtls_ssl_config *conf, char etm)
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01003917{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003918 conf->encrypt_then_mac = etm;
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01003919}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003920# endif
Manuel Pégourié-Gonnard699cafa2014-10-27 13:57:03 +01003921
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003922# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
3923void mbedtls_ssl_conf_extended_master_secret(mbedtls_ssl_config *conf, char ems)
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02003924{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003925 conf->extended_ms = ems;
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02003926}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003927# endif
Manuel Pégourié-Gonnard367381f2014-10-20 18:40:56 +02003928
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003929# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
3930int mbedtls_ssl_conf_max_frag_len(mbedtls_ssl_config *conf,
3931 unsigned char mfl_code)
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003932{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003933 if (mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ||
3934 ssl_mfl_code_to_length(mfl_code) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN) {
3935 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003936 }
3937
Manuel Pégourié-Gonnard6bf89d62015-05-05 17:01:57 +01003938 conf->mfl_code = mfl_code;
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003939
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003940 return 0;
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003941}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003942# endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnard8b464592013-07-16 12:45:26 +02003943
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003944void mbedtls_ssl_conf_legacy_renegotiation(mbedtls_ssl_config *conf,
3945 int allow_legacy)
Paul Bakker48916f92012-09-16 19:57:18 +00003946{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003947 conf->allow_legacy_renegotiation = allow_legacy;
Paul Bakker48916f92012-09-16 19:57:18 +00003948}
3949
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003950# if defined(MBEDTLS_SSL_RENEGOTIATION)
3951void mbedtls_ssl_conf_renegotiation(mbedtls_ssl_config *conf, int renegotiation)
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003952{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003953 conf->disable_renegotiation = renegotiation;
Manuel Pégourié-Gonnard615e6772014-11-03 08:23:14 +01003954}
3955
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003956void mbedtls_ssl_conf_renegotiation_enforced(mbedtls_ssl_config *conf,
3957 int max_records)
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02003958{
Manuel Pégourié-Gonnardd36e33f2015-05-05 10:45:39 +02003959 conf->renego_max_records = max_records;
Manuel Pégourié-Gonnarda9964db2014-07-03 19:29:16 +02003960}
3961
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003962void mbedtls_ssl_conf_renegotiation_period(mbedtls_ssl_config *conf,
3963 const unsigned char period[8])
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01003964{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003965 memcpy(conf->renego_period, period, 8);
Manuel Pégourié-Gonnard837f0fe2014-11-05 13:58:53 +01003966}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003967# endif /* MBEDTLS_SSL_RENEGOTIATION */
Paul Bakker5121ce52009-01-03 21:22:43 +00003968
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003969# if defined(MBEDTLS_SSL_SESSION_TICKETS)
3970# if defined(MBEDTLS_SSL_CLI_C)
3971void mbedtls_ssl_conf_session_tickets(mbedtls_ssl_config *conf, int use_tickets)
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003972{
Manuel Pégourié-Gonnard2b494452015-05-06 10:05:11 +01003973 conf->session_tickets = use_tickets;
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003974}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003975# endif
Paul Bakker606b4ba2013-08-14 16:52:14 +02003976
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003977# if defined(MBEDTLS_SSL_SRV_C)
3978void mbedtls_ssl_conf_session_tickets_cb(
3979 mbedtls_ssl_config *conf,
3980 mbedtls_ssl_ticket_write_t *f_ticket_write,
3981 mbedtls_ssl_ticket_parse_t *f_ticket_parse,
3982 void *p_ticket)
Paul Bakker606b4ba2013-08-14 16:52:14 +02003983{
Manuel Pégourié-Gonnardd59675d2015-05-19 15:28:00 +02003984 conf->f_ticket_write = f_ticket_write;
3985 conf->f_ticket_parse = f_ticket_parse;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003986 conf->p_ticket = p_ticket;
Paul Bakker606b4ba2013-08-14 16:52:14 +02003987}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003988# endif
3989# endif /* MBEDTLS_SSL_SESSION_TICKETS */
Manuel Pégourié-Gonnardaa0d4d12013-08-03 13:02:31 +02003990
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003991# if defined(MBEDTLS_SSL_EXPORT_KEYS)
3992void mbedtls_ssl_set_export_keys_cb(mbedtls_ssl_context *ssl,
3993 mbedtls_ssl_export_keys_t *f_export_keys,
3994 void *p_export_keys)
Robert Cragie4feb7ae2015-10-02 13:33:37 +01003995{
Hanno Becker7e6c1782021-06-08 09:24:55 +01003996 ssl->f_export_keys = f_export_keys;
3997 ssl->p_export_keys = p_export_keys;
Ron Eldorf5cc10d2019-05-07 18:33:40 +03003998}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02003999# endif
Robert Cragie4feb7ae2015-10-02 13:33:37 +01004000
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004001# if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
Gilles Peskine8bf79f62018-01-05 21:11:53 +01004002void mbedtls_ssl_conf_async_private_cb(
4003 mbedtls_ssl_config *conf,
4004 mbedtls_ssl_async_sign_t *f_async_sign,
4005 mbedtls_ssl_async_decrypt_t *f_async_decrypt,
4006 mbedtls_ssl_async_resume_t *f_async_resume,
4007 mbedtls_ssl_async_cancel_t *f_async_cancel,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004008 void *async_config_data)
Gilles Peskine8bf79f62018-01-05 21:11:53 +01004009{
4010 conf->f_async_sign_start = f_async_sign;
4011 conf->f_async_decrypt_start = f_async_decrypt;
4012 conf->f_async_resume = f_async_resume;
4013 conf->f_async_cancel = f_async_cancel;
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004014 conf->p_async_config_data = async_config_data;
4015}
4016
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004017void *mbedtls_ssl_conf_get_async_config_data(const mbedtls_ssl_config *conf)
Gilles Peskine8f97af72018-04-26 11:46:10 +02004018{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004019 return conf->p_async_config_data;
Gilles Peskine8f97af72018-04-26 11:46:10 +02004020}
4021
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004022void *mbedtls_ssl_get_async_operation_data(const mbedtls_ssl_context *ssl)
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004023{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004024 if (ssl->handshake == NULL)
4025 return NULL;
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004026 else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004027 return ssl->handshake->user_async_ctx;
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004028}
4029
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004030void mbedtls_ssl_set_async_operation_data(mbedtls_ssl_context *ssl, void *ctx)
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004031{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004032 if (ssl->handshake != NULL)
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02004033 ssl->handshake->user_async_ctx = ctx;
Gilles Peskine8bf79f62018-01-05 21:11:53 +01004034}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004035# endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskine8bf79f62018-01-05 21:11:53 +01004036
Paul Bakker5121ce52009-01-03 21:22:43 +00004037/*
4038 * SSL get accessors
4039 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004040uint32_t mbedtls_ssl_get_verify_result(const mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004041{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004042 if (ssl->session != NULL)
4043 return ssl->session->verify_result;
Manuel Pégourié-Gonnarde89163c2015-01-23 14:30:57 +00004044
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004045 if (ssl->session_negotiate != NULL)
4046 return ssl->session_negotiate->verify_result;
Manuel Pégourié-Gonnarde89163c2015-01-23 14:30:57 +00004047
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004048 return 0xFFFFFFFF;
Paul Bakker5121ce52009-01-03 21:22:43 +00004049}
4050
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004051const char *mbedtls_ssl_get_ciphersuite(const mbedtls_ssl_context *ssl)
Paul Bakker72f62662011-01-16 21:27:44 +00004052{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004053 if (ssl == NULL || ssl->session == NULL)
4054 return NULL;
Paul Bakker926c8e42013-03-06 10:23:34 +01004055
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004056 return mbedtls_ssl_get_ciphersuite_name(ssl->session->ciphersuite);
Paul Bakker72f62662011-01-16 21:27:44 +00004057}
4058
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004059const char *mbedtls_ssl_get_version(const mbedtls_ssl_context *ssl)
Paul Bakker43ca69c2011-01-15 17:35:19 +00004060{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004061# if defined(MBEDTLS_SSL_PROTO_DTLS)
4062 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
4063 switch (ssl->minor_ver) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004064 case MBEDTLS_SSL_MINOR_VERSION_3:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004065 return "DTLSv1.2";
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01004066
4067 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004068 return "unknown (DTLS)";
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01004069 }
4070 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004071# endif
Manuel Pégourié-Gonnardb21ca2a2014-02-10 13:43:33 +01004072
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004073 switch (ssl->minor_ver) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004074 case MBEDTLS_SSL_MINOR_VERSION_3:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004075 return "TLSv1.2";
Paul Bakker1ef83d62012-04-11 12:09:53 +00004076
Paul Bakker43ca69c2011-01-15 17:35:19 +00004077 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004078 return "unknown";
Paul Bakker43ca69c2011-01-15 17:35:19 +00004079 }
Paul Bakker43ca69c2011-01-15 17:35:19 +00004080}
4081
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004082# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
4083size_t mbedtls_ssl_get_input_max_frag_len(const mbedtls_ssl_context *ssl)
Andrzej Kurek90c6e842020-04-03 05:25:29 -04004084{
David Horstmann95d516f2021-05-04 18:36:56 +01004085 size_t max_len = MBEDTLS_SSL_IN_CONTENT_LEN;
Andrzej Kurek90c6e842020-04-03 05:25:29 -04004086 size_t read_mfl;
4087
4088 /* Use the configured MFL for the client if we're past SERVER_HELLO_DONE */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004089 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
4090 ssl->state >= MBEDTLS_SSL_SERVER_HELLO_DONE) {
4091 return ssl_mfl_code_to_length(ssl->conf->mfl_code);
Andrzej Kurek90c6e842020-04-03 05:25:29 -04004092 }
4093
4094 /* Check if a smaller max length was negotiated */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004095 if (ssl->session_out != NULL) {
4096 read_mfl = ssl_mfl_code_to_length(ssl->session_out->mfl_code);
4097 if (read_mfl < max_len) {
Andrzej Kurek90c6e842020-04-03 05:25:29 -04004098 max_len = read_mfl;
4099 }
4100 }
4101
4102 // During a handshake, use the value being negotiated
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004103 if (ssl->session_negotiate != NULL) {
4104 read_mfl = ssl_mfl_code_to_length(ssl->session_negotiate->mfl_code);
4105 if (read_mfl < max_len) {
Andrzej Kurek90c6e842020-04-03 05:25:29 -04004106 max_len = read_mfl;
4107 }
4108 }
4109
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004110 return max_len;
Andrzej Kurek90c6e842020-04-03 05:25:29 -04004111}
4112
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004113size_t mbedtls_ssl_get_output_max_frag_len(const mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02004114{
4115 size_t max_len;
4116
4117 /*
4118 * Assume mfl_code is correct since it was checked when set
4119 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004120 max_len = ssl_mfl_code_to_length(ssl->conf->mfl_code);
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02004121
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02004122 /* Check if a smaller max length was negotiated */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004123 if (ssl->session_out != NULL &&
4124 ssl_mfl_code_to_length(ssl->session_out->mfl_code) < max_len) {
4125 max_len = ssl_mfl_code_to_length(ssl->session_out->mfl_code);
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02004126 }
4127
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02004128 /* During a handshake, use the value being negotiated */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004129 if (ssl->session_negotiate != NULL &&
4130 ssl_mfl_code_to_length(ssl->session_negotiate->mfl_code) < max_len) {
4131 max_len = ssl_mfl_code_to_length(ssl->session_negotiate->mfl_code);
Manuel Pégourié-Gonnard2cb17e22017-09-19 13:00:47 +02004132 }
4133
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004134 return max_len;
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02004135}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004136# endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Manuel Pégourié-Gonnarda2cda6b2015-08-31 18:30:52 +02004137
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004138# if defined(MBEDTLS_SSL_PROTO_DTLS)
4139size_t mbedtls_ssl_get_current_mtu(const mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02004140{
Andrzej Kurekef43ce62018-10-09 08:24:12 -04004141 /* Return unlimited mtu for client hello messages to avoid fragmentation. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004142 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&
4143 (ssl->state == MBEDTLS_SSL_CLIENT_HELLO ||
4144 ssl->state == MBEDTLS_SSL_SERVER_HELLO))
4145 return 0;
Andrzej Kurekef43ce62018-10-09 08:24:12 -04004146
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004147 if (ssl->handshake == NULL || ssl->handshake->mtu == 0)
4148 return ssl->mtu;
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02004149
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004150 if (ssl->mtu == 0)
4151 return ssl->handshake->mtu;
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02004152
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004153 return (ssl->mtu < ssl->handshake->mtu ? ssl->mtu : ssl->handshake->mtu);
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02004154}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004155# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardb8eec192018-08-20 09:34:02 +02004156
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004157int mbedtls_ssl_get_max_out_record_payload(const mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004158{
4159 size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN;
4160
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004161# if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
4162 !defined(MBEDTLS_SSL_PROTO_DTLS)
4163 (void)ssl;
4164# endif
Manuel Pégourié-Gonnard000281e2018-08-21 11:20:58 +02004165
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004166# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
4167 const size_t mfl = mbedtls_ssl_get_output_max_frag_len(ssl);
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004168
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004169 if (max_len > mfl)
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004170 max_len = mfl;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004171# endif
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004172
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004173# if defined(MBEDTLS_SSL_PROTO_DTLS)
4174 if (mbedtls_ssl_get_current_mtu(ssl) != 0) {
4175 const size_t mtu = mbedtls_ssl_get_current_mtu(ssl);
4176 const int ret = mbedtls_ssl_get_record_expansion(ssl);
4177 const size_t overhead = (size_t)ret;
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004178
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004179 if (ret < 0)
4180 return ret;
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004181
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004182 if (mtu <= overhead) {
4183 MBEDTLS_SSL_DEBUG_MSG(1, ("MTU too low for record expansion"));
4184 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004185 }
4186
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004187 if (max_len > mtu - overhead)
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004188 max_len = mtu - overhead;
4189 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004190# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004191
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004192# if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \
4193 !defined(MBEDTLS_SSL_PROTO_DTLS)
4194 ((void)ssl);
4195# endif
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004196
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004197 return (int)max_len;
Manuel Pégourié-Gonnard9468ff12017-09-21 13:49:50 +02004198}
4199
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004200int mbedtls_ssl_get_max_in_record_payload(const mbedtls_ssl_context *ssl)
Hanno Becker2d8e99b2021-04-21 06:19:50 +01004201{
4202 size_t max_len = MBEDTLS_SSL_IN_CONTENT_LEN;
4203
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004204# if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
4205 (void)ssl;
4206# endif
Hanno Becker2d8e99b2021-04-21 06:19:50 +01004207
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004208# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
4209 const size_t mfl = mbedtls_ssl_get_input_max_frag_len(ssl);
Hanno Becker2d8e99b2021-04-21 06:19:50 +01004210
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004211 if (max_len > mfl)
Hanno Becker2d8e99b2021-04-21 06:19:50 +01004212 max_len = mfl;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004213# endif
Hanno Becker2d8e99b2021-04-21 06:19:50 +01004214
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004215 return (int)max_len;
Hanno Becker2d8e99b2021-04-21 06:19:50 +01004216}
4217
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004218# if defined(MBEDTLS_X509_CRT_PARSE_C)
4219const mbedtls_x509_crt *
4220mbedtls_ssl_get_peer_cert(const mbedtls_ssl_context *ssl)
Paul Bakkerb0550d92012-10-30 07:51:03 +00004221{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004222 if (ssl == NULL || ssl->session == NULL)
4223 return NULL;
Paul Bakkerb0550d92012-10-30 07:51:03 +00004224
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004225# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4226 return ssl->session->peer_cert;
4227# else
4228 return NULL;
4229# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Paul Bakkerb0550d92012-10-30 07:51:03 +00004230}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004231# endif /* MBEDTLS_X509_CRT_PARSE_C */
Paul Bakkerb0550d92012-10-30 07:51:03 +00004232
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004233# if defined(MBEDTLS_SSL_CLI_C)
4234int mbedtls_ssl_get_session(const mbedtls_ssl_context *ssl,
4235 mbedtls_ssl_session *dst)
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02004236{
Hanno Beckere810bbc2021-05-14 16:01:05 +01004237 int ret;
4238
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004239 if (ssl == NULL || dst == NULL || ssl->session == NULL ||
4240 ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT) {
4241 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02004242 }
4243
Hanno Beckere810bbc2021-05-14 16:01:05 +01004244 /* Since Mbed TLS 3.0, mbedtls_ssl_get_session() is no longer
4245 * idempotent: Each session can only be exported once.
4246 *
4247 * (This is in preparation for TLS 1.3 support where we will
4248 * need the ability to export multiple sessions (aka tickets),
4249 * which will be achieved by calling mbedtls_ssl_get_session()
4250 * multiple times until it fails.)
4251 *
4252 * Check whether we have already exported the current session,
4253 * and fail if so.
4254 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004255 if (ssl->session->exported == 1)
4256 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Beckere810bbc2021-05-14 16:01:05 +01004257
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004258 ret = mbedtls_ssl_session_copy(dst, ssl->session);
4259 if (ret != 0)
4260 return ret;
Hanno Beckere810bbc2021-05-14 16:01:05 +01004261
4262 /* Remember that we've exported the session. */
4263 ssl->session->exported = 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004264 return 0;
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02004265}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004266# endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard74718032013-07-30 12:41:56 +02004267
Paul Bakker5121ce52009-01-03 21:22:43 +00004268/*
Hanno Beckera835da52019-05-16 12:39:07 +01004269 * Define ticket header determining Mbed TLS version
4270 * and structure of the ticket.
4271 */
4272
Hanno Becker94ef3b32019-05-16 12:50:45 +01004273/*
Hanno Becker50b59662019-05-28 14:30:45 +01004274 * Define bitflag determining compile-time settings influencing
4275 * structure of serialized SSL sessions.
Hanno Becker94ef3b32019-05-16 12:50:45 +01004276 */
4277
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004278# if defined(MBEDTLS_HAVE_TIME)
4279# define SSL_SERIALIZED_SESSION_CONFIG_TIME 1
4280# else
4281# define SSL_SERIALIZED_SESSION_CONFIG_TIME 0
4282# endif /* MBEDTLS_HAVE_TIME */
Hanno Becker94ef3b32019-05-16 12:50:45 +01004283
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004284# if defined(MBEDTLS_X509_CRT_PARSE_C)
4285# define SSL_SERIALIZED_SESSION_CONFIG_CRT 1
4286# else
4287# define SSL_SERIALIZED_SESSION_CONFIG_CRT 0
4288# endif /* MBEDTLS_X509_CRT_PARSE_C */
Hanno Becker94ef3b32019-05-16 12:50:45 +01004289
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004290# if defined(MBEDTLS_SSL_CLI_C) && defined(MBEDTLS_SSL_SESSION_TICKETS)
4291# define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 1
4292# else
4293# define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET 0
4294# endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_SESSION_TICKETS */
Hanno Becker94ef3b32019-05-16 12:50:45 +01004295
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004296# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
4297# define SSL_SERIALIZED_SESSION_CONFIG_MFL 1
4298# else
4299# define SSL_SERIALIZED_SESSION_CONFIG_MFL 0
4300# endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */
Hanno Becker94ef3b32019-05-16 12:50:45 +01004301
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004302# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
4303# define SSL_SERIALIZED_SESSION_CONFIG_ETM 1
4304# else
4305# define SSL_SERIALIZED_SESSION_CONFIG_ETM 0
4306# endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
Hanno Becker94ef3b32019-05-16 12:50:45 +01004307
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004308# if defined(MBEDTLS_SSL_SESSION_TICKETS)
4309# define SSL_SERIALIZED_SESSION_CONFIG_TICKET 1
4310# else
4311# define SSL_SERIALIZED_SESSION_CONFIG_TICKET 0
4312# endif /* MBEDTLS_SSL_SESSION_TICKETS */
Hanno Becker94ef3b32019-05-16 12:50:45 +01004313
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004314# define SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT 0
4315# define SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT 1
4316# define SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT 2
4317# define SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT 3
4318# define SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT 4
4319# define SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT 5
Hanno Becker3e088662019-05-29 11:10:18 +01004320
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004321# define SSL_SERIALIZED_SESSION_CONFIG_BITFLAG \
4322 ((uint16_t)((SSL_SERIALIZED_SESSION_CONFIG_TIME \
4323 << SSL_SERIALIZED_SESSION_CONFIG_TIME_BIT) | \
4324 (SSL_SERIALIZED_SESSION_CONFIG_CRT \
4325 << SSL_SERIALIZED_SESSION_CONFIG_CRT_BIT) | \
4326 (SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET \
4327 << SSL_SERIALIZED_SESSION_CONFIG_CLIENT_TICKET_BIT) | \
4328 (SSL_SERIALIZED_SESSION_CONFIG_MFL \
4329 << SSL_SERIALIZED_SESSION_CONFIG_MFL_BIT) | \
4330 (SSL_SERIALIZED_SESSION_CONFIG_ETM \
4331 << SSL_SERIALIZED_SESSION_CONFIG_ETM_BIT) | \
4332 (SSL_SERIALIZED_SESSION_CONFIG_TICKET \
4333 << SSL_SERIALIZED_SESSION_CONFIG_TICKET_BIT)))
Hanno Becker94ef3b32019-05-16 12:50:45 +01004334
Hanno Beckerf8787072019-05-16 12:41:07 +01004335static unsigned char ssl_serialized_session_header[] = {
Hanno Becker94ef3b32019-05-16 12:50:45 +01004336 MBEDTLS_VERSION_MAJOR,
4337 MBEDTLS_VERSION_MINOR,
4338 MBEDTLS_VERSION_PATCH,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004339 (SSL_SERIALIZED_SESSION_CONFIG_BITFLAG >> 8) & 0xFF,
4340 (SSL_SERIALIZED_SESSION_CONFIG_BITFLAG >> 0) & 0xFF,
Hanno Beckerf8787072019-05-16 12:41:07 +01004341};
Hanno Beckera835da52019-05-16 12:39:07 +01004342
4343/*
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004344 * Serialize a session in the following format:
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004345 * (in the presentation language of TLS, RFC 8446 section 3)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004346 *
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004347 * struct {
Hanno Beckerdc28b6c2019-05-29 11:08:00 +01004348 *
Hanno Beckerdce50972021-08-01 05:39:23 +01004349 * opaque mbedtls_version[3]; // library version: major, minor, patch
4350 * opaque session_format[2]; // library-version specific 16-bit field
4351 * // determining the format of the remaining
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004352 * // serialized data.
Hanno Beckerdc28b6c2019-05-29 11:08:00 +01004353 *
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004354 * Note: When updating the format, remember to keep
4355 * these version+format bytes.
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004356 *
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004357 * // In this version, `session_format` determines
4358 * // the setting of those compile-time
4359 * // configuration options which influence
4360 * // the structure of mbedtls_ssl_session.
4361 *
Hanno Beckerfa0d61e2021-08-02 08:56:14 +01004362 * uint8_t minor_ver; // Protocol-version. Possible values:
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004363 * // - TLS 1.2 (MBEDTLS_SSL_MINOR_VERSION_3)
4364 *
4365 * select (serialized_session.minor_ver) {
4366 *
4367 * case MBEDTLS_SSL_MINOR_VERSION_3: // TLS 1.2
4368 * serialized_session_tls12 data;
4369 *
4370 * };
4371 *
4372 * } serialized_session;
4373 *
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004374 */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004375
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004376# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004377/* Serialization of TLS 1.2 sessions:
4378 *
4379 * struct {
4380 * uint64 start_time;
4381 * uint8 ciphersuite[2]; // defined by the standard
4382 * uint8 compression; // 0 or 1
4383 * uint8 session_id_len; // at most 32
4384 * opaque session_id[32];
4385 * opaque master[48]; // fixed length in the standard
4386 * uint32 verify_result;
4387 * opaque peer_cert<0..2^24-1>; // length 0 means no peer cert
4388 * opaque ticket<0..2^24-1>; // length 0 means no ticket
4389 * uint32 ticket_lifetime;
4390 * uint8 mfl_code; // up to 255 according to standard
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004391 * uint8 encrypt_then_mac; // 0 or 1
4392 * } serialized_session_tls12;
4393 *
4394 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004395static size_t ssl_session_save_tls12(const mbedtls_ssl_session *session,
4396 unsigned char *buf,
4397 size_t buf_len)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004398{
4399 unsigned char *p = buf;
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02004400 size_t used = 0;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004401
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004402# if defined(MBEDTLS_HAVE_TIME)
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004403 uint64_t start;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004404# endif
4405# if defined(MBEDTLS_X509_CRT_PARSE_C)
4406# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004407 size_t cert_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004408# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4409# endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004410
Hanno Beckera835da52019-05-16 12:39:07 +01004411 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004412 * Time
4413 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004414# if defined(MBEDTLS_HAVE_TIME)
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004415 used += 8;
4416
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004417 if (used <= buf_len) {
4418 start = (uint64_t)session->start;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004419
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004420 *p++ = (unsigned char)((start >> 56) & 0xFF);
4421 *p++ = (unsigned char)((start >> 48) & 0xFF);
4422 *p++ = (unsigned char)((start >> 40) & 0xFF);
4423 *p++ = (unsigned char)((start >> 32) & 0xFF);
4424 *p++ = (unsigned char)((start >> 24) & 0xFF);
4425 *p++ = (unsigned char)((start >> 16) & 0xFF);
4426 *p++ = (unsigned char)((start >> 8) & 0xFF);
4427 *p++ = (unsigned char)((start)&0xFF);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004428 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004429# endif /* MBEDTLS_HAVE_TIME */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004430
4431 /*
4432 * Basic mandatory fields
4433 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004434 used += 2 /* ciphersuite */
4435 + 1 /* compression */
4436 + 1 /* id_len */
4437 + sizeof(session->id) + sizeof(session->master) +
4438 4; /* verify_result
4439 */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004440
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004441 if (used <= buf_len) {
4442 *p++ = (unsigned char)((session->ciphersuite >> 8) & 0xFF);
4443 *p++ = (unsigned char)((session->ciphersuite) & 0xFF);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004444
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004445 *p++ = (unsigned char)(session->compression & 0xFF);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004446
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004447 *p++ = (unsigned char)(session->id_len & 0xFF);
4448 memcpy(p, session->id, 32);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004449 p += 32;
4450
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004451 memcpy(p, session->master, 48);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004452 p += 48;
4453
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004454 *p++ = (unsigned char)((session->verify_result >> 24) & 0xFF);
4455 *p++ = (unsigned char)((session->verify_result >> 16) & 0xFF);
4456 *p++ = (unsigned char)((session->verify_result >> 8) & 0xFF);
4457 *p++ = (unsigned char)((session->verify_result) & 0xFF);
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02004458 }
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004459
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004460 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004461 * Peer's end-entity certificate
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004462 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004463# if defined(MBEDTLS_X509_CRT_PARSE_C)
4464# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
4465 if (session->peer_cert == NULL)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004466 cert_len = 0;
4467 else
4468 cert_len = session->peer_cert->raw.len;
4469
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02004470 used += 3 + cert_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004471
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004472 if (used <= buf_len) {
4473 *p++ = (unsigned char)((cert_len >> 16) & 0xFF);
4474 *p++ = (unsigned char)((cert_len >> 8) & 0xFF);
4475 *p++ = (unsigned char)((cert_len)&0xFF);
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004476
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004477 if (session->peer_cert != NULL) {
4478 memcpy(p, session->peer_cert->raw.p, cert_len);
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02004479 p += cert_len;
4480 }
4481 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004482# else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4483 if (session->peer_cert_digest != NULL) {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004484 used += 1 /* type */ + 1 /* length */ + session->peer_cert_digest_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004485 if (used <= buf_len) {
4486 *p++ = (unsigned char)session->peer_cert_digest_type;
4487 *p++ = (unsigned char)session->peer_cert_digest_len;
4488 memcpy(p, session->peer_cert_digest, session->peer_cert_digest_len);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004489 p += session->peer_cert_digest_len;
4490 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004491 } else {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004492 used += 2;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004493 if (used <= buf_len) {
4494 *p++ = (unsigned char)MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004495 *p++ = 0;
4496 }
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02004497 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004498# endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4499# endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004500
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004501 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004502 * Session ticket if any, plus associated data
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004503 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004504# if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004505 used += 3 + session->ticket_len + 4; /* len + ticket + lifetime */
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004506
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004507 if (used <= buf_len) {
4508 *p++ = (unsigned char)((session->ticket_len >> 16) & 0xFF);
4509 *p++ = (unsigned char)((session->ticket_len >> 8) & 0xFF);
4510 *p++ = (unsigned char)((session->ticket_len) & 0xFF);
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02004511
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004512 if (session->ticket != NULL) {
4513 memcpy(p, session->ticket, session->ticket_len);
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02004514 p += session->ticket_len;
4515 }
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004516
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004517 *p++ = (unsigned char)((session->ticket_lifetime >> 24) & 0xFF);
4518 *p++ = (unsigned char)((session->ticket_lifetime >> 16) & 0xFF);
4519 *p++ = (unsigned char)((session->ticket_lifetime >> 8) & 0xFF);
4520 *p++ = (unsigned char)((session->ticket_lifetime) & 0xFF);
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004521 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004522# endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004523
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004524 /*
4525 * Misc extension-related info
4526 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004527# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004528 used += 1;
4529
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004530 if (used <= buf_len)
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004531 *p++ = session->mfl_code;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004532# endif
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004533
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004534# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004535 used += 1;
4536
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004537 if (used <= buf_len)
4538 *p++ = (unsigned char)((session->encrypt_then_mac) & 0xFF);
4539# endif
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004540
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004541 return used;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004542}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004543# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnard26f982f2019-05-21 11:01:32 +02004544
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004545static int ssl_session_save(const mbedtls_ssl_session *session,
4546 unsigned char omit_header,
4547 unsigned char *buf,
4548 size_t buf_len,
4549 size_t *olen)
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004550{
4551 unsigned char *p = buf;
4552 size_t used = 0;
4553
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004554 if (!omit_header) {
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004555 /*
4556 * Add Mbed TLS version identifier
4557 */
4558
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004559 used += sizeof(ssl_serialized_session_header);
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004560
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004561 if (used <= buf_len) {
4562 memcpy(p, ssl_serialized_session_header,
4563 sizeof(ssl_serialized_session_header));
4564 p += sizeof(ssl_serialized_session_header);
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004565 }
4566 }
4567
4568 /*
4569 * TLS version identifier
4570 */
4571 used += 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004572 if (used <= buf_len) {
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004573 *p++ = session->minor_ver;
4574 }
4575
4576 /* Forward to version-specific serialization routine. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004577 switch (session->minor_ver) {
4578# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4579 case MBEDTLS_SSL_MINOR_VERSION_3:
4580 {
4581 size_t remaining_len = used <= buf_len ? buf_len - used : 0;
4582 used += ssl_session_save_tls12(session, p, remaining_len);
4583 break;
4584 }
4585# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004586
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004587 default:
4588 return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004589 }
4590
4591 *olen = used;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004592 if (used > buf_len)
4593 return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004594
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004595 return 0;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004596}
4597
4598/*
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02004599 * Public wrapper for ssl_session_save()
4600 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004601int mbedtls_ssl_session_save(const mbedtls_ssl_session *session,
4602 unsigned char *buf,
4603 size_t buf_len,
4604 size_t *olen)
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02004605{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004606 return ssl_session_save(session, 0, buf, buf_len, olen);
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02004607}
4608
4609/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02004610 * Deserialize session, see mbedtls_ssl_session_save() for format.
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004611 *
4612 * This internal version is wrapped by a public function that cleans up in
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02004613 * case of error, and has an extra option omit_header.
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004614 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004615static int ssl_session_load_tls12(mbedtls_ssl_session *session,
4616 const unsigned char *buf,
4617 size_t len)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004618{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004619# if defined(MBEDTLS_HAVE_TIME)
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004620 uint64_t start;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004621# endif
4622# if defined(MBEDTLS_X509_CRT_PARSE_C)
4623# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004624 size_t cert_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004625# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4626# endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004627
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004628 const unsigned char *p = buf;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004629 const unsigned char *const end = buf + len;
Hanno Beckera835da52019-05-16 12:39:07 +01004630
4631 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004632 * Time
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004633 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004634# if defined(MBEDTLS_HAVE_TIME)
4635 if (8 > (size_t)(end - p))
4636 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004637
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004638 start = ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48) |
4639 ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32) |
4640 ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16) |
4641 ((uint64_t)p[6] << 8) | ((uint64_t)p[7]);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004642 p += 8;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004643
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004644 session->start = (time_t)start;
4645# endif /* MBEDTLS_HAVE_TIME */
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004646
4647 /*
4648 * Basic mandatory fields
4649 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004650 if (2 + 1 + 1 + 32 + 48 + 4 > (size_t)(end - p))
4651 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004652
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004653 session->ciphersuite = (p[0] << 8) | p[1];
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004654 p += 2;
4655
4656 session->compression = *p++;
4657
4658 session->id_len = *p++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004659 memcpy(session->id, p, 32);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004660 p += 32;
4661
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004662 memcpy(session->master, p, 48);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004663 p += 48;
4664
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004665 session->verify_result = ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) |
4666 ((uint32_t)p[2] << 8) | ((uint32_t)p[3]);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004667 p += 4;
4668
4669 /* Immediately clear invalid pointer values that have been read, in case
4670 * we exit early before we replaced them with valid ones. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004671# if defined(MBEDTLS_X509_CRT_PARSE_C)
4672# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004673 session->peer_cert = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004674# else
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004675 session->peer_cert_digest = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004676# endif /* !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4677# endif /* MBEDTLS_X509_CRT_PARSE_C */
4678# if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004679 session->ticket = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004680# endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004681
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004682 /*
4683 * Peer certificate
4684 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004685# if defined(MBEDTLS_X509_CRT_PARSE_C)
4686# if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004687 /* Deserialize CRT from the end of the ticket. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004688 if (3 > (size_t)(end - p))
4689 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004690
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004691 cert_len = (p[0] << 16) | (p[1] << 8) | p[2];
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004692 p += 3;
4693
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004694 if (cert_len != 0) {
Janos Follath865b3eb2019-12-16 11:46:15 +00004695 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004696
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004697 if (cert_len > (size_t)(end - p))
4698 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004699
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004700 session->peer_cert = mbedtls_calloc(1, sizeof(mbedtls_x509_crt));
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004701
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004702 if (session->peer_cert == NULL)
4703 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004704
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004705 mbedtls_x509_crt_init(session->peer_cert);
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004706
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004707 if ((ret = mbedtls_x509_crt_parse_der(session->peer_cert, p,
4708 cert_len)) != 0) {
4709 mbedtls_x509_crt_free(session->peer_cert);
4710 mbedtls_free(session->peer_cert);
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004711 session->peer_cert = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004712 return ret;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004713 }
4714
4715 p += cert_len;
4716 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004717# else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004718 /* Deserialize CRT digest from the end of the ticket. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004719 if (2 > (size_t)(end - p))
4720 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004721
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004722 session->peer_cert_digest_type = (mbedtls_md_type_t)*p++;
4723 session->peer_cert_digest_len = (size_t)*p++;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004724
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004725 if (session->peer_cert_digest_len != 0) {
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004726 const mbedtls_md_info_t *md_info =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004727 mbedtls_md_info_from_type(session->peer_cert_digest_type);
4728 if (md_info == NULL)
4729 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
4730 if (session->peer_cert_digest_len != mbedtls_md_get_size(md_info))
4731 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004732
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004733 if (session->peer_cert_digest_len > (size_t)(end - p))
4734 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004735
4736 session->peer_cert_digest =
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004737 mbedtls_calloc(1, session->peer_cert_digest_len);
4738 if (session->peer_cert_digest == NULL)
4739 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004740
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004741 memcpy(session->peer_cert_digest, p, session->peer_cert_digest_len);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004742 p += session->peer_cert_digest_len;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004743 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004744# endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
4745# endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004746
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004747 /*
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004748 * Session ticket and associated data
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004749 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004750# if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
4751 if (3 > (size_t)(end - p))
4752 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004753
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004754 session->ticket_len = (p[0] << 16) | (p[1] << 8) | p[2];
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004755 p += 3;
4756
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004757 if (session->ticket_len != 0) {
4758 if (session->ticket_len > (size_t)(end - p))
4759 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004760
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004761 session->ticket = mbedtls_calloc(1, session->ticket_len);
4762 if (session->ticket == NULL)
4763 return MBEDTLS_ERR_SSL_ALLOC_FAILED;
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004764
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004765 memcpy(session->ticket, p, session->ticket_len);
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004766 p += session->ticket_len;
4767 }
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004768
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004769 if (4 > (size_t)(end - p))
4770 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004771
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004772 session->ticket_lifetime = ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) |
4773 ((uint32_t)p[2] << 8) | ((uint32_t)p[3]);
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004774 p += 4;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004775# endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004776
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004777 /*
4778 * Misc extension-related info
4779 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004780# if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)
4781 if (1 > (size_t)(end - p))
4782 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004783
4784 session->mfl_code = *p++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004785# endif
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004786
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004787# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
4788 if (1 > (size_t)(end - p))
4789 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004790
4791 session->encrypt_then_mac = *p++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004792# endif
Manuel Pégourié-Gonnardf743c032019-05-24 12:06:29 +02004793
Manuel Pégourié-Gonnard35eb8022019-05-16 11:11:08 +02004794 /* Done, should have consumed entire buffer */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004795 if (p != end)
4796 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004797
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004798 return 0;
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004799}
4800
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004801static int ssl_session_load(mbedtls_ssl_session *session,
4802 unsigned char omit_header,
4803 const unsigned char *buf,
4804 size_t len)
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004805{
4806 const unsigned char *p = buf;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004807 const unsigned char *const end = buf + len;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004808
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004809 if (!omit_header) {
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004810 /*
4811 * Check Mbed TLS version identifier
4812 */
4813
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004814 if ((size_t)(end - p) < sizeof(ssl_serialized_session_header))
4815 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004816
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004817 if (memcmp(p, ssl_serialized_session_header,
4818 sizeof(ssl_serialized_session_header)) != 0) {
4819 return MBEDTLS_ERR_SSL_VERSION_MISMATCH;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004820 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004821 p += sizeof(ssl_serialized_session_header);
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004822 }
4823
4824 /*
4825 * TLS version identifier
4826 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004827 if (1 > (size_t)(end - p))
4828 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004829 session->minor_ver = *p++;
4830
4831 /* Dispatch according to TLS version. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004832 switch (session->minor_ver) {
4833# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
4834 case MBEDTLS_SSL_MINOR_VERSION_3: /* TLS 1.2 */
4835 {
4836 size_t remaining_len = (end - p);
4837 return ssl_session_load_tls12(session, p, remaining_len);
4838 }
4839# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004840
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004841 default:
4842 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Beckerfadbdbb2021-07-23 06:25:48 +01004843 }
4844}
4845
Manuel Pégourié-Gonnarda3e7c652019-05-16 10:08:35 +02004846/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02004847 * Deserialize session: public wrapper for error cleaning
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004848 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004849int mbedtls_ssl_session_load(mbedtls_ssl_session *session,
4850 const unsigned char *buf,
4851 size_t len)
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004852{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004853 int ret = ssl_session_load(session, 0, buf, len);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004854
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004855 if (ret != 0)
4856 mbedtls_ssl_session_free(session);
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004857
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004858 return ret;
Manuel Pégourié-Gonnarda3d831b2019-05-23 12:28:45 +02004859}
4860
4861/*
Paul Bakker1961b702013-01-25 14:49:24 +01004862 * Perform a single step of the SSL handshake
Paul Bakker5121ce52009-01-03 21:22:43 +00004863 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004864int mbedtls_ssl_handshake_step(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00004865{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004866 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Paul Bakker5121ce52009-01-03 21:22:43 +00004867
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004868 if (ssl == NULL || ssl->conf == NULL)
4869 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02004870
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004871# if defined(MBEDTLS_SSL_CLI_C)
4872 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT)
4873 ret = mbedtls_ssl_handshake_client_step(ssl);
4874# endif
4875# if defined(MBEDTLS_SSL_SRV_C)
4876 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER)
4877 ret = mbedtls_ssl_handshake_server_step(ssl);
4878# endif
Paul Bakker5121ce52009-01-03 21:22:43 +00004879
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004880 return ret;
Paul Bakker1961b702013-01-25 14:49:24 +01004881}
4882
4883/*
4884 * Perform the SSL handshake
4885 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004886int mbedtls_ssl_handshake(mbedtls_ssl_context *ssl)
Paul Bakker1961b702013-01-25 14:49:24 +01004887{
4888 int ret = 0;
4889
Hanno Beckera817ea42020-10-20 15:20:23 +01004890 /* Sanity checks */
4891
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004892 if (ssl == NULL || ssl->conf == NULL)
4893 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02004894
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004895# if defined(MBEDTLS_SSL_PROTO_DTLS)
4896 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
4897 (ssl->f_set_timer == NULL || ssl->f_get_timer == NULL)) {
4898 MBEDTLS_SSL_DEBUG_MSG(1, ("You must use "
4899 "mbedtls_ssl_set_timer_cb() for DTLS"));
4900 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Hanno Beckera817ea42020-10-20 15:20:23 +01004901 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004902# endif /* MBEDTLS_SSL_PROTO_DTLS */
Hanno Beckera817ea42020-10-20 15:20:23 +01004903
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004904 MBEDTLS_SSL_DEBUG_MSG(2, ("=> handshake"));
Paul Bakker1961b702013-01-25 14:49:24 +01004905
Hanno Beckera817ea42020-10-20 15:20:23 +01004906 /* Main handshake loop */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004907 while (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) {
4908 ret = mbedtls_ssl_handshake_step(ssl);
Paul Bakker1961b702013-01-25 14:49:24 +01004909
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004910 if (ret != 0)
Paul Bakker1961b702013-01-25 14:49:24 +01004911 break;
4912 }
4913
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004914 MBEDTLS_SSL_DEBUG_MSG(2, ("<= handshake"));
Paul Bakker5121ce52009-01-03 21:22:43 +00004915
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004916 return ret;
Paul Bakker5121ce52009-01-03 21:22:43 +00004917}
4918
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004919# if defined(MBEDTLS_SSL_RENEGOTIATION)
4920# if defined(MBEDTLS_SSL_SRV_C)
Paul Bakker5121ce52009-01-03 21:22:43 +00004921/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004922 * Write HelloRequest to request renegotiation on server
Paul Bakker48916f92012-09-16 19:57:18 +00004923 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004924static int ssl_write_hello_request(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004925{
Janos Follath865b3eb2019-12-16 11:46:15 +00004926 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004927
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004928 MBEDTLS_SSL_DEBUG_MSG(2, ("=> write hello request"));
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004929
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004930 ssl->out_msglen = 4;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004931 ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004932 ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004933
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004934 if ((ret = mbedtls_ssl_write_handshake_msg(ssl)) != 0) {
4935 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_write_handshake_msg", ret);
4936 return ret;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004937 }
4938
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004939 MBEDTLS_SSL_DEBUG_MSG(2, ("<= write hello request"));
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004940
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004941 return 0;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004942}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004943# endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004944
4945/*
4946 * Actually renegotiate current connection, triggered by either:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004947 * - any side: calling mbedtls_ssl_renegotiate(),
4948 * - client: receiving a HelloRequest during mbedtls_ssl_read(),
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004949 * - server: receiving any handshake message on server during mbedtls_ssl_read()
4950 * after the initial handshake is completed. If the handshake doesn't complete
4951 * due to waiting for I/O, it will continue during the next calls to
4952 * mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively.
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004953 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004954int mbedtls_ssl_start_renegotiation(mbedtls_ssl_context *ssl)
Paul Bakker48916f92012-09-16 19:57:18 +00004955{
Janos Follath865b3eb2019-12-16 11:46:15 +00004956 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Paul Bakker48916f92012-09-16 19:57:18 +00004957
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004958 MBEDTLS_SSL_DEBUG_MSG(2, ("=> renegotiate"));
Paul Bakker48916f92012-09-16 19:57:18 +00004959
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004960 if ((ret = ssl_handshake_init(ssl)) != 0)
4961 return ret;
Paul Bakker48916f92012-09-16 19:57:18 +00004962
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004963 /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and
4964 * the ServerHello will have message_seq = 1" */
4965# if defined(MBEDTLS_SSL_PROTO_DTLS)
4966 if (ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&
4967 ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING) {
4968 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER)
Manuel Pégourié-Gonnard1aa586e2014-09-03 12:54:04 +02004969 ssl->handshake->out_msg_seq = 1;
4970 else
4971 ssl->handshake->in_msg_seq = 1;
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02004972 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004973# endif
Manuel Pégourié-Gonnard0557bd52014-08-19 19:18:39 +02004974
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004975 ssl->state = MBEDTLS_SSL_HELLO_REQUEST;
4976 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS;
Paul Bakker48916f92012-09-16 19:57:18 +00004977
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004978 if ((ret = mbedtls_ssl_handshake(ssl)) != 0) {
4979 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_handshake", ret);
4980 return ret;
Paul Bakker48916f92012-09-16 19:57:18 +00004981 }
4982
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004983 MBEDTLS_SSL_DEBUG_MSG(2, ("<= renegotiate"));
Paul Bakker48916f92012-09-16 19:57:18 +00004984
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004985 return 0;
Paul Bakker48916f92012-09-16 19:57:18 +00004986}
4987
4988/*
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004989 * Renegotiate current connection on client,
4990 * or request renegotiation on server
4991 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004992int mbedtls_ssl_renegotiate(mbedtls_ssl_context *ssl)
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01004993{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004994 int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01004995
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004996 if (ssl == NULL || ssl->conf == NULL)
4997 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardf81ee2e2015-09-01 17:43:40 +02004998
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02004999# if defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005000 /* On server, just send the request */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005001 if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
5002 if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER)
5003 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005004
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005005 ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02005006
5007 /* Did we already try/start sending HelloRequest? */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005008 if (ssl->out_left != 0)
5009 return mbedtls_ssl_flush_output(ssl);
Manuel Pégourié-Gonnardf07f4212014-08-15 19:04:47 +02005010
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005011 return ssl_write_hello_request(ssl);
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005012 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005013# endif /* MBEDTLS_SSL_SRV_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005014
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005015# if defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005016 /*
5017 * On client, either start the renegotiation process or,
5018 * if already in progress, continue the handshake
5019 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005020 if (ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS) {
5021 if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER)
5022 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005023
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005024 if ((ret = mbedtls_ssl_start_renegotiation(ssl)) != 0) {
5025 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_start_renegotiation", ret);
5026 return ret;
5027 }
5028 } else {
5029 if ((ret = mbedtls_ssl_handshake(ssl)) != 0) {
5030 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_handshake", ret);
5031 return ret;
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005032 }
5033 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005034# endif /* MBEDTLS_SSL_CLI_C */
Manuel Pégourié-Gonnard9c1e1892013-10-30 16:41:21 +01005035
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005036 return ret;
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005037}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005038# endif /* MBEDTLS_SSL_RENEGOTIATION */
Manuel Pégourié-Gonnard214eed32013-10-30 13:06:54 +01005039
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005040# if defined(MBEDTLS_X509_CRT_PARSE_C)
5041static void ssl_key_cert_free(mbedtls_ssl_key_cert *key_cert)
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02005042{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005043 mbedtls_ssl_key_cert *cur = key_cert, *next;
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02005044
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005045 while (cur != NULL) {
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02005046 next = cur->next;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005047 mbedtls_free(cur);
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02005048 cur = next;
5049 }
5050}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005051# endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02005052
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005053void mbedtls_ssl_handshake_free(mbedtls_ssl_context *ssl)
Paul Bakker48916f92012-09-16 19:57:18 +00005054{
Gilles Peskine9b562d52018-04-25 20:32:43 +02005055 mbedtls_ssl_handshake_params *handshake = ssl->handshake;
5056
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005057 if (handshake == NULL)
Paul Bakkeraccaffe2014-06-26 13:37:14 +02005058 return;
5059
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005060# if defined(MBEDTLS_SSL_ASYNC_PRIVATE)
5061 if (ssl->conf->f_async_cancel != NULL &&
5062 handshake->async_in_progress != 0) {
5063 ssl->conf->f_async_cancel(ssl);
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02005064 handshake->async_in_progress = 0;
5065 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005066# endif /* MBEDTLS_SSL_ASYNC_PRIVATE */
Gilles Peskinedf13d5c2018-04-25 20:39:48 +02005067
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005068# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
5069# if defined(MBEDTLS_SHA256_C)
5070# if defined(MBEDTLS_USE_PSA_CRYPTO)
5071 psa_hash_abort(&handshake->fin_sha256_psa);
5072# else
5073 mbedtls_sha256_free(&handshake->fin_sha256);
5074# endif
5075# endif
5076# if defined(MBEDTLS_SHA384_C)
5077# if defined(MBEDTLS_USE_PSA_CRYPTO)
5078 psa_hash_abort(&handshake->fin_sha384_psa);
5079# else
5080 mbedtls_sha512_free(&handshake->fin_sha512);
5081# endif
5082# endif
5083# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Manuel Pégourié-Gonnardb9d64e52015-07-06 14:18:56 +02005084
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005085# if defined(MBEDTLS_DHM_C)
5086 mbedtls_dhm_free(&handshake->dhm_ctx);
5087# endif
5088# if defined(MBEDTLS_ECDH_C)
5089 mbedtls_ecdh_free(&handshake->ecdh_ctx);
5090# endif
5091# if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
5092 mbedtls_ecjpake_free(&handshake->ecjpake_ctx);
5093# if defined(MBEDTLS_SSL_CLI_C)
5094 mbedtls_free(handshake->ecjpake_cache);
Manuel Pégourié-Gonnard77c06462015-09-17 13:59:49 +02005095 handshake->ecjpake_cache = NULL;
5096 handshake->ecjpake_cache_len = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005097# endif
5098# endif
Paul Bakker61d113b2013-07-04 11:51:43 +02005099
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005100# if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \
5101 defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)
Paul Bakker9af723c2014-05-01 13:03:14 +02005102 /* explicit void pointer cast for buggy MS compiler */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005103 mbedtls_free((void *)handshake->curves);
5104# endif
Manuel Pégourié-Gonnardd09453c2013-09-23 19:11:32 +02005105
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005106# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
5107 if (handshake->psk != NULL) {
5108 mbedtls_platform_zeroize(handshake->psk, handshake->psk_len);
5109 mbedtls_free(handshake->psk);
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01005110 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005111# endif
Manuel Pégourié-Gonnard4b682962015-05-07 15:59:54 +01005112
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005113# if defined(MBEDTLS_X509_CRT_PARSE_C) && \
5114 defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02005115 /*
5116 * Free only the linked list wrapper, not the keys themselves
5117 * since the belong to the SNI callback
5118 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005119 if (handshake->sni_key_cert != NULL) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005120 mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next;
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02005121
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005122 while (cur != NULL) {
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02005123 next = cur->next;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005124 mbedtls_free(cur);
Manuel Pégourié-Gonnard83724542013-09-24 22:30:56 +02005125 cur = next;
5126 }
5127 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005128# endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION \
5129 */
Manuel Pégourié-Gonnard705fcca2013-09-23 20:04:20 +02005130
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005131# if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED)
5132 mbedtls_x509_crt_restart_free(&handshake->ecrs_ctx);
5133 if (handshake->ecrs_peer_cert != NULL) {
5134 mbedtls_x509_crt_free(handshake->ecrs_peer_cert);
5135 mbedtls_free(handshake->ecrs_peer_cert);
Hanno Becker3dad3112019-02-05 17:19:52 +00005136 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005137# endif
Manuel Pégourié-Gonnard862cde52017-05-17 11:56:15 +02005138
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005139# if defined(MBEDTLS_X509_CRT_PARSE_C) && \
5140 !defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
5141 mbedtls_pk_free(&handshake->peer_pubkey);
5142# endif /* MBEDTLS_X509_CRT_PARSE_C && !MBEDTLS_SSL_KEEP_PEER_CERTIFICATE \
5143 */
Hanno Becker75173122019-02-06 16:18:31 +00005144
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005145# if defined(MBEDTLS_SSL_PROTO_DTLS)
5146 mbedtls_free(handshake->verify_cookie);
5147 mbedtls_ssl_flight_free(handshake->flight);
5148 mbedtls_ssl_buffering_free(ssl);
5149# endif
Manuel Pégourié-Gonnard74848812014-07-11 02:43:49 +02005150
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005151# if defined(MBEDTLS_ECDH_C) && defined(MBEDTLS_USE_PSA_CRYPTO)
5152 psa_destroy_key(handshake->ecdh_psa_privkey);
5153# endif /* MBEDTLS_ECDH_C && MBEDTLS_USE_PSA_CRYPTO */
Hanno Becker4a63ed42019-01-08 11:39:35 +00005154
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005155 mbedtls_platform_zeroize(handshake, sizeof(mbedtls_ssl_handshake_params));
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005156
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005157# if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005158 /* If the buffers are too big - reallocate. Because of the way Mbed TLS
5159 * processes datagrams and the fact that a datagram is allowed to have
5160 * several records in it, it is possible that the I/O buffers are not
5161 * empty at this stage */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005162 handle_buffer_resizing(ssl, 1, mbedtls_ssl_get_input_buflen(ssl),
5163 mbedtls_ssl_get_output_buflen(ssl));
5164# endif
Paul Bakker48916f92012-09-16 19:57:18 +00005165}
5166
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005167void mbedtls_ssl_session_free(mbedtls_ssl_session *session)
Paul Bakker48916f92012-09-16 19:57:18 +00005168{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005169 if (session == NULL)
Paul Bakkeraccaffe2014-06-26 13:37:14 +02005170 return;
5171
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005172# if defined(MBEDTLS_X509_CRT_PARSE_C)
5173 ssl_clear_peer_cert(session);
5174# endif
Paul Bakker0a597072012-09-25 21:55:46 +00005175
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005176# if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)
5177 mbedtls_free(session->ticket);
5178# endif
Manuel Pégourié-Gonnard75d44012013-08-02 14:44:04 +02005179
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005180 mbedtls_platform_zeroize(session, sizeof(mbedtls_ssl_session));
Paul Bakker48916f92012-09-16 19:57:18 +00005181}
5182
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005183# if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION)
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02005184
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005185# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
5186# define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 1u
5187# else
5188# define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID 0u
5189# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02005190
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005191# define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT 1u
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02005192
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005193# if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
5194# define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 1u
5195# else
5196# define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY 0u
5197# endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02005198
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005199# if defined(MBEDTLS_SSL_ALPN)
5200# define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 1u
5201# else
5202# define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN 0u
5203# endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02005204
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005205# define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT 0
5206# define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT 1
5207# define SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT 2
5208# define SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT 3
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02005209
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005210# define SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG \
5211 ((uint32_t)((SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID \
5212 << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT) | \
5213 (SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT \
5214 << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT) | \
5215 (SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY \
5216 << SSL_SERIALIZED_CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT) | \
5217 (SSL_SERIALIZED_CONTEXT_CONFIG_ALPN \
5218 << SSL_SERIALIZED_CONTEXT_CONFIG_ALPN_BIT) | \
5219 0u))
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02005220
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005221static unsigned char ssl_serialized_context_header[] = {
5222 MBEDTLS_VERSION_MAJOR,
5223 MBEDTLS_VERSION_MINOR,
5224 MBEDTLS_VERSION_PATCH,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005225 (SSL_SERIALIZED_SESSION_CONFIG_BITFLAG >> 8) & 0xFF,
5226 (SSL_SERIALIZED_SESSION_CONFIG_BITFLAG >> 0) & 0xFF,
5227 (SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG >> 16) & 0xFF,
5228 (SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG >> 8) & 0xFF,
5229 (SSL_SERIALIZED_CONTEXT_CONFIG_BITFLAG >> 0) & 0xFF,
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005230};
5231
Paul Bakker5121ce52009-01-03 21:22:43 +00005232/*
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005233 * Serialize a full SSL context
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02005234 *
5235 * The format of the serialized data is:
5236 * (in the presentation language of TLS, RFC 8446 section 3)
5237 *
5238 * // header
5239 * opaque mbedtls_version[3]; // major, minor, patch
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005240 * opaque context_format[5]; // version-specific field determining
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02005241 * // the format of the remaining
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005242 * // serialized data.
Manuel Pégourié-Gonnard4e9370b2019-07-23 16:31:16 +02005243 * Note: When updating the format, remember to keep these
5244 * version+format bytes. (We may make their size part of the API.)
Manuel Pégourié-Gonnard00400c22019-07-10 14:58:45 +02005245 *
5246 * // session sub-structure
5247 * opaque session<1..2^32-1>; // see mbedtls_ssl_session_save()
5248 * // transform sub-structure
5249 * uint8 random[64]; // ServerHello.random+ClientHello.random
5250 * uint8 in_cid<0..2^8-1> // Connection ID: expected incoming value
5251 * uint8 out_cid<0..2^8-1> // Connection ID: outgoing value to use
5252 * // fields from ssl_context
5253 * uint32 badmac_seen; // DTLS: number of records with failing MAC
5254 * uint64 in_window_top; // DTLS: last validated record seq_num
5255 * uint64 in_window; // DTLS: bitmask for replay protection
5256 * uint8 disable_datagram_packing; // DTLS: only one record per datagram
5257 * uint64 cur_out_ctr; // Record layer: outgoing sequence number
5258 * uint16 mtu; // DTLS: path mtu (max outgoing fragment size)
5259 * uint8 alpn_chosen<0..2^8-1> // ALPN: negotiated application protocol
5260 *
5261 * Note that many fields of the ssl_context or sub-structures are not
5262 * serialized, as they fall in one of the following categories:
5263 *
5264 * 1. forced value (eg in_left must be 0)
5265 * 2. pointer to dynamically-allocated memory (eg session, transform)
5266 * 3. value can be re-derived from other data (eg session keys from MS)
5267 * 4. value was temporary (eg content of input buffer)
5268 * 5. value will be provided by the user again (eg I/O callbacks and context)
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005269 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005270int mbedtls_ssl_context_save(mbedtls_ssl_context *ssl,
5271 unsigned char *buf,
5272 size_t buf_len,
5273 size_t *olen)
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005274{
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005275 unsigned char *p = buf;
5276 size_t used = 0;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005277 size_t session_len;
5278 int ret = 0;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005279
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02005280 /*
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02005281 * Enforce usage restrictions, see "return BAD_INPUT_DATA" in
5282 * this function's documentation.
5283 *
5284 * These are due to assumptions/limitations in the implementation. Some of
5285 * them are likely to stay (no handshake in progress) some might go away
5286 * (only DTLS) but are currently used to simplify the implementation.
Manuel Pégourié-Gonnard1aaf6692019-07-10 14:14:05 +02005287 */
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02005288 /* The initial handshake must be over */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005289 if (ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER) {
5290 MBEDTLS_SSL_DEBUG_MSG(1, ("Initial handshake isn't over"));
5291 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03005292 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005293 if (ssl->handshake != NULL) {
5294 MBEDTLS_SSL_DEBUG_MSG(1, ("Handshake isn't completed"));
5295 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03005296 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02005297 /* Double-check that sub-structures are indeed ready */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005298 if (ssl->transform == NULL || ssl->session == NULL) {
5299 MBEDTLS_SSL_DEBUG_MSG(1, ("Serialised structures aren't ready"));
5300 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03005301 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02005302 /* There must be no pending incoming or outgoing data */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005303 if (mbedtls_ssl_check_pending(ssl) != 0) {
5304 MBEDTLS_SSL_DEBUG_MSG(1, ("There is pending incoming data"));
5305 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03005306 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005307 if (ssl->out_left != 0) {
5308 MBEDTLS_SSL_DEBUG_MSG(1, ("There is pending outgoing data"));
5309 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03005310 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02005311 /* Protocol must be DLTS, not TLS */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005312 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM) {
5313 MBEDTLS_SSL_DEBUG_MSG(1, ("Only DTLS is supported"));
5314 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03005315 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02005316 /* Version must be 1.2 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005317 if (ssl->major_ver != MBEDTLS_SSL_MAJOR_VERSION_3) {
5318 MBEDTLS_SSL_DEBUG_MSG(1, ("Only version 1.2 supported"));
5319 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03005320 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005321 if (ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3) {
5322 MBEDTLS_SSL_DEBUG_MSG(1, ("Only version 1.2 supported"));
5323 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03005324 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02005325 /* We must be using an AEAD ciphersuite */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005326 if (mbedtls_ssl_transform_uses_aead(ssl->transform) != 1) {
5327 MBEDTLS_SSL_DEBUG_MSG(1, ("Only AEAD ciphersuites supported"));
5328 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03005329 }
Manuel Pégourié-Gonnarde4588692019-07-29 12:28:52 +02005330 /* Renegotiation must not be enabled */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005331# if defined(MBEDTLS_SSL_RENEGOTIATION)
5332 if (ssl->conf->disable_renegotiation !=
5333 MBEDTLS_SSL_RENEGOTIATION_DISABLED) {
5334 MBEDTLS_SSL_DEBUG_MSG(1, ("Renegotiation must not be enabled"));
5335 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Jarno Lamsa8c51b7c2019-08-21 13:45:05 +03005336 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005337# endif
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005338
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005339 /*
5340 * Version and format identifier
5341 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005342 used += sizeof(ssl_serialized_context_header);
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005343
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005344 if (used <= buf_len) {
5345 memcpy(p, ssl_serialized_context_header,
5346 sizeof(ssl_serialized_context_header));
5347 p += sizeof(ssl_serialized_context_header);
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005348 }
5349
5350 /*
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005351 * Session (length + data)
5352 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005353 ret = ssl_session_save(ssl->session, 1, NULL, 0, &session_len);
5354 if (ret != MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL)
5355 return ret;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005356
5357 used += 4 + session_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005358 if (used <= buf_len) {
5359 *p++ = (unsigned char)((session_len >> 24) & 0xFF);
5360 *p++ = (unsigned char)((session_len >> 16) & 0xFF);
5361 *p++ = (unsigned char)((session_len >> 8) & 0xFF);
5362 *p++ = (unsigned char)((session_len)&0xFF);
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005363
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005364 ret = ssl_session_save(ssl->session, 1, p, session_len, &session_len);
5365 if (ret != 0)
5366 return ret;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005367
5368 p += session_len;
5369 }
5370
5371 /*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005372 * Transform
5373 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005374 used += sizeof(ssl->transform->randbytes);
5375 if (used <= buf_len) {
5376 memcpy(p, ssl->transform->randbytes, sizeof(ssl->transform->randbytes));
5377 p += sizeof(ssl->transform->randbytes);
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005378 }
5379
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005380# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005381 used += 2 + ssl->transform->in_cid_len + ssl->transform->out_cid_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005382 if (used <= buf_len) {
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005383 *p++ = ssl->transform->in_cid_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005384 memcpy(p, ssl->transform->in_cid, ssl->transform->in_cid_len);
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005385 p += ssl->transform->in_cid_len;
5386
5387 *p++ = ssl->transform->out_cid_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005388 memcpy(p, ssl->transform->out_cid, ssl->transform->out_cid_len);
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005389 p += ssl->transform->out_cid_len;
5390 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005391# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005392
5393 /*
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005394 * Saved fields from top-level ssl_context structure
5395 */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005396 used += 4;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005397 if (used <= buf_len) {
5398 *p++ = (unsigned char)((ssl->badmac_seen >> 24) & 0xFF);
5399 *p++ = (unsigned char)((ssl->badmac_seen >> 16) & 0xFF);
5400 *p++ = (unsigned char)((ssl->badmac_seen >> 8) & 0xFF);
5401 *p++ = (unsigned char)((ssl->badmac_seen) & 0xFF);
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005402 }
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005403
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005404# if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005405 used += 16;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005406 if (used <= buf_len) {
5407 *p++ = (unsigned char)((ssl->in_window_top >> 56) & 0xFF);
5408 *p++ = (unsigned char)((ssl->in_window_top >> 48) & 0xFF);
5409 *p++ = (unsigned char)((ssl->in_window_top >> 40) & 0xFF);
5410 *p++ = (unsigned char)((ssl->in_window_top >> 32) & 0xFF);
5411 *p++ = (unsigned char)((ssl->in_window_top >> 24) & 0xFF);
5412 *p++ = (unsigned char)((ssl->in_window_top >> 16) & 0xFF);
5413 *p++ = (unsigned char)((ssl->in_window_top >> 8) & 0xFF);
5414 *p++ = (unsigned char)((ssl->in_window_top) & 0xFF);
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005415
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005416 *p++ = (unsigned char)((ssl->in_window >> 56) & 0xFF);
5417 *p++ = (unsigned char)((ssl->in_window >> 48) & 0xFF);
5418 *p++ = (unsigned char)((ssl->in_window >> 40) & 0xFF);
5419 *p++ = (unsigned char)((ssl->in_window >> 32) & 0xFF);
5420 *p++ = (unsigned char)((ssl->in_window >> 24) & 0xFF);
5421 *p++ = (unsigned char)((ssl->in_window >> 16) & 0xFF);
5422 *p++ = (unsigned char)((ssl->in_window >> 8) & 0xFF);
5423 *p++ = (unsigned char)((ssl->in_window) & 0xFF);
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005424 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005425# endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005426
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005427# if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005428 used += 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005429 if (used <= buf_len) {
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005430 *p++ = ssl->disable_datagram_packing;
5431 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005432# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005433
5434 used += 8;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005435 if (used <= buf_len) {
5436 memcpy(p, ssl->cur_out_ctr, 8);
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005437 p += 8;
5438 }
5439
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005440# if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005441 used += 2;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005442 if (used <= buf_len) {
5443 *p++ = (unsigned char)((ssl->mtu >> 8) & 0xFF);
5444 *p++ = (unsigned char)((ssl->mtu) & 0xFF);
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005445 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005446# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005447
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005448# if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005449 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005450 const uint8_t alpn_len =
5451 ssl->alpn_chosen ? (uint8_t)strlen(ssl->alpn_chosen) : 0;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005452
5453 used += 1 + alpn_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005454 if (used <= buf_len) {
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005455 *p++ = alpn_len;
5456
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005457 if (ssl->alpn_chosen != NULL) {
5458 memcpy(p, ssl->alpn_chosen, alpn_len);
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005459 p += alpn_len;
5460 }
5461 }
5462 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005463# endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005464
5465 /*
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005466 * Done
5467 */
5468 *olen = used;
5469
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005470 if (used > buf_len)
5471 return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005472
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005473 MBEDTLS_SSL_DEBUG_BUF(4, "saved context", buf, used);
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005474
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005475 return mbedtls_ssl_session_reset_int(ssl, 0);
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005476}
5477
5478/*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005479 * Helper to get TLS 1.2 PRF from ciphersuite
5480 * (Duplicates bits of logic from ssl_set_handshake_prfs().)
5481 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005482typedef int (*tls_prf_fn)(const unsigned char *secret,
5483 size_t slen,
5484 const char *label,
5485 const unsigned char *random,
5486 size_t rlen,
5487 unsigned char *dstbuf,
5488 size_t dlen);
5489static tls_prf_fn ssl_tls12prf_from_cs(int ciphersuite_id)
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005490{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005491# if defined(MBEDTLS_SHA384_C)
5492 const mbedtls_ssl_ciphersuite_t *const ciphersuite_info =
5493 mbedtls_ssl_ciphersuite_from_id(ciphersuite_id);
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005494
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005495 if (ciphersuite_info->mac == MBEDTLS_MD_SHA384)
5496 return tls_prf_sha384;
5497# else
5498 (void)ciphersuite_id;
5499# endif
5500 return tls_prf_sha256;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005501}
5502
5503/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02005504 * Deserialize context, see mbedtls_ssl_context_save() for format.
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005505 *
5506 * This internal version is wrapped by a public function that cleans up in
5507 * case of error.
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005508 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005509static int
5510ssl_context_load(mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len)
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005511{
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005512 const unsigned char *p = buf;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005513 const unsigned char *const end = buf + len;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005514 size_t session_len;
Janos Follath865b3eb2019-12-16 11:46:15 +00005515 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005516
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02005517 /*
5518 * The context should have been freshly setup or reset.
5519 * Give the user an error in case of obvious misuse.
Manuel Pégourié-Gonnard4ca930f2019-07-26 16:31:53 +02005520 * (Checking session is useful because it won't be NULL if we're
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02005521 * renegotiating, or if the user mistakenly loaded a session first.)
5522 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005523 if (ssl->state != MBEDTLS_SSL_HELLO_REQUEST || ssl->session != NULL) {
5524 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02005525 }
5526
5527 /*
5528 * We can't check that the config matches the initial one, but we can at
5529 * least check it matches the requirements for serializing.
5530 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005531 if (ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ||
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02005532 ssl->conf->max_major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||
5533 ssl->conf->min_major_ver > MBEDTLS_SSL_MAJOR_VERSION_3 ||
5534 ssl->conf->max_minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ||
5535 ssl->conf->min_minor_ver > MBEDTLS_SSL_MINOR_VERSION_3 ||
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005536# if defined(MBEDTLS_SSL_RENEGOTIATION)
5537 ssl->conf->disable_renegotiation !=
5538 MBEDTLS_SSL_RENEGOTIATION_DISABLED ||
5539# endif
5540 0) {
5541 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard0ff76402019-07-11 09:56:30 +02005542 }
5543
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005544 MBEDTLS_SSL_DEBUG_BUF(4, "context to load", buf, len);
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005545
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005546 /*
5547 * Check version identifier
5548 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005549 if ((size_t)(end - p) < sizeof(ssl_serialized_context_header))
5550 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005551
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005552 if (memcmp(p, ssl_serialized_context_header,
5553 sizeof(ssl_serialized_context_header)) != 0) {
5554 return MBEDTLS_ERR_SSL_VERSION_MISMATCH;
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005555 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005556 p += sizeof(ssl_serialized_context_header);
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005557
5558 /*
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005559 * Session
5560 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005561 if ((size_t)(end - p) < 4)
5562 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005563
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005564 session_len = ((size_t)p[0] << 24) | ((size_t)p[1] << 16) |
5565 ((size_t)p[2] << 8) | ((size_t)p[3]);
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005566 p += 4;
5567
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02005568 /* This has been allocated by ssl_handshake_init(), called by
Hanno Becker43aefe22020-02-05 10:44:56 +00005569 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02005570 ssl->session = ssl->session_negotiate;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005571 ssl->session_in = ssl->session;
5572 ssl->session_out = ssl->session;
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02005573 ssl->session_negotiate = NULL;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005574
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005575 if ((size_t)(end - p) < session_len)
5576 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005577
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005578 ret = ssl_session_load(ssl->session, 1, p, session_len);
5579 if (ret != 0) {
5580 mbedtls_ssl_session_free(ssl->session);
5581 return ret;
Manuel Pégourié-Gonnard45ac1f02019-07-23 16:52:45 +02005582 }
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005583
5584 p += session_len;
5585
5586 /*
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005587 * Transform
5588 */
5589
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02005590 /* This has been allocated by ssl_handshake_init(), called by
Hanno Becker43aefe22020-02-05 10:44:56 +00005591 * by either mbedtls_ssl_session_reset_int() or mbedtls_ssl_setup(). */
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02005592 ssl->transform = ssl->transform_negotiate;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005593 ssl->transform_in = ssl->transform;
5594 ssl->transform_out = ssl->transform;
Manuel Pégourié-Gonnard142ba732019-07-23 14:43:30 +02005595 ssl->transform_negotiate = NULL;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005596
5597 /* Read random bytes and populate structure */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005598 if ((size_t)(end - p) < sizeof(ssl->transform->randbytes))
5599 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005600
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005601 ret = ssl_populate_transform(
5602 ssl->transform, ssl->session->ciphersuite, ssl->session->master,
5603# if defined(MBEDTLS_SSL_SOME_SUITES_USE_MAC)
5604# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
5605 ssl->session->encrypt_then_mac,
5606# endif
5607# endif /* MBEDTLS_SSL_SOME_SUITES_USE_MAC */
5608 ssl_tls12prf_from_cs(ssl->session->ciphersuite), p, /* currently
5609 pointing to
5610 randbytes */
5611 MBEDTLS_SSL_MINOR_VERSION_3, /* (D)TLS 1.2 is forced */
5612 ssl->conf->endpoint, ssl);
5613 if (ret != 0)
5614 return ret;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005615
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005616 p += sizeof(ssl->transform->randbytes);
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005617
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005618# if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID)
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005619 /* Read connection IDs and store them */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005620 if ((size_t)(end - p) < 1)
5621 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005622
5623 ssl->transform->in_cid_len = *p++;
5624
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005625 if ((size_t)(end - p) < ssl->transform->in_cid_len + 1u)
5626 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005627
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005628 memcpy(ssl->transform->in_cid, p, ssl->transform->in_cid_len);
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005629 p += ssl->transform->in_cid_len;
5630
5631 ssl->transform->out_cid_len = *p++;
5632
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005633 if ((size_t)(end - p) < ssl->transform->out_cid_len)
5634 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005635
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005636 memcpy(ssl->transform->out_cid, p, ssl->transform->out_cid_len);
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005637 p += ssl->transform->out_cid_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005638# endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */
Manuel Pégourié-Gonnardc2a7b892019-07-15 09:04:11 +02005639
5640 /*
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005641 * Saved fields from top-level ssl_context structure
5642 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005643 if ((size_t)(end - p) < 4)
5644 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005645
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005646 ssl->badmac_seen = ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) |
5647 ((uint32_t)p[2] << 8) | ((uint32_t)p[3]);
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005648 p += 4;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005649
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005650# if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
5651 if ((size_t)(end - p) < 16)
5652 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005653
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005654 ssl->in_window_top = ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48) |
5655 ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32) |
5656 ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16) |
5657 ((uint64_t)p[6] << 8) | ((uint64_t)p[7]);
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005658 p += 8;
5659
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005660 ssl->in_window = ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48) |
5661 ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32) |
5662 ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16) |
5663 ((uint64_t)p[6] << 8) | ((uint64_t)p[7]);
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005664 p += 8;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005665# endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005666
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005667# if defined(MBEDTLS_SSL_PROTO_DTLS)
5668 if ((size_t)(end - p) < 1)
5669 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005670
5671 ssl->disable_datagram_packing = *p++;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005672# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005673
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005674 if ((size_t)(end - p) < 8)
5675 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005676
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005677 memcpy(ssl->cur_out_ctr, p, 8);
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005678 p += 8;
5679
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005680# if defined(MBEDTLS_SSL_PROTO_DTLS)
5681 if ((size_t)(end - p) < 2)
5682 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005683
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005684 ssl->mtu = (p[0] << 8) | p[1];
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005685 p += 2;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005686# endif /* MBEDTLS_SSL_PROTO_DTLS */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005687
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005688# if defined(MBEDTLS_SSL_ALPN)
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005689 {
5690 uint8_t alpn_len;
5691 const char **cur;
5692
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005693 if ((size_t)(end - p) < 1)
5694 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005695
5696 alpn_len = *p++;
5697
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005698 if (alpn_len != 0 && ssl->conf->alpn_list != NULL) {
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005699 /* alpn_chosen should point to an item in the configured list */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005700 for (cur = ssl->conf->alpn_list; *cur != NULL; cur++) {
5701 if (strlen(*cur) == alpn_len && memcmp(p, cur, alpn_len) == 0) {
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005702 ssl->alpn_chosen = *cur;
5703 break;
5704 }
5705 }
5706 }
5707
5708 /* can only happen on conf mismatch */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005709 if (alpn_len != 0 && ssl->alpn_chosen == NULL)
5710 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005711
5712 p += alpn_len;
5713 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005714# endif /* MBEDTLS_SSL_ALPN */
Manuel Pégourié-Gonnardc86c5df2019-07-15 11:23:03 +02005715
5716 /*
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02005717 * Forced fields from top-level ssl_context structure
5718 *
5719 * Most of them already set to the correct value by mbedtls_ssl_init() and
5720 * mbedtls_ssl_reset(), so we only need to set the remaining ones.
5721 */
5722 ssl->state = MBEDTLS_SSL_HANDSHAKE_OVER;
5723
5724 ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
5725 ssl->minor_ver = MBEDTLS_SSL_MINOR_VERSION_3;
5726
Hanno Becker361b10d2019-08-30 10:42:49 +01005727 /* Adjust pointers for header fields of outgoing records to
5728 * the given transform, accounting for explicit IV and CID. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005729 mbedtls_ssl_update_out_pointers(ssl, ssl->transform);
Hanno Becker361b10d2019-08-30 10:42:49 +01005730
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005731# if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02005732 ssl->in_epoch = 1;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005733# endif
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02005734
5735 /* mbedtls_ssl_reset() leaves the handshake sub-structure allocated,
5736 * which we don't want - otherwise we'd end up freeing the wrong transform
Hanno Beckerce5f5fd2020-02-05 10:47:44 +00005737 * by calling mbedtls_ssl_handshake_wrapup_free_hs_transform()
5738 * inappropriately. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005739 if (ssl->handshake != NULL) {
5740 mbedtls_ssl_handshake_free(ssl);
5741 mbedtls_free(ssl->handshake);
Manuel Pégourié-Gonnard0eb3eac2019-07-15 11:53:51 +02005742 ssl->handshake = NULL;
5743 }
5744
5745 /*
Manuel Pégourié-Gonnard4c90e852019-07-11 10:58:10 +02005746 * Done - should have consumed entire buffer
5747 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005748 if (p != end)
5749 return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005750
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005751 return 0;
Manuel Pégourié-Gonnardac87e282019-05-28 13:02:16 +02005752}
5753
5754/*
Manuel Pégourié-Gonnardb9dfc9f2019-07-12 10:50:19 +02005755 * Deserialize context: public wrapper for error cleaning
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005756 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005757int mbedtls_ssl_context_load(mbedtls_ssl_context *context,
5758 const unsigned char *buf,
5759 size_t len)
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005760{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005761 int ret = ssl_context_load(context, buf, len);
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005762
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005763 if (ret != 0)
5764 mbedtls_ssl_free(context);
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005765
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005766 return ret;
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005767}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005768# endif /* MBEDTLS_SSL_CONTEXT_SERIALIZATION */
Manuel Pégourié-Gonnard4b7e6b92019-07-11 12:50:53 +02005769
5770/*
Paul Bakker5121ce52009-01-03 21:22:43 +00005771 * Free an SSL context
5772 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005773void mbedtls_ssl_free(mbedtls_ssl_context *ssl)
Paul Bakker5121ce52009-01-03 21:22:43 +00005774{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005775 if (ssl == NULL)
Paul Bakkeraccaffe2014-06-26 13:37:14 +02005776 return;
5777
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005778 MBEDTLS_SSL_DEBUG_MSG(2, ("=> free"));
Paul Bakker5121ce52009-01-03 21:22:43 +00005779
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005780 if (ssl->out_buf != NULL) {
5781# if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
sander-visserb8aa2072020-05-06 22:05:13 +02005782 size_t out_buf_len = ssl->out_buf_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005783# else
sander-visserb8aa2072020-05-06 22:05:13 +02005784 size_t out_buf_len = MBEDTLS_SSL_OUT_BUFFER_LEN;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005785# endif
sander-visserb8aa2072020-05-06 22:05:13 +02005786
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005787 mbedtls_platform_zeroize(ssl->out_buf, out_buf_len);
5788 mbedtls_free(ssl->out_buf);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005789 ssl->out_buf = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00005790 }
5791
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005792 if (ssl->in_buf != NULL) {
5793# if defined(MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH)
sander-visserb8aa2072020-05-06 22:05:13 +02005794 size_t in_buf_len = ssl->in_buf_len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005795# else
sander-visserb8aa2072020-05-06 22:05:13 +02005796 size_t in_buf_len = MBEDTLS_SSL_IN_BUFFER_LEN;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005797# endif
sander-visserb8aa2072020-05-06 22:05:13 +02005798
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005799 mbedtls_platform_zeroize(ssl->in_buf, in_buf_len);
5800 mbedtls_free(ssl->in_buf);
Andrzej Kurek0afa2a12020-03-03 10:39:58 -05005801 ssl->in_buf = NULL;
Paul Bakker5121ce52009-01-03 21:22:43 +00005802 }
5803
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005804 if (ssl->transform) {
5805 mbedtls_ssl_transform_free(ssl->transform);
5806 mbedtls_free(ssl->transform);
Paul Bakker48916f92012-09-16 19:57:18 +00005807 }
5808
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005809 if (ssl->handshake) {
5810 mbedtls_ssl_handshake_free(ssl);
5811 mbedtls_ssl_transform_free(ssl->transform_negotiate);
5812 mbedtls_ssl_session_free(ssl->session_negotiate);
Paul Bakker48916f92012-09-16 19:57:18 +00005813
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005814 mbedtls_free(ssl->handshake);
5815 mbedtls_free(ssl->transform_negotiate);
5816 mbedtls_free(ssl->session_negotiate);
Paul Bakker48916f92012-09-16 19:57:18 +00005817 }
5818
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005819 if (ssl->session) {
5820 mbedtls_ssl_session_free(ssl->session);
5821 mbedtls_free(ssl->session);
Paul Bakkerc0463502013-02-14 11:19:38 +01005822 }
5823
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005824# if defined(MBEDTLS_X509_CRT_PARSE_C)
5825 if (ssl->hostname != NULL) {
5826 mbedtls_platform_zeroize(ssl->hostname, strlen(ssl->hostname));
5827 mbedtls_free(ssl->hostname);
Paul Bakker5121ce52009-01-03 21:22:43 +00005828 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005829# endif
Paul Bakker5121ce52009-01-03 21:22:43 +00005830
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005831# if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
5832 mbedtls_free(ssl->cli_id);
5833# endif
Manuel Pégourié-Gonnard43c02182014-07-22 17:32:01 +02005834
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005835 MBEDTLS_SSL_DEBUG_MSG(2, ("<= free"));
Paul Bakker2da561c2009-02-05 18:00:28 +00005836
Paul Bakker86f04f42013-02-14 11:20:09 +01005837 /* Actually clear after last debug message */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005838 mbedtls_platform_zeroize(ssl, sizeof(mbedtls_ssl_context));
Paul Bakker5121ce52009-01-03 21:22:43 +00005839}
5840
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005841/*
5842 * Initialze mbedtls_ssl_config
5843 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005844void mbedtls_ssl_config_init(mbedtls_ssl_config *conf)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005845{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005846 memset(conf, 0, sizeof(mbedtls_ssl_config));
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005847}
5848
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005849# if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Gilles Peskineae270bf2021-06-02 00:05:29 +02005850/* The selection should be the same as mbedtls_x509_crt_profile_default in
Gilles Peskinea28f0f52021-06-02 15:29:38 +02005851 * x509_crt.c. Here, the order matters. Currently we favor stronger hashes,
5852 * for no fundamental reason.
Gilles Peskineae270bf2021-06-02 00:05:29 +02005853 * See the documentation of mbedtls_ssl_conf_curves() for what we promise
5854 * about this list. */
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01005855static int ssl_preset_default_hashes[] = {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005856# if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01005857 MBEDTLS_MD_SHA512,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005858# endif
5859# if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01005860 MBEDTLS_MD_SHA384,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005861# endif
5862# if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01005863 MBEDTLS_MD_SHA256,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005864# endif
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01005865 MBEDTLS_MD_NONE
5866};
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005867# endif
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01005868
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005869# if defined(MBEDTLS_ECP_C)
Gilles Peskineae270bf2021-06-02 00:05:29 +02005870/* The selection should be the same as mbedtls_x509_crt_profile_default in
5871 * x509_crt.c, plus Montgomery curves for ECDHE. Here, the order matters:
Gilles Peskineb1940a72021-06-02 15:18:12 +02005872 * curves with a lower resource usage come first.
Gilles Peskineae270bf2021-06-02 00:05:29 +02005873 * See the documentation of mbedtls_ssl_conf_curves() for what we promise
Gilles Peskineb1940a72021-06-02 15:18:12 +02005874 * about this list.
5875 */
Gilles Peskineae270bf2021-06-02 00:05:29 +02005876static mbedtls_ecp_group_id ssl_preset_default_curves[] = {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005877# if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
Gilles Peskineae270bf2021-06-02 00:05:29 +02005878 MBEDTLS_ECP_DP_CURVE25519,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005879# endif
5880# if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
Gilles Peskineae270bf2021-06-02 00:05:29 +02005881 MBEDTLS_ECP_DP_SECP256R1,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005882# endif
5883# if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
Gilles Peskineb1940a72021-06-02 15:18:12 +02005884 MBEDTLS_ECP_DP_SECP384R1,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005885# endif
5886# if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED)
Gilles Peskineb1940a72021-06-02 15:18:12 +02005887 MBEDTLS_ECP_DP_CURVE448,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005888# endif
5889# if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)
Gilles Peskineb1940a72021-06-02 15:18:12 +02005890 MBEDTLS_ECP_DP_SECP521R1,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005891# endif
5892# if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)
Gilles Peskineae270bf2021-06-02 00:05:29 +02005893 MBEDTLS_ECP_DP_BP256R1,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005894# endif
5895# if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)
Gilles Peskineb1940a72021-06-02 15:18:12 +02005896 MBEDTLS_ECP_DP_BP384R1,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005897# endif
5898# if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)
Gilles Peskineb1940a72021-06-02 15:18:12 +02005899 MBEDTLS_ECP_DP_BP512R1,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005900# endif
Gilles Peskineae270bf2021-06-02 00:05:29 +02005901 MBEDTLS_ECP_DP_NONE
5902};
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005903# endif
Gilles Peskineae270bf2021-06-02 00:05:29 +02005904
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005905static int ssl_preset_suiteb_ciphersuites[] = {
5906 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005907 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 0
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005908};
5909
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005910# if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
5911static int ssl_preset_suiteb_hashes[] = { MBEDTLS_MD_SHA256, MBEDTLS_MD_SHA384,
5912 MBEDTLS_MD_NONE };
5913# endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005914
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005915# if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005916static mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005917# if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005918 MBEDTLS_ECP_DP_SECP256R1,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005919# endif
5920# if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005921 MBEDTLS_ECP_DP_SECP384R1,
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005922# endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005923 MBEDTLS_ECP_DP_NONE
5924};
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005925# endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005926
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005927/*
Tillmann Karras588ad502015-09-25 04:27:22 +02005928 * Load default in mbedtls_ssl_config
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005929 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005930int mbedtls_ssl_config_defaults(mbedtls_ssl_config *conf,
5931 int endpoint,
5932 int transport,
5933 int preset)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005934{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005935# if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
Janos Follath865b3eb2019-12-16 11:46:15 +00005936 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005937# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005938
Manuel Pégourié-Gonnard0de074f2015-05-14 12:58:01 +02005939 /* Use the functions here so that they are covered in tests,
5940 * but otherwise access member directly for efficiency */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005941 mbedtls_ssl_conf_endpoint(conf, endpoint);
5942 mbedtls_ssl_conf_transport(conf, transport);
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005943
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02005944 /*
5945 * Things that are common to all presets
5946 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005947# if defined(MBEDTLS_SSL_CLI_C)
5948 if (endpoint == MBEDTLS_SSL_IS_CLIENT) {
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02005949 conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005950# if defined(MBEDTLS_SSL_SESSION_TICKETS)
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02005951 conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005952# endif
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02005953 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005954# endif
Manuel Pégourié-Gonnard419d5ae2015-05-04 19:32:36 +02005955
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005956# if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005957 conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005958# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005959
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005960# if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005961 conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005962# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005963
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005964# if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005965 conf->f_cookie_write = ssl_cookie_write_dummy;
5966 conf->f_cookie_check = ssl_cookie_check_dummy;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005967# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005968
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005969# if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005970 conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005971# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005972
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005973# if defined(MBEDTLS_SSL_SRV_C)
Janos Follath088ce432017-04-10 12:42:31 +01005974 conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED;
TRodziewicz3946f792021-06-14 12:11:18 +02005975 conf->respect_cli_pref = MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_SERVER;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005976# endif
Janos Follath088ce432017-04-10 12:42:31 +01005977
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005978# if defined(MBEDTLS_SSL_PROTO_DTLS)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005979 conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;
5980 conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005981# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005982
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005983# if defined(MBEDTLS_SSL_RENEGOTIATION)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005984 conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005985 memset(conf->renego_period, 0x00, 2);
5986 memset(conf->renego_period + 2, 0xFF, 6);
5987# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02005988
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005989# if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)
5990 if (endpoint == MBEDTLS_SSL_IS_SERVER) {
5991 const unsigned char dhm_p[] = MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN;
5992 const unsigned char dhm_g[] = MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN;
Hanno Becker00d0a682017-10-04 13:14:29 +01005993
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005994 if ((ret = mbedtls_ssl_conf_dh_param_bin(conf, dhm_p, sizeof(dhm_p),
5995 dhm_g, sizeof(dhm_g))) != 0) {
5996 return ret;
5997 }
5998 }
5999# endif
Manuel Pégourié-Gonnardbd990d62015-06-11 14:49:42 +02006000
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006001 /*
6002 * Preset-specific defaults
6003 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006004 switch (preset) {
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006005 /*
6006 * NSA Suite B
6007 */
6008 case MBEDTLS_SSL_PRESET_SUITEB:
6009 conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;
6010 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */
6011 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
6012 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
6013
Hanno Beckerd60b6c62021-04-29 12:04:11 +01006014 conf->ciphersuite_list = ssl_preset_suiteb_ciphersuites;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006015
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006016# if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006017 conf->cert_profile = &mbedtls_x509_crt_profile_suiteb;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006018# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006019
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006020# if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006021 conf->sig_hashes = ssl_preset_suiteb_hashes;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006022# endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006023
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006024# if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006025 conf->curve_list = ssl_preset_suiteb_curves;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006026# endif
Manuel Pégourié-Gonnardc98204e2015-08-11 04:21:01 +02006027 break;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006028
6029 /*
6030 * Default
6031 */
6032 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006033 conf->min_major_ver = (MBEDTLS_SSL_MIN_MAJOR_VERSION >
6034 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION) ?
6035 MBEDTLS_SSL_MIN_MAJOR_VERSION :
6036 MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION;
6037 conf->min_minor_ver = (MBEDTLS_SSL_MIN_MINOR_VERSION >
6038 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION) ?
6039 MBEDTLS_SSL_MIN_MINOR_VERSION :
6040 MBEDTLS_SSL_MIN_VALID_MINOR_VERSION;
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006041 conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;
6042 conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;
6043
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006044# if defined(MBEDTLS_SSL_PROTO_DTLS)
6045 if (transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM)
TRodziewiczef73f012021-05-13 14:53:36 +02006046 conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006047# endif
Hanno Beckerd60b6c62021-04-29 12:04:11 +01006048 conf->ciphersuite_list = mbedtls_ssl_list_ciphersuites();
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006049
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006050# if defined(MBEDTLS_X509_CRT_PARSE_C)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006051 conf->cert_profile = &mbedtls_x509_crt_profile_default;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006052# endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006053
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006054# if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard47229c72015-12-04 15:02:56 +01006055 conf->sig_hashes = ssl_preset_default_hashes;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006056# endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006057
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006058# if defined(MBEDTLS_ECP_C)
Gilles Peskineae270bf2021-06-02 00:05:29 +02006059 conf->curve_list = ssl_preset_default_curves;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006060# endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006061
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006062# if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006063 conf->dhm_min_bitlen = 1024;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006064# endif
Manuel Pégourié-Gonnardb31c5f62015-06-17 13:53:47 +02006065 }
6066
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006067 return 0;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006068}
6069
6070/*
6071 * Free mbedtls_ssl_config
6072 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006073void mbedtls_ssl_config_free(mbedtls_ssl_config *conf)
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006074{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006075# if defined(MBEDTLS_DHM_C)
6076 mbedtls_mpi_free(&conf->dhm_P);
6077 mbedtls_mpi_free(&conf->dhm_G);
6078# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006079
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006080# if defined(MBEDTLS_KEY_EXCHANGE_SOME_PSK_ENABLED)
6081 if (conf->psk != NULL) {
6082 mbedtls_platform_zeroize(conf->psk, conf->psk_len);
6083 mbedtls_free(conf->psk);
Azim Khan27e8a122018-03-21 14:24:11 +00006084 conf->psk = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006085 conf->psk_len = 0;
junyeonLEE316b1622017-12-20 16:29:30 +09006086 }
6087
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006088 if (conf->psk_identity != NULL) {
6089 mbedtls_platform_zeroize(conf->psk_identity, conf->psk_identity_len);
6090 mbedtls_free(conf->psk_identity);
Azim Khan27e8a122018-03-21 14:24:11 +00006091 conf->psk_identity = NULL;
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006092 conf->psk_identity_len = 0;
6093 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006094# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006095
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006096# if defined(MBEDTLS_X509_CRT_PARSE_C)
6097 ssl_key_cert_free(conf->key_cert);
6098# endif
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006099
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006100 mbedtls_platform_zeroize(conf, sizeof(mbedtls_ssl_config));
Manuel Pégourié-Gonnardcd523e22015-05-04 13:35:39 +02006101}
6102
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006103# if defined(MBEDTLS_PK_C) && \
6104 (defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C))
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02006105/*
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006106 * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02006107 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006108unsigned char mbedtls_ssl_sig_from_pk(mbedtls_pk_context *pk)
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02006109{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006110# if defined(MBEDTLS_RSA_C)
6111 if (mbedtls_pk_can_do(pk, MBEDTLS_PK_RSA))
6112 return MBEDTLS_SSL_SIG_RSA;
6113# endif
6114# if defined(MBEDTLS_ECDSA_C)
6115 if (mbedtls_pk_can_do(pk, MBEDTLS_PK_ECDSA))
6116 return MBEDTLS_SSL_SIG_ECDSA;
6117# endif
6118 return MBEDTLS_SSL_SIG_ANON;
Manuel Pégourié-Gonnard0d420492013-08-21 16:14:26 +02006119}
6120
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006121unsigned char mbedtls_ssl_sig_from_pk_alg(mbedtls_pk_type_t type)
Hanno Becker7e5437a2017-04-28 17:15:26 +01006122{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006123 switch (type) {
Hanno Becker7e5437a2017-04-28 17:15:26 +01006124 case MBEDTLS_PK_RSA:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006125 return MBEDTLS_SSL_SIG_RSA;
Hanno Becker7e5437a2017-04-28 17:15:26 +01006126 case MBEDTLS_PK_ECDSA:
6127 case MBEDTLS_PK_ECKEY:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006128 return MBEDTLS_SSL_SIG_ECDSA;
Hanno Becker7e5437a2017-04-28 17:15:26 +01006129 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006130 return MBEDTLS_SSL_SIG_ANON;
Hanno Becker7e5437a2017-04-28 17:15:26 +01006131 }
6132}
6133
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006134mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig(unsigned char sig)
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02006135{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006136 switch (sig) {
6137# if defined(MBEDTLS_RSA_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006138 case MBEDTLS_SSL_SIG_RSA:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006139 return MBEDTLS_PK_RSA;
6140# endif
6141# if defined(MBEDTLS_ECDSA_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006142 case MBEDTLS_SSL_SIG_ECDSA:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006143 return MBEDTLS_PK_ECDSA;
6144# endif
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02006145 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006146 return MBEDTLS_PK_NONE;
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02006147 }
6148}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006149# endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02006150
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006151# if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
6152 defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Hanno Becker7e5437a2017-04-28 17:15:26 +01006153
6154/* Find an entry in a signature-hash set matching a given hash algorithm. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006155mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find(mbedtls_ssl_sig_hash_set_t *set,
6156 mbedtls_pk_type_t sig_alg)
Hanno Becker7e5437a2017-04-28 17:15:26 +01006157{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006158 switch (sig_alg) {
Hanno Becker7e5437a2017-04-28 17:15:26 +01006159 case MBEDTLS_PK_RSA:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006160 return set->rsa;
Hanno Becker7e5437a2017-04-28 17:15:26 +01006161 case MBEDTLS_PK_ECDSA:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006162 return set->ecdsa;
Hanno Becker7e5437a2017-04-28 17:15:26 +01006163 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006164 return MBEDTLS_MD_NONE;
Hanno Becker7e5437a2017-04-28 17:15:26 +01006165 }
6166}
6167
6168/* Add a signature-hash-pair to a signature-hash set */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006169void mbedtls_ssl_sig_hash_set_add(mbedtls_ssl_sig_hash_set_t *set,
6170 mbedtls_pk_type_t sig_alg,
6171 mbedtls_md_type_t md_alg)
Hanno Becker7e5437a2017-04-28 17:15:26 +01006172{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006173 switch (sig_alg) {
Hanno Becker7e5437a2017-04-28 17:15:26 +01006174 case MBEDTLS_PK_RSA:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006175 if (set->rsa == MBEDTLS_MD_NONE)
Hanno Becker7e5437a2017-04-28 17:15:26 +01006176 set->rsa = md_alg;
6177 break;
6178
6179 case MBEDTLS_PK_ECDSA:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006180 if (set->ecdsa == MBEDTLS_MD_NONE)
Hanno Becker7e5437a2017-04-28 17:15:26 +01006181 set->ecdsa = md_alg;
6182 break;
6183
6184 default:
6185 break;
6186 }
6187}
6188
6189/* Allow exactly one hash algorithm for each signature. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006190void mbedtls_ssl_sig_hash_set_const_hash(mbedtls_ssl_sig_hash_set_t *set,
6191 mbedtls_md_type_t md_alg)
Hanno Becker7e5437a2017-04-28 17:15:26 +01006192{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006193 set->rsa = md_alg;
Hanno Becker7e5437a2017-04-28 17:15:26 +01006194 set->ecdsa = md_alg;
6195}
6196
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006197# endif /* MBEDTLS_SSL_PROTO_TLS1_2) && \
6198 MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Hanno Becker7e5437a2017-04-28 17:15:26 +01006199
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02006200/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006201 * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX
Manuel Pégourié-Gonnard1a483832013-09-20 12:29:15 +02006202 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006203mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash(unsigned char hash)
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02006204{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006205 switch (hash) {
6206# if defined(MBEDTLS_MD5_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006207 case MBEDTLS_SSL_HASH_MD5:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006208 return MBEDTLS_MD_MD5;
6209# endif
6210# if defined(MBEDTLS_SHA1_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006211 case MBEDTLS_SSL_HASH_SHA1:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006212 return MBEDTLS_MD_SHA1;
6213# endif
6214# if defined(MBEDTLS_SHA224_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006215 case MBEDTLS_SSL_HASH_SHA224:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006216 return MBEDTLS_MD_SHA224;
6217# endif
6218# if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006219 case MBEDTLS_SSL_HASH_SHA256:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006220 return MBEDTLS_MD_SHA256;
6221# endif
6222# if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006223 case MBEDTLS_SSL_HASH_SHA384:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006224 return MBEDTLS_MD_SHA384;
6225# endif
6226# if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006227 case MBEDTLS_SSL_HASH_SHA512:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006228 return MBEDTLS_MD_SHA512;
6229# endif
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02006230 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006231 return MBEDTLS_MD_NONE;
Manuel Pégourié-Gonnarda20c58c2013-08-22 13:52:48 +02006232 }
6233}
6234
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006235/*
6236 * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX
6237 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006238unsigned char mbedtls_ssl_hash_from_md_alg(int md)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006239{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006240 switch (md) {
6241# if defined(MBEDTLS_MD5_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006242 case MBEDTLS_MD_MD5:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006243 return MBEDTLS_SSL_HASH_MD5;
6244# endif
6245# if defined(MBEDTLS_SHA1_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006246 case MBEDTLS_MD_SHA1:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006247 return MBEDTLS_SSL_HASH_SHA1;
6248# endif
6249# if defined(MBEDTLS_SHA224_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006250 case MBEDTLS_MD_SHA224:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006251 return MBEDTLS_SSL_HASH_SHA224;
6252# endif
6253# if defined(MBEDTLS_SHA256_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006254 case MBEDTLS_MD_SHA256:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006255 return MBEDTLS_SSL_HASH_SHA256;
6256# endif
6257# if defined(MBEDTLS_SHA384_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006258 case MBEDTLS_MD_SHA384:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006259 return MBEDTLS_SSL_HASH_SHA384;
6260# endif
6261# if defined(MBEDTLS_SHA512_C)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006262 case MBEDTLS_MD_SHA512:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006263 return MBEDTLS_SSL_HASH_SHA512;
6264# endif
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006265 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006266 return MBEDTLS_SSL_HASH_NONE;
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006267 }
6268}
6269
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006270# if defined(MBEDTLS_ECP_C)
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01006271/*
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006272 * Check if a curve proposed by the peer is in our list.
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02006273 * Return 0 if we're willing to use it, -1 otherwise.
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01006274 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006275int mbedtls_ssl_check_curve(const mbedtls_ssl_context *ssl,
6276 mbedtls_ecp_group_id grp_id)
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01006277{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006278 const mbedtls_ecp_group_id *gid;
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01006279
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006280 if (ssl->conf->curve_list == NULL)
6281 return -1;
Manuel Pégourié-Gonnard9d412d82015-06-17 12:10:46 +02006282
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006283 for (gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++)
6284 if (*gid == grp_id)
6285 return 0;
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01006286
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006287 return -1;
Manuel Pégourié-Gonnardab240102014-02-04 16:18:07 +01006288}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006289# endif /* MBEDTLS_ECP_C */
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006290
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006291# if defined(MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006292/*
6293 * Check if a hash proposed by the peer is in our list.
6294 * Return 0 if we're willing to use it, -1 otherwise.
6295 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006296int mbedtls_ssl_check_sig_hash(const mbedtls_ssl_context *ssl,
6297 mbedtls_md_type_t md)
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006298{
6299 const int *cur;
6300
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006301 if (ssl->conf->sig_hashes == NULL)
6302 return -1;
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006303
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006304 for (cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++)
6305 if (*cur == (int)md)
6306 return 0;
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006307
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006308 return -1;
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006309}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006310# endif /* MBEDTLS_KEY_EXCHANGE_WITH_CERT_ENABLED */
Manuel Pégourié-Gonnard7bfc1222015-06-17 14:34:48 +02006311
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006312# if defined(MBEDTLS_X509_CRT_PARSE_C)
6313int mbedtls_ssl_check_cert_usage(const mbedtls_x509_crt *cert,
6314 const mbedtls_ssl_ciphersuite_t *ciphersuite,
6315 int cert_endpoint,
6316 uint32_t *flags)
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006317{
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01006318 int ret = 0;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006319 int usage = 0;
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02006320 const char *ext_oid;
6321 size_t ext_len;
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02006322
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006323 if (cert_endpoint == MBEDTLS_SSL_IS_SERVER) {
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006324 /* Server part of the key exchange */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006325 switch (ciphersuite->key_exchange) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006326 case MBEDTLS_KEY_EXCHANGE_RSA:
6327 case MBEDTLS_KEY_EXCHANGE_RSA_PSK:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01006328 usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006329 break;
6330
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006331 case MBEDTLS_KEY_EXCHANGE_DHE_RSA:
6332 case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:
6333 case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:
6334 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006335 break;
6336
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006337 case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:
6338 case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01006339 usage = MBEDTLS_X509_KU_KEY_AGREEMENT;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006340 break;
6341
6342 /* Don't use default: we want warnings when adding new values */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006343 case MBEDTLS_KEY_EXCHANGE_NONE:
6344 case MBEDTLS_KEY_EXCHANGE_PSK:
6345 case MBEDTLS_KEY_EXCHANGE_DHE_PSK:
6346 case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:
Manuel Pégourié-Gonnard557535d2015-09-15 17:53:32 +02006347 case MBEDTLS_KEY_EXCHANGE_ECJPAKE:
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006348 usage = 0;
6349 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006350 } else {
6351 /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for
6352 * now */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006353 usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006354 }
6355
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006356 if (mbedtls_x509_crt_check_key_usage(cert, usage) != 0) {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01006357 *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01006358 ret = -1;
6359 }
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006360
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006361 if (cert_endpoint == MBEDTLS_SSL_IS_SERVER) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006362 ext_oid = MBEDTLS_OID_SERVER_AUTH;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006363 ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_SERVER_AUTH);
6364 } else {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006365 ext_oid = MBEDTLS_OID_CLIENT_AUTH;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006366 ext_len = MBEDTLS_OID_SIZE(MBEDTLS_OID_CLIENT_AUTH);
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02006367 }
6368
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006369 if (mbedtls_x509_crt_check_extended_key_usage(cert, ext_oid, ext_len) !=
6370 0) {
Manuel Pégourié-Gonnarde6028c92015-04-20 12:19:02 +01006371 *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE;
Manuel Pégourié-Gonnarde6efa6f2015-04-20 11:01:48 +01006372 ret = -1;
6373 }
Manuel Pégourié-Gonnard0408fd12014-04-11 11:06:22 +02006374
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006375 return ret;
Manuel Pégourié-Gonnard7f2a07d2014-04-09 09:50:57 +02006376}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006377# endif /* MBEDTLS_X509_CRT_PARSE_C */
Manuel Pégourié-Gonnard3a306b92014-04-29 15:11:17 +02006378
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006379int mbedtls_ssl_set_calc_verify_md(mbedtls_ssl_context *ssl, int md)
Simon Butcher99000142016-10-13 17:21:01 +01006380{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006381# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
6382 if (ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3)
6383 return -1;
Simon Butcher99000142016-10-13 17:21:01 +01006384
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006385 switch (md) {
6386# if defined(MBEDTLS_SHA384_C)
Simon Butcher99000142016-10-13 17:21:01 +01006387 case MBEDTLS_SSL_HASH_SHA384:
6388 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384;
6389 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006390# endif
6391# if defined(MBEDTLS_SHA256_C)
Simon Butcher99000142016-10-13 17:21:01 +01006392 case MBEDTLS_SSL_HASH_SHA256:
6393 ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256;
6394 break;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006395# endif
Simon Butcher99000142016-10-13 17:21:01 +01006396 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006397 return -1;
Simon Butcher99000142016-10-13 17:21:01 +01006398 }
6399
6400 return 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006401# else /* !MBEDTLS_SSL_PROTO_TLS1_2 */
6402 (void)ssl;
6403 (void)md;
Simon Butcher99000142016-10-13 17:21:01 +01006404
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006405 return -1;
6406# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Simon Butcher99000142016-10-13 17:21:01 +01006407}
6408
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006409# if defined(MBEDTLS_SSL_PROTO_TLS1_2)
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006410
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006411# if defined(MBEDTLS_USE_PSA_CRYPTO)
6412int mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context *ssl,
6413 unsigned char *hash,
6414 size_t *hashlen,
6415 unsigned char *data,
6416 size_t data_len,
6417 mbedtls_md_type_t md_alg)
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006418{
Andrzej Kurek814feff2019-01-14 04:35:19 -05006419 psa_status_t status;
Jaeden Amero34973232019-02-20 10:32:28 +00006420 psa_hash_operation_t hash_operation = PSA_HASH_OPERATION_INIT;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006421 psa_algorithm_t hash_alg = mbedtls_psa_translate_md(md_alg);
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006422
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006423 MBEDTLS_SSL_DEBUG_MSG(
6424 3, ("Perform PSA-based computation of digest of ServerKeyExchange"));
Andrzej Kurek814feff2019-01-14 04:35:19 -05006425
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006426 if ((status = psa_hash_setup(&hash_operation, hash_alg)) != PSA_SUCCESS) {
6427 MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_setup", status);
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006428 goto exit;
6429 }
6430
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006431 if ((status = psa_hash_update(&hash_operation, ssl->handshake->randbytes,
6432 64)) != PSA_SUCCESS) {
6433 MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_update", status);
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006434 goto exit;
6435 }
6436
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006437 if ((status = psa_hash_update(&hash_operation, data, data_len)) !=
6438 PSA_SUCCESS) {
6439 MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_update", status);
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006440 goto exit;
6441 }
6442
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006443 if ((status = psa_hash_finish(&hash_operation, hash, MBEDTLS_MD_MAX_SIZE,
6444 hashlen)) != PSA_SUCCESS) {
6445 MBEDTLS_SSL_DEBUG_RET(1, "psa_hash_finish", status);
6446 goto exit;
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006447 }
6448
6449exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006450 if (status != PSA_SUCCESS) {
6451 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6452 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
6453 switch (status) {
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006454 case PSA_ERROR_NOT_SUPPORTED:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006455 return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
Andrzej Kurek814feff2019-01-14 04:35:19 -05006456 case PSA_ERROR_BAD_STATE: /* Intentional fallthrough */
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006457 case PSA_ERROR_BUFFER_TOO_SMALL:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006458 return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006459 case PSA_ERROR_INSUFFICIENT_MEMORY:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006460 return MBEDTLS_ERR_MD_ALLOC_FAILED;
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006461 default:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006462 return MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED;
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006463 }
6464 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006465 return 0;
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006466}
6467
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006468# else
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006469
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006470int mbedtls_ssl_get_key_exchange_md_tls1_2(mbedtls_ssl_context *ssl,
6471 unsigned char *hash,
6472 size_t *hashlen,
6473 unsigned char *data,
6474 size_t data_len,
6475 mbedtls_md_type_t md_alg)
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006476{
6477 int ret = 0;
6478 mbedtls_md_context_t ctx;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006479 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_alg);
6480 *hashlen = mbedtls_md_get_size(md_info);
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006481
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006482 MBEDTLS_SSL_DEBUG_MSG(
6483 3,
6484 ("Perform mbedtls-based computation of digest of ServerKeyExchange"));
Andrzej Kurek814feff2019-01-14 04:35:19 -05006485
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006486 mbedtls_md_init(&ctx);
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006487
6488 /*
6489 * digitally-signed struct {
6490 * opaque client_random[32];
6491 * opaque server_random[32];
6492 * ServerDHParams params;
6493 * };
6494 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006495 if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
6496 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_setup", ret);
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006497 goto exit;
6498 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006499 if ((ret = mbedtls_md_starts(&ctx)) != 0) {
6500 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_starts", ret);
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006501 goto exit;
6502 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006503 if ((ret = mbedtls_md_update(&ctx, ssl->handshake->randbytes, 64)) != 0) {
6504 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_update", ret);
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006505 goto exit;
6506 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006507 if ((ret = mbedtls_md_update(&ctx, data, data_len)) != 0) {
6508 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_update", ret);
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006509 goto exit;
6510 }
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006511 if ((ret = mbedtls_md_finish(&ctx, hash)) != 0) {
6512 MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_md_finish", ret);
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006513 goto exit;
6514 }
6515
6516exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006517 mbedtls_md_free(&ctx);
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006518
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006519 if (ret != 0)
6520 mbedtls_ssl_send_alert_message(ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,
6521 MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR);
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006522
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006523 return ret;
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006524}
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006525# endif /* MBEDTLS_USE_PSA_CRYPTO */
Andrzej Kurekd6db9be2019-01-10 05:27:10 -05006526
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02006527# endif /* MBEDTLS_SSL_PROTO_TLS1_2 */
Andres Amaya Garcia46f5a3e2017-07-20 16:17:51 +01006528
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006529#endif /* MBEDTLS_SSL_TLS_C */